strftime.c revision edbe7fc97bab7ff0684053d1be564330689bf3ad
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>
41edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
42edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project/* struct lc_time_T is now defined as strftime_locale
43edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project * in <time.h>
44edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project */
45edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project#if 1
46edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project#define  lc_time_T    strftime_locale
47edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project#else
481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstruct lc_time_T {
49edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    const char *    mon[MONSPERYEAR];
50edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    const char *    month[MONSPERYEAR];
51edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    const char *    wday[DAYSPERWEEK];
52edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    const char *    weekday[DAYSPERWEEK];
53edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    const char *    X_fmt;
54edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    const char *    x_fmt;
55edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    const char *    c_fmt;
56edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    const char *    am;
57edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    const char *    pm;
58edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    const char *    date_fmt;
591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project};
60edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project#endif
61edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
62edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project#define Locale  (&C_time_locale)
63edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
64edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectstatic const struct lc_time_T   C_time_locale = {
65edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    {
66edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        "Jan", "Feb", "Mar", "Apr", "May", "Jun",
67edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
68edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    }, {
69edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        "January", "February", "March", "April", "May", "June",
70edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        "July", "August", "September", "October", "November", "December"
71edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    }, {
72edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        "Sun", "Mon", "Tue", "Wed",
73edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        "Thu", "Fri", "Sat"
74edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    }, {
75edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        "Sunday", "Monday", "Tuesday", "Wednesday",
76edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        "Thursday", "Friday", "Saturday"
77edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    },
78edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
79edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    /* X_fmt */
80edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    "%H:%M:%S",
81edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
82edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    /*
83edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    ** x_fmt
84edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    ** C99 requires this format.
85edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    ** Using just numbers (as here) makes Quakers happier;
86edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    ** it's also compatible with SVR4.
87edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    */
88edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    "%m/%d/%y",
89edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
90edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    /*
91edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    ** c_fmt
92edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    ** C99 requires this format.
93edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    ** Previously this code used "%D %X", but we now conform to C99.
94edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    ** Note that
95edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    **  "%a %b %d %H:%M:%S %Y"
96edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    ** is used by Solaris 2.3.
97edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    */
98edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    "%a %b %e %T %Y",
99edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
100edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    /* am */
101edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    "AM",
102edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
103edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    /* pm */
104edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    "PM",
105edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
106edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    /* date_fmt */
107edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    "%a %b %e %H:%M:%S %Z %Y"
1081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project};
1091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
110edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectstatic char *   _add P((const char *, char *, const char *, int));
111edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectstatic char *   _conv P((int, const char *, char *, const char *));
112edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectstatic char *   _fmt P((const char *, const struct tm *, char *, const char *,
113edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            int *, const struct strftime_locale*));
114edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectstatic char *   _yconv P((int, int, int, int, char *, const char *, int));
115edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectstatic char *   getformat P((int, char *, char *, char *, char *));
1161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
117edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectextern char *   tzname[];
1181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef YEAR_2000_NAME
120edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project#define YEAR_2000_NAME  "CHECK_STRFTIME_FORMATS_FOR_TWO_DIGIT_YEARS"
1211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* !defined YEAR_2000_NAME */
1221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
123edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project#define IN_NONE 0
124edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project#define IN_SOME 1
125edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project#define IN_THIS 2
126edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project#define IN_ALL  3
1271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define FORCE_LOWER_CASE 0x100
1291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectsize_t
1311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstrftime(s, maxsize, format, t)
132edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectchar * const        s;
133edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectconst size_t        maxsize;
134edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectconst char * const  format;
135edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectconst struct tm * const t;
136edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project{
137edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    return strftime_tz(s, maxsize, format, t, Locale);
138edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project}
139edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
140edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectsize_t
141edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectstrftime_tz(s, maxsize, format, t, locale)
142edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectchar * const        s;
143edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectconst size_t        maxsize;
144edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectconst char * const  format;
145edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectconst struct tm * const t;
146edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectconst struct strftime_locale *locale;
1471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{
148edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    char *  p;
149edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    int warn;
150edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
151edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    tzset();
152edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    warn = IN_NONE;
153edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    p = _fmt(((format == NULL) ? "%c" : format), t, s, s + maxsize, &warn, locale);
154edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project#if 0  /* ifndef NO_RUN_TIME_WARNINGS_ABOUT_YEAR_2000_PROBLEMS_THANK_YOU */
155edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    if (warn != IN_NONE && getenv(YEAR_2000_NAME) != NULL) {
156edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        (void) fprintf(stderr, "\n");
157edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        if (format == NULL)
158edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            (void) fprintf(stderr, "NULL strftime format ");
159edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        else    (void) fprintf(stderr, "strftime format \"%s\" ",
160edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                format);
161edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        (void) fprintf(stderr, "yields only two digits of years in ");
162edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        if (warn == IN_SOME)
163edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            (void) fprintf(stderr, "some locales");
164edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        else if (warn == IN_THIS)
165edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            (void) fprintf(stderr, "the current locale");
166edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        else    (void) fprintf(stderr, "all locales");
167edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        (void) fprintf(stderr, "\n");
168edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    }
1691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* !defined NO_RUN_TIME_WARNINGS_ABOUT_YEAR_2000_PROBLEMS_THANK_YOU */
170edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    if (p == s + maxsize)
171edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        return 0;
172edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    *p = '\0';
173edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    return p - s;
1741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
1751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic char *getformat(int modifier, char *normal, char *underscore,
1771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                       char *dash, char *zero) {
1781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project    switch (modifier) {
1791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project    case '_':
1801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project        return underscore;
1811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project    case '-':
1831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project        return dash;
1841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project    case '0':
1861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project        return zero;
1871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project    }
1881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project    return normal;
1901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
1911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic char *
193edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project_fmt(format, t, pt, ptlim, warnp, locale)
194edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectconst char *        format;
195edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectconst struct tm * const t;
196edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectchar *          pt;
197edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectconst char * const  ptlim;
198edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectint *           warnp;
199edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectconst struct strftime_locale* locale;
2001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{
201edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    for ( ; *format; ++format) {
202edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        if (*format == '%') {
2031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project            int modifier = 0;
2041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectlabel:
205edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            switch (*++format) {
206edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case '\0':
207edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                --format;
208edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                break;
209edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'A':
210edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _add((t->tm_wday < 0 ||
211edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    t->tm_wday >= DAYSPERWEEK) ?
212edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    "?" : locale->weekday[t->tm_wday],
213edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    pt, ptlim, modifier);
214edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
215edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'a':
216edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _add((t->tm_wday < 0 ||
217edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    t->tm_wday >= DAYSPERWEEK) ?
218edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    "?" : locale->wday[t->tm_wday],
219edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    pt, ptlim, modifier);
220edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
221edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'B':
222edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _add((t->tm_mon < 0 ||
223edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    t->tm_mon >= MONSPERYEAR) ?
224edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    "?" : locale->month[t->tm_mon],
225edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    pt, ptlim, modifier);
226edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
227edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'b':
228edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'h':
229edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _add((t->tm_mon < 0 ||
230edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    t->tm_mon >= MONSPERYEAR) ?
231edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    "?" : locale->mon[t->tm_mon],
232edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    pt, ptlim, modifier);
233edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
234edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'C':
235edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                /*
236edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** %C used to do a...
237edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                **  _fmt("%a %b %e %X %Y", t);
238edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** ...whereas now POSIX 1003.2 calls for
239edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** something completely different.
240edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** (ado, 1993-05-24)
241edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                */
242edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _yconv(t->tm_year, TM_YEAR_BASE, 1, 0,
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                int warn2 = IN_SOME;
248edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
249edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _fmt(locale->c_fmt, t, pt, ptlim, warnp, locale);
250edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                if (warn2 == IN_ALL)
251edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    warn2 = IN_THIS;
252edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                if (warn2 > *warnp)
253edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    *warnp = warn2;
254edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                }
255edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
256edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'D':
257edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                                pt = _fmt("%m/%d/%y", t, pt, ptlim, warnp, locale);
258edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
259edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'd':
2601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                pt = _conv(t->tm_mday,
2611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                           getformat(modifier, "%02d",
2621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                                     "%2d", "%d", "%02d"),
2631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                           pt, ptlim);
264edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
265edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'E':
266edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'O':
267edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                /*
268edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** C99 locale modifiers.
269edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** The sequences
270edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                **  %Ec %EC %Ex %EX %Ey %EY
271edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                **  %Od %oe %OH %OI %Om %OM
272edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                **  %OS %Ou %OU %OV %Ow %OW %Oy
273edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** are supposed to provide alternate
274edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** representations.
275edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                */
276edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                goto label;
2771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project            case '_':
2781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project            case '-':
2791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project            case '0':
2801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project            case '^':
2811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project            case '#':
2821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                modifier = *format;
2831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                goto label;
284edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'e':
285edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _conv(t->tm_mday,
2861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                           getformat(modifier, "%2d",
2871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                                     "%2d", "%d", "%02d"),
2881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                           pt, ptlim);
289edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
290edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'F':
291edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _fmt("%Y-%m-%d", t, pt, ptlim, warnp, locale);
292edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
293edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'H':
294edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _conv(t->tm_hour,
2951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                           getformat(modifier, "%02d",
2961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                                     "%2d", "%d", "%02d"),
2971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                           pt, ptlim);
298edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
299edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'I':
300edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _conv((t->tm_hour % 12) ?
301edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    (t->tm_hour % 12) : 12,
302edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    getformat(modifier, "%02d",
3031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                                  "%2d", "%d", "%02d"),
3041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                        pt, ptlim);
305edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
306edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'j':
307edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _conv(t->tm_yday + 1,
3081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                           getformat(modifier, "%03d", "%3d", "%d", "%03d"),
3091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                           pt, ptlim);
310edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
311edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'k':
312edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                /*
313edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** This used to be...
314edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                **  _conv(t->tm_hour % 12 ?
315edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                **      t->tm_hour % 12 : 12, 2, ' ');
316edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** ...and has been changed to the below to
317edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** match SunOS 4.1.1 and Arnold Robbins'
318edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** strftime version 3.0. That is, "%k" and
319edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** "%l" have been swapped.
320edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** (ado, 1993-05-24)
321edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                */
322edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _conv(t->tm_hour,
3231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                           getformat(modifier, "%2d",
3241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                                     "%2d", "%d", "%02d"),
3251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                           pt, ptlim);
326edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
3271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef KITCHEN_SINK
328edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'K':
329edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                /*
330edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** After all this time, still unclaimed!
331edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                */
332edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _add("kitchen sink", pt, ptlim, modifier);
333edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
3341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* defined KITCHEN_SINK */
335edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'l':
336edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                /*
337edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** This used to be...
338edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                **  _conv(t->tm_hour, 2, ' ');
339edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** ...and has been changed to the below to
340edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** match SunOS 4.1.1 and Arnold Robbin's
341edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** strftime version 3.0. That is, "%k" and
342edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** "%l" have been swapped.
343edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** (ado, 1993-05-24)
344edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                */
345edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _conv((t->tm_hour % 12) ?
346edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    (t->tm_hour % 12) : 12,
347edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    getformat(modifier, "%2d",
3481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                                  "%2d", "%d", "%02d"),
3491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                        pt, ptlim);
350edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
351edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'M':
352edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _conv(t->tm_min,
3531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                           getformat(modifier, "%02d",
3541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                                     "%2d", "%d", "%02d"),
3551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                           pt, ptlim);
356edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
357edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'm':
358edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _conv(t->tm_mon + 1,
3591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                           getformat(modifier, "%02d",
3601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                                     "%2d", "%d", "%02d"),
3611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                           pt, ptlim);
362edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
363edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'n':
364edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _add("\n", pt, ptlim, modifier);
365edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
366edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'p':
367edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _add((t->tm_hour >= (HOURSPERDAY / 2)) ?
368edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    locale->pm :
369edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    locale->am,
370edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    pt, ptlim, modifier);
371edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
372edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'P':
373edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _add((t->tm_hour >= (HOURSPERDAY / 2)) ?
374edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    locale->pm :
375edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    locale->am,
376edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    pt, ptlim, FORCE_LOWER_CASE);
377edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
378edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'R':
379edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _fmt("%H:%M", t, pt, ptlim, warnp, locale);
380edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
381edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'r':
382edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _fmt("%I:%M:%S %p", t, pt, ptlim, warnp, locale);
383edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
384edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'S':
385edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _conv(t->tm_sec,
3861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                           getformat(modifier, "%02d",
3871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                                     "%2d", "%d", "%02d"),
3881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                           pt, ptlim);
389edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
390edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 's':
391edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                {
392edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    struct tm   tm;
393edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    char        buf[INT_STRLEN_MAXIMUM(
394edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                                time64_t) + 1];
395edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    time64_t    mkt;
396edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
397edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    tm = *t;
398edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    mkt = mktime64(&tm);
399edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    if (TYPE_SIGNED(time64_t))
400edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                        (void) sprintf(buf, "%lld",
401edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                            (long long) mkt);
402edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    else    (void) sprintf(buf, "%llu",
403edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                            (unsigned long long) mkt);
404edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    pt = _add(buf, pt, ptlim, modifier);
405edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                }
406edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
407edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'T':
408edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _fmt("%H:%M:%S", t, pt, ptlim, warnp, locale);
409edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
410edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 't':
411edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _add("\t", pt, ptlim, modifier);
412edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
413edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'U':
414edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _conv((t->tm_yday + DAYSPERWEEK -
415edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    t->tm_wday) / DAYSPERWEEK,
416edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    getformat(modifier, "%02d",
4171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                                  "%2d", "%d", "%02d"),
4181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                        pt, ptlim);
419edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
420edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'u':
421edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                /*
422edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** From Arnold Robbins' strftime version 3.0:
423edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** "ISO 8601: Weekday as a decimal number
424edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** [1 (Monday) - 7]"
425edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** (ado, 1993-05-24)
426edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                */
427edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _conv((t->tm_wday == 0) ?
428edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    DAYSPERWEEK : t->tm_wday, "%d", pt, ptlim);
429edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
430edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'V':   /* ISO 8601 week number */
431edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'G':   /* ISO 8601 year (four digits) */
432edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'g':   /* ISO 8601 year (two digits) */
4331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
4341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** From Arnold Robbins' strftime version 3.0: "the week number of the
4351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** year (the first Monday as the first day of week 1) as a decimal number
4361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** (01-53)."
4371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** (ado, 1993-05-24)
4381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project**
4391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** From "http://www.ft.uni-erlangen.de/~mskuhn/iso-time.html" by Markus Kuhn:
4401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** "Week 01 of a year is per definition the first week which has the
4411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** Thursday in this year, which is equivalent to the week which contains
4421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** the fourth day of January. In other words, the first week of a new year
4431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** is the week which has the majority of its days in the new year. Week 01
4441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** might also contain days from the previous year and the week before week
4451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** 01 of a year is the last week (52 or 53) of the previous year even if
4461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** it contains days from the new year. A week starts with Monday (day 1)
4471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** and ends with Sunday (day 7). For example, the first week of the year
4481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** 1997 lasts from 1996-12-30 to 1997-01-05..."
4491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** (ado, 1996-01-02)
4501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project*/
451edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                {
452edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    int year;
453edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    int base;
454edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    int yday;
455edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    int wday;
456edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    int w;
457edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
458edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    year = t->tm_year;
459edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    base = TM_YEAR_BASE;
460edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    yday = t->tm_yday;
461edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    wday = t->tm_wday;
462edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    for ( ; ; ) {
463edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                        int len;
464edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                        int bot;
465edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                        int top;
466edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
467edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                        len = isleap_sum(year, base) ?
468edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                            DAYSPERLYEAR :
469edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                            DAYSPERNYEAR;
470edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                        /*
471edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                        ** What yday (-3 ... 3) does
472edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                        ** the ISO year begin on?
473edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                        */
474edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                        bot = ((yday + 11 - wday) %
475edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                            DAYSPERWEEK) - 3;
476edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                        /*
477edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                        ** What yday does the NEXT
478edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                        ** ISO year begin on?
479edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                        */
480edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                        top = bot -
481edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                            (len % DAYSPERWEEK);
482edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                        if (top < -3)
483edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                            top += DAYSPERWEEK;
484edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                        top += len;
485edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                        if (yday >= top) {
486edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                            ++base;
487edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                            w = 1;
488edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                            break;
489edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                        }
490edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                        if (yday >= bot) {
491edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                            w = 1 + ((yday - bot) /
492edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                                DAYSPERWEEK);
493edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                            break;
494edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                        }
495edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                        --base;
496edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                        yday += isleap_sum(year, base) ?
497edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                            DAYSPERLYEAR :
498edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                            DAYSPERNYEAR;
499edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    }
5001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef XPG4_1994_04_09
501edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    if ((w == 52 &&
502edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                        t->tm_mon == TM_JANUARY) ||
503edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                        (w == 1 &&
504edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                        t->tm_mon == TM_DECEMBER))
505edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                            w = 53;
5061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* defined XPG4_1994_04_09 */
507edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    if (*format == 'V')
508edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                        pt = _conv(w,
5091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                                           getformat(modifier,
5101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                                                     "%02d",
5111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                                                     "%2d",
5121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                                                     "%d",
5131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                                                     "%02d"),
514edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                               pt, ptlim);
515edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    else if (*format == 'g') {
516edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                        *warnp = IN_ALL;
517edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                        pt = _yconv(year, base, 0, 1,
518edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                            pt, ptlim, modifier);
519edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    } else  pt = _yconv(year, base, 1, 1,
520edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                            pt, ptlim, modifier);
521edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                }
522edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
523edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'v':
524edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                /*
525edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** From Arnold Robbins' strftime version 3.0:
526edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** "date as dd-bbb-YYYY"
527edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** (ado, 1993-05-24)
528edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                */
529edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _fmt("%e-%b-%Y", t, pt, ptlim, warnp, locale);
530edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
531edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'W':
532edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _conv((t->tm_yday + DAYSPERWEEK -
533edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    (t->tm_wday ?
534edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    (t->tm_wday - 1) :
535edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    (DAYSPERWEEK - 1))) / DAYSPERWEEK,
536edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    getformat(modifier, "%02d",
5371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                                  "%2d", "%d", "%02d"),
5381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                        pt, ptlim);
539edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
540edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'w':
541edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _conv(t->tm_wday, "%d", pt, ptlim);
542edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
543edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'X':
544edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _fmt(locale->X_fmt, t, pt, ptlim, warnp, locale);
545edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
546edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'x':
547edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                {
548edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                int warn2 = IN_SOME;
549edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
550edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _fmt(locale->x_fmt, t, pt, ptlim, &warn2, locale);
551edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                if (warn2 == IN_ALL)
552edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    warn2 = IN_THIS;
553edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                if (warn2 > *warnp)
554edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    *warnp = warn2;
555edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                }
556edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
557edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'y':
558edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                *warnp = IN_ALL;
559edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _yconv(t->tm_year, TM_YEAR_BASE, 0, 1,
560edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    pt, ptlim, modifier);
561edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
562edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'Y':
563edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _yconv(t->tm_year, TM_YEAR_BASE, 1, 1,
564edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    pt, ptlim, modifier);
565edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
566edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'Z':
5671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef TM_ZONE
568edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                if (t->TM_ZONE != NULL)
569edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    pt = _add(t->TM_ZONE, pt, ptlim,
5701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                                  modifier);
571edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                else
5721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* defined TM_ZONE */
573edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                if (t->tm_isdst >= 0)
574edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    pt = _add(tzname[t->tm_isdst != 0],
575edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                        pt, ptlim, modifier);
576edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                /*
577edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** C99 says that %Z must be replaced by the
578edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** empty string if the time zone is not
579edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** determinable.
580edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                */
581edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
582edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case 'z':
583edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                {
584edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                int     diff;
585edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                char const *    sign;
586edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
587edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                if (t->tm_isdst < 0)
588edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    continue;
5891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef TM_GMTOFF
590edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                diff = t->TM_GMTOFF;
5911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#else /* !defined TM_GMTOFF */
592edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                /*
593edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** C99 says that the UTC offset must
594edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** be computed by looking only at
595edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** tm_isdst. This requirement is
596edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** incorrect, since it means the code
597edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** must rely on magic (in this case
598edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** altzone and timezone), and the
599edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** magic might not have the correct
600edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** offset. Doing things correctly is
601edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** tricky and requires disobeying C99;
602edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** see GNU C strftime for details.
603edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** For now, punt and conform to the
604edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** standard, even though it's incorrect.
605edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                **
606edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** C99 says that %z must be replaced by the
607edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** empty string if the time zone is not
608edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** determinable, so output nothing if the
609edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                ** appropriate variables are not available.
610edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                */
611edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                if (t->tm_isdst == 0)
6121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef USG_COMPAT
613edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    diff = -timezone;
6141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#else /* !defined USG_COMPAT */
615edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    continue;
6161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* !defined USG_COMPAT */
617edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                else
6181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef ALTZONE
619edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    diff = -altzone;
6201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#else /* !defined ALTZONE */
621edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    continue;
6221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* !defined ALTZONE */
6231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* !defined TM_GMTOFF */
624edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                if (diff < 0) {
625edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    sign = "-";
626edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    diff = -diff;
627edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                } else  sign = "+";
628edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _add(sign, pt, ptlim, modifier);
629edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                diff /= SECSPERMIN;
630edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                diff = (diff / MINSPERHOUR) * 100 +
631edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    (diff % MINSPERHOUR);
632edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _conv(diff,
6331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                           getformat(modifier, "%04d",
6341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                                     "%4d", "%d", "%04d"),
6351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                           pt, ptlim);
636edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                }
637edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
638edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case '+':
639edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                pt = _fmt(locale->date_fmt, t, pt, ptlim,
640edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                    warnp, locale);
641edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                continue;
642edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            case '%':
643edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            /*
644edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            ** X311J/88-090 (4.12.3.5): if conversion char is
645edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            ** undefined, behavior is undefined. Print out the
646edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            ** character itself as printf(3) also does.
647edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            */
648edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            default:
649edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project                break;
650edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            }
651edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        }
652edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        if (pt == ptlim)
653edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            break;
654edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        *pt++ = *format;
655edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    }
656edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    return pt;
6571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
6581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
6591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic char *
6601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project_conv(n, format, pt, ptlim)
661edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectconst int       n;
662edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectconst char * const  format;
663edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectchar * const        pt;
664edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectconst char * const  ptlim;
6651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{
666edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    char    buf[INT_STRLEN_MAXIMUM(int) + 1];
6671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
668edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    (void) snprintf(buf, sizeof(buf), format, n);
669edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    return _add(buf, pt, ptlim, 0);
6701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
6711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
6721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic char *
6731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project_add(str, pt, ptlim, modifier)
674edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectconst char *        str;
675edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectchar *          pt;
676edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectconst char * const  ptlim;
6771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint                     modifier;
6781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{
6791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project        int c;
6801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
6811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project        switch (modifier) {
6821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project        case FORCE_LOWER_CASE:
6831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                while (pt < ptlim && (*pt = tolower(*str++)) != '\0') {
6841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                        ++pt;
6851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                }
6861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                break;
6871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
6881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project        case '^':
6891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                while (pt < ptlim && (*pt = toupper(*str++)) != '\0') {
6901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                        ++pt;
6911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                }
6921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                break;
6931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
6941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project        case '#':
6951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                while (pt < ptlim && (c = *str++) != '\0') {
6961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                        if (isupper(c)) {
6971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                c = tolower(c);
6981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                        } else if (islower(c)) {
6991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                c = toupper(c);
7001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                        }
7011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                        *pt = c;
7021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                        ++pt;
7031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                }
7041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
7051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                break;
7061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
7071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project        default:
7081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                while (pt < ptlim && (*pt = *str++) != '\0') {
7091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                        ++pt;
7101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                }
7111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project        }
7121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
713edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    return pt;
7141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
7151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
7161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
7171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** POSIX and the C Standard are unclear or inconsistent about
7181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** what %C and %y do if the year is negative or exceeds 9999.
7191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** Use the convention that %C concatenated with %y yields the
7201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** same output as %Y, and that %Y contains at least 4 bytes,
7211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project** with more only if necessary.
7221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project*/
7231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
7241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic char *
7251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project_yconv(a, b, convert_top, convert_yy, pt, ptlim, modifier)
726edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectconst int       a;
727edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectconst int       b;
728edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectconst int       convert_top;
729edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectconst int       convert_yy;
730edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectchar *          pt;
731edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Projectconst char * const  ptlim;
7321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint                     modifier;
7331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{
734edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    register int    lead;
735edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    register int    trail;
736edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project
737edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project#define DIVISOR 100
738edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    trail = a % DIVISOR + b % DIVISOR;
739edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    lead = a / DIVISOR + b / DIVISOR + trail / DIVISOR;
740edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    trail %= DIVISOR;
741edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    if (trail < 0 && lead > 0) {
742edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        trail += DIVISOR;
743edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        --lead;
744edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    } else if (lead < 0 && trail > 0) {
745edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        trail -= DIVISOR;
746edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        ++lead;
747edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    }
748edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    if (convert_top) {
749edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        if (lead == 0 && trail < 0)
750edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project            pt = _add("-0", pt, ptlim, modifier);
751edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        else    pt = _conv(lead, getformat(modifier, "%02d",
7521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                                   "%2d", "%d", "%02d"),
7531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                                   pt, ptlim);
754edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    }
755edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    if (convert_yy)
756edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project        pt = _conv(((trail < 0) ? -trail : trail),
7571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                           getformat(modifier, "%02d", "%2d", "%d", "%02d"),
7581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project                           pt, ptlim);
759edbe7fc97bab7ff0684053d1be564330689bf3adThe Android Open Source Project    return pt;
7601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
761