Annotation of 41BSD/lib/libI77/rdfmt.c, revision 1.1.1.1

1.1       root        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) (void) 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((uint *)ptr,p->p1,len, 10));
                     19:                break;
                     20:        case IM: ch = (rd_I((uint *)ptr,p->p1,len, 10));
                     21:                break;
                     22:        case O: ch = (rd_I((uint *)ptr, p->p1, len, 8));
                     23:                break;
                     24:        case L: ch = (rd_L((ftnint *)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((ufloat *)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) 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 - 1;
                     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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.