Annotation of 3BSD/libI77/lread.c, revision 1.1

1.1     ! root        1: #include "fio.h"
        !             2: #include "fmt.h"
        !             3: #include "lio.h"
        !             4: #include "ctype.h"
        !             5: extern char *fmtbuf;
        !             6: int (*lioproc)();
        !             7: 
        !             8: #define isblnk(x) (ltab[x+1]&B)
        !             9: #define issep(x) (ltab[x+1]&SX)
        !            10: #define isapos(x) (ltab[x+1]&AX)
        !            11: #define isexp(x) (ltab[x+1]&EX)
        !            12: #define issign(x) (ltab[x+1]&SG)
        !            13: #define SX 1
        !            14: #define B 2
        !            15: #define AX 4
        !            16: #define EX 8
        !            17: #define SG 16
        !            18: char ltab[128+1] = {   /* offset one for EOF */
        !            19:        0,
        !            20:        0,0,AX,0,0,0,0,0,0,0,SX,0,0,0,0,0,
        !            21:        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        !            22:        SX|B,0,AX,0,0,0,0,AX,0,0,0,SG,SX,SG,0,SX,
        !            23:        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        !            24:        0,0,0,0,EX,EX,0,0,0,0,0,0,0,0,0,0,
        !            25:        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        !            26:        AX,0,0,0,EX,EX,0,0,0,0,0,0,0,0,0,0,
        !            27:        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
        !            28: };
        !            29: 
        !            30: char l_comma, l_first;
        !            31: t_getc()
        !            32: {      int ch;
        !            33:        if(curunit->uend) return(EOF);
        !            34:        if((ch=getc(cf))!=EOF) return(ch);
        !            35:        if(feof(cf)) curunit->uend = 1;
        !            36:        return(EOF);
        !            37: }
        !            38: e_rsle()
        !            39: {
        !            40:        int ch;
        !            41:        if(curunit->uend) return(0);
        !            42:        while((ch=t_getc())!='\n' && ch!=EOF);
        !            43:        return(0);
        !            44: }
        !            45: 
        !            46: flag lquit;
        !            47: int lcount,ltype;
        !            48: char *lchar;
        !            49: double lx,ly;
        !            50: #define ERR(x) if(n=(x)) return(n)
        !            51: #define GETC(x) (x=t_getc())
        !            52: 
        !            53: l_read(number,ptr,len,type) ftnint *number,type; flex *ptr; ftnlen len;
        !            54: {      int i,n,ch;
        !            55:        double *yy;
        !            56:        float *xx;
        !            57:        for(i=0;i<*number;i++)
        !            58:        {
        !            59:                if(lquit) return(0);
        !            60:                if(curunit->uend) err(elist->ciend, EOF, "list in")
        !            61:                if(lcount == 0) {
        !            62:                        ltype = NULL;
        !            63:                        if(!l_first) l_comma = 0;
        !            64:                        else l_first = 0;
        !            65:                        for(;;)  {
        !            66:                                GETC(ch);
        !            67:                                switch(ch) {
        !            68:                                case EOF:
        !            69:                                        goto loopend;
        !            70:                                case ' ':
        !            71:                                case '\n':
        !            72:                                        continue;
        !            73:                                case '/':
        !            74:                                        lquit = 1;
        !            75:                                        goto loopend;
        !            76:                                case ',':
        !            77:                                        if(l_comma) {
        !            78:                                                lcount = 1;
        !            79:                                                ungetc(ch, cf);
        !            80:                                                goto loopend;
        !            81:                                        }
        !            82:                                        l_comma = 1;
        !            83:                                        continue;
        !            84:                                default:
        !            85:                                        ungetc(ch, cf);
        !            86:                                        goto rddata;
        !            87:                                }
        !            88:                        }
        !            89:                }
        !            90:        rddata:
        !            91:                switch((int)type)
        !            92:                {
        !            93:                case TYSHORT:
        !            94:                case TYLONG:
        !            95:                case TYREAL:
        !            96:                case TYDREAL:
        !            97:                        ERR(l_R());
        !            98:                        break;
        !            99:                case TYCOMPLEX:
        !           100:                case TYDCOMPLEX:
        !           101:                        ERR(l_C());
        !           102:                        break;
        !           103:                case TYLOGICAL:
        !           104:                        ERR(l_L());
        !           105:                        break;
        !           106:                case TYCHAR:
        !           107:                        ERR(l_CHAR());
        !           108:                        break;
        !           109:                }
        !           110:        loopend:
        !           111:                if(lquit) return(0);
        !           112:                if(feof(cf)) err(elist->ciend,(EOF),"list in")
        !           113:                else if(ferror(cf))
        !           114:                {       clearerr(cf);
        !           115:                        err(elist->cierr,errno,"list in")
        !           116:                }
        !           117:                if(ltype==NULL) goto bump;
        !           118:                switch((int)type)
        !           119:                {
        !           120:                case TYSHORT:
        !           121:                        ptr->flshort=lx;
        !           122:                        break;
        !           123:                case TYLOGICAL:
        !           124:                case TYLONG:
        !           125:                        ptr->flint=lx;
        !           126:                        break;
        !           127:                case TYREAL:
        !           128:                        ptr->flreal=lx;
        !           129:                        break;
        !           130:                case TYDREAL:
        !           131:                        ptr->fldouble=lx;
        !           132:                        break;
        !           133:                case TYCOMPLEX:
        !           134:                        xx=(float *)ptr;
        !           135:                        *xx++ = lx;
        !           136:                        *xx = ly;
        !           137:                        break;
        !           138:                case TYDCOMPLEX:
        !           139:                        yy=(double *)ptr;
        !           140:                        *yy++ = lx;
        !           141:                        *yy = ly;
        !           142:                        break;
        !           143:                case TYCHAR:
        !           144:                        b_char(lchar,(char *)ptr,len);
        !           145:                        break;
        !           146:                }
        !           147:        bump:
        !           148:                if(lcount>0) lcount--;
        !           149:                ptr = (flex *)((char *)ptr + len);
        !           150:        }
        !           151:        return(0);
        !           152: }
        !           153: l_R()
        !           154: {      double a,b,c,d;
        !           155:        int i,ch,sign=0,da,db,dc;
        !           156:        a=b=c=d=0;
        !           157:        da=db=dc=0;
        !           158:        if(lcount>0) return(0);
        !           159:        ltype=NULL;
        !           160:        da=rd_int(&a);
        !           161:        if(da== -1) sign=da;
        !           162:        if(GETC(ch)!='*')
        !           163:        {       ungetc(ch,cf);
        !           164:                db=1;
        !           165:                b=a;
        !           166:                a=1;
        !           167:        }
        !           168:        else
        !           169:                db=rd_int(&b);
        !           170:        if(GETC(ch)!='.')
        !           171:        {       dc=c=0;
        !           172:                ungetc(ch,cf);
        !           173:        }
        !           174:        else    dc=rd_int(&c);
        !           175:        if(isexp(GETC(ch))) db=rd_int(&d);
        !           176:        else if(issign(ch))
        !           177:        {       ungetc(ch, cf);
        !           178:                db = rd_int(&d);
        !           179:        }
        !           180:        else
        !           181:        {       ungetc(ch,cf);
        !           182:                d=0;
        !           183:        }
        !           184:        lcount=a;
        !           185:        if(!db && !dc)
        !           186:                return(0);
        !           187:        if(db && b<0)
        !           188:        {       sign=1;
        !           189:                b = -b;
        !           190:        }
        !           191:        for(i=0;i<dc;i++) c/=10;
        !           192:        b=b+c;
        !           193:        for(i=0;i<d;i++) b *= 10;
        !           194:        for(i=0;i< -d;i++) b /= 10;
        !           195:        if(sign) b = -b;
        !           196:        ltype=TYLONG;
        !           197:        lx=b;
        !           198:        return(0);
        !           199: }
        !           200: rd_int(x) double *x;
        !           201: {      int ch,sign=0,i;
        !           202:        double y;
        !           203:        i=0;
        !           204:        y=0;
        !           205:        if(GETC(ch)=='-') sign = -1;
        !           206:        else if(ch=='+') sign=0;
        !           207:        else ungetc(ch,cf);
        !           208:        while(isdigit(GETC(ch)))
        !           209:        {       i++;
        !           210:                y=10*y+ch-'0';
        !           211:        }
        !           212:        ungetc(ch,cf);
        !           213:        if(sign) y = -y;
        !           214:        *x = y;
        !           215:        return(y!=0?i:sign);
        !           216: }
        !           217: l_C()
        !           218: {      int ch;
        !           219:        if(lcount>0) return(0);
        !           220:        ltype=NULL;
        !           221:        GETC(ch);
        !           222:        if(ch!='(')
        !           223:        {       if(fscanf(cf,"%d",&lcount)!=1)
        !           224:                        if(!feof(cf)) err(elist->cierr,112,"complex format")
        !           225:                        else err(elist->cierr,(EOF),"lread");
        !           226:                if(GETC(ch)!='*')
        !           227:                {       ungetc(ch,cf);
        !           228:                        if(!feof(cf)) err(elist->cierr,112,"no star")
        !           229:                        else err(elist->cierr,(EOF),"lread");
        !           230:                }
        !           231:                if(GETC(ch)!='(')
        !           232:                {       ungetc(ch,cf);
        !           233:                        return(0);
        !           234:                }
        !           235:        }
        !           236:        lcount = 1;
        !           237:        ltype=TYLONG;
        !           238:        fscanf(cf,"%lf",&lx);
        !           239:        while(isblnk(GETC(ch)) || (ch == '\n'));
        !           240:        if(ch!=',')
        !           241:        {       ungetc(ch,cf);
        !           242:                err(elist->cierr,112,"no comma");
        !           243:        }
        !           244:        while(isblnk(GETC(ch)));
        !           245:        ungetc(ch,cf);
        !           246:        fscanf(cf,"%lf",&ly);
        !           247:        while(isblnk(GETC(ch)));
        !           248:        if(ch!=')') err(elist->cierr,112,"no )");
        !           249:        while(isblnk(GETC(ch)));
        !           250:        if(ch != '\n') ungetc(ch,cf);
        !           251:        return(0);
        !           252: }
        !           253: l_L()
        !           254: {
        !           255:        int ch;
        !           256:        if(lcount>0) return(0);
        !           257:        ltype=NULL;
        !           258:        GETC(ch);
        !           259:        if(isdigit(ch))
        !           260:        {       ungetc(ch,cf);
        !           261:                fscanf(cf,"%d",&lcount);
        !           262:                if(GETC(ch)!='*')
        !           263:                        if(!feof(cf)) err(elist->cierr,112,"no star")
        !           264:                        else err(elist->cierr,(EOF),"lread");
        !           265:        }
        !           266:        else    ungetc(ch,cf);
        !           267:        if(GETC(ch)=='.') GETC(ch);
        !           268:        switch(ch)
        !           269:        {
        !           270:        case 't':
        !           271:        case 'T':
        !           272:                lx=1;
        !           273:                break;
        !           274:        case 'f':
        !           275:        case 'F':
        !           276:                lx=0;
        !           277:                break;
        !           278:        default:
        !           279:                if(isblnk(ch) || issep(ch) || ch==EOF)
        !           280:                {       ungetc(ch,cf);
        !           281:                        return(0);
        !           282:                }
        !           283:                else    err(elist->cierr,112,"logical");
        !           284:        }
        !           285:        ltype=TYLONG;
        !           286:        lcount = 1;
        !           287:        while(!issep(GETC(ch)) && ch!=EOF);
        !           288:        ungetc(ch, cf);
        !           289:        return(0);
        !           290: }
        !           291: #define BUFSIZE        128
        !           292: l_CHAR()
        !           293: {      int ch,size,i;
        !           294:        char quote,*p;
        !           295:        if(lcount>0) return(0);
        !           296:        ltype=NULL;
        !           297: 
        !           298:        GETC(ch);
        !           299:        if(isdigit(ch))
        !           300:        {       ungetc(ch,cf);
        !           301:                fscanf(cf,"%d",&lcount);
        !           302:                if(GETC(ch)!='*') err(elist->cierr,112,"no star");
        !           303:        }
        !           304:        else    ungetc(ch,cf);
        !           305:        if(GETC(ch)=='\'' || ch=='"') quote=ch;
        !           306:        else if(isblnk(ch) || (issep(ch) && ch != '\n') || ch==EOF)
        !           307:        {       ungetc(ch,cf);
        !           308:                return(0);
        !           309:        }
        !           310:        else err(elist->cierr,112,"no quote");
        !           311:        ltype=TYCHAR;
        !           312:        if(lchar!=NULL) free(lchar);
        !           313:        size=BUFSIZE;
        !           314:        p=lchar=(char *)malloc(size);
        !           315:        if(lchar==NULL) err(elist->cierr,113,"no space");
        !           316:        for(i=0;;)
        !           317:        {       while(GETC(ch)!=quote && ch!='\n'
        !           318:                        && ch!=EOF && ++i<size) *p++ = ch;
        !           319:                if(i==size)
        !           320:                {
        !           321:                newone:
        !           322:                        lchar=(char *)realloc(lchar, size += BUFSIZE);
        !           323:                        p=lchar+i-1;
        !           324:                        *p++ = ch;
        !           325:                }
        !           326:                else if(ch==EOF) return(EOF);
        !           327:                else if(ch=='\n')
        !           328:                {       if(*(p-1) != '\\') continue;
        !           329:                        i--;
        !           330:                        p--;
        !           331:                        if(++i<size) *p++ = ch;
        !           332:                        else goto newone;
        !           333:                }
        !           334:                else if(GETC(ch)==quote)
        !           335:                {       if(++i<size) *p++ = ch;
        !           336:                        else goto newone;
        !           337:                }
        !           338:                else
        !           339:                {       ungetc(ch,cf);
        !           340:                        *p++ = 0;
        !           341:                        return(0);
        !           342:                }
        !           343:        }
        !           344: }
        !           345: s_rsle(a) cilist *a;
        !           346: {
        !           347:        int n;
        !           348:        if(!init) f_init();
        !           349:        if(n=c_le(a,READ)) return(n);
        !           350:        reading=1;
        !           351:        external=1;
        !           352:        formatted=1;
        !           353:        l_first=1;
        !           354:        l_comma = 1;
        !           355:        lioproc = l_read;
        !           356:        lquit = 0;
        !           357:        lcount = 0;
        !           358:        if(curunit->uwrt)
        !           359:                return(nowreading(curunit));
        !           360:        else    return(0);
        !           361: }
        !           362: c_le(a,flag) cilist *a;
        !           363: {
        !           364:        fmtbuf="list io";
        !           365:        if(a->ciunit>=MXUNIT || a->ciunit<0)
        !           366:                err(a->cierr,101,"stler");
        !           367:        scale=recpos=0;
        !           368:        elist=a;
        !           369:        curunit = &units[a->ciunit];
        !           370:        if(curunit->ufd==NULL && fk_open(flag,SEQ,FMT,a->ciunit))
        !           371:                err(a->cierr,102,"lio");
        !           372:        cf=curunit->ufd;
        !           373:        if(!curunit->ufmt) err(a->cierr,103,"lio")
        !           374:        return(0);
        !           375: }
        !           376: do_lio(type,number,ptr,len) ftnint *number,*type; flex *ptr; ftnlen len;
        !           377: {
        !           378:        return((*lioproc)(number,ptr,len,*type));
        !           379: }

unix.superglobalmegacorp.com

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