* lib/strftime.c (strftime_case_): Add %q case.
* lib/strptime.c (__strptime_internal): Likewise.
* tests/test-strftime.c (quarter_test): A new test case.
+2016-11-05 Pádraig Brady <pbrady@fb.com>
+
+ strftime,strptime: support %q to represent the quarter
+ * lib/strftime.c (strftime_case_): Add %q case.
+ * lib/strptime.c (__strptime_internal): Likewise.
+ * tests/test-strftime.c (quarter_test): A new test case.
+
2016-11-03 Eric Blake <eblake@redhat.com>
bootstrap: Fix get_version() for AIX 5.3
goto underlying_strftime;
#endif
+ case L_('q'): /* GNU extension. */
+ DO_SIGNED_NUMBER (1, tp->tm_mon < -3, tp->tm_mon / 3 + 1U);
+ break;
+
case L_('R'):
subfmt = L_("%H:%M");
goto subformat;
return NULL;
}
break;
+ case 'q':
+ /* Match quarter of year. GNU extension. */
+ get_number (1, 4, 1);
+ tm->tm_mon = (val - 1) * 3;
+ tm->tm_mday = 1;
+ s.have_mon = 1;
+ s.have_mday = 1;
+ s.want_xday = 1;
+ break;
case 'r':
#ifdef _NL_CURRENT
if (*decided != raw)
get_alt_number (0, 59, 2);
tm->tm_min = val;
break;
+ case 'q':
+ /* Match quarter using alternate numeric symbols. */
+ get_alt_number (1, 4, 1);
+ tm->tm_mon = (val - 1) * 3;
+ tm->tm_mday = 1;
+ s.have_mon = 1;
+ s.have_mday = 1;
+ s.want_xday = 1;
+ break;
case 'S':
/* Match seconds using alternate numeric symbols. */
get_alt_number (0, 61, 2);
return fail;
}
+
+static int
+quarter_test (void)
+{
+ int result = 0;
+ size_t mon;
+
+ /* Check %q. */
+ for (mon = 1; mon <= 12; mon++)
+ {
+ char out[2];
+ char exp[2] = {0,};
+ struct tm qtm = { .tm_mon = mon - 1 };
+ char fmt[3] = {'%','q','\0'};
+
+ size_t r = nstrftime (out, sizeof (out), fmt, &qtm, 0, 0);
+ if (r == 0)
+ {
+ puts ("nstrftime(\"%q\") failed");
+ result = 1;
+ break;
+ }
+
+ exp[0] = mon < 4 ? '1' : mon < 7 ? '2' : mon < 10 ? '3' : '4';
+ if (strcmp (out, exp) != 0)
+ {
+ printf ("nstrftime %%q: expected \"%s\", got \"%s\"\n", exp, out);
+ result = 1;
+ break;
+ }
+ }
+
+ return result;
+}
+
int
main (void)
{
int fail = 0;
fail |= posixtm_test ();
fail |= tzalloc_test ();
+ fail |= quarter_test ();
return fail;
}