Annotation of researchv10no/cmd/mc.c, revision 1.1.1.1

1.1       root        1: #define        JERQ
                      2: /*
                      3:  * mc - columnate
                      4:  *
                      5:  * mc[-][-LINEWIDTH][-t][file...]
                      6:  *     - causes break on colon
                      7:  *     -LINEWIDTH sets width of line in which to columnate(default 80)
                      8:  *     -t suppresses expanding multiple blanks into tabs
                      9:  *
                     10:  */
                     11: #include       <stdio.h>
                     12: #ifdef JERQ
                     13: #include       <sgtty.h>
                     14: #include       "/usr/jerq/include/jioctl.h"
                     15: #endif
                     16: #define WIDTH          80
                     17: #define NWALLOC                1024
                     18: #define NALLOC         4096
                     19: int linewidth=WIDTH;
                     20: int colonflag=0;
                     21: int tabflag=1;
                     22: char *cbuf, *cbufp;
                     23: char **word;
                     24: FILE *file;
                     25: char *malloc();
                     26: char *realloc();
                     27: int maxwidth=0;
                     28: int nalloc=NALLOC;
                     29: int nwalloc=NWALLOC;
                     30: int nchars=0;
                     31: int nwords=0;
                     32: 
                     33: main(argc, argv)
                     34:        char *argv[];
                     35: {
                     36:        FILE *fopen();
                     37:        register i;
                     38:        char buf[BUFSIZ];
                     39: #ifdef JERQ
                     40:        struct winsize wbuf;
                     41: 
                     42:        if(ioctl(1, JWINSIZE, &wbuf)==0){
                     43:                linewidth=wbuf.bytesx;
                     44:                if(linewidth<0)
                     45:                        linewidth=WIDTH;
                     46:        }
                     47: #endif
                     48:        while(argc>1 && argv[1][0]=='-'){
                     49:                --argc; argv++;
                     50:                switch(argv[0][1]){
                     51:                case '\0':
                     52:                        colonflag=1;
                     53:                        break;
                     54:                case 't':
                     55:                        tabflag=0;
                     56:                        break;
                     57:                default:
                     58:                        linewidth=atoi(&argv[0][1]);
                     59:                        if(linewidth<=1)
                     60:                                linewidth=WIDTH;
                     61:                        break;
                     62:                }
                     63:        }
                     64:        setbuf(stdout, buf);
                     65:        cbuf=cbufp=malloc(NALLOC);
                     66:        word=(char **)malloc(NWALLOC *(sizeof *word));
                     67:        if(word==0 || cbuf==0)
                     68:                error("out of memory");
                     69:        if(argc==1){
                     70:                file=stdin;
                     71:                readbuf();
                     72:        }else{
                     73:                for(i=1; i<argc; i++){
                     74:                        file=freopen(*++argv, "r", stdin);
                     75:                        if(file==NULL)
                     76:                                fprintf(stderr, "mc: can't open %s\n", *argv);
                     77:                        else
                     78:                                readbuf();
                     79:                }
                     80:        }
                     81:        columnate();
                     82:        exit(0);
                     83: }
                     84: error(s)
                     85:        char *s;
                     86: {
                     87:        fprintf(stderr, "mc: %s\n", s);
                     88:        exit(1);
                     89: }
                     90: readbuf()
                     91: {
                     92:        register c, lastwascolon=0;
                     93:        int linesiz = 0;
                     94:        do{
                     95:                if(nchars++>=nalloc)
                     96:                        morechars();
                     97:                *cbufp++=c=getc(file);
                     98:                linesiz++;
                     99:                if(c=='\t') {
                    100:                        cbufp[-1] = ' ';
                    101:                        while(linesiz%8 != 0) {
                    102:                                if(nchars++>=nalloc)
                    103:                                        morechars();
                    104:                                *cbufp++ = ' ';
                    105:                                linesiz++;
                    106:                        }
                    107:                }
                    108:                if(colonflag && c==':')
                    109:                        lastwascolon++;
                    110:                else if(lastwascolon){
                    111:                        if(c=='\n'){
                    112:                                register n=1;
                    113:                                --nchars;       /* skip newline */
                    114:                                while(nchars>0 && cbuf[--nchars]!='\n')
                    115:                                        n++;
                    116:                                if(cbuf[nchars]=='\n')
                    117:                                        nchars++;
                    118:                                columnate();
                    119:                                if (nchars)
                    120:                                        putchar('\n');
                    121:                                fwrite(cbuf+nchars, 1, n, stdout);
                    122:                                nchars=0;
                    123:                                cbufp=cbuf;
                    124:                        }
                    125:                        lastwascolon=0;
                    126:                }
                    127:                if(c=='\n')
                    128:                        linesiz = 0;
                    129:        }while(c!=EOF);
                    130: }
                    131: scanwords(){
                    132:        register char *p, *q;
                    133:        register i;
                    134:        nwords=0;
                    135:        maxwidth=0;
                    136:        for(p=q=cbuf, i=0; i<nchars; i++){
                    137:                if(*p++=='\n'){
                    138:                        if(nwords>=nwalloc){
                    139:                                if((word=(char **)realloc((char *)word, (nwalloc+=NWALLOC)*sizeof(*word)))==0)
                    140:                                        error("out of memory");
                    141:                        }
                    142:                        word[nwords++]=q;
                    143:                        p[-1]=0;
                    144:                        if(p-q>maxwidth)
                    145:                                maxwidth=p-q;
                    146:                        q=p;
                    147:                }
                    148:        }
                    149: }
                    150: int words_per_line;
                    151: int nlines;
                    152: int col;
                    153: int tabcol;
                    154: int endcol;
                    155: int maxcol;
                    156: columnate(){
                    157:        register char *p;
                    158:        register i, j;
                    159:        scanwords();
                    160:        if(nwords==0)
                    161:                return;
                    162:        words_per_line=linewidth/maxwidth;
                    163:        if(words_per_line<=0)
                    164:                words_per_line=1;
                    165:        nlines=(nwords+words_per_line-1)/words_per_line;
                    166:        for(i=0; i<nlines; i++){
                    167:                col=0;
                    168:                endcol=0;
                    169:                for(j=0; i+j<nwords; ){
                    170:                        endcol+=maxwidth;
                    171:                        p=word[i+j];
                    172:                        while(*p){
                    173:                                putchar(*p++);
                    174:                                col++;
                    175:                        }
                    176:                        if(i+(j+=nlines)<nwords){
                    177:                                tabcol=(col|07)+1;
                    178:                                if(tabflag)
                    179:                                        while(tabcol<=endcol){
                    180:                                                putchar('\t');
                    181:                                                col=tabcol;
                    182:                                                tabcol+=8;
                    183:                                        }
                    184:                                while(col<endcol){
                    185:                                        putchar(' ');
                    186:                                        col++;
                    187:                                }
                    188:                        }
                    189:                }
                    190:                putchar('\n');
                    191:        }
                    192: }
                    193: 
                    194: morechars()
                    195: {
                    196:        if((cbuf=realloc(cbuf, nalloc+=NALLOC))==0)
                    197:                error("out of memory");
                    198:        cbufp=cbuf+nchars-1;
                    199: }

unix.superglobalmegacorp.com

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