|
|
1.1 root 1: /*
2: char id_rdfmt[] = "@(#)rdfmt.c 1.5";
3: *
4: * formatted read routines
5: */
6:
7: #include "fio.h"
8: #include "format.h"
9:
10: #define isdigit(c) (c>='0' && c<='9')
11: #define isalpha(c) (c>='a' && c<='z')
12:
13: rd_ed(p,ptr,len) char *ptr; struct syl *p; ftnlen len;
14: { int n;
15: if(cursor && (n=rd_mvcur())) return(n);
16: switch(p->op)
17: {
18: case I:
19: case IM:
20: n = (rd_I(ptr,p->p1,len));
21: break;
22: case L:
23: n = (rd_L(ptr,p->p1));
24: break;
25: case A:
26: p->p1 = len; /* cheap trick */
27: case AW:
28: n = (rd_AW(ptr,p->p1,len));
29: break;
30: case E:
31: case EE:
32: case D:
33: case DE:
34: case G:
35: case GE:
36: case F:
37: n = (rd_F(ptr,p->p1,p->p2,len));
38: break;
39: default:
40: return(errno=F_ERFMT);
41: }
42: if (n < 0)
43: {
44: if(feof(cf)) return(EOF);
45: n = errno;
46: clearerr(cf);
47: }
48: return(n);
49: }
50:
51: rd_ned(p,ptr) char *ptr; struct syl *p;
52: {
53: switch(p->op)
54: {
55: #ifndef KOSHER
56: case APOS: /* NOT STANDARD F77 */
57: return(rd_POS((char *)p->p1));
58: case H: /* NOT STANDARD F77 */
59: return(rd_H(p->p1,(char *)p->p2));
60: #endif
61: case SLASH:
62: return((*donewrec)());
63: case TR:
64: case X:
65: cursor += p->p1;
66: /* tab = (p->op==TR); This voids '..,tl6,1x,..' sequences */
67: tab = YES;
68: return(OK);
69: case T:
70: if(p->p1) cursor = p->p1 - recpos - 1;
71: #ifndef KOSHER
72: else cursor = 8*p->p2 - recpos%8; /* NOT STANDARD FORT */
73: #endif
74: tab = YES;
75: return(OK);
76: case TL:
77: cursor -= p->p1;
78: if ((recpos + cursor) < 0) cursor = -recpos; /* ANSI req'd */
79: tab = YES;
80: return(OK);
81: default:
82: return(errno=F_ERFMT);
83: }
84: }
85:
86: rd_mvcur()
87: { int n;
88: if(tab) return((*dotab)());
89: if (cursor < 0) return(errno=F_ERSEEK);
90: while(cursor--) if((n=(*getn)()) < 0) return(n);
91: return(cursor=0);
92: }
93:
94: rd_I(n,w,len) ftnlen len; uint *n;
95: { long x=0;
96: int i,sign=0,ch,c;
97: for(i=0;i<w;i++)
98: {
99: if((ch=(*getn)())<0) return(ch);
100: switch(ch=lcase(ch))
101: {
102: case ',': goto done;
103: case '+': break;
104: case '-':
105: sign=1;
106: break;
107: case ' ':
108: if(cblank) x *= radix;
109: break;
110: case '\n': goto done;
111: default:
112: if(isdigit(ch))
113: { if ((c=(ch-'0')) < radix)
114: { x = (x * radix) + c;
115: break;
116: }
117: }
118: else if(isalpha(ch))
119: { if ((c=(ch-'a'+10)) < radix)
120: { x = (x * radix) + c;
121: break;
122: }
123: }
124: return(errno=F_ERRDCHR);
125: }
126: }
127: done:
128: if(sign) x = -x;
129: if(len==sizeof(short)) n->is=x;
130: else n->il=x;
131: return(OK);
132: }
133:
134: rd_L(n,w) ftnint *n;
135: { int ch,i,v = -1;
136: for(i=0;i<w;i++)
137: { if((ch=(*getn)()) < 0) return(ch);
138: if((ch=lcase(ch))=='t' && v==-1) v=1;
139: else if(ch=='f' && v==-1) v=0;
140: else if(ch==',') break;
141: }
142: if(v==-1) return(errno=F_ERLOGIF);
143: *n=v;
144: return(OK);
145: }
146:
147: rd_F(p,w,d,len) ftnlen len; ufloat *p;
148: { double x,y;
149: int i,sx,sz,ch,dot,ny,z,sawz;
150: x=y=0;
151: sawz=z=ny=dot=sx=sz=0;
152: for(i=0;i<w;)
153: { i++;
154: if((ch=(*getn)())<0) return(ch);
155: ch=lcase(ch);
156: if(ch==' ' && !cblank || ch=='+') continue;
157: else if(ch=='-') sx=1;
158: else if(ch<='9' && ch>='0')
159: x=10*x+ch-'0';
160: else if(ch=='e' || ch=='d' || ch=='.')
161: break;
162: else if(cblank && ch==' ') x*=10;
163: else if(ch==',')
164: { i=w;
165: break;
166: }
167: else if(ch!='\n') return(errno=F_ERRDCHR);
168: }
169: if(ch=='.') dot=1;
170: while(i<w && ch!='e' && ch!='d' && ch!='+' && ch!='-')
171: { i++;
172: if((ch=(*getn)())<0) return(ch);
173: ch = lcase(ch);
174: if(ch<='9' && ch>='0')
175: y=10*y+ch-'0';
176: else if(cblank && ch==' ')
177: y *= 10;
178: else if(ch==',') {i=w; break;}
179: else if(ch==' ') continue;
180: else continue;
181: ny++;
182: }
183: if(ch=='-') sz=1;
184: while(i<w)
185: { i++;
186: sawz=1;
187: if((ch=(*getn)())<0) return(ch);
188: ch = lcase(ch);
189: if(ch=='-') sz=1;
190: else if(ch<='9' && ch>='0')
191: z=10*z+ch-'0';
192: else if(cblank && ch==' ')
193: z *= 10;
194: else if(ch==',') break;
195: else if(ch==' ') continue;
196: else if(ch=='+') continue;
197: else if(ch!='\n') return(errno=F_ERRDCHR);
198: }
199: if(!dot)
200: for(i=0;i<d;i++) x /= 10;
201: for(i=0;i<ny;i++) y /= 10;
202: x=x+y;
203: if(sz)
204: for(i=0;i<z;i++) x /=10;
205: else for(i=0;i<z;i++) x *= 10;
206: if(sx) x = -x;
207: if(!sawz)
208: {
209: for(i=scale;i>0;i--) x /= 10;
210: for(i=scale;i<0;i++) x *= 10;
211: }
212: if(len==sizeof(float)) p->pf=x;
213: else p->pd=x;
214: return(OK);
215: }
216:
217: rd_AW(p,w,len) char *p; ftnlen len;
218: { int i,ch;
219: if(w >= len)
220: {
221: for(i=0;i<w-len;i++) GET(ch);
222: for(i=0;i<len;i++)
223: { GET(ch);
224: *p++=VAL(ch);
225: }
226: }
227: else
228: {
229: for(i=0;i<w;i++)
230: { GET(ch);
231: *p++=VAL(ch);
232: }
233: for(i=0;i<len-w;i++) *p++=' ';
234: }
235: return(OK);
236: }
237:
238: /* THIS IS NOT ALLOWED IN THE NEW STANDARD 'CAUSE IT'S WEIRD */
239: rd_H(n,s) char *s;
240: { int i,ch = 0;
241: for(i=0;i<n;i++)
242: { if (ch != '\n')
243: GET(ch);
244: if (ch == '\n')
245: *s++ = ' ';
246: else
247: *s++ = ch;
248: }
249: return(OK);
250: }
251:
252: rd_POS(s) char *s;
253: { char quote;
254: int ch = 0;
255: quote = *s++;
256: while(*s)
257: { if(*s==quote && *(s+1)!=quote)
258: break;
259: if (ch != '\n')
260: GET(ch);
261: if (ch == '\n')
262: *s++ = ' ';
263: else
264: *s++ = ch;
265: }
266: return(OK);
267: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.