Annotation of 43BSDReno/contrib/mh/sbr/cpydgst.c, revision 1.1.1.1

1.1       root        1: /* cpydgst.c - copy from one fd to another in encapsulating mode */
                      2: 
                      3: #include "../h/mh.h"
                      4: #include <stdio.h>
                      5: 
                      6: 
                      7: /* All we want to do is to perform the substitution
                      8: 
                      9:        \n(-.*)\n       -->     \n- \1\n
                     10: 
                     11:     we could use
                     12: 
                     13:        sed -e 's%^-%- -%' < ifile > ofile
                     14: 
                     15:     to do this, but the routine below is faster than the pipe, fork, and
                     16:     exec.
                     17:  */
                     18: 
                     19: #define        S1      0
                     20: #define        S2      1
                     21: 
                     22: #define        output(c)   if (bp >= dp) {flush(); *bp++ = c;} else *bp++ = c
                     23: #define        flush()     if ((j = bp - outbuf) && write (out, outbuf, j) != j) \
                     24:                        adios (ofile, "error writing"); \
                     25:                    else \
                     26:                        bp = outbuf
                     27: 
                     28: /*  */
                     29: 
                     30: void cpydgst (in, out, ifile, ofile)
                     31: register int    in,
                     32:                 out;
                     33: register char  *ifile,
                     34:                *ofile;
                     35: {
                     36:     register int    i,
                     37:                     state;
                     38:     register char  *cp,
                     39:                    *ep;
                     40:     char    buffer[BUFSIZ];
                     41:     register int    j;
                     42:     register char  *bp,
                     43:                    *dp;
                     44:     char    outbuf[BUFSIZ];
                     45: 
                     46:     dp = (bp = outbuf) + sizeof outbuf;
                     47:     for (state = S1; (i = read (in, buffer, sizeof buffer)) > 0;)
                     48:        for (ep = (cp = buffer) + i; cp < ep; cp++) {
                     49:            if (*cp == NULL)
                     50:                continue;
                     51:            switch (state) {
                     52:                case S1: 
                     53:                    if (*cp == '-') {
                     54:                        output ('-');
                     55:                        output (' ');
                     56:                    }
                     57:                    state = S2; /* fall */
                     58: 
                     59:                case S2: 
                     60:                    output (*cp);
                     61:                    if (*cp == '\n')
                     62:                        state = S1;
                     63:                    break;
                     64:            }
                     65:        }
                     66: 
                     67:     if (i == NOTOK)
                     68:        adios (ifile, "error reading");
                     69:     flush ();
                     70: }

unix.superglobalmegacorp.com

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