home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 14 / CD_ASCQ_14_0694.iso / maj / 653 / cal.c < prev    next >
C/C++ Source or Header  |  1994-04-03  |  4KB  |  145 lines

  1. /*
  2. **  CAL - a calendar for DOS
  3. **
  4. **  a public domain demo using Ray Gardner's SCALDATE.C scalar date functions
  5. **  by Bob Stout
  6. */
  7.  
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10.  
  11. /*
  12. **  function prototypes for SCALDATE.C
  13. */
  14.  
  15. int isleap (unsigned);
  16. long ymd_to_scalar (unsigned, unsigned, unsigned);
  17.  
  18. /*
  19. **  calendar generation information
  20. */
  21.  
  22. int days[12]    = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
  23. char *month[12] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
  24.                    "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
  25. char *daynames[8] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"};
  26.  
  27. /*
  28. **  box drawing stuff
  29. */
  30.  
  31. #ifdef MSDOS
  32.  const char *topborder = "\xd5\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
  33.                          "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
  34.                          "\xcd\xcd\xcd\xcd\xb8";
  35.  const char *midborder = "\xc6\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
  36.                          "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
  37.                          "\xcd\xcd\xcd\xcd\xb5";
  38.  const char *botborder = "\xd4\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
  39.                          "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
  40.                          "\xcd\xcd\xcd\xcd\xbe";
  41.  const char *line = "\xb3";
  42. #else
  43.  const char *line = "";
  44. #endif
  45.  
  46. /*
  47. **  tell 'em they messed up
  48. */
  49.  
  50. void usage(void)
  51. {
  52.       puts("Usage: CAL m y");
  53.       puts("where: m = month (1 - 12)");
  54.       puts("       y = year (1 - 99, 1800 - 3000)");
  55.       exit(-1);
  56. }
  57.  
  58. /*
  59. **  Define ISO to be 1 for ISO (Mon-Sun) calendars
  60. */
  61.  
  62. #ifndef ISO
  63.  #define ISO 0
  64. #endif
  65.  
  66. #if (ISO != 0 && ISO != 1)
  67.  #error ISO must be set to either 0 or 1
  68. #endif
  69.  
  70. /*
  71. **  here's where the real work's done
  72. */
  73.  
  74. int main(int argc, char *argv[])
  75. {
  76.       int day, day_1, numdays, i, j;
  77.       unsigned yr, mo;
  78.  
  79.       if (3 > argc)
  80.             usage();
  81.  
  82.       yr = atoi(argv[2]);
  83.       mo = atoi(argv[1]);
  84.  
  85.       if (!mo || 12 < mo)
  86.             usage();
  87.  
  88.       if (100 > yr)
  89.             yr += 1900;
  90.  
  91.       if (3000 < yr || 1800 > yr)
  92.             usage();
  93.  
  94.       for (i = 0, mo -= 1; i < 3; ++i, ++mo)
  95.       {
  96.             if (!mo)
  97.             {
  98.                   mo = 12;
  99.                   --yr;
  100.             }
  101.             if (12 < mo)
  102.             {
  103.                   mo = 1;
  104.                   ++yr;
  105.             }
  106.             numdays = days[mo - 1];
  107.             if (2 == mo && isleap(yr))
  108.                   ++numdays;
  109.             day_1 = (int)((ymd_to_scalar(yr, mo, 1) - (long)ISO) % 7L);
  110.  
  111. #ifdef MSDOS
  112.             if (!i)
  113.                   puts(topborder);
  114. #endif
  115.             fputs(line, stdout);
  116.             for (j = 0; j < 7; )
  117.             {
  118.                   fputs(daynames[ISO + j], stdout);
  119.                   if (7 != ++j)
  120.                         fputc(' ', stdout);
  121.             }
  122.             printf("%s < %s, %d\n%s", line, month[mo - 1], yr, line);
  123.  
  124.             for (day = 0; day < day_1; ++day)
  125.                   fputs("    ", stdout);
  126.             for (day = 1; day <= numdays; ++day, ++day_1, day_1 %= 7)
  127.             {
  128.                   if (!day_1 && 1 != day)
  129.                         printf("\b%s\n%s", line, line);
  130.                   printf("%3d ", day);
  131.             }
  132.             for ( ; day_1; ++day_1, day_1 %= 7)
  133.                   fputs("    ", stdout);
  134. #ifdef MSDOS
  135.             printf("\b%s\n", line);
  136.             if (2 > i)
  137.                   puts(midborder);
  138.             else  puts(botborder);
  139. #else
  140.             fputc('\n', stdout);
  141. #endif
  142.       }
  143.       return 0;
  144. }
  145.