source: trunk/third/nmh/sbr/cpydgst.c @ 12455

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
33void
34cpydgst (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.