|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.