strftime.c revision da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968
6a67d144095c31bbafed93cec1619590157335eajvergara/***********************************************************************
6a67d144095c31bbafed93cec1619590157335eajvergara* *
6a67d144095c31bbafed93cec1619590157335eajvergara* This software is part of the ast package *
6a67d144095c31bbafed93cec1619590157335eajvergara* Copyright (c) 1985-2007 AT&T Knowledge Ventures *
6a67d144095c31bbafed93cec1619590157335eajvergara* and is licensed under the *
6a67d144095c31bbafed93cec1619590157335eajvergara* Common Public License, Version 1.0 *
6a67d144095c31bbafed93cec1619590157335eajvergara* by AT&T Knowledge Ventures *
6a67d144095c31bbafed93cec1619590157335eajvergara* *
6a67d144095c31bbafed93cec1619590157335eajvergara* A copy of the License is available at *
6a67d144095c31bbafed93cec1619590157335eajvergara* http://www.opensource.org/licenses/cpl1.0.txt *
6a67d144095c31bbafed93cec1619590157335eajvergara* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
6a67d144095c31bbafed93cec1619590157335eajvergara* *
6a67d144095c31bbafed93cec1619590157335eajvergara* Information and Software Systems Research *
6a67d144095c31bbafed93cec1619590157335eajvergara* AT&T Research *
6a67d144095c31bbafed93cec1619590157335eajvergara* Florham Park NJ *
6a67d144095c31bbafed93cec1619590157335eajvergara* *
6a67d144095c31bbafed93cec1619590157335eajvergara* Glenn Fowler <gsf@research.att.com> *
6a67d144095c31bbafed93cec1619590157335eajvergara* David Korn <dgk@research.att.com> *
f71f7a61dec7c9089378d14493ad564a1dedf0b5neil_a_wilson* Phong Vo <kpv@research.att.com> *
6a67d144095c31bbafed93cec1619590157335eajvergara* *
6a67d144095c31bbafed93cec1619590157335eajvergara***********************************************************************/
6a67d144095c31bbafed93cec1619590157335eajvergara#pragma prototyped
6a67d144095c31bbafed93cec1619590157335eajvergara/*
6a67d144095c31bbafed93cec1619590157335eajvergara * strftime implementation
d6c71e7b06ef8919af4c8186b4ffb08766c20a09neil_a_wilson */
6a67d144095c31bbafed93cec1619590157335eajvergara
6a67d144095c31bbafed93cec1619590157335eajvergara#define strftime ______strftime
6a67d144095c31bbafed93cec1619590157335eajvergara
6a67d144095c31bbafed93cec1619590157335eajvergara#include <ast.h>
2401d3c2af505789c7c3b860a43e973f27731243jvergara#include <tm.h>
6a67d144095c31bbafed93cec1619590157335eajvergara
6a67d144095c31bbafed93cec1619590157335eajvergara#undef strftime
6a67d144095c31bbafed93cec1619590157335eajvergara
6a67d144095c31bbafed93cec1619590157335eajvergara#undef _def_map_ast
6a67d144095c31bbafed93cec1619590157335eajvergara#include <ast_map.h>
6a67d144095c31bbafed93cec1619590157335eajvergara
6a67d144095c31bbafed93cec1619590157335eajvergara#undef _lib_strftime /* we can pass X/Open */
6a67d144095c31bbafed93cec1619590157335eajvergara
5b9085a87d43ed3ae0b149a9c79ba57723733185jvergara#if _lib_strftime
6a67d144095c31bbafed93cec1619590157335eajvergara
0877596da3b90efc5fd39171cef80a2fb8ec395ekenneth_suterNoN(strftime)
6a67d144095c31bbafed93cec1619590157335eajvergara
6a67d144095c31bbafed93cec1619590157335eajvergara#else
6a67d144095c31bbafed93cec1619590157335eajvergara
6a67d144095c31bbafed93cec1619590157335eajvergara#if defined(__EXPORT__)
6a67d144095c31bbafed93cec1619590157335eajvergara#define extern __EXPORT__
0877596da3b90efc5fd39171cef80a2fb8ec395ekenneth_suter#endif
ffa279622cea61d6eec13e3df386bd3015388388jvergara
6a67d144095c31bbafed93cec1619590157335eajvergaraextern size_t
6a67d144095c31bbafed93cec1619590157335eajvergarastrftime(char* buf, size_t len, const char* format, const struct tm* tm)
6a67d144095c31bbafed93cec1619590157335eajvergara{
5b3741e0620fd2baaa974cecc2c2d953bb7d4fbbkenneth_suter register char* s;
6a67d144095c31bbafed93cec1619590157335eajvergara time_t t;
6a67d144095c31bbafed93cec1619590157335eajvergara Tm_t tl;
6a67d144095c31bbafed93cec1619590157335eajvergara
6a67d144095c31bbafed93cec1619590157335eajvergara memset(&tl, 0, sizeof(tl));
6a67d144095c31bbafed93cec1619590157335eajvergara
6a67d144095c31bbafed93cec1619590157335eajvergara /*
5b3741e0620fd2baaa974cecc2c2d953bb7d4fbbkenneth_suter * nl_langinfo() may call strftime() with bogus tm except for
6a67d144095c31bbafed93cec1619590157335eajvergara * one value -- what a way to go
6a67d144095c31bbafed93cec1619590157335eajvergara */
6a67d144095c31bbafed93cec1619590157335eajvergara
6a67d144095c31bbafed93cec1619590157335eajvergara if (tm->tm_sec < 0 || tm->tm_sec > 60 ||
6a67d144095c31bbafed93cec1619590157335eajvergara tm->tm_min < 0 || tm->tm_min > 59 ||
6a67d144095c31bbafed93cec1619590157335eajvergara tm->tm_hour < 0 || tm->tm_hour > 23 ||
6a67d144095c31bbafed93cec1619590157335eajvergara tm->tm_wday < 0 || tm->tm_wday > 6 ||
6a67d144095c31bbafed93cec1619590157335eajvergara tm->tm_mday < 1 || tm->tm_mday > 31 ||
6a67d144095c31bbafed93cec1619590157335eajvergara tm->tm_mon < 0 || tm->tm_mon > 11 ||
6a67d144095c31bbafed93cec1619590157335eajvergara tm->tm_year < 0 || tm->tm_year > (2138 - 1900))
6a67d144095c31bbafed93cec1619590157335eajvergara {
6a67d144095c31bbafed93cec1619590157335eajvergara if (tm->tm_sec >= 0 && tm->tm_sec <= 60)
6a67d144095c31bbafed93cec1619590157335eajvergara tl.tm_sec = tm->tm_sec;
6a67d144095c31bbafed93cec1619590157335eajvergara if (tm->tm_min >= 0 && tm->tm_min <= 59)
6a67d144095c31bbafed93cec1619590157335eajvergara tl.tm_min = tm->tm_min;
6a67d144095c31bbafed93cec1619590157335eajvergara if (tm->tm_hour >= 0 && tm->tm_hour <= 23)
3e6ff045d382a718a951d6305c8910ffc268f893kenneth_suter tl.tm_hour = tm->tm_hour;
6a67d144095c31bbafed93cec1619590157335eajvergara if (tm->tm_wday >= 0 && tm->tm_wday <= 6)
6a67d144095c31bbafed93cec1619590157335eajvergara tl.tm_wday = tm->tm_wday;
6a67d144095c31bbafed93cec1619590157335eajvergara if (tm->tm_mday >= 0 && tm->tm_mday <= 31)
6a67d144095c31bbafed93cec1619590157335eajvergara tl.tm_mday = tm->tm_mday;
6a67d144095c31bbafed93cec1619590157335eajvergara if (tm->tm_mon >= 0 && tm->tm_mon <= 11)
6a67d144095c31bbafed93cec1619590157335eajvergara tl.tm_mon = tm->tm_mon;
5b3741e0620fd2baaa974cecc2c2d953bb7d4fbbkenneth_suter if (tm->tm_year >= 0 && tm->tm_year <= (2138 - 1900))
5b3741e0620fd2baaa974cecc2c2d953bb7d4fbbkenneth_suter tl.tm_year = tm->tm_year;
5b3741e0620fd2baaa974cecc2c2d953bb7d4fbbkenneth_suter }
2401d3c2af505789c7c3b860a43e973f27731243jvergara else
6a67d144095c31bbafed93cec1619590157335eajvergara {
6a67d144095c31bbafed93cec1619590157335eajvergara tl.tm_sec = tm->tm_sec;
5b3741e0620fd2baaa974cecc2c2d953bb7d4fbbkenneth_suter tl.tm_min = tm->tm_min;
5b3741e0620fd2baaa974cecc2c2d953bb7d4fbbkenneth_suter tl.tm_hour = tm->tm_hour;
6a67d144095c31bbafed93cec1619590157335eajvergara tl.tm_mday = tm->tm_mday;
5b3741e0620fd2baaa974cecc2c2d953bb7d4fbbkenneth_suter tl.tm_mon = tm->tm_mon;
6a67d144095c31bbafed93cec1619590157335eajvergara tl.tm_year = tm->tm_year;
6a67d144095c31bbafed93cec1619590157335eajvergara tl.tm_wday = tm->tm_wday;
5b3741e0620fd2baaa974cecc2c2d953bb7d4fbbkenneth_suter tl.tm_yday = tm->tm_yday;
5b3741e0620fd2baaa974cecc2c2d953bb7d4fbbkenneth_suter tl.tm_isdst = tm->tm_isdst;
6a67d144095c31bbafed93cec1619590157335eajvergara }
5b3741e0620fd2baaa974cecc2c2d953bb7d4fbbkenneth_suter t = tmtime(&tl, TM_LOCALZONE);
5b3741e0620fd2baaa974cecc2c2d953bb7d4fbbkenneth_suter if (!(s = tmfmt(buf, len, format, &t)))
6a67d144095c31bbafed93cec1619590157335eajvergara return 0;
5b3741e0620fd2baaa974cecc2c2d953bb7d4fbbkenneth_suter return s - buf;
6a67d144095c31bbafed93cec1619590157335eajvergara}
5b3741e0620fd2baaa974cecc2c2d953bb7d4fbbkenneth_suter
5b3741e0620fd2baaa974cecc2c2d953bb7d4fbbkenneth_suter#endif
5b3741e0620fd2baaa974cecc2c2d953bb7d4fbbkenneth_suter