4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Implementation of the strftime function for <time.h>.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Based on the UCB version with the ID appearing below.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This is ANSIish only when "multibyte character == plain character".
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This program and the accompanying materials are licensed and made available under
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the terms and conditions of the BSD License that accompanies this distribution.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The full text of the license may be found at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Copyright (c) 1989, 1993
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The Regents of the University of California. All rights reserved.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Redistribution and use in source and binary forms, with or without
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync modification, are permitted provided that the following conditions
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 1. Redistributions of source code must retain the above copyright
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync notice, this list of conditions and the following disclaimer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 2. Redistributions in binary form must reproduce the above copyright
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync notice, this list of conditions and the following disclaimer in the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync documentation and/or other materials provided with the distribution.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 3. All advertising materials mentioning features or use of this software
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync must display the following acknowledgement:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This product includes software developed by the University of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync California, Berkeley and its contributors.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 4. Neither the name of the University nor the names of its contributors
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync may be used to endorse or promote products derived from this software
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync without specific prior written permission.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SUCH DAMAGE.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NetBSD: strftime.c,v 1.17.4.1 2007/08/21 20:08:21 liamjfoy Exp
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync** We don't use these extensions in strftime operation even when
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync** supported by the local tzcode configuration. A strictly
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync** conforming C application may leave them in undefined state.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstatic char * _add(const char *, char *, const char * const);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstatic char * _conv(const int, const char * const, char * const, const char * const);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstatic char * _fmt(const char *, const struct tm * const, char *, const char * const, int *);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define NO_RUN_TIME_WARNINGS_ABOUT_YEAR_2000_PROBLEMS_THANK_YOU
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define YEAR_2000_NAME "CHECK_STRFTIME_FORMATS_FOR_TWO_DIGIT_YEARS"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif /* !defined YEAR_2000_NAME */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync p = _fmt(((format == NULL) ? "%c" : format), timeptr, s, s + maxsize, &warn);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifndef NO_RUN_TIME_WARNINGS_ABOUT_YEAR_2000_PROBLEMS_THANK_YOU
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (warn != IN_NONE && getenv(YEAR_2000_NAME) != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else (void) fprintf(stderr, "strftime format \"%s\" ",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (void) fprintf(stderr, "yields only two digits of years in ");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif /* !defined NO_RUN_TIME_WARNINGS_ABOUT_YEAR_2000_PROBLEMS_THANK_YOU */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (p == s + maxsize)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return p - s;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstatic char *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync const char * format,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync const struct tm * const t,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync const char * const ptlim,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (*++format) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** %C used to do a...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** _fmt("%a %b %e %X %Y", t);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** ...whereas now POSIX 1003.2 calls for
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** something completely different.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** (ado, 1993-05-24)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** C99 locale modifiers.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** The sequences
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** %Ec %EC %Ex %EX %Ey %EY
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** %Od %oe %OH %OI %Om %OM
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** %OS %Ou %OU %OV %Ow %OW %Oy
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** are supposed to provide alternate
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** representations.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** This used to be...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** _conv(t->tm_hour % 12 ?
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** t->tm_hour % 12 : 12, 2, ' ');
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** ...and has been changed to the below to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** match SunOS 4.1.1 and Arnold Robbins'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** strftime version 3.0. That is, "%k" and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** "%l" have been swapped.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** (ado, 1993-05-24)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** After all this time, still unclaimed!
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif /* defined KITCHEN_SINK */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** This used to be...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** _conv(t->tm_hour, 2, ' ');
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** ...and has been changed to the below to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** match SunOS 4.1.1 and Arnold Robbin's
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** strftime version 3.0. That is, "%k" and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** "%l" have been swapped.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** (ado, 1993-05-24)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* CONSTCOND */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (unsigned long) mkt);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** From Arnold Robbins' strftime version 3.0:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** "ISO 8601: Weekday as a decimal number
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** [1 (Monday) - 7]"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** (ado, 1993-05-24)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync** From Arnold Robbins' strftime version 3.0: "the week number of the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync** year (the first Monday as the first day of week 1) as a decimal number
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync** (01-53)."
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync** (ado, 1993-05-24)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync** From "http://www.ft.uni-erlangen.de/~mskuhn/iso-time.html" by Markus Kuhn:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync** "Week 01 of a year is per definition the first week which has the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync** Thursday in this year, which is equivalent to the week which contains
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync** the fourth day of January. In other words, the first week of a new year
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync** is the week which has the majority of its days in the new year. Week 01
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync** might also contain days from the previous year and the week before week
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync** 01 of a year is the last week (52 or 53) of the previous year even if
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync** it contains days from the new year. A week starts with Monday (day 1)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync** and ends with Sunday (day 7). For example, the first week of the year
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync** 1997 lasts from 1996-12-30 to 1997-01-05..."
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync** (ado, 1996-01-02)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for ( ; ; ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** What yday (-3 ... 3) does
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** the ISO year begin on?
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** What yday does the NEXT
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** ISO year begin on?
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((w == 52
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif /* defined XPG4_1994_04_09 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** From Arnold Robbins' strftime version 3.0:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** "date as dd-bbb-YYYY"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** (ado, 1993-05-24)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif /* defined TM_ZONE */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (t->tm_isdst >= 0)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** C99 says that %Z must be replaced by the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** empty string if the time zone is not
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** determinable.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#else /* !defined TM_GMTOFF */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** C99 says that the UTC offset must
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** be computed by looking only at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** tm_isdst. This requirement is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** incorrect, since it means the code
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** must rely on magic (in this case
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** altzone and timezone), and the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** magic might not have the correct
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** offset. Doing things correctly is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** tricky and requires disobeying C99;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** see GNU C strftime for details.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** For now, punt and conform to the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** standard, even though it's incorrect.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** C99 says that %z must be replaced by the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** empty string if the time zone is not
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** determinable, so output nothing if the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** appropriate variables are not available.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (t->tm_isdst == 0)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#else /* !defined USG_COMPAT */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif /* !defined USG_COMPAT */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#else /* !defined ALTZONE */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif /* !defined ALTZONE */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#else /* defined STD_INSPIRED */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** Get calendar time from t
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** being treated as local.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** Get calendar time from t
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** being treated as GMT.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* LINTED difference will fit int */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif /* defined STD_INSPIRED */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif /* !defined TM_GMTOFF */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** X311J/88-090 (4.12.3.5): if conversion char is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** undefined, behavior is undefined. Print out the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** character itself as printf(3) also does.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstatic char *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync const int n,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync const char * const format,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync char * const pt,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync const char * const ptlim
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstatic char *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync const char * str,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync const char * const ptlim