16 rd_Z(Uint *n, int w, ftnlen len)
19 char *s, *s0, *s1, *se, *t;
28 hex[ch] = ch - '0' + 1;
31 hex[ch] = hex[ch + 'a' - 'A'] = ch - 'A' + 11;
36 if (len > 4*sizeof(long))
40 if (ch==',' || ch=='\n')
48 /* discard excess characters */
49 for(t = s0, s = s1; t < s1;)
68 for(; w > w2; t += i, --w)
75 *t = hex[*s0++ & 0xff] - 1;
81 *t = hex[*s0 & 0xff]-1 << 4 | hex[s0[1] & 0xff]-1;
90 rd_I(Uint *n, int w, ftnlen len, register int base)
115 if (ch >= '0' && ch <= '9') {
123 if (ch >= '0' && ch <= '9') {
124 x = x*base + ch - '0';
128 if (ch == '\n' || ch == ',')
138 if(len == sizeof(integer))
140 else if(len == sizeof(char))
143 else if (len == sizeof(longint))
157 rd_L(ftnint *n, int w, ftnlen len)
196 /* The switch statement that was here
197 didn't cut it: It broke down for targets
198 where sizeof(char) == sizeof(short). */
199 if (len == sizeof(char))
200 *(char *)n = (char)lv;
201 else if (len == sizeof(short))
202 *(short *)n = (short)lv;
207 if (ch == ',' || ch == '\n')
214 rd_F(ufloat *p, int w, int d, ftnlen len)
216 char s[FMAX+EXPMAXDIGS+4];
218 register char *sp, *spe, *sp1;
231 } while (ch == ' ' && w);
233 case '-': *sp++ = ch; sp1++; spe++;
241 if (!w--) goto zero; GET(ch); }
243 { if (!w--) goto zero; GET(ch); }
244 if (ch == ' ' && f__cblank)
249 if (sp < spe) *sp++ = ch;
257 { ch = '0'; goto digloop1; }
264 if (sp == sp1) { /* no digits yet */
273 if (f__cblank) goto skip01;
280 { *sp++ = ch; --exp; }
287 { ch = '0'; goto digloop2; }
294 case '-': se = 1; goto signonly;
295 case '+': se = 0; goto signonly;
328 { ch = '\n'; break; }
340 if (e > EXPMAX && sp > sp1)
355 return (errno = 115);
362 sprintf(sp+1, "e%ld", exp);
368 if (len == sizeof(real))
377 rd_A(char *p, ftnlen len)
386 rd_AW(char *p, int w, ftnlen len)
389 { for(i=0;i<w-len;i++)
401 for(i=0;i<len-w;i++) *p++=' ';
408 if((ch=(*f__getn)())<0) return(ch);
409 else *s++ = ch=='\n'?' ':ch;
418 if(*s==quote && *(s+1)!=quote) break;
419 else if((ch=(*f__getn)())<0) return(ch);
420 else *s = ch=='\n'?' ':ch;
423 rd_ed(struct syl *p, char *ptr, ftnlen len)
425 for(;f__cursor>0;f__cursor--) if((ch=(*f__getn)())<0) return(ch);
427 { if(f__recpos+f__cursor < 0) /*err(elist->cierr,110,"fmt")*/
428 f__cursor = -f__recpos; /* is this in the standard? */
429 if(f__external == 0) {
430 extern char *f__icptr;
431 f__icptr += f__cursor;
433 else if(f__curunit && f__curunit->useek)
434 FSEEK(f__cf,(off_t)f__cursor,SEEK_CUR);
436 err(f__elist->cierr,106,"fmt");
437 f__recpos += f__cursor;
442 default: fprintf(stderr,"rd_ed, unexpected code: %d\n", p->op);
443 sig_die(f__fmtbuf, 1);
445 case I: ch = rd_I((Uint *)ptr,p->p1,len, 10);
448 /* O and OM don't work right for character, double, complex, */
449 /* or doublecomplex, and they differ from Fortran 90 in */
450 /* showing a minus sign for negative values. */
453 case O: ch = rd_I((Uint *)ptr, p->p1, len, 8);
455 case L: ch = rd_L((ftnint *)ptr,p->p1,len);
457 case A: ch = rd_A(ptr,len);
460 ch = rd_AW(ptr,p->p1,len);
466 case F: ch = rd_F((ufloat *)ptr,p->p1,p->p2.i[0],len);
469 /* Z and ZM assume 8-bit bytes. */
473 ch = rd_Z((Uint *)ptr, p->p1, len);
476 if(ch == 0) return(ch);
477 else if(ch == EOF) return(EOF);
482 rd_ned(struct syl *p)
486 default: fprintf(stderr,"rd_ned, unexpected code: %d\n", p->op);
487 sig_die(f__fmtbuf, 1);
489 return(rd_POS(p->p2.s));
490 case H: return(rd_H(p->p1,p->p2.s));
491 case SLASH: return((*f__donewrec)());
493 case X: f__cursor += p->p1;
495 case T: f__cursor=p->p1-f__recpos - 1;
497 case TL: f__cursor -= p->p1;
498 if(f__cursor < -f__recpos) /* TL1000, 1X */
499 f__cursor = -f__recpos;