home *** CD-ROM | disk | FTP | other *** search
/ Media Share 13 / mediashare_13.zip / mediashare_13 / ZIPPED / PROGRAM / SNIP9404.ZIP / DAYNUM.C < prev    next >
C/C++ Source or Header  |  1994-04-03  |  2KB  |  105 lines

  1. /*
  2. **  DAYNUM.C - Functions to return statistics about a given date.
  3. **
  4. **  public domain by Bob Stout - uses Ray Gardner's SCALDATE.C
  5. */
  6.  
  7. #include "scaldate.h"
  8.  
  9. static long jan1date;
  10.  
  11. /*
  12. **  Determine if a given date is valid
  13. */
  14.  
  15. int valiDate(unsigned yr, unsigned mo, unsigned day)
  16. {
  17.       unsigned int days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
  18.  
  19.       if (1 > mo || 12 < mo)
  20.             return 0;
  21.       if (1 > day || day > (days[mo - 1] + (2 == mo && isleap(yr))))
  22.             return 0;
  23.       else  return 1;
  24. }
  25.  
  26. /*
  27. **  Return the day of the week
  28. */
  29.  
  30. int dow(unsigned yr, unsigned mo, unsigned day)
  31. {
  32.  
  33. #if (!ISO)        /* Sunday(0) -> Saturday(6) (i.e. U.S.) calendars  */
  34.       return (ymd_to_scalar(yr, mo, day) % 7L);
  35. #else             /* International Monday(0) -> Sunday(6) calendars  */
  36.       return ((ymd_to_scalar(yr, mo, day) - 1L) % 7L);
  37. #endif
  38. }
  39.  
  40. /*
  41. **  Return the day of the year (1 - 365/6)
  42. */
  43.  
  44. int daynum(int year, int month, int day)
  45. {
  46.       jan1date = ymd_to_scalar(year, 1, 1);
  47.       return (int)(ymd_to_scalar(year, month, day) - jan1date + 1L);
  48. }
  49.  
  50. /*
  51. **  Return the week of the year (1 - 52, 0 - 52 if ISO)
  52. */
  53.  
  54. int weeknum(int year, int month, int day)
  55. {
  56.       int wn, j1n, dn = daynum(year, month, day);
  57.  
  58.       dn += (j1n = (int)((jan1date - (long)ISO) % 7L)) - 1;
  59.       wn = dn / 7;
  60.       if (ISO)
  61.             wn += (j1n < 4);
  62.       else  ++wn;
  63.       return wn;
  64. }
  65.  
  66. #ifdef TEST
  67.  
  68. #include <stdio.h>
  69. #include <stdlib.h>
  70.  
  71. void do_err(void);
  72.  
  73. void main(int argc, char *argv[])
  74. {
  75.       int day, month, year;
  76.       char *days[] =
  77. #if (!ISO)
  78.             {"Sunday", "Monday", "Tuesday", "Wednesday",
  79.              "Thursday", "Friday", "Saturday"};
  80. #else
  81.             {"Monday", "Tuesday", "Wednesday", "Thursday",
  82.              "Friday", "Saturday", "Sunday"};
  83. #endif
  84.  
  85.       if (4 > argc)
  86.       {
  87.             puts("Usage: DAYNUM month day year");
  88.             return;
  89.       }
  90.  
  91.       month = atoi(argv[1]);
  92.       day   = atoi(argv[2]);
  93.       year  = atoi(argv[3]);
  94.       if (100 > year)
  95.             year += 1900;
  96.  
  97.       if (!valiDate(year, month, day))
  98.             printf("%d/%d/%d is invalid!\n", month, day, year);
  99.       else  printf("%d/%d/%d is a %s, day #%d in week %d\n", month, day, year,
  100.                   days[dow(year, month, day)], daynum(year, month, day),
  101.                   weeknum(year, month, day));
  102. }
  103.  
  104. #endif /* TEST */
  105.