📄 strftime.c
字号:
case 'b': case 'h': /* POSIX.2 extension. */ if (modifier != 0) goto bad_format; cpy (am_len, a_month); break; case 'B': if (modifier != 0) goto bad_format; cpy (month_len, f_month); break; 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 subfmt = "%a %b %e %H:%M:%S %Y";#endif subformat: { size_t len = strftime (p, maxsize - i, subfmt, tp); if (len == 0 && *subfmt) return 0; add (len, ;); } break; case 'C': /* POSIX.2 extension. */ if (modifier == 'O') goto bad_format;#if HAVE_STRUCT_ERA_ENTRY if (modifier == 'E') { struct era_entry *era = _nl_get_era_entry (tp); if (era) { size_t len = strlen (era->name_fmt); cpy (len, era->name_fmt); break; } }#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;#endif /* Fall through. */ 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. */ pad = '_'; do_number: /* Format the number according to the MODIFIER flag. */#ifdef _NL_CURRENT if (modifier == 'O' && 0 <= number_value) { /* 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; } } }#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 = ' '; } else { bufp += negative_number; while (0 < padding--) *--bufp = '0'; if (negative_number) *--bufp = '-'; } } cpy (buf + sizeof (buf) - bufp, bufp); break; case 'H': if (modifier == 'E') goto bad_format; DO_NUMBER (2, tp->tm_hour); case 'I': if (modifier == 'E') goto bad_format; DO_NUMBER (2, hour12); case 'k': /* GNU extension. */ if (modifier == 'E') goto bad_format; DO_NUMBER_SPACEPAD (2, tp->tm_hour); case 'l': /* GNU extension. */ if (modifier == 'E') goto bad_format; DO_NUMBER_SPACEPAD (2, hour12); case 'j': if (modifier == 'E') goto bad_format; DO_NUMBER (3, 1 + tp->tm_yday); case 'M': if (modifier == 'E') goto bad_format; DO_NUMBER (2, tp->tm_min); case 'm': if (modifier == 'E') goto bad_format; DO_NUMBER (2, tp->tm_mon + 1); case 'n': /* POSIX.2 extension. */ add (1, *p = '\n'); break; case 'p': cpy (ap_len, ampm); break; case 'R': /* GNU extension. */ subfmt = "%H:%M"; goto subformat; case 'r': /* POSIX.2 extension. */#ifdef _NL_CURRENT if (*(subfmt = _NL_CURRENT (LC_TIME, T_FMT_AMPM)) == '\0')#endif subfmt = "%I:%M:%S %p"; goto subformat; case 'S': if (modifier == 'E') goto bad_format; DO_NUMBER (2, tp->tm_sec); case 's': /* GNU extension. */ { struct tm ltm; time_t t; ltm = *tp; t = mktime (<m); /* Generate string value for T using time_t arithmetic; this works even if sizeof (long) < sizeof (time_t). */ bufp = buf + sizeof (buf); negative_number = t < 0; do { int d = t % 10; t /= 10; if (negative_number) { d = -d; /* Adjust if division truncates to minus infinity. */ if (0 < -1 % 10 && d < 0) { t++; d += 10; } } *--bufp = d + '0'; } while (t != 0); digits = 1; goto do_number_sign_and_padding; } case 'X': if (modifier == 'O') goto bad_format;#ifdef _NL_CURRENT if (! (modifier == 'E' && *(subfmt = _NL_CURRENT (LC_TIME, ERA_T_FMT)) != '\0')) subfmt = _NL_CURRENT (LC_TIME, T_FMT); goto subformat;#endif /* Fall through. */ case 'T': /* POSIX.2 extension. */ subfmt = "%H:%M:%S"; goto subformat; case 't': /* POSIX.2 extension. */ add (1, *p = '\t'); break; case 'u': /* POSIX.2 extension. */ DO_NUMBER (1, (tp->tm_wday - 1 + 7) % 7 + 1); case 'U': if (modifier == 'E') goto bad_format; DO_NUMBER (2, (tp->tm_yday - tp->tm_wday + 7) / 7); case 'V': case 'g': /* GNU extension. */ case 'G': /* GNU extension. */ if (modifier == 'E') goto bad_format; { int year = tp->tm_year + TM_YEAR_BASE; int days = iso_week_days (tp->tm_yday, tp->tm_wday); if (days < 0) { /* This ISO week belongs to the previous year. */ year--; days = iso_week_days (tp->tm_yday + (365 + __isleap (year)), tp->tm_wday); } else { int d = iso_week_days (tp->tm_yday - (365 + __isleap (year)), tp->tm_wday); if (0 <= d) { /* This ISO week belongs to the next year. */ year++; days = d; } } switch (*f) { case 'g': DO_NUMBER (2, (year % 100 + 100) % 100); case 'G': DO_NUMBER (1, year); default: DO_NUMBER (2, days / 7 + 1); } } case 'W': if (modifier == 'E') goto bad_format; DO_NUMBER (2, (tp->tm_yday - (tp->tm_wday - 1 + 7) % 7 + 7) / 7); case 'w': if (modifier == 'E') goto bad_format; DO_NUMBER (1, tp->tm_wday); case 'Y':#if HAVE_STRUCT_ERA_ENTRY if (modifier == 'E') { struct era_entry *era = _nl_get_era_entry (tp); if (era) { subfmt = strchr (era->name_fmt, '\0') + 1; goto subformat; } }#endif if (modifier == 'O') goto bad_format; else DO_NUMBER (1, tp->tm_year + TM_YEAR_BASE); case 'y':#if HAVE_STRUCT_ERA_ENTRY if (modifier == 'E') { struct era_entry *era = _nl_get_era_entry (tp); if (era) { int delta = tp->tm_year - era->start_date[0]; DO_NUMBER (1, (era->offset + (era->direction == '-' ? -delta : delta))); } }#endif DO_NUMBER (2, (tp->tm_year % 100 + 100) % 100); case 'Z': cpy (zonelen, zone); break; case 'z': /* GNU extension. */ if (tp->tm_isdst < 0) break; { int diff;#if HAVE_TM_GMTOFF diff = tp->tm_gmtoff;#else struct tm gtm; struct tm ltm; time_t lt; ltm = *tp; lt = mktime (<m); if (lt == (time_t) -1) { /* mktime returns -1 for errors, but -1 is also a valid time_t value. Check whether an error really occurred. */ struct tm tm; localtime_r (<, &tm); if ((ltm.tm_sec ^ tm.tm_sec) | (ltm.tm_min ^ tm.tm_min) | (ltm.tm_hour ^ tm.tm_hour) | (ltm.tm_mday ^ tm.tm_mday) | (ltm.tm_mon ^ tm.tm_mon) | (ltm.tm_year ^ tm.tm_year)) break; } if (! gmtime_r (<, >m)) break; diff = tm_diff (<m, >m);#endif if (diff < 0) { add (1, *p = '-'); diff = -diff; } else add (1, *p = '+'); diff /= 60; DO_NUMBER (4, (diff / 60) * 100 + diff % 60); } case '\0': /* GNU extension: % at end of format. */ --f; /* Fall through. */ default: /* Unknown format; output the format, including the '%', since this is most likely the right thing to do if a multibyte string has been misparsed. */ bad_format: { int flen; for (flen = 1; f[1 - flen] != '%'; flen++) continue; cpy (flen, &f[1 - flen]); } break; } } if (p) *p = '\0'; return i;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -