|
|
1.1 root 1: /* @(#)rdfmt.c 1.4 */
2:
3: #include "fio.h"
4: #include "fmt.h"
5: extern int cursor;
6: rd_ed(p,ptr,len) char *ptr; struct syl *p; ftnlen len;
7: { int ch;
8: for(;cursor>0;cursor--) if((ch=(*getn)())<0) return(ch);
9: if(cursor<0)
10: { if(recpos+cursor < 0) /*err(elist->cierr,110,"fmt")*/
11: cursor = -recpos; /* is this in the standard? */
12: if(external == 0) {
13: extern char *icptr;
14: icptr += cursor;
15: }
16: else if(curunit->useek) (void) fseek(cf,(long) cursor,1);
17: else err(elist->cierr,106,"fmt");
18: recpos += cursor;
19: cursor=0;
20: }
21: switch(p->op)
22: {
23: default: fprintf(stderr,"rd_ed, unexpected code: %d\n%s\n",
24: p->op,fmtbuf);
25: abort();
26: case I: ch = (rd_I((uint *)ptr,p->p1,len, 10));
27: break;
28: case IM: ch = (rd_I((uint *)ptr,p->p1,len, 10));
29: break;
30: case O: ch = (rd_I((uint *)ptr, p->p1, len, 8));
31: break;
32: case L: ch = (rd_L((ftnint *)ptr,p->p1));
33: break;
34: case A: ch = (rd_A(ptr,len));
35: break;
36: case AW:
37: ch = (rd_AW(ptr,p->p1,len));
38: break;
39: case E: case EE:
40: case D:
41: case G:
42: case GE:
43: case F: ch = (rd_F((ufloat *)ptr,p->p1,p->p2,len));
44: break;
45: }
46: if(ch == 0) return(ch);
47: else if(feof(cf)) return(EOF);
48: clearerr(cf);
49: return(errno);
50: }
51: rd_ned(p) struct syl *p;
52: {
53: switch(p->op)
54: {
55: default: fprintf(stderr,"rd_ned, unexpected code: %d\n%s\n",
56: p->op,fmtbuf);
57: abort();
58: case APOS:
59: return(rd_POS(p->p1));
60: case H: return(rd_H(p->p1,p->p2));
61: case SLASH: return((*donewrec)());
62: case TR:
63: case X: cursor += p->p1;
64: return(1);
65: case T: cursor=p->p1-recpos - 1;
66: return(1);
67: case TL: cursor -= p->p1;
68: if(cursor < -recpos) /* TL1000, 1X */
69: cursor = -recpos;
70: return(1);
71: }
72: }
73: rd_I(n,w,len, base) ftnlen len; uint *n; register int base;
74: { long x;
75: int sign,ch;
76: char s[84], *ps, *qs;
77: ps=s; x=0;
78: while (w)
79: {
80: GET(ch);
81: if (ch==',' || ch=='\n') break;
82: *ps=ch; ps++; w--;
83: }
84: *ps='\0';
85: ps=s;
86: while (*ps==' ') ps++;
87: if (*ps=='-') { sign=1; ps++; }
88: else { sign=0; if (*ps=='+') ps++; }
89: loop: while (*ps>='0' && *ps<='9') { x=x*base+(*ps-'0'); ps++; }
90: if (*ps==' ') {if (cblank) x *= base; ps++; goto loop;}
91: if(sign) x = -x;
92: if(len==sizeof(short)) n->is=x;
93: else if(len == sizeof(char)) n->ic = x;
94: else n->il=x;
95: if (*ps) return(errno=115); else return(0);
96: }
97: rd_L(n,w) ftnint *n;
98: { int ch;
99: char s[84], *ps;
100: ps=s;
101: while (w) {
102: GET(ch);
103: if (ch==','||ch=='\n') break;
104: *ps=ch;
105: ps++; w--;
106: }
107: *ps='\0';
108: ps=s; while (*ps==' ') ps++;
109: if (*ps=='.') ps++;
110: if (*ps=='t' || *ps == 'T') { *n=1; return(0); }
111: else if (*ps='f' || *ps == 'F') { *n=0; return(0); }
112: else return(errno=116);
113: }
114: double ten_pow[] = {1e1,1e2,1e3,1e4,1e5,1e6,1e7,1e8,1e9};
115: rd_F(p, w, d, len)
116: ftnlen len;
117: ufloat *p;
118: { char s[84], *sp;
119: double x;
120: int ch, nfrac, exp, dot, sx, se;
121: sp = s;
122: x = 0.0;
123: dot = 1; /* no dot */
124: while (w) {
125: GET(ch);
126: w--;
127: switch (ch) {
128: case '\n':
129: case ',':
130: w = 0;
131: break;
132: default:
133: *sp++ = ch;
134: }
135: }
136: *sp = '\0';
137: sp = s;
138: while (*sp == ' ')
139: sp++;
140: if (*sp == '-') {
141: sx = 1;
142: sp++;
143: } else {
144: sx = 0;
145: if (*sp == '+')
146: sp++;
147: }
148: loop1:
149: while (*sp >= '0' && *sp <= '9') {
150: x = x * 10 + (*sp - '0');
151: sp++;
152: }
153: if (*sp == ' ') {
154: if (cblank)
155: x *= 10;
156: sp++;
157: goto loop1;
158: }
159: nfrac = 0;
160: if (*sp == '.') {
161: sp++;
162: dot = 0;
163: loop2:
164: while (*sp >= '0' && *sp <= '9') {
165: x = x * 10 + (*sp - '0');
166: nfrac--;
167: sp++;
168: }
169: if (*sp == ' ') {
170: if (cblank) {
171: x *= 10;
172: nfrac--;
173: }
174: sp++;
175: goto loop2;
176: }
177: }
178: if (*sp == 'd' || *sp == 'e' || *sp == 'D' || *sp == 'E') {
179: sp++;
180: } else
181: nfrac -= scale;
182: while (*sp == ' ')
183: sp++;
184: if (*sp == '-') {
185: sp++;
186: se = 1;
187: } else {
188: se = 0;
189: if (*sp == '+')
190: sp++;
191: }
192: exp = 0;
193: loop3:
194: while (*sp >= '0' && *sp <= '9') {
195: exp = exp * 10 + (*sp - '0');
196: sp++;
197: }
198: if (*sp == ' ') {
199: if (cblank)
200: exp *= 10;
201: sp++;
202: goto loop3;
203: }
204: if (se)
205: exp = nfrac - exp;
206: else
207: exp += nfrac;
208: if (dot)
209: exp -= d;
210: if (exp > 0) {
211: while (exp > 9) {
212: x *= 1e9;
213: exp -= 9;
214: }
215: x *= ten_pow[exp-1];
216: } else if (exp < 0) {
217: exp = -exp;
218: while (exp > 9) {
219: x *= 1e-9;
220: exp -= 9;
221: }
222: x /= ten_pow[exp-1];
223: }
224: if (sx)
225: x = -x;
226: if (len == sizeof(float))
227: p->pf = x;
228: else
229: p->pd = x;
230: if (*sp)
231: return(errno = 115);
232: else
233: return(0);
234: }
235:
236:
237: rd_A(p,len) char *p; ftnlen len;
238: { int i,ch;
239: for(i=0;i<len;i++)
240: { GET(ch);
241: *p++=VAL(ch);
242: }
243: return(0);
244: }
245: rd_AW(p,w,len) char *p; ftnlen len;
246: { int i,ch;
247: if(w>=len)
248: { for(i=0;i<w-len;i++)
249: GET(ch);
250: for(i=0;i<len;i++)
251: { GET(ch);
252: *p++=VAL(ch);
253: }
254: return(0);
255: }
256: for(i=0;i<w;i++)
257: { GET(ch);
258: *p++=VAL(ch);
259: }
260: for(i=0;i<len-w;i++) *p++=' ';
261: return(0);
262: }
263: rd_H(n,s) char *s;
264: { int i,ch;
265: for(i=0;i<n;i++)
266: if((ch=(*getn)())<0) return(ch);
267: else *s++ = ch=='\n'?' ':ch;
268: return(1);
269: }
270: rd_POS(s) char *s;
271: { char quote;
272: int ch;
273: quote= *s++;
274: for(;*s;s++)
275: if(*s==quote && *(s+1)!=quote) break;
276: else if((ch=(*getn)())<0) return(ch);
277: else *s = ch=='\n'?' ':ch;
278: return(1);
279: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.