4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Implementation of the strftime function for <time.h>.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Based on the UCB version with the ID appearing below.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This is ANSIish only when "multibyte character == plain character".
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
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 http://opensource.org/licenses/bsd-license.php.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
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
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Copyright (c) 1989, 1993
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The Regents of the University of California. All rights reserved.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Redistribution and use in source and binary forms, with or without
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync modification, are permitted provided that the following conditions
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync are met:
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
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
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NetBSD: strftime.c,v 1.17.4.1 2007/08/21 20:08:21 liamjfoy Exp
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <LibConfig.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <sys/EfiCdefs.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "namespace.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <time.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "tzfile.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "TimeVals.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "fcntl.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "locale.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "sys/localedef.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <MainData.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/*
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.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync*/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef _LIBC
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#undef TM_ZONE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#undef TM_GMTOFF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define Locale _CurrentTimeLocale
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
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
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define NO_RUN_TIME_WARNINGS_ABOUT_YEAR_2000_PROBLEMS_THANK_YOU
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifndef YEAR_2000_NAME
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define YEAR_2000_NAME "CHECK_STRFTIME_FORMATS_FOR_TWO_DIGIT_YEARS"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif /* !defined YEAR_2000_NAME */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define IN_NONE 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define IN_SOME 1
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define IN_THIS 2
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define IN_ALL 3
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncsize_t
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstrftime(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync char * __restrict s,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync size_t maxsize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync const char * __restrict format,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync const struct tm * __restrict timeptr
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync char * p;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int warn;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync tzset();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync warn = IN_NONE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync p = _fmt(((format == NULL) ? "%c" : format), timeptr, s, s + maxsize, &warn);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifndef NO_RUN_TIME_WARNINGS_ABOUT_YEAR_2000_PROBLEMS_THANK_YOU
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (warn != IN_NONE && getenv(YEAR_2000_NAME) != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (void) fprintf(stderr, "\n");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (format == NULL)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (void) fprintf(stderr, "NULL strftime format ");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else (void) fprintf(stderr, "strftime format \"%s\" ",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync format);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (void) fprintf(stderr, "yields only two digits of years in ");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (warn == IN_SOME)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (void) fprintf(stderr, "some locales");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else if (warn == IN_THIS)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (void) fprintf(stderr, "the current locale");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else (void) fprintf(stderr, "all locales");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (void) fprintf(stderr, "\n");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif /* !defined NO_RUN_TIME_WARNINGS_ABOUT_YEAR_2000_PROBLEMS_THANK_YOU */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (p == s + maxsize)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *p = '\0';
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return p - s;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstatic char *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync_fmt(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync const char * format,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync const struct tm * const t,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync char * pt,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync const char * const ptlim,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int * warnp
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for ( ; *format; ++format) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*format == '%') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynclabel:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (*++format) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case '\0':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync --format;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 'A':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pt = _add((t->tm_wday < 0 ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync t->tm_wday >= DAYSPERWEEK) ?
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "?" : Locale->day[t->tm_wday],
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pt, ptlim);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 'a':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pt = _add((t->tm_wday < 0 ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync t->tm_wday >= DAYSPERWEEK) ?
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "?" : Locale->abday[t->tm_wday],
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pt, ptlim);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 'B':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pt = _add((t->tm_mon < 0 ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync t->tm_mon >= MONSPERYEAR) ?
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "?" : Locale->mon[t->tm_mon],
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pt, ptlim);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 'b':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 'h':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pt = _add((t->tm_mon < 0 ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync t->tm_mon >= MONSPERYEAR) ?
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "?" : Locale->abmon[t->tm_mon],
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pt, ptlim);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 'C':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /*
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 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pt = _conv((t->tm_year + TM_YEAR_BASE) / 100,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "%02d", pt, ptlim);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 'c':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int warn2 = IN_SOME;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pt = _fmt(Locale->d_t_fmt, t, pt, ptlim, &warn2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (warn2 == IN_ALL)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync warn2 = IN_THIS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (warn2 > *warnp)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *warnp = warn2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 'D':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pt = _fmt("%m/%d/%y", t, pt, ptlim, warnp);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 'd':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pt = _conv(t->tm_mday, "%02d", pt, ptlim);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 'E':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 'O':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /*
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 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto label;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 'e':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pt = _conv(t->tm_mday, "%2d", pt, ptlim);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 'F':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pt = _fmt("%Y-%m-%d", t, pt, ptlim, warnp);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 'H':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pt = _conv(t->tm_hour, "%02d", pt, ptlim);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 'I':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pt = _conv((t->tm_hour % 12) ?
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (t->tm_hour % 12) : 12,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "%02d", pt, ptlim);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 'j':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pt = _conv(t->tm_yday + 1, "%03d", pt, ptlim);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 'k':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /*
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 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pt = _conv(t->tm_hour, "%2d", pt, ptlim);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef KITCHEN_SINK
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 'K':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** After all this time, still unclaimed!
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pt = _add("kitchen sink", pt, ptlim);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif /* defined KITCHEN_SINK */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 'l':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /*
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 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pt = _conv((t->tm_hour % 12) ?
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (t->tm_hour % 12) : 12,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "%2d", pt, ptlim);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 'M':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pt = _conv(t->tm_min, "%02d", pt, ptlim);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 'm':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pt = _conv(t->tm_mon + 1, "%02d", pt, ptlim);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 'n':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pt = _add("\n", pt, ptlim);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 'p':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pt = _add((t->tm_hour >= (HOURSPERDAY / 2)) ?
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Locale->am_pm[1] :
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Locale->am_pm[0],
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pt, ptlim);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 'R':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pt = _fmt("%H:%M", t, pt, ptlim, warnp);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 'r':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pt = _fmt(Locale->t_fmt_ampm, t, pt, ptlim,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync warnp);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 'S':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pt = _conv(t->tm_sec, "%02d", pt, ptlim);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 's':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync struct tm tm;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync char buf[INT_STRLEN_MAXIMUM(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync time_t) + 1];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync time_t mkt;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync tm = *t;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mkt = mktime(&tm);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* CONSTCOND */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (TYPE_SIGNED(time_t))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (void) sprintf(buf, "%ld",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (long) mkt);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else (void) sprintf(buf, "%lu",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (unsigned long) mkt);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pt = _add(buf, pt, ptlim);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 'T':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pt = _fmt("%H:%M:%S", t, pt, ptlim, warnp);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 't':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pt = _add("\t", pt, ptlim);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 'U':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pt = _conv((t->tm_yday + DAYSPERWEEK -
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync t->tm_wday) / DAYSPERWEEK,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "%02d", pt, ptlim);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 'u':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /*
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 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pt = _conv((t->tm_wday == 0) ?
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DAYSPERWEEK : t->tm_wday,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "%d", pt, ptlim);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 'V': /* ISO 8601 week number */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 'G': /* ISO 8601 year (four digits) */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 'g': /* ISO 8601 year (two digits) */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/*
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**
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*/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int year;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int yday;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int wday;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int w;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync year = t->tm_year + TM_YEAR_BASE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync yday = t->tm_yday;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync wday = t->tm_wday;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for ( ; ; ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int len;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int bot;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int top;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync len = isleap(year) ?
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DAYSPERLYEAR :
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DAYSPERNYEAR;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** What yday (-3 ... 3) does
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** the ISO year begin on?
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync bot = ((yday + 11 - wday) %
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DAYSPERWEEK) - 3;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** What yday does the NEXT
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** ISO year begin on?
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync top = bot -
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (len % DAYSPERWEEK);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (top < -3)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync top += DAYSPERWEEK;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync top += len;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (yday >= top) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ++year;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync w = 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (yday >= bot) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync w = 1 + ((yday - bot) /
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DAYSPERWEEK);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync --year;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync yday += isleap(year) ?
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DAYSPERLYEAR :
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DAYSPERNYEAR;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef XPG4_1994_04_09
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((w == 52
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync && t->tm_mon == TM_JANUARY)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync || (w == 1
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync && t->tm_mon == TM_DECEMBER))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync w = 53;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif /* defined XPG4_1994_04_09 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*format == 'V')
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pt = _conv(w, "%02d",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pt, ptlim);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else if (*format == 'g') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *warnp = IN_ALL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pt = _conv(year % 100, "%02d",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pt, ptlim);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else pt = _conv(year, "%04d",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pt, ptlim);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 'v':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** From Arnold Robbins' strftime version 3.0:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** "date as dd-bbb-YYYY"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** (ado, 1993-05-24)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pt = _fmt("%e-%b-%Y", t, pt, ptlim, warnp);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 'W':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pt = _conv((t->tm_yday + DAYSPERWEEK -
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (t->tm_wday ?
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (t->tm_wday - 1) :
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (DAYSPERWEEK - 1))) / DAYSPERWEEK,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "%02d", pt, ptlim);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 'w':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pt = _conv(t->tm_wday, "%d", pt, ptlim);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 'X':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pt = _fmt(Locale->t_fmt, t, pt, ptlim, warnp);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 'x':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int warn2 = IN_SOME;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pt = _fmt(Locale->d_fmt, t, pt, ptlim, &warn2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (warn2 == IN_ALL)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync warn2 = IN_THIS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (warn2 > *warnp)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *warnp = warn2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 'y':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *warnp = IN_ALL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pt = _conv((t->tm_year + TM_YEAR_BASE) % 100,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "%02d", pt, ptlim);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 'Y':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pt = _conv(t->tm_year + TM_YEAR_BASE, "%04d",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pt, ptlim);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 'Z':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef TM_ZONE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (t->TM_ZONE != NULL)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pt = _add(t->TM_ZONE, pt, ptlim);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif /* defined TM_ZONE */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (t->tm_isdst >= 0)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pt = _add(tzname[t->tm_isdst != 0],
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pt, ptlim);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** C99 says that %Z must be replaced by the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** empty string if the time zone is not
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** determinable.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 'z':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int diff;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync char const * sign;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (t->tm_isdst < 0)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef TM_GMTOFF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync diff = (int)t->TM_GMTOFF;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#else /* !defined TM_GMTOFF */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /*
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 **
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 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifndef STD_INSPIRED
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (t->tm_isdst == 0)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef USG_COMPAT
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync diff = -timezone;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#else /* !defined USG_COMPAT */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif /* !defined USG_COMPAT */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef ALTZONE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync diff = -altzone;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#else /* !defined ALTZONE */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif /* !defined ALTZONE */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#else /* defined STD_INSPIRED */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync struct tm tmp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync time_t lct, gct;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** Get calendar time from t
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** being treated as local.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync tmp = *t; /* mktime discards const */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync lct = mktime(&tmp);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (lct == (time_t)-1)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** Get calendar time from t
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ** being treated as GMT.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync **/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync tmp = *t; /* mktime discards const */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gct = timegm(&tmp);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (gct == (time_t)-1)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* LINTED difference will fit int */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync diff = (intmax_t)gct - (intmax_t)lct;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif /* defined STD_INSPIRED */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif /* !defined TM_GMTOFF */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (diff < 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync sign = "-";
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync diff = -diff;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else sign = "+";
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pt = _add(sign, pt, ptlim);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync diff /= 60;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pt = _conv((diff/60)*100 + diff%60,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "%04d", pt, ptlim);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#if 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case '+':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pt = _fmt(Locale->date_fmt, t, pt, ptlim,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync warnp);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case '%':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /*
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.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (pt == ptlim)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *pt++ = *format;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return pt;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstatic char *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync_conv(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync const int n,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync const char * const format,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync char * const pt,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync const char * const ptlim
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync char buf[INT_STRLEN_MAXIMUM(int) + 1];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (void) sprintf(buf, format, n);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return _add(buf, pt, ptlim);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstatic char *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync_add(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync const char * str,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync char * pt,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync const char * const ptlim
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (pt < ptlim && (*pt = *str++) != '\0')
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ++pt;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return pt;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}