Annotation of researchv8dc/cmd/paste.c, revision 1.1

1.1     ! root        1: static char sccsid[] = "@(#)paste.c    1.1";
        !             2: #
        !             3: /* paste: concatenate corresponding lines of each file in parallel. Release 1.4 (GWRL) */
        !             4: /*     (-s option: serial concatenation like old (127's) paste command */
        !             5: # include <stdio.h>    /* make :  cc paste.c  */
        !             6: # define MAXOPNF 12    /* maximal no. of open files (not with -s option) */
        !             7: # define MAXLINE 512   /* maximal line length */
        !             8: #define RUB  '\177'
        !             9:        char del[MAXLINE] = {"\t"};
        !            10:   
        !            11: main(argc, argv)
        !            12: int argc;
        !            13: char ** argv;
        !            14: {
        !            15:        int i, j, k, eofcount, nfiles, maxline, glue;
        !            16:        int delcount = { 1 } ;
        !            17:        int onefile  = { 0 } ;
        !            18:        register int c ;
        !            19:        char outbuf[MAXLINE], l, t;
        !            20:        register char *p;
        !            21:        FILE *inptr[MAXOPNF];
        !            22:   
        !            23:        maxline = MAXLINE -2;
        !            24:  
        !            25:        while (argc > 1 && argv[1][0] == '-' && (c = argv[1][1]) != '\0'){
        !            26:                switch (c) {
        !            27:                        case 's' :  onefile++;
        !            28:                                c = argv[1][2];
        !            29:                                argv[1]++;
        !            30:                                break ;
        !            31:                        case 'd' : argv[1] += 2;
        !            32:                                if((delcount = move(argv[1], &del[0])) == 0) diag("no delimiters\n",1);;
        !            33:                                break;
        !            34:                        default :
        !            35:                                diag("Usage: paste [-s] [-d<delimiterstring>] file1 file2 ...", 1);
        !            36:                                break;
        !            37:                }
        !            38:                --argc;
        !            39:                ++argv;
        !            40:        } /* end options */
        !            41:        --argc;
        !            42:  
        !            43:        if ( ! onefile) {       /* not -s option: parallel line merging */
        !            44:                for (i = 0; argc >0 && i < MAXOPNF; i++) {
        !            45:                        if (argv[i + 1][0] == '-') {
        !            46:                                inptr[i] = stdin;
        !            47:                        } else inptr[i] = fopen(argv[i + 1], "r");
        !            48:                        if (inptr[i] == NULL) {
        !            49:                                diag(argv[i + 1], 0);
        !            50:                                diag(" : cannot open\n", 1);
        !            51:                        }
        !            52:                argc--;
        !            53:                }
        !            54:                if (argc > 0) diag("too many files\n",1);
        !            55:                nfiles = i;
        !            56:   
        !            57:                do {
        !            58:                        p = &outbuf[0];
        !            59:                        eofcount = 0;
        !            60:                        j = k = 0;
        !            61:                        for (i = 0; i < nfiles; i++) {
        !            62:                                while((c = getc(inptr[i])) != '\n' && c != EOF)   {
        !            63:                                        if (++j <= maxline) *p++ = c ;
        !            64:                                        else {
        !            65:                                        diag("line too long\n",1);
        !            66:                                        }
        !            67:                                }
        !            68:                                if ( (l = del[k]) != RUB) *p++ = l;
        !            69:                                k = (k + 1) % delcount;
        !            70:                                if( c == EOF) eofcount++;
        !            71:                        }
        !            72:                        if (l != RUB) *--p = '\n'; else  *p = '\n';
        !            73:                        *++p = 0;
        !            74:                        if (eofcount < nfiles) fputs(outbuf, stdout);
        !            75:                }while (eofcount < nfiles);
        !            76:   
        !            77:        } else {        /* -s option: serial file pasting (old 127 paste command) */
        !            78:                p = &outbuf[0];
        !            79:                glue = 0;
        !            80:                j = 0;
        !            81:                k = 0;
        !            82:                t = 0;
        !            83:                for (i = 1; i <= argc; i++) {
        !            84:                        if (argv[i][0] == '-') {
        !            85:                                inptr[0] = stdin;
        !            86:                        } else inptr[0] = fopen(argv[i], "r");
        !            87:                        if (inptr[0] == NULL) {
        !            88:                                diag(argv[i], 0);
        !            89:                                diag(" : cannot open\n", 1);
        !            90:                        }
        !            91:          
        !            92:                        while((c = getc(inptr[0])) != EOF)   {
        !            93:                                if (j >= maxline) {
        !            94:                                        t = *--p;
        !            95:                                        *++p = 0;
        !            96:                                        fputs(outbuf, stdout);
        !            97:                                        p = &outbuf[0];
        !            98:                                        j = 0;
        !            99:                                }
        !           100:                                if (glue) {
        !           101:                                        glue = 0;
        !           102:                                        l = del[k];
        !           103:                                        if (l != RUB) {
        !           104:                                                *p++ = l ;
        !           105:                                                t = l ;
        !           106:                                                j++;
        !           107:                                        }
        !           108:                                        k = (k + 1) % delcount;
        !           109:                                }
        !           110:                                if(c != '\n') {
        !           111:                                        *p++ = c;
        !           112:                                        t = c;
        !           113:                                        j++;
        !           114:                                } else glue++;
        !           115:                        }
        !           116:                        if (t != '\n') {
        !           117:                                *p++ = '\n';
        !           118:                                j++;
        !           119:                        }
        !           120:                        if (j > 0) {
        !           121:                                *p = 0;
        !           122:                                fputs(outbuf, stdout);
        !           123:                        }
        !           124:                }
        !           125:        }
        !           126: }
        !           127: diag(s,r)
        !           128: char *s;
        !           129: int r;
        !           130: {
        !           131:        write(2, "paste : ", 8);
        !           132:        while(*s)write(2,s++,1);
        !           133:        if(r != 0) exit(r);
        !           134: }
        !           135:   
        !           136: move(from, to)
        !           137: char *from, *to;
        !           138: {
        !           139: int c, i;
        !           140:        i = 0;
        !           141:        do {
        !           142:                c = *from++;
        !           143:                i++;
        !           144:                if (c != '\\') *to++ = c;
        !           145:                else { c = *from++;
        !           146:                        switch (c) {
        !           147:                                case '0' : *to++ = RUB;
        !           148:                                                break;
        !           149:                                case 't' : *to++ = '\t';
        !           150:                                                break;
        !           151:                                case 'n' : *to++ = '\n';
        !           152:                                                break;
        !           153:                                default  : *to++ = c;
        !           154:                                                break;
        !           155:                        }
        !           156:                }
        !           157:        } while (c) ;
        !           158: return(--i);
        !           159: }

unix.superglobalmegacorp.com

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