Annotation of researchv10no/cmd/wc.c, revision 1.1

1.1     ! root        1: #include       <stdio.h>
        !             2: 
        !             3: #define                NBUF            (64*1024)
        !             4: int space[256];
        !             5: char   *opt="lwc";
        !             6: long   twords;
        !             7: long   tlines;
        !             8: long   tchars;
        !             9: 
        !            10: main(argc, argv)
        !            11:        char *argv[];
        !            12: {
        !            13:        register i, fd, status=0;
        !            14:        if(argc>1 && argv[1][0]=='-'){
        !            15:                opt=++argv[1];
        !            16:                --argc, argv++;
        !            17:        }
        !            18:        for(i = 0; i < 256; i++)
        !            19:                space[i] = 0;
        !            20:        space[' '] = space['\t'] = space['\n'] = 1;
        !            21:        if(argc==1)
        !            22:                count(0, (char *)0);
        !            23:        else for(i=1; i<argc; i++){
        !            24:                fd=open(argv[i], 0);
        !            25:                if(fd<0){
        !            26:                        fprintf(stderr, "wc: ");
        !            27:                        perror(argv[i]);
        !            28:                        status=1;
        !            29:                        continue;
        !            30:                }
        !            31:                count(fd, argv[i]);     
        !            32:        }
        !            33:        if(argc>2)
        !            34:                printout(tchars, twords, tlines, "total");
        !            35:        return status;
        !            36: }
        !            37: unsigned char buf[NBUF+2];     /* 2 for sentinels */
        !            38: count(fd, name)
        !            39:        char *name;
        !            40: {
        !            41:        register n;
        !            42:        register unsigned char *cp, *cpend;
        !            43:        register long chars=0, lines=0, words=0;
        !            44: 
        !            45:        for(;;){
        !            46:                if((n=read(fd, buf, NBUF))<=0)
        !            47:                        goto done;
        !            48:                chars+=n;
        !            49:                cp=buf;
        !            50:                *(cpend = buf+n) = ' ';
        !            51:                cpend[1] = 'a';
        !            52: dospace:
        !            53:                for(;;){
        !            54:                        if(*cp == '\n')
        !            55:                                lines++;
        !            56:                        if(space[*cp++] == 0){
        !            57:                                if(cp > cpend)
        !            58:                                        break;
        !            59:                                goto doword;
        !            60:                        }
        !            61:                }
        !            62:        }
        !            63:        for(;;){
        !            64:                if((n=read(fd, buf, NBUF))<=0)
        !            65:                        goto done;
        !            66:                chars+=n;
        !            67:                cp=buf;
        !            68:                *(cpend = buf+n) = ' ';
        !            69:                cpend[1] = 'a';
        !            70: doword:
        !            71:                for(;;){
        !            72:                        if(space[*cp++]){
        !            73:                                if(cp > cpend)
        !            74:                                        break;
        !            75:                                words++;
        !            76:                                if(cp[-1] == '\n')
        !            77:                                        lines++;
        !            78:                                goto dospace;
        !            79:                        }
        !            80:                }
        !            81:        }
        !            82: done:
        !            83:        close(fd);
        !            84:        printout(chars, words, lines, name);
        !            85:        tchars+=chars;
        !            86:        twords+=words;
        !            87:        tlines+=lines;
        !            88: }
        !            89: printout(charct, wordct, linect, name)
        !            90:        long charct, wordct, linect;
        !            91:        char *name;
        !            92: {
        !            93:        register char *wd=opt;
        !            94:        while (*wd) switch (*wd++) {
        !            95:        case 'l':
        !            96:                printf("%7ld ", linect);
        !            97:                break;
        !            98: 
        !            99:        case 'w':
        !           100:                printf("%7ld ", wordct);
        !           101:                break;
        !           102: 
        !           103:        case 'c':
        !           104:                printf("%7ld", charct);
        !           105:                break;
        !           106:        }
        !           107:        if(name)
        !           108:                printf(" %s\n", name);
        !           109:        else
        !           110:                printf("\n");
        !           111: }
        !           112: 

unix.superglobalmegacorp.com

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