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

VxWorks

开发平台:

C/C++

  1. /* ansiTime.c - ANSI `time' documentation */
  2. /* Copyright 1992-2001 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01p,05oct01,dcb  Fix SPR 9814, SPR 7736, SPR 62831 and SPR 7191.
  7. 01o,12mar99,p_m  Fixed SPR 8225 by putting asctime output in uppercase.
  8. 01n,11jul97,dgp  doc: SPR 7651 need list of non-reentrant functions
  9. 01m,20jan97,dbt  modified comment for tm_sec (SPR #4436).
  10. 01l,15oct96,dbt  Used reentrant version of ldiv in getTime (fixed SPR #3795).
  11. 01k,04oct96,dbt  reworked the fix for SPR #7277.
  12. 01j,03oct96,dbt  use memcpy with 'strlen + 1' instead of 'strlen' (SPR #7277)
  13. 01i,12aug96,dbt  modified __getTime to treat time_t as an unsigned (SPR #6178).
  14. 01h,30jul96,dbt  In function mktime, if tm_isdst flag is true substract one 
  15.  hour from timeIs (SPR #6954). 
  16.  Updated copyright.
  17. 01g,25jul96,dbt  modified function __jullday (for leap year just test month > 1)
  18.          modified call to jullday in __getTime in order to give it a
  19.          year as found in a tm structure, e.g. "96" (SPR #4251)
  20.  corrected localtime_r (SPR #2521).
  21.                  timeBuffer must be initialized before a call of __getDstInfo.
  22.    corrected __getDstInfo() (spr 2521)
  23.  Updated copyright.
  24. 01h,25jul96,dbt  fixed warnings in mktime.c.
  25. 01g,16feb95,rhp  doc tweaks, and synch with subsidiary files
  26. 01f,15sep94,rhp  fixed TIMEZONE example in comment (related to SPR #3490);
  27.  reduced duplication between man page and comments
  28. 01e,17aug93,dvs  changed TIME to TIMEO to fix conflicting defines (SPR #2249)
  29. 01d,13mar93,jdi  doc tweak.
  30. 01c,05feb93,jdi  doc: clarified TIMEZONE string - SPR 1977;
  31.  clarified that TIMEZONE is environment variable - SPR 1974.
  32. 01b,13nov92,dnw  changed slong_t decls to long
  33. 01a,24oct92,smb  written.
  34. */
  35. /*  
  36. DESCRIPTION  
  37. The header time.h defines two macros and declares four types and several
  38. functions for manipulating time.  Many functions deal with a `calendar time'
  39. that represents the current date (according to the Gregorian calendar)
  40. and time.  Some functions deal with `local time', which is the calendar
  41. time expressed for some specific time zone, and with Daylight Saving Time,
  42. which is a temporary change in the algorithm for determining local time.
  43. The local time zone and Daylight Saving Time are implementation-defined.
  44. .SS Macros
  45. The macros defined are NULL and:
  46. .iP `CLOCKS_PER_SEC' 12
  47. the number of ticks per second.
  48. .LP
  49. .SS Types
  50. The types declared are `size_t' and:
  51. .iP "`clock_t', `time_t'" 12
  52. arithmetic types capable of representing times.
  53. .iP "`struct tm'"
  54. holds the components of a calendar time in what is known as "broken-down time." 
  55. The structure contains at least the following members, in any order.
  56. The semantics of the members and their normal ranges are expressed in the
  57. comments.
  58. .TS
  59. tab(|);
  60. l1p9f3 l1 l.
  61. int tm_sec;   | seconds after the minute | - [0, 59]
  62. int tm_min;   | minutes after the hour   | - [0, 59]
  63. int tm_hour;  | hours after midnight     | - [0, 23]
  64. int tm_mday;  | day of the month         | - [1, 31]
  65. int tm_mon;   | months since January     | - [0, 11]
  66. int tm_year;  | years since 1900
  67. int tm_wday;  | days since Sunday        | - [0, 6]
  68. int tm_yday;  | days since January 1     | - [0, 365] 
  69. int tm_isdst; | Daylight Saving Time flag
  70. .TE
  71. The value of `tm_isdst' is positive if Daylight Saving Time is in effect, zero
  72. if Daylight Saving Time is not in effect, and negative if the information
  73. is not available.
  74. .LP
  75. If the environment variable TIMEZONE is set, the information is retrieved from
  76. this variable, otherwise from the locale information.
  77. TIMEZONE is of the form:
  78. .ft CB
  79.     <name_of_zone>:<(unused)>:<time_in_minutes_from_UTC>:<daylight_start>:<daylight_end>
  80. .ft 1
  81. To calculate local time, the value of <time_in_minutes_from_UTC> is subtracted
  82. from UTC; <time_in_minutes_from_UTC> must be positive.
  83. Daylight information is expressed as mmddhh (month-day-hour), for
  84. example:
  85. .CS
  86.     UTC::0:040102:100102
  87. .CE
  88. REENTRANCY
  89. Where there is a pair of routines, such as div() and div_r(), only the routine
  90. xxx_r() is reentrant.  The xxx() routine is not reentrant.
  91.  
  92. INCLUDE FILES: time.h
  93. SEE ALSO: ansiLocale, American National Standard X3.159-1989 
  94. */
  95. /*
  96. Documentation for the ANSI C time library.
  97. ==========================================
  98.  
  99. Locale Information
  100. ------------------
  101.  
  102. The time locale information is stored in the file __timeloc.c. This
  103. structure consists of
  104.         + The days of the week in abbreviated form
  105.         + The days of the week
  106.         + Months of the year in abbreviated form
  107.         + Months of the year
  108.         + date and time representation for this locale
  109.         + representation for AM.PM
  110.         + Time zone information (discussed below )
  111.         + Day light saving information (discussed below )
  112. If you want to, for example, use the french translation for the days
  113. of the week, then this file could be copied into another file
  114. e.g. __frtimeloc.c and the days and months representation in french. A
  115. full compile is neccessary.  This means that when using strftime or
  116. asctime the days and months will be in French!
  117. Maintaining a table of the possible locale variations would mean large
  118. linked lists of tables and is not appropriate for this system.
  119. Maybe later we can provide a mechanism for replacing this table by a
  120. table defined by the user at system initialisation.
  121. The zone and daylight information may also be set to represent the
  122. local environment.
  123. ZONE & Daylight Saving
  124. ----------------------
  125. The first three fields of TIMEZONE are represented in the locale structure
  126. by the time zone information area and the day light saving area of the
  127. locale structure is of the same form as the last two fields.
  128. The TIMEZONE environment variable can be set by the user to reflect the locale
  129. environment.
  130. SEE ALSO: American National Standard X3.159-1989 
  131. NOMANUAL
  132. INTERNAL
  133. This documentation module is built by appending the following files:
  134.     asctime.c
  135.     clock.c
  136.     ctime.c
  137.     difftime.c
  138.     gmtime.c
  139.     localtime.c
  140.     mktime.c
  141.     strftime.c
  142.     time.c
  143. */
  144. /* asctime.c - asctime file for time.h */
  145. /* Copyright 1992-1993 Wind River Systems, Inc. */
  146. /*
  147. modification history
  148. --------------------
  149. 01c,05feb93,jdi  documentation cleanup for 5.1.
  150. 01b,20sep92,smb  documentation additions
  151. 01a,25jul92,smb  written.
  152. */
  153. /* 
  154. DESCRIPTION 
  155.  
  156. INCLUDE FILE: time.h
  157.   
  158. SEE ALSO: American National Standard X3.159-1989
  159. NOMANUAL
  160. */ 
  161. #include "vxWorks.h"
  162. #include "time.h"
  163. #include "private/timeP.h"
  164. /****************************************************************************
  165. *
  166. * asctime - convert broken-down time into a string (ANSI)
  167. *
  168. * This routine converts the broken-down time pointed to by <timeptr> into a
  169. * string of the form:
  170. * .CS
  171. * SUN SEP 16 01:03:52 1973ene0
  172. * .CE
  173. *
  174. * This routine is not reentrant.  For a reentrant version, see asctime_r().
  175. *
  176. * INCLUDE FILES: time.h
  177. *
  178. * RETURNS: A pointer to the created string.
  179. */
  180. char * asctime
  181.     (
  182.     const struct tm *timeptr /* broken-down time */
  183.     )
  184.     {
  185.     size_t           len = sizeof (ASCBUF);
  186.     static char      asctimeBuf [sizeof (ASCBUF)];
  187.     asctime_r (timeptr, asctimeBuf, &len);
  188.     return (asctimeBuf);
  189.     }
  190. /****************************************************************************
  191. *
  192. * asctime_r - convert broken-down time into a string (POSIX)
  193. *
  194. * This routine converts the broken-down time pointed to by <timeptr> into a
  195. * string of the form:
  196. * .CS
  197. * SUN SEP 16 01:03:52 1973ene0
  198. * .CE
  199. * The string is copied to <asctimeBuf>.
  200. *
  201. * This routine is the POSIX re-entrant version of asctime().
  202. *
  203. * INCLUDE FILES: time.h
  204. *
  205. * RETURNS: The size of the created string.
  206. */
  207. int asctime_r
  208.     (
  209.     const struct tm *timeptr, /* broken-down time */
  210.     char *           asctimeBuf, /* buffer to contain string */
  211.     size_t *         buflen /* size of buffer */
  212.     )
  213.     {
  214.     size_t           size;
  215.     size = strftime (asctimeBuf, 
  216.                    *buflen,
  217.                    "%a %b %d %H:%M:%S %Yn", 
  218.                    timeptr);
  219.     return ((int) size);
  220.     }
  221. /* clock.c - clock file for time.h */
  222. /* Copyright 1992-1993 Wind River Systems, Inc. */
  223. /*
  224. modification history
  225. --------------------
  226. 01d,05oct01,dcb  Fix SPR 9814 and SPR 7736.
  227. 01c,05feb93,jdi  documentation cleanup for 5.1.
  228. 01b,20sep92,smb  documentation additions
  229. 01a,25jul92,smb  written.
  230. */
  231. /*  
  232. DESCRIPTION  
  233.   
  234. INCLUDE FILE: time.h
  235.      
  236. SEE ALSO: American National Standard X3.159-1989 
  237. NOMANUAL
  238. */
  239. #include "vxWorks.h"
  240. #include "time.h"
  241. /******************************************************************************
  242. *
  243. * clock - determine the processor time in use (ANSI)
  244. *
  245. * This routine returns the implementation's best approximation of
  246. * the processor time used by the program since the beginning of an
  247. * implementation-defined era related only to the program invocation.
  248. * To determine the time in seconds, the value returned by clock()
  249. * should be divided by the value of the macro CLOCKS_PER_SEC.  If the
  250. * processor time used is not available or its value cannot be
  251. * represented, clock() returns -1.
  252. *
  253. * NOTE:
  254. * This routine always returns -1 in VxWorks.  VxWorks does not track
  255. * per-task time or system idle time.  There is no method of determining
  256. * how long a task or the entire system has been doing work.  tickGet()
  257. * can be used to query the number of system ticks since system start.
  258. * clock_gettime() can be used to get the current clock time.
  259. *
  260. * INCLUDE FILES: time.h
  261. *
  262. * RETURNS: -1
  263. *
  264. * SEE ALSO: tickGet(), clock_gettime()
  265. */
  266. clock_t clock (void)
  267.     {
  268.     return ((clock_t) -1);
  269.     }
  270. /* ctime.c - ctime file for time */
  271. /* Copyright 1992-1993 Wind River Systems, Inc. */
  272. /*
  273. modification history
  274. --------------------
  275. 01c,05feb93,jdi  documentation cleanup for 5.1.
  276. 01b,20sep92,smb  documentation additions
  277. 01a,25jul92,smb  written.
  278. */
  279. /*  
  280. DESCRIPTION  
  281.   
  282. INCLUDE FILE: time.h
  283.    
  284. SEE ALSO: American National Standard X3.159-1989 
  285. NOMANUAL
  286. */
  287. #include "vxWorks.h"
  288. #include "time.h"
  289. #include "private/timeP.h"
  290. /*******************************************************************************
  291. *
  292. * ctime - convert time in seconds into a string (ANSI)
  293. *
  294. * This routine converts the calendar time pointed to by <timer> into local
  295. * time in the form of a string.  It is equivalent to:
  296. * .CS
  297. *     asctime (localtime (timer));
  298. * .CE
  299. *
  300. * This routine is not reentrant.  For a reentrant version, see ctime_r().
  301. *
  302. * INCLUDE FILES: time.h
  303. *
  304. * RETURNS:
  305. * The pointer returned by asctime() with local broken-down time as the
  306. * argument.
  307. *
  308. * SEE ALSO: asctime(), localtime()
  309. */
  310. char * ctime
  311.     ( 
  312.     const time_t *timer  /* calendar time in seconds */
  313.     )
  314.     {
  315.     size_t len = sizeof (ASCBUF);
  316.     static char asctimeBuf [sizeof (ASCBUF)];
  317.     return (ctime_r (timer, asctimeBuf, &len));
  318.     }
  319. /*******************************************************************************
  320. *
  321. * ctime_r - convert time in seconds into a string (POSIX)
  322. *
  323. * This routine converts the calendar time pointed to by <timer> into local
  324. * time in the form of a string.  It is equivalent to:
  325. * .CS
  326. *     asctime (localtime (timer));
  327. * .CE
  328. *
  329. * This routine is the POSIX re-entrant version of ctime().
  330. *
  331. * INCLUDE FILES: time.h
  332. *
  333. * RETURNS:
  334. * The pointer returned by asctime() with local broken-down time as the
  335. * argument.
  336. *
  337. * SEE ALSO: asctime(), localtime()
  338. */
  339. char * ctime_r
  340.     ( 
  341.     const time_t * timer, /* calendar time in seconds */
  342.     char *         asctimeBuf, /* buffer to contain the string */
  343.     size_t *       buflen /* size of the buffer */
  344.     )
  345.     {
  346.     asctime_r (localtime (timer), asctimeBuf, buflen);
  347.     return (asctimeBuf);
  348.     }
  349. /* difftime.c - difftime file for time */
  350. /* Copyright 1992-1993 Wind River Systems, Inc. */
  351. /*
  352. modification history
  353. --------------------
  354. 01d,04oct01,dcb  Fix SPR 7191.  Cast time1 and time2 before subtracting.
  355. 01c,05feb93,jdi  documentation cleanup for 5.1.
  356. 01b,20sep92,smb  documentation additions
  357. 01a,25jul92,smb  written.
  358. */
  359. /*  
  360. DESCRIPTION  
  361.   
  362. INCLUDE FILE: time.h
  363.    
  364. SEE ALSO: American National Standard X3.159-1989 
  365. NOMANUAL
  366. */
  367. #include "vxWorks.h"
  368. #include "time.h"
  369. /*******************************************************************************
  370. *
  371. * difftime - compute the difference between two calendar times (ANSI)
  372. *
  373. * This routine computes the  difference between two calendar times: 
  374. * <time1> - <time0>.
  375. *
  376. * INCLUDE FILES: time.h
  377. *
  378. * RETURNS: The time difference in seconds, expressed as a double.
  379. */
  380.   
  381. double difftime
  382.     (
  383.     time_t time1, /* later time, in seconds */
  384.     time_t time0 /* earlier time, in seconds */
  385.     )
  386.     {
  387.     /* This function assumes that sizeof(time_t) is <= sizeof(double). */
  388.     
  389.     return (double)time1 - (double)time0;
  390.     }
  391. /* gmtime.c - gmtime file for time */
  392. /* Copyright 1992-1996 Wind River Systems, Inc. */
  393. /*
  394. modification history
  395. --------------------
  396. 01g,15oct96,dbt Used reentrant version of ldiv in getTime (fixed SPR #3795).
  397. 01f,12aug96,dbt modified __getTime to treat time_t as an unsigned (SPR #6178).  
  398. 01e,21jun96,dbt modified function __jullday (for leap year just test month > 1)
  399. modified call to jullday in __getTime in order to give it a 
  400. year as found in a tm structure, e.g. "96" (SPR #4251)
  401. Updated copyright.
  402. 01f,24aug94,ism fixed problem with bus error in time conversion (SPR #3542)
  403. -fixed problem with negative time values
  404. -fixed problem with leap year in negative years (SPR #3576)
  405. 01e,24sep93,jmm  __julday() now checks for february 29th as a leap year 
  406. 01d,05feb93,jdi  documentation cleanup for 5.1.
  407. 01c,13nov92,dnw  changed slong_t decls to long
  408. 01b,20sep92,smb  documentation additions
  409. 01a,25jul92,smb  written.
  410. */
  411. /*  
  412. DESCRIPTION  
  413.   
  414. INCLUDE FILE: time.h, stdlib.h
  415.    
  416. SEE ALSO: American National Standard X3.159-1989 
  417. NOMANUAL
  418. */
  419. #include "vxWorks.h"
  420. #include "time.h"
  421. #include "stdlib.h"
  422. #include "private/timeP.h"
  423. /****************************************************************************
  424. *
  425. * gmtime - convert calendar time into UTC broken-down time (ANSI)
  426. *
  427. * This routine converts the calendar time pointed to by <timer> into
  428. * broken-down time, expressed as Coordinated Universal Time (UTC).
  429. *
  430. * This routine is not reentrant.  For a reentrant version, see gmtime_r().
  431. *
  432. * INCLUDE FILES: time.h
  433. *
  434. * RETURNS:
  435. * A pointer to a broken-down time structure (`tm'), or a null pointer
  436. * if UTC is not available.
  437. */
  438. struct tm *gmtime
  439.     (
  440.     const time_t *timer /* calendar time in seconds */
  441.     )
  442.     {
  443.     static struct tm timeBuffer;
  444.     gmtime_r (timer, &timeBuffer);
  445.     return (&timeBuffer);
  446.     }
  447. /****************************************************************************
  448. *
  449. * gmtime_r - convert calendar time into broken-down time (POSIX)
  450. *
  451. * This routine converts the calendar time pointed to by <timer> into
  452. * broken-down time, expressed as Coordinated Universal Time (UTC).
  453. * The broken-down time is stored in <timeBuffer>.
  454. *
  455. * This routine is the POSIX re-entrant version of gmtime().
  456. *
  457. * INCLUDE FILES: time.h
  458. *
  459. * RETURNS: OK.
  460. */
  461. int gmtime_r
  462.     (
  463.     const time_t *timer, /* calendar time in seconds */
  464.     struct tm *   timeBuffer /* buffer for broken down time */
  465.     )
  466.     {
  467.     return (__getTime (*timer, timeBuffer));
  468.     }
  469. /************************************************************************
  470. *
  471. * __getTime - convert calendar time into broken-down time 
  472. *
  473. * internal routine.
  474. *
  475. * RETURNS: OK
  476. * NOMANUAL
  477. */
  478. int __getTime
  479.     (
  480.     const time_t timer, /* time represented as seconds from epoch */
  481.     struct tm *  tmp /* pointer to broken-down time structure */
  482.     )
  483.     {
  484.     long days;
  485.     long timeOfDay;
  486.     long year;
  487.     long mon;
  488.     ldiv_t result; 
  489.     /* Calulate number of days since epoch */
  490.     days = timer / SECSPERDAY;
  491.     timeOfDay = timer % SECSPERDAY;
  492.     /* If time of day is negative, subtract one day, and add SECSPERDAY
  493.      * to make it positive.
  494.      */
  495.     if(timeOfDay<0)
  496.      {
  497. timeOfDay+=SECSPERDAY;
  498. days-=1;
  499.      }
  500.     /* Calulate number of years since epoch */
  501.     year = days / DAYSPERYEAR;
  502.     while ( __daysSinceEpoch (year, 0) > days )
  503.      year--;
  504.     /* Calulate the day of the week */
  505.     tmp->tm_wday = (days + EPOCH_WDAY) % DAYSPERWEEK;
  506. /*
  507.  * If there is a negative weekday, add DAYSPERWEEK to make it positive
  508.  */
  509. if(tmp->tm_wday<0)
  510. tmp->tm_wday+=DAYSPERWEEK;
  511.     /* Find year and remaining days */
  512.     days -= __daysSinceEpoch (year, 0);
  513.     year += EPOCH_YEAR;
  514.     /* Find month */
  515.     /* __jullday needs years since TM_YEAR_BASE (SPR 4251) */
  516.     for  ( mon = 0; 
  517.          (days >= __julday (year - TM_YEAR_BASE, mon + 1, 0)) && (mon < 11); 
  518.          mon++ )
  519. ;
  520.     /* Initialise tm structure */
  521.     tmp->tm_year = year - TM_YEAR_BASE; /* years since 1900 */
  522.     tmp->tm_mon  = mon;
  523.     tmp->tm_mday = (days - __julday (tmp->tm_year, mon, 0)) + 1;
  524.     tmp->tm_yday = __julday (tmp->tm_year, mon, tmp->tm_mday) - 1;
  525.     tmp->tm_hour = timeOfDay / SECSPERHOUR;
  526.     timeOfDay  %= SECSPERHOUR;
  527.     ldiv_r (timeOfDay, SECSPERMIN, &result);
  528.     tmp->tm_min = result.quot;
  529.     tmp->tm_sec = result.rem;
  530.     return(OK);
  531.     }
  532. /************************************************************************
  533. *
  534. *  daysSinceEpoch - calculate number days since ANSI C epoch                 
  535. *  The (year + 1)/4 term accounts for leap years, the     
  536. *  first of which was 1972 & should be added starting '73 
  537. * RETURNS:
  538. * NOMANUAL
  539. */
  540. int __daysSinceEpoch
  541.     ( 
  542.     int year, /* Years since epoch */
  543.     int yday  /* days since Jan 1  */
  544.     )
  545.     {
  546. if(year>=0) /* 1970 + */
  547.      return ( (365 * year) + (year + 1) / 4  + yday );
  548. else /* 1969 - */
  549.      return ( (365 * year) + (year - 2) / 4  + yday );
  550.     } 
  551. /************************************************************************
  552. *
  553. * julday - calculate Julian Day given year, month, day            
  554. *              Inputs      : year (years since 1900), month (0 - 11), 
  555. *           day (1 - 31)  
  556. *              Comment     : Returns Julian day in range 1:366.  
  557. *      Unix wants 0:365 
  558. * RETURNS: Julian day                                            
  559. * NOMANUAL
  560. */
  561. int __julday
  562.     ( 
  563.     int yr, /* year */
  564.     int mon, /* month */
  565.     int day /* day */
  566.     )
  567.     {
  568.     static jdays[12] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
  569.     int leap = 0;
  570.     if (isleap (yr + TM_YEAR_BASE))
  571. {
  572. /*
  573.  * If it is a leap year, leap only gets set if the day is
  574.  * after beginning of March (SPR #4251).
  575.  */
  576. if (mon > 1)
  577.     leap = 1;
  578. }
  579.     return (jdays [mon] + day + leap );
  580.     }
  581. /* localtime.c - localtime routine for the ANSI time library */
  582. /* Copyright 1992-1996 Wind River Systems, Inc. */
  583. /*
  584. modification history
  585. --------------------
  586. 01d,20jun96,dbt  corrected localtime_r (SPR #2521).
  587.  timeBuffer must be initialized before a call of __getDstInfo.
  588.  Updated copyright.
  589. 01c,05feb93,jdi  documentation cleanup for 5.1.
  590. 01b,20sep92,smb  documentation additions
  591. 01a,25jul92,smb  written.
  592. */
  593. /*  
  594. DESCRIPTION  
  595.   
  596. INCLUDE FILE: time.h, stdlib.h
  597.    
  598. SEE ALSO: American National Standard X3.159-1989 
  599. NOMANUAL
  600. */
  601. #include "vxWorks.h"
  602. #include "time.h"
  603. #include "stdlib.h"
  604. #include "private/timeP.h"
  605. extern TIMELOCALE *__loctime; /* time locale information */
  606. /****************************************************************************
  607. *
  608. * localtime - convert calendar time into broken-down time (ANSI)
  609. *
  610. * This routine converts the calendar time pointed to by <timer> into
  611. * broken-down time, expressed as local time.
  612. *
  613. * This routine is not reentrant.  For a reentrant version, see localtime_r().
  614. *
  615. * INCLUDE FILES: time.h
  616. *
  617. * RETURNS: 
  618. * A pointer to a `tm' structure containing the local broken-down time.
  619. */
  620. struct tm *localtime
  621.     (
  622.     const time_t * timer  /* calendar time in seconds */
  623.     )
  624.     {
  625.     static struct tm timeBuffer;
  626.     localtime_r (timer, &timeBuffer);
  627.     return (&timeBuffer);
  628.     }
  629. /****************************************************************************
  630. *
  631. * localtime_r - convert calendar time into broken-down time (POSIX)
  632. *
  633. * This routine converts the calendar time pointed to by <timer> into
  634. * broken-down time, expressed as local time.  The broken-down time is
  635. * stored in <timeBuffer>.
  636. *
  637. * This routine is the POSIX re-entrant version of localtime().
  638. *
  639. * INCLUDE FILES: time.h
  640. *
  641. * RETURNS: OK.
  642. */
  643. int localtime_r
  644.     (
  645.     const time_t * timer,  /* calendar time in seconds */
  646.     struct tm *    timeBuffer /* buffer for the broken-down time */
  647.     )
  648.     {
  649.     char zoneBuf [sizeof (ZONEBUFFER)];
  650.     int  dstOffset;
  651.     /* First get the zone info */
  652.     __getZoneInfo(zoneBuf, TIMEOFFSET, __loctime);
  653.     /* Generate a broken-down time structure */
  654.     __getTime (*timer - ((atoi (zoneBuf)) * SECSPERMIN), timeBuffer);
  655.     /* is Daylight Saving Time in effect ? */
  656.     dstOffset  = __getDstInfo (timeBuffer,__loctime);
  657.     timeBuffer->tm_isdst = dstOffset;
  658.     /* Correct the broken-down time structure if necessary */
  659.     if (dstOffset)
  660. __getTime ((*timer - ((atoi (zoneBuf)) * SECSPERMIN))
  661. + (dstOffset * SECSPERHOUR), timeBuffer);
  662.     return (OK);                 /* __getTime always returns OK */
  663.     }
  664. /* mktime.c - mktime file for time  */
  665. /* Copyright 1992-1996 Wind River Systems, Inc. */
  666. /*
  667. modification history
  668. --------------------
  669. 01f,30jul96,dbt  In function mktime, if tm_isdst flag is true substract one 
  670.  hour from timeIs (SPR #6954). 
  671.  Updated copyright.
  672. 01e,25jul96,dbt  fixed warnings in mktime.c.
  673. 01d,24sep93,jmm  _tmValidate() calls _julday() with the tm_mday parameter
  674. 01c,05feb93,jdi  documentation cleanup for 5.1.
  675. 01b,20sep92,smb  documentation additions
  676. 01a,25jul92,smb  written.
  677. */
  678. /*  
  679. DESCRIPTION  
  680.   
  681. INCLUDE FILE: time.h, stdlib.h
  682.    
  683. SEE ALSO: American National Standard X3.159-1989 
  684. NOMANUAL
  685. */
  686. #include "vxWorks.h"
  687. #include "time.h"
  688. #include "stdlib.h"
  689. #include "private/timeP.h"
  690. extern TIMELOCALE *__loctime; /* locale time structure */
  691. /* LOCAL */
  692. LOCAL void __tmNormalize (int *,int *,int);
  693. LOCAL void __tmValidate (struct tm *); 
  694. /*******************************************************************************
  695. *
  696. * mktime - convert broken-down time into calendar time (ANSI)
  697. *
  698. * This routine converts the broken-down time, expressed as local time, in
  699. * the structure pointed to by <timeptr> into a calendar time value with the
  700. * same encoding as that of the values returned by the time() function.  The
  701. * original values of the `tm_wday' and `tm_yday' components of the `tm'
  702. * structure are ignored, and the original values of the other components are
  703. * not restricted to the ranges indicated in time.h.  On successful completion,
  704. * the values of `tm_wday' and `tm_yday' are set appropriately, and the other
  705. * components are set to represent the specified calendar time, but with
  706. * their values forced to the ranges indicated in time.h; the final value of
  707. * `tm_mday' is not set until `tm_mon' and `tm_year' are determined.
  708. *
  709. * INCLUDE FILES: time.h
  710. *
  711. * RETURNS:
  712. * The calendar time in seconds, or ERROR (-1)
  713. * if calendar time cannot be calculated.
  714. */
  715. time_t mktime
  716.     (
  717.     struct tm * timeptr /* pointer to broken-down structure */
  718.     )
  719.     {
  720.     time_t timeIs = 0;
  721.     int    days   = 0;
  722.     char   zoneBuf [sizeof (ZONEBUFFER)];
  723.     /* Validate tm structure */
  724.     __tmValidate (timeptr);
  725.     /* Calulate time_t value */
  726.     /* time */
  727.     timeIs += (timeptr->tm_sec +
  728.            (timeptr->tm_min * SECSPERMIN) +
  729.            (timeptr->tm_hour * SECSPERHOUR));
  730.     /* date */
  731.     days += __julday (timeptr->tm_year, timeptr->tm_mon, timeptr->tm_mday);
  732.     timeptr->tm_yday = (days - 1);
  733.     if ((timeptr->tm_year + TM_YEAR_BASE) < EPOCH_YEAR )
  734.      return ((time_t) ERROR);
  735.     /* days in previous years */
  736.     days = __daysSinceEpoch (timeptr->tm_year - (EPOCH_YEAR - TM_YEAR_BASE),
  737.                   timeptr->tm_yday );
  738.     timeptr->tm_wday = (days + EPOCH_WDAY) % DAYSPERWEEK;
  739.     timeIs += (days * SECSPERDAY);
  740.     /* correct for day light saving */
  741.     /* validate again for the extra DST hour */
  742.     if ((timeptr->tm_isdst = __getDstInfo (timeptr, __loctime)))
  743.      {
  744.      timeIs -= SECSPERHOUR;
  745.      __tmValidate (timeptr);
  746.      }
  747.     /* correct for zone offset from UTC */
  748.     __getZoneInfo (zoneBuf, TIMEOFFSET, __loctime);
  749.     timeIs += (atoi (zoneBuf) * SECSPERMIN);
  750.     return(timeIs);
  751.     }
  752. /*******************************************************************************
  753. *
  754. * __tmValidate - validate the broken-down structure, tmptr.
  755. *
  756. * RETURNS: the validated structure.
  757. * NOMANUAL
  758. */
  759. LOCAL void __tmValidate
  760.     (
  761.     struct tm * tmptr /* pointer to broken-down structure */
  762.     )
  763.     {
  764.     struct tm tmStruct;
  765.     int       jday;
  766.     int       mon;
  767.     /* Adjust timeptr to reflect a legal time
  768.      * Is it within range 1970-2038?
  769.      */
  770.    
  771.     tmStruct = *tmptr;
  772.     __tmNormalize (&tmStruct.tm_min, &tmStruct.tm_sec, SECSPERMIN);
  773.     __tmNormalize (&tmStruct.tm_hour, &tmStruct.tm_min, MINSPERHOUR);
  774.     __tmNormalize (&tmStruct.tm_mday, &tmStruct.tm_hour, HOURSPERDAY);
  775.     __tmNormalize (&tmStruct.tm_year, &tmStruct.tm_mon, MONSPERYEAR);
  776.     /* tm_mday may not be in the correct range - check */
  777.     jday = __julday (tmStruct.tm_year, tmStruct.tm_mon , tmStruct.tm_mday);
  778.     if (jday < 0) 
  779.      {
  780.      tmStruct.tm_year--;
  781.      jday += DAYSPERYEAR;
  782.      }
  783.     /* Calulate month and day */
  784.     for (mon = 0; 
  785.          (jday > __julday (tmStruct.tm_year, mon+1, 0)) && (mon < 11); 
  786.          mon++ )
  787. ;
  788.     tmStruct.tm_mon  = mon;
  789.     tmStruct.tm_mday = jday - __julday (tmStruct.tm_year, mon, 0);
  790.     tmStruct.tm_wday = 0;
  791.     tmStruct.tm_yday = 0;
  792.     *tmptr = tmStruct;
  793.     }
  794. /*******************************************************************************
  795. *
  796. * __tmNormalize - This function is used to reduce units to a range [0,base]
  797. *   tens is used to store the number of times units is divisable
  798. *   by base.
  799. *
  800. *  total = (tens * base) + units
  801. *
  802. * RETURNS: no value
  803. * NOMANUAL
  804. */
  805. LOCAL void __tmNormalize
  806.     (
  807.     int * tens, /* tens */
  808.     int * units, /* units */
  809.     int   base /* base */
  810.     )
  811.     {
  812.     *tens += *units / base;
  813.     *units %= base;
  814.     if ((*units % base ) < 0)
  815.      {
  816.      (*tens)--;
  817.      *units += base;
  818.      }
  819.     }
  820. /* strftime.c - strftime file for time  */
  821. /* Copyright 1991-1996 Wind River Systems, Inc. */
  822. /*
  823. modification history
  824. --------------------
  825. 01i,20jan97,dbt  modified comment concerning seconds (SPR #4436).
  826. 01h,04oct96,dbt  reworked the fix for SPR #7277.
  827. 01g,03oct96,dbt  use memcpy with 'strlen + 1' instead of 'strlen' (SPR #7277)
  828. 01f,27jun96,dbt  corrected __getDstInfo() (spr 2521)
  829.    Updated copyright.
  830. 01g,10feb95,rhp  internal doc tweak from ansiTime.c
  831. 01f,15sep94,rhp  fixed TIMEZONE example in comment (related to SPR #3490)
  832. 01e,17aug93,dvs  changed TIME to TIMEO to fix conflicting defines (SPR #2249)
  833. 01d,05feb93,jdi  documentation cleanup for 5.1.
  834. 01c,20sep92,smb  documentation additions
  835. 01b,26jul92,rrr  fixed decl of __weekOfYear to compile on mips.
  836. 01a,25jul92,smb  written.
  837. */
  838. /*  
  839. DESCRIPTION  
  840.   
  841. INCLUDE FILE: time.h, stdlib.h, string.h, locale.h
  842.    
  843. SEE ALSO: American National Standard X3.159-1989 
  844. NOMANUAL
  845. */
  846. #include "vxWorks.h"
  847. #include "string.h"
  848. #include "stdlib.h"
  849. #include "locale.h"
  850. #include "private/timeP.h"
  851. extern TIMELOCALE * __loctime; /* time locale information */
  852. /* LOCAL */
  853. LOCAL size_t strftime_r (char *, size_t, const char *,
  854.  const struct tm *, TIMELOCALE *);
  855. LOCAL void   __generateTime (char *, const struct tm *,
  856.              TIMELOCALE *, int *, const char *);
  857. LOCAL void   __getDay (char *, int, int, TIMELOCALE *, int *);
  858. LOCAL void   __getMonth (char *, int, int, TIMELOCALE *, int *);
  859. LOCAL void   __getLocale (char *, int, const struct tm *, TIMELOCALE *, int *);
  860. LOCAL void   __intToStr (char *, int, int);
  861. LOCAL int    __weekOfYear (int, int, int);
  862. /*******************************************************************************
  863. *
  864. * strftime - convert broken-down time into a formatted string (ANSI)
  865. *
  866. * This routine formats the broken-down time in <tptr> based on the conversion
  867. * specified in the string <format>, and places the result in the string <s>.
  868. *
  869. * The format is a multibyte character sequence, beginning and ending in its
  870. * initial state.  The <format> string consists of zero or more conversion
  871. * specifiers and ordinary multibyte characters.  A conversion specifier
  872. * consists of a % character followed by a character that determines the
  873. * behavior of the conversion.  All ordinary multibyte characters (including
  874. * the terminating NULL character) are copied unchanged to the array.  If
  875. * copying takes place between objects that overlap, the behavior is
  876. * undefined.  No more than <n> characters are placed into the array.
  877. *
  878. * Each conversion specifier is replaced by appropriate characters as 
  879. * described in the following list.  The appropriate characters are determined 
  880. * by the LC_TIME category of the current locale and by the values contained 
  881. * in the structure pointed to by <tptr>.
  882. *
  883. * .iP %a
  884. * the locale's abbreviated weekday name.
  885. * .iP %A
  886. * the locale's full weekday name.
  887. * .iP %b
  888. * the locale's abbreviated month name.
  889. * .iP %B
  890. * the locale's full month name.
  891. * .iP %c
  892. * the locale's appropriate date and time representation.
  893. * .iP %d
  894. * the day of the month as decimal number (01-31).
  895. * .iP %H
  896. * the hour (24-hour clock) as a decimal number (00-23).
  897. * .iP %I
  898. * the hour (12-hour clock) as a decimal number (01-12).
  899. * .iP %j
  900. * the day of the year as decimal number (001-366).
  901. * .iP %m
  902. * the month as a decimal number (01-12).
  903. * .iP %M
  904. * the minute as a decimal number (00-59).
  905. * .iP %P
  906. * the locale's equivalent of the AM/PM 
  907. * designations associated with a 12-hour clock.
  908. * .iP %S
  909. * the second as a decimal number (00-59).
  910. * .iP %U
  911. * the week number of the year (first Sunday
  912. * as the first day of week 1) as a decimal number (00-53).
  913. * .iP %w
  914. * the weekday as a decimal number (0-6), where Sunday is 0.
  915. * .iP %W
  916. * the week number of the year (the first Monday
  917. * as the first day of week 1) as a decimal number (00-53).
  918. * .iP %x
  919. * the locale's appropriate date representation.
  920. * .iP %X
  921. * the locale's appropriate time representation.
  922. * .iP %y
  923. * the year without century as a decimal number (00-99).
  924. * .iP %Y
  925. * the year with century as a decimal number.
  926. * .iP %Z
  927. * the time zone name or abbreviation, or by no
  928. * characters if no time zone is determinable.
  929. * .iP %%
  930. * %.
  931. * .LP
  932. *
  933. * For any other conversion specifier, the behavior is undefined.
  934. *
  935. * INCLUDE FILES: time.h
  936. *
  937. * RETURNS:
  938. * The number of characters in <s>, not including the terminating null
  939. * character -- or zero if the number of characters in <s>, including the null
  940. * character, is more than <n> (in which case the contents of <s> are
  941. * indeterminate).
  942. */
  943. size_t strftime
  944.     (
  945.     char *            s, /* string array */
  946.     size_t            n, /* maximum size of array */
  947.     const char *      format, /* format of output string */
  948.     const struct tm * tptr /* broken-down time */
  949.     )
  950.     {
  951.     return (strftime_r (s, n, format, tptr, __loctime));
  952.     }
  953. /*******************************************************************************
  954. *
  955. * strftime_r - format time into a string (POSIX)
  956. *
  957. * Re-entrant version of strftime().
  958. *
  959. * RETURNS:
  960. */
  961. LOCAL size_t strftime_r
  962.     (
  963.     char *            bufHd, /* string array */
  964.     size_t            bufMaxSz, /* maximum size of array */
  965.     const char *      fmtHd, /* format of output string */
  966.     const struct tm * tmptr,  /* broken-down time */
  967.     TIMELOCALE *      timeInfo /* locale information */
  968.     )
  969.     {
  970.     const char *      fmt = fmtHd;
  971.     char *            buffer = bufHd;
  972.     char              addOn[MaxBufferSize];
  973.     int               bufLen = 0;
  974.     int               bufszNow = 0;
  975.     
  976.     FOREVER
  977.         {
  978.         while ((*fmt != '%') && (bufszNow != bufMaxSz) && (*fmt != EOS))
  979.     {
  980.          bufszNow++; 
  981.     *buffer++ = *fmt++;
  982.     }
  983.         if (bufszNow == bufMaxSz) 
  984.     break;
  985.         if (*fmt++ != EOS)
  986.     {
  987.     __generateTime (addOn, tmptr, timeInfo, &bufLen, fmt);
  988.     if (bufLen >= 0)
  989.         {
  990.         if (bufMaxSz > (bufszNow + bufLen))
  991.             {
  992.             memcpy (buffer, addOn, bufLen);
  993.       bufszNow += bufLen;
  994.     buffer += bufLen;
  995.     fmt++;
  996.     } /* endif */
  997.         else 
  998.     {
  999.     memcpy (buffer, addOn, bufMaxSz - bufszNow);
  1000.     buffer += (bufMaxSz - bufszNow);
  1001.     bufszNow = bufMaxSz;
  1002.     break;
  1003.     }
  1004. }
  1005.     else 
  1006.         { /* process format strings */
  1007. *(addOn + abs (bufLen)) = EOS; 
  1008. /* This is recursive - but should recurse ONCE only */
  1009.         bufLen = (int) strftime_r (buffer, 
  1010.    bufMaxSz - bufszNow, 
  1011.    addOn, 
  1012.    tmptr, 
  1013.    timeInfo);
  1014.         buffer += bufLen;
  1015.         bufszNow += bufLen;
  1016.         fmt++;
  1017.         } /* endif */
  1018.      }
  1019.  else break;
  1020.          } /* end forever */
  1021.     *buffer = EOS;
  1022.     return (bufszNow);
  1023.     }
  1024. /*******************************************************************************
  1025. *
  1026. * __generateTime - generate a string representing the format indicator.
  1027. *
  1028. * Internal routine
  1029. *
  1030. * RETURNS:
  1031. * NOMANUAL
  1032. */
  1033. LOCAL void __generateTime
  1034.     (
  1035.     char *            addOn, /* string buffer */
  1036.     const struct tm * tmptr,  /* broken-down time */
  1037.     TIMELOCALE *      timeInfo, /* locale information */
  1038.     int *             pnum, /* position number for strftime string */
  1039.     const char *      fmt /* format to be decoded */
  1040.     )
  1041.     {
  1042.     switch (*fmt) 
  1043.      {
  1044.         case 'a': /* day */
  1045.          __getDay (addOn, tmptr->tm_wday, ABBR, timeInfo, pnum); 
  1046.          break;
  1047.         case 'A': /* day */
  1048.          __getDay (addOn, tmptr->tm_wday, FULL, timeInfo, pnum); 
  1049.          break;
  1050.         case 'b': /* month */
  1051.          __getMonth (addOn, tmptr->tm_mon, ABBR, timeInfo, pnum); 
  1052.          break;
  1053.         case 'B': /* month */
  1054.          __getMonth (addOn, tmptr->tm_mon, FULL, timeInfo, pnum);
  1055.          break;
  1056.         case 'c':  /* date and time */
  1057.          __getLocale (addOn, DATETIME, tmptr, timeInfo, pnum);
  1058.          *pnum = -*pnum;
  1059.          break;
  1060.         case 'd':  /* day of month */
  1061.          __intToStr (addOn, tmptr->tm_mday, *pnum = 2); 
  1062.          break;
  1063.         case 'H': /* hour */
  1064.          __intToStr (addOn, tmptr->tm_hour, *pnum = 2); 
  1065.          break;
  1066.         case 'I': /* hour */
  1067.          __intToStr (addOn, tmptr->tm_hour % 12, *pnum = 2); 
  1068.          break;
  1069.         case 'j': /* day of year */
  1070.          __intToStr (addOn, tmptr->tm_yday + 1, *pnum = 3); 
  1071.          break;
  1072.         case 'm': /* month */
  1073.          __intToStr (addOn, tmptr->tm_mon + 1, *pnum = 2); 
  1074.          break;
  1075.         case 'M': /* minute */
  1076.          __intToStr (addOn, tmptr->tm_min, *pnum = 2); 
  1077.          break;
  1078.         case 'p': /* AP/PM */
  1079.          __getLocale (addOn, AMPM, tmptr, timeInfo, pnum);
  1080.          break;
  1081.         case 'S': /* second */
  1082.          __intToStr (addOn, tmptr->tm_sec, *pnum = 2); 
  1083.             break;
  1084.         case 'U': /* week number */
  1085.             __intToStr (addOn, 
  1086. __weekOfYear(TM_SUNDAY, tmptr->tm_wday, tmptr->tm_yday),
  1087. *pnum = 2);
  1088.          break;
  1089.         case 'w': /* weekday */
  1090.          __intToStr (addOn, tmptr->tm_wday, *pnum = 1); 
  1091.          break;
  1092.         case 'W': /* week number */
  1093.          __intToStr (addOn, 
  1094.              __weekOfYear(TM_MONDAY, tmptr->tm_wday, tmptr->tm_yday),
  1095.                       *pnum = 2);
  1096.          break;
  1097.         case 'x': /* date */
  1098.          __getLocale (addOn, DATE, tmptr, timeInfo, pnum);
  1099.          *pnum = -*pnum;
  1100.          break;
  1101.         case 'X': /* time */
  1102.          __getLocale (addOn, TIMEO, tmptr, timeInfo, pnum);
  1103.             *pnum = -*pnum;
  1104.          break;
  1105.         case 'y': /* year */
  1106.          __intToStr (addOn, (tmptr->tm_year % CENTURY), *pnum = 2);
  1107.          break;
  1108.         case 'Y': /* year */
  1109.          __intToStr (addOn, (tmptr->tm_year + TM_YEAR_BASE), *pnum = 4);
  1110.          break;
  1111.         case 'Z': /* zone */
  1112.          __getLocale (addOn, ZONE, tmptr, timeInfo, pnum);
  1113.          break;
  1114.         case '%': /* % */
  1115.          memcpy (addOn, CHAR_FROM_CONST ("%"), 1); 
  1116.     *pnum = 1; 
  1117.          break;
  1118.         default:
  1119.          *pnum = 0;
  1120.          break;
  1121.      }
  1122.     }
  1123. /*******************************************************************************
  1124. *
  1125. * __weekOfYear - calulate week of year given julian day and week day.
  1126. *
  1127. * Internal routine
  1128. * The <start> determins whether the week starts on Sunday or Monday.
  1129. *
  1130. * RETURNS: week of year 
  1131. * NOMANUAL
  1132. */
  1133. LOCAL int __weekOfYear
  1134.     (
  1135.     int start,  /* either TM_SUNDAY or TM_MONDAY */
  1136.     int wday,   /* days since sunday */
  1137.     int yday    /* days since Jan 1 */
  1138.     )
  1139.     {
  1140.     wday = (wday - start + DAYSPERWEEK) % DAYSPERWEEK;
  1141.     return ((yday - wday + 12) / DAYSPERWEEK - 1);
  1142.     }
  1143. /*******************************************************************************
  1144. *
  1145. * __getLocale - determine locale information given an indicator or the
  1146. *    type of information needed.
  1147. *
  1148. * Internal routine
  1149. *
  1150. * RETURNS: void
  1151. * NOMANUAL
  1152. */
  1153. LOCAL void __getLocale
  1154.     (
  1155.     char *       buffer, /* buffer for the string */
  1156.     int               desc,  /* descriptor */
  1157.     const struct tm * tmptr,  /* broken-down time */
  1158.     TIMELOCALE *      timeInfo, /* locale information */
  1159.     int *             size /* size of array returned */
  1160.     )
  1161.     {
  1162.     char *       p = NULL;
  1163.     char        zoneBuf [sizeof (ZONEBUFFER)];
  1164.     switch(desc)
  1165.      {
  1166.         case DATETIME:
  1167.          p = timeInfo->_Format [DATETIME]; 
  1168.             break;
  1169.         case DATE:
  1170.          p = timeInfo->_Format [DATE]; 
  1171.             break;
  1172.         case TIMEO:
  1173.          p = timeInfo->_Format [TIMEO]; 
  1174.             break;
  1175.         case AMPM:
  1176.          p = timeInfo->_Ampm [(tmptr->tm_hour <= 12) ? 0 : 1];
  1177.             break;
  1178.         case ZONE:
  1179.          (void) __getZoneInfo (zoneBuf, NAME, timeInfo);
  1180.     p = zoneBuf;
  1181.             break;
  1182.      }
  1183.     *size = strlen (p);
  1184.     strcpy(buffer, p);
  1185.     }
  1186. /*******************************************************************************
  1187. *
  1188. * __intToStr - convert an integer into a string of <sz> size with leading 
  1189. *   zeroes if neccessary.
  1190. *
  1191. * Internal routine
  1192. *
  1193. * RETURNS: void
  1194. * NOMANUAL
  1195. */
  1196. LOCAL void __intToStr
  1197.     (
  1198.     char * buffer, /* buffer for return string */
  1199.     int    number, /* the number to be converted */
  1200.     int    size /* size of the string, maximum length of 4 */
  1201.     )
  1202.     {
  1203.     if (number < 0) 
  1204. number = 0;
  1205.     for (buffer += size; 0 <= --size; number /= 10)
  1206. {
  1207. *--buffer = number % 10 + '0';
  1208. }
  1209.     }
  1210. /*******************************************************************************
  1211. *
  1212. * __getDay - determine the locale representation of the day of the week
  1213. *
  1214. * RETURNS: void
  1215. * NOMANUAL
  1216. */
  1217. LOCAL void __getDay
  1218.     (
  1219.     char *       buffer, /* buffer for return string */
  1220.     int          index,  /* integer representation of day of the week */
  1221.     int          abbr, /* abbrievation or full spelling */
  1222.     TIMELOCALE * timeInfo, /* locale information */
  1223.     int *        size /* size of the string returned */
  1224.     )
  1225.     {
  1226.     char *       dayStr;
  1227.     index += (abbr == ABBR) ? 0 : DAYSPERWEEK;
  1228.     *size = strlen (dayStr = timeInfo->_Days [index]);
  1229.     strcpy (buffer, dayStr);
  1230.     }
  1231. /*******************************************************************************
  1232. *
  1233. * __getMonth - determine the locale representation of the month of the year 
  1234. *
  1235. * RETURNS: void
  1236. * NOMANUAL
  1237. */
  1238. LOCAL void __getMonth
  1239.     (
  1240.     char *       buffer, /* buffer for return string */
  1241.     int          index,  /* integer representation of month of year */
  1242.     int          abbr, /* abbrievation or full spelling */
  1243.     TIMELOCALE * timeInfo, /* locale information */
  1244.     int *        size /* size of the string returned */
  1245.     )
  1246.     {
  1247.     char *       monStr;
  1248.     index += (abbr == ABBR) ? 0 : MONSPERYEAR;
  1249.     *size = strlen (monStr = timeInfo->_Months [index]);
  1250.     strcpy (buffer, monStr);
  1251.     }
  1252. /******************************************************************************
  1253. *
  1254. *  __getDstInfo - determins whether day light savings is in effect.
  1255. *
  1256. * TIMEZONE is of the form 
  1257. *     <name of zone>::<time in minutes from UTC>:<daylight start>:<daylight end>
  1258. *
  1259. * daylight information is expressed as mmddhh ie. month:day:hour
  1260. *
  1261. * e.g. UTC::0:040102:100102
  1262. *
  1263. * RETURNS: FALSE if not on, TRUE otherwise.
  1264. * NOMANUAL
  1265. */
  1266. int __getDstInfo
  1267.     (
  1268.     struct tm *  timeNow, 
  1269.     TIMELOCALE * timeInfo
  1270.     )
  1271.     {
  1272.     char *       start = NULL;
  1273.     char *       end = NULL;
  1274.     char *       dummy = NULL;
  1275.     char *       envInfo = NULL;
  1276.     char *       last = "";
  1277.     int          monStart = 0;
  1278.     int          monEnd   = 0;
  1279.     int          dayStart = 0;
  1280.     int          dayEnd   = 0;
  1281.     int          hrStart  = 0;
  1282.     int          hrEnd    = 0;
  1283.     char         numstr [2];
  1284.     char         buffer [sizeof (ZONEBUFFER)];
  1285.     /* Is daylight saving in effect? '0' NO; '>0' YES; '<0' don't know */
  1286.     /* commented out (SPR #2521)
  1287.     if (timeNow->tm_isdst != -1) 
  1288.         return (FALSE);
  1289.     */
  1290.     /* Is dst information stored in environmental variables */
  1291.     if ((envInfo = getenv("TIMEZONE")) != NULL) 
  1292.      {
  1293. strcpy (buffer, envInfo);
  1294.      dummy = strtok_r (buffer, ":", &last);  /* next */
  1295.      dummy = strtok_r (NULL, ":", &last);    /* next */
  1296.      /* commented out (SPR #2521) */
  1297. /*      dummy = strtok_r (NULL, ":", &last);    /@ next */
  1298.      start = strtok_r (NULL, ":", &last);  /* start time */
  1299.      end = strtok_r (NULL, ":", &last);    /* end time */
  1300.      }
  1301.     else
  1302.      {
  1303.      /* Is dst information stored in the locale tables */
  1304.      start = timeInfo->_Isdst[DSTON];
  1305.      end = timeInfo->_Isdst[DSTOFF];
  1306.      if ((strcmp (start,"") == 0) || (strcmp (end,"") == 0))
  1307.          return (FALSE);
  1308.      }
  1309.     if ((start == NULL) || (end == NULL)) 
  1310.         return (FALSE);
  1311.     /* analyze the dst information of the form 'mmddhh' */
  1312.     monStart = (atoi (strncpy (numstr, start, 2))) - 1;        /*start month */
  1313.     monEnd = atoi (strncpy (numstr, end, 2)) - 1;            /* end month */
  1314.     if ((timeNow->tm_mon < monStart) || (timeNow->tm_mon > monEnd)) 
  1315.      return (FALSE);
  1316.     if ((timeNow->tm_mon == monStart) || (timeNow->tm_mon == monEnd))
  1317.      {
  1318.      dayStart = atoi (strncpy (numstr, start+2, 2));  /* start day */
  1319.      dayEnd = atoi (strncpy (numstr, end+2, 2));      /* end day */
  1320.      if (((timeNow->tm_mon == monStart) && (timeNow->tm_mday < dayStart)) || 
  1321.          ((timeNow->tm_mon == monEnd) && (timeNow->tm_mday > dayEnd))) 
  1322.          return (FALSE);
  1323.      if (((timeNow->tm_mon == monStart) && (timeNow->tm_mday == dayStart)) ||
  1324.          ((timeNow->tm_mon == monEnd) && (timeNow->tm_mday == dayEnd))) 
  1325.          {
  1326.          hrStart = atoi (strncpy (numstr, start+4, 2));  /* hour */
  1327.          hrEnd = atoi (strncpy (numstr, end+4, 2));      /* hour */
  1328.          return ((((timeNow->tm_mon==monStart) &&
  1329.           (timeNow->tm_mday==dayStart) &&
  1330.           (timeNow->tm_hour < hrStart)) ||
  1331.          ((timeNow->tm_mon == monEnd) &&
  1332.           (timeNow->tm_mday==dayEnd) &&
  1333.           (timeNow->tm_hour > hrEnd)))
  1334.         ? FALSE : TRUE);
  1335.          }
  1336.      }
  1337.     return (TRUE);
  1338.     }
  1339. /******************************************************************************
  1340. *
  1341. *  __getZoneInfo - determins in minutes the time difference from UTC.
  1342. *
  1343. * If the environment variable TIMEZONE is set then the information is
  1344. * retrieved from this variable, otherwise from the locale information.
  1345. *
  1346. * RETURNS: time in minutes from UTC.
  1347. * NOMANUAL
  1348. */
  1349. void __getZoneInfo
  1350.     (
  1351.     char *       buffer,
  1352.     int          option,  /* determine which part of zone information */
  1353.     TIMELOCALE * timeInfo /* locale information */
  1354.     )
  1355.     {
  1356.     char *       envInfo;
  1357.     char *       limitStartPtr;
  1358.     char *       limitEndPtr;
  1359.     /* Time zone information from the environment variable */
  1360.     envInfo = getenv ("TIMEZONE");
  1361.      if ((envInfo != NULL) && (strcmp (envInfo, "") != 0)) 
  1362.      {
  1363. limitEndPtr = strpbrk (envInfo, ":");
  1364. if (option == NAME)
  1365.     {
  1366.     strcpy (buffer, envInfo);
  1367.     *(buffer + (limitEndPtr - envInfo)) = EOS;
  1368.     return;
  1369.     }
  1370. limitStartPtr = limitEndPtr + 1;
  1371. limitEndPtr = strpbrk (limitStartPtr, ":"); 
  1372. if (option == NAME2)
  1373.     {
  1374.     strcpy (buffer, limitStartPtr);
  1375.     *(buffer + (limitEndPtr - limitStartPtr)) = EOS;
  1376.     return;
  1377.     }
  1378. limitStartPtr = limitEndPtr + 1;
  1379. limitEndPtr = strpbrk (limitStartPtr, ":"); 
  1380. if (option == TIMEOFFSET)
  1381.     {
  1382.     strcpy (buffer, limitStartPtr);
  1383.     if (limitEndPtr != NULL)
  1384.         *(buffer + (limitEndPtr - limitStartPtr)) = EOS;
  1385.     return;
  1386.     }
  1387.      }
  1388.     else
  1389. {
  1390.         /* Time zone information from the locale table */
  1391.         if (strcmp (timeInfo->_Zone [option], "") != 0)
  1392.     strcpy(buffer,timeInfo->_Zone [option]);
  1393.         else  
  1394.             *buffer = EOS;
  1395.         }
  1396.     }
  1397. /* time.c - time file for time */
  1398. /* Copyright 1992-1993 Wind River Systems, Inc. */
  1399. /*
  1400. modification history
  1401. --------------------
  1402. 01c,05feb93,jdi  documentation cleanup for 5.1.
  1403. 01b,20sep92,smb  documentation additions
  1404. 01a,25jul92,smb  written.
  1405. */
  1406. /*  
  1407. DESCRIPTION  
  1408.   
  1409. INCLUDE FILE: time.h
  1410.    
  1411. SEE ALSO: American National Standard X3.159-1989 
  1412. NOMANUAL
  1413. */
  1414. #include "vxWorks.h"
  1415. #include "time.h"
  1416. #include "timers.h"
  1417. /****************************************************************************
  1418. *
  1419. * time - determine the current calendar time (ANSI)
  1420. *
  1421. * This routine returns the implementation's best approximation of current
  1422. * calendar time in seconds.  If <timer> is non-NULL, the return value is
  1423. * also copied to the location <timer> points to.
  1424. *
  1425. * INTERNAL
  1426. * Uses the POSIX clockLib functions.
  1427. * Does this return the number of seconds since the BOARD was booted?
  1428. *
  1429. * INCLUDE FILES: time.h
  1430. *
  1431. * RETURNS:
  1432. * The current calendar time in seconds, or ERROR (-1) if the calendar time
  1433. * is not available.
  1434. *
  1435. * SEE ALSO: clock_gettime()
  1436. */
  1437.  
  1438. time_t time
  1439.     (
  1440.     time_t *timer /* calendar time in seconds */
  1441.     )
  1442.     {
  1443.     struct timespec tp;
  1444.     if (clock_gettime (CLOCK_REALTIME, &tp) == 0)
  1445. {
  1446. if (timer != NULL)
  1447.     *timer = (time_t) tp.tv_sec;
  1448. return (time_t) (tp.tv_sec);
  1449. }
  1450.     else
  1451. return (time_t) (ERROR);
  1452.     }