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