Annotation of researchv10dc/libI77/old1/lread.c, revision 1.1.1.1

1.1       root        1: #include "f2c.h"
                      2: #include "fio.h"
                      3: #include "fmt.h"
                      4: #include "lio.h"
                      5: #include "ctype.h"
                      6: #include "fp.h"
                      7: 
                      8: extern char *f__fmtbuf;
                      9: #ifdef KR_headers
                     10: extern double atof();
                     11: extern char *malloc(), *realloc();
                     12: int (*f__lioproc)(), (*l_getc)(), (*l_ungetc)();
                     13: #else
                     14: #undef abs
                     15: #undef min
                     16: #undef max
                     17: #include "stdlib.h"
                     18: int (*f__lioproc)(ftnint*, char*, ftnlen, ftnint), (*l_getc)(void),
                     19:        (*l_ungetc)(int,FILE*);
                     20: #endif
                     21: int l_eof;
                     22: 
                     23: #define isblnk(x) (f__ltab[x+1]&B)
                     24: #define issep(x) (f__ltab[x+1]&SX)
                     25: #define isapos(x) (f__ltab[x+1]&AX)
                     26: #define isexp(x) (f__ltab[x+1]&EX)
                     27: #define issign(x) (f__ltab[x+1]&SG)
                     28: #define iswhit(x) (f__ltab[x+1]&WH)
                     29: #define SX 1
                     30: #define B 2
                     31: #define AX 4
                     32: #define EX 8
                     33: #define SG 16
                     34: #define WH 32
                     35: char f__ltab[128+1] = {        /* offset one for EOF */
                     36:        0,
                     37:        0,0,AX,0,0,0,0,0,0,WH|B,SX|WH,0,0,0,0,0,
                     38:        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                     39:        SX|B|WH,0,AX,0,0,0,0,AX,0,0,0,SG,SX,SG,0,SX,
                     40:        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                     41:        0,0,0,0,EX,EX,0,0,0,0,0,0,0,0,0,0,
                     42:        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                     43:        AX,0,0,0,EX,EX,0,0,0,0,0,0,0,0,0,0,
                     44:        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
                     45: };
                     46: 
                     47: #ifdef ungetc
                     48:  static int
                     49: #ifdef KR_headers
                     50: un_getc(x,f__cf) int x; FILE *f__cf;
                     51: #else
                     52: un_getc(int x, FILE *f__cf)
                     53: #endif
                     54: { return ungetc(x,f__cf); }
                     55: #else
                     56: #define un_getc ungetc
                     57: #ifdef KR_headers
                     58:  extern int ungetc();
                     59: #endif
                     60: #endif
                     61: 
                     62: t_getc(Void)
                     63: {      int ch;
                     64:        if(f__curunit->uend) return(EOF);
                     65:        if((ch=getc(f__cf))!=EOF) return(ch);
                     66:        if(feof(f__cf))
                     67:                l_eof = f__curunit->uend = 1;
                     68:        return(EOF);
                     69: }
                     70: integer e_rsle(Void)
                     71: {
                     72:        int ch;
                     73:        if(f__curunit->uend) return(0);
                     74:        while((ch=t_getc())!='\n' && ch!=EOF);
                     75:        return(0);
                     76: }
                     77: 
                     78: flag f__lquit;
                     79: int f__lcount,f__ltype,nml_read;
                     80: char *f__lchar;
                     81: double f__lx,f__ly;
                     82: #define ERR(x) if(n=(x)) return(n)
                     83: #define GETC(x) (x=(*l_getc)())
                     84: #define Ungetc(x,y) (*l_ungetc)(x,y)
                     85: 
                     86: #ifdef KR_headers
                     87: l_R(poststar) int poststar;
                     88: #else
                     89: l_R(int poststar)
                     90: #endif
                     91: {
                     92:        char s[FMAX+EXPMAXDIGS+4];
                     93:        register int ch;
                     94:        register char *sp, *spe, *sp1;
                     95:        long e, exp;
                     96:        int havenum, havestar, se;
                     97: 
                     98:        if (!poststar) {
                     99:                if (f__lcount > 0)
                    100:                        return(0);
                    101:                f__lcount = 1;
                    102:                }
                    103:        f__ltype = 0;
                    104:        exp = 0;
                    105:        havestar = 0;
                    106: retry:
                    107:        sp1 = sp = s;
                    108:        spe = sp + FMAX;
                    109:        havenum = 0;
                    110: 
                    111:        switch(GETC(ch)) {
                    112:                case '-': *sp++ = ch; sp1++; spe++;
                    113:                case '+':
                    114:                        GETC(ch);
                    115:                }
                    116:        while(ch == '0') {
                    117:                ++havenum;
                    118:                GETC(ch);
                    119:                }
                    120:        while(isdigit(ch)) {
                    121:                if (sp < spe) *sp++ = ch;
                    122:                else ++exp;
                    123:                GETC(ch);
                    124:                }
                    125:        if (ch == '*' && !poststar) {
                    126:                if (sp == sp1 || exp || *s == '-') {
                    127:                        err(f__elist->cierr,112,"bad repetition count")
                    128:                        }
                    129:                poststar = havestar = 1;
                    130:                *sp = 0;
                    131:                f__lcount = atoi(s);
                    132:                goto retry;
                    133:                }
                    134:        if (ch == '.') {
                    135:                GETC(ch);
                    136:                if (sp == sp1)
                    137:                        while(ch == '0') {
                    138:                                ++havenum;
                    139:                                --exp;
                    140:                                GETC(ch);
                    141:                                }
                    142:                while(isdigit(ch)) {
                    143:                        if (sp < spe)
                    144:                                { *sp++ = ch; --exp; }
                    145:                        GETC(ch);
                    146:                        }
                    147:                }
                    148:        se = 0;
                    149:        if (issign(ch))
                    150:                goto signonly;
                    151:        if (isexp(ch)) {
                    152:                GETC(ch);
                    153:                if (issign(ch)) {
                    154: signonly:
                    155:                        if (ch == '-') se = 1;
                    156:                        GETC(ch);
                    157:                        }
                    158:                if (!isdigit(ch)) {
                    159: bad:
                    160:                        err(f__elist->cierr,112,"exponent field")
                    161:                        }
                    162: 
                    163:                e = ch - '0';
                    164:                while(isdigit(GETC(ch))) {
                    165:                        e = 10*e + ch - '0';
                    166:                        if (e > EXPMAX)
                    167:                                goto bad;
                    168:                        }
                    169:                if (se)
                    170:                        exp -= e;
                    171:                else
                    172:                        exp += e;
                    173:                }
                    174:        (void) Ungetc(ch, f__cf);
                    175:        if (sp > sp1) {
                    176:                ++havenum;
                    177:                while(*--sp == '0')
                    178:                        ++exp;
                    179:                if (exp)
                    180:                        sprintf(sp+1, "e%ld", exp);
                    181:                else
                    182:                        sp[1] = 0;
                    183:                f__lx = atof(s);
                    184:                }
                    185:        else
                    186:                f__lx = 0.;
                    187:        if (havenum)
                    188:                f__ltype = TYLONG;
                    189:        else
                    190:                switch(ch) {
                    191:                        case ',':
                    192:                        case '/':
                    193:                                break;
                    194:                        default:
                    195:                                if (havestar && ( ch == ' '
                    196:                                                ||ch == '\t'
                    197:                                                ||ch == '\n'))
                    198:                                        break;
                    199:                                if (nml_read > 1) {
                    200:                                        f__lquit = 2;
                    201:                                        return 0;
                    202:                                        }
                    203:                                err(f__elist->cierr,112,"invalid number")
                    204:                        }
                    205:        return 0;
                    206:        }
                    207: 
                    208:  static int
                    209: #ifdef KR_headers
                    210: rd_count(ch) register int ch;
                    211: #else
                    212: rd_count(register int ch)
                    213: #endif
                    214: {
                    215:        if (ch < '0' || ch > '9')
                    216:                return 1;
                    217:        f__lcount = ch - '0';
                    218:        while(GETC(ch) >= '0' && ch <= '9')
                    219:                f__lcount = 10*f__lcount + ch - '0';
                    220:        Ungetc(ch,f__cf);
                    221:        return f__lcount <= 0;
                    222:        }
                    223: 
                    224: l_C(Void)
                    225: {      int ch, nml_save;
                    226:        double lz;
                    227:        if(f__lcount>0) return(0);
                    228:        f__ltype=0;
                    229:        GETC(ch);
                    230:        if(ch!='(')
                    231:        {
                    232:                if (nml_read > 1 && (ch < '0' || ch > '9')) {
                    233:                        Ungetc(ch,f__cf);
                    234:                        f__lquit = 2;
                    235:                        return 0;
                    236:                        }
                    237:                if (rd_count(ch))
                    238:                        if(!f__cf || !feof(f__cf))
                    239:                                err(f__elist->cierr,112,"complex format")
                    240:                        else
                    241:                                err(f__elist->cierr,(EOF),"lread");
                    242:                if(GETC(ch)!='*')
                    243:                {
                    244:                        if(!f__cf || !feof(f__cf))
                    245:                                err(f__elist->cierr,112,"no star")
                    246:                        else
                    247:                                err(f__elist->cierr,(EOF),"lread");
                    248:                }
                    249:                if(GETC(ch)!='(')
                    250:                {       Ungetc(ch,f__cf);
                    251:                        return(0);
                    252:                }
                    253:        }
                    254:        else
                    255:                f__lcount = 1;
                    256:        while(iswhit(GETC(ch)));
                    257:        Ungetc(ch,f__cf);
                    258:        nml_save = nml_read;
                    259:        nml_read = 0;
                    260:        if (ch = l_R(1))
                    261:                return ch;
                    262:        if (!f__ltype)
                    263:                err(f__elist->cierr,112,"no real part");
                    264:        lz = f__lx;
                    265:        while(iswhit(GETC(ch)));
                    266:        if(ch!=',')
                    267:        {       (void) Ungetc(ch,f__cf);
                    268:                err(f__elist->cierr,112,"no comma");
                    269:        }
                    270:        while(iswhit(GETC(ch)));
                    271:        (void) Ungetc(ch,f__cf);
                    272:        if (ch = l_R(1))
                    273:                return ch;
                    274:        if (!f__ltype)
                    275:                err(f__elist->cierr,112,"no imaginary part");
                    276:        while(iswhit(GETC(ch)));
                    277:        if(ch!=')') err(f__elist->cierr,112,"no )");
                    278:        f__ly = f__lx;
                    279:        f__lx = lz;
                    280:        nml_read = nml_save;
                    281:        return(0);
                    282: }
                    283: l_L(Void)
                    284: {
                    285:        int ch;
                    286:        if(f__lcount>0) return(0);
                    287:        f__ltype=0;
                    288:        GETC(ch);
                    289:        if(isdigit(ch))
                    290:        {
                    291:                rd_count(ch);
                    292:                if(GETC(ch)!='*')
                    293:                        if(!f__cf || !feof(f__cf))
                    294:                                err(f__elist->cierr,112,"no star")
                    295:                        else
                    296:                                err(f__elist->cierr,(EOF),"lread");
                    297:                GETC(ch);
                    298:        }
                    299:        if(ch == '.') GETC(ch);
                    300:        switch(ch)
                    301:        {
                    302:        case 't':
                    303:        case 'T':
                    304:                f__lx=1;
                    305:                break;
                    306:        case 'f':
                    307:        case 'F':
                    308:                f__lx=0;
                    309:                break;
                    310:        default:
                    311:                if(isblnk(ch) || issep(ch) || ch==EOF)
                    312:                {       (void) Ungetc(ch,f__cf);
                    313:                        return(0);
                    314:                }
                    315:                else    err(f__elist->cierr,112,"logical");
                    316:        }
                    317:        f__ltype=TYLONG;
                    318:        f__lcount = 1;
                    319:        while(!issep(GETC(ch)) && ch!=EOF);
                    320:        (void) Ungetc(ch, f__cf);
                    321:        return(0);
                    322: }
                    323: #define BUFSIZE        128
                    324: l_CHAR(Void)
                    325: {      int ch,size,i;
                    326:        char quote,*p;
                    327:        if(f__lcount>0) return(0);
                    328:        f__ltype=0;
                    329:        if(f__lchar!=NULL) free(f__lchar);
                    330:        size=BUFSIZE;
                    331:        p=f__lchar=malloc((unsigned int)size);
                    332:        if(f__lchar==NULL) err(f__elist->cierr,113,"no space");
                    333: 
                    334:        GETC(ch);
                    335:        if(isdigit(ch)) {
                    336:                /* allow Fortran 8x-style unquoted string...    */
                    337:                /* either find a repetition count or the string */
                    338:                f__lcount = ch - '0';
                    339:                *p++ = ch;
                    340:                for(i = 1;;) {
                    341:                        switch(GETC(ch)) {
                    342:                                case '*':
                    343:                                        if (f__lcount == 0) {
                    344:                                                f__lcount = 1;
                    345:                                                goto noquote;
                    346:                                                }
                    347:                                        p = f__lchar;
                    348:                                        goto have_lcount;
                    349:                                case ',':
                    350:                                case ' ':
                    351:                                case '\t':
                    352:                                case '\n':
                    353:                                case '/':
                    354:                                        Ungetc(ch,f__cf);
                    355:                                        /* no break */
                    356:                                case EOF:
                    357:                                        f__lcount = 1;
                    358:                                        f__ltype = TYCHAR;
                    359:                                        return *p = 0;
                    360:                                }
                    361:                        if (!isdigit(ch)) {
                    362:                                f__lcount = 1;
                    363:                                goto noquote;
                    364:                                }
                    365:                        *p++ = ch;
                    366:                        f__lcount = 10*f__lcount + ch - '0';
                    367:                        if (++i == size) {
                    368:                                f__lchar = realloc(f__lchar,
                    369:                                        (unsigned int)(size += BUFSIZE));
                    370:                                p = f__lchar + i;
                    371:                                }
                    372:                        }
                    373:                }
                    374:        else    (void) Ungetc(ch,f__cf);
                    375:  have_lcount:
                    376:        if(GETC(ch)=='\'' || ch=='"') quote=ch;
                    377:        else if(isblnk(ch) || (issep(ch) && ch != '\n') || ch==EOF)
                    378:        {       (void) Ungetc(ch,f__cf);
                    379:                return(0);
                    380:        }
                    381:        else {
                    382:                /* Fortran 8x-style unquoted string */
                    383:                *p++ = ch;
                    384:                for(i = 1;;) {
                    385:                        switch(GETC(ch)) {
                    386:                                case ',':
                    387:                                case ' ':
                    388:                                case '\t':
                    389:                                case '\n':
                    390:                                case '/':
                    391:                                        Ungetc(ch,f__cf);
                    392:                                        /* no break */
                    393:                                case EOF:
                    394:                                        f__ltype = TYCHAR;
                    395:                                        return *p = 0;
                    396:                                }
                    397:  noquote:
                    398:                        *p++ = ch;
                    399:                        if (++i == size) {
                    400:                                f__lchar = realloc(f__lchar,
                    401:                                        (unsigned int)(size += BUFSIZE));
                    402:                                p = f__lchar + i;
                    403:                                }
                    404:                        }
                    405:                }
                    406:        f__ltype=TYCHAR;
                    407:        for(i=0;;)
                    408:        {       while(GETC(ch)!=quote && ch!='\n'
                    409:                        && ch!=EOF && ++i<size) *p++ = ch;
                    410:                if(i==size)
                    411:                {
                    412:                newone:
                    413:                        f__lchar= realloc(f__lchar, (unsigned int)(size += BUFSIZE));
                    414:                        p=f__lchar+i-1;
                    415:                        *p++ = ch;
                    416:                }
                    417:                else if(ch==EOF) return(EOF);
                    418:                else if(ch=='\n')
                    419:                {       if(*(p-1) != '\\') continue;
                    420:                        i--;
                    421:                        p--;
                    422:                        if(++i<size) *p++ = ch;
                    423:                        else goto newone;
                    424:                }
                    425:                else if(GETC(ch)==quote)
                    426:                {       if(++i<size) *p++ = ch;
                    427:                        else goto newone;
                    428:                }
                    429:                else
                    430:                {       (void) Ungetc(ch,f__cf);
                    431:                        *p = 0;
                    432:                        return(0);
                    433:                }
                    434:        }
                    435: }
                    436: #ifdef KR_headers
                    437: c_le(a) cilist *a;
                    438: #else
                    439: c_le(cilist *a)
                    440: #endif
                    441: {
                    442:        f__fmtbuf="list io";
                    443:        if(a->ciunit>=MXUNIT || a->ciunit<0)
                    444:                err(a->cierr,101,"stler");
                    445:        f__scale=f__recpos=0;
                    446:        f__elist=a;
                    447:        f__curunit = &f__units[a->ciunit];
                    448:        if(f__curunit->ufd==NULL && fk_open(SEQ,FMT,a->ciunit))
                    449:                err(a->cierr,102,"lio");
                    450:        f__cf=f__curunit->ufd;
                    451:        if(!f__curunit->ufmt) err(a->cierr,103,"lio")
                    452:        return(0);
                    453: }
                    454: #ifdef KR_headers
                    455: l_read(number,ptr,len,type) ftnint *number,type; char *ptr; ftnlen len;
                    456: #else
                    457: l_read(ftnint *number, char *ptr, ftnlen len, ftnint type)
                    458: #endif
                    459: {
                    460: #define Ptr ((flex *)ptr)
                    461:        int i,n,ch;
                    462:        doublereal *yy;
                    463:        real *xx;
                    464:        for(i=0;i<*number;i++)
                    465:        {
                    466:                if(f__lquit) return(0);
                    467:                if(l_eof)
                    468:                        err(f__elist->ciend, EOF, "list in")
                    469:                if(f__lcount == 0) {
                    470:                        f__ltype = 0;
                    471:                        for(;;)  {
                    472:                                GETC(ch);
                    473:                                switch(ch) {
                    474:                                case EOF:
                    475:                                        goto loopend;
                    476:                                case ' ':
                    477:                                case '\t':
                    478:                                case '\n':
                    479:                                        continue;
                    480:                                case '/':
                    481:                                        f__lquit = 1;
                    482:                                        goto loopend;
                    483:                                case ',':
                    484:                                        f__lcount = 1;
                    485:                                        goto loopend;
                    486:                                default:
                    487:                                        (void) Ungetc(ch, f__cf);
                    488:                                        goto rddata;
                    489:                                }
                    490:                        }
                    491:                }
                    492:        rddata:
                    493:                switch((int)type)
                    494:                {
                    495:                case TYINT1:
                    496:                case TYSHORT:
                    497:                case TYLONG:
                    498: #ifdef TYQUAD
                    499:                case TYQUAD:
                    500: #endif
                    501:                case TYREAL:
                    502:                case TYDREAL:
                    503:                        ERR(l_R(0));
                    504:                        break;
                    505:                case TYCOMPLEX:
                    506:                case TYDCOMPLEX:
                    507:                        ERR(l_C());
                    508:                        break;
                    509:                case TYLOGICAL1:
                    510:                case TYLOGICAL2:
                    511:                case TYLOGICAL:
                    512:                        ERR(l_L());
                    513:                        break;
                    514:                case TYCHAR:
                    515:                        ERR(l_CHAR());
                    516:                        break;
                    517:                }
                    518:        while (GETC(ch) == ' ' || ch == '\t');
                    519:        if (ch != ',' || f__lcount > 1)
                    520:                Ungetc(ch,f__cf);
                    521:        loopend:
                    522:                if(f__lquit) return(0);
                    523:                if(f__cf) {
                    524:                        if (feof(f__cf))
                    525:                                err(f__elist->ciend,(EOF),"list in")
                    526:                        else if(ferror(f__cf)) {
                    527:                                clearerr(f__cf);
                    528:                                err(f__elist->cierr,errno,"list in")
                    529:                                }
                    530:                        }
                    531:                if(f__ltype==0) goto bump;
                    532:                switch((int)type)
                    533:                {
                    534:                case TYINT1:
                    535:                case TYLOGICAL1:
                    536:                        Ptr->flchar = f__lx;
                    537:                        break;
                    538:                case TYLOGICAL2:
                    539:                case TYSHORT:
                    540:                        Ptr->flshort=f__lx;
                    541:                        break;
                    542:                case TYLOGICAL:
                    543:                case TYLONG:
                    544:                        Ptr->flint=f__lx;
                    545:                        break;
                    546: #ifdef TYQUAD
                    547:                case TYQUAD:
                    548:                        Ptr->fllongint = f__lx;
                    549:                        break;
                    550: #endif
                    551:                case TYREAL:
                    552:                        Ptr->flreal=f__lx;
                    553:                        break;
                    554:                case TYDREAL:
                    555:                        Ptr->fldouble=f__lx;
                    556:                        break;
                    557:                case TYCOMPLEX:
                    558:                        xx=(real *)ptr;
                    559:                        *xx++ = f__lx;
                    560:                        *xx = f__ly;
                    561:                        break;
                    562:                case TYDCOMPLEX:
                    563:                        yy=(doublereal *)ptr;
                    564:                        *yy++ = f__lx;
                    565:                        *yy = f__ly;
                    566:                        break;
                    567:                case TYCHAR:
                    568:                        b_char(f__lchar,ptr,len);
                    569:                        break;
                    570:                }
                    571:        bump:
                    572:                if(f__lcount>0) f__lcount--;
                    573:                ptr += len;
                    574:                if (nml_read)
                    575:                        nml_read++;
                    576:        }
                    577:        return(0);
                    578: #undef Ptr
                    579: }
                    580: #ifdef KR_headers
                    581: integer s_rsle(a) cilist *a;
                    582: #else
                    583: integer s_rsle(cilist *a)
                    584: #endif
                    585: {
                    586:        int n;
                    587: 
                    588:        if(!f__init) f_init();
                    589:        if(n=c_le(a)) return(n);
                    590:        f__reading=1;
                    591:        f__external=1;
                    592:        f__formatted=1;
                    593:        f__lioproc = l_read;
                    594:        f__lquit = 0;
                    595:        f__lcount = 0;
                    596:        l_eof = 0;
                    597:        if(f__curunit->uwrt && f__nowreading(f__curunit))
                    598:                err(a->cierr,errno,"read start");
                    599:        l_getc = t_getc;
                    600:        l_ungetc = un_getc;
                    601:        return(0);
                    602: }

unix.superglobalmegacorp.com

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