annotate sbr/cpydgst.c @ 12:441a2190cfae

Lion fix
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 21 Apr 2012 13:10:49 +0900
parents bce86c4163a3
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1 /* cpydgst.c - copy from one fd to another in encapsulating mode */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2 #ifndef lint
12
441a2190cfae Lion fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
3 static char ident[] = "@(#)$Id: cpydgst.c,v 1.1.1.1 2005/04/18 14:46:06 kono Exp $";
0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
4 #endif /* lint */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
5
bce86c4163a3 Initial revision
kono
parents:
diff changeset
6 #include "../h/mh.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
7 #include <stdio.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
8
bce86c4163a3 Initial revision
kono
parents:
diff changeset
9
bce86c4163a3 Initial revision
kono
parents:
diff changeset
10 /* All we want to do is to perform the substitution
bce86c4163a3 Initial revision
kono
parents:
diff changeset
11
bce86c4163a3 Initial revision
kono
parents:
diff changeset
12 \n(-.*)\n --> \n- \1\n
bce86c4163a3 Initial revision
kono
parents:
diff changeset
13
bce86c4163a3 Initial revision
kono
parents:
diff changeset
14 we could use
bce86c4163a3 Initial revision
kono
parents:
diff changeset
15
bce86c4163a3 Initial revision
kono
parents:
diff changeset
16 sed -e 's%^-%- -%' < ifile > ofile
bce86c4163a3 Initial revision
kono
parents:
diff changeset
17
bce86c4163a3 Initial revision
kono
parents:
diff changeset
18 to do this, but the routine below is faster than the pipe, fork, and
bce86c4163a3 Initial revision
kono
parents:
diff changeset
19 exec.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
20 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
21
bce86c4163a3 Initial revision
kono
parents:
diff changeset
22 #define S1 0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
23 #define S2 1
bce86c4163a3 Initial revision
kono
parents:
diff changeset
24
bce86c4163a3 Initial revision
kono
parents:
diff changeset
25 #define output(c) if (bp >= dp) {flush(); *bp++ = c;} else *bp++ = c
bce86c4163a3 Initial revision
kono
parents:
diff changeset
26 #define flush() if ((j = bp - outbuf) && write (out, outbuf, j) != j) \
bce86c4163a3 Initial revision
kono
parents:
diff changeset
27 adios (ofile, "error writing"); \
bce86c4163a3 Initial revision
kono
parents:
diff changeset
28 else \
bce86c4163a3 Initial revision
kono
parents:
diff changeset
29 bp = outbuf
bce86c4163a3 Initial revision
kono
parents:
diff changeset
30
bce86c4163a3 Initial revision
kono
parents:
diff changeset
31 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
32
bce86c4163a3 Initial revision
kono
parents:
diff changeset
33 void cpydgst (in, out, ifile, ofile)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
34 register int in,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
35 out;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
36 register char *ifile,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
37 *ofile;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
38 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
39 register int i,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
40 state;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
41 register char *cp,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
42 *ep;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
43 char buffer[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
44 register int j;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
45 register char *bp,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
46 *dp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
47 char outbuf[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
48
bce86c4163a3 Initial revision
kono
parents:
diff changeset
49 dp = (bp = outbuf) + sizeof outbuf;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
50 for (state = S1; (i = read (in, buffer, sizeof buffer)) > 0;)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
51 for (ep = (cp = buffer) + i; cp < ep; cp++) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
52 if (*cp == '\0')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
53 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
54 switch (state) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
55 case S1:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
56 if (*cp == '-') {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
57 output ('-');
bce86c4163a3 Initial revision
kono
parents:
diff changeset
58 output (' ');
bce86c4163a3 Initial revision
kono
parents:
diff changeset
59 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
60 state = S2; /* fall */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
61
bce86c4163a3 Initial revision
kono
parents:
diff changeset
62 case S2:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
63 output (*cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
64 if (*cp == '\n')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
65 state = S1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
66 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
67 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
68 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
69
bce86c4163a3 Initial revision
kono
parents:
diff changeset
70 if (i == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
71 adios (ifile, "error reading");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
72 flush ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
73 }