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

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