|
|
1.1 root 1: static char sccsid[] = "@(#)doscan.c 4.2 (Berkeley) 82/12/03";
2:
3: /* @(#)doscan.c 4.1 (Berkeley) 12/21/80 */
4: #include <stdio.h>
5: #include <ctype.h>
6:
7: #define SPC 01
8: #define STP 02
9:
10: #define SHORT 0
11: #define REGULAR 1
12: #define LONG 2
13: #define INT 0
14: #define FLOAT 1
15:
16: char *_getccl();
17:
18: char _sctab[128] = {
19: 0,0,0,0,0,0,0,0,
20: 0,SPC,SPC,0,0,0,0,0,
21: 0,0,0,0,0,0,0,0,
22: 0,0,0,0,0,0,0,0,
23: SPC,0,0,0,0,0,0,0,
24: 0,0,0,0,0,0,0,0,
25: 0,0,0,0,0,0,0,0,
26: 0,0,0,0,0,0,0,0,
27: };
28:
29: _doscan(iop, fmt, argp)
30: FILE *iop;
31: register char *fmt;
32: register int **argp;
33: {
34: register int ch;
35: int nmatch, len, ch1;
36: int **ptr, fileended, size;
37:
38: nmatch = 0;
39: fileended = 0;
40: for (;;) switch (ch = *fmt++) {
41: case '\0':
42: return (nmatch);
43: case '%':
44: if ((ch = *fmt++) == '%')
45: goto def;
46: ptr = 0;
47: if (ch != '*')
48: ptr = argp++;
49: else
50: ch = *fmt++;
51: len = 0;
52: size = REGULAR;
53: while (isdigit(ch)) {
54: len = len*10 + ch - '0';
55: ch = *fmt++;
56: }
57: if (len == 0)
58: len = 30000;
59: if (ch=='l') {
60: size = LONG;
61: ch = *fmt++;
62: } else if (ch=='h') {
63: size = SHORT;
64: ch = *fmt++;
65: } else if (ch=='[')
66: fmt = _getccl(fmt);
67: if (isupper(ch)) {
68: ch = tolower(ch);
69: size = LONG;
70: }
71: if (ch == '\0')
72: return(-1);
73: if (_innum(ptr, ch, len, size, iop, &fileended) && ptr)
74: nmatch++;
75: if (fileended)
76: return(nmatch? nmatch: -1);
77: break;
78:
79: case ' ':
80: case '\n':
81: case '\t':
82: while ((ch1 = getc(iop))==' ' || ch1=='\t' || ch1=='\n')
83: ;
84: if (ch1 != EOF)
85: ungetc(ch1, iop);
86: break;
87:
88: default:
89: def:
90: ch1 = getc(iop);
91: if (ch1 != ch) {
92: if (ch1==EOF)
93: return(-1);
94: ungetc(ch1, iop);
95: return(nmatch);
96: }
97: }
98: }
99:
100: _innum(ptr, type, len, size, iop, eofptr)
101: int **ptr, *eofptr;
102: struct _iobuf *iop;
103: {
104: extern double atof();
105: register char *np;
106: char numbuf[64];
107: register c, base;
108: int expseen, scale, negflg, c1, ndigit;
109: long lcval;
110:
111: if (type=='c' || type=='s' || type=='[')
112: return(_instr(ptr? *(char **)ptr: (char *)NULL, type, len, iop, eofptr));
113: lcval = 0;
114: ndigit = 0;
115: scale = INT;
116: if (type=='e'||type=='f')
117: scale = FLOAT;
118: base = 10;
119: if (type=='o')
120: base = 8;
121: else if (type=='x')
122: base = 16;
123: np = numbuf;
124: expseen = 0;
125: negflg = 0;
126: while ((c = getc(iop))==' ' || c=='\t' || c=='\n');
127: if (c=='-') {
128: negflg++;
129: *np++ = c;
130: c = getc(iop);
131: len--;
132: } else if (c=='+') {
133: len--;
134: c = getc(iop);
135: }
136: for ( ; --len>=0; *np++ = c, c = getc(iop)) {
137: if (isdigit(c)
138: || base==16 && ('a'<=c && c<='f' || 'A'<=c && c<='F')) {
139: ndigit++;
140: if (base==8)
141: lcval <<=3;
142: else if (base==10)
143: lcval = ((lcval<<2) + lcval)<<1;
144: else
145: lcval <<= 4;
146: c1 = c;
147: if (isdigit(c))
148: c -= '0';
149: else if ('a'<=c && c<='f')
150: c -= 'a'-10;
151: else
152: c -= 'A'-10;
153: lcval += c;
154: c = c1;
155: continue;
156: } else if (c=='.') {
157: if (base!=10 || scale==INT)
158: break;
159: ndigit++;
160: continue;
161: } else if ((c=='e'||c=='E') && expseen==0) {
162: if (base!=10 || scale==INT || ndigit==0)
163: break;
164: expseen++;
165: *np++ = c;
166: c = getc(iop);
167: if (c!='+'&&c!='-'&&('0'>c||c>'9'))
168: break;
169: } else
170: break;
171: }
172: if (negflg)
173: lcval = -lcval;
174: if (c != EOF) {
175: ungetc(c, iop);
176: *eofptr = 0;
177: } else
178: *eofptr = 1;
179: if (ptr==NULL || np==numbuf || (negflg && np==numbuf+1) )/* gene dykes*/
180: return(0);
181: *np++ = 0;
182: switch((scale<<4) | size) {
183:
184: case (FLOAT<<4) | SHORT:
185: case (FLOAT<<4) | REGULAR:
186: **(float **)ptr = atof(numbuf);
187: break;
188:
189: case (FLOAT<<4) | LONG:
190: **(double **)ptr = atof(numbuf);
191: break;
192:
193: case (INT<<4) | SHORT:
194: **(short **)ptr = lcval;
195: break;
196:
197: case (INT<<4) | REGULAR:
198: **(int **)ptr = lcval;
199: break;
200:
201: case (INT<<4) | LONG:
202: **(long **)ptr = lcval;
203: break;
204: }
205: return(1);
206: }
207:
208: _instr(ptr, type, len, iop, eofptr)
209: register char *ptr;
210: register struct _iobuf *iop;
211: int *eofptr;
212: {
213: register ch;
214: register char *optr;
215: int ignstp;
216:
217: *eofptr = 0;
218: optr = ptr;
219: if (type=='c' && len==30000)
220: len = 1;
221: ignstp = 0;
222: if (type=='s')
223: ignstp = SPC;
224: while (_sctab[ch = getc(iop)] & ignstp)
225: if (ch==EOF)
226: break;
227: ignstp = SPC;
228: if (type=='c')
229: ignstp = 0;
230: else if (type=='[')
231: ignstp = STP;
232: while (ch!=EOF && (_sctab[ch]&ignstp)==0) {
233: if (ptr)
234: *ptr++ = ch;
235: if (--len <= 0)
236: break;
237: ch = getc(iop);
238: }
239: if (ch != EOF) {
240: if (len > 0)
241: ungetc(ch, iop);
242: *eofptr = 0;
243: } else
244: *eofptr = 1;
245: if (ptr && ptr!=optr) {
246: if (type!='c')
247: *ptr++ = '\0';
248: return(1);
249: }
250: return(0);
251: }
252:
253: char *
254: _getccl(s)
255: register char *s;
256: {
257: register c, t;
258:
259: t = 0;
260: if (*s == '^') {
261: t++;
262: s++;
263: }
264: for (c = 0; c < 128; c++)
265: if (t)
266: _sctab[c] &= ~STP;
267: else
268: _sctab[c] |= STP;
269: while (((c = *s++)&0177) != ']') {
270: if (t)
271: _sctab[c++] |= STP;
272: else
273: _sctab[c++] &= ~STP;
274: if (c==0)
275: return(--s);
276: }
277: return(s);
278: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.