11dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef lint
21dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef NOID
3edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectstatic char elsieid[] = "@(#)strftime.c 8.1";
41dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
51dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** Based on the UCB version with the ID appearing below.
61dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** This is ANSIish only when "multibyte character == plain character".
71dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project*/
81dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* !defined NOID */
91dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* !defined lint */
101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include "private.h"
121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** Copyright (c) 1989 The Regents of the University of California.
151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** All rights reserved.
161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project**
171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** Redistribution and use in source and binary forms are permitted
181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** provided that the above copyright notice and this paragraph are
191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** duplicated in all such forms and that any documentation,
201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** advertising materials, and other materials related to such
211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** distribution and use acknowledge that the software was developed
221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** by the University of California, Berkeley. The name of the
231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** University may not be used to endorse or promote products derived
241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** from this software without specific prior written permission.
251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project*/
291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef LIBC_SCCS
311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef lint
32edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectstatic const char   sccsid[] = "@(#)strftime.c  5.4 (Berkeley) 3/14/89";
331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* !defined lint */
341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* !defined LIBC_SCCS */
351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include "tzfile.h"
371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include "fcntl.h"
381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include "locale.h"
391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <ctype.h>
40edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project#include <time64.h>
41208898ee776117f42815c2fcb15903b2781bf0aaDavid 'Digit' Turner#include <bionic_time.h>  /* for strftime_tz */
42edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
43edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project/* struct lc_time_T is now defined as strftime_locale
44edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project * in <time.h>
45edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project */
46edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project#if 1
47edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project#define  lc_time_T    strftime_locale
48edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project#else
491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstruct lc_time_T {
50edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    const char *    mon[MONSPERYEAR];
51edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    const char *    month[MONSPERYEAR];
52edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    const char *    wday[DAYSPERWEEK];
53edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    const char *    weekday[DAYSPERWEEK];
54edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    const char *    X_fmt;
55edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    const char *    x_fmt;
56edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    const char *    c_fmt;
57edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    const char *    am;
58edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    const char *    pm;
59edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    const char *    date_fmt;
601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project};
61edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project#endif
62edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
63edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project#define Locale  (&C_time_locale)
64edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
65edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectstatic const struct lc_time_T   C_time_locale = {
66edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    {
67edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        "Jan", "Feb", "Mar", "Apr", "May", "Jun",
68edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
69edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    }, {
70edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        "January", "February", "March", "April", "May", "June",
71edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        "July", "August", "September", "October", "November", "December"
72edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    }, {
73a48fa7f4deb6ba703e1da55143771476d4e668ceEric Fischer        "January", "February", "March", "April", "May", "June",
74a48fa7f4deb6ba703e1da55143771476d4e668ceEric Fischer        "July", "August", "September", "October", "November", "December"
75a48fa7f4deb6ba703e1da55143771476d4e668ceEric Fischer    }, {
76edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        "Sun", "Mon", "Tue", "Wed",
77edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        "Thu", "Fri", "Sat"
78edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    }, {
79edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        "Sunday", "Monday", "Tuesday", "Wednesday",
80edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        "Thursday", "Friday", "Saturday"
81edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    },
82edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
83edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    /* X_fmt */
84edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    "%H:%M:%S",
85edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
86edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    /*
87edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    ** x_fmt
88edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    ** C99 requires this format.
89edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    ** Using just numbers (as here) makes Quakers happier;
90edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    ** it's also compatible with SVR4.
91edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    */
92edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    "%m/%d/%y",
93edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
94edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    /*
95edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    ** c_fmt
96edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    ** C99 requires this format.
97edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    ** Previously this code used "%D %X", but we now conform to C99.
98edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    ** Note that
99edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    **  "%a %b %d %H:%M:%S %Y"
100edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    ** is used by Solaris 2.3.
101edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    */
102edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    "%a %b %e %T %Y",
103edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
104edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    /* am */
105edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    "AM",
106edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
107edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    /* pm */
108edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    "PM",
109edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
110edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    /* date_fmt */
111edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    "%a %b %e %H:%M:%S %Z %Y"
1121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project};
1131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
114edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectstatic char *   _add P((const char *, char *, const char *, int));
115edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectstatic char *   _conv P((int, const char *, char *, const char *));
116edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectstatic char *   _fmt P((const char *, const struct tm *, char *, const char *,
117edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            int *, const struct strftime_locale*));
118edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectstatic char *   _yconv P((int, int, int, int, char *, const char *, int));
119edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectstatic char *   getformat P((int, char *, char *, char *, char *));
1201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
121edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectextern char *   tzname[];
1221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef YEAR_2000_NAME
124edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project#define YEAR_2000_NAME  "CHECK_STRFTIME_FORMATS_FOR_TWO_DIGIT_YEARS"
1251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* !defined YEAR_2000_NAME */
1261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
127edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project#define IN_NONE 0
128edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project#define IN_SOME 1
129edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project#define IN_THIS 2
130edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project#define IN_ALL  3
1311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define FORCE_LOWER_CASE 0x100
1331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectsize_t
1351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstrftime(s, maxsize, format, t)
136edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectchar * const        s;
137edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectconst size_t        maxsize;
138edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectconst char * const  format;
139edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectconst struct tm * const t;
140edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project{
141edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    return strftime_tz(s, maxsize, format, t, Locale);
142edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project}
143edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
144edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectsize_t
145edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectstrftime_tz(s, maxsize, format, t, locale)
146edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectchar * const        s;
147edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectconst size_t        maxsize;
148edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectconst char * const  format;
149edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectconst struct tm * const t;
150edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectconst struct strftime_locale *locale;
1511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{
152edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    char *  p;
153edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    int warn;
154edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
155edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    tzset();
156edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    warn = IN_NONE;
157edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    p = _fmt(((format == NULL) ? "%c" : format), t, s, s + maxsize, &warn, locale);
158edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project#if 0  /* ifndef NO_RUN_TIME_WARNINGS_ABOUT_YEAR_2000_PROBLEMS_THANK_YOU */
159edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    if (warn != IN_NONE && getenv(YEAR_2000_NAME) != NULL) {
160edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        (void) fprintf(stderr, "\n");
161edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        if (format == NULL)
162edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            (void) fprintf(stderr, "NULL strftime format ");
163edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        else    (void) fprintf(stderr, "strftime format \"%s\" ",
164edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                format);
165edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        (void) fprintf(stderr, "yields only two digits of years in ");
166edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        if (warn == IN_SOME)
167edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            (void) fprintf(stderr, "some locales");
168edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        else if (warn == IN_THIS)
169edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            (void) fprintf(stderr, "the current locale");
170edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        else    (void) fprintf(stderr, "all locales");
171edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        (void) fprintf(stderr, "\n");
172edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    }
1731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* !defined NO_RUN_TIME_WARNINGS_ABOUT_YEAR_2000_PROBLEMS_THANK_YOU */
174edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    if (p == s + maxsize)
175edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        return 0;
176edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    *p = '\0';
177edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    return p - s;
1781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
1791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic char *getformat(int modifier, char *normal, char *underscore,
1811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                       char *dash, char *zero) {
1821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project    switch (modifier) {
1831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project    case '_':
1841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project        return underscore;
1851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project    case '-':
1871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project        return dash;
1881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project    case '0':
1901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project        return zero;
1911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project    }
1921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project    return normal;
1941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
1951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic char *
197edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project_fmt(format, t, pt, ptlim, warnp, locale)
198edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectconst char *        format;
199edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectconst struct tm * const t;
200edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectchar *          pt;
201edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectconst char * const  ptlim;
202edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectint *           warnp;
203edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectconst struct strftime_locale* locale;
2041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{
205edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    for ( ; *format; ++format) {
206edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        if (*format == '%') {
2071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project            int modifier = 0;
2081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectlabel:
209edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            switch (*++format) {
210edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case '\0':
211edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                --format;
212edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                break;
213edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'A':
214edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _add((t->tm_wday < 0 ||
215edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    t->tm_wday >= DAYSPERWEEK) ?
216edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    "?" : locale->weekday[t->tm_wday],
217edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    pt, ptlim, modifier);
218edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
219edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'a':
220edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _add((t->tm_wday < 0 ||
221edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    t->tm_wday >= DAYSPERWEEK) ?
222edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    "?" : locale->wday[t->tm_wday],
223edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    pt, ptlim, modifier);
224edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
225edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'B':
226a48fa7f4deb6ba703e1da55143771476d4e668ceEric Fischer                if (modifier == '-') {
227a48fa7f4deb6ba703e1da55143771476d4e668ceEric Fischer                    pt = _add((t->tm_mon < 0 ||
228a48fa7f4deb6ba703e1da55143771476d4e668ceEric Fischer                                t->tm_mon >= MONSPERYEAR) ?
229d5f72afd4984744a7198c8ec80341a6d2602d02fEric Fischer                                "?" : locale->standalone_month[t->tm_mon],
230a48fa7f4deb6ba703e1da55143771476d4e668ceEric Fischer                                pt, ptlim, modifier);
231a48fa7f4deb6ba703e1da55143771476d4e668ceEric Fischer                } else {
232a48fa7f4deb6ba703e1da55143771476d4e668ceEric Fischer                    pt = _add((t->tm_mon < 0 ||
233a48fa7f4deb6ba703e1da55143771476d4e668ceEric Fischer                                t->tm_mon >= MONSPERYEAR) ?
234d5f72afd4984744a7198c8ec80341a6d2602d02fEric Fischer                                "?" : locale->month[t->tm_mon],
235a48fa7f4deb6ba703e1da55143771476d4e668ceEric Fischer                                pt, ptlim, modifier);
236a48fa7f4deb6ba703e1da55143771476d4e668ceEric Fischer                }
237edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
238edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'b':
239edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'h':
240edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _add((t->tm_mon < 0 ||
241edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    t->tm_mon >= MONSPERYEAR) ?
242edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    "?" : locale->mon[t->tm_mon],
243edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    pt, ptlim, modifier);
244edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
245edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'C':
246edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                /*
247edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** %C used to do a...
248edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                **  _fmt("%a %b %e %X %Y", t);
249edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** ...whereas now POSIX 1003.2 calls for
250edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** something completely different.
251edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** (ado, 1993-05-24)
252edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                */
253edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _yconv(t->tm_year, TM_YEAR_BASE, 1, 0,
254edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    pt, ptlim, modifier);
255edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
256edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'c':
257edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                {
258edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                int warn2 = IN_SOME;
259edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
260edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _fmt(locale->c_fmt, t, pt, ptlim, warnp, locale);
261edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                if (warn2 == IN_ALL)
262edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    warn2 = IN_THIS;
263edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                if (warn2 > *warnp)
264edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    *warnp = warn2;
265edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                }
266edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
267edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'D':
268edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                                pt = _fmt("%m/%d/%y", t, pt, ptlim, warnp, locale);
269edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
270edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'd':
2711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                pt = _conv(t->tm_mday,
2721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                           getformat(modifier, "%02d",
2731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                                     "%2d", "%d", "%02d"),
2741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                           pt, ptlim);
275edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
276edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'E':
277edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'O':
278edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                /*
279edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** C99 locale modifiers.
280edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** The sequences
281edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                **  %Ec %EC %Ex %EX %Ey %EY
282edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                **  %Od %oe %OH %OI %Om %OM
283edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                **  %OS %Ou %OU %OV %Ow %OW %Oy
284edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** are supposed to provide alternate
285edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** representations.
286edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                */
287edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                goto label;
2881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project            case '_':
2891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project            case '-':
2901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project            case '0':
2911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project            case '^':
2921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project            case '#':
2931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                modifier = *format;
2941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                goto label;
295edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'e':
296edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _conv(t->tm_mday,
2971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                           getformat(modifier, "%2d",
2981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                                     "%2d", "%d", "%02d"),
2991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                           pt, ptlim);
300edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
301edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'F':
302edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _fmt("%Y-%m-%d", t, pt, ptlim, warnp, locale);
303edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
304edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'H':
305edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _conv(t->tm_hour,
3061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                           getformat(modifier, "%02d",
3071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                                     "%2d", "%d", "%02d"),
3081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                           pt, ptlim);
309edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
310edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'I':
311edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _conv((t->tm_hour % 12) ?
312edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    (t->tm_hour % 12) : 12,
313edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    getformat(modifier, "%02d",
3141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                                  "%2d", "%d", "%02d"),
3151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                        pt, ptlim);
316edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
317edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'j':
318edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _conv(t->tm_yday + 1,
3191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                           getformat(modifier, "%03d", "%3d", "%d", "%03d"),
3201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                           pt, ptlim);
321edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
322edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'k':
323edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                /*
324edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** This used to be...
325edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                **  _conv(t->tm_hour % 12 ?
326edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                **      t->tm_hour % 12 : 12, 2, ' ');
327edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** ...and has been changed to the below to
328edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** match SunOS 4.1.1 and Arnold Robbins'
329edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** strftime version 3.0. That is, "%k" and
330edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** "%l" have been swapped.
331edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** (ado, 1993-05-24)
332edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                */
333edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _conv(t->tm_hour,
3341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                           getformat(modifier, "%2d",
3351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                                     "%2d", "%d", "%02d"),
3361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                           pt, ptlim);
337edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
3381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef KITCHEN_SINK
339edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'K':
340edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                /*
341edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** After all this time, still unclaimed!
342edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                */
343edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _add("kitchen sink", pt, ptlim, modifier);
344edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
3451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* defined KITCHEN_SINK */
346edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'l':
347edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                /*
348edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** This used to be...
349edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                **  _conv(t->tm_hour, 2, ' ');
350edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** ...and has been changed to the below to
351edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** match SunOS 4.1.1 and Arnold Robbin's
352edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** strftime version 3.0. That is, "%k" and
353edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** "%l" have been swapped.
354edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** (ado, 1993-05-24)
355edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                */
356edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _conv((t->tm_hour % 12) ?
357edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    (t->tm_hour % 12) : 12,
358edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    getformat(modifier, "%2d",
3591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                                  "%2d", "%d", "%02d"),
3601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                        pt, ptlim);
361edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
362edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'M':
363edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _conv(t->tm_min,
3641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                           getformat(modifier, "%02d",
3651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                                     "%2d", "%d", "%02d"),
3661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                           pt, ptlim);
367edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
368edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'm':
369edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _conv(t->tm_mon + 1,
3701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                           getformat(modifier, "%02d",
3711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                                     "%2d", "%d", "%02d"),
3721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                           pt, ptlim);
373edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
374edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'n':
375edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _add("\n", pt, ptlim, modifier);
376edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
377edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'p':
378edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _add((t->tm_hour >= (HOURSPERDAY / 2)) ?
379edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    locale->pm :
380edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    locale->am,
381edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    pt, ptlim, modifier);
382edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
383edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'P':
384edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _add((t->tm_hour >= (HOURSPERDAY / 2)) ?
385edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    locale->pm :
386edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    locale->am,
387edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    pt, ptlim, FORCE_LOWER_CASE);
388edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
389edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'R':
390edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _fmt("%H:%M", t, pt, ptlim, warnp, locale);
391edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
392edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'r':
393edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _fmt("%I:%M:%S %p", t, pt, ptlim, warnp, locale);
394edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
395edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'S':
396edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _conv(t->tm_sec,
3971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                           getformat(modifier, "%02d",
3981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                                     "%2d", "%d", "%02d"),
3991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                           pt, ptlim);
400edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
401edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 's':
402edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                {
403edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    struct tm   tm;
404edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    char        buf[INT_STRLEN_MAXIMUM(
405edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                                time64_t) + 1];
406edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    time64_t    mkt;
407edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
408edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    tm = *t;
409edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    mkt = mktime64(&tm);
410edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    if (TYPE_SIGNED(time64_t))
411e6cff939e603e445c2576958c3777d7b7f5d84faJim Huang                        (void) snprintf(buf, sizeof(buf), "%lld",
412edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                            (long long) mkt);
413e6cff939e603e445c2576958c3777d7b7f5d84faJim Huang                    else    (void) snprintf(buf, sizeof(buf), "%llu",
414edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                            (unsigned long long) mkt);
415edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    pt = _add(buf, pt, ptlim, modifier);
416edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                }
417edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
418edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'T':
419edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _fmt("%H:%M:%S", t, pt, ptlim, warnp, locale);
420edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
421edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 't':
422edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _add("\t", pt, ptlim, modifier);
423edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
424edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'U':
425edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _conv((t->tm_yday + DAYSPERWEEK -
426edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    t->tm_wday) / DAYSPERWEEK,
427edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    getformat(modifier, "%02d",
4281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                                  "%2d", "%d", "%02d"),
4291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                        pt, ptlim);
430edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
431edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'u':
432edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                /*
433edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** From Arnold Robbins' strftime version 3.0:
434edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** "ISO 8601: Weekday as a decimal number
435edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** [1 (Monday) - 7]"
436edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** (ado, 1993-05-24)
437edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                */
438edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _conv((t->tm_wday == 0) ?
439edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    DAYSPERWEEK : t->tm_wday, "%d", pt, ptlim);
440edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
441edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'V':   /* ISO 8601 week number */
442edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'G':   /* ISO 8601 year (four digits) */
443edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'g':   /* ISO 8601 year (two digits) */
4441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
4451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** From Arnold Robbins' strftime version 3.0: "the week number of the
4461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** year (the first Monday as the first day of week 1) as a decimal number
4471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** (01-53)."
4481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** (ado, 1993-05-24)
4491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project**
4501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** From "http://www.ft.uni-erlangen.de/~mskuhn/iso-time.html" by Markus Kuhn:
4511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** "Week 01 of a year is per definition the first week which has the
4521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** Thursday in this year, which is equivalent to the week which contains
4531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** the fourth day of January. In other words, the first week of a new year
4541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** is the week which has the majority of its days in the new year. Week 01
4551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** might also contain days from the previous year and the week before week
4561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** 01 of a year is the last week (52 or 53) of the previous year even if
4571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** it contains days from the new year. A week starts with Monday (day 1)
4581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** and ends with Sunday (day 7). For example, the first week of the year
4591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** 1997 lasts from 1996-12-30 to 1997-01-05..."
4601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** (ado, 1996-01-02)
4611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project*/
462edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                {
463edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    int year;
464edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    int base;
465edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    int yday;
466edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    int wday;
467edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    int w;
468edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
469edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    year = t->tm_year;
470edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    base = TM_YEAR_BASE;
471edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    yday = t->tm_yday;
472edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    wday = t->tm_wday;
473edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    for ( ; ; ) {
474edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                        int len;
475edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                        int bot;
476edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                        int top;
477edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
478edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                        len = isleap_sum(year, base) ?
479edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                            DAYSPERLYEAR :
480edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                            DAYSPERNYEAR;
481edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                        /*
482edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                        ** What yday (-3 ... 3) does
483edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                        ** the ISO year begin on?
484edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                        */
485edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                        bot = ((yday + 11 - wday) %
486edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                            DAYSPERWEEK) - 3;
487edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                        /*
488edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                        ** What yday does the NEXT
489edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                        ** ISO year begin on?
490edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                        */
491edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                        top = bot -
492edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                            (len % DAYSPERWEEK);
493edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                        if (top < -3)
494edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                            top += DAYSPERWEEK;
495edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                        top += len;
496edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                        if (yday >= top) {
497edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                            ++base;
498edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                            w = 1;
499edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                            break;
500edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                        }
501edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                        if (yday >= bot) {
502edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                            w = 1 + ((yday - bot) /
503edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                                DAYSPERWEEK);
504edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                            break;
505edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                        }
506edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                        --base;
507edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                        yday += isleap_sum(year, base) ?
508edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                            DAYSPERLYEAR :
509edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                            DAYSPERNYEAR;
510edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    }
5111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef XPG4_1994_04_09
512edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    if ((w == 52 &&
513edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                        t->tm_mon == TM_JANUARY) ||
514edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                        (w == 1 &&
515edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                        t->tm_mon == TM_DECEMBER))
516edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                            w = 53;
5171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* defined XPG4_1994_04_09 */
518edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    if (*format == 'V')
519edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                        pt = _conv(w,
5201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                                           getformat(modifier,
5211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                                                     "%02d",
5221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                                                     "%2d",
5231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                                                     "%d",
5241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                                                     "%02d"),
525edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                               pt, ptlim);
526edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    else if (*format == 'g') {
527edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                        *warnp = IN_ALL;
528edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                        pt = _yconv(year, base, 0, 1,
529edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                            pt, ptlim, modifier);
530edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    } else  pt = _yconv(year, base, 1, 1,
531edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                            pt, ptlim, modifier);
532edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                }
533edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
534edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'v':
535edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                /*
536edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** From Arnold Robbins' strftime version 3.0:
537edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** "date as dd-bbb-YYYY"
538edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** (ado, 1993-05-24)
539edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                */
540edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _fmt("%e-%b-%Y", t, pt, ptlim, warnp, locale);
541edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
542edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'W':
543edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _conv((t->tm_yday + DAYSPERWEEK -
544edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    (t->tm_wday ?
545edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    (t->tm_wday - 1) :
546edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    (DAYSPERWEEK - 1))) / DAYSPERWEEK,
547edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    getformat(modifier, "%02d",
5481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                                  "%2d", "%d", "%02d"),
5491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                        pt, ptlim);
550edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
551edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'w':
552edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _conv(t->tm_wday, "%d", pt, ptlim);
553edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
554edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'X':
555edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _fmt(locale->X_fmt, t, pt, ptlim, warnp, locale);
556edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
557edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'x':
558edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                {
559edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                int warn2 = IN_SOME;
560edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
561edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _fmt(locale->x_fmt, t, pt, ptlim, &warn2, locale);
562edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                if (warn2 == IN_ALL)
563edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    warn2 = IN_THIS;
564edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                if (warn2 > *warnp)
565edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    *warnp = warn2;
566edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                }
567edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
568edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'y':
569edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                *warnp = IN_ALL;
570edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _yconv(t->tm_year, TM_YEAR_BASE, 0, 1,
571edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    pt, ptlim, modifier);
572edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
573edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'Y':
574edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _yconv(t->tm_year, TM_YEAR_BASE, 1, 1,
575edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    pt, ptlim, modifier);
576edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
577edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'Z':
5781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef TM_ZONE
579edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                if (t->TM_ZONE != NULL)
580edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    pt = _add(t->TM_ZONE, pt, ptlim,
5811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                                  modifier);
582edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                else
5831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* defined TM_ZONE */
584edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                if (t->tm_isdst >= 0)
585edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    pt = _add(tzname[t->tm_isdst != 0],
586edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                        pt, ptlim, modifier);
587edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                /*
588edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** C99 says that %Z must be replaced by the
589edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** empty string if the time zone is not
590edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** determinable.
591edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                */
592edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
593edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'z':
594edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                {
595edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                int     diff;
596edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                char const *    sign;
597edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
598edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                if (t->tm_isdst < 0)
599edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    continue;
6001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef TM_GMTOFF
601edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                diff = t->TM_GMTOFF;
6021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#else /* !defined TM_GMTOFF */
603edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                /*
604edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** C99 says that the UTC offset must
605edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** be computed by looking only at
606edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** tm_isdst. This requirement is
607edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** incorrect, since it means the code
608edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** must rely on magic (in this case
609edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** altzone and timezone), and the
610edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** magic might not have the correct
611edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** offset. Doing things correctly is
612edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** tricky and requires disobeying C99;
613edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** see GNU C strftime for details.
614edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** For now, punt and conform to the
615edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** standard, even though it's incorrect.
616edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                **
617edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** C99 says that %z must be replaced by the
618edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** empty string if the time zone is not
619edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** determinable, so output nothing if the
620edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** appropriate variables are not available.
621edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                */
622edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                if (t->tm_isdst == 0)
6231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef USG_COMPAT
624edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    diff = -timezone;
6251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#else /* !defined USG_COMPAT */
626edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    continue;
6271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* !defined USG_COMPAT */
628edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                else
6291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef ALTZONE
630edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    diff = -altzone;
6311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#else /* !defined ALTZONE */
632edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    continue;
6331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* !defined ALTZONE */
6341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* !defined TM_GMTOFF */
635edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                if (diff < 0) {
636edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    sign = "-";
637edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    diff = -diff;
638edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                } else  sign = "+";
639edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _add(sign, pt, ptlim, modifier);
640edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                diff /= SECSPERMIN;
641edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                diff = (diff / MINSPERHOUR) * 100 +
642edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    (diff % MINSPERHOUR);
643edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _conv(diff,
6441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                           getformat(modifier, "%04d",
6451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                                     "%4d", "%d", "%04d"),
6461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                           pt, ptlim);
647edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                }
648edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
649edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case '+':
650edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _fmt(locale->date_fmt, t, pt, ptlim,
651edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    warnp, locale);
652edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
653edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case '%':
654edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            /*
655edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            ** X311J/88-090 (4.12.3.5): if conversion char is
656edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            ** undefined, behavior is undefined. Print out the
657edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            ** character itself as printf(3) also does.
658edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            */
659edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            default:
660edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                break;
661edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            }
662edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        }
663edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        if (pt == ptlim)
664edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            break;
665edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        *pt++ = *format;
666edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    }
667edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    return pt;
6681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
6691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
6701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic char *
6711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project_conv(n, format, pt, ptlim)
672edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectconst int       n;
673edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectconst char * const  format;
674edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectchar * const        pt;
675edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectconst char * const  ptlim;
6761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{
677edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    char    buf[INT_STRLEN_MAXIMUM(int) + 1];
6781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
679edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    (void) snprintf(buf, sizeof(buf), format, n);
680edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    return _add(buf, pt, ptlim, 0);
6811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
6821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
6831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic char *
6841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project_add(str, pt, ptlim, modifier)
685edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectconst char *        str;
686edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectchar *          pt;
687edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectconst char * const  ptlim;
6881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint                     modifier;
6891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{
6901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project        int c;
6911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
6921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project        switch (modifier) {
6931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project        case FORCE_LOWER_CASE:
6941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                while (pt < ptlim && (*pt = tolower(*str++)) != '\0') {
6951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                        ++pt;
6961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                }
6971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                break;
6981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
6991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project        case '^':
7001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                while (pt < ptlim && (*pt = toupper(*str++)) != '\0') {
7011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                        ++pt;
7021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                }
7031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                break;
7041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
7051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project        case '#':
7061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                while (pt < ptlim && (c = *str++) != '\0') {
7071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                        if (isupper(c)) {
7081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                c = tolower(c);
7091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                        } else if (islower(c)) {
7101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                c = toupper(c);
7111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                        }
7121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                        *pt = c;
7131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                        ++pt;
7141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                }
7151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
7161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                break;
7171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
7181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project        default:
7191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                while (pt < ptlim && (*pt = *str++) != '\0') {
7201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                        ++pt;
7211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                }
7221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project        }
7231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
724edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    return pt;
7251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
7261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
7271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
7281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** POSIX and the C Standard are unclear or inconsistent about
7291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** what %C and %y do if the year is negative or exceeds 9999.
7301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** Use the convention that %C concatenated with %y yields the
7311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** same output as %Y, and that %Y contains at least 4 bytes,
7321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** with more only if necessary.
7331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project*/
7341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
7351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic char *
7361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project_yconv(a, b, convert_top, convert_yy, pt, ptlim, modifier)
737edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectconst int       a;
738edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectconst int       b;
739edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectconst int       convert_top;
740edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectconst int       convert_yy;
741edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectchar *          pt;
742edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectconst char * const  ptlim;
7431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint                     modifier;
7441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{
745edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    register int    lead;
746edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    register int    trail;
747edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
748edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project#define DIVISOR 100
749edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    trail = a % DIVISOR + b % DIVISOR;
750edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    lead = a / DIVISOR + b / DIVISOR + trail / DIVISOR;
751edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    trail %= DIVISOR;
752edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    if (trail < 0 && lead > 0) {
753edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        trail += DIVISOR;
754edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        --lead;
755edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    } else if (lead < 0 && trail > 0) {
756edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        trail -= DIVISOR;
757edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        ++lead;
758edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    }
759edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    if (convert_top) {
760edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        if (lead == 0 && trail < 0)
761edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            pt = _add("-0", pt, ptlim, modifier);
762edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        else    pt = _conv(lead, getformat(modifier, "%02d",
7631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                                   "%2d", "%d", "%02d"),
7641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                   pt, ptlim);
765edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    }
766edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    if (convert_yy)
767edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        pt = _conv(((trail < 0) ? -trail : trail),
7681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                           getformat(modifier, "%02d", "%2d", "%d", "%02d"),
7691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                           pt, ptlim);
770edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    return pt;
7711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
772