20 rd_Z(n,w,len) Uint *n; ftnlen len;
22 rd_Z(Uint *n, int w, ftnlen len)
26 char *s, *s0, *s1, *se, *t;
35 hex[ch] = ch - '0' + 1;
38 hex[ch] = hex[ch + 'a' - 'A'] = ch - 'A' + 11;
43 if (len > 4*sizeof(long))
47 if (ch==',' || ch=='\n')
55 /* discard excess characters */
56 for(t = s0, s = s1; t < s1;)
75 for(; w > w2; t += i, --w)
82 *t = hex[*s0++ & 0xff] - 1;
88 *t = hex[*s0 & 0xff]-1 << 4 | hex[s0[1] & 0xff]-1;
98 rd_I(n,w,len, base) Uint *n; int w; ftnlen len; register int base;
100 rd_I(Uint *n, int w, ftnlen len, register int base)
126 if (ch >= '0' && ch <= '9') {
134 if (ch >= '0' && ch <= '9') {
135 x = x*base + ch - '0';
139 if (ch == '\n' || ch == ',')
149 if(len == sizeof(integer))
151 else if(len == sizeof(char))
154 else if (len == sizeof(longint))
169 rd_L(n,w,len) ftnint *n; ftnlen len;
171 rd_L(ftnint *n, int w, ftnlen len)
211 /* The switch statement that was here
212 didn't cut it: It broke down for targets
213 where sizeof(char) == sizeof(short). */
214 if (len == sizeof(char))
215 *(char *)n = (char)lv;
216 else if (len == sizeof(short))
217 *(short *)n = (short)lv;
222 if (ch == ',' || ch == '\n')
230 rd_F(p, w, d, len) ufloat *p; ftnlen len;
232 rd_F(ufloat *p, int w, int d, ftnlen len)
235 char s[FMAX+EXPMAXDIGS+4];
237 register char *sp, *spe, *sp1;
250 } while (ch == ' ' && w);
252 case '-': *sp++ = ch; sp1++; spe++;
260 if (!w--) goto zero; GET(ch); }
262 { if (!w--) goto zero; GET(ch); }
263 if (ch == ' ' && f__cblank)
268 if (sp < spe) *sp++ = ch;
276 { ch = '0'; goto digloop1; }
283 if (sp == sp1) { /* no digits yet */
292 if (f__cblank) goto skip01;
299 { *sp++ = ch; --exp; }
306 { ch = '0'; goto digloop2; }
313 case '-': se = 1; goto signonly;
314 case '+': se = 0; goto signonly;
347 { ch = '\n'; break; }
359 if (e > EXPMAX && sp > sp1)
374 return (errno = 115);
381 sprintf(sp+1, "e%ld", exp);
387 if (len == sizeof(real))
397 rd_A(p,len) char *p; ftnlen len;
399 rd_A(char *p, ftnlen len)
410 rd_AW(p,w,len) char *p; ftnlen len;
412 rd_AW(char *p, int w, ftnlen len)
416 { for(i=0;i<w-len;i++)
428 for(i=0;i<len-w;i++) *p++=' ';
439 if((ch=(*f__getn)())<0) return(ch);
440 else *s++ = ch=='\n'?' ':ch;
453 if(*s==quote && *(s+1)!=quote) break;
454 else if((ch=(*f__getn)())<0) return(ch);
455 else *s = ch=='\n'?' ':ch;
459 rd_ed(p,ptr,len) struct syl *p; char *ptr; ftnlen len;
461 rd_ed(struct syl *p, char *ptr, ftnlen len)
464 for(;f__cursor>0;f__cursor--) if((ch=(*f__getn)())<0) return(ch);
466 { if(f__recpos+f__cursor < 0) /*err(elist->cierr,110,"fmt")*/
467 f__cursor = -f__recpos; /* is this in the standard? */
468 if(f__external == 0) {
469 extern char *f__icptr;
470 f__icptr += f__cursor;
472 else if(f__curunit && f__curunit->useek)
473 (void) fseek(f__cf,(long) f__cursor,SEEK_CUR);
475 err(f__elist->cierr,106,"fmt");
476 f__recpos += f__cursor;
481 default: fprintf(stderr,"rd_ed, unexpected code: %d\n", p->op);
482 sig_die(f__fmtbuf, 1);
484 case I: ch = rd_I((Uint *)ptr,p->p1,len, 10);
487 /* O and OM don't work right for character, double, complex, */
488 /* or doublecomplex, and they differ from Fortran 90 in */
489 /* showing a minus sign for negative values. */
492 case O: ch = rd_I((Uint *)ptr, p->p1, len, 8);
494 case L: ch = rd_L((ftnint *)ptr,p->p1,len);
496 case A: ch = rd_A(ptr,len);
499 ch = rd_AW(ptr,p->p1,len);
505 case F: ch = rd_F((ufloat *)ptr,p->p1,p->p2.i[0],len);
508 /* Z and ZM assume 8-bit bytes. */
512 ch = rd_Z((Uint *)ptr, p->p1, len);
515 if(ch == 0) return(ch);
516 else if(ch == EOF) return(EOF);
522 rd_ned(p) struct syl *p;
524 rd_ned(struct syl *p)
529 default: fprintf(stderr,"rd_ned, unexpected code: %d\n", p->op);
530 sig_die(f__fmtbuf, 1);
532 return(rd_POS(p->p2.s));
533 case H: return(rd_H(p->p1,p->p2.s));
534 case SLASH: return((*f__donewrec)());
536 case X: f__cursor += p->p1;
538 case T: f__cursor=p->p1-f__recpos - 1;
540 case TL: f__cursor -= p->p1;
541 if(f__cursor < -f__recpos) /* TL1000, 1X */
542 f__cursor = -f__recpos;