home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / snip9707.zip / DOW.C < prev    next >
C/C++ Source or Header  |  1997-07-05  |  2KB  |  80 lines

  1. /* +++Date last modified: 05-Jul-1997 */
  2.  
  3. /*
  4. **  DOW.C
  5. **
  6. **  Public domain by VinhHao Nguyen, 03/94
  7. **
  8. **  Note: This function is redundant with the function of the same name
  9. **        in DAYNUM.C. Which one to use?
  10. **
  11. **        If you're already using any functions in SCALDATE.C, DAYNUM.C,
  12. **        or TODAY.C, ignore this file and use the other dow().
  13. **
  14. **        If you need a stand-alone DOW() function without using any of
  15. **        the rest of the SCALDATE package, use this file.
  16. */
  17.  
  18. #include "scaldate.h"
  19.  
  20. #if ISO_CAL       /* monday == 0 */
  21.  #define ADJ 5
  22. #else             /* sunday == 0 */
  23.  #define ADJ 6
  24. #endif
  25.  
  26. unsigned DOW(unsigned y, unsigned m, unsigned d)
  27. {
  28.       if (m < 3)
  29.       {
  30.             m += 13;
  31.             y--;
  32.       }
  33.       else  m++;
  34.       return (d + 26 * m / 10 + y + y / 4 - y / 100 + y / 400 + ADJ) % 7;
  35. }
  36.  
  37. #ifdef TEST
  38.  
  39. #include <stdio.h>
  40. #include <stdlib.h>
  41.  
  42. main(int argc, char *argv[])
  43. {
  44.       int Day;
  45.       void usage(void);
  46.       unsigned d, m, y, days[] = {31, 29, 31, 30, 31, 30,
  47.                                   31, 31, 30, 31, 30, 31};
  48.       char *day[2][7] = {
  49.             {"Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"},
  50.             {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}
  51.       };
  52.       char *month[]  = {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
  53.                         "Jul", "Aug", "Sep", "Oct", "Nov", "Dec",};
  54.       
  55.  
  56.       if (4 > argc)
  57.             usage();
  58.       y = atoi(argv[1]);
  59.       m = atoi(argv[2]);
  60.       d = atoi(argv[3]);
  61.       if (!m || m > 12)
  62.             usage();
  63.       if (!d || d > days[m - 1])
  64.             usage();
  65.       if (y < 100)
  66.             y += 1900;
  67.       Day = DOW(y, m, d);
  68.       printf("DOW(ISO_CAL=%d) returned %d, so %d %s %d is a %s\n",
  69.             ISO_CAL, Day, d, month[m - 1], y, day[ADJ - 5][Day]);
  70.       return 0;
  71. }
  72.  
  73. void usage(void)
  74. {
  75.       puts("Usage: DOW yy[yy] mm dd");
  76.       exit(-1);
  77. }
  78.  
  79. #endif /* TEST */
  80.