home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / LIBSRC.ZOO / libsrc / gen / timezone.c < prev    next >
C/C++ Source or Header  |  1992-02-01  |  4KB  |  135 lines

  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)
  35. static 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.  
  45. char *_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.  
  55. static char    czone[TZ_MAX_CHARS];        /* space for zone name */
  56.  
  57. char *
  58. timezone(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.  
  80. static 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.  */
  110. char *
  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. }
  135.