home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / EFFO / pd8.lzh / SRC / time.c < prev    next >
Text File  |  1990-05-04  |  2KB  |  120 lines

  1. /* get the time from the os.
  2.  *
  3.  * here are two methods I was able to verify; pick one for your system and
  4.  *   define exactly one of TZA or TZB:
  5.  * TZA works on our ibm-pc/turbo-c and at&t systems,
  6.  * TZB works on our 4.2 BSD vax.
  7.  *
  8.  * I'm told that on Sun OS 4.0.3 (BSD 4.3?) and Apollo SR 10.1 TZB works if
  9.  *   you use <sys/time.h> in place of <time.h>.
  10.  */
  11. #ifndef OSK
  12. #define    TZA
  13. #endif
  14.  
  15. #include <stdio.h>
  16. #include <time.h>
  17.  
  18. #include "astro.h"
  19. #include "circum.h"
  20.  
  21. extern char *strncpy();
  22. extern long time();
  23.  
  24. static long c0;
  25. static double mjd0;
  26.  
  27. /* save current mjd and corresponding system clock for use by inc_mjd().
  28.  * this establishes the base correspondence between the mjd and system clock.
  29.  */
  30. set_t0 (np)
  31. Now *np;
  32. {
  33.     mjd0 = mjd;
  34.     time (&c0);
  35. }
  36.  
  37. /* fill in n_mjd/tz/tznm from system clock.
  38.  */
  39. time_fromsys (np)
  40. Now *np;
  41. {
  42.     extern struct tm *gmtime(), *localtime();
  43.     struct tm *tp;
  44.     long c;
  45.     double day, hr;
  46.  
  47.     time (&c);
  48.  
  49.     tp = localtime (&c);
  50.     settzstuff (tp->tm_isdst ? 1 : 0, np);
  51.  
  52.     /* N.B. gmtime() can return pointer to same area as localtime(), ie,
  53.      * reuse the same static area, so be sure to call it after we are
  54.      * through with local time info.
  55.      */
  56.     tp = gmtime (&c);
  57.     cal_mjd (tp->tm_mon+1, (double)tp->tm_mday, tp->tm_year+1900, &day);
  58.     sex_dec (tp->tm_hour, tp->tm_min, tp->tm_sec, &hr);
  59.     mjd = day + hr/24.0;
  60. }
  61.  
  62. /* given whether dst is now in effect (must be strictly 0 or 1), fill in
  63.  * tzname and tz within np.
  64.  */
  65. static
  66. settzstuff (dst, np)
  67. int dst;
  68. Now *np;
  69. {
  70. #ifdef TZA
  71.     extern long timezone;
  72.     extern char *tzname[2];
  73.  
  74.     tzset();
  75.     tz = timezone/3600;
  76.     if (dst)
  77.         tz -= 1.0;
  78.     strncpy (tznm, tzname[dst], sizeof(tznm)-1);
  79. #endif
  80. #ifdef TZB
  81.     extern char *timezone();
  82.     struct timeval timev;
  83.     struct timezone timez;
  84.  
  85.     gettimeofday (&timev, &timez);
  86.     tz = timez.tz_minuteswest/60;
  87.     if (dst)
  88.         tz -= 1.0;
  89.     strncpy (tznm, timezone(timez.tz_minuteswest, dst), sizeof(tznm)-1);
  90. #endif
  91. #ifdef OSK
  92.     char *tzenv = (char *) getenv("TZ");
  93.     static char first = 1;
  94.  
  95.     if (dst && first)
  96.         tz -= 1.0;
  97.     first = 0;
  98.     strncpy (tznm,tzenv ? tzenv : "",3);
  99. #endif
  100.     tznm[sizeof(tznm)-1] = '\0';    /* insure string is terminated */
  101. }
  102.  
  103. inc_mjd (np, inc)
  104. Now *np;
  105. double inc;
  106. {
  107.     if (inc == RTC) {
  108.         long c;
  109.         time (&c);
  110.         mjd = mjd0 + (c - c0)/SPD;
  111.     } else
  112.         mjd += inc/24.0;
  113.  
  114.     /* round to nearest whole second.
  115.      * without this, you can get fractional days so close to .5 but
  116.      * not quite there that mjd_hr() can return 24.0
  117.      */
  118.     rnd_second (&mjd);
  119. }
  120.