tminit.c revision 3e14f97f673e8a630f076077de35afdd43dc1587
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/***********************************************************************
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* This software is part of the ast package *
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner* Copyright (c) 1985-2010 AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* and is licensed under the *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Common Public License, Version 1.0 *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* by AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* A copy of the License is available at *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Information and Software Systems Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* AT&T Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Florham Park NJ *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Glenn Fowler <gsf@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* David Korn <dgk@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Phong Vo <kpv@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin***********************************************************************/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * Glenn Fowler
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * AT&T Research
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * time conversion support
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# if defined(__DYNAMIC__)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin extern char* tzname[];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * 2007-03-19 move tm_info from _tm_info_ to (*_tm_infop_)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * to allow future Tm_info_t growth
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * by 2009 _tm_info_ can be static
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define extern extern __EXPORT__
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct tm* r;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * return minutes west of GMT for local time clock
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * isdst will point to non-zero if DST is in effect
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * this routine also kicks in the local initialization
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int m;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * convert to GMT assuming local time
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * some systems return 0 for negative time_t
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * tmlocaltime() handles DST and GMT offset
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (n > 1)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (n < -1)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return (h - tp->tm_hour - n * 24) * 60 + m - tp->tm_min;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * stropt() option handler
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintmopt(void* a, const void* p, int n, const char* v)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin tm_info.deformat = (n && (n = strlen(v)) > 0 && (n < 2 || v[n-2] != '%' || v[n-1] != '?')) ? strdup(v) : tm_info.format[TM_DEFAULT];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin tm_info.local->type = (n && *v) ? ((zp = tmtype(v, NiL)) ? zp->type : strdup(v)) : 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * initialize the local timezone
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char* s;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char* e;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * tm_info.local
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * compute local DST offset by roaming
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * through the last 12 months until tzwest() changes
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (i = 0; i < 12; i++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * now get the time zone names
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if ((s = getenv("TZ")) && *s && *s != ':' && (s = strdup(s)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * POSIX style but skipped by tmlocaltime()
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*++s && *++s && *++s)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (s = t; isalpha(*t); t++);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * tm_data.zone table lookup
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (s < e - 1)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *s++ = ' ';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * not in the table
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (s < e - 1)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *s++ = ' ';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * set the options
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin stropt(getenv("TM_OPTIONS"), options, sizeof(*options), tmopt, NiL);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * the time zone type is probably related to the locale
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * tm_info.flags
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * initialize tm data