Annotation of 43BSDTahoe/usr.bin/cal.c, revision 1.1

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

unix.superglobalmegacorp.com

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