home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / 2014.11.minnie.tuhs.org.tar / minnie.tuhs.org / UnixArchive / PDP-11 / Trees / V6 / usr / source / s1 / cal.c < prev    next >
C/C++ Source or Header  |  1975-05-14  |  3KB  |  208 lines

  1. char    dayw[]
  2. {
  3.     " S  M Tu  W Th  F  S"
  4. };
  5. char    *smon[]
  6. {
  7.     "Jan", "Feb", "Mar", "Apr",
  8.     "May", "Jun", "Jul", "Aug",
  9.     "Sep", "Oct", "Nov", "Dec",
  10. };
  11. char    string[432];
  12. main(argc, argv)
  13. char *argv[];
  14. {
  15.     register y, i, j;
  16.     int m;
  17.  
  18.     if(argc < 2) {
  19.         printf("usage: cal [month] year\n");
  20.         exit();
  21.     }
  22.     if(argc == 2)
  23.         goto xlong;
  24.  
  25. /*
  26.  *    print out just month
  27.  */
  28.  
  29.     m = number(argv[1]);
  30.     if(m<1 || m>12)
  31.         goto badarg;
  32.     y = number(argv[2]);
  33.     if(y<1 || y>9999)
  34.         goto badarg;
  35.     printf("      %s %l\n", smon[m-1], y);
  36.     printf("%s\n", dayw);
  37.     cal(m, y, string, 24);
  38.     for(i=0; i<6*24; i=+24)
  39.         pstr(string+i, 24);
  40.     exit();
  41.  
  42. /*
  43.  *    print out complete year
  44.  */
  45.  
  46. xlong:
  47.     y = number(argv[1]);
  48.     if(y<1 || y>9999)
  49.         goto badarg;
  50.     printf("\n\n\n");
  51.     printf("                %l\n", y);
  52.     printf("\n");
  53.     for(i=0; i<12; i=+3) {
  54.         for(j=0; j<6*72; j++)
  55.             string[j] = '\0';
  56.         printf("     %s", smon[i]);
  57.         printf("            %s", smon[i+1]);
  58.         printf("               %s\n", smon[i+2]);
  59.         printf("%s   %s   %s\n", dayw, dayw, dayw);
  60.         cal(i+1, y, string, 72);
  61.         cal(i+2, y, string+23, 72);
  62.         cal(i+3, y, string+46, 72);
  63.         for(j=0; j<6*72; j=+72)
  64.             pstr(string+j, 72);
  65.     }
  66.     printf("\n\n\n");
  67.     exit();
  68.  
  69. badarg:
  70.     printf("Bad argument\n");
  71. }
  72.  
  73. number(str)
  74. char *str;
  75. {
  76.     register n, c;
  77.     register char *s;
  78.  
  79.     n = 0;
  80.     s = str;
  81.     while(c = *s++) {
  82.         if(c<'0' || c>'9')
  83.             return(0);
  84.         n = n*10 + c-'0';
  85.     }
  86.     return(n);
  87. }
  88.  
  89. pstr(str, n)
  90. char *str;
  91. {
  92.     register i;
  93.     register char *s;
  94.  
  95.     s = str;
  96.     i = n;
  97.     while(i--)
  98.         if(*s++ == '\0')
  99.             s[-1] = ' ';
  100.     i = n+1;
  101.     while(i--)
  102.         if(*--s != ' ')
  103.             break;
  104.     s[1] = '\0';
  105.     printf("%s\n", str);
  106. }
  107.  
  108. char    mon[]
  109. {
  110.     0,
  111.     31, 29, 31, 30,
  112.     31, 30, 31, 31,
  113.     30, 31, 30, 31,
  114. };
  115.  
  116. cal(m, y, p, w)
  117. char *p;
  118. {
  119.     register d, i;
  120.     register char *s;
  121.  
  122.     s = p;
  123.     d = jan1(y);
  124.     mon[2] = 29;
  125.     mon[9] = 30;
  126.  
  127.     switch((jan1(y+1)+7-d)%7) {
  128.  
  129.     /*
  130.      *    non-leap year
  131.      */
  132.     case 1:
  133.         mon[2] = 28;
  134.         break;
  135.  
  136.     /*
  137.      *    1752
  138.      */
  139.     default:
  140.         mon[9] = 19;
  141.         break;
  142.  
  143.     /*
  144.      *    leap year
  145.      */
  146.     case 2:
  147.         ;
  148.     }
  149.     for(i=1; i<m; i++)
  150.         d =+ mon[i];
  151.     d =% 7;
  152.     s =+ 3*d;
  153.     for(i=1; i<=mon[m]; i++) {
  154.         if(i==3 & mon[m]==19) {
  155.             i =+ 11;
  156.             mon[m] =+ 11;
  157.         }
  158.         if(i > 9)
  159.             *s = i/10+'0';
  160.         s++;
  161.         *s++ = i%10+'0';
  162.         s++;
  163.         if(++d == 7) {
  164.             d = 0;
  165.             s = p+w;
  166.             p = s;
  167.         }
  168.     }
  169. }
  170.  
  171. /*
  172.  *    return day of the week
  173.  *    of jan 1 of given year
  174.  */
  175.  
  176. jan1(yr)
  177. {
  178.     register y, d;
  179.  
  180. /*
  181.  *    normal gregorian calendar
  182.  *    one extra day per four years
  183.  */
  184.  
  185.     y = yr;
  186.     d = 4+y+(y+3)/4;
  187.  
  188. /*
  189.  *    julian calendar
  190.  *    regular gregorian
  191.  *    less three days per 400
  192.  */
  193.  
  194.     if(y > 1800) {
  195.         d =- (y-1701)/100;
  196.         d =+ (y-1601)/400;
  197.     }
  198.  
  199. /*
  200.  *    great calendar changeover instant
  201.  */
  202.  
  203.     if(y > 1752)
  204.         d =+ 3;
  205.  
  206.     return(d%7);
  207. }
  208.