386BSD 0.1 development
[unix-history] / usr / src / lib / libc / gen / timezone.c
CommitLineData
8168e750
WJ
1/*
2 * Copyright (c) 1987 Regents of the University of California.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. All advertising materials mentioning features or use of this software
14 * must display the following acknowledgement:
15 * This product includes software developed by the University of
16 * California, Berkeley and its contributors.
17 * 4. Neither the name of the University nor the names of its contributors
18 * may be used to endorse or promote products derived from this software
19 * without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 */
33
34#if defined(LIBC_SCCS) && !defined(lint)
35static char sccsid[] = "@(#)timezone.c 5.10 (Berkeley) 2/23/91";
36#endif /* LIBC_SCCS and not lint */
37
38#include <sys/types.h>
39#include <sys/time.h>
40#include <stdio.h>
41#include <stdlib.h>
42#include <string.h>
43#include <tzfile.h>
44
45char *_tztab();
46
47/*
48 * timezone --
49 * The arguments are the number of minutes of time you are westward
50 * from Greenwich and whether DST is in effect. It returns a string
51 * giving the name of the local timezone. Should be replaced, in the
52 * application code, by a call to localtime.
53 */
54
55static char czone[TZ_MAX_CHARS]; /* space for zone name */
56
57char *
58timezone(zone, dst)
59 int zone,
60 dst;
61{
62 register char *beg,
63 *end;
64
65 if (beg = getenv("TZNAME")) { /* set in environment */
66 if (end = index(beg, ',')) { /* "PST,PDT" */
67 if (dst)
68 return(++end);
69 *end = '\0';
70 (void)strncpy(czone,beg,sizeof(czone) - 1);
71 czone[sizeof(czone) - 1] = '\0';
72 *end = ',';
73 return(czone);
74 }
75 return(beg);
76 }
77 return(_tztab(zone,dst)); /* default: table or created zone */
78}
79
80static struct zone {
81 int offset;
82 char *stdzone;
83 char *dlzone;
84} zonetab[] = {
85 -1*60, "MET", "MET DST", /* Middle European */
86 -2*60, "EET", "EET DST", /* Eastern European */
87 4*60, "AST", "ADT", /* Atlantic */
88 5*60, "EST", "EDT", /* Eastern */
89 6*60, "CST", "CDT", /* Central */
90 7*60, "MST", "MDT", /* Mountain */
91 8*60, "PST", "PDT", /* Pacific */
92#ifdef notdef
93 /* there's no way to distinguish this from WET */
94 0, "GMT", 0, /* Greenwich */
95#endif
96 0*60, "WET", "WET DST", /* Western European */
97 -10*60, "EST", "EST", /* Aust: Eastern */
98 -10*60+30, "CST", "CST", /* Aust: Central */
99 -8*60, "WST", 0, /* Aust: Western */
100 -1
101};
102
103/*
104 * _tztab --
105 * check static tables or create a new zone name; broken out so that
106 * we can make a guess as to what the zone is if the standard tables
107 * aren't in place in /etc. DO NOT USE THIS ROUTINE OUTSIDE OF THE
108 * STANDARD LIBRARY.
109 */
110char *
111_tztab(zone,dst)
112 register int zone;
113 int dst;
114{
115 register struct zone *zp;
116 register char sign;
117
118 for (zp = zonetab; zp->offset != -1;++zp) /* static tables */
119 if (zp->offset == zone) {
120 if (dst && zp->dlzone)
121 return(zp->dlzone);
122 if (!dst && zp->stdzone)
123 return(zp->stdzone);
124 }
125
126 if (zone < 0) { /* create one */
127 zone = -zone;
128 sign = '+';
129 }
130 else
131 sign = '-';
132 (void)sprintf(czone,"GMT%c%d:%02d",sign,zone / 60,zone % 60);
133 return(czone);
134}