home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 3 / TheARMClub_PDCD3.iso / hensa / misc / a154_1 / !Tierra / source / c / Time < prev    next >
Text File  |  1992-08-11  |  5KB  |  245 lines

  1. /* C.Time: Time processing for Arm 5-byte time format */
  2.  
  3. #include <stdio.h>
  4. #include <limits.h>
  5. #include "kernel.h"
  6. #include "swis.h"
  7.  
  8. #include "time.h" /* was #include "sys/time.h" */
  9.  
  10. /* The "zero" time (ie. 00:00:00 on 01/01/1900) */
  11. TIME TIMENull = { 0, 0, 0, 0, 0 };
  12.  
  13. TIME TIMEadd (TIME t, int n)
  14. {
  15.     unsigned int sum;
  16.     TIME res;
  17.  
  18.     sum = t.t[0] + n;
  19.     res.t[0] = sum & 0xFF;
  20.  
  21.     sum >>= 8;
  22.     sum += t.t[1];
  23.     res.t[1] = sum & 0xFF;
  24.  
  25.     sum >>= 8;
  26.     sum += t.t[2];
  27.     res.t[2] = sum & 0xFF;
  28.  
  29.     sum >>= 8;
  30.     sum += t.t[3];
  31.     res.t[3] = sum & 0xFF;
  32.  
  33.     sum >>= 8;
  34.     sum += t.t[4];
  35.     res.t[4] = sum & 0xFF;
  36.  
  37.     return res;
  38. }
  39.  
  40. int TIMEsub (TIME t1, TIME t2)
  41. {
  42.     int n1;
  43.     int n2;
  44.  
  45.     if (t1.t[4] != t2.t[4])
  46.         return ((t1.t[4] < t2.t[4]) ? INT_MIN : INT_MAX);
  47.  
  48.     n1 = (t1.t[0]) | (t1.t[1] << 8) | (t1.t[2] << 16) | (t1.t[3] << 24);
  49.     n2 = (t2.t[0]) | (t2.t[1] << 8) | (t2.t[2] << 16) | (t2.t[3] << 24);
  50.  
  51.     return (n1 - n2);
  52. }
  53.  
  54. int TIMEcmp (TIME t1, TIME t2)
  55. {
  56.     if (t1.t[4] != t2.t[4])
  57.         return ((t1.t[4] < t2.t[4]) ? -1 : 1);
  58.  
  59.     if (t1.t[3] != t2.t[3])
  60.         return ((t1.t[3] < t2.t[3]) ? -1 : 1);
  61.  
  62.     if (t1.t[2] != t2.t[2])
  63.         return ((t1.t[2] < t2.t[2]) ? -1 : 1);
  64.  
  65.     if (t1.t[1] != t2.t[1])
  66.         return ((t1.t[1] < t2.t[1]) ? -1 : 1);
  67.  
  68.     if (t1.t[0] != t2.t[0])
  69.         return ((t1.t[0] < t2.t[0]) ? -1 : 1);
  70.  
  71.     return 0;
  72. }
  73.  
  74. char *TIMEfmt (const char *fmt, char *buffer, int len, TIME t)
  75. {
  76.     _kernel_swi_regs regs;
  77.  
  78.     regs.r[0] = (int)(&t);
  79.     regs.r[1] = (int)buffer;
  80.     regs.r[2] = len;
  81.     regs.r[3] = (int)fmt;
  82.  
  83.     if (_kernel_swi(OS_ConvertDateAndTime, ®s, ®s))
  84.         return 0;
  85.  
  86.     return buffer;
  87. }
  88.  
  89. #define CTIME_LEN 26
  90. #define CTIME_FMT "%w3 %m3 %dy %24:%mi:%se %ce%yr\n"
  91.  
  92. char *TIMEstd (TIME t)
  93. {
  94.     static char buffer[CTIME_LEN];
  95.     _kernel_swi_regs regs;
  96.  
  97.     regs.r[0] = (int)(&t);
  98.     regs.r[1] = (int)buffer;
  99.     regs.r[2] = CTIME_LEN;
  100.     regs.r[3] = (int)CTIME_FMT;
  101.  
  102.     if (_kernel_swi(OS_ConvertDateAndTime, ®s, ®s))
  103.         return 0;
  104.  
  105.     /* Required format has day no as BLANK padded (eg. " 7", not "07") */
  106.     if (buffer[6] == '0')
  107.         buffer[6] = ' ';
  108.  
  109.     return buffer;
  110. }
  111.  
  112. TIME TIMEnow(TIME *tp)
  113. {
  114.     int i;
  115.     int blk[2];
  116.     static TIME t;
  117.     char *p = (char *)blk;
  118.  
  119.     if ( tp == 0 )
  120.         tp = &t;
  121.  
  122.     p[0] = 3;
  123.  
  124.     if (_kernel_osword(0x0E, blk) == _kernel_ERROR)
  125.         return TIMENull;
  126.  
  127.     for ( i = 0; i < 5; ++i )
  128.         tp->t[i] = p[i];
  129.  
  130.     return *tp;
  131. }
  132.  
  133. /* Internal routine to accumulate values into a TIME variable */
  134. static void t_accum (TIME *t, int acc, int mul)
  135. {
  136.         int a[5];
  137.         unsigned n = acc;
  138.         int i, j;
  139.  
  140.         for ( i = 0; i <= 4; ++i )
  141.                 a[i] = ( n >> ( i * 8 ) & 0xFF );
  142.         for ( i = 0; i <= 4; ++i )
  143.         {
  144.                 n = mul * t->t[i] + a[i];
  145.  
  146.                 t->t[i] = (n & 0xFF);
  147.  
  148.                 for ( j = i + 1; j <= 4; ++j )
  149.                         a[j] += ( n >> ( (j-i) * 8 ) & 0xFF );
  150.         }
  151. }
  152.  
  153. TIME TIMEmktime (struct tm *timeptr)
  154. {
  155.         int is_ly;
  156.         int ys;
  157.         int days;
  158.         TIME t;
  159.  
  160.         /* Correct invalid elements of *timeptr */
  161.         mktime(timeptr);
  162.  
  163.         if ( timeptr->tm_year % 4 != 0 )
  164.                 is_ly = 0;
  165.         else if ( timeptr->tm_year % 100 != 0 )
  166.                 is_ly = 1;
  167.         else if ( timeptr->tm_year % 400 == 0 )
  168.                 is_ly = 1;
  169.         else
  170.                 is_ly = 0;
  171.  
  172.  
  173.         ys = timeptr->tm_year;
  174.  
  175.         if ( timeptr->tm_year == 0 )
  176.                 days = 0;
  177.         else
  178.         {
  179.                 days = 365 * timeptr->tm_year;
  180.  
  181.                 /* +1 per leap year */
  182.                 days += ( timeptr->tm_year - 1 ) / 4;
  183.  
  184.                 /* -1 for whole centuries */
  185.                 days -= ( timeptr->tm_year - 1 ) / 100;
  186.  
  187.                 /* +1 per leap century */
  188.                 days += ( timeptr->tm_year + 299 ) / 400;
  189.         }
  190.  
  191.         days += timeptr->tm_yday;
  192.  
  193.         t = TIMENull;
  194.         t_accum(&t,days,1);              /* Set up days */
  195.         t_accum(&t,timeptr->tm_hour,24); /* convert to hours */
  196.         t_accum(&t,timeptr->tm_min,60);  /* convert to mins */
  197.         t_accum(&t,timeptr->tm_sec,60);  /* convert to sec */
  198.         t_accum(&t,0,100);               /* convert to csec */
  199.  
  200.         return t;
  201. }
  202.  
  203. #define PARTS_LEN    19
  204. #define PARTS_FMT    "%se%mi%24%dy%mn%ce%yr%wn%dn"
  205. #define GetNum2(p)    (((p)[0] - '0') * 10 + ((p)[1] - '0'))
  206. #define GetNum3(p)    (GetNum2(p) * 10 + ((p)[2] - '0'))
  207. #define GetNum4(p)    (GetNum3(p) * 10 + ((p)[3] - '0'))
  208.  
  209. struct tm *TIMEstruct (TIME t)
  210. {
  211.     char buffer[PARTS_LEN];
  212.     _kernel_swi_regs regs;
  213.     static struct tm time;
  214.  
  215.     time.tm_isdst = 0;
  216.  
  217.     regs.r[0] = (int)(&t);
  218.     regs.r[1] = (int)buffer;
  219.     regs.r[2] = PARTS_LEN;
  220.     regs.r[3] = (int)PARTS_FMT;
  221.  
  222.     if (_kernel_swi(OS_ConvertDateAndTime, ®s, ®s))
  223.     {
  224.         time.tm_sec  = 0;
  225.         time.tm_min  = 0;
  226.         time.tm_hour = 0;
  227.         time.tm_mday = 0;
  228.         time.tm_mon  = 0;
  229.         time.tm_year = 0;
  230.         time.tm_wday = 0;
  231.         time.tm_yday = 0;
  232.         return &time;
  233.     }
  234.  
  235.     time.tm_sec  = GetNum2(&buffer[0]);
  236.     time.tm_min  = GetNum2(&buffer[2]);
  237.     time.tm_hour = GetNum2(&buffer[4]);
  238.     time.tm_mday = GetNum2(&buffer[6]);
  239.     time.tm_mon  = GetNum2(&buffer[8])  - 1;    /* Jan = 0 */
  240.     time.tm_year = GetNum4(&buffer[10]) - 1900;    /* Years from 1900 */
  241.     time.tm_wday = (buffer[14] - '0')   - 1;    /* Sun = 0 */
  242.     time.tm_yday = GetNum3(&buffer[15]);
  243.     return &time;
  244. }
  245.