home *** CD-ROM | disk | FTP | other *** search
/ Il CD di internet / CD.iso / SOURCE / CONTRIB / MBASE / MBASE50.TAR / mbase / src / timedate.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-10-02  |  7.3 KB  |  312 lines

  1. /*
  2.  * METALBASE 5.0
  3.  *
  4.  * Released October 1st, 1992 by Huan-Ti [ richid@owlnet.rice.edu ]
  5.  *                                       [ t-richj@microsoft.com ]
  6.  */
  7.  
  8. #define TIMEDATE_C
  9. #include "mbase.h"
  10.  
  11. #define TMsHR(x,n) x|=((((ulong)(n))&   31) << 19)
  12. #define TMsMN(x,n) x|=((((ulong)(n))&   63) << 13)
  13. #define TMsSC(x,n) x|=((((ulong)(n))&   63) <<  7)
  14. #define TMsMI(x,n) x|= (((ulong)(n))&  127)
  15. #define DTsYR(x,n) x|=((((ulong)(n))& 8191) <<  9)
  16. #define DTsMO(x,n) x|=((((ulong)(n))&   15) <<  5)
  17. #define DTsDY(x,n) x|= (((ulong)(n))&   31)
  18. #define TMgHR(x)   (int)((x >> 19) &   31)
  19. #define TMgMN(x)   (int)((x >> 13) &   63)
  20. #define TMgSC(x)   (int)((x >>  7) &   63)
  21. #define TMgMI(x)   (int)(x &          127)
  22. #define DTgYR(x)   (int)((x >>  9) & 8191)
  23. #define DTgMO(x)   (int)((x >>  5) &   15)
  24. #define DTgDY(x)   (int)(x & 31)
  25.  
  26. struct tm *
  27. _getlt ()                 /* == Get LocalTime, in {struct tm *} */
  28. {
  29.    time_t date;
  30.    time (&date);          /* If your compiler complains, try date=time(); */
  31.    return localtime (&date);
  32. }
  33.  
  34. long
  35. elap_t (tme)
  36. mb_time tme;
  37. {
  38.    long     dif;
  39.    mb_time  now;
  40.    now = curtime();
  41.    dif  = 3600L * (long)(TMgHR(now) - TMgHR(tme));
  42.    dif +=   60L * (long)(TMgMN(now) - TMgMN(tme));
  43.    dif +=    1L * (long)(TMgSC(now) - TMgSC(tme));
  44.    return dif;
  45. }
  46.  
  47. mb_time
  48. tmtotime  (tim)  /* Pass NULL to get current time */
  49. struct tm *tim;
  50. {
  51.    struct tm  *ptr;
  52.    mb_time     ret;
  53.    ptr = (tim == (struct tm *)0) ? _getlt() : tim;
  54.    ret = (mb_time)0;
  55.    TMsHR(ret, ptr->tm_hour);
  56.    TMsMN(ret, ptr->tm_min);
  57.    TMsSC(ret, ptr->tm_sec);
  58.    TMsMI(ret, 0);
  59.    return ret;
  60. }
  61.  
  62. mb_date
  63. tmtodate  (tim)
  64. struct tm *tim;
  65. {
  66.    struct tm  *ptr;
  67.    mb_date     ret;
  68.    ptr = (tim == (struct tm *)0) ? _getlt() : tim;
  69.    ret = (mb_date)0;
  70.    DTsYR(ret, ptr->tm_year+5996L); /* 1992 : tm_year = 92, ret.year = 6178 */
  71.    DTsMO(ret, ptr->tm_mon+1L);
  72.    DTsDY(ret, ptr->tm_mday);
  73.    return ret;
  74. }
  75.  
  76. struct tm *
  77. datetimetotm (dat, tim)
  78. mb_date       dat;
  79. mb_time            tim;
  80. {
  81.    static struct tm ret, *ptr;
  82.    dat = (! dat) ? curdate() : dat;
  83.    tim = (! tim) ? curtime() : tim;
  84.    ptr = _getlt();
  85.    ptr->tm_sec  = TMgSC(tim);
  86.    ptr->tm_min  = TMgMN(tim);
  87.    ptr->tm_hour = TMgHR(tim);
  88.    ptr->tm_mday = DTgDY(dat);
  89.    ptr->tm_mon  = DTgMO(dat)-1;
  90.    ptr->tm_year = (int)(DTgYR(dat)-5996L);
  91.    ptr->tm_wday = ptr->tm_yday = ptr->tm_isdst = 0;
  92.    return &ret;
  93. }
  94.  
  95. char *
  96. fmt_date (dat, opt)
  97. mb_date   dat;
  98. int            opt;
  99. {
  100.    static char buf[20];
  101.    if (DTgYR(dat) < 3096)  DTsYR(dat,4096);
  102.    switch (opt)
  103.     { case 1: sprintf (buf, "%02d/%02d/%02d", DTgMO(dat),
  104.                              DTgDY(dat), DTgYR(dat)-5996L);
  105.                break;
  106.       case 2: sprintf (buf, "%02d%02d%02d", DTgYR(dat)-5996L,
  107.                              DTgMO(dat), DTgDY(dat));
  108.                break;
  109.       default:sprintf (buf, "%02d/%02d/%04d", DTgMO(dat),
  110.                              DTgDY(dat), DTgYR(dat)-4096L);
  111.                break;
  112.     }
  113.    return buf;
  114. }
  115.  
  116. char *
  117. fmt_time (tim, opt)
  118. mb_time   tim;
  119. int            opt;
  120. {
  121.    static char buf[20];
  122.    switch (opt)
  123.     { case  1:  sprintf (buf, "%02d:%02d %s", (TMgHR(tim) % 12),
  124.                          TMgMN(tim), (TMgHR(tim) >= 12) ? "pm" : "am");
  125.                break;
  126.       case  2:  sprintf (buf, "%02d:%02d", TMgHR(tim),
  127.                          TMgMN(tim));
  128.                break;
  129.       default: sprintf (buf,"%02d:%02d:%02d", TMgHR(tim),
  130.                          TMgMN(tim), TMgSC(tim));
  131.                break;
  132.     }
  133.    return buf;
  134. }
  135.  
  136. mb_date
  137. scn_date (str)
  138. char     *str;
  139. {
  140.    char     buf[80];
  141.    char    *a, *b;
  142.    long     x;
  143.    mb_date  rtn = (mb_date)0;
  144.  
  145.    if (! str || ! *str)  return rtn;
  146.    strcpy (buf, str);
  147.    if ((a=strchr (buf, '/'))==NULL)
  148.     {
  149.       strzcpy (buf, &str[0], 2);  DTsYR (rtn, atol (buf)+5996L);
  150.       strzcpy (buf, &str[2], 2);  DTsMO (rtn, atol (buf));
  151.       strzcpy (buf, &str[4], 2);  DTsDY (rtn, atol (buf));
  152.       return rtn;
  153.     }
  154.    b=strchr(str,'/')+1;
  155.  
  156.    *a = 0;  DTsMO (rtn, atol (buf));  strcpy (buf, b);
  157.    if ((b=strchr (b, '/'))==NULL)  return rtn;
  158.  
  159.    a=strchr(buf, '/'); *a = 0; DTsDY(rtn, atol(buf));
  160.  
  161.    strcpy (buf, b+1);  x=atol(buf);
  162.    if (strlen (buf) < 3)  x += 1900;
  163.    DTsYR (rtn, x + 4096);
  164.  
  165.    return rtn;
  166. }
  167.  
  168. mb_time
  169. scn_time (str)
  170. char     *str;
  171. {
  172.    char     buf[80];
  173.    char    *a, *b;
  174.    long     x;
  175.    mb_time  rtn = (mb_time)0;
  176.  
  177.    if (! str || ! *str)  return rtn;
  178.    strcpy (buf, str);
  179.    if ((a=strchr (buf, ':'))==NULL)  return rtn;
  180.    b=strchr(str,':')+1;
  181.  
  182.    *a = 0;  TMsHR(rtn, atol (buf));  strcpy (buf, b);
  183.    if ((a=strchr (b, ':'))==NULL)
  184.     { x=TMgHR (rtn);  rtn=(mb_time)0;  TMsMN (rtn, atol(buf));
  185.       if ((a=strchr (str, 'p'))==NULL)  a=strchr (str, 'P');
  186.       if (a)
  187.          if ((*(a+1) == 'm' || *(a+1) == 'M') && x < 12)
  188.             x += 12;
  189.       TMsHR (rtn, x);
  190.       return rtn;
  191.     }
  192.    b=strchr(buf,':');  *b = 0;  TMsMN (rtn, atol (buf));
  193.  
  194.    strcpy (buf, a+1);  TMsSC (rtn, atol (buf));
  195.    
  196.    return rtn;
  197. }
  198.  
  199. mb_time
  200. add_time (str)
  201. char     *str;
  202. {
  203.    long     s,m,h;
  204.    mb_time  now, tmp;
  205.  
  206.    now = curtime  ();
  207.    tmp = scn_time (str);
  208.  
  209.    s = TMgSC (now) + TMgSC (tmp);
  210.    m = TMgMN (now) + TMgMN (tmp);
  211.    h = TMgHR (now) + TMgHR (tmp);
  212.  
  213.    while (s >= 60L)  { s -= 60L; m += 1L; }
  214.    while (m >= 60L)  { m -= 60L; h += 1L; }
  215.    while (h >= 24L)  { h -= 24L;          }
  216.  
  217.    tmp = 0L;
  218.  
  219.    TMsSC (tmp, s);
  220.    TMsMN (tmp, m);
  221.    TMsHR (tmp, h);
  222.  
  223.    return tmp;
  224. }
  225.  
  226. char *
  227. fmt_phone (ac, pre, num, ext, opt)  /* OPT: 1=use () for AC, 0=don't     */
  228. long       ac, pre, num, ext;       /* (-1==internal use only--tis ugly) */
  229. int                           opt;
  230. {
  231.    static char buf[25];
  232.  
  233.    buf[0] = 0;
  234.  
  235.    if (!ac && !pre && !num && !ext)
  236.       return buf;
  237.  
  238.    if (opt != -1)
  239.       {
  240.       opt = (opt == 0 || opt == 3) ? 1 : 0;
  241.  
  242.       if (! ext)  opt = (opt == 0) ? 3 : 4;
  243.       if (! ac)   opt = (opt <= 1) ? 2 : 5;
  244.       }
  245.  
  246.    switch (opt)
  247.       {
  248.       case -1: sprintf (buf, "%03ld-%03ld-%04ldx%05ld",ac,pre,num, ext); break;
  249.       case  1: sprintf (buf, "%ld-%ld-%04ld x%ld",     ac,pre,num, ext); break;
  250.       case  2: sprintf (buf, "%ld-%04ld x%ld",            pre,num, ext); break;
  251.       case  3: sprintf (buf, "(%ld) %ld-%04ld",        ac,pre,num);      break;
  252.       case  4: sprintf (buf, "%ld-%ld-%04ld",          ac,pre,num);      break;
  253.       case  5: sprintf (buf, "%ld-%04ld",                 pre,num);      break;
  254.       default: sprintf (buf, "(%ld) %ld-%04ld x%ld",   ac,pre,num, ext); break;
  255.                break;
  256.       }
  257.    return buf;
  258. }
  259.  
  260. void
  261. scn_phone (ac, pre, num, ext, str)
  262. long      *ac,*pre,*num,*ext;
  263. char                            *str;
  264. {
  265.    char *a, *b, buf[128];
  266.  
  267.    *ac = *pre = *num = *ext = 0L;
  268.    strcpy (buf, str);
  269.  
  270.    if ((a = strchr (buf, '(')) != NULL)
  271.       {
  272.       if ((b = strchr (a, ')')) == NULL)  return;
  273.       *b = 0;  b++;
  274.       *ac = atol (1+a);
  275.       }
  276.    else
  277.       {
  278.       if ((a = strchr (buf, '-')) == NULL)  return;
  279.       if (strchr (1+a, '-') != NULL)
  280.          {
  281.          b = a; *b = 0;  b++;
  282.          *ac = atol(buf);
  283.          }
  284.       else
  285.          {
  286.          b = &buf[0];  /* No area code */
  287.          }
  288.       }
  289.  
  290.    if ((a = strchr (b, '-')) == NULL)  { *ac = 0; return; }
  291.    *a = 0; a++;
  292.    *pre = atol (b);
  293.  
  294.    if ((b = strpbrk (a, " xX")) != NULL)
  295.       {
  296.       *b = 0;
  297.       b++;
  298.       }
  299.  
  300.    *num = atol (a);
  301.  
  302.    if (b != NULL)
  303.       {
  304.       if ((a = strpbrk (b, "xX")) != NULL)
  305.          b = 1+a;
  306.  
  307.       *ext = atol (b);
  308.       }
  309. }
  310.  
  311.  
  312.