Annotation of 42BSD/usr.lib/libI77/rdfmt.c, revision 1.1

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

unix.superglobalmegacorp.com

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