1: #include "fio.h"
   2: #include "fmt.h"
   3: extern int cursor;
   4: rd_ed(p,ptr,len) char *ptr; struct syl *p; ftnlen len;
   5: {   int ch;
   6:     for(;cursor>0;cursor--) if((ch=(*getn)())<0) return(ch);
   7:     if(cursor<0)
   8:     {   if(recpos+cursor < 0) err(elist->cierr,110,"fmt")
   9:         if(curunit->useek) fseek(cf,(long) cursor,1);
  10:         else err(elist->cierr,106,"fmt");
  11:         cursor=0;
  12:     }
  13:     switch(p->op)
  14:     {
  15:     default: fprintf(stderr,"rd_ed, unexpected code: %d\n%s\n",
  16:             p->op,fmtbuf);
  17:         abort();
  18:     case I: ch = (rd_I(ptr,p->p1,len, 10));
  19:         break;
  20:     case IM: ch = (rd_I(ptr,p->p1,len, 10));
  21:         break;
  22:     case O: ch = (rd_I(ptr, p->p1, len, 8));
  23:         break;
  24:     case L: ch = (rd_L(ptr,p->p1));
  25:         break;
  26:     case A: ch = (rd_A(ptr,len));
  27:         break;
  28:     case AW:
  29:         ch = (rd_AW(ptr,p->p1,len));
  30:         break;
  31:     case E: case EE:
  32:     case D:
  33:     case G:
  34:     case GE:
  35:     case F: ch = (rd_F(ptr,p->p1,p->p2,len));
  36:         break;
  37:     }
  38:     if(ch == 0) return(ch);
  39:     else if(feof(cf)) return(EOF);
  40:     clearerr(cf);
  41:     return(errno);
  42: }
  43: rd_ned(p,ptr) char *ptr; struct syl *p;
  44: {
  45:     switch(p->op)
  46:     {
  47:     default: fprintf(stderr,"rd_ned, unexpected code: %d\n%s\n",
  48:             p->op,fmtbuf);
  49:         abort();
  50:     case APOS:
  51:         return(rd_POS(p->p1));
  52:     case H: return(rd_H(p->p1,p->p2));
  53:     case SLASH: return((*donewrec)());
  54:     case TR:
  55:     case X: cursor += p->p1;
  56:         return(1);
  57:     case T: cursor=p->p1-recpos;
  58:         return(1);
  59:     case TL: cursor -= p->p1;
  60:         return(1);
  61:     }
  62: }
  63: rd_I(n,w,len, base) ftnlen len; uint *n; register int base;
  64: {   long x=0;
  65:     int i,sign=0,ch;
  66:     for(i=0;i<w;i++)
  67:     {
  68:         if((ch=(*getn)())<0) return(ch);
  69:         switch(ch)
  70:         {
  71:         default:
  72:             return(errno=115);
  73:         case ',': goto done;
  74:         case '+': break;
  75:         case '-':
  76:             sign=1;
  77:             break;
  78:         case '\n':
  79:         case ' ':
  80:             if(cblank) x *= base;
  81:             break;
  82:         case '0': case '1': case '2': case '3': case '4':
  83:         case '5': case '6': case '7': case '8': case '9':
  84:             x=base*x+ch-'0';
  85:             break;
  86:         }
  87:     }
  88: done:
  89:     if(sign) x = -x;
  90:     if(len==sizeof(short)) n->is=x;
  91:     else if(len == sizeof(char)) n->ic = x;
  92:     else n->il=x;
  93:     return(0);
  94: }
  95: rd_L(n,w) ftnint *n;
  96: {   int ch,i,v = -1;
  97:     for(i=0;i<w;i++)
  98:     {   if((ch=(*getn)())<0) return(ch);
  99:         if(ch=='t' && v==-1) v=1;
 100:         else if(ch=='f' && v==-1) v=0;
 101:         else if(ch==',') return(0);
 102:     }
 103:     if(v==-1)
 104:     {   errno=116;
 105:         return(1);
 106:     }
 107:     *n=v;
 108:     return(0);
 109: }
 110: rd_F(p,w,d,len) ftnlen len; ufloat *p;
 111: {   double x,y;
 112:     int i,sx,sz,ch,dot,ny,z,sawz;
 113:     x=y=0;
 114:     sawz=z=ny=dot=sx=sz=0;
 115:     for(i=0;i<w;)
 116:     {   i++;
 117:         if((ch=(*getn)())<0) return(ch);
 118:         else if(ch == ' ' && !cblank || ch == '+' && x == 0
 119:             || ch == '\n' && !cblank) continue;
 120:         else if(ch=='-' && x==0) sx=1;
 121:         else if(ch == '+' || ch == '-') goto expon;
 122:         else if(ch<='9' && ch>='0')
 123:             x=10*x+ch-'0';
 124:         else if(ch=='e' || ch=='d' || ch=='.')
 125:             break;
 126:         else if(cblank && (ch==' ' || ch== '\n')) x*=10;
 127:         else if(ch==',')
 128:         {   i=w;
 129:             break;
 130:         }
 131:         else return(errno = 115);
 132:     }
 133:     if(ch=='.') dot=1;
 134:     while(i<w && ch!='e' && ch!='d' && ch!='+' && ch!='-')
 135:     {   i++;
 136:         if((ch=(*getn)())<0) return(ch);
 137:         else if(ch<='9' && ch>='0')
 138:             y=10*y+ch-'0';
 139:         else if(cblank && (ch==' ' || ch == '\n'))
 140:             y *= 10;
 141:         else if(ch==',') {i=w; break;}
 142:         else if(ch==' ') continue;
 143:         else continue;
 144:         ny++;
 145:     }
 146: expon:
 147:     if(ch=='-') sz=1;
 148:     while(i<w)
 149:     {   i++;
 150:         sawz=1;
 151:         if((ch=(*getn)())<0) return(ch);
 152:         else if(ch=='-') sz=1;
 153:         else if(ch<='9' && ch>='0')
 154:             z=10*z+ch-'0';
 155:         else if(cblank && (ch==' ' || ch == '\n'))
 156:             z *= 10;
 157:         else if(ch==',') break;
 158:         else if(ch==' ') continue;
 159:         else if(ch=='+') continue;
 160:         else if(ch!='\n') return(errno=115);
 161:     }
 162:     if(!dot)
 163:         for(i=0;i<d;i++) x /= 10;
 164:     for(i=0;i<ny;i++) y /= 10;
 165:     x=x+y;
 166:     if(sz)
 167:         for(i=0;i<z;i++) x /=10;
 168:     else    for(i=0;i<z;i++) x *= 10;
 169:     if(sx) x = -x;
 170:     if(!sawz)
 171:     {
 172:         for(i=scale;i>0;i--) x /= 10;
 173:         for(i=scale;i<0;i++) x *= 10;
 174:     }
 175:     if(len==sizeof(float)) p->pf=x;
 176:     else p->pd=x;
 177:     return(0);
 178: }
 179: rd_A(p,len) char *p; ftnlen len;
 180: {   int i,ch;
 181:     for(i=0;i<len;i++)
 182:     {   GET(ch);
 183:         *p++=VAL(ch);
 184:     }
 185:     return(0);
 186: }
 187: rd_AW(p,w,len) char *p; ftnlen len;
 188: {   int i,ch;
 189:     if(w>=len)
 190:     {   for(i=0;i<w-len;i++)
 191:             GET(ch);
 192:         for(i=0;i<len;i++)
 193:         {   GET(ch);
 194:             *p++=VAL(ch);
 195:         }
 196:         return(0);
 197:     }
 198:     for(i=0;i<w;i++)
 199:     {   GET(ch);
 200:         *p++=VAL(ch);
 201:     }
 202:     for(i=0;i<len-w;i++) *p++=' ';
 203:     return(0);
 204: }
 205: rd_H(n,s) char *s;
 206: {   int i,ch;
 207:     for(i=0;i<n;i++)
 208:         if((ch=(*getn)())<0) return(ch);
 209:         else *s++ = ch=='\n'?' ':ch;
 210:     return(1);
 211: }
 212: rd_POS(s) char *s;
 213: {   char quote;
 214:     int ch;
 215:     quote= *s++;
 216:     for(;*s;s++)
 217:         if(*s==quote && *(s+1)!=quote) break;
 218:         else if((ch=(*getn)())<0) return(ch);
 219:         else *s = ch=='\n'?' ':ch;
 220:     return(1);
 221: }

Defined functions

rd_A defined in line 179; used 1 times
  • in line 26
rd_AW defined in line 187; used 1 times
  • in line 29
rd_F defined in line 110; used 1 times
  • in line 35
rd_H defined in line 205; used 1 times
  • in line 52
rd_I defined in line 63; used 3 times
rd_L defined in line 95; used 1 times
  • in line 24
rd_POS defined in line 212; used 1 times
  • in line 51
rd_ed defined in line 4; used 6 times
rd_ned defined in line 43; used 6 times
Last modified: 1979-05-03
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 771
Valid CSS Valid XHTML 1.0 Strict