Annotation of 41BSD/cmd/cal.c, revision 1.1.1.1

1.1       root        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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.