Annotation of coherent/g/usr/bin/vi/qiot, revision 1.1.1.1

1.1       root        1: fmt.c000644 000003 000003 00000011727 05225061120 011411 0ustar00binbin000377 000377 /* fmt.c */
                      2: 
                      3: /* usage: fmt [-width] [files]...
                      4:  *
                      5:  * Fmt rearrages text in order to make each line have roughly the
                      6:  * same width.  Indentation and word spacing is preserved.
                      7:  *
                      8:  * The default width is 72 characters, but you can override that via -width.
                      9:  * If no files are given on the command line, then it reads stdin.
                     10:  */
                     11: 
                     12: #include <stdio.h>
                     13: #include <ctype.h>
                     14: 
                     15: #ifndef TRUE
                     16: # define TRUE  1
                     17: # define FALSE 0
                     18: #endif
                     19: 
                     20: 
                     21: 
                     22: int    width = 72;     /* the desired line width */
                     23: int    isblank;        /* is the current output line blank? */
                     24: int    indent;         /* width of the indentation */
                     25: char   ind[512];       /* indentation text */
                     26: char   word[1024];     /* word buffer */
                     27: 
                     28: /* This function displays a usage message and quits */
                     29: void usage()
                     30: {
                     31:        fprintf(stderr, "usage: fmt [-width] [files]...\n");
                     32:        exit(2);
                     33: }
                     34: 
                     35: 
                     36: 
                     37: /* This function outputs a single word.  It takes care of spacing and the
                     38:  * newlines within a paragraph.
                     39:  */
                     40: void putword()
                     41: {
                     42:        int             i;              /* index into word[], or whatever */
                     43:        int             ww;             /* width of the word */
                     44:        int             sw;             /* width of spacing after word */
                     45:        static int      psw;            /* space width of previous word */
                     46:        static int      tab;            /* the width of text already written */
                     47: 
                     48: 
                     49:        /* separate the word and its spacing */
                     50:        for (ww = 0; word[ww] && !isspace(word[ww]); ww++)
                     51:        {
                     52:        }
                     53:        sw = strlen(word) - ww;
                     54:        word[ww] = '\0';
                     55: 
                     56:        /* if no spacing (that is, the word was at the end of the line) then
                     57:         * assume 1 space unless the last char of the word was punctuation
                     58:         */
                     59:        if (sw == 0)
                     60:        {
                     61:                sw = 1;
                     62:                if (word[ww - 1] == '.' || word[ww - 1] == '?' || word[ww - 1] == '!')
                     63:                        sw = 2;
                     64:        }
                     65: 
                     66:        /* if this is the first word on the line... */
                     67:        if (isblank)
                     68:        {
                     69:                /* output the indentation first */
                     70:                fputs(ind, stdout);
                     71:                tab = indent;
                     72:        }
                     73:        else /* text has already been written to this output line */
                     74:        {
                     75:                /* will the word fit on this line? */
                     76:                if (psw + ww + tab <= width)
                     77:                {
                     78:                        /* yes - so write the previous word's spacing */
                     79:                        for (i = 0; i < psw; i++)
                     80:                        {
                     81:                                putchar(' ');
                     82:                        }
                     83:                        tab += psw;
                     84:                }
                     85:                else
                     86:                {
                     87:                        /* no, so write a newline and the indentation */
                     88:                        putchar('\n');
                     89:                        fputs(ind, stdout);
                     90:                        tab = indent;
                     91:                }
                     92:        }
                     93: 
                     94:        /* write the word itself */
                     95:        fputs(word, stdout);
                     96:        tab += ww;
                     97: 
                     98:        /* remember this word's spacing */
                     99:        psw = sw;
                    100: 
                    101:        /* this output line isn't blank anymore. */
                    102:        isblank = FALSE;
                    103: }
                    104: 
                    105: 
                    106: 
                    107: /* This function reformats text. */
                    108: void fmt(in)
                    109:        FILE    *in;            /* the input stream */
                    110: {
                    111:        int     ch;             /* character from input stream */
                    112:        int     prevch;         /* the previous character in the loop */
                    113:        int     i;              /* index into ind[] or word[] */
                    114:        int     inword;         /* boolean: are we between indent & newline? */
                    115: 
                    116: 
                    117:        /* for each character in the stream... */
                    118:        for (indent = -1, isblank = TRUE, inword = FALSE, i = 0, prevch = '\n';
                    119:             (ch = getc(in)) != EOF;
                    120:             prevch = ch)
                    121:        {
                    122:                /* is this the end of a line? */
                    123:                if (ch == '\n')
                    124:                {
                    125:                        /* if end of last word in the input line */
                    126:                        if (inword)
                    127:                        {
                    128:                                /* if it really is a word */
                    129:                                if (i > 0)
                    130:                                {
                    131:                                        /* output it */
                    132:                                        word[i] = '\0';
                    133:                                        putword();
                    134:                                }
                    135:                        }
                    136:                        else /* blank line in input */
                    137:                        {
                    138:                                /* finish the previous paragraph */
                    139:                                if (!isblank)
                    140:                                {
                    141:                                        putchar('\n');
                    142:                                        isblank = TRUE;
                    143:                                }
                    144: 
                    145:                                /* output a blank line */
                    146:                                putchar('\n');
                    147:                        }
                    148: 
                    149:                        /* continue with next input line... */
                    150:                        indent = -1;
                    151:                        i = 0;
                    152:                        inword = FALSE;
                    153:                        continue;
                    154:                }
                    155: 
                    156:                /* if we're expecting indentation now... */
                    157:                if (indent < 0)
                    158:                {
                    159:                        /* if this is part of the indentation... */
                    160:                        if (isspace(ch))
                    161:                        {
                    162:                                /* remember it */
                    163:                                ind[i++] = ch;
                    164:                        }
                    165:                        else /* end of indentation */
                    166:                        {
                    167:                                /* mark the end of the indentation string */
                    168:                                ind[i] = '\0';
                    169: 
                    170:                                /* calculate the width of the indentation */
                    171:                                for (i = indent = 0; ind[i]; i++)
                    172:                                {
                    173:                                        if (ind[i] == '\t')
                    174:                                                indent = (indent | 7) + 1;
                    175:                                        else
                    176:                                                indent++;
                    177:                                }
                    178: 
                    179:                                /* reset the word index */
                    180:                                i = 0;
                    181: 
                    182:                                /* reprocess that last character */
                    183:                                ungetc(ch, in);
                    184:                        }
                    185: 
                    186:                        /* continue in the for-loop */
                    187:                        continue;
                    188:                }
                    189: 
                    190:                /* if we get here, we're either in a word or in the space
                    191:                 * after a word.
                    192:                 */
                    193:                inword = TRUE;
                    194: 
                    195:                /* is this the start of a new word? */
                    196:                if (!isspace(ch) && isspace(prevch))
                    197:                {
                    198:                        /* yes!  output the previous word */
                    199:                        word[i] = '\0';
                    200:                        putword();
                    201: 
                    202:                        /* reset `i' to the start of the word[] buffer */
                    203:                        i = 0;
                    204:                }
                    205:                word[i++] = ch;
                    206:        }
                    207: 
                    208:        /* if necessary, write a final newline */
                    209:        if (!isblank)
                    210:        {
                    211:                putchar('\n');
                    212:                isblank = TRUE;
                    213:        }
                    214: }
                    215: 
                    216: 
                    217: 
                    218: 
                    219: 
                    220: int main(argc, argv)
                    221:        int     argc;
                    222:        char    **argv;
                    223: {
                    224:        FILE    *in;    /* an input stream */
                    225:        int     error;  /* if non-zero, then an error occurred */
                    226:        int     i;
                    227: 
                    228: 
                    229:        /* handle the -width flag, if given */
                    230:        if (argc > 1 && argv[1][0] == '-')
                    231:        {
                    232:                width = atoi(argv[1] + 1);
                    233:                if (width <= 0)
                    234:                {
                    235:                        usage();
                    236:                }
                    237:                argc--;
                    238:                argv++;
                    239:        }
                    240: 
                    241:        /* if no filenames given, then process stdin */
                    242:        if (argc == 1)
                    243:        {
                    244:                fmt(stdin);
                    245:        }
                    246:        else /* one or more filenames given */
                    247:        {
                    248:                for (error = 0, i = 1; i < argc; i++)
                    249:                {
                    250:                        in = fopen(argv[i], "r");
                    251:                        if (!in)
                    252:                        {
                    253:                                perror(argv[i]);
                    254:                                error = 3;
                    255:                        }
                    256:                        else
                    257:                        {
                    258:                                fmt(in);
                    259:                                fclose(in);
                    260:                        }
                    261:                }
                    262:        }
                    263: 
                    264:        /* exit, possibly indicating an error */
                    265:        exit(error);
                    266:        /*NOTREACHED*/
                    267: }
                    268: 

unix.superglobalmegacorp.com

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