1*b30d1939SAndy Fiddaman /***********************************************************************
2*b30d1939SAndy Fiddaman * *
3*b30d1939SAndy Fiddaman * This software is part of the ast package *
4*b30d1939SAndy Fiddaman * Copyright (c) 1985-2011 AT&T Intellectual Property *
5*b30d1939SAndy Fiddaman * and is licensed under the *
6*b30d1939SAndy Fiddaman * Eclipse Public License, Version 1.0 *
7*b30d1939SAndy Fiddaman * by AT&T Intellectual Property *
8*b30d1939SAndy Fiddaman * *
9*b30d1939SAndy Fiddaman * A copy of the License is available at *
10*b30d1939SAndy Fiddaman * http://www.eclipse.org/org/documents/epl-v10.html *
11*b30d1939SAndy Fiddaman * (with md5 checksum b35adb5213ca9657e911e9befb180842) *
12*b30d1939SAndy Fiddaman * *
13*b30d1939SAndy Fiddaman * Information and Software Systems Research *
14*b30d1939SAndy Fiddaman * AT&T Research *
15*b30d1939SAndy Fiddaman * Florham Park NJ *
16*b30d1939SAndy Fiddaman * *
17*b30d1939SAndy Fiddaman * Glenn Fowler <gsf@research.att.com> *
18*b30d1939SAndy Fiddaman * David Korn <dgk@research.att.com> *
19*b30d1939SAndy Fiddaman * Phong Vo <kpv@research.att.com> *
20*b30d1939SAndy Fiddaman * *
21*b30d1939SAndy Fiddaman ***********************************************************************/
22*b30d1939SAndy Fiddaman #pragma prototyped
23*b30d1939SAndy Fiddaman /*
24*b30d1939SAndy Fiddaman * Glenn Fowler
25*b30d1939SAndy Fiddaman * AT&T Research
26*b30d1939SAndy Fiddaman *
27*b30d1939SAndy Fiddaman * time conversion support
28*b30d1939SAndy Fiddaman */
29*b30d1939SAndy Fiddaman
30*b30d1939SAndy Fiddaman #include <ast.h>
31*b30d1939SAndy Fiddaman #include <tm.h>
32*b30d1939SAndy Fiddaman
33*b30d1939SAndy Fiddaman /*
34*b30d1939SAndy Fiddaman * return timezone pointer given name and type
35*b30d1939SAndy Fiddaman *
36*b30d1939SAndy Fiddaman * if type==0 then all time zone types match
37*b30d1939SAndy Fiddaman * otherwise type must be one of tm_info.zone[].type
38*b30d1939SAndy Fiddaman *
39*b30d1939SAndy Fiddaman * if end is non-null then it will point to the next
40*b30d1939SAndy Fiddaman * unmatched char in name
41*b30d1939SAndy Fiddaman *
42*b30d1939SAndy Fiddaman * if dst!=0 then it will point to 0 for standard zones
43*b30d1939SAndy Fiddaman * and the offset for daylight zones
44*b30d1939SAndy Fiddaman *
45*b30d1939SAndy Fiddaman * 0 returned for no match
46*b30d1939SAndy Fiddaman */
47*b30d1939SAndy Fiddaman
48*b30d1939SAndy Fiddaman Tm_zone_t*
tmzone(register const char * name,char ** end,const char * type,int * dst)49*b30d1939SAndy Fiddaman tmzone(register const char* name, char** end, const char* type, int* dst)
50*b30d1939SAndy Fiddaman {
51*b30d1939SAndy Fiddaman register Tm_zone_t* zp;
52*b30d1939SAndy Fiddaman register char* prev;
53*b30d1939SAndy Fiddaman char* e;
54*b30d1939SAndy Fiddaman
55*b30d1939SAndy Fiddaman static Tm_zone_t fixed;
56*b30d1939SAndy Fiddaman static char off[16];
57*b30d1939SAndy Fiddaman
58*b30d1939SAndy Fiddaman tmset(tm_info.zone);
59*b30d1939SAndy Fiddaman if ((*name == '+' || *name == '-') && (fixed.west = tmgoff(name, &e, TM_LOCALZONE)) != TM_LOCALZONE && !*e)
60*b30d1939SAndy Fiddaman {
61*b30d1939SAndy Fiddaman strlcpy(fixed.standard = fixed.daylight = off, name, sizeof(off));
62*b30d1939SAndy Fiddaman if (end)
63*b30d1939SAndy Fiddaman *end = e;
64*b30d1939SAndy Fiddaman if (dst)
65*b30d1939SAndy Fiddaman *dst = 0;
66*b30d1939SAndy Fiddaman return &fixed;
67*b30d1939SAndy Fiddaman }
68*b30d1939SAndy Fiddaman zp = tm_info.local;
69*b30d1939SAndy Fiddaman prev = 0;
70*b30d1939SAndy Fiddaman do
71*b30d1939SAndy Fiddaman {
72*b30d1939SAndy Fiddaman if (zp->type)
73*b30d1939SAndy Fiddaman prev = zp->type;
74*b30d1939SAndy Fiddaman if (!type || type == prev || !prev)
75*b30d1939SAndy Fiddaman {
76*b30d1939SAndy Fiddaman if (tmword(name, end, zp->standard, NiL, 0))
77*b30d1939SAndy Fiddaman {
78*b30d1939SAndy Fiddaman if (dst)
79*b30d1939SAndy Fiddaman *dst = 0;
80*b30d1939SAndy Fiddaman return zp;
81*b30d1939SAndy Fiddaman }
82*b30d1939SAndy Fiddaman if (zp->dst && zp->daylight && tmword(name, end, zp->daylight, NiL, 0))
83*b30d1939SAndy Fiddaman {
84*b30d1939SAndy Fiddaman if (dst)
85*b30d1939SAndy Fiddaman *dst = zp->dst;
86*b30d1939SAndy Fiddaman return zp;
87*b30d1939SAndy Fiddaman }
88*b30d1939SAndy Fiddaman }
89*b30d1939SAndy Fiddaman if (zp == tm_info.local)
90*b30d1939SAndy Fiddaman zp = tm_data.zone;
91*b30d1939SAndy Fiddaman else
92*b30d1939SAndy Fiddaman zp++;
93*b30d1939SAndy Fiddaman } while (zp->standard);
94*b30d1939SAndy Fiddaman return 0;
95*b30d1939SAndy Fiddaman }
96