Revision 12455,
1.3 KB
checked in by danw, 26 years ago
(diff) |
This commit was generated by cvs2svn to compensate for changes in r12454,
which included commits to RCS files with non-trunk default branches.
|
Line | |
---|
1 | |
---|
2 | /* |
---|
3 | * cpydgst.c -- copy from one fd to another in encapsulating mode |
---|
4 | * -- (do dashstuffing of input data). |
---|
5 | * |
---|
6 | * $Id: cpydgst.c,v 1.1.1.1 1999-02-07 18:14:08 danw Exp $ |
---|
7 | */ |
---|
8 | |
---|
9 | #include <h/mh.h> |
---|
10 | |
---|
11 | /* |
---|
12 | * We want to perform the substitution |
---|
13 | * |
---|
14 | * \n(-.*)\n --> \n- \1\n |
---|
15 | * |
---|
16 | * This is equivalent to the sed substitution |
---|
17 | * |
---|
18 | * sed -e 's%^-%- -%' < ifile > ofile |
---|
19 | * |
---|
20 | * but the routine below is faster than the pipe, fork, and exec. |
---|
21 | */ |
---|
22 | |
---|
23 | #define S1 0 |
---|
24 | #define S2 1 |
---|
25 | |
---|
26 | #define output(c) if (bp >= dp) {flush(); *bp++ = c;} else *bp++ = c |
---|
27 | #define flush() if ((j = bp - outbuf) && write (out, outbuf, j) != j) \ |
---|
28 | adios (ofile, "error writing"); \ |
---|
29 | else \ |
---|
30 | bp = outbuf |
---|
31 | |
---|
32 | |
---|
33 | void |
---|
34 | cpydgst (int in, int out, char *ifile, char *ofile) |
---|
35 | { |
---|
36 | register int i, j, state; |
---|
37 | register char *cp, *ep; |
---|
38 | register char *bp, *dp; |
---|
39 | char buffer[BUFSIZ], outbuf[BUFSIZ]; |
---|
40 | |
---|
41 | dp = (bp = outbuf) + sizeof outbuf; |
---|
42 | for (state = S1; (i = read (in, buffer, sizeof buffer)) > 0;) |
---|
43 | for (ep = (cp = buffer) + i; cp < ep; cp++) { |
---|
44 | if (*cp == '\0') |
---|
45 | continue; |
---|
46 | switch (state) { |
---|
47 | case S1: |
---|
48 | if (*cp == '-') { |
---|
49 | output ('-'); |
---|
50 | output (' '); |
---|
51 | } |
---|
52 | state = S2; /* fall */ |
---|
53 | |
---|
54 | case S2: |
---|
55 | output (*cp); |
---|
56 | if (*cp == '\n') |
---|
57 | state = S1; |
---|
58 | break; |
---|
59 | } |
---|
60 | } |
---|
61 | |
---|
62 | if (i == -1) |
---|
63 | adios (ifile, "error reading"); |
---|
64 | flush(); |
---|
65 | } |
---|
Note: See
TracBrowser
for help on using the repository browser.