Annotation of cci/usr/src/usr.lib/libsI77/rdfmt.c, revision 1.1

1.1     ! root        1: /*
        !             2: char id_rdfmt[] = "@(#)rdfmt.c 1.2";
        !             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:
        !            57:                return(rd_POS(p->p1));
        !            58:        case H:
        !            59:                return(rd_H(p->p1,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);
        !            67:                return(OK);
        !            68:        case T:
        !            69:                if(p->p1) cursor = p->p1 - recpos - 1;
        !            70: #ifndef KOSHER
        !            71:                else cursor = 8*p->p2 - recpos%8;       /* NOT STANDARD FORT */
        !            72: #endif
        !            73:                tab = YES;
        !            74:                return(OK);
        !            75:        case TL:
        !            76:                cursor -= p->p1;
        !            77:                tab = YES;
        !            78:                return(OK);
        !            79:        default:
        !            80:                return(errno=F_ERFMT);
        !            81:        }
        !            82: }
        !            83: 
        !            84: rd_mvcur()
        !            85: {      int n;
        !            86:        if(tab) return((*dotab)());
        !            87:        while(cursor--) if((n=(*getn)()) < 0) return(n);
        !            88:        return(cursor=0);
        !            89: }
        !            90: 
        !            91: rd_I(n,w,len) ftnlen len; uint *n;
        !            92: {      long x=0;
        !            93:        int i,sign=0,ch,c;
        !            94:        for(i=0;i<w;i++)
        !            95:        {
        !            96:                if((ch=(*getn)())<0) return(ch);
        !            97:                switch(ch=lcase(ch))
        !            98:                {
        !            99:                case ',': goto done;
        !           100:                case '+': break;
        !           101:                case '-':
        !           102:                        sign=1;
        !           103:                        break;
        !           104:                case ' ':
        !           105:                        if(cblank) x *= radix;
        !           106:                        break;
        !           107:                case '\n':  goto done;
        !           108:                default:
        !           109:                        if(isdigit(ch))
        !           110:                        {       if ((c=(ch-'0')) < radix)
        !           111:                                {       x = (x * radix) + c;
        !           112:                                        break;
        !           113:                                }
        !           114:                        }
        !           115:                        else if(isalpha(ch))
        !           116:                        {       if ((c=(ch-'a'+10)) < radix)
        !           117:                                {       x = (x * radix) + c;
        !           118:                                        break;
        !           119:                                }
        !           120:                        }
        !           121:                        return(errno=F_ERRDCHR);
        !           122:                }
        !           123:        }
        !           124: done:
        !           125:        if(sign) x = -x;
        !           126:        if(len==sizeof(short)) n->is=x;
        !           127:        else n->il=x;
        !           128:        return(OK);
        !           129: }
        !           130: 
        !           131: rd_L(n,w) ftnint *n;
        !           132: {      int ch,i,v = -1;
        !           133:        for(i=0;i<w;i++)
        !           134:        {       if((ch=(*getn)()) < 0) return(ch);
        !           135:                if((ch=lcase(ch))=='t' && v==-1) v=1;
        !           136:                else if(ch=='f' && v==-1) v=0;
        !           137:                else if(ch==',') break;
        !           138:        }
        !           139:        if(v==-1) return(errno=F_ERLOGIF);
        !           140:        *n=v;
        !           141:        return(OK);
        !           142: }
        !           143: 
        !           144: rd_F(p,w,d,len) ftnlen len; ufloat *p;
        !           145: {      double x,y;
        !           146:        int i,sx,sz,ch,dot,ny,z,sawz;
        !           147:        x=y=0;
        !           148:        sawz=z=ny=dot=sx=sz=0;
        !           149:        for(i=0;i<w;)
        !           150:        {       i++;
        !           151:                if((ch=(*getn)())<0) return(ch);
        !           152:                ch=lcase(ch);
        !           153:                if(ch==' ' && !cblank || ch=='+') continue;
        !           154:                else if(ch=='-') sx=1;
        !           155:                else if(ch<='9' && ch>='0')
        !           156:                        x=10*x+ch-'0';
        !           157:                else if(ch=='e' || ch=='d' || ch=='.')
        !           158:                        break;
        !           159:                else if(cblank && ch==' ') x*=10;
        !           160:                else if(ch==',')
        !           161:                {       i=w;
        !           162:                        break;
        !           163:                }
        !           164:                else if(ch!='\n') return(errno=F_ERRDCHR);
        !           165:        }
        !           166:        if(ch=='.') dot=1;
        !           167:        while(i<w && ch!='e' && ch!='d' && ch!='+' && ch!='-')
        !           168:        {       i++;
        !           169:                if((ch=(*getn)())<0) return(ch);
        !           170:                ch = lcase(ch);
        !           171:                if(ch<='9' && ch>='0')
        !           172:                        y=10*y+ch-'0';
        !           173:                else if(cblank && ch==' ')
        !           174:                        y *= 10;
        !           175:                else if(ch==',') {i=w; break;}
        !           176:                else if(ch==' ') continue;
        !           177:                else continue;
        !           178:                ny++;
        !           179:        }
        !           180:        if(ch=='-') sz=1;
        !           181:        while(i<w)
        !           182:        {       i++;
        !           183:                sawz=1;
        !           184:                if((ch=(*getn)())<0) return(ch);
        !           185:                ch = lcase(ch);
        !           186:                if(ch=='-') sz=1;
        !           187:                else if(ch<='9' && ch>='0')
        !           188:                        z=10*z+ch-'0';
        !           189:                else if(cblank && ch==' ')
        !           190:                        z *= 10;
        !           191:                else if(ch==',') break;
        !           192:                else if(ch==' ') continue;
        !           193:                else if(ch=='+') continue;
        !           194:                else if(ch!='\n') return(errno=F_ERRDCHR);
        !           195:        }
        !           196:        if(!dot)
        !           197:                for(i=0;i<d;i++) x /= 10;
        !           198:        for(i=0;i<ny;i++) y /= 10;
        !           199:        x=x+y;
        !           200:        if(sz)
        !           201:                for(i=0;i<z;i++) x /=10;
        !           202:        else    for(i=0;i<z;i++) x *= 10;
        !           203:        if(sx) x = -x;
        !           204:        if(!sawz)
        !           205:        {
        !           206:                for(i=scale;i>0;i--) x /= 10;
        !           207:                for(i=scale;i<0;i++) x *= 10;
        !           208:        }
        !           209:        if(len==sizeof(float)) p->pf=x;
        !           210:        else p->pd=x;
        !           211:        return(OK);
        !           212: }
        !           213: 
        !           214: rd_AW(p,w,len) char *p; ftnlen len;
        !           215: {      int i,ch;
        !           216:        if(w >= len)
        !           217:        {
        !           218:                for(i=0;i<w-len;i++) GET(ch);
        !           219:                for(i=0;i<len;i++)
        !           220:                {       GET(ch);
        !           221:                        *p++=VAL(ch);
        !           222:                }
        !           223:        }
        !           224:        else
        !           225:        {
        !           226:                for(i=0;i<w;i++)
        !           227:                {       GET(ch);
        !           228:                        *p++=VAL(ch);
        !           229:                }
        !           230:                for(i=0;i<len-w;i++) *p++=' ';
        !           231:        }
        !           232:        return(OK);
        !           233: }
        !           234: 
        !           235: /* THIS IS NOT ALLOWED IN THE NEW STANDARD 'CAUSE IT'S WEIRD */
        !           236: rd_H(n,s) char *s;
        !           237: {      int i,ch;
        !           238:        for(i=0;i<n;i++)
        !           239:                if((ch=(*getn)())<0) return(ch);
        !           240:                else if(ch=='\n') for(;i<n;i++) *s++ = ' ';
        !           241:                else *s++ = ch;
        !           242:        return(OK);
        !           243: }
        !           244: 
        !           245: rd_POS(s) char *s;
        !           246: {      char quote;
        !           247:        int ch;
        !           248:        quote= *s++;
        !           249:        for(;*s;s++)
        !           250:                if(*s==quote && *(s+1)!=quote) break;
        !           251:                else if((ch=(*getn)())<0) return(ch);
        !           252:                else *s = ch=='\n'?' ':ch;
        !           253:        return(OK);
        !           254: }

unix.superglobalmegacorp.com

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