Annotation of 42BSD/usr.bin/cal.c, revision 1.1

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

unix.superglobalmegacorp.com

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