Annotation of 41BSD/lib/libI77uc/rdfmt.c, revision 1.1

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

unix.superglobalmegacorp.com

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