home *** CD-ROM | disk | FTP | other *** search
/ POINT Software Programming / PPROG1.ISO / c / snippets / addtime.c < prev    next >
C/C++ Source or Header  |  1995-03-13  |  3KB  |  108 lines

  1. /*
  2. **  ADDTIME.C - Add a time period to a base time, normalizing the result
  3. **
  4. **  arguments: 1  - Base hours (0 -> 24)
  5. **             2  - Base minutes (0 -> 59)
  6. **             3  - Base seconds (0 -> 59)
  7. **             4  - Span hours
  8. **             5  - Span minutes
  9. **             6  - Span seconds
  10. **             7  - Address of returned hours (0 -> 23)
  11. **             9  - Address of returned minutes (0 -> 59)
  12. **             10 - Address of returned seconds (0 -> 59)
  13. **             11 - Address of number of days to add to result
  14. **
  15. **  returns: 0 if no error, non-zero if base time range error
  16. **
  17. **  Notes: 1) Span values may be negative.
  18. **         2) Overflowing midnight will cause a positive number of days to be
  19. **            returned.
  20. **         3) Underflowing midnight will cause a negative number of days to be
  21. **            returned.
  22. **
  23. **  Original Copyright 1994 by Bob Stout as part of
  24. **  the MicroFirm Function Library (MFL)
  25. **
  26. **  This subset version is donated to the public domain.
  27. */
  28.  
  29. #include <stdlib.h>
  30.  
  31. int add_time(unsigned basehrs, unsigned basemins, unsigned basesecs,
  32.              int spanhrs, int spanmins, int spansecs,
  33.              unsigned *hrs, unsigned *mins, unsigned *secs, int *days)
  34. {
  35.       int h, m, s;
  36.       div_t r;
  37.  
  38.       if (basehrs > 24 || basemins > 59 || basesecs > 59)
  39.             return -1;
  40.  
  41.       if (24 == basehrs)
  42.             basehrs = 0;
  43.       h = (int)basehrs  + spanhrs;
  44.       m = (int)basemins + spanmins;
  45.       s = (int)basesecs + spansecs;
  46.  
  47.       r = div(s, 60);
  48.       if (s < 0)
  49.       {
  50.             r.rem += 60;
  51.             --r.quot;
  52.       }
  53.       *secs = r.rem;
  54.       m += r.quot;
  55.  
  56.       r = div(m, 60);
  57.       if (m < 0)
  58.       {
  59.             r.rem += 60;
  60.             --r.quot;
  61.       }
  62.       *mins = r.rem;
  63.       h += r.quot;
  64.  
  65.       r = div(h, 24);
  66.       if (h < 0)
  67.       {
  68.             r.rem += 24;
  69.             --r.quot;
  70.       }
  71.       *hrs = r.rem;
  72.       *days = r.quot;
  73.  
  74.       return 0;
  75. }
  76.  
  77. #ifdef TEST
  78.  
  79. #include <stdio.h>
  80.  
  81. main(int argc, char *argv[])
  82. {
  83.       unsigned bh, bm, bs, h, m, s;
  84.       int sh, sm, ss, days;
  85.  
  86.       if (7 > argc)
  87.       {
  88.             puts("Usage: ADDTIME base_hrs base_mins base_secs "
  89.                   "span_hrs span_mins span_secs");
  90.             return EXIT_FAILURE;
  91.       }
  92.  
  93.       bh = (unsigned)atoi(argv[1]);
  94.       bm = (unsigned)atoi(argv[2]);
  95.       bs = (unsigned)atoi(argv[3]);
  96.       sh = atoi(argv[4]);
  97.       sm = atoi(argv[5]);
  98.       ss = atoi(argv[6]);
  99.  
  100.       printf("add_time() returned %d\n",
  101.             add_time(bh, bm, bs, sh, sm, ss, &h, &m, &s, &days));
  102.  
  103.       printf("%2d:%02d:%02d + %2d:%02d:%02d = %2d:%02d:%02d + %d days\n",
  104.             bh, bm, bs, sh, sm, ss, h, m, s, days);
  105. }
  106.  
  107. #endif
  108.