Annotation of researchv10no/cmd/f2c/libI77.st0, revision 1.1.1.1

1.1       root        1: ./ ADD NAME=libI77/README TIME=627747849
                      2: If your system lacks /usr/include/local.h ,
                      3: then you should create an appropriate local.h in
                      4: this directory.  An appropriate local.h may simply
                      5: be empty, or it may #define VAX or #define CRAY
                      6: (or whatever else you must do to make fp.h work right).
                      7: Alternatively, edit fp.h to suite your machine.
                      8: 
                      9: If your system's sprintf does not work the way ANSI C
                     10: specifies -- specifically, if it does not return the
                     11: number of characters transmitted -- then insert the line
                     12: 
                     13: #define USE_STRLEN
                     14: 
                     15: at the beginning of wref.c .  This is necessary with
                     16: at least some versions of Sun software.
                     17: 
                     18: If you get error messages about references to cf->_ptr
                     19: and cf->_base when compiling wrtfmt.c and wsfe.c or to
                     20: stderr->_flag when compiling err.c, then insert the line
                     21: 
                     22: #define NON_UNIX_STDIO
                     23: 
                     24: at the beginning of fio.h, and recompile these modules.
                     25: 
                     26: You may need to supply the following non-ANSI routines:
                     27: 
                     28:   access(char *Name, 0) is supposed to return 0
                     29: if file Name exists, nonzero otherwise.
                     30: 
                     31:   fstat(int fileds, struct stat *buf) is similar
                     32: to stat(char *name, struct stat *buf), except that
                     33: the first argument, fileds, is the file descriptor
                     34: returned by open rather than the name of the file.
                     35: fstat is used in the system-dependent routine
                     36: canseek (in the libI77 source file err.c), which
                     37: is supposed to return 1 if it's possible to issue
                     38: seeks on the file in question, 0 if it's not; you may
                     39: need to suitably modify err.c
                     40: 
                     41:   char * mktemp(char *buf) is supposed to replace the
                     42: 6 trailing X's in buf with a unique number and then
                     43: return buf.  The idea is to get a unique name for
                     44: a temporary file.
                     45: ./ ADD NAME=libI77/makefile TIME=628988590
                     46: .SUFFIXES: .c .o
                     47: 
                     48: CFLAGS =-I. -O
                     49: 
                     50: # compile, then strip unnecessary symbols
                     51: .c.o:
                     52:        cc $(CFLAGS) -c $*.c
                     53:        ld -r -x $*.o
                     54:        mv a.out $*.o
                     55: 
                     56: OBJ =  Version.o backspace.o dfe.o due.o iio.o inquire.o rewind.o rsfe.o \
                     57:        rdfmt.o sue.o uio.o wsfe.o sfe.o fmt.o lio.o lread.o open.o \
                     58:        close.o util.o endfile.o wrtfmt.o wref.o err.o fmtlib.o
                     59: 
                     60: libI77.a:      $(OBJ)
                     61:                ar r libI77.a $?
                     62:                ranlib libI77.a
                     63: install:       libI77.a
                     64:        cp libI77.a /usr/lib/libI77.a
                     65:        ranlib /usr/lib/libI77.a
                     66: 
                     67: lio.o: lio.h
                     68: SRC=   lio.h fio.h fmt.h backspace.c dfe.c due.c iio.c inquire.c rewind.c \
                     69:        rsfe.c rdfmt.c sue.c uio.c wsfe.c sfe.c fmt.c lio.c lread.c open.c \
                     70:        close.c util.c endfile.c wrtfmt.c wref.c err.c fmtlib.c
                     71: 
                     72: Version.o: Version.c
                     73:        cc -c Version.c
                     74: 
                     75: 
                     76: clean:
                     77:        rm -f $(OBJ) libI77.a
                     78: 
                     79: clobber:       clean
                     80:        rm -f libI77.a
                     81: 
                     82: backspace.o:  fio.h
                     83: close.o:  fio.h
                     84: dfe.o:  fio.h
                     85: dfe.o:  fmt.h
                     86: due.o:  fio.h
                     87: endfile.o:  fio.h
                     88: err.o:  fio.h
                     89: fmt.o:  fio.h
                     90: fmt.o:  fmt.h
                     91: ftest.o:  fio.h
                     92: iio.o:  fio.h
                     93: iio.o:  fmt.h
                     94: inquire.o:  fio.h
                     95: lib.o:  fio.h
                     96: lio.o:  fio.h
                     97: lio.o:  fmt.h
                     98: lio.o:  lio.h
                     99: lread.o:  fio.h
                    100: lread.o:  fmt.h
                    101: lread.o:  lio.h
                    102: lread.o:  fp.h
                    103: nio.o:  fio.h
                    104: nio.o:  fmt.h
                    105: nio.o:  lio.h
                    106: open.o:  fio.h
                    107: rdfmt.o:  fio.h
                    108: rdfmt.o:  fmt.h
                    109: rdfmt.o:  fp.h
                    110: rewind.o:  fio.h
                    111: rsfe.o:  fio.h
                    112: rsfe.o:  fmt.h
                    113: sfe.o:  fio.h
                    114: stest.o:  fio.h
                    115: sue.o:  fio.h
                    116: uio.o:  fio.h
                    117: util.o:  fio.h
                    118: wref.o:  fio.h fmt.h fp.h
                    119: wrtfmt.o:  fio.h
                    120: wrtfmt.o:  fmt.h
                    121: wsfe.o:  fio.h
                    122: wsfe.o:  fmt.h
                    123: namelist.o: fio.h lio.h
                    124: ./ ADD NAME=libI77/Version.c TIME=628965828
                    125: static char junk[] = "\n@(#) LIBI77 VERSION pjw,dmg-mods  6 Dec. 1989\n";
                    126: 
                    127: /*
                    128: 2.01   $ format added
                    129: 2.02   Coding bug in open.c repaired
                    130: 2.03   fixed bugs in lread.c (read * with negative f-format) and lio.c
                    131:        and lio.h (e-format conforming to spec)
                    132: 2.04   changed open.c and err.c (fopen and freopen respectively) to
                    133:        update to new c-library (append mode)
                    134: 2.05   added namelist capability
                    135: */
                    136: 
                    137: /*
                    138: close.c:
                    139:        allow upper-case STATUS= values
                    140: endfile.c
                    141:        create fort.nnn if unit nnn not open;
                    142:        else if (file length == 0) use creat() rather than copy;
                    143:        use local copy() rather than forking /bin/cp;
                    144:        rewind, fseek to clear buffer (for no reading past EOF)
                    145: err.c
                    146:        use neither setbuf nor setvbuf; make stderr buffered
                    147: fio.h
                    148:        #define _bufend
                    149: inquire.c
                    150:        upper case responses;
                    151:        omit byfile test from SEQUENTIAL=
                    152:        answer "YES" to DIRECT= for unopened file (open to debate)
                    153: lio.c
                    154:        flush stderr, stdout at end of each stmt
                    155:        space before character strings in list output only at line start
                    156: lio.h
                    157:        adjust LEW, LED consistent with old libI77
                    158: lread.c
                    159:        use atof()
                    160:        allow "nnn*," when reading complex constants
                    161: open.c
                    162:        try opening for writing when open for read fails, with
                    163:        special uwrt value (2) delaying creat() to first write;
                    164:        set curunit so error messages don't drop core;
                    165:        no file name ==> fort.nnn except for STATUS='SCRATCH'
                    166: rdfmt.c
                    167:        use atof(); trust EOF == end-of-file (so don't read past
                    168:        end-of-file after endfile stmt)
                    169: sfe.c
                    170:        flush stderr, stdout at end of each stmt
                    171: wrtfmt.c:
                    172:        use upper case
                    173:        put wrt_E and wrt_F into wref.c, use sprintf()
                    174:                rather than ecvt() and fcvt() [more accurate on VAX]
                    175: */
                    176: 
                    177: /* 16 Oct. 1988: uwrt = 3 after write, rewind, so close won't zap the file. */
                    178: 
                    179: /* 10 July 1989: change _bufend to buf_end in fio.h, wsfe.c, wrtfmt.c */
                    180: 
                    181: /* 28 Nov. 1989: corrections for IEEE and Cray arithmetic */
                    182: /* 29 Nov. 1989: change various int return types to long for f2c */
                    183: /* 30 Nov. 1989: various types from f2c.h */
                    184: /* 6 Dec. 1989: types corrected various places */
                    185: ./ ADD NAME=libI77/backspace.c TIME=628440563
                    186: #include "f2c.h"
                    187: #include "fio.h"
                    188: integer f_back(a) alist *a;
                    189: {      unit *b;
                    190:        int n,i;
                    191:        long x;
                    192:        char buf[32];
                    193:        if(a->aunit >= MXUNIT || a->aunit < 0)
                    194:                err(a->aerr,101,"backspace")
                    195:        b= &units[a->aunit];
                    196:        if(b->useek==0) err(a->aerr,106,"backspace")
                    197:        if(b->ufd==NULL) {
                    198:                fk_open(1, 1, a->aunit);
                    199:                return(0);
                    200:                }
                    201:        if(b->uend==1)
                    202:        {       b->uend=0;
                    203:                return(0);
                    204:        }
                    205:        if(b->uwrt) {
                    206:                (void) t_runc(a);
                    207:                if (nowreading(b))
                    208:                        err(a->aerr,errno,"backspace")
                    209:                }
                    210:        if(b->url>0)
                    211:        {       long y;
                    212:                x=ftell(b->ufd);
                    213:                y = x % b->url;
                    214:                if(y == 0) x--;
                    215:                x /= b->url;
                    216:                x *= b->url;
                    217:                (void) fseek(b->ufd,x,0);
                    218:                return(0);
                    219:        }
                    220:        
                    221:        if(b->ufmt==0)
                    222:        {       (void) fseek(b->ufd,-(long)sizeof(int),1);
                    223:                (void) fread((char *)&n,sizeof(int),1,b->ufd);
                    224:                (void) fseek(b->ufd,-(long)n-2*sizeof(int),1);
                    225:                return(0);
                    226:        }
                    227:        for(;;)
                    228:        {       long y;
                    229:                y = x=ftell(b->ufd);
                    230:                if(x<sizeof(buf)) x=0;
                    231:                else x -= sizeof(buf);
                    232:                (void) fseek(b->ufd,x,0);
                    233:                n=fread(buf,1,(int)(y-x), b->ufd);
                    234:                for(i=n-2;i>=0;i--)
                    235:                {
                    236:                        if(buf[i]!='\n') continue;
                    237:                        (void) fseek(b->ufd,(long)(i+1-n),1);
                    238:                        return(0);
                    239:                }
                    240:                if(x==0)
                    241:                        {
                    242:                        (void) fseek(b->ufd, 0L, 0);
                    243:                        return(0);
                    244:                        }
                    245:                else if(n<=0) err(a->aerr,(EOF),"backspace")
                    246:                (void) fseek(b->ufd, x, 0);
                    247:        }
                    248: }
                    249: ./ ADD NAME=libI77/close.c TIME=628440563
                    250: #include "f2c.h"
                    251: #include "fio.h"
                    252: integer f_clos(a) cllist *a;
                    253: {      unit *b;
                    254:        if(a->cunit >= MXUNIT) return(0);
                    255:        b= &units[a->cunit];
                    256:        if(b->ufd==NULL) return(0);
                    257:        b->uend=0;
                    258:        if(a->csta!=0)
                    259:                switch(*a->csta)
                    260:                {
                    261:                default:
                    262:                keep:
                    263:                case 'k':
                    264:                case 'K':
                    265:                        if(b->uwrt == 1) (void) t_runc((alist *)a);
                    266:                        (void) fclose(b->ufd);  /* sys 5 has strange beliefs */
                    267:                        if(b->ufnm!=0) free(b->ufnm);
                    268:                        b->ufnm=NULL;
                    269:                        b->ufd=NULL;
                    270:                        return(0);
                    271:                case 'd':
                    272:                case 'D':
                    273:                delete:
                    274:                        (void) fclose(b->ufd);
                    275:                        if(b->ufnm!=0)
                    276:                        {       (void) unlink(b->ufnm); /*SYSDEP*/
                    277:                                free(b->ufnm);
                    278:                        }
                    279:                        b->ufnm=NULL;
                    280:                        b->ufd=NULL;
                    281:                        return(0);
                    282:                }
                    283:        else if(b->uscrtch==1) goto delete;
                    284:        else goto keep;
                    285: }
                    286:  void
                    287: f_exit()
                    288: {      int i;
                    289:        static cllist xx;
                    290:        if (!xx.cerr) {
                    291:                xx.cerr=1;
                    292:                xx.csta=NULL;
                    293:                for(i=0;i<MXUNIT;i++)
                    294:                {
                    295:                        xx.cunit=i;
                    296:                        (void) f_clos(&xx);
                    297:                }
                    298:        }
                    299: }
                    300: flush_()
                    301: {      int i;
                    302:        for(i=0;i<MXUNIT;i++)
                    303:                if(units[i].ufd != NULL) (void) fflush(units[i].ufd);
                    304: }
                    305: ./ ADD NAME=libI77/dfe.c TIME=629055520
                    306: #include "f2c.h"
                    307: #include "fio.h"
                    308: #include "fmt.h"
                    309: extern int rd_ed(),rd_ned(),y_getc(),y_putc(),y_err();
                    310: extern int y_rev(), y_rsk(), y_newrec();
                    311: extern int w_ed(),w_ned();
                    312: integer s_rdfe(a) cilist *a;
                    313: {
                    314:        int n;
                    315:        if(!init) f_init();
                    316:        if(n=c_dfe(a))return(n);
                    317:        reading=1;
                    318:        if(curunit->uwrt && nowreading(curunit))
                    319:                err(a->cierr,errno,"read start");
                    320:        getn = y_getc;
                    321:        doed = rd_ed;
                    322:        doned = rd_ned;
                    323:        dorevert = donewrec = y_err;
                    324:        doend = y_rsk;
                    325:        if(pars_f(fmtbuf)<0)
                    326:                err(a->cierr,100,"read start");
                    327:        fmt_bg();
                    328:        return(0);
                    329: }
                    330: integer s_wdfe(a) cilist *a;
                    331: {
                    332:        int n;
                    333:        if(!init) f_init();
                    334:        if(n=c_dfe(a)) return(n);
                    335:        reading=0;
                    336:        if(curunit->uwrt != 1 && nowwriting(curunit))
                    337:                err(a->cierr,errno,"startwrt");
                    338:        putn = y_putc;
                    339:        doed = w_ed;
                    340:        doned= w_ned;
                    341:        dorevert = y_err;
                    342:        donewrec = y_newrec;
                    343:        doend = y_rev;
                    344:        if(pars_f(fmtbuf)<0)
                    345:                err(a->cierr,100,"startwrt");
                    346:        fmt_bg();
                    347:        return(0);
                    348: }
                    349: integer e_rdfe()
                    350: {
                    351:        (void) en_fio();
                    352:        return(0);
                    353: }
                    354: integer e_wdfe()
                    355: {
                    356:        (void) en_fio();
                    357:        return(0);
                    358: }
                    359: c_dfe(a) cilist *a;
                    360: {
                    361:        sequential=0;
                    362:        formatted=external=1;
                    363:        elist=a;
                    364:        cursor=scale=recpos=0;
                    365:        if(a->ciunit>MXUNIT || a->ciunit<0)
                    366:                err(a->cierr,101,"startchk");
                    367:        curunit = &units[a->ciunit];
                    368:        if(curunit->ufd==NULL && fk_open(DIR,FMT,a->ciunit))
                    369:                err(a->cierr,104,"dfe");
                    370:        cf=curunit->ufd;
                    371:        if(!curunit->ufmt) err(a->cierr,102,"dfe")
                    372:        if(!curunit->useek) err(a->cierr,104,"dfe")
                    373:        fmtbuf=a->cifmt;
                    374:        (void) fseek(cf,(long)curunit->url * (a->cirec-1),0);
                    375:        curunit->uend = 0;
                    376:        return(0);
                    377: }
                    378: y_rsk()
                    379: {
                    380:        if(curunit->uend || curunit->url <= recpos
                    381:                || curunit->url == 1) return 0;
                    382:        do {
                    383:                getc(cf);
                    384:        } while(++recpos < curunit->url);
                    385:        return 0;
                    386: }
                    387: y_getc()
                    388: {
                    389:        int ch;
                    390:        if(curunit->uend) return(-1);
                    391:        if((ch=getc(cf))!=EOF)
                    392:        {
                    393:                recpos++;
                    394:                if(curunit->url>=recpos ||
                    395:                        curunit->url==1)
                    396:                        return(ch);
                    397:                else    return(' ');
                    398:        }
                    399:        if(feof(cf))
                    400:        {
                    401:                curunit->uend=1;
                    402:                errno=0;
                    403:                return(-1);
                    404:        }
                    405:        err(elist->cierr,errno,"readingd");
                    406: }
                    407: y_putc(c)
                    408: {
                    409:        recpos++;
                    410:        if(recpos <= curunit->url || curunit->url==1)
                    411:                putc(c,cf);
                    412:        else
                    413:                err(elist->cierr,110,"dout");
                    414:        return(0);
                    415: }
                    416: y_rev()
                    417: {      /*what about work done?*/
                    418:        if(curunit->url==1 || recpos==curunit->url)
                    419:                return(0);
                    420:        while(recpos<curunit->url)
                    421:                (*putn)(' ');
                    422:        recpos=0;
                    423:        return(0);
                    424: }
                    425: y_err()
                    426: {
                    427:        err(elist->cierr, 110, "dfe");
                    428: }
                    429: 
                    430: y_newrec()
                    431: {
                    432:        if(curunit->url == 1 || recpos == curunit->url) {
                    433:                hiwater = recpos = cursor = 0;
                    434:                return(1);
                    435:        }
                    436:        if(hiwater > recpos)
                    437:                recpos = hiwater;
                    438:        y_rev();
                    439:        hiwater = cursor = 0;
                    440:        return(1);
                    441: }
                    442: ./ ADD NAME=libI77/due.c TIME=628440563
                    443: #include "f2c.h"
                    444: #include "fio.h"
                    445: integer s_rdue(a) cilist *a;
                    446: {
                    447:        int n;
                    448:        if(n=c_due(a)) return(n);
                    449:        reading=1;
                    450:        if(curunit->uwrt && nowreading(curunit))
                    451:                err(a->cierr,errno,"read start");
                    452:        return(0);
                    453: }
                    454: integer s_wdue(a) cilist *a;
                    455: {
                    456:        int n;
                    457:        if(n=c_due(a)) return(n);
                    458:        reading=0;
                    459:        if(curunit->uwrt != 1 && nowwriting(curunit))
                    460:                err(a->cierr,errno,"write start");
                    461:        return(0);
                    462: }
                    463: c_due(a) cilist *a;
                    464: {
                    465:        if(!init) f_init();
                    466:        if(a->ciunit>=MXUNIT || a->ciunit<0)
                    467:                err(a->cierr,101,"startio");
                    468:        recpos=sequential=formatted=0;
                    469:        external=1;
                    470:        curunit = &units[a->ciunit];
                    471:        elist=a;
                    472:        if(curunit->ufd==NULL && fk_open(DIR,UNF,a->ciunit) ) err(a->cierr,104,"due");
                    473:        cf=curunit->ufd;
                    474:        if(curunit->ufmt) err(a->cierr,102,"cdue")
                    475:        if(!curunit->useek) err(a->cierr,104,"cdue")
                    476:        if(curunit->ufd==NULL) err(a->cierr,114,"cdue")
                    477:        (void) fseek(cf,(long)(a->cirec-1)*curunit->url,0);
                    478:        curunit->uend = 0;
                    479:        return(0);
                    480: }
                    481: integer e_rdue()
                    482: {
                    483:        if(curunit->url==1 || recpos==curunit->url)
                    484:                return(0);
                    485:        (void) fseek(cf,(long)(curunit->url-recpos),1);
                    486:        if(ftell(cf)%curunit->url)
                    487:                err(elist->cierr,200,"syserr");
                    488:        return(0);
                    489: }
                    490: integer e_wdue()
                    491: {
                    492:        return(e_rdue());
                    493: }
                    494: ./ ADD NAME=libI77/endfile.c TIME=628440563
                    495: #include "f2c.h"
                    496: #include "fio.h"
                    497: extern char *mktemp(), *strcpy();
                    498: integer f_end(a) alist *a;
                    499: {
                    500:        unit *b;
                    501:        if(a->aunit>=MXUNIT || a->aunit<0) err(a->aerr,101,"endfile");
                    502:        b = &units[a->aunit];
                    503:        if(b->ufd==NULL) {
                    504:                char nbuf[10];
                    505:                (void) sprintf(nbuf,"fort.%ld",a->aunit);
                    506:                close(creat(nbuf, 0666));
                    507:                return(0);
                    508:                }
                    509:        b->uend=1;
                    510:        return(b->useek ? t_runc(a) : 0);
                    511: }
                    512: 
                    513:  static int
                    514: copy(from, len, to)
                    515:  char *from, *to;
                    516:  register long len;
                    517: {
                    518:        register int n;
                    519:        int k, rc = 0, tmp;
                    520:        char buf[BUFSIZ];
                    521: 
                    522:        if ((k = open(from, 0)) < 0)
                    523:                return 1;
                    524:        if ((tmp = creat(to,0666)) < 0)
                    525:                return 1;
                    526:        while((n = read(k, buf, len > BUFSIZ ? BUFSIZ : (int)len)) > 0) {
                    527:                if (write(tmp, buf, n) != n)
                    528:                        { rc = 1; break; }
                    529:                if ((len -= n) <= 0)
                    530:                        break;
                    531:                }
                    532:        close(k);
                    533:        close(tmp);
                    534:        return n < 0 ? 1 : rc;
                    535:        }
                    536: 
                    537: t_runc(a) alist *a;
                    538: {
                    539:        char nm[16];
                    540:        long loc, len;
                    541:        unit *b;
                    542:        int rc = 0;
                    543: 
                    544:        b = &units[a->aunit];
                    545:        if(b->url) return(0);   /*don't truncate direct files*/
                    546:        loc=ftell(b->ufd);
                    547:        (void) fseek(b->ufd,0L,2);
                    548:        len=ftell(b->ufd);
                    549:        if (loc >= len || b->useek == 0 || b->ufnm == NULL)
                    550:                return(0);
                    551:        rewind(b->ufd); /* empty buffer */
                    552:        if (!loc) {
                    553:                if (close(creat(b->ufnm,0666)))
                    554:                        { rc = 1; goto done; }
                    555:                if (b->uwrt)
                    556:                        b->uwrt = 1;
                    557:                return 0;
                    558:                }
                    559:        (void) strcpy(nm,"tmp.FXXXXXX");
                    560:        (void) mktemp(nm);
                    561:        if (copy(b->ufnm, loc, nm)
                    562:         || copy(nm, loc, b->ufnm))
                    563:                rc = 1;
                    564:        unlink(nm);
                    565: done:
                    566:        fseek(b->ufd, loc, 0);
                    567:        if (rc)
                    568:                err(a->aerr,111,"endfile");
                    569:        return 0;
                    570:        }
                    571: ./ ADD NAME=libI77/err.c TIME=628473361
                    572: #include "sys/types.h"
                    573: #include "sys/stat.h"
                    574: #include "f2c.h"
                    575: #include "fio.h"
                    576: 
                    577: extern FILE *fdopen();
                    578: 
                    579: /*global definitions*/
                    580: unit units[MXUNIT];    /*unit table*/
                    581: flag init;     /*0 on entry, 1 after initializations*/
                    582: cilist *elist; /*active external io list*/
                    583: flag reading;  /*1 if reading, 0 if writing*/
                    584: flag cplus,cblank;
                    585: char *fmtbuf;
                    586: flag external; /*1 if external io, 0 if internal */
                    587: int (*doed)(),(*doned)();
                    588: int (*doend)(),(*donewrec)(),(*dorevert)();
                    589: flag sequential;       /*1 if sequential io, 0 if direct*/
                    590: flag formatted;        /*1 if formatted io, 0 if unformatted*/
                    591: int (*getn)(),(*putn)();       /*for formatted io*/
                    592: FILE *cf;      /*current file*/
                    593: unit *curunit; /*current unit*/
                    594: int recpos;    /*place in current record*/
                    595: int cursor,scale;
                    596: 
                    597: /*error messages*/
                    598: char *F_err[] =
                    599: {
                    600:        "error in format",                              /* 100 */
                    601:        "illegal unit number",                          /* 101 */
                    602:        "formatted io not allowed",                     /* 102 */
                    603:        "unformatted io not allowed",                   /* 103 */
                    604:        "direct io not allowed",                        /* 104 */
                    605:        "sequential io not allowed",                    /* 105 */
                    606:        "can't backspace file",                         /* 106 */
                    607:        "null file name",                               /* 107 */
                    608:        "can't stat file",                              /* 108 */
                    609:        "unit not connected",                           /* 109 */
                    610:        "off end of record",                            /* 110 */
                    611:        "truncation failed in endfile",                 /* 111 */
                    612:        "incomprehensible list input",                  /* 112 */
                    613:        "out of free space",                            /* 113 */
                    614:        "unit not connected",                           /* 114 */
                    615:        "read unexpected character",                    /* 115 */
                    616:        "blank logical input field",                    /* 116 */
                    617:        "bad variable type",                            /* 117 */
                    618:        "bad namelist name",                            /* 118 */
                    619:        "variable not in namelist",                     /* 119 */
                    620:        "no end record",                                /* 120 */
                    621:        "variable count incorrect"                      /* 121 */
                    622: };
                    623: #define MAXERR (sizeof(F_err)/sizeof(char *)+100)
                    624: fatal(n,s) char *s;
                    625: {
                    626:        if(n<100 && n>=0) perror(s); /*SYSDEP*/
                    627:        else if(n >= (int)MAXERR || n < -1)
                    628:        {       fprintf(stderr,"%s: illegal error number %d\n",s,n);
                    629:        }
                    630:        else if(n == -1) fprintf(stderr,"%s: end of file\n",s);
                    631:        else
                    632:                fprintf(stderr,"%s: %s\n",s,F_err[n-100]);
                    633:        fprintf(stderr,"apparent state: unit %d ",curunit-units);
                    634:        fprintf(stderr, curunit->ufnm ? "named %s\n" : "(unnamed)\n",
                    635:                curunit->ufnm);
                    636:        if (fmtbuf)
                    637:                fprintf(stderr,"last format: %s\n",fmtbuf);
                    638:        fprintf(stderr,"lately %s %s %s %s IO\n",reading?"reading":"writing",
                    639:                sequential?"sequential":"direct",formatted?"formatted":"unformatted",
                    640:                external?"external":"internal");
                    641:        _cleanup();
                    642:        abort();
                    643: }
                    644: /*initialization routine*/
                    645: f_init()
                    646: {      unit *p;
                    647: 
                    648:        init=1;
                    649:        p= &units[0];
                    650:        p->ufd=stderr;
                    651:        p->useek=canseek(stderr);
                    652: #ifdef COMMENTED_OUT
                    653:        if(isatty(fileno(stderr))) {
                    654:                extern char *malloc();
                    655:                setbuf(stderr, malloc(BUFSIZ));
                    656:                /* setvbuf(stderr, _IOLBF, 0, 0); */
                    657:        }       /* wastes space, but win for debugging in windows */
                    658: #endif
                    659: #ifdef NON_UNIX_STDIO
                    660:        {extern char *malloc(); setbuf(stderr, malloc(BUFSIZ));}
                    661: #else
                    662:        stderr->_flag &= ~_IONBF;
                    663: #endif
                    664:        p->ufmt=1;
                    665:        p->uwrt=1;
                    666:        p = &units[5];
                    667:        p->ufd=stdin;
                    668:        p->useek=canseek(stdin);
                    669:        p->ufmt=1;
                    670:        p->uwrt=0;
                    671:        p= &units[6];
                    672:        p->ufd=stdout;
                    673:        p->useek=canseek(stdout);
                    674:        /* IOLBUF and setvbuf only in system 5+ */
                    675: #ifdef COMMENTED_OUT
                    676:        if(isatty(fileno(stdout))) {
                    677:                extern char _sobuf[];
                    678:                setbuf(stdout, _sobuf);
                    679:                /* setvbuf(stdout, _IOLBF, 0, 0);       /* the buf arg in setvbuf? */
                    680:                p->useek = 1;   /* only within a record no bigger than BUFSIZ */
                    681:        }
                    682: #endif
                    683:        p->ufmt=1;
                    684:        p->uwrt=1;
                    685: }
                    686: canseek(f) FILE *f; /*SYSDEP*/
                    687: {      struct stat x;
                    688:        if(fstat(fileno(f),&x) < 0)
                    689:                return(0);
                    690:        switch(x.st_mode & S_IFMT) {
                    691:        case S_IFDIR:
                    692:        case S_IFREG:
                    693:                if(x.st_nlink > 0)      /* !pipe */
                    694:                        return(1);
                    695:                else
                    696:                        return(0);
                    697:        case S_IFCHR:
                    698:                if(isatty(fileno(f)))
                    699:                        return(0);
                    700:                return(1);
                    701: #ifdef S_IFBLK
                    702:        case S_IFBLK:
                    703:                return(1);
                    704: #endif
                    705:        }
                    706:        return(0);      /* who knows what it is? */
                    707: }
                    708: nowreading(x) unit *x;
                    709: {
                    710:        long loc;
                    711:        x->uwrt=0;
                    712:        loc=ftell(x->ufd);
                    713:        if(freopen(x->ufnm,"r",x->ufd) == NULL)
                    714:                return(1);
                    715:        (void) fseek(x->ufd,loc,0);
                    716:        return(0);
                    717: }
                    718: nowwriting(x) unit *x;
                    719: {
                    720:        long loc;
                    721:        int k;
                    722: 
                    723:        if (x->uwrt == 3) { /* just did write, rewind */
                    724:                if (close(creat(x->ufnm,0666)))
                    725:                        return(1);
                    726:                }
                    727:        else {  
                    728:                loc=ftell(x->ufd);
                    729:                if (fclose(x->ufd) < 0
                    730:                || (k = x->uwrt == 2 ? creat(x->ufnm,0666) : open(x->ufnm,1)) < 0
                    731:                || (x->ufd = fdopen(k,"w")) == NULL) {
                    732:                        x->ufd = NULL;
                    733:                        return(1);
                    734:                        }
                    735:                (void) fseek(x->ufd,loc,0);
                    736:                }
                    737:        x->uwrt = 1;
                    738:        return(0);
                    739: }
                    740: ./ ADD NAME=libI77/fio.h TIME=628474795
                    741: #include "stdio.h"
                    742: #ifndef NULL
                    743: /* ANSI C */
                    744: #include "stddef.h"
                    745: #endif
                    746: 
                    747: /*units*/
                    748: typedef struct
                    749: {      FILE *ufd;      /*0=unconnected*/
                    750:        char *ufnm;
                    751:        long uinode;
                    752:        int url;        /*0=sequential*/
                    753:        flag useek;     /*true=can backspace, use dir, ...*/
                    754:        flag ufmt;
                    755:        flag uprnt;
                    756:        flag ublnk;
                    757:        flag uend;
                    758:        flag uwrt;      /*last io was write*/
                    759:        flag uscrtch;
                    760: } unit;
                    761: 
                    762: extern int errno;
                    763: extern flag init;
                    764: extern cilist *elist;  /*active external io list*/
                    765: extern flag reading,external,sequential,formatted;
                    766: extern int (*getn)(),(*putn)();        /*for formatted io*/
                    767: extern FILE *cf;       /*current file*/
                    768: extern unit *curunit;  /*current unit*/
                    769: extern unit units[];
                    770: #define err(f,m,s) {if(f) errno= m; else fatal(m,s); return(m);}
                    771: 
                    772: /*Table sizes*/
                    773: #define MXUNIT 100
                    774: 
                    775: extern int recpos;     /*position in current record*/
                    776: extern int cursor;     /* offset to move to */
                    777: extern int hiwater;    /* so TL doesn't confuse us */
                    778: 
                    779: #define WRITE  1
                    780: #define READ   2
                    781: #define SEQ    3
                    782: #define DIR    4
                    783: #define FMT    5
                    784: #define UNF    6
                    785: #define EXT    7
                    786: #define INT    8
                    787: 
                    788: #define buf_end(x) (x->_flag & _IONBF ? x->_ptr : x->_base + BUFSIZ)
                    789: ./ ADD NAME=libI77/fmt.c TIME=628440861
                    790: #include "f2c.h"
                    791: #include "fio.h"
                    792: #include "fmt.h"
                    793: #define skip(s) while(*s==' ') s++
                    794: #ifdef interdata
                    795: #define SYLMX 300
                    796: #endif
                    797: #ifdef pdp11
                    798: #define SYLMX 300
                    799: #endif
                    800: #ifdef vax
                    801: #define SYLMX 300
                    802: #endif
                    803: #ifndef SYLMX
                    804: #define SYLMX 300
                    805: #endif
                    806: #define GLITCH '\2'
                    807:        /* special quote character for stu */
                    808: extern int cursor,scale;
                    809: extern flag cblank,cplus;      /*blanks in I and compulsory plus*/
                    810: struct syl syl[SYLMX];
                    811: int parenlvl,pc,revloc;
                    812: 
                    813: char *f_s(),*f_list(),*i_tem(),*gt_num();
                    814: 
                    815: pars_f(s) char *s;
                    816: {
                    817:        parenlvl=revloc=pc=0;
                    818:        if(f_s(s,0) == NULL)
                    819:        {
                    820:                return(-1);
                    821:        }
                    822:        return(0);
                    823: }
                    824: char *f_s(s,curloc) char *s;
                    825: {
                    826:        skip(s);
                    827:        if(*s++!='(')
                    828:        {
                    829:                return(NULL);
                    830:        }
                    831:        if(parenlvl++ ==1) revloc=curloc;
                    832:        if(op_gen(RET,curloc,0,0)<0 ||
                    833:                (s=f_list(s))==NULL)
                    834:        {
                    835:                return(NULL);
                    836:        }
                    837:        skip(s);
                    838:        return(s);
                    839: }
                    840: char *f_list(s) char *s;
                    841: {
                    842:        for(;*s!=0;)
                    843:        {       skip(s);
                    844:                if((s=i_tem(s))==NULL) return(NULL);
                    845:                skip(s);
                    846:                if(*s==',') s++;
                    847:                else if(*s==')')
                    848:                {       if(--parenlvl==0)
                    849:                        {
                    850:                                (void) op_gen(REVERT,revloc,0,0);
                    851:                                return(++s);
                    852:                        }
                    853:                        (void) op_gen(GOTO,0,0,0);
                    854:                        return(++s);
                    855:                }
                    856:        }
                    857:        return(NULL);
                    858: }
                    859: char *i_tem(s) char *s;
                    860: {      char *t;
                    861:        int n,curloc;
                    862:        if(*s==')') return(s);
                    863:        if(ne_d(s,&t)) return(t);
                    864:        if(e_d(s,&t)) return(t);
                    865:        s=gt_num(s,&n);
                    866:        if((curloc=op_gen(STACK,n,0,0))<0) return(NULL);
                    867:        return(f_s(s,curloc));
                    868: }
                    869: ne_d(s,p) char *s,**p;
                    870: {      int n,x,sign=0;
                    871:        char *ap_end();
                    872:        struct syl *sp;
                    873:        switch(*s)
                    874:        {
                    875:        default:
                    876:                return(0);
                    877:        case ':': (void) op_gen(COLON,0,0,0); break;
                    878:        case '$':
                    879:                (void) op_gen(NONL, 0, 0, 0); break;
                    880:        case 'B':
                    881:        case 'b':
                    882:                if(*++s=='z' || *s == 'Z') (void) op_gen(BZ,0,0,0);
                    883:                else (void) op_gen(BN,0,0,0);
                    884:                break;
                    885:        case 'S':
                    886:        case 's':
                    887:                if(*(s+1)=='s' || *(s+1) == 'S')
                    888:                {       x=SS;
                    889:                        s++;
                    890:                }
                    891:                else if(*(s+1)=='p' || *(s+1) == 'P')
                    892:                {       x=SP;
                    893:                        s++;
                    894:                }
                    895:                else x=S;
                    896:                (void) op_gen(x,0,0,0);
                    897:                break;
                    898:        case '/': (void) op_gen(SLASH,0,0,0); break;
                    899:        case '-': sign=1;
                    900:        case '+':       s++;    /*OUTRAGEOUS CODING TRICK*/
                    901:        case '0': case '1': case '2': case '3': case '4':
                    902:        case '5': case '6': case '7': case '8': case '9':
                    903:                s=gt_num(s,&n);
                    904:                switch(*s)
                    905:                {
                    906:                default:
                    907:                        return(0);
                    908:                case 'P':
                    909:                case 'p': if(sign) n= -n; (void) op_gen(P,n,0,0); break;
                    910:                case 'X':
                    911:                case 'x': (void) op_gen(X,n,0,0); break;
                    912:                case 'H':
                    913:                case 'h':
                    914:                        sp = &syl[op_gen(H,n,0,0)];
                    915:                        *(char **)&sp->p2 = s + 1;
                    916:                        s+=n;
                    917:                        break;
                    918:                }
                    919:                break;
                    920:        case GLITCH:
                    921:        case '"':
                    922:        case '\'':
                    923:                sp = &syl[op_gen(APOS,0,0,0)];
                    924:                *(char **)&sp->p2 = s;
                    925:                if((*p = ap_end(s)) == NULL)
                    926:                        return(0);
                    927:                return(1);
                    928:        case 'T':
                    929:        case 't':
                    930:                if(*(s+1)=='l' || *(s+1) == 'L')
                    931:                {       x=TL;
                    932:                        s++;
                    933:                }
                    934:                else if(*(s+1)=='r'|| *(s+1) == 'R')
                    935:                {       x=TR;
                    936:                        s++;
                    937:                }
                    938:                else x=T;
                    939:                s=gt_num(s+1,&n);
                    940:                s--;
                    941:                (void) op_gen(x,n,0,0);
                    942:                break;
                    943:        case 'X':
                    944:        case 'x': (void) op_gen(X,1,0,0); break;
                    945:        case 'P':
                    946:        case 'p': (void) op_gen(P,1,0,0); break;
                    947:        }
                    948:        s++;
                    949:        *p=s;
                    950:        return(1);
                    951: }
                    952: e_d(s,p) char *s,**p;
                    953: {      int n,w,d,e,found=0,x=0;
                    954:        char *sv=s;
                    955:        s=gt_num(s,&n);
                    956:        (void) op_gen(STACK,n,0,0);
                    957:        switch(*s++)
                    958:        {
                    959:        default: break;
                    960:        case 'E':
                    961:        case 'e':       x=1;
                    962:        case 'G':
                    963:        case 'g':
                    964:                found=1;
                    965:                s=gt_num(s,&w);
                    966:                if(w==0) break;
                    967:                if(*s=='.')
                    968:                {       s++;
                    969:                        s=gt_num(s,&d);
                    970:                }
                    971:                else d=0;
                    972:                if(*s!='E' && *s != 'e')
                    973:                        (void) op_gen(x==1?E:G,w,d,0);  /* default is Ew.dE2 */
                    974:                else
                    975:                {       s++;
                    976:                        s=gt_num(s,&e);
                    977:                        (void) op_gen(x==1?EE:GE,w,d,e);
                    978:                }
                    979:                break;
                    980:        case 'O':
                    981:        case 'o':
                    982:                found = 1;
                    983:                s = gt_num(s, &w);
                    984:                if(w==0) break;
                    985:                (void) op_gen(O, w, 0, 0);
                    986:                break;
                    987:        case 'L':
                    988:        case 'l':
                    989:                found=1;
                    990:                s=gt_num(s,&w);
                    991:                if(w==0) break;
                    992:                (void) op_gen(L,w,0,0);
                    993:                break;
                    994:        case 'A':
                    995:        case 'a':
                    996:                found=1;
                    997:                skip(s);
                    998:                if(*s>='0' && *s<='9')
                    999:                {       s=gt_num(s,&w);
                   1000:                        if(w==0) break;
                   1001:                        (void) op_gen(AW,w,0,0);
                   1002:                        break;
                   1003:                }
                   1004:                (void) op_gen(A,0,0,0);
                   1005:                break;
                   1006:        case 'F':
                   1007:        case 'f':
                   1008:                found=1;
                   1009:                s=gt_num(s,&w);
                   1010:                if(w==0) break;
                   1011:                if(*s=='.')
                   1012:                {       s++;
                   1013:                        s=gt_num(s,&d);
                   1014:                }
                   1015:                else d=0;
                   1016:                (void) op_gen(F,w,d,0);
                   1017:                break;
                   1018:        case 'D':
                   1019:        case 'd':
                   1020:                found=1;
                   1021:                s=gt_num(s,&w);
                   1022:                if(w==0) break;
                   1023:                if(*s=='.')
                   1024:                {       s++;
                   1025:                        s=gt_num(s,&d);
                   1026:                }
                   1027:                else d=0;
                   1028:                (void) op_gen(D,w,d,0);
                   1029:                break;
                   1030:        case 'I':
                   1031:        case 'i':
                   1032:                found=1;
                   1033:                s=gt_num(s,&w);
                   1034:                if(w==0) break;
                   1035:                if(*s!='.')
                   1036:                {       (void) op_gen(I,w,0,0);
                   1037:                        break;
                   1038:                }
                   1039:                s++;
                   1040:                s=gt_num(s,&d);
                   1041:                (void) op_gen(IM,w,d,0);
                   1042:                break;
                   1043:        }
                   1044:        if(found==0)
                   1045:        {       pc--; /*unSTACK*/
                   1046:                *p=sv;
                   1047:                return(0);
                   1048:        }
                   1049:        *p=s;
                   1050:        return(1);
                   1051: }
                   1052: op_gen(a,b,c,d)
                   1053: {      struct syl *p= &syl[pc];
                   1054:        if(pc>=SYLMX)
                   1055:        {       fprintf(stderr,"format too complicated:\n%s\n",
                   1056:                        fmtbuf);
                   1057:                abort();
                   1058:        }
                   1059:        p->op=a;
                   1060:        p->p1=b;
                   1061:        p->p2=c;
                   1062:        p->p3=d;
                   1063:        return(pc++);
                   1064: }
                   1065: char *gt_num(s,n) char *s; int *n;
                   1066: {      int m=0,cnt=0;
                   1067:        char c;
                   1068:        for(c= *s;;c = *s)
                   1069:        {       if(c==' ')
                   1070:                {       s++;
                   1071:                        continue;
                   1072:                }
                   1073:                if(c>'9' || c<'0') break;
                   1074:                m=10*m+c-'0';
                   1075:                cnt++;
                   1076:                s++;
                   1077:        }
                   1078:        if(cnt==0) *n=1;
                   1079:        else *n=m;
                   1080:        return(s);
                   1081: }
                   1082: #define STKSZ 10
                   1083: int cnt[STKSZ],ret[STKSZ],cp,rp;
                   1084: flag workdone, nonl;
                   1085: 
                   1086: integer do_fio(number,ptr,len) ftnint *number; ftnlen len; char *ptr;
                   1087: {      struct syl *p;
                   1088:        int n,i;
                   1089:        for(i=0;i<*number;i++,ptr+=len)
                   1090:        {
                   1091: loop:  switch(type_f((p= &syl[pc])->op))
                   1092:        {
                   1093:        default:
                   1094:                fprintf(stderr,"unknown code in do_fio: %d\n%s\n",
                   1095:                        p->op,fmtbuf);
                   1096:                err(elist->cierr,100,"do_fio");
                   1097:        case NED:
                   1098:                if((*doned)(p))
                   1099:                {       pc++;
                   1100:                        goto loop;
                   1101:                }
                   1102:                pc++;
                   1103:                continue;
                   1104:        case ED:
                   1105:                if(cnt[cp]<=0)
                   1106:                {       cp--;
                   1107:                        pc++;
                   1108:                        goto loop;
                   1109:                }
                   1110:                if(ptr==NULL)
                   1111:                        return((*doend)());
                   1112:                cnt[cp]--;
                   1113:                workdone=1;
                   1114:                if((n=(*doed)(p,ptr,len))>0) err(elist->cierr,errno,"fmt");
                   1115:                if(n<0) err(elist->ciend,(EOF),"fmt");
                   1116:                continue;
                   1117:        case STACK:
                   1118:                cnt[++cp]=p->p1;
                   1119:                pc++;
                   1120:                goto loop;
                   1121:        case RET:
                   1122:                ret[++rp]=p->p1;
                   1123:                pc++;
                   1124:                goto loop;
                   1125:        case GOTO:
                   1126:                if(--cnt[cp]<=0)
                   1127:                {       cp--;
                   1128:                        rp--;
                   1129:                        pc++;
                   1130:                        goto loop;
                   1131:                }
                   1132:                pc=1+ret[rp--];
                   1133:                goto loop;
                   1134:        case REVERT:
                   1135:                rp=cp=0;
                   1136:                pc = p->p1;
                   1137:                if(ptr==NULL)
                   1138:                        return((*doend)());
                   1139:                if(!workdone) return(0);
                   1140:                if((n=(*dorevert)()) != 0) return(n);
                   1141:                goto loop;
                   1142:        case COLON:
                   1143:                if(ptr==NULL)
                   1144:                        return((*doend)());
                   1145:                pc++;
                   1146:                goto loop;
                   1147:        case NONL:
                   1148:                nonl = 1;
                   1149:                pc++;
                   1150:                goto loop;
                   1151:        case S:
                   1152:        case SS:
                   1153:                cplus=0;
                   1154:                pc++;
                   1155:                goto loop;
                   1156:        case SP:
                   1157:                cplus = 1;
                   1158:                pc++;
                   1159:                goto loop;
                   1160:        case P: scale=p->p1;
                   1161:                pc++;
                   1162:                goto loop;
                   1163:        case BN:
                   1164:                cblank=0;
                   1165:                pc++;
                   1166:                goto loop;
                   1167:        case BZ:
                   1168:                cblank=1;
                   1169:                pc++;
                   1170:                goto loop;
                   1171:        }
                   1172:        }
                   1173:        return(0);
                   1174: }
                   1175: en_fio()
                   1176: {      ftnint one=1;
                   1177:        return(do_fio(&one,(char *)NULL,0l));
                   1178: }
                   1179: fmt_bg()
                   1180: {
                   1181:        workdone=cp=rp=pc=cursor=0;
                   1182:        cnt[0]=ret[0]=0;
                   1183: }
                   1184: type_f(n)
                   1185: {
                   1186:        switch(n)
                   1187:        {
                   1188:        default:
                   1189:                return(n);
                   1190:        case RET:
                   1191:                return(RET);
                   1192:        case REVERT: return(REVERT);
                   1193:        case GOTO: return(GOTO);
                   1194:        case STACK: return(STACK);
                   1195:        case X:
                   1196:        case SLASH:
                   1197:        case APOS: case H:
                   1198:        case T: case TL: case TR:
                   1199:                return(NED);
                   1200:        case F:
                   1201:        case I:
                   1202:        case IM:
                   1203:        case A: case AW:
                   1204:        case O:
                   1205:        case L:
                   1206:        case E: case EE: case D:
                   1207:        case G: case GE:
                   1208:                return(ED);
                   1209:        }
                   1210: }
                   1211: char *ap_end(s) char *s;
                   1212: {      char quote;
                   1213:        quote= *s++;
                   1214:        for(;*s;s++)
                   1215:        {       if(*s!=quote) continue;
                   1216:                if(*++s!=quote) return(s);
                   1217:        }
                   1218:        if(elist->cierr) {
                   1219:                errno = 100;
                   1220:                return(NULL);
                   1221:        }
                   1222:        fatal(100, "bad string");
                   1223:        /*NOTREACHED*/ return 0;
                   1224: }
                   1225: ./ ADD NAME=libI77/fmt.h TIME=628555644
                   1226: struct syl
                   1227: {      int op,p1,p2,p3;
                   1228: };
                   1229: #define RET 1
                   1230: #define REVERT 2
                   1231: #define GOTO 3
                   1232: #define X 4
                   1233: #define SLASH 5
                   1234: #define STACK 6
                   1235: #define I 7
                   1236: #define ED 8
                   1237: #define NED 9
                   1238: #define IM 10
                   1239: #define APOS 11
                   1240: #define H 12
                   1241: #define TL 13
                   1242: #define TR 14
                   1243: #define T 15
                   1244: #define COLON 16
                   1245: #define S 17
                   1246: #define SP 18
                   1247: #define SS 19
                   1248: #define P 20
                   1249: #define BN 21
                   1250: #define BZ 22
                   1251: #define F 23
                   1252: #define E 24
                   1253: #define EE 25
                   1254: #define D 26
                   1255: #define G 27
                   1256: #define GE 28
                   1257: #define L 29
                   1258: #define A 30
                   1259: #define AW 31
                   1260: #define O 32
                   1261: #define NONL 33
                   1262: extern struct syl syl[];
                   1263: extern int pc,parenlvl,revloc;
                   1264: extern int (*doed)(),(*doned)();
                   1265: extern int (*dorevert)(),(*donewrec)(),(*doend)();
                   1266: extern flag cblank,cplus,workdone, nonl;
                   1267: extern int dummy();
                   1268: extern char *fmtbuf;
                   1269: extern int scale;
                   1270: typedef union
                   1271: {      real pf;
                   1272:        doublereal pd;
                   1273: } ufloat;
                   1274: typedef union
                   1275: {      short is;
                   1276:        char ic;
                   1277:        long il;
                   1278: } uint;
                   1279: #define GET(x) if((x=(*getn)())<0) return(x)
                   1280: #define VAL(x) (x!='\n'?x:' ')
                   1281: #define PUT(x) (*putn)(x)
                   1282: extern int cursor;
                   1283: ./ ADD NAME=libI77/fmtlib.c TIME=628440563
                   1284: /*     @(#)fmtlib.c    1.2     */
                   1285: #define MAXINTLENGTH 23
                   1286: char *icvt(value,ndigit,sign, base) long value; int *ndigit,*sign;
                   1287: register int base;
                   1288: {      static char buf[MAXINTLENGTH+1];
                   1289:        register int i;
                   1290:        if(value>0) *sign=0;
                   1291:        else if(value<0)
                   1292:        {       value = -value;
                   1293:                *sign= 1;
                   1294:        }
                   1295:        else
                   1296:        {       *sign=0;
                   1297:                *ndigit=1;
                   1298:                buf[MAXINTLENGTH]='0';
                   1299:                return(&buf[MAXINTLENGTH]);
                   1300:        }
                   1301:        for(i=MAXINTLENGTH-1;value>0;i--)
                   1302:        {       *(buf+i)=(int)(value%base)+'0';
                   1303:                value /= base;
                   1304:        }
                   1305:        *ndigit=MAXINTLENGTH-1-i;
                   1306:        return(&buf[i+1]);
                   1307: }
                   1308: ./ ADD NAME=libI77/fp.h TIME=580998005
                   1309: #define FMAX 40
                   1310: #define EXPMAXDIGS 8
                   1311: #define EXPMAX 99999999
                   1312: /* FMAX = max number of nonzero digits passed to atof() */
                   1313: /* EXPMAX = 10^EXPMAXDIGS - 1 = largest allowed exponent absolute value */
                   1314: 
                   1315: #include "local.h"
                   1316: 
                   1317: /* MAXFRACDIGS and MAXINTDIGS are for wrt_F -- bounds (not necessarily
                   1318:    tight) on the maximum number of digits to the right and left of
                   1319:  * the decimal point.
                   1320:  */
                   1321: 
                   1322: #ifdef VAX
                   1323: #define MAXFRACDIGS 56
                   1324: #define MAXINTDIGS 38
                   1325: #else
                   1326: #ifdef CRAY
                   1327: #define MAXFRACDIGS 9880
                   1328: #define MAXINTDIGS 9864
                   1329: #else
                   1330: /* values that suffice for IEEE double */
                   1331: #define MAXFRACDIGS 344
                   1332: #define MAXINTDIGS 308
                   1333: #endif
                   1334: #endif
                   1335: ./ ADD NAME=libI77/iio.c TIME=629054420
                   1336: #include "f2c.h"
                   1337: #include "fio.h"
                   1338: #include "fmt.h"
                   1339: extern char *icptr;
                   1340: char *icend;
                   1341: extern icilist *svic;
                   1342: extern int rd_ed(),rd_ned(),w_ed(),w_ned(),y_ierr();
                   1343: extern int z_wnew();
                   1344: int icnum;
                   1345: extern int hiwater;
                   1346: z_getc()
                   1347: {
                   1348:        if(icptr >= icend) err(svic->iciend,(EOF),"endfile");
                   1349:        if(recpos++ < svic->icirlen)
                   1350:                return(*icptr++);
                   1351:        else    err(svic->icierr,110,"recend");
                   1352: }
                   1353: z_putc(c)
                   1354: {
                   1355:        if(icptr >= icend) err(svic->icierr,110,"inwrite");
                   1356:        if(recpos++ < svic->icirlen)
                   1357:                *icptr++ = c;
                   1358:        else    err(svic->icierr,110,"recend");
                   1359:        return 0;
                   1360: }
                   1361: z_rnew()
                   1362: {
                   1363:        icptr = svic->iciunit + (++icnum)*svic->icirlen;
                   1364:        recpos = 0;
                   1365:        cursor = 0;
                   1366:        hiwater = 0;
                   1367:        return 1;
                   1368: }
                   1369: integer s_rsfi(a) icilist *a;
                   1370: {      int n;
                   1371:        if(n=c_si(a)) return(n);
                   1372:        reading=1;
                   1373:        doed=rd_ed;
                   1374:        doned=rd_ned;
                   1375:        getn=z_getc;
                   1376:        dorevert = y_ierr;
                   1377:        donewrec = doend = z_rnew;
                   1378:        return(0);
                   1379: }
                   1380: integer s_wsfi(a) icilist *a;
                   1381: {      int n;
                   1382:        if(n=c_si(a)) return(n);
                   1383:        reading=0;
                   1384:        doed=w_ed;
                   1385:        doned=w_ned;
                   1386:        putn=z_putc;
                   1387:        dorevert = y_ierr;
                   1388:        donewrec = doend = z_wnew;
                   1389:        return(0);
                   1390: }
                   1391: c_si(a) icilist *a;
                   1392: {
                   1393:        fmtbuf=a->icifmt;
                   1394:        if(pars_f(fmtbuf)<0)
                   1395:                err(a->icierr,100,"startint");
                   1396:        fmt_bg();
                   1397:        sequential=formatted=1;
                   1398:        external=0;
                   1399:        cblank=cplus=scale=0;
                   1400:        svic=a;
                   1401:        icnum=recpos=0;
                   1402:        cursor = 0;
                   1403:        hiwater = 0;
                   1404:        icptr=svic->iciunit;
                   1405:        icend=icptr+svic->icirlen*svic->icirnum;
                   1406:        return(0);
                   1407: }
                   1408: z_wnew()
                   1409: {
                   1410:        while(recpos++ < svic->icirlen)
                   1411:                *icptr++ = ' ';
                   1412:        recpos = 0;
                   1413:        cursor = 0;
                   1414:        hiwater = 0;
                   1415:        icnum++;
                   1416:        return 1;
                   1417: }
                   1418: integer e_rsfi()
                   1419: {      int n;
                   1420:        n = en_fio();
                   1421:        fmtbuf = NULL;
                   1422:        return(n);
                   1423: }
                   1424: integer e_wsfi()
                   1425: {
                   1426:        int n;
                   1427:        n = en_fio();
                   1428:        fmtbuf = NULL;
                   1429:        if(icnum >= svic->icirnum)
                   1430:                return(n);
                   1431:        while(recpos++ < svic->icirlen)
                   1432:                *icptr++ = ' ';
                   1433:        return(n);
                   1434: }
                   1435: y_ierr()
                   1436: {
                   1437:        err(elist->cierr, 110, "iio");
                   1438: }
                   1439: ./ ADD NAME=libI77/inquire.c TIME=628440563
                   1440: #include "f2c.h"
                   1441: #include "fio.h"
                   1442: integer f_inqu(a) inlist *a;
                   1443: {      flag byfile;
                   1444:        int i;
                   1445:        unit *p;
                   1446:        char buf[256];
                   1447:        long x;
                   1448:        if(a->infile!=NULL)
                   1449:        {       byfile=1;
                   1450:                g_char(a->infile,a->infilen,buf);
                   1451:                x=inode(buf);
                   1452:                for(i=0,p=NULL;i<MXUNIT;i++)
                   1453:                        if(units[i].uinode==x && units[i].ufd!=NULL)
                   1454:                                p = &units[i];
                   1455:        }
                   1456:        else
                   1457:        {
                   1458:                byfile=0;
                   1459:                if(a->inunit<MXUNIT && a->inunit>=0)
                   1460:                {
                   1461:                        p= &units[a->inunit];
                   1462:                }
                   1463:                else
                   1464:                {
                   1465:                        p=NULL;
                   1466:                }
                   1467:        }
                   1468:        if(a->inex!=NULL)
                   1469:                if(byfile && x != -1 || !byfile && p!=NULL)
                   1470:                        *a->inex=1;
                   1471:                else *a->inex=0;
                   1472:        if(a->inopen!=NULL)
                   1473:                if(byfile) *a->inopen=(p!=NULL);
                   1474:                else *a->inopen=(p!=NULL && p->ufd!=NULL);
                   1475:        if(a->innum!=NULL) *a->innum= p-units;
                   1476:        if(a->innamed!=NULL)
                   1477:                if(byfile || p!=NULL && p->ufnm!=NULL)
                   1478:                        *a->innamed=1;
                   1479:                else    *a->innamed=0;
                   1480:        if(a->inname!=NULL)
                   1481:                if(byfile)
                   1482:                        b_char(buf,a->inname,a->innamlen);
                   1483:                else if(p!=NULL && p->ufnm!=NULL)
                   1484:                        b_char(p->ufnm,a->inname,a->innamlen);
                   1485:        if(a->inacc!=NULL && p!=NULL && p->ufd!=NULL)
                   1486:                if(p->url)
                   1487:                        b_char("DIRECT",a->inacc,a->inacclen);
                   1488:                else    b_char("SEQUENTIAL",a->inacc,a->inacclen);
                   1489:        if(a->inseq!=NULL)
                   1490:                if(p!=NULL && p->url)
                   1491:                        b_char("NO",a->inseq,a->inseqlen);
                   1492:                else    b_char("YES",a->inseq,a->inseqlen);
                   1493:        if(a->indir!=NULL)
                   1494:                if(p==NULL || p->url)
                   1495:                        b_char("YES",a->indir,a->indirlen);
                   1496:                else    b_char("NO",a->indir,a->indirlen);
                   1497:        if(a->infmt!=NULL)
                   1498:                if(p!=NULL && p->ufmt==0)
                   1499:                        b_char("UNFORMATTED",a->infmt,a->infmtlen);
                   1500:                else    b_char("FORMATTED",a->infmt,a->infmtlen);
                   1501:        if(a->inform!=NULL)
                   1502:                if(p!=NULL && p->ufmt==0)
                   1503:                b_char("NO",a->inform,a->informlen);
                   1504:                else b_char("YES",a->inform,a->informlen);
                   1505:        if(a->inunf)
                   1506:                if(p!=NULL && p->ufmt==0)
                   1507:                        b_char("YES",a->inunf,a->inunflen);
                   1508:                else if (p!=NULL) b_char("NO",a->inunf,a->inunflen);
                   1509:                else b_char("UNKNOWN",a->inunf,a->inunflen);
                   1510:        if(a->inrecl!=NULL && p!=NULL)
                   1511:                *a->inrecl=p->url;
                   1512:        if(a->innrec!=NULL && p!=NULL && p->url>0)
                   1513:                *a->innrec=ftell(p->ufd)/p->url+1;
                   1514:        if(a->inblank && p!=NULL && p->ufmt)
                   1515:                if(p->ublnk)
                   1516:                        b_char("ZERO",a->inblank,a->inblanklen);
                   1517:                else    b_char("NULL",a->inblank,a->inblanklen);
                   1518:        return(0);
                   1519: }
                   1520: ./ ADD NAME=libI77/lio.c TIME=628950337
                   1521: #include "f2c.h"
                   1522: #include "fio.h"
                   1523: #include "fmt.h"
                   1524: #include "lio.h"
                   1525: extern int l_write();
                   1526: int t_putc();
                   1527: 
                   1528: integer s_wsle(a) cilist *a;
                   1529: {
                   1530:        int n;
                   1531:        if(!init) f_init();
                   1532:        if(n=c_le(a)) return(n);
                   1533:        reading=0;
                   1534:        external=1;
                   1535:        formatted=1;
                   1536:        putn = t_putc;
                   1537:        lioproc = l_write;
                   1538:        if(curunit->uwrt != 1 && nowwriting(curunit))
                   1539:                err(a->cierr, errno, "list output start");
                   1540:        return(0);
                   1541: }
                   1542: integer e_wsle()
                   1543: {
                   1544:        t_putc('\n');
                   1545:        recpos=0;
                   1546:        if (cf == stdout)
                   1547:                fflush(stdout);
                   1548:        else if (cf == stderr)
                   1549:                fflush(stderr);
                   1550:        return(0);
                   1551: }
                   1552: t_putc(c)
                   1553: {
                   1554:        recpos++;
                   1555:        putc(c,cf);
                   1556:        return(0);
                   1557: }
                   1558: lwrt_I(n) ftnint n;
                   1559: {
                   1560:        char buf[LINTW],*p;
                   1561:        (void) sprintf(buf," %ld",(long)n);
                   1562:        if(recpos+strlen(buf)>=LINE)
                   1563:        {       t_putc('\n');
                   1564:                recpos=0;
                   1565:        }
                   1566:        for(p=buf;*p;t_putc(*p++));
                   1567: }
                   1568: lwrt_L(n, len) ftnint n; ftnlen len;
                   1569: {
                   1570:        if(recpos+LLOGW>=LINE)
                   1571:        {       t_putc('\n');
                   1572:                recpos=0;
                   1573:        }
                   1574:        (void) wrt_L((uint *)&n,LLOGW, len);
                   1575: }
                   1576: lwrt_A(p,len) char *p; ftnlen len;
                   1577: {
                   1578:        int i;
                   1579:        if(recpos+len>=LINE)
                   1580:        {
                   1581:                t_putc('\n');
                   1582:                recpos=0;
                   1583:        }
                   1584:        if (!recpos)
                   1585:                { t_putc(' '); ++recpos; }
                   1586:        for(i=0;i<len;i++) t_putc(*p++);
                   1587: }
                   1588: lwrt_F(absn) double absn;
                   1589: {
                   1590:        doublereal n;
                   1591: 
                   1592:        n = absn;
                   1593:        if (absn < 0)
                   1594:                absn = -absn;
                   1595:        if (LLOW <= absn && absn < LHIGH)
                   1596:        {
                   1597:                if(recpos+LFW>=LINE)
                   1598:                {
                   1599:                        t_putc('\n');
                   1600:                        recpos=0;
                   1601:                }
                   1602:                scale=0;
                   1603:                (void) wrt_F((ufloat *)&n,LFW,LFD,(ftnlen)sizeof(n));
                   1604:        }
                   1605:        else
                   1606:        {
                   1607:                if(recpos+LEW>=LINE)
                   1608:                {       t_putc('\n');
                   1609:                        recpos=0;
                   1610:                }
                   1611:                scale = 1;
                   1612:                (void) wrt_E((ufloat *)&n,LEW,LED,-1,(ftnlen)sizeof(n));
                   1613:        }
                   1614: }
                   1615: lwrt_C(a,b) double a,b;
                   1616: {
                   1617:        if(recpos+2*LFW+3>=LINE)
                   1618:        {       t_putc('\n');
                   1619:                recpos=0;
                   1620:        }
                   1621:        t_putc(' ');
                   1622:        t_putc('(');
                   1623:        lwrt_F(a);
                   1624:        t_putc(',');
                   1625:        lwrt_F(b);
                   1626:        t_putc(')');
                   1627: }
                   1628: l_write(number,ptr,len,type) ftnint *number,type; char *ptr; ftnlen len;
                   1629: {
                   1630: #define Ptr ((flex *)ptr)
                   1631:        int i;
                   1632:        ftnint x;
                   1633:        double y,z;
                   1634:        real *xx;
                   1635:        doublereal *yy;
                   1636:        for(i=0;i< *number; i++)
                   1637:        {
                   1638:                switch((int)type)
                   1639:                {
                   1640:                default: fatal(204,"unknown type in lio");
                   1641:                case TYSHORT:
                   1642:                        x=Ptr->flshort;
                   1643:                        goto xint;
                   1644:                case TYLONG:
                   1645:                        x=Ptr->flint;
                   1646:                xint:   lwrt_I(x);
                   1647:                        break;
                   1648:                case TYREAL:
                   1649:                        y=Ptr->flreal;
                   1650:                        goto xfloat;
                   1651:                case TYDREAL:
                   1652:                        y=Ptr->fldouble;
                   1653:                xfloat: lwrt_F(y);
                   1654:                        break;
                   1655:                case TYCOMPLEX:
                   1656:                        xx= &Ptr->flreal;
                   1657:                        y = *xx++;
                   1658:                        z = *xx;
                   1659:                        goto xcomplex;
                   1660:                case TYDCOMPLEX:
                   1661:                        yy = &Ptr->fldouble;
                   1662:                        y= *yy++;
                   1663:                        z = *yy;
                   1664:                xcomplex:
                   1665:                        lwrt_C(y,z);
                   1666:                        break;
                   1667:                case TYLOGICAL:
                   1668:                        lwrt_L(Ptr->flint, len);
                   1669:                        break;
                   1670:                case TYCHAR:
                   1671:                        lwrt_A(ptr,len);
                   1672:                        break;
                   1673:                }
                   1674:                ptr += len;
                   1675:        }
                   1676:        return(0);
                   1677: }
                   1678: ./ ADD NAME=libI77/lio.h TIME=628801084
                   1679: /*     copy of ftypes from the compiler */
                   1680: /* variable types
                   1681:  * numeric assumptions:
                   1682:  *     int < reals < complexes
                   1683:  *     TYDREAL-TYREAL = TYDCOMPLEX-TYCOMPLEX
                   1684:  */
                   1685: 
                   1686: #define TYUNKNOWN 0
                   1687: #define TYADDR 1
                   1688: #define TYSHORT 2
                   1689: #define TYLONG 3
                   1690: #define TYREAL 4
                   1691: #define TYDREAL 5
                   1692: #define TYCOMPLEX 6
                   1693: #define TYDCOMPLEX 7
                   1694: #define TYLOGICAL 8
                   1695: #define TYCHAR 9
                   1696: #define TYSUBR 10
                   1697: #define TYERROR 11
                   1698: 
                   1699: #define NTYPES (TYERROR+1)
                   1700:  
                   1701: #define        LINTW   12
                   1702: #define        LINE    80
                   1703: #define        LLOGW   2
                   1704: #define        LLOW    1.0
                   1705: #define        LHIGH   10.0
                   1706: #define        LFW     12
                   1707: #define        LFD     8
                   1708: #define        LEW     16
                   1709: #define        LED     8
                   1710: 
                   1711: typedef union
                   1712: {      short   flshort;
                   1713:        ftnint  flint;
                   1714:        real    flreal;
                   1715:        doublereal      fldouble;
                   1716: } flex;
                   1717: extern int scale;
                   1718: extern int (*lioproc)();
                   1719: ./ ADD NAME=libI77/lread.c TIME=628950338
                   1720: #include "f2c.h"
                   1721: #include "fio.h"
                   1722: #include "fmt.h"
                   1723: #include "lio.h"
                   1724: #include "ctype.h"
                   1725: #include "fp.h"
                   1726: 
                   1727: extern char *fmtbuf;
                   1728: extern char *malloc(), *realloc();
                   1729: int (*lioproc)();
                   1730: 
                   1731: #define isblnk(x) (ltab[x+1]&B)
                   1732: #define issep(x) (ltab[x+1]&SX)
                   1733: #define isapos(x) (ltab[x+1]&AX)
                   1734: #define isexp(x) (ltab[x+1]&EX)
                   1735: #define issign(x) (ltab[x+1]&SG)
                   1736: #define SX 1
                   1737: #define B 2
                   1738: #define AX 4
                   1739: #define EX 8
                   1740: #define SG 16
                   1741: char ltab[128+1] = {   /* offset one for EOF */
                   1742:        0,
                   1743:        0,0,AX,0,0,0,0,0,0,0,SX,0,0,0,0,0,
                   1744:        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                   1745:        SX|B,0,AX,0,0,0,0,AX,0,0,0,SG,SX,SG,0,SX,
                   1746:        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                   1747:        0,0,0,0,EX,EX,0,0,0,0,0,0,0,0,0,0,
                   1748:        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                   1749:        AX,0,0,0,EX,EX,0,0,0,0,0,0,0,0,0,0,
                   1750:        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
                   1751: };
                   1752: 
                   1753: t_getc()
                   1754: {      int ch;
                   1755:        if(curunit->uend) return(EOF);
                   1756:        if((ch=getc(cf))!=EOF) return(ch);
                   1757:        if(feof(cf)) curunit->uend = 1;
                   1758:        return(EOF);
                   1759: }
                   1760: integer e_rsle()
                   1761: {
                   1762:        int ch;
                   1763:        if(curunit->uend) return(0);
                   1764:        while((ch=t_getc())!='\n' && ch!=EOF);
                   1765:        return(0);
                   1766: }
                   1767: 
                   1768: flag lquit;
                   1769: int lcount,ltype;
                   1770: char *lchar;
                   1771: double lx,ly;
                   1772: #define ERR(x) if(n=(x)) return(n)
                   1773: #define GETC(x) (x=t_getc())
                   1774: 
                   1775: l_read(number,ptr,len,type) ftnint *number,type; char *ptr; ftnlen len;
                   1776: {
                   1777: #define Ptr ((flex *)ptr)
                   1778:        int i,n,ch;
                   1779:        doublereal *yy;
                   1780:        real *xx;
                   1781:        for(i=0;i<*number;i++)
                   1782:        {
                   1783:                if(lquit) return(0);
                   1784:                if(curunit->uend) err(elist->ciend, EOF, "list in")
                   1785:                if(lcount == 0) {
                   1786:                        ltype = 0;
                   1787:                        for(;;)  {
                   1788:                                GETC(ch);
                   1789:                                switch(ch) {
                   1790:                                case EOF:
                   1791:                                        goto loopend;
                   1792:                                case ' ':
                   1793:                                case '\n':
                   1794:                                        continue;
                   1795:                                case '/':
                   1796:                                        lquit = 1;
                   1797:                                        goto loopend;
                   1798:                                case ',':
                   1799:                                        lcount = 1;
                   1800:                                        goto loopend;
                   1801:                                default:
                   1802:                                        (void) ungetc(ch, cf);
                   1803:                                        goto rddata;
                   1804:                                }
                   1805:                        }
                   1806:                }
                   1807:        rddata:
                   1808:                switch((int)type)
                   1809:                {
                   1810:                case TYSHORT:
                   1811:                case TYLONG:
                   1812:                case TYREAL:
                   1813:                case TYDREAL:
                   1814:                        ERR(l_R());
                   1815:                        break;
                   1816:                case TYCOMPLEX:
                   1817:                case TYDCOMPLEX:
                   1818:                        ERR(l_C());
                   1819:                        break;
                   1820:                case TYLOGICAL:
                   1821:                        ERR(l_L());
                   1822:                        break;
                   1823:                case TYCHAR:
                   1824:                        ERR(l_CHAR());
                   1825:                        break;
                   1826:                }
                   1827:        while ((ch=t_getc())==' '); if (ch!=',') ungetc(ch,cf);
                   1828:        loopend:
                   1829:                if(lquit) return(0);
                   1830:                if(feof(cf)) err(elist->ciend,(EOF),"list in")
                   1831:                else if(ferror(cf))
                   1832:                {       clearerr(cf);
                   1833:                        err(elist->cierr,errno,"list in")
                   1834:                }
                   1835:                if(ltype==0) goto bump;
                   1836:                switch((int)type)
                   1837:                {
                   1838:                case TYSHORT:
                   1839:                        Ptr->flshort=lx;
                   1840:                        break;
                   1841:                case TYLOGICAL:
                   1842:                case TYLONG:
                   1843:                        Ptr->flint=lx;
                   1844:                        break;
                   1845:                case TYREAL:
                   1846:                        Ptr->flreal=lx;
                   1847:                        break;
                   1848:                case TYDREAL:
                   1849:                        Ptr->fldouble=lx;
                   1850:                        break;
                   1851:                case TYCOMPLEX:
                   1852:                        xx=(real *)ptr;
                   1853:                        *xx++ = lx;
                   1854:                        *xx = ly;
                   1855:                        break;
                   1856:                case TYDCOMPLEX:
                   1857:                        yy=(doublereal *)ptr;
                   1858:                        *yy++ = lx;
                   1859:                        *yy = ly;
                   1860:                        break;
                   1861:                case TYCHAR:
                   1862:                        b_char(lchar,ptr,len);
                   1863:                        break;
                   1864:                }
                   1865:        bump:
                   1866:                if(lcount>0) lcount--;
                   1867:                ptr += len;
                   1868:        }
                   1869:        return(0);
                   1870: #undef Ptr
                   1871: }
                   1872: l_R()
                   1873: {
                   1874:        char s[FMAX+EXPMAXDIGS+4];
                   1875:        register int ch;
                   1876:        register char *sp, *spe, *sp1;
                   1877:        long e, exp;
                   1878:        double atof();
                   1879:        int havenum, poststar, se;
                   1880: 
                   1881:        if (lcount > 0)
                   1882:                return(0);
                   1883:        ltype = 0;
                   1884:        lcount = 1;
                   1885:        exp = 0;
                   1886:        poststar = 0;
                   1887: retry:
                   1888:        sp1 = sp = s;
                   1889:        spe = sp + FMAX;
                   1890:        havenum = 0;
                   1891: 
                   1892:        switch(GETC(ch)) {
                   1893:                case '-': *sp++ = ch; sp1++; spe++;
                   1894:                case '+':
                   1895:                        GETC(ch);
                   1896:                }
                   1897:        while(ch == '0') {
                   1898:                ++havenum;
                   1899:                GETC(ch);
                   1900:                }
                   1901:        while(isdigit(ch)) {
                   1902:                if (sp < spe) *sp++ = ch;
                   1903:                else ++exp;
                   1904:                GETC(ch);
                   1905:                }
                   1906:        if (ch == '*' && !poststar) {
                   1907:                if (sp == sp1 || exp || *s == '-') {
                   1908:                        err(elist->cierr,112,"bad repetition count")
                   1909:                        }
                   1910:                poststar = 1;
                   1911:                *sp = 0;
                   1912:                lcount = atoi(s);
                   1913:                goto retry;
                   1914:                }
                   1915:        if (ch == '.') {
                   1916:                GETC(ch);
                   1917:                if (sp == sp1)
                   1918:                        while(ch == '0') {
                   1919:                                ++havenum;
                   1920:                                --exp;
                   1921:                                GETC(ch);
                   1922:                                }
                   1923:                while(isdigit(ch)) {
                   1924:                        if (sp < spe)
                   1925:                                { *sp++ = ch; --exp; }
                   1926:                        GETC(ch);
                   1927:                        }
                   1928:                }
                   1929:        se = 0;
                   1930:        if (issign(ch)) 
                   1931:                goto signonly;
                   1932:        if (isexp(ch)) {
                   1933:                GETC(ch);
                   1934:                if (issign(ch)) {
                   1935: signonly:
                   1936:                        if (ch == '-') se = 1;
                   1937:                        GETC(ch);
                   1938:                        }
                   1939:                if (!isdigit(ch)) {
                   1940: bad:
                   1941:                        err(elist->cierr,112,"exponent field")
                   1942:                        }
                   1943:                
                   1944:                e = ch - '0';
                   1945:                while(isdigit(GETC(ch))) {
                   1946:                        e = 10*e + ch - '0';
                   1947:                        if (e > EXPMAX)
                   1948:                                goto bad;
                   1949:                        }
                   1950:                if (se)
                   1951:                        exp -= e;
                   1952:                else
                   1953:                        exp += e;
                   1954:                }
                   1955:        (void) ungetc(ch, cf);
                   1956:        if (sp > sp1) {
                   1957:                ++havenum;
                   1958:                while(*--sp == '0')
                   1959:                        ++exp;
                   1960:                if (exp)
                   1961:                        sprintf(sp+1, "e%ld", exp);
                   1962:                else
                   1963:                        sp[1] = 0;
                   1964:                lx = atof(s);
                   1965:                }
                   1966:        else
                   1967:                lx = 0.;
                   1968:        if (havenum)
                   1969:                ltype = TYLONG;
                   1970:        else
                   1971:                switch(ch) {
                   1972:                        case ',':
                   1973:                        case '/':
                   1974:                                break;
                   1975:                        default:
                   1976:                                err(elist->cierr,112,"invalid number")
                   1977:                        }
                   1978:        return 0;
                   1979:        }
                   1980: 
                   1981: l_C()
                   1982: {      int ch;
                   1983:        if(lcount>0) return(0);
                   1984:        ltype=0;
                   1985:        GETC(ch);
                   1986:        if(ch!='(')
                   1987:        {
                   1988:                (void) ungetc(ch,cf);
                   1989:                if(fscanf(cf,"%d",&lcount)!=1)
                   1990:                        if(!feof(cf)) err(elist->cierr,112,"complex format")
                   1991:                        else err(elist->cierr,(EOF),"lread");
                   1992:                if(GETC(ch)!='*')
                   1993:                {
                   1994:                        if(!feof(cf)) err(elist->cierr,112,"no star")
                   1995:                        else err(elist->cierr,(EOF),"lread");
                   1996:                }
                   1997:                if(GETC(ch)!='(')
                   1998:                {       (void) ungetc(ch,cf);
                   1999:                        return(0);
                   2000:                }
                   2001:        }
                   2002:        lcount = 1;
                   2003:        ltype=TYLONG;
                   2004:        (void) fscanf(cf,"%lf",&lx);
                   2005:        while(isblnk(GETC(ch)) || (ch == '\n'));
                   2006:        if(ch!=',')
                   2007:        {       (void) ungetc(ch,cf);
                   2008:                err(elist->cierr,112,"no comma");
                   2009:        }
                   2010:        while(isblnk(GETC(ch)));
                   2011:        (void) ungetc(ch,cf);
                   2012:        (void) fscanf(cf,"%lf",&ly);
                   2013:        while(isblnk(GETC(ch)));
                   2014:        if(ch!=')') err(elist->cierr,112,"no )");
                   2015:        return(0);
                   2016: }
                   2017: l_L()
                   2018: {
                   2019:        int ch;
                   2020:        if(lcount>0) return(0);
                   2021:        ltype=0;
                   2022:        GETC(ch);
                   2023:        if(isdigit(ch))
                   2024:        {       (void) ungetc(ch,cf);
                   2025:                (void) fscanf(cf,"%d",&lcount);
                   2026:                if(GETC(ch)!='*')
                   2027:                        if(!feof(cf)) err(elist->cierr,112,"no star")
                   2028:                        else err(elist->cierr,(EOF),"lread");
                   2029:        }
                   2030:        else    (void) ungetc(ch,cf);
                   2031:        if(GETC(ch)=='.') GETC(ch);
                   2032:        switch(ch)
                   2033:        {
                   2034:        case 't':
                   2035:        case 'T':
                   2036:                lx=1;
                   2037:                break;
                   2038:        case 'f':
                   2039:        case 'F':
                   2040:                lx=0;
                   2041:                break;
                   2042:        default:
                   2043:                if(isblnk(ch) || issep(ch) || ch==EOF)
                   2044:                {       (void) ungetc(ch,cf);
                   2045:                        return(0);
                   2046:                }
                   2047:                else    err(elist->cierr,112,"logical");
                   2048:        }
                   2049:        ltype=TYLONG;
                   2050:        lcount = 1;
                   2051:        while(!issep(GETC(ch)) && ch!=EOF);
                   2052:        (void) ungetc(ch, cf);
                   2053:        return(0);
                   2054: }
                   2055: #define BUFSIZE        128
                   2056: l_CHAR()
                   2057: {      int ch,size,i;
                   2058:        char quote,*p;
                   2059:        if(lcount>0) return(0);
                   2060:        ltype=0;
                   2061: 
                   2062:        GETC(ch);
                   2063:        if(isdigit(ch))
                   2064:        {       (void) ungetc(ch,cf);
                   2065:                (void) fscanf(cf,"%d",&lcount);
                   2066:                if(GETC(ch)!='*') err(elist->cierr,112,"no star");
                   2067:        }
                   2068:        else    (void) ungetc(ch,cf);
                   2069:        if(GETC(ch)=='\'' || ch=='"') quote=ch;
                   2070:        else if(isblnk(ch) || (issep(ch) && ch != '\n') || ch==EOF)
                   2071:        {       (void) ungetc(ch,cf);
                   2072:                return(0);
                   2073:        }
                   2074:        else err(elist->cierr,112,"no quote");
                   2075:        ltype=TYCHAR;
                   2076:        if(lchar!=NULL) free(lchar);
                   2077:        size=BUFSIZE;
                   2078:        p=lchar=malloc((unsigned int)size);
                   2079:        if(lchar==NULL) err(elist->cierr,113,"no space");
                   2080:        for(i=0;;)
                   2081:        {       while(GETC(ch)!=quote && ch!='\n'
                   2082:                        && ch!=EOF && ++i<size) *p++ = ch;
                   2083:                if(i==size)
                   2084:                {
                   2085:                newone:
                   2086:                        lchar= realloc(lchar, (unsigned int)(size += BUFSIZE));
                   2087:                        p=lchar+i-1;
                   2088:                        *p++ = ch;
                   2089:                }
                   2090:                else if(ch==EOF) return(EOF);
                   2091:                else if(ch=='\n')
                   2092:                {       if(*(p-1) != '\\') continue;
                   2093:                        i--;
                   2094:                        p--;
                   2095:                        if(++i<size) *p++ = ch;
                   2096:                        else goto newone;
                   2097:                }
                   2098:                else if(GETC(ch)==quote)
                   2099:                {       if(++i<size) *p++ = ch;
                   2100:                        else goto newone;
                   2101:                }
                   2102:                else
                   2103:                {       (void) ungetc(ch,cf);
                   2104:                        *p = 0;
                   2105:                        return(0);
                   2106:                }
                   2107:        }
                   2108: }
                   2109: integer s_rsle(a) cilist *a;
                   2110: {
                   2111:        int n;
                   2112:        if(!init) f_init();
                   2113:        if(n=c_le(a)) return(n);
                   2114:        reading=1;
                   2115:        external=1;
                   2116:        formatted=1;
                   2117:        lioproc = l_read;
                   2118:        lquit = 0;
                   2119:        lcount = 0;
                   2120:        if(curunit->uwrt && nowreading(curunit))
                   2121:                err(a->cierr,errno,"read start");
                   2122:        return(0);
                   2123: }
                   2124: c_le(a) cilist *a;
                   2125: {
                   2126:        fmtbuf="list io";
                   2127:        if(a->ciunit>=MXUNIT || a->ciunit<0)
                   2128:                err(a->cierr,101,"stler");
                   2129:        scale=recpos=0;
                   2130:        elist=a;
                   2131:        curunit = &units[a->ciunit];
                   2132:        if(curunit->ufd==NULL && fk_open(SEQ,FMT,a->ciunit))
                   2133:                err(a->cierr,102,"lio");
                   2134:        cf=curunit->ufd;
                   2135:        if(!curunit->ufmt) err(a->cierr,103,"lio")
                   2136:        return(0);
                   2137: }
                   2138: integer do_lio(type,number,ptr,len) ftnint *number,*type; char *ptr; ftnlen len;
                   2139: {
                   2140:        return((*lioproc)(number,ptr,len,*type));
                   2141: }
                   2142: ./ ADD NAME=libI77/open.c TIME=628440564
                   2143: #include       "sys/types.h"
                   2144: #include       "sys/stat.h"
                   2145: #include "f2c.h"
                   2146: #include "fio.h"
                   2147: extern char *mktemp(), *malloc(), *strcpy();
                   2148: extern FILE *fdopen();
                   2149: extern integer f_clos();
                   2150: 
                   2151: integer f_open(a) olist *a;
                   2152: {      unit *b;
                   2153:        int n;
                   2154:        char buf[256];
                   2155:        cllist x;
                   2156:        if(a->ounit>=MXUNIT || a->ounit<0)
                   2157:                err(a->oerr,101,"open")
                   2158:        curunit = b = &units[a->ounit];
                   2159:        if(b->ufd) {
                   2160:                if(a->ofnm==0)
                   2161:                {
                   2162:                same:   if(a->oblnk!= 0) b->ublnk= *a->oblnk== 'z'?1:0;
                   2163:                        return(0);
                   2164:                }
                   2165:                g_char(a->ofnm,a->ofnmlen,buf);
                   2166:                if(inode(buf)==b->uinode) goto same;
                   2167:                x.cunit=a->ounit;
                   2168:                x.csta=0;
                   2169:                x.cerr=a->oerr;
                   2170:                if((n=f_clos(&x))!=0) return(n);
                   2171:                }
                   2172:        b->url=a->orl;
                   2173:        if(a->oblnk && (*a->oblnk=='z' || *a->oblnk == 'Z')) b->ublnk=1;
                   2174:        else b->ublnk=0;
                   2175:        if(a->ofm==0)
                   2176:        {       if(b->url>0) b->ufmt=0;
                   2177:                else b->ufmt=1;
                   2178:        }
                   2179:        else if(*a->ofm=='f' || *a->ofm == 'F') b->ufmt=1;
                   2180:        else b->ufmt=0;
                   2181:        if (a->ofnm) {
                   2182:                g_char(a->ofnm,a->ofnmlen,buf);
                   2183:                if (!buf[0])
                   2184:                        err(a->oerr,107,"open")
                   2185:                }
                   2186:        else
                   2187:                sprintf(buf, "fort.%ld", a->ounit);
                   2188:        b->uscrtch = 0;
                   2189:        switch(a->osta ? *a->osta : 'u')
                   2190:        {
                   2191:        case 'o':
                   2192:        case 'O':
                   2193:                if(!a->ofnm) err(a->oerr,107,"open")
                   2194:                if(access(buf,0))
                   2195:                        err(a->oerr,errno,"open")
                   2196:                break;
                   2197:         case 's':
                   2198:         case 'S':
                   2199:                b->uscrtch=1;
                   2200:                (void) strcpy(buf,"tmp.FXXXXXX");
                   2201:                (void) mktemp(buf);
                   2202:                (void) close(creat(buf, 0666));
                   2203:                break;
                   2204:        case 'n':
                   2205:        case 'N':
                   2206:                if(a->ofnm==0) err(a->oerr,107,"open")
                   2207:                (void) close(creat(buf, 0666));
                   2208:                break;
                   2209:        }
                   2210: done:
                   2211:        b->ufnm=(char *) malloc((unsigned int)(strlen(buf)+1));
                   2212:        if(b->ufnm==NULL) err(a->oerr,113,"no space");
                   2213:        (void) strcpy(b->ufnm,buf);
                   2214:        b->uend=0;
                   2215:        if(isdev(buf))
                   2216:        {       b->ufd = fopen(buf,"r");
                   2217:                if(b->ufd==NULL) err(a->oerr,errno,buf)
                   2218:                else    b->uwrt = 0;
                   2219:        }
                   2220:        else {
                   2221:                b->uwrt = 0;
                   2222:                if((b->ufd = fopen(buf, "r")) == NULL) {
                   2223:                        if ((n = open(buf,1)) >= 0) {
                   2224:                                b->uwrt = 2;
                   2225:                                }
                   2226:                        else {
                   2227:                                n = creat(buf, 0666);
                   2228:                                b->uwrt = 1;
                   2229:                                }
                   2230:                        if (n < 0
                   2231:                        || (b->ufd = fdopen(n, "w")) == NULL)
                   2232:                                err(a->oerr, errno, "open");
                   2233:                        }
                   2234:                if(b->url > 0)  /* one can more easily find the end */
                   2235:                        (void) fseek(b->ufd, 0L, 0);
                   2236:        }
                   2237:        b->useek=canseek(b->ufd);
                   2238:        if((b->uinode=inode(buf))==-1)
                   2239:                err(a->oerr,108,"open")
                   2240:        if(a->orl && b->useek) rewind(b->ufd);
                   2241:        return(0);
                   2242: }
                   2243: fk_open(seq,fmt,n) ftnint n;
                   2244: {      char nbuf[10];
                   2245:        olist a;
                   2246:        (void) sprintf(nbuf,"fort.%ld",n);
                   2247:        a.oerr=1;
                   2248:        a.ounit=n;
                   2249:        a.ofnm=nbuf;
                   2250:        a.ofnmlen=strlen(nbuf);
                   2251:        a.osta=NULL;
                   2252:        a.oacc= seq==SEQ?"s":"d";
                   2253:        a.ofm = fmt==FMT?"f":"u";
                   2254:        a.orl = seq==DIR?1:0;
                   2255:        a.oblnk=NULL;
                   2256:        return(f_open(&a));
                   2257: }
                   2258: isdev(s) char *s;
                   2259: {      struct stat x;
                   2260:        int j;
                   2261:        if(stat(s, &x) == -1) return(0);
                   2262:        if((j = (x.st_mode&S_IFMT)) == S_IFREG || j == S_IFDIR) return(0);
                   2263:        else    return(1);
                   2264: }
                   2265: ./ ADD NAME=libI77/rdfmt.c TIME=629051101
                   2266: #include "f2c.h"
                   2267: #include "fio.h"
                   2268: #include "fmt.h"
                   2269: #include "fp.h"
                   2270: 
                   2271: extern int cursor;
                   2272: rd_ed(p,ptr,len) char *ptr; struct syl *p; ftnlen len;
                   2273: {      int ch;
                   2274:        for(;cursor>0;cursor--) if((ch=(*getn)())<0) return(ch);
                   2275:        if(cursor<0)
                   2276:        {       if(recpos+cursor < 0) /*err(elist->cierr,110,"fmt")*/
                   2277:                        cursor = -recpos;       /* is this in the standard? */
                   2278:                if(external == 0) {
                   2279:                        extern char *icptr;
                   2280:                        icptr += cursor;
                   2281:                }
                   2282:                else if(curunit->useek) (void) fseek(cf,(long) cursor,1);
                   2283:                else err(elist->cierr,106,"fmt");
                   2284:                recpos += cursor;
                   2285:                cursor=0;
                   2286:        }
                   2287:        switch(p->op)
                   2288:        {
                   2289:        default: fprintf(stderr,"rd_ed, unexpected code: %d\n%s\n",
                   2290:                        p->op,fmtbuf);
                   2291:                abort();
                   2292:        case I: ch = (rd_I((uint *)ptr,p->p1,len, 10));
                   2293:                break;
                   2294:        case IM: ch = (rd_I((uint *)ptr,p->p1,len, 10));
                   2295:                break;
                   2296:        case O: ch = (rd_I((uint *)ptr, p->p1, len, 8));
                   2297:                break;
                   2298:        case L: ch = (rd_L((ftnint *)ptr,p->p1));
                   2299:                break;
                   2300:        case A: ch = (rd_A(ptr,len));
                   2301:                break;
                   2302:        case AW:
                   2303:                ch = (rd_AW(ptr,p->p1,len));
                   2304:                break;
                   2305:        case E: case EE:
                   2306:        case D:
                   2307:        case G:
                   2308:        case GE:
                   2309:        case F: ch = (rd_F((ufloat *)ptr,p->p1,p->p2,len));
                   2310:                break;
                   2311:        }
                   2312:        if(ch == 0) return(ch);
                   2313:        else if(ch == EOF) return(EOF);
                   2314:        clearerr(cf);
                   2315:        return(errno);
                   2316: }
                   2317: rd_ned(p) struct syl *p;
                   2318: {
                   2319:        switch(p->op)
                   2320:        {
                   2321:        default: fprintf(stderr,"rd_ned, unexpected code: %d\n%s\n",
                   2322:                        p->op,fmtbuf);
                   2323:                abort();
                   2324:        case APOS:
                   2325:                return(rd_POS(*(char **)&p->p2));
                   2326:        case H: return(rd_H(p->p1,*(char **)&p->p2));
                   2327:        case SLASH: return((*donewrec)());
                   2328:        case TR:
                   2329:        case X: cursor += p->p1;
                   2330:                return(1);
                   2331:        case T: cursor=p->p1-recpos - 1;
                   2332:                return(1);
                   2333:        case TL: cursor -= p->p1;
                   2334:                if(cursor < -recpos)    /* TL1000, 1X */
                   2335:                        cursor = -recpos;
                   2336:                return(1);
                   2337:        }
                   2338: }
                   2339: rd_I(n,w,len, base) ftnlen len; uint *n; register int base;
                   2340: {      long x;
                   2341:        int sign,ch;
                   2342:        char s[84], *ps;
                   2343:        ps=s; x=0;
                   2344:        while (w)
                   2345:        {
                   2346:                GET(ch);
                   2347:                if (ch==',' || ch=='\n') break;
                   2348:                *ps=ch; ps++; w--;
                   2349:        }
                   2350:        *ps='\0';
                   2351:        ps=s;
                   2352:        while (*ps==' ') ps++;
                   2353:        if (*ps=='-') { sign=1; ps++; }
                   2354:        else { sign=0; if (*ps=='+') ps++; }
                   2355: loop:  while (*ps>='0' && *ps<='9') { x=x*base+(*ps-'0'); ps++; }
                   2356:        if (*ps==' ') {if (cblank) x *= base; ps++; goto loop;}
                   2357:        if(sign) x = -x;
                   2358:        if(len==sizeof(integer)) n->il=x;
                   2359:        else if(len == sizeof(char)) n->ic = x;
                   2360:        else n->is=x;
                   2361:        if (*ps) return(errno=115); else return(0);
                   2362: }
                   2363: rd_L(n,w) ftnint *n;
                   2364: {      int ch;
                   2365:        char s[84], *ps;
                   2366:        ps=s;
                   2367:        while (w) {
                   2368:                GET(ch);
                   2369:                if (ch==','||ch=='\n') break;
                   2370:                *ps=ch;
                   2371:                ps++; w--;
                   2372:                }
                   2373:        *ps='\0';
                   2374:        ps=s; while (*ps==' ') ps++;
                   2375:        if (*ps=='.') ps++;
                   2376:        if (*ps=='t' || *ps == 'T') { *n=1; return(0); }
                   2377:        else if (*ps='f' || *ps == 'F') { *n=0; return(0); }
                   2378:        else return(errno=116);
                   2379: }
                   2380: 
                   2381: #include "ctype.h"
                   2382: 
                   2383: rd_F(p, w, d, len) 
                   2384: ftnlen len; 
                   2385: ufloat *p;
                   2386: {
                   2387:        char s[FMAX+EXPMAXDIGS+4];
                   2388:        register int ch;
                   2389:        register char *sp, *spe, *sp1;
                   2390:        double atof(), x;
                   2391:        int scale1, se;
                   2392:        long e, exp;
                   2393: 
                   2394:        sp1 = sp = s;
                   2395:        spe = sp + FMAX;
                   2396:        exp = -d;
                   2397:        x = 0.;
                   2398: 
                   2399:        do {
                   2400:                GET(ch); 
                   2401:                w--;
                   2402:                } while (ch == ' ' && w);
                   2403:        switch(ch) {
                   2404:                case '-': *sp++ = ch; sp1++; spe++;
                   2405:                case '+':
                   2406:                        if (!w) goto zero;
                   2407:                        --w;
                   2408:                        GET(ch);
                   2409:                }
                   2410:        while(ch == ' ') {
                   2411: blankdrop:
                   2412:                if (!w--) goto zero; GET(ch); }
                   2413:        while(ch == '0')
                   2414:                { if (!w--) goto zero; GET(ch); }
                   2415:        if (ch == ' ' && cblank)
                   2416:                goto blankdrop;
                   2417:        scale1 = scale;
                   2418:        while(isdigit(ch)) {
                   2419: digloop1:
                   2420:                if (sp < spe) *sp++ = ch;
                   2421:                else ++exp;
                   2422: digloop1e:
                   2423:                if (!w--) goto done;
                   2424:                GET(ch);
                   2425:                }
                   2426:        if (ch == ' ') {
                   2427:                if (cblank)
                   2428:                        { ch = '0'; goto digloop1; }
                   2429:                goto digloop1e;
                   2430:                }
                   2431:        if (ch == '.') {
                   2432:                exp += d;
                   2433:                if (!w--) goto done;
                   2434:                GET(ch);
                   2435:                if (sp == sp1) { /* no digits yet */
                   2436:                        while(ch == '0') {
                   2437: skip01:
                   2438:                                --exp;
                   2439: skip0:
                   2440:                                if (!w--) goto done;
                   2441:                                GET(ch);
                   2442:                                }
                   2443:                        if (ch == ' ') {
                   2444:                                if (cblank) goto skip01;
                   2445:                                goto skip0;
                   2446:                                }
                   2447:                        }
                   2448:                while(isdigit(ch)) {
                   2449: digloop2:
                   2450:                        if (sp < spe)
                   2451:                                { *sp++ = ch; --exp; }
                   2452: digloop2e:
                   2453:                        if (!w--) goto done;
                   2454:                        GET(ch);
                   2455:                        }
                   2456:                if (ch == ' ') {
                   2457:                        if (cblank)
                   2458:                                { ch = '0'; goto digloop2; }
                   2459:                        goto digloop2e;
                   2460:                        }
                   2461:                }
                   2462:        switch(ch) {
                   2463:          default:
                   2464:                break;
                   2465:          case '-': se = 1; goto signonly;
                   2466:          case '+': se = 0; goto signonly;
                   2467:          case 'e':
                   2468:          case 'E':
                   2469:          case 'd':
                   2470:          case 'D':
                   2471:                if (!w--)
                   2472:                        goto bad;
                   2473:                GET(ch);
                   2474:                while(ch == ' ') {
                   2475:                        if (!w--)
                   2476:                                goto bad;
                   2477:                        GET(ch);
                   2478:                        }
                   2479:                se = 0;
                   2480:                switch(ch) {
                   2481:                  case '-': se = 1;
                   2482:                  case '+':
                   2483: signonly:
                   2484:                        if (!w--)
                   2485:                                goto bad;
                   2486:                        GET(ch);
                   2487:                        }
                   2488:                while(ch == ' ') {
                   2489:                        if (!w--)
                   2490:                                goto bad;
                   2491:                        GET(ch);
                   2492:                        }
                   2493:                if (!isdigit(ch))
                   2494:                        goto bad;
                   2495:                
                   2496:                e = ch - '0';
                   2497:                for(;;) {
                   2498:                        if (!w--)
                   2499:                                { ch = '\n'; break; }
                   2500:                        GET(ch);
                   2501:                        if (!isdigit(ch)) {
                   2502:                                if (ch == ' ') {
                   2503:                                        if (cblank)
                   2504:                                                ch = '0';
                   2505:                                        else continue;
                   2506:                                        }
                   2507:                                else
                   2508:                                        break;
                   2509:                                }
                   2510:                        e = 10*e + ch - '0';
                   2511:                        if (e > EXPMAX && sp > sp1)
                   2512:                                goto bad;
                   2513:                        }
                   2514:                if (se)
                   2515:                        exp -= e;
                   2516:                else
                   2517:                        exp += e;
                   2518:                scale1 = 0;
                   2519:                }
                   2520:        switch(ch) {
                   2521:          case '\n':
                   2522:          case ',':
                   2523:                break;
                   2524:          default:
                   2525: bad:
                   2526:                return (errno = 115);
                   2527:                }
                   2528: done:
                   2529:        if (sp > sp1) {
                   2530:                while(*--sp == '0')
                   2531:                        ++exp;
                   2532:                if (exp -= scale1)
                   2533:                        sprintf(sp+1, "e%ld", exp);
                   2534:                else
                   2535:                        sp[1] = 0;
                   2536:                x = atof(s);
                   2537:                }
                   2538: zero:  
                   2539:        if (len == sizeof(real)) 
                   2540:                p->pf = x; 
                   2541:        else 
                   2542:                p->pd = x;
                   2543:        return(0);
                   2544:        }
                   2545: 
                   2546: 
                   2547: rd_A(p,len) char *p; ftnlen len;
                   2548: {      int i,ch;
                   2549:        for(i=0;i<len;i++)
                   2550:        {       GET(ch);
                   2551:                *p++=VAL(ch);
                   2552:        }
                   2553:        return(0);
                   2554: }
                   2555: rd_AW(p,w,len) char *p; ftnlen len;
                   2556: {      int i,ch;
                   2557:        if(w>=len)
                   2558:        {       for(i=0;i<w-len;i++)
                   2559:                        GET(ch);
                   2560:                for(i=0;i<len;i++)
                   2561:                {       GET(ch);
                   2562:                        *p++=VAL(ch);
                   2563:                }
                   2564:                return(0);
                   2565:        }
                   2566:        for(i=0;i<w;i++)
                   2567:        {       GET(ch);
                   2568:                *p++=VAL(ch);
                   2569:        }
                   2570:        for(i=0;i<len-w;i++) *p++=' ';
                   2571:        return(0);
                   2572: }
                   2573: rd_H(n,s) char *s;
                   2574: {      int i,ch;
                   2575:        for(i=0;i<n;i++)
                   2576:                if((ch=(*getn)())<0) return(ch);
                   2577:                else *s++ = ch=='\n'?' ':ch;
                   2578:        return(1);
                   2579: }
                   2580: rd_POS(s) char *s;
                   2581: {      char quote;
                   2582:        int ch;
                   2583:        quote= *s++;
                   2584:        for(;*s;s++)
                   2585:                if(*s==quote && *(s+1)!=quote) break;
                   2586:                else if((ch=(*getn)())<0) return(ch);
                   2587:                else *s = ch=='\n'?' ':ch;
                   2588:        return(1);
                   2589: }
                   2590: ./ ADD NAME=libI77/rewind.c TIME=628440564
                   2591: #include "f2c.h"
                   2592: #include "fio.h"
                   2593: integer f_rew(a) alist *a;
                   2594: {
                   2595:        unit *b;
                   2596:        if(a->aunit>=MXUNIT || a->aunit<0) err(a->aerr,101,"rewind");
                   2597:        b = &units[a->aunit];
                   2598:        if(b->ufd == NULL) return(0);
                   2599:        if(!b->useek) err(a->aerr,106,"rewind")
                   2600:        if(b->uwrt) {
                   2601:                (void) t_runc(a);
                   2602:                b->uwrt = 3;
                   2603:                }
                   2604:        rewind(b->ufd);
                   2605:        b->uend=0;
                   2606:        return(0);
                   2607: }
                   2608: ./ ADD NAME=libI77/rsfe.c TIME=628440564
                   2609: /* read sequential formatted external */
                   2610: #include "f2c.h"
                   2611: #include "fio.h"
                   2612: #include "fmt.h"
                   2613: extern int x_getc(),rd_ed(),rd_ned();
                   2614: extern int x_endp(),x_rev(),xrd_SL();
                   2615: integer s_rsfe(a) cilist *a; /* start */
                   2616: {      int n;
                   2617:        if(!init) f_init();
                   2618:        if(n=c_sfe(a)) return(n);
                   2619:        reading=1;
                   2620:        sequential=1;
                   2621:        formatted=1;
                   2622:        external=1;
                   2623:        elist=a;
                   2624:        cursor=recpos=0;
                   2625:        scale=0;
                   2626:        fmtbuf=a->cifmt;
                   2627:        curunit= &units[a->ciunit];
                   2628:        cf=curunit->ufd;
                   2629:        if(pars_f(fmtbuf)<0) err(a->cierr,100,"startio");
                   2630:        getn= x_getc;
                   2631:        doed= rd_ed;
                   2632:        doned= rd_ned;
                   2633:        fmt_bg();
                   2634:        doend=x_endp;
                   2635:        donewrec=xrd_SL;
                   2636:        dorevert=x_rev;
                   2637:        cblank=curunit->ublnk;
                   2638:        cplus=0;
                   2639:        if(curunit->uwrt && nowreading(curunit))
                   2640:                err(a->cierr,errno,"read start");
                   2641:        return(0);
                   2642: }
                   2643: xrd_SL()
                   2644: {      int ch;
                   2645:        if(!curunit->uend)
                   2646:                while((ch=getc(cf))!='\n' && ch!=EOF);
                   2647:        cursor=recpos=0;
                   2648:        return(1);
                   2649: }
                   2650: x_getc()
                   2651: {      int ch;
                   2652:        if(curunit->uend) return(EOF);
                   2653:        ch = getc(cf);
                   2654:        if(ch!=EOF && ch!='\n')
                   2655:        {       recpos++;
                   2656:                return(ch);
                   2657:        }
                   2658:        if(ch=='\n')
                   2659:        {       (void) ungetc(ch,cf);
                   2660:                return(ch);
                   2661:        }
                   2662:        if(curunit->uend || feof(cf))
                   2663:        {       errno=0;
                   2664:                curunit->uend=1;
                   2665:                return(-1);
                   2666:        }
                   2667:        return(-1);
                   2668: }
                   2669: x_endp()
                   2670: {
                   2671:        (void) xrd_SL();
                   2672:        return(0);
                   2673: }
                   2674: x_rev()
                   2675: {
                   2676:        (void) xrd_SL();
                   2677:        return(0);
                   2678: }
                   2679: ./ ADD NAME=libI77/sfe.c TIME=628440564
                   2680: /* sequential formatted external common routines*/
                   2681: #include "f2c.h"
                   2682: #include "fio.h"
                   2683: 
                   2684: extern char *fmtbuf;
                   2685: 
                   2686: integer e_rsfe()
                   2687: {      int n;
                   2688:        n=en_fio();
                   2689:        if (cf == stdout)
                   2690:                fflush(stdout);
                   2691:        else if (cf == stderr)
                   2692:                fflush(stderr);
                   2693:        fmtbuf=NULL;
                   2694:        return(n);
                   2695: }
                   2696: c_sfe(a) cilist *a; /* check */
                   2697: {      unit *p;
                   2698:        if(a->ciunit >= MXUNIT || a->ciunit<0)
                   2699:                err(a->cierr,101,"startio");
                   2700:        p = &units[a->ciunit];
                   2701:        if(p->ufd==NULL && fk_open(SEQ,FMT,a->ciunit)) err(a->cierr,114,"sfe")
                   2702:        if(!p->ufmt) err(a->cierr,102,"sfe")
                   2703:        return(0);
                   2704: }
                   2705: integer e_wsfe()
                   2706: {      return(e_rsfe());
                   2707: }
                   2708: ./ ADD NAME=libI77/sue.c TIME=628440564
                   2709: #include "f2c.h"
                   2710: #include "fio.h"
                   2711: extern int reclen;
                   2712: long recloc;
                   2713: 
                   2714: integer s_rsue(a) cilist *a;
                   2715: {
                   2716:        int n;
                   2717:        if(!init) f_init();
                   2718:        reading=1;
                   2719:        if(n=c_sue(a)) return(n);
                   2720:        recpos=0;
                   2721:        if(curunit->uwrt && nowreading(curunit))
                   2722:                err(a->cierr, errno, "read start");
                   2723:        if(fread((char *)&reclen,sizeof(int),1,cf)
                   2724:                != 1)
                   2725:        {       if(feof(cf))
                   2726:                {       curunit->uend = 1;
                   2727:                        err(a->ciend, EOF, "start");
                   2728:                }
                   2729:                clearerr(cf);
                   2730:                err(a->cierr, errno, "start");
                   2731:        }
                   2732:        return(0);
                   2733: }
                   2734: integer s_wsue(a) cilist *a;
                   2735: {
                   2736:        int n;
                   2737:        if(!init) f_init();
                   2738:        if(n=c_sue(a)) return(n);
                   2739:        reading=0;
                   2740:        reclen=0;
                   2741:        if(curunit->uwrt != 1 && nowwriting(curunit))
                   2742:                err(a->cierr, errno, "write start");
                   2743:        recloc=ftell(cf);
                   2744:        (void) fseek(cf,(long)sizeof(int),1);
                   2745:        return(0);
                   2746: }
                   2747: c_sue(a) cilist *a;
                   2748: {
                   2749:        if(a->ciunit >= MXUNIT || a->ciunit < 0)
                   2750:                err(a->cierr,101,"startio");
                   2751:        external=sequential=1;
                   2752:        formatted=0;
                   2753:        curunit = &units[a->ciunit];
                   2754:        elist=a;
                   2755:        if(curunit->ufd==NULL && fk_open(SEQ,UNF,a->ciunit))
                   2756:                err(a->cierr,114,"sue");
                   2757:        cf=curunit->ufd;
                   2758:        if(curunit->ufmt) err(a->cierr,103,"sue")
                   2759:        if(!curunit->useek) err(a->cierr,103,"sue")
                   2760:        return(0);
                   2761: }
                   2762: integer e_wsue()
                   2763: {      long loc;
                   2764:        (void) fwrite((char *)&reclen,sizeof(int),1,cf);
                   2765:        loc=ftell(cf);
                   2766:        (void) fseek(cf,recloc,0);
                   2767:        (void) fwrite((char *)&reclen,sizeof(int),1,cf);
                   2768:        (void) fseek(cf,loc,0);
                   2769:        return(0);
                   2770: }
                   2771: integer e_rsue()
                   2772: {
                   2773:        (void) fseek(cf,(long)(reclen-recpos+sizeof(int)),1);
                   2774:        return(0);
                   2775: }
                   2776: ./ ADD NAME=libI77/uio.c TIME=628440564
                   2777: #include "f2c.h"
                   2778: #include "fio.h"
                   2779: int reclen;
                   2780: do_us(number,ptr,len) ftnint *number; ftnlen len; char *ptr;
                   2781: {
                   2782:        if(reading)
                   2783:        {
                   2784:                recpos += *number * len;
                   2785:                if(recpos>reclen)
                   2786:                {
                   2787:                        err(elist->ciend,(-1), "eof/uio");
                   2788:                }
                   2789:                (void) fread(ptr,(int)len,(int)(*number),cf);
                   2790:                return(0);
                   2791:        }
                   2792:        else
                   2793:        {
                   2794:                reclen += *number * len;
                   2795:                (void) fwrite(ptr,(int)len,(int)(*number),cf);
                   2796:                return(0);
                   2797:        }
                   2798: }
                   2799: integer do_uio(number,ptr,len) ftnint *number; ftnlen len; char *ptr;
                   2800: {
                   2801:        if(sequential)
                   2802:                return(do_us(number,ptr,len));
                   2803:        else    return(do_ud(number,ptr,len));
                   2804: }
                   2805: do_ud(number,ptr,len) ftnint *number; ftnlen len; char *ptr;
                   2806: {
                   2807:        recpos += *number * len;
                   2808:        if(recpos > curunit->url && curunit->url!=1)
                   2809:                err(elist->cierr,110,"eof/uio");
                   2810:        if(reading)
                   2811:        {
                   2812:                if(fread(ptr,(int)len,(int)(*number),cf)
                   2813:                        != *number)
                   2814:                        err(elist->cierr,27,"eof/uio")
                   2815:                else return(0);
                   2816:        }
                   2817:        (void) fwrite(ptr,(int)len,(int)(*number),cf);
                   2818:        return(0);
                   2819: }
                   2820: ./ ADD NAME=libI77/util.c TIME=628473389
                   2821: #include "sys/types.h"
                   2822: #include "sys/stat.h"
                   2823: #include "f2c.h"
                   2824: #include "fio.h"
                   2825: 
                   2826: g_char(a,alen,b) char *a,*b; ftnlen alen;
                   2827: {      char *x=a+alen-1,*y=b+alen-1;
                   2828:        *(y+1)=0;
                   2829:        for(;x>=a && *x==' ';x--) *y--=0;
                   2830:        for(;x>=a;*y--= *x--);
                   2831: }
                   2832: b_char(a,b,blen) char *a,*b; ftnlen blen;
                   2833: {      int i;
                   2834:        for(i=0;i<blen && *a!=0;i++) *b++= *a++;
                   2835:        for(;i<blen;i++) *b++=' ';
                   2836: }
                   2837: inode(a) char *a;
                   2838: {      struct stat x;
                   2839:        if(stat(a,&x)<0) return(-1);
                   2840:        return(x.st_ino);
                   2841: }
                   2842: #define DONE {*bufpos++=0; (void) close(file); return;}
                   2843: #define INTBOUND sizeof(int)-1
                   2844: mvgbt(n,len,a,b) char *a,*b;
                   2845: {      register int num=n*len;
                   2846:        if( ((int)a&INTBOUND)==0 && ((int)b&INTBOUND)==0 && (num&INTBOUND)==0 )
                   2847:        {       register int *x=(int *)a,*y=(int *)b;
                   2848:                num /= sizeof(int);
                   2849:                if(x>y) for(;num>0;num--) *y++= *x++;
                   2850:                else for(num--;num>=0;num--) *(y+num)= *(x+num);
                   2851:        }
                   2852:        else
                   2853:        {       register char *x=a,*y=b;
                   2854:                if(x>y) for(;num>0;num--) *y++= *x++;
                   2855:                else for(num--;num>=0;num--) *(y+num)= *(x+num);
                   2856:        }
                   2857: }
                   2858: ./ ADD NAME=libI77/wref.c TIME=628965453
                   2859: #include "f2c.h"
                   2860: #include "fio.h"
                   2861: #include "fmt.h"
                   2862: #include "fp.h"
                   2863: #ifndef VAX
                   2864: #include "ctype.h"
                   2865: #endif
                   2866: 
                   2867: wrt_E(p,w,d,e,len) ufloat *p; ftnlen len;
                   2868: {
                   2869:        char buf[FMAX+EXPMAXDIGS+4], *s, *se;
                   2870:        int d1, delta, e1, i, sign, signspace;
                   2871:        double dd;
                   2872: #ifndef VAX
                   2873:        int e0 = e;
                   2874: #endif
                   2875: 
                   2876:        if(e <= 0)
                   2877:                e = 2;
                   2878:        if(scale) {
                   2879:                if(scale >= d + 2 || scale <= -d)
                   2880:                        goto nogood;
                   2881:                }
                   2882:        if(scale <= 0)
                   2883:                --d;
                   2884:        if (len == sizeof(real))
                   2885:                dd = p->pf;
                   2886:        else
                   2887:                dd = p->pd;
                   2888:        if (dd >= 0.) {
                   2889:                sign = 0;
                   2890:                signspace = cplus;
                   2891: #ifndef VAX
                   2892:                if (!dd)
                   2893:                        dd = 0.;        /* avoid -0 */
                   2894: #endif
                   2895:                }
                   2896:        else {
                   2897:                signspace = sign = 1;
                   2898:                dd = -dd;
                   2899:                }
                   2900:        delta = w - (2 /* for the . and the d adjustment above */
                   2901:                        + 2 /* for the E+ */ + signspace + d + e);
                   2902:        if (delta < 0) {
                   2903: nogood:
                   2904:                while(--w >= 0)
                   2905:                        PUT('*');
                   2906:                return(0);
                   2907:                }
                   2908:        if (scale < 0)
                   2909:                d += scale;
                   2910:        if (d > FMAX) {
                   2911:                d1 = d - FMAX;
                   2912:                d = FMAX;
                   2913:                }
                   2914:        else
                   2915:                d1 = 0;
                   2916:        sprintf(buf,"%#.*E", d, dd);
                   2917: #ifndef VAX
                   2918:        /* check for NaN, Infinity */
                   2919:        if (!isdigit(buf[0])) {
                   2920:                delta = w - strlen(buf) - signspace;
                   2921:                if (delta < 0)
                   2922:                        goto nogood;
                   2923:                while(--delta >= 0)
                   2924:                        PUT(' ');
                   2925:                if (signspace)
                   2926:                        PUT(sign ? '-' : '+');
                   2927:                for(s = buf; *s; s++)
                   2928:                        PUT(*s);
                   2929:                return 0;
                   2930:                }
                   2931: #endif
                   2932:        se = buf + d + 3;
                   2933:        if (scale != 1 && dd)
                   2934:                sprintf(se, "%+.2d", atoi(se) + 1 - scale);
                   2935:        s = ++se;
                   2936:        if (e < 2) {
                   2937:                if (*s != '0')
                   2938:                        goto nogood;
                   2939:                }
                   2940: #ifndef VAX
                   2941:        /* accommodate 3 significant digits in exponent */
                   2942:        if (s[2]) {
                   2943: #ifdef Pedantic
                   2944:                if (!e0 && !s[3])
                   2945:                        for(s -= 2, e1 = 2; s[0] = s[1]; s++);
                   2946:                        
                   2947:        /* Pedantic gives the behavior that Fortran 77 specifies,       */
                   2948:        /* i.e., requires that E be specified for exponent fields       */
                   2949:        /* of more than 3 digits.  With Pedantic undefined, we get      */
                   2950:        /* the behavior that Cray displays -- you get a bigger          */
                   2951:        /* exponent field if it fits.   */
                   2952: #else
                   2953:                if (!e0) {
                   2954:                        for(s -= 2, e1 = 2; s[0] = s[1]; s++)
                   2955: #ifdef CRAY
                   2956:                                delta--;
                   2957:                        if ((delta += 4) < 0)
                   2958:                                goto nogood
                   2959: #endif
                   2960:                                ;
                   2961:                        }
                   2962: #endif
                   2963:                else if (e0 >= 0)
                   2964:                        goto shift;
                   2965:                else
                   2966:                        e1 = e;
                   2967:                }
                   2968:        else
                   2969:  shift:        
                   2970: #endif
                   2971:                for(s += 2, e1 = 2; *s; ++e1, ++s)
                   2972:                        if (e1 >= e)
                   2973:                                goto nogood;
                   2974:        while(--delta >= 0)
                   2975:                PUT(' ');
                   2976:        if (signspace)
                   2977:                PUT(sign ? '-' : '+');
                   2978:        s = buf;
                   2979:        i = scale;
                   2980:        if (scale <= 0) {
                   2981:                PUT('.');
                   2982:                for(; i < 0; ++i)
                   2983:                        PUT('0');
                   2984:                PUT(*s);
                   2985:                s += 2;
                   2986:                }
                   2987:        else if (scale > 1) {
                   2988:                PUT(*s);
                   2989:                s += 2;
                   2990:                while(--i > 0)
                   2991:                        PUT(*s++);
                   2992:                PUT('.');
                   2993:                }
                   2994:        if (d1) {
                   2995:                se -= 2;
                   2996:                while(s < se) PUT(*s++);
                   2997:                se += 2;
                   2998:                do PUT('0'); while(--d1 > 0);
                   2999:                }
                   3000:        while(s < se)
                   3001:                PUT(*s++);
                   3002:        if (e < 2)
                   3003:                PUT(s[1]);
                   3004:        else {
                   3005:                while(++e1 <= e)
                   3006:                        PUT('0');
                   3007:                while(*s)
                   3008:                        PUT(*s++);
                   3009:                }
                   3010:        return 0;
                   3011:        }
                   3012: 
                   3013: wrt_F(p,w,d,len) ufloat *p; ftnlen len;
                   3014: {
                   3015:        int d1, sign, n;
                   3016:        double x;
                   3017:        char *b, buf[MAXINTDIGS+MAXFRACDIGS+4], *s;
                   3018: 
                   3019:        x= (len==sizeof(real)?p->pf:p->pd);
                   3020:        if (d < MAXFRACDIGS)
                   3021:                d1 = 0;
                   3022:        else {
                   3023:                d1 = d - MAXFRACDIGS;
                   3024:                d = MAXFRACDIGS;
                   3025:                }
                   3026:        if (x < 0.)
                   3027:                { x = -x; sign = 1; }
                   3028:        else {
                   3029:                sign = 0;
                   3030: #ifndef VAX
                   3031:                if (!x)
                   3032:                        x = 0.;
                   3033: #endif
                   3034:                }
                   3035: 
                   3036:        if (n = scale)
                   3037:                if (n > 0)
                   3038:                        do x *= 10.; while(--n > 0);
                   3039:                else
                   3040:                        do x *= 0.1; while(++n < 0);
                   3041: 
                   3042: #ifdef USE_STRLEN
                   3043:        sprintf(b = buf, "%#.*f", d, x);
                   3044:        n = strlen(b) + d1;
                   3045: #else
                   3046:        n = sprintf(b = buf, "%#.*f", d, x) + d1;
                   3047: #endif
                   3048:        
                   3049:        if (buf[0] == '0' && d)
                   3050:                { ++b; --n; }
                   3051:        if (sign) {
                   3052:                /* check for all zeros */
                   3053:                for(s = b;;) {
                   3054:                        while(*s == '0') s++;
                   3055:                        switch(*s) {
                   3056:                                case '.':
                   3057:                                        s++; continue;
                   3058:                                case 0:
                   3059:                                        sign = 0;
                   3060:                                }
                   3061:                        break;
                   3062:                        }
                   3063:                }
                   3064:        if (sign || cplus)
                   3065:                ++n;
                   3066:        if (n > w) {
                   3067:                while(--w >= 0)
                   3068:                        PUT('*');
                   3069:                return 0;
                   3070:                }
                   3071:        for(w -= n; --w >= 0; )
                   3072:                PUT(' ');
                   3073:        if (sign)
                   3074:                PUT('-');
                   3075:        else if (cplus)
                   3076:                PUT('+');
                   3077:        while(n = *b++)
                   3078:                PUT(n);
                   3079:        while(--d1 >= 0)
                   3080:                PUT('0');
                   3081:        return 0;
                   3082:        }
                   3083: ./ ADD NAME=libI77/wrtfmt.c TIME=629040813
                   3084: #include "f2c.h"
                   3085: #include "fio.h"
                   3086: #include "fmt.h"
                   3087: extern int cursor;
                   3088: extern char *icvt(), *ecvt();
                   3089: int hiwater;
                   3090: icilist *svic;
                   3091: char *icptr;
                   3092: mv_cur()       /* shouldn't use fseek because it insists on calling fflush */
                   3093:                /* instead we know too much about stdio */
                   3094: {
                   3095:        if(external == 0) {
                   3096:                if(cursor < 0) {
                   3097:                        if(hiwater < recpos)
                   3098:                                hiwater = recpos;
                   3099:                        recpos += cursor;
                   3100:                        icptr += cursor;
                   3101:                        cursor = 0;
                   3102:                        if(recpos < 0)
                   3103:                                err(elist->cierr, 110, "left off");
                   3104:                }
                   3105:                else if(cursor > 0) {
                   3106:                        if(recpos + cursor >= svic->icirlen)
                   3107:                                err(elist->cierr, 110, "recend");
                   3108:                        if(hiwater <= recpos)
                   3109:                                for(; cursor > 0; cursor--)
                   3110:                                        (*putn)(' ');
                   3111:                        else if(hiwater <= recpos + cursor) {
                   3112:                                cursor -= hiwater - recpos;
                   3113:                                icptr += hiwater - recpos;
                   3114:                                recpos = hiwater;
                   3115:                                for(; cursor > 0; cursor--)
                   3116:                                        (*putn)(' ');
                   3117:                        }
                   3118:                        else {
                   3119:                                icptr += cursor;
                   3120:                                recpos += cursor;
                   3121:                        }
                   3122:                        cursor = 0;
                   3123:                }
                   3124:                return(0);
                   3125:        }
                   3126:        if(cursor > 0) {
                   3127:                if(hiwater <= recpos)
                   3128:                        for(;cursor>0;cursor--) (*putn)(' ');
                   3129:                else if(hiwater <= recpos + cursor) {
                   3130: #ifndef NON_UNIX_STDIO
                   3131:                        if(cf->_ptr + hiwater - recpos < buf_end(cf))
                   3132:                                cf->_ptr += hiwater - recpos;
                   3133:                        else
                   3134: #endif
                   3135:                                (void) fseek(cf, (long) (hiwater - recpos), 1);
                   3136:                        cursor -= hiwater - recpos;
                   3137:                        recpos = hiwater;
                   3138:                        for(; cursor > 0; cursor--)
                   3139:                                (*putn)(' ');
                   3140:                }
                   3141:                else {
                   3142: #ifndef NON_UNIX_STDIO
                   3143:                        if(cf->_ptr + cursor < buf_end(cf))
                   3144:                                cf->_ptr += cursor;
                   3145:                        else
                   3146: #endif
                   3147:                                (void) fseek(cf, (long)cursor, 1);
                   3148:                        recpos += cursor;
                   3149:                }
                   3150:        }
                   3151:        if(cursor<0)
                   3152:        {
                   3153:                if(cursor+recpos<0) err(elist->cierr,110,"left off");
                   3154: #ifndef NON_UNIX_STDIO
                   3155:                if(cf->_ptr + cursor >= cf->_base)
                   3156:                        cf->_ptr += cursor;
                   3157:                else
                   3158: #endif
                   3159:                     if(curunit->useek) (void) fseek(cf,(long)cursor,1);
                   3160:                else err(elist->cierr,106,"fmt");
                   3161:                if(hiwater < recpos)
                   3162:                        hiwater = recpos;
                   3163:                recpos += cursor;
                   3164:                cursor=0;
                   3165:        }
                   3166:        return(0);
                   3167: }
                   3168: w_ed(p,ptr,len) char *ptr; struct syl *p; ftnlen len;
                   3169: {
                   3170:        if(cursor && mv_cur()) return(mv_cur());
                   3171:        switch(p->op)
                   3172:        {
                   3173:        default:
                   3174:                fprintf(stderr,"w_ed, unexpected code: %d\n%s\n",
                   3175:                        p->op,fmtbuf);
                   3176:                abort();
                   3177:        case I: return(wrt_I((uint *)ptr,p->p1,len, 10));
                   3178:        case IM:
                   3179:                return(wrt_IM((uint *)ptr,p->p1,p->p2,len));
                   3180:        case O: return(wrt_I((uint *)ptr, p->p1, len, 8));
                   3181:        case L: return(wrt_L((uint *)ptr,p->p1, len));
                   3182:        case A: return(wrt_A(ptr,len));
                   3183:        case AW:
                   3184:                return(wrt_AW(ptr,p->p1,len));
                   3185:        case D:
                   3186:        case E:
                   3187:        case EE:
                   3188:                return(wrt_E((ufloat *)ptr,p->p1,p->p2,p->p3,len));
                   3189:        case G:
                   3190:        case GE:
                   3191:                return(wrt_G((ufloat *)ptr,p->p1,p->p2,p->p3,len));
                   3192:        case F: return(wrt_F((ufloat *)ptr,p->p1,p->p2,len));
                   3193:        }
                   3194: }
                   3195: w_ned(p) struct syl *p;
                   3196: {
                   3197:        switch(p->op)
                   3198:        {
                   3199:        default: fprintf(stderr,"w_ned, unexpected code: %d\n%s\n",
                   3200:                        p->op,fmtbuf);
                   3201:                abort();
                   3202:        case SLASH:
                   3203:                return((*donewrec)());
                   3204:        case T: cursor = p->p1-recpos - 1;
                   3205:                return(1);
                   3206:        case TL: cursor -= p->p1;
                   3207:                if(cursor < -recpos)    /* TL1000, 1X */
                   3208:                        cursor = -recpos;
                   3209:                return(1);
                   3210:        case TR:
                   3211:        case X:
                   3212:                cursor += p->p1;
                   3213:                return(1);
                   3214:        case APOS:
                   3215:                return(wrt_AP(*(char **)&p->p2));
                   3216:        case H:
                   3217:                return(wrt_H(p->p1,*(char **)&p->p2));
                   3218:        }
                   3219: }
                   3220: wrt_I(n,w,len, base) uint *n; ftnlen len; register int base;
                   3221: {      int ndigit,sign,spare,i;
                   3222:        long x;
                   3223:        char *ans;
                   3224:        if(len==sizeof(integer)) x=n->il;
                   3225:        else if(len == sizeof(char)) x = n->ic;
                   3226:        else x=n->is;
                   3227:        ans=icvt(x,&ndigit,&sign, base);
                   3228:        spare=w-ndigit;
                   3229:        if(sign || cplus) spare--;
                   3230:        if(spare<0)
                   3231:                for(i=0;i<w;i++) (*putn)('*');
                   3232:        else
                   3233:        {       for(i=0;i<spare;i++) (*putn)(' ');
                   3234:                if(sign) (*putn)('-');
                   3235:                else if(cplus) (*putn)('+');
                   3236:                for(i=0;i<ndigit;i++) (*putn)(*ans++);
                   3237:        }
                   3238:        return(0);
                   3239: }
                   3240: wrt_IM(n,w,m,len) uint *n; ftnlen len;
                   3241: {      int ndigit,sign,spare,i,xsign;
                   3242:        long x;
                   3243:        char *ans;
                   3244:        if(sizeof(integer)==len) x=n->il;
                   3245:        else if(len == sizeof(char)) x = n->ic;
                   3246:        else x=n->is;
                   3247:        ans=icvt(x,&ndigit,&sign, 10);
                   3248:        if(sign || cplus) xsign=1;
                   3249:        else xsign=0;
                   3250:        if(ndigit+xsign>w || m+xsign>w)
                   3251:        {       for(i=0;i<w;i++) (*putn)('*');
                   3252:                return(0);
                   3253:        }
                   3254:        if(x==0 && m==0)
                   3255:        {       for(i=0;i<w;i++) (*putn)(' ');
                   3256:                return(0);
                   3257:        }
                   3258:        if(ndigit>=m)
                   3259:                spare=w-ndigit-xsign;
                   3260:        else
                   3261:                spare=w-m-xsign;
                   3262:        for(i=0;i<spare;i++) (*putn)(' ');
                   3263:        if(sign) (*putn)('-');
                   3264:        else if(cplus) (*putn)('+');
                   3265:        for(i=0;i<m-ndigit;i++) (*putn)('0');
                   3266:        for(i=0;i<ndigit;i++) (*putn)(*ans++);
                   3267:        return(0);
                   3268: }
                   3269: wrt_AP(s)
                   3270:  char *s;
                   3271: {      char quote;
                   3272:        if(cursor && mv_cur()) return(mv_cur());
                   3273:        quote = *s++;
                   3274:        for(;*s;s++)
                   3275:        {       if(*s!=quote) (*putn)(*s);
                   3276:                else if(*++s==quote) (*putn)(*s);
                   3277:                else return(1);
                   3278:        }
                   3279:        return(1);
                   3280: }
                   3281: wrt_H(a,s)
                   3282:  char *s;
                   3283: {
                   3284:        if(cursor && mv_cur()) return(mv_cur());
                   3285:        while(a--) (*putn)(*s++);
                   3286:        return(1);
                   3287: }
                   3288: wrt_L(n,len, sz) uint *n; ftnlen sz;
                   3289: {      int i;
                   3290:        long x;
                   3291:        if(sizeof(integer)==sz) x=n->il;
                   3292:        else if(sz == sizeof(char)) x = n->ic;
                   3293:        else x=n->is;
                   3294:        for(i=0;i<len-1;i++)
                   3295:                (*putn)(' ');
                   3296:        if(x) (*putn)('T');
                   3297:        else (*putn)('F');
                   3298:        return(0);
                   3299: }
                   3300: wrt_A(p,len) char *p; ftnlen len;
                   3301: {
                   3302:        while(len-- > 0) (*putn)(*p++);
                   3303:        return(0);
                   3304: }
                   3305: wrt_AW(p,w,len) char * p; ftnlen len;
                   3306: {
                   3307:        while(w>len)
                   3308:        {       w--;
                   3309:                (*putn)(' ');
                   3310:        }
                   3311:        while(w-- > 0)
                   3312:                (*putn)(*p++);
                   3313:        return(0);
                   3314: }
                   3315: 
                   3316: wrt_G(p,w,d,e,len) ufloat *p; ftnlen len;
                   3317: {      double up = 1,x;
                   3318:        int i,oldscale=scale,n,j;
                   3319:        x= len==sizeof(real)?p->pf:p->pd;
                   3320:        if(x < 0 ) x = -x;
                   3321:        if(x<.1) return(wrt_E(p,w,d,e,len));
                   3322:        for(i=0;i<=d;i++,up*=10)
                   3323:        {       if(x>=up) continue;
                   3324:                scale=0;
                   3325:                if(e==0) n=4;
                   3326:                else    n=e+2;
                   3327:                i=wrt_F(p,w-n,d-i,len);
                   3328:                for(j=0;j<n;j++) (*putn)(' ');
                   3329:                scale=oldscale;
                   3330:                return(i);
                   3331:        }
                   3332:        return(wrt_E(p,w,d,e,len));
                   3333: }
                   3334: ./ ADD NAME=libI77/wsfe.c TIME=628440564
                   3335: /*write sequential formatted external*/
                   3336: #include "f2c.h"
                   3337: #include "fio.h"
                   3338: #include "fmt.h"
                   3339: extern int x_putc(),w_ed(),w_ned();
                   3340: extern int xw_end(),xw_rev(),x_wSL();
                   3341: extern int hiwater;
                   3342: integer s_wsfe(a) cilist *a;   /*start*/
                   3343: {      int n;
                   3344:        if(!init) f_init();
                   3345:        if(n=c_sfe(a)) return(n);
                   3346:        reading=0;
                   3347:        sequential=1;
                   3348:        formatted=1;
                   3349:        external=1;
                   3350:        elist=a;
                   3351:        hiwater = cursor=recpos=0;
                   3352:        nonl = 0;
                   3353:        scale=0;
                   3354:        fmtbuf=a->cifmt;
                   3355:        curunit = &units[a->ciunit];
                   3356:        cf=curunit->ufd;
                   3357:        if(pars_f(fmtbuf)<0) err(a->cierr,100,"startio");
                   3358:        putn= x_putc;
                   3359:        doed= w_ed;
                   3360:        doned= w_ned;
                   3361:        doend=xw_end;
                   3362:        dorevert=xw_rev;
                   3363:        donewrec=x_wSL;
                   3364:        fmt_bg();
                   3365:        cplus=0;
                   3366:        cblank=curunit->ublnk;
                   3367:        if(curunit->uwrt != 1 && nowwriting(curunit))
                   3368:                err(a->cierr,errno,"write start");
                   3369:        return(0);
                   3370: }
                   3371: x_putc(c)
                   3372: {
                   3373:        /* this uses \n as an indicator of record-end */
                   3374:        if(c == '\n' && recpos < hiwater) {     /* fseek calls fflush, a loss */
                   3375: #ifndef NON_UNIX_STDIO
                   3376:                if(cf->_ptr + hiwater - recpos < buf_end(cf))
                   3377:                        cf->_ptr += hiwater - recpos;
                   3378:                else
                   3379: #endif
                   3380:                        (void) fseek(cf, (long)(hiwater - recpos), 1);
                   3381:        }
                   3382:        putc(c,cf);
                   3383:        recpos++;
                   3384: }
                   3385: pr_put(c)
                   3386: {      static flag new = 1;
                   3387:        recpos++;
                   3388:        if(c=='\n')
                   3389:        {       new=1;
                   3390:                putc(c,cf);
                   3391:        }
                   3392:        else if(new==1)
                   3393:        {       new=0;
                   3394:                if(c=='0') putc('\n',cf);
                   3395:                else if(c=='1') putc('\f',cf);
                   3396:        }
                   3397:        else putc(c,cf);
                   3398: }
                   3399: x_wSL()
                   3400: {
                   3401:        (*putn)('\n');
                   3402:        recpos=0;
                   3403:        cursor = 0;
                   3404:        hiwater = 0;
                   3405:        return(1);
                   3406: }
                   3407: xw_end()
                   3408: {
                   3409:        if(nonl == 0)
                   3410:                (*putn)('\n');
                   3411:        hiwater = recpos = cursor = 0;
                   3412:        return(0);
                   3413: }
                   3414: xw_rev()
                   3415: {
                   3416:        if(workdone) (*putn)('\n');
                   3417:        hiwater = recpos = cursor = 0;
                   3418:        return(workdone=0);
                   3419: }
                   3420: ./ ADD NAME=libI77/namelist.c TIME=628989101
                   3421: #include "f2c.h"
                   3422: #include "fio.h"
                   3423: 
                   3424: s_rsne(a)
                   3425:  cilist *a;
                   3426: {
                   3427:        int n;
                   3428:        if(!init)
                   3429:                f_init();
                   3430:        if(n=c_le(a))
                   3431:                return(n);
                   3432:        reading=1;
                   3433:        external=1;
                   3434:        formatted=1;
                   3435: 
                   3436:        err(a->cierr, 118, "namelist read -- not yet implemented");
                   3437:        }
                   3438: 
                   3439: s_wsne(a)
                   3440:  cilist *a;
                   3441: {
                   3442:        int n;
                   3443:        if(!init)
                   3444:                f_init();
                   3445:        if(n=c_le(a))
                   3446:                return(n);
                   3447:        reading=0;
                   3448:        external=1;
                   3449:        formatted=1;
                   3450: 
                   3451:        err(a->cierr, 118, "namelist write -- not yet implemented");
                   3452:        }
                   3453: ./ ENDUP

unix.superglobalmegacorp.com

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