49 #include "qofdate-p.h"
53 #define memset_space(P, Len) (memset (P, ' ', Len), (P) += (Len))
54 #define memset_zero(P, Len) (memset (P, '0', Len), (P) += (Len))
71 : (a) / (1 << (b)) - ((a) % (1 << (b)) < 0))
77 #define INT_strlen _BOUND(t) \
78 ((sizeof (t) * CHAR_BIT - 1) * 146 / 485 + 2)
82 #define TM_YEAR_BASE 0
88 gint _delta = width - _n; \
89 gint _incr = _n + (_delta > 0 ? _delta : 0); \
90 if ((size_t) _incr >= maxsize - i) \
94 if (digits == 0 && _delta > 0) \
97 memset_zero (p, _delta); \
99 memset_space (p, _delta); \
102 p += FPRINTFTIME ? 0 : _n; \
107 # define add1(C) add (1, *p = C)
112 memcpy_lowcase (p, (s), _n); \
113 else if (to_uppcase) \
114 memcpy_uppcase (p, (s), _n); \
116 memcpy ((void *) p, (void const *) (s), _n))
118 #define TOUPPER(Ch, L) (islower (Ch) ? toupper (Ch) : (Ch))
119 #define TOLOWER(Ch, L) (isupper (Ch) ? tolower (Ch) : (Ch))
125 #define ISDIGIT(Ch) ((guint) (Ch) - ('0') <= 9)
130 #define ISO_WEEK_START_WDAY 1
131 #define ISO_WEEK1_WDAY 4
132 #define YDAY_MINIMUM (-366)
134 static const mbstate_t mbstate_zero;
135 const gchar *format_end = NULL;
138 memcpy_lowcase (gchar * dest,
const gchar * src,
size_t len)
141 dest[len] = TOLOWER ((guchar) src[len], loc);
146 memcpy_uppcase (gchar * dest,
const gchar * src,
size_t len)
149 dest[len] = TOUPPER ((guchar) src[len], loc);
154 iso_week_days (gint yday, gint wday)
157 gint big_enough_multiple_of_7 = (-YDAY_MINIMUM / 7 + 2) * 7;
159 - (yday - wday + ISO_WEEK1_WDAY + big_enough_multiple_of_7) % 7
160 + ISO_WEEK1_WDAY - ISO_WEEK_START_WDAY);
164 strftime_case (gboolean upcase, gchar * s,
165 size_t maxsize,
const gchar *format,
const QofDate *qd,
175 zone = (
const gchar *) qd->
qd_zone;
178 if (!(zone && *zone))
180 setenv (
"TZ",
"GMT", 1);
193 else if (hour12 == 0)
196 for (f = format; *f !=
'\0'; ++f)
202 guint u_number_value;
203 gboolean negative_number;
204 gboolean always_output_a_sign;
211 gboolean to_lowcase = FALSE;
212 gboolean to_uppcase = upcase;
214 gboolean change_case = FALSE;
331 mbstate_t mbstate = mbstate_zero;
336 format_end = f + strlen (f) + 1;
337 fsize = format_end - f;
341 size_t bytes = mbrlen (f + len, fsize - len, &mbstate);
346 if (bytes == (
size_t) - 2)
348 len += strlen (f + len);
352 if (bytes == (
size_t) - 1)
360 while (!mbsinit (&mbstate));
400 if (width > INT_MAX / 10
401 || (width == INT_MAX / 10
402 && *f - (
'0') > INT_MAX % 10))
412 while (ISDIGIT (*f));
432 #define DO_NUMBER(d, v) \
434 number_value = v; goto do_number
435 #define DO_SIGNED_NUMBER(d, negative, v) \
437 negative_number = negative; \
438 u_number_value = v; goto do_signed_number
443 #define DO_TZ_OFFSET(d, negative, mask, v) \
445 negative_number = negative; \
446 tz_colon_mask = mask; \
447 u_number_value = v; goto do_tz_offset
448 #define DO_NUMBER_SPACEPAD(d, v) \
450 number_value = v; goto do_number_spacepad