+ case 'A':
+ if (modifier != 0)
+ goto bad_format;
+ if (change_case)
+ {
+ to_uppcase = 1;
+ to_lowcase = 0;
+ }
+#if defined _NL_CURRENT || !HAVE_STRFTIME
+ cpy (wkday_len, f_wkday);
+ break;
+#else
+ goto underlying_strftime;
+#endif
+
+ case 'b':
+ case 'h': /* POSIX.2 extension. */
+ if (modifier != 0)
+ goto bad_format;
+#if defined _NL_CURRENT || !HAVE_STRFTIME
+ cpy (am_len, a_month);
+ break;
+#else
+ goto underlying_strftime;
+#endif
+
+ case 'B':
+ if (modifier != 0)
+ goto bad_format;
+ if (change_case)
+ {
+ to_uppcase = 1;
+ to_lowcase = 0;
+ }
+#if defined _NL_CURRENT || !HAVE_STRFTIME
+ cpy (month_len, f_month);
+ break;
+#else
+ goto underlying_strftime;
+#endif
+
+ case 'c':
+ if (modifier == 'O')
+ goto bad_format;
+#ifdef _NL_CURRENT
+ if (! (modifier == 'E'
+ && *(subfmt = _NL_CURRENT (LC_TIME, ERA_D_T_FMT)) != '\0'))
+ subfmt = _NL_CURRENT (LC_TIME, D_T_FMT);
+#else
+# if HAVE_STRFTIME
+ goto underlying_strftime;
+# else
+ subfmt = "%a %b %e %H:%M:%S %Y";
+# endif
+#endif
+
+ subformat:
+ {
+ char *old_start = p;
+ size_t len = my_strftime (NULL, maxsize - i, subfmt, tp);
+ if (len == 0 && *subfmt)
+ return 0;
+ add (len, my_strftime (p, maxsize - i, subfmt, tp));
+
+ if (to_uppcase)
+ while (old_start < p)
+ {
+ *old_start = TOUPPER ((unsigned char) *old_start);
+ ++old_start;
+ }
+ }
+ break;
+
+#if HAVE_STRFTIME && ! (defined _NL_CURRENT && HAVE_STRUCT_ERA_ENTRY)
+ underlying_strftime:
+ {
+ /* The relevant information is available only via the
+ underlying strftime implementation, so use that. */
+ char ufmt[4];
+ char *u = ufmt;
+ char ubuf[1024]; /* enough for any single format in practice */
+ size_t len;
+ *u++ = '%';
+ if (modifier != 0)
+ *u++ = modifier;
+ *u++ = format_char;
+ *u = '\0';
+ len = strftime (ubuf, sizeof ubuf, ufmt, tp);
+ if (len == 0)
+ return 0;
+ cpy (len, ubuf);
+ }
+ break;
+#endif
+
+ case 'C': /* POSIX.2 extension. */
+ if (modifier == 'O')
+ goto bad_format;
+ if (modifier == 'E')
+ {
+#if HAVE_STRUCT_ERA_ENTRY
+ struct era_entry *era = _nl_get_era_entry (tp);
+ if (era)
+ {
+ size_t len = strlen (era->name_fmt);
+ cpy (len, era->name_fmt);
+ break;
+ }
+#else
+# if HAVE_STRFTIME
+ goto underlying_strftime;
+# endif
+#endif
+ }
+
+ {
+ int year = tp->tm_year + TM_YEAR_BASE;
+ DO_NUMBER (1, year / 100 - (year % 100 < 0));
+ }
+
+ case 'x':
+ if (modifier == 'O')
+ goto bad_format;
+#ifdef _NL_CURRENT
+ if (! (modifier == 'E'
+ && *(subfmt = _NL_CURRENT (LC_TIME, ERA_D_FMT)) != '\0'))
+ subfmt = _NL_CURRENT (LC_TIME, D_FMT);
+ goto subformat;
+#else
+# if HAVE_STRFTIME
+ goto underlying_strftime;
+# else
+ /* Fall through. */
+# endif
+#endif
+ case 'D': /* POSIX.2 extension. */
+ if (modifier != 0)
+ goto bad_format;
+ subfmt = "%m/%d/%y";
+ goto subformat;
+
+ case 'd':
+ if (modifier == 'E')
+ goto bad_format;
+
+ DO_NUMBER (2, tp->tm_mday);
+
+ case 'e': /* POSIX.2 extension. */
+ if (modifier == 'E')
+ goto bad_format;
+
+ DO_NUMBER_SPACEPAD (2, tp->tm_mday);
+
+ /* All numeric formats set DIGITS and NUMBER_VALUE and then
+ jump to one of these two labels. */
+
+ do_number_spacepad:
+ /* Force `_' flag unless overwritten by `0' flag. */
+ if (pad != '0')
+ pad = '_';
+
+ do_number:
+ /* Format the number according to the MODIFIER flag. */
+
+ if (modifier == 'O' && 0 <= number_value)
+ {
+#ifdef _NL_CURRENT
+ /* Get the locale specific alternate representation of
+ the number NUMBER_VALUE. If none exist NULL is returned. */
+ const char *cp = _nl_get_alt_digit (number_value);
+
+ if (cp != NULL)
+ {
+ size_t digitlen = strlen (cp);
+ if (digitlen != 0)
+ {
+ cpy (digitlen, cp);
+ break;
+ }
+ }
+#else
+# if HAVE_STRFTIME
+ goto underlying_strftime;
+# endif
+#endif
+ }
+ {
+ unsigned int u = number_value;
+
+ bufp = buf + sizeof (buf);
+ negative_number = number_value < 0;
+
+ if (negative_number)
+ u = -u;
+
+ do
+ *--bufp = u % 10 + '0';
+ while ((u /= 10) != 0);
+ }
+
+ do_number_sign_and_padding:
+ if (negative_number)
+ *--bufp = '-';
+
+ if (pad != '-')
+ {
+ int padding = digits - (buf + sizeof (buf) - bufp);
+
+ if (pad == '_')
+ {
+ while (0 < padding--)
+ *--bufp = ' ';
+ }