|
|
1.1 root 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 are permitted
6: * provided that the above copyright notice and this paragraph are
7: * duplicated in all such forms and that any documentation,
8: * advertising materials, and other materials related to such
9: * distribution and use acknowledge that the software was developed
10: * by the University of California, Berkeley. The name of the
11: * University may not be used to endorse or promote products derived
12: * from this software without specific prior written permission.
13: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15: * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
16: */
17:
18: #if defined(LIBC_SCCS) && !defined(lint)
19: static char sccsid[] = "@(#)timezone.c 5.8 (Berkeley) 6/27/88";
20: #endif /* LIBC_SCCS and not lint */
21:
22: #include <sys/types.h>
23: #include <sys/time.h>
24: #include <stdio.h>
25: #include <tzfile.h>
26:
27: /*
28: * timezone --
29: * The arguments are the number of minutes of time you are westward
30: * from Greenwich and whether DST is in effect. It returns a string
31: * giving the name of the local timezone. Should be replaced, in the
32: * application code, by a call to localtime.
33: */
34:
35: static char czone[TZ_MAX_CHARS]; /* space for zone name */
36:
37: char *
38: timezone(zone, dst)
39: int zone,
40: dst;
41: {
42: register char *beg,
43: *end;
44: char *getenv(), *index(), *strncpy(), *_tztab();
45:
46: if (beg = getenv("TZNAME")) { /* set in environment */
47: if (end = index(beg, ',')) { /* "PST,PDT" */
48: if (dst)
49: return(++end);
50: *end = '\0';
51: (void)strncpy(czone,beg,sizeof(czone) - 1);
52: czone[sizeof(czone) - 1] = '\0';
53: *end = ',';
54: return(czone);
55: }
56: return(beg);
57: }
58: return(_tztab(zone,dst)); /* default: table or created zone */
59: }
60:
61: static struct zone {
62: int offset;
63: char *stdzone;
64: char *dlzone;
65: } zonetab[] = {
66: -1*60, "MET", "MET DST", /* Middle European */
67: -2*60, "EET", "EET DST", /* Eastern European */
68: 4*60, "AST", "ADT", /* Atlantic */
69: 5*60, "EST", "EDT", /* Eastern */
70: 6*60, "CST", "CDT", /* Central */
71: 7*60, "MST", "MDT", /* Mountain */
72: 8*60, "PST", "PDT", /* Pacific */
73: #ifdef notdef
74: /* there's no way to distinguish this from WET */
75: 0, "GMT", 0, /* Greenwich */
76: #endif
77: 0*60, "WET", "WET DST", /* Western European */
78: -10*60, "EST", "EST", /* Aust: Eastern */
79: -10*60+30, "CST", "CST", /* Aust: Central */
80: -8*60, "WST", 0, /* Aust: Western */
81: -1
82: };
83:
84: /*
85: * _tztab --
86: * check static tables or create a new zone name; broken out so that
87: * we can make a guess as to what the zone is if the standard tables
88: * aren't in place in /etc. DO NOT USE THIS ROUTINE OUTSIDE OF THE
89: * STANDARD LIBRARY.
90: */
91: char *
92: _tztab(zone,dst)
93: register int zone;
94: int dst;
95: {
96: register struct zone *zp;
97: register char sign;
98:
99: for (zp = zonetab; zp->offset != -1;++zp) /* static tables */
100: if (zp->offset == zone) {
101: if (dst && zp->dlzone)
102: return(zp->dlzone);
103: if (!dst && zp->stdzone)
104: return(zp->stdzone);
105: }
106:
107: if (zone < 0) { /* create one */
108: zone = -zone;
109: sign = '+';
110: }
111: else
112: sign = '-';
113: (void)sprintf(czone,"GMT%c%d:%02d",sign,zone / 60,zone % 60);
114: return(czone);
115: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.