Annotation of coherent/b/bin/zip/mktime.c, revision 1.1

1.1     ! root        1: /* free mktime function
        !             2:    Copyright 1988, 1989 by David MacKenzie <[email protected]>
        !             3:    and Michael Haertel <[email protected]>
        !             4:    Unlimited distribution permitted provided this copyright notice is
        !             5:    retained and any functional modifications are prominently identified.  */
        !             6: 
        !             7: /* Note: This version of mktime is ignorant of the tzfile; it does not
        !             8:    return correct results during the few hours around when daylight savings
        !             9:    time goes in to or out of effect.  It also does not allow or adjust
        !            10:    for invalid values in any of the fields, contrary to the ANSI C
        !            11:    specification. */
        !            12: 
        !            13: #ifdef MKTIME_MISSING
        !            14: #include <sys/types.h>
        !            15: #include <time.h>
        !            16: 
        !            17: time_t mkgmtime ();
        !            18: 
        !            19: /* Return the equivalent in seconds past 12:00:00 a.m. Jan 1, 1970 GMT
        !            20:    of the local time and date in the exploded time structure `tm',
        !            21:    and set `tm->tm_yday', `tm->tm_wday', and `tm->tm_isdst'.
        !            22:    Return -1 if any of the other fields in `tm' has an invalid value. */
        !            23: 
        !            24: time_t
        !            25: mktime (tm)
        !            26:      struct tm *tm;
        !            27: {
        !            28:   struct tm save_tm;            /* Copy of contents of `*tm'. */
        !            29:   struct tm *ltm;               /* Local time. */
        !            30:   time_t then;                  /* The time to return. */
        !            31: 
        !            32:   then = mkgmtime (tm);
        !            33:   if (then == -1)
        !            34:     return -1;
        !            35: 
        !            36:   /* In case `tm' points to the static area used by localtime,
        !            37:      save its contents and restore them later. */
        !            38:   save_tm = *tm;
        !            39:   /* Correct for the timezone and any daylight savings time.
        !            40:      If a change to or from daylight savings time occurs between when
        !            41:      it is the time in `tm' locally and when it is that time in Greenwich,
        !            42:      the change to or from dst is ignored, but that is a rare case. */
        !            43:   then += then - mkgmtime (localtime (&then));
        !            44: 
        !            45:   ltm = localtime (&then);
        !            46:   save_tm.tm_yday = ltm->tm_yday;
        !            47:   save_tm.tm_wday = ltm->tm_wday;
        !            48:   save_tm.tm_isdst = ltm->tm_isdst;
        !            49:   *tm = save_tm;
        !            50: 
        !            51:   return then;
        !            52: }
        !            53: 
        !            54: /* Nonzero if `y' is a leap year, else zero. */
        !            55: #define leap(y) (((y) % 4 == 0 && (y) % 100 != 0) || (y) % 400 == 0)
        !            56: 
        !            57: /* Number of leap years from 1970 to `y' (not including `y' itself). */
        !            58: #define nleap(y) (((y) - 1969) / 4 - ((y) - 1901) / 100 + ((y) - 1601) / 400)
        !            59: 
        !            60: /* Number of days in each month of the year. */
        !            61: static char monlens[] =
        !            62: {
        !            63:   31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
        !            64: };
        !            65: 
        !            66: /* Return the equivalent in seconds past 12:00:00 a.m. Jan 1, 1970 GMT
        !            67:    of the Greenwich Mean time and date in the exploded time structure `tm',
        !            68:    and set `tm->tm_yday', `tm->tm_wday', and `tm->tm_isdst'.
        !            69:    Return -1 if any of the other fields in `tm' has an invalid value. */
        !            70: 
        !            71: time_t
        !            72: mkgmtime (tm)
        !            73:      struct tm *tm;
        !            74: {
        !            75:   int years, months, days, hours, minutes, seconds;
        !            76: 
        !            77:   years = tm->tm_year + 1900;   /* year - 1900 -> year */
        !            78:   months = tm->tm_mon;          /* 0..11 */
        !            79:   days = tm->tm_mday - 1;       /* 1..31 -> 0..30 */
        !            80:   hours = tm->tm_hour;          /* 0..23 */
        !            81:   minutes = tm->tm_min;         /* 0..59 */
        !            82:   seconds = tm->tm_sec;         /* 0..61 in ANSI C. */
        !            83: 
        !            84:   if (years < 1970
        !            85:       || months < 0 || months > 11
        !            86:       || days < 0
        !            87:       || days > monlens[months] + (months == 1 && leap (years)) - 1
        !            88:       || hours < 0 || hours > 23
        !            89:       || minutes < 0 || minutes > 59
        !            90:       || seconds < 0 || seconds > 61)
        !            91:   return -1;
        !            92: 
        !            93:   /* Set `days' to the number of days into the year. */
        !            94:   if (months > 1 && leap (years))
        !            95:     ++days;
        !            96:   while (months-- > 0)
        !            97:     days += monlens[months];
        !            98:   tm->tm_yday = days;
        !            99: 
        !           100:   /* Now set `days' to the number of days since Jan 1, 1970. */
        !           101:   days += 365 * (years - 1970) + nleap (years);
        !           102:   tm->tm_wday = (days + 4) % 7; /* Jan 1, 1970 was Thursday. */
        !           103:   tm->tm_isdst = 0;
        !           104: 
        !           105:   return 86400 * days + 3600 * hours + 60 * minutes + seconds;
        !           106: }
        !           107: #endif

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.