mktime.c
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:5k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* mktime.c - mktime file for time  */
  2. /* Copyright 1992-1996 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01f,30jul96,dbt  In function mktime, if tm_isdst flag is true substract one 
  7.  hour from timeIs (SPR #6954). 
  8.  Updated copyright.
  9. 01e,25jul96,dbt  fixed warnings in mktime.c.
  10. 01d,24sep93,jmm  _tmValidate() calls _julday() with the tm_mday parameter
  11. 01c,05feb93,jdi  documentation cleanup for 5.1.
  12. 01b,20sep92,smb  documentation additions
  13. 01a,25jul92,smb  written.
  14. */
  15. /*  
  16. DESCRIPTION  
  17.   
  18. INCLUDE FILE: time.h, stdlib.h
  19.    
  20. SEE ALSO: American National Standard X3.159-1989 
  21. NOMANUAL
  22. */
  23. #include "vxWorks.h"
  24. #include "time.h"
  25. #include "stdlib.h"
  26. #include "private/timeP.h"
  27. extern TIMELOCALE *__loctime; /* locale time structure */
  28. /* LOCAL */
  29. LOCAL void __tmNormalize (int *,int *,int);
  30. LOCAL void __tmValidate (struct tm *); 
  31. /*******************************************************************************
  32. *
  33. * mktime - convert broken-down time into calendar time (ANSI)
  34. *
  35. * This routine converts the broken-down time, expressed as local time, in
  36. * the structure pointed to by <timeptr> into a calendar time value with the
  37. * same encoding as that of the values returned by the time() function.  The
  38. * original values of the `tm_wday' and `tm_yday' components of the `tm'
  39. * structure are ignored, and the original values of the other components are
  40. * not restricted to the ranges indicated in time.h.  On successful completion,
  41. * the values of `tm_wday' and `tm_yday' are set appropriately, and the other
  42. * components are set to represent the specified calendar time, but with
  43. * their values forced to the ranges indicated in time.h; the final value of
  44. * `tm_mday' is not set until `tm_mon' and `tm_year' are determined.
  45. *
  46. * INCLUDE FILES: time.h
  47. *
  48. * RETURNS:
  49. * The calendar time in seconds, or ERROR (-1)
  50. * if calendar time cannot be calculated.
  51. */
  52. time_t mktime
  53.     (
  54.     struct tm * timeptr /* pointer to broken-down structure */
  55.     )
  56.     {
  57.     time_t timeIs = 0;
  58.     int    days   = 0;
  59.     char   zoneBuf [sizeof (ZONEBUFFER)];
  60.     /* Validate tm structure */
  61.     __tmValidate (timeptr);
  62.     /* Calulate time_t value */
  63.     /* time */
  64.     timeIs += (timeptr->tm_sec +
  65.            (timeptr->tm_min * SECSPERMIN) +
  66.            (timeptr->tm_hour * SECSPERHOUR));
  67.     /* date */
  68.     days += __julday (timeptr->tm_year, timeptr->tm_mon, timeptr->tm_mday);
  69.     timeptr->tm_yday = (days - 1);
  70.     if ((timeptr->tm_year + TM_YEAR_BASE) < EPOCH_YEAR )
  71.      return ((time_t) ERROR);
  72.     /* days in previous years */
  73.     days = __daysSinceEpoch (timeptr->tm_year - (EPOCH_YEAR - TM_YEAR_BASE),
  74.                   timeptr->tm_yday );
  75.     timeptr->tm_wday = (days + EPOCH_WDAY) % DAYSPERWEEK;
  76.     timeIs += (days * SECSPERDAY);
  77.     /* correct for day light saving */
  78.     /* validate again for the extra DST hour */
  79.     if ((timeptr->tm_isdst = __getDstInfo (timeptr, __loctime)))
  80.      {
  81.      timeIs -= SECSPERHOUR;
  82.      __tmValidate (timeptr);
  83.      }
  84.     /* correct for zone offset from UTC */
  85.     __getZoneInfo (zoneBuf, TIMEOFFSET, __loctime);
  86.     timeIs += (atoi (zoneBuf) * SECSPERMIN);
  87.     return(timeIs);
  88.     }
  89. /*******************************************************************************
  90. *
  91. * __tmValidate - validate the broken-down structure, tmptr.
  92. *
  93. * RETURNS: the validated structure.
  94. * NOMANUAL
  95. */
  96. LOCAL void __tmValidate
  97.     (
  98.     struct tm * tmptr /* pointer to broken-down structure */
  99.     )
  100.     {
  101.     struct tm tmStruct;
  102.     int       jday;
  103.     int       mon;
  104.     /* Adjust timeptr to reflect a legal time
  105.      * Is it within range 1970-2038?
  106.      */
  107.    
  108.     tmStruct = *tmptr;
  109.     __tmNormalize (&tmStruct.tm_min, &tmStruct.tm_sec, SECSPERMIN);
  110.     __tmNormalize (&tmStruct.tm_hour, &tmStruct.tm_min, MINSPERHOUR);
  111.     __tmNormalize (&tmStruct.tm_mday, &tmStruct.tm_hour, HOURSPERDAY);
  112.     __tmNormalize (&tmStruct.tm_year, &tmStruct.tm_mon, MONSPERYEAR);
  113.     /* tm_mday may not be in the correct range - check */
  114.     jday = __julday (tmStruct.tm_year, tmStruct.tm_mon , tmStruct.tm_mday);
  115.     if (jday < 0) 
  116.      {
  117.      tmStruct.tm_year--;
  118.      jday += DAYSPERYEAR;
  119.      }
  120.     /* Calulate month and day */
  121.     for (mon = 0; 
  122.          (jday > __julday (tmStruct.tm_year, mon+1, 0)) && (mon < 11); 
  123.          mon++ )
  124. ;
  125.     tmStruct.tm_mon  = mon;
  126.     tmStruct.tm_mday = jday - __julday (tmStruct.tm_year, mon, 0);
  127.     tmStruct.tm_wday = 0;
  128.     tmStruct.tm_yday = 0;
  129.     *tmptr = tmStruct;
  130.     }
  131. /*******************************************************************************
  132. *
  133. * __tmNormalize - This function is used to reduce units to a range [0,base]
  134. *   tens is used to store the number of times units is divisable
  135. *   by base.
  136. *
  137. *  total = (tens * base) + units
  138. *
  139. * RETURNS: no value
  140. * NOMANUAL
  141. */
  142. LOCAL void __tmNormalize
  143.     (
  144.     int * tens, /* tens */
  145.     int * units, /* units */
  146.     int   base /* base */
  147.     )
  148.     {
  149.     *tens += *units / base;
  150.     *units %= base;
  151.     if ((*units % base ) < 0)
  152.      {
  153.      (*tens)--;
  154.      *units += base;
  155.      }
  156.     }