home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Trees / V7 / usr / src / libI77 / rdfmt.c < prev    next >
Encoding:
C/C++ Source or Header  |  1979-05-03  |  4.3 KB  |  222 lines

  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. }
  222.