xref: /csrg-svn/lib/libc/gen/timezone.c (revision 15096)
1*15096Skarels /* @(#)timezone.c	4.4 (Berkeley) 09/25/83 */
21993Swnj /*
31993Swnj  * The arguments are the number of minutes of time
41993Swnj  * you are westward from Greenwich and whether DST is in effect.
51993Swnj  * It returns a string
61993Swnj  * giving the name of the local timezone.
71993Swnj  *
81993Swnj  * Sorry, I don't know all the names.
91993Swnj  */
101993Swnj 
111993Swnj static struct zone {
121993Swnj 	int	offset;
131993Swnj 	char	*stdzone;
141993Swnj 	char	*dlzone;
151993Swnj } zonetab[] = {
16*15096Skarels 	-1*60, "MET", "MET DST",	/* Middle European */
17*15096Skarels 	-2*60, "EET", "EET DST",	/* Eastern European */
181993Swnj 	4*60, "AST", "ADT",		/* Atlantic */
191993Swnj 	5*60, "EST", "EDT",		/* Eastern */
201993Swnj 	6*60, "CST", "CDT",		/* Central */
211993Swnj 	7*60, "MST", "MDT",		/* Mountain */
221993Swnj 	8*60, "PST", "PDT",		/* Pacific */
2313877Ssam #ifdef notdef
2413877Ssam 	/* there's no way to distinguish this from WET */
251993Swnj 	0, "GMT", 0,			/* Greenwich */
2613877Ssam #endif
2713877Ssam 	0*60, "WET", "WET DST",		/* Western European */
2812974Ssam 	-10*60, "EST", "EST",		/* Aust: Eastern */
2912974Ssam 	-10*60+30, "CST", "CST",	/* Aust: Central */
3012974Ssam 	-8*60, "WST", 0,		/* Aust: Western */
311993Swnj 	-1
321993Swnj };
331993Swnj 
341993Swnj char *timezone(zone, dst)
351993Swnj {
361993Swnj 	register struct zone *zp;
371993Swnj 	static char czone[10];
381993Swnj 	char *sign;
3912974Ssam 	register char *p, *q;
4012974Ssam 	char *getenv(), *index();
411993Swnj 
4212974Ssam 	if (p = getenv("TZNAME")) {
4312974Ssam 		if (q = index(p, ',')) {
4412974Ssam 			if (dst)
4512974Ssam 				return(++q);
4612974Ssam 			else {
4712974Ssam 				*q = '\0';
4812974Ssam 				strncpy(czone, p, sizeof(czone)-1);
4912974Ssam 				czone[sizeof(czone)-1] = '\0';
5012974Ssam 				*q = ',';
5112974Ssam 				return (czone);
5212974Ssam 			}
5312974Ssam 		}
5412974Ssam 		return(p);
5512974Ssam 	}
561993Swnj 	for (zp=zonetab; zp->offset!=-1; zp++)
571993Swnj 		if (zp->offset==zone) {
581993Swnj 			if (dst && zp->dlzone)
591993Swnj 				return(zp->dlzone);
601993Swnj 			if (!dst && zp->stdzone)
611993Swnj 				return(zp->stdzone);
621993Swnj 		}
631993Swnj 	if (zone<0) {
641993Swnj 		zone = -zone;
651993Swnj 		sign = "+";
661993Swnj 	} else
671993Swnj 		sign = "-";
681993Swnj 	sprintf(czone, "GMT%s%d:%02d", sign, zone/60, zone%60);
691993Swnj 	return(czone);
701993Swnj }
71