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