annotate uip/scansbr.c @ 0:bce86c4163a3

Initial revision
author kono
date Mon, 18 Apr 2005 23:46:02 +0900
parents
children 441a2190cfae
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1 /* scansbr.c - routines to help scan along... */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2 #ifndef lint
bce86c4163a3 Initial revision
kono
parents:
diff changeset
3 static char ident[] = "@(#)$Id$";
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 "../h/addrsbr.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
8 #include "../h/formatsbr.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
9 #include "../h/scansbr.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
10 #include "../zotnet/tws.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
11 #include <stdio.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
12 #include <ctype.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
13 #include <sys/types.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
14 #include <sys/stat.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
15
bce86c4163a3 Initial revision
kono
parents:
diff changeset
16 #ifdef FILE__PTR
bce86c4163a3 Initial revision
kono
parents:
diff changeset
17 #define _ptr __ptr
bce86c4163a3 Initial revision
kono
parents:
diff changeset
18 #define _cnt __cnt
bce86c4163a3 Initial revision
kono
parents:
diff changeset
19 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
20
bce86c4163a3 Initial revision
kono
parents:
diff changeset
21 #ifdef _FSTDIO
bce86c4163a3 Initial revision
kono
parents:
diff changeset
22 #define _ptr _p /* Gag */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
23 #define _cnt _w /* Wretch */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
24 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
25
bce86c4163a3 Initial revision
kono
parents:
diff changeset
26 #define MAXSCANL 256 /* longest possible scan line */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
27 #define SBUFSIZ 512 /* buffer size for content part of header
bce86c4163a3 Initial revision
kono
parents:
diff changeset
28 * fields. We want this to be large
bce86c4163a3 Initial revision
kono
parents:
diff changeset
29 * enough so that we don't do a lot of
bce86c4163a3 Initial revision
kono
parents:
diff changeset
30 * extra FLDPLUS calls on m_getfld but
bce86c4163a3 Initial revision
kono
parents:
diff changeset
31 * small enough so that we don't snarf
bce86c4163a3 Initial revision
kono
parents:
diff changeset
32 * the entire message body when we're
bce86c4163a3 Initial revision
kono
parents:
diff changeset
33 * only going to display 30 characters
bce86c4163a3 Initial revision
kono
parents:
diff changeset
34 * of it.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
35 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
36
bce86c4163a3 Initial revision
kono
parents:
diff changeset
37 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
38
bce86c4163a3 Initial revision
kono
parents:
diff changeset
39 static struct format *fmt;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
40 #ifdef JLR
bce86c4163a3 Initial revision
kono
parents:
diff changeset
41 static struct format *fmt_top;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
42 #endif /* JLR */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
43
bce86c4163a3 Initial revision
kono
parents:
diff changeset
44 static struct comp *datecomp; /* pntr to "date" comp */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
45 static struct comp *bodycomp; /* pntr to "body" pseudo-comp
bce86c4163a3 Initial revision
kono
parents:
diff changeset
46 * (if referenced) */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
47 static int ncomps = 0; /* # of interesting components */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
48 static char **compbuffers = 0; /* buffers for component text */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
49 static struct comp **used_buf = 0; /* stack for comp that use buffers */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
50
bce86c4163a3 Initial revision
kono
parents:
diff changeset
51 char *scanl = 0; /* text of most recent scanline */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
52
bce86c4163a3 Initial revision
kono
parents:
diff changeset
53 static int dat[5]; /* aux. data for format routine */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
54
bce86c4163a3 Initial revision
kono
parents:
diff changeset
55 #ifdef RPATHS
bce86c4163a3 Initial revision
kono
parents:
diff changeset
56 char *unixline (); /* info from UNIX From: line */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
57 #endif /* RPATHS */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
58
bce86c4163a3 Initial revision
kono
parents:
diff changeset
59 #define FPUTS(buf) {\
bce86c4163a3 Initial revision
kono
parents:
diff changeset
60 if (mh_fputs(buf,scnout) == EOF)\
bce86c4163a3 Initial revision
kono
parents:
diff changeset
61 adios (scnmsg, "write error on");\
bce86c4163a3 Initial revision
kono
parents:
diff changeset
62 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
63
bce86c4163a3 Initial revision
kono
parents:
diff changeset
64 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
65
bce86c4163a3 Initial revision
kono
parents:
diff changeset
66 /* ARGSUSED */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
67
bce86c4163a3 Initial revision
kono
parents:
diff changeset
68 int scan (inb, innum, outnum, nfs, width, curflg, unseen,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
69 hdrflg, folder, size, noisy)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
70 char *nfs,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
71 *folder;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
72 int innum,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
73 outnum,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
74 width,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
75 curflg,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
76 unseen,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
77 hdrflg,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
78 noisy;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
79 long size;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
80 register FILE *inb;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
81 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
82 int compnum,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
83 encrypted,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
84 state;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
85 register int i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
86 register char *cp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
87 register struct comp *cptr;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
88 register char *tmpbuf;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
89 register char **nxtbuf;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
90 register struct comp **savecomp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
91 char *scnmsg;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
92 FILE *scnout;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
93 char name[NAMESZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
94 static int rlwidth,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
95 slwidth;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
96
bce86c4163a3 Initial revision
kono
parents:
diff changeset
97 /* first-time only initialization */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
98 if (scanl == NULLCP) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
99 int bigwid;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
100
bce86c4163a3 Initial revision
kono
parents:
diff changeset
101 if (width == 0) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
102 if ((width = sc_width ()) < WIDTH/2)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
103 width = WIDTH/2;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
104 else if (width > MAXSCANL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
105 width = MAXSCANL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
106 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
107 dat[3] = slwidth = width;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
108 if ((scanl = (char *)malloc( (unsigned) (slwidth + 2) )) == (char *)0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
109 adios (NULLCP, "unable to malloc scan line (%d bytes)", slwidth+2);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
110 if (outnum)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
111 (void) umask( ~ m_gmprot() );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
112
bce86c4163a3 Initial revision
kono
parents:
diff changeset
113 ncomps = fmt_compile (nfs, &fmt) + 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
114 #ifdef JLR
bce86c4163a3 Initial revision
kono
parents:
diff changeset
115 fmt_top = fmt;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
116 #endif /* JLR */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
117 FINDCOMP(bodycomp, "body");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
118 FINDCOMP(datecomp, "date");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
119 FINDCOMP(cptr, "folder");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
120 if (cptr && folder) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
121 cptr->c_text = folder;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
122 cptr->c_flags = hdrflg;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
123 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
124 FINDCOMP(cptr, "encrypted");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
125 if (!cptr)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
126 if (cptr = (struct comp *) calloc (1, sizeof *cptr)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
127 cptr -> c_name = "encrypted";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
128 cptr -> c_next = wantcomp[i = CHASH (cptr -> c_name)];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
129 wantcomp[i] = cptr;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
130 ncomps++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
131 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
132 FINDCOMP (cptr, "dtimenow");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
133 if (cptr)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
134 cptr->c_text = getcpy(dtimenow ());
bce86c4163a3 Initial revision
kono
parents:
diff changeset
135 nxtbuf = compbuffers = (char **)calloc((unsigned) ncomps,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
136 sizeof(char *));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
137 if (nxtbuf == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
138 adios (NULLCP, "unable to allocate component buffers");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
139 used_buf = (struct comp **)calloc((unsigned) (ncomps+1),
bce86c4163a3 Initial revision
kono
parents:
diff changeset
140 sizeof(struct comp *));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
141 if (used_buf == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
142 adios (NULLCP, "unable to allocate component buffer stack");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
143 used_buf += ncomps+1; *--used_buf = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
144 rlwidth = bodycomp && (width > SBUFSIZ) ? width : SBUFSIZ;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
145 for (i = ncomps; i--; )
bce86c4163a3 Initial revision
kono
parents:
diff changeset
146 if ((*nxtbuf++ = malloc( rlwidth )) == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
147 adios (NULLCP, "unable to allocate component buffer");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
148 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
149 /* each-message initialization */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
150 nxtbuf = compbuffers;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
151 savecomp = used_buf;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
152 tmpbuf = *nxtbuf++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
153 dat[0] = innum ? innum : outnum;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
154 dat[1] = curflg;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
155 dat[4] = unseen;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
156
bce86c4163a3 Initial revision
kono
parents:
diff changeset
157 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
158 * get the first field. If the msg is non-empty and we're doing
bce86c4163a3 Initial revision
kono
parents:
diff changeset
159 * an "inc", open the output file.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
160 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
161 if ((state = m_getfld (FLD, name, tmpbuf, rlwidth, inb)) == FILEEOF)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
162 if (ferror(inb)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
163 advise("read", "unable to"); /* "read error" */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
164 return SCNFAT;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
165 } else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
166 return SCNEOF;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
167
bce86c4163a3 Initial revision
kono
parents:
diff changeset
168 if (outnum) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
169 if (outnum > 0) { /* Fix from Van -- I'm not sure why... */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
170 scnmsg = m_name (outnum);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
171 if (*scnmsg == '?') /* msg num out of range */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
172 return SCNNUM;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
173 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
174 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
175 scnmsg = "/dev/null";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
176 if ((scnout = fopen (scnmsg, "w")) == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
177 adios (scnmsg, "unable to write");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
178 #ifdef RPATHS
bce86c4163a3 Initial revision
kono
parents:
diff changeset
179 if ((cp = unixline ()) && *cp != '\n') {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
180 FPUTS ("Return-Path: ");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
181 FPUTS (cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
182 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
183 #endif /* RPATHS */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
184 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
185
bce86c4163a3 Initial revision
kono
parents:
diff changeset
186 /* scan - main loop */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
187 for (compnum = 1; ; state = m_getfld (state, name, tmpbuf, rlwidth, inb)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
188 switch (state) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
189 case FLD:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
190 case FLDPLUS:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
191 compnum++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
192 if (outnum) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
193 FPUTS (name);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
194 if (putc (':', scnout) == EOF)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
195 adios (scnmsg, "write error on");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
196 FPUTS (tmpbuf);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
197 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
198 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
199 * if we're interested in this component, save a pointer
bce86c4163a3 Initial revision
kono
parents:
diff changeset
200 * to the component text, then start using our next free
bce86c4163a3 Initial revision
kono
parents:
diff changeset
201 * buffer as the component temp buffer (buffer switching
bce86c4163a3 Initial revision
kono
parents:
diff changeset
202 * saves an extra copy of the component text).
bce86c4163a3 Initial revision
kono
parents:
diff changeset
203 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
204 if (cptr = wantcomp[CHASH(name)])
bce86c4163a3 Initial revision
kono
parents:
diff changeset
205 do {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
206 if (uleq(name, cptr->c_name)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
207 if (! cptr->c_text) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
208 #ifdef JAPAN
bce86c4163a3 Initial revision
kono
parents:
diff changeset
209 (void) ml_conv(tmpbuf);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
210 #endif /* JAPAN */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
211 cptr->c_text = tmpbuf;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
212 for (cp = tmpbuf + strlen (tmpbuf) - 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
213 cp >= tmpbuf; cp--)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
214 if (isspace (*cp & 0xff))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
215 *cp = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
216 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
217 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
218 *--savecomp = cptr;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
219 tmpbuf = *nxtbuf++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
220 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
221 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
222 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
223 } while (cptr = cptr->c_next);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
224
bce86c4163a3 Initial revision
kono
parents:
diff changeset
225 while (state == FLDPLUS) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
226 state = m_getfld (state, name, tmpbuf, rlwidth, inb);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
227 if (outnum)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
228 FPUTS (tmpbuf);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
229 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
230 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
231
bce86c4163a3 Initial revision
kono
parents:
diff changeset
232 case BODY:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
233 compnum = -1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
234 if (! outnum) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
235 state = FILEEOF; /* stop now if scan cmd */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
236 goto finished;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
237 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
238 if (putc ('\n', scnout) == EOF)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
239 adios (scnmsg, "write error on");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
240 FPUTS (tmpbuf);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
241 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
242 * performance hack: some people like to run "inc" on
bce86c4163a3 Initial revision
kono
parents:
diff changeset
243 * things like net.sources or large digests. We do a
bce86c4163a3 Initial revision
kono
parents:
diff changeset
244 * copy directly into the output buffer rather than
bce86c4163a3 Initial revision
kono
parents:
diff changeset
245 * going through an intermediate buffer.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
246 *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
247 * We need the amount of data m_getfld found & don't
bce86c4163a3 Initial revision
kono
parents:
diff changeset
248 * want to do a strlen on the long buffer so there's
bce86c4163a3 Initial revision
kono
parents:
diff changeset
249 * a hack in m_getfld to save the amount of data it
bce86c4163a3 Initial revision
kono
parents:
diff changeset
250 * returned in the global "msg_count".
bce86c4163a3 Initial revision
kono
parents:
diff changeset
251 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
252 body: ;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
253 while (state == BODY) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
254 #ifdef _STDIO_USES_IOSTREAM
bce86c4163a3 Initial revision
kono
parents:
diff changeset
255 if (scnout->_IO_write_ptr == scnout->_IO_write_end) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
256 #else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
257 if (scnout->_cnt <= 0) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
258 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
259 if (fflush(scnout) == EOF)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
260 adios (scnmsg, "write error on");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
261 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
262 #ifdef _STDIO_USES_IOSTREAM
bce86c4163a3 Initial revision
kono
parents:
diff changeset
263 state = m_getfld(state, name, scnout->_IO_write_ptr,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
264 (long)scnout->_IO_write_ptr-(long)scnout->_IO_write_end,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
265 inb);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
266 scnout->_IO_write_ptr += msg_count;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
267 #else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
268 state = m_getfld( state, name, scnout->_ptr,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
269 -(scnout->_cnt), inb );
bce86c4163a3 Initial revision
kono
parents:
diff changeset
270 scnout->_cnt -= msg_count;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
271 scnout->_ptr += msg_count;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
272 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
273 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
274 goto finished;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
275
bce86c4163a3 Initial revision
kono
parents:
diff changeset
276 case LENERR:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
277 case FMTERR:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
278 fprintf (stderr,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
279 innum ? "??Format error (message %d) in "
bce86c4163a3 Initial revision
kono
parents:
diff changeset
280 : "??Format error in ",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
281 outnum ? outnum : innum);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
282 fprintf (stderr, "component %d\n", compnum);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
283
bce86c4163a3 Initial revision
kono
parents:
diff changeset
284 if (outnum) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
285 FPUTS ("\n\nBAD MSG:\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
286 FPUTS (name);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
287 if (putc ('\n', scnout) == EOF)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
288 adios (scnmsg, "write error on");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
289 state = BODY;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
290 goto body;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
291 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
292 /* fall through */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
293
bce86c4163a3 Initial revision
kono
parents:
diff changeset
294 case FILEEOF:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
295 goto finished;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
296
bce86c4163a3 Initial revision
kono
parents:
diff changeset
297 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
298 adios (NULLCP, "getfld() returned %d", state);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
299 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
300 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
301 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
302 * format and output the scan line.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
303 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
304 finished:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
305 if (ferror(inb)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
306 advise("read", "unable to"); /* "read error" */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
307 return SCNFAT;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
308 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
309 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
310 char *saved_c_text;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
311
bce86c4163a3 Initial revision
kono
parents:
diff changeset
312 if (bodycomp) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
313 /* Save and restore buffer so we don't trash our dynamic pool! */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
314 saved_c_text = bodycomp->c_text;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
315 #ifdef JAPAN
bce86c4163a3 Initial revision
kono
parents:
diff changeset
316 (void) ml_conv(tmpbuf);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
317 #endif /* JAPAN */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
318 bodycomp->c_text = tmpbuf;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
319 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
320
bce86c4163a3 Initial revision
kono
parents:
diff changeset
321 if (size)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
322 dat[2] = size;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
323 else if (outnum > 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
324 if ((dat[2] = ftell(scnout)) == EOF)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
325 adios (scnmsg, "write error on");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
326
bce86c4163a3 Initial revision
kono
parents:
diff changeset
327 if ( (datecomp && ! datecomp->c_text) || (!size && !outnum)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
328 struct stat st;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
329 (void) fstat (fileno(inb), &st);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
330 if (!size && !outnum)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
331 dat[2] = st.st_size;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
332 if (datecomp) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
333 if (! datecomp->c_text) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
334 if (datecomp->c_tws == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
335 datecomp->c_tws = (struct tws *)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
336 calloc((unsigned) 1, sizeof(*datecomp->c_tws));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
337 if (datecomp->c_tws == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
338 adios (NULLCP, "unable to allocate tws buffer");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
339 *datecomp->c_tws = *dlocaltime ((time_t *) &st.st_mtime);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
340 datecomp->c_flags = -1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
341 } else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
342 datecomp->c_flags = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
343 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
344 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
345 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
346 #ifndef JLR
bce86c4163a3 Initial revision
kono
parents:
diff changeset
347 (void) fmtscan (fmt, scanl, slwidth, dat);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
348 #else /* JLR */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
349 fmt = fmtscan (fmt, scanl, slwidth, dat);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
350 if (!fmt)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
351 fmt = fmt_top; /* reset for old format files */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
352 #endif /* JLR */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
353
bce86c4163a3 Initial revision
kono
parents:
diff changeset
354 if (bodycomp)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
355 bodycomp->c_text = saved_c_text;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
356 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
357 if (noisy)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
358 #ifdef JAPAN
bce86c4163a3 Initial revision
kono
parents:
diff changeset
359 ml_fputs (scanl, stdout);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
360 #else /* JAPAN */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
361 (void) fputs (scanl, stdout);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
362 #endif /* JAPAN */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
363
bce86c4163a3 Initial revision
kono
parents:
diff changeset
364 FINDCOMP (cptr, "encrypted");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
365 encrypted = cptr && cptr -> c_text;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
366 /* return dynamically allocated buffers to pool */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
367 while ( cptr = *savecomp++ ) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
368 *--nxtbuf = cptr->c_text;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
369 cptr->c_text = NULLCP;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
370 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
371 *--nxtbuf = tmpbuf;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
372
bce86c4163a3 Initial revision
kono
parents:
diff changeset
373 if (outnum && fclose (scnout) == EOF)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
374 adios (scnmsg, "write error on");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
375
bce86c4163a3 Initial revision
kono
parents:
diff changeset
376 return (state != FILEEOF ? SCNERR : encrypted ? SCNENC : SCNMSG);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
377 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
378
bce86c4163a3 Initial revision
kono
parents:
diff changeset
379 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
380
bce86c4163a3 Initial revision
kono
parents:
diff changeset
381 /* Cheat: we are loaded with adrparse, which wants a routine called
bce86c4163a3 Initial revision
kono
parents:
diff changeset
382 OfficialName(). We call adrparse:getm() with the correct arguments
bce86c4163a3 Initial revision
kono
parents:
diff changeset
383 to prevent OfficialName() from being called. Hence, the following
bce86c4163a3 Initial revision
kono
parents:
diff changeset
384 is to keep the loader happy.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
385 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
386
bce86c4163a3 Initial revision
kono
parents:
diff changeset
387 char *OfficialName (name)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
388 register char *name;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
389 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
390 return name;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
391 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
392
bce86c4163a3 Initial revision
kono
parents:
diff changeset
393 mh_fputs(s, stream)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
394 char *s;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
395 FILE *stream;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
396 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
397 char c;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
398 while(c = *s++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
399 if(putc(c,stream) == EOF )
bce86c4163a3 Initial revision
kono
parents:
diff changeset
400 return(EOF);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
401 return(0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
402 }