home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Trees / V7 / usr / src / cmd / cal.c < prev    next >
Encoding:
C/C++ Source or Header  |  1979-01-10  |  2.6 KB  |  205 lines

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