Annotation of researchv10no/cmd/basic/bas/io.c, revision 1.1.1.1

1.1       root        1: #include <stdio.h>
                      2: #include "ctype.h"
                      3: #include "typedef.h"
                      4: #include "basic.h"
                      5: #include "tokens.h"
                      6: 
                      7: #define MAXUNIT        5
                      8: #define MAXSTR         255
                      9: #define MAXBUF         7
                     10: #define INUNIT         0
                     11: #define OUTUNIT        1
                     12: 
                     13: static struct iotab {
                     14:        int     io_flag;        /* if currently open etc. */
                     15:        int     io_col;         /* current column */
                     16:        FILE    *io_ptr;        /* input/output stdio table entry */
                     17:        } units[MAXUNIT];
                     18: 
                     19: static char    buffers[MAXBUF][BUFSIZ];
                     20: static char    bufflg[MAXBUF];
                     21: static char    pflgs[_NFILE];
                     22: 
                     23: char   askdelims[] = { COMMA, ';', 0 };
                     24: 
                     25: char   *getsvar(), *strpop();
                     26: FILE   *xopen(), *fopen(), *popen();
                     27: double popfloat();
                     28: struct iotab   *getunit();
                     29: 
                     30: 
                     31: /*
                     32:  * xopen --- open a file or a pipe; assign a buffer
                     33:  */
                     34: 
                     35: FILE *xopen(file, how)
                     36: char   *file, *how;
                     37: {
                     38:        register FILE   *f;
                     39: 
                     40:        if (*file == '!') {     /* open a pipe */
                     41:                if (f = popen(&file[1], how))
                     42:                        pflgs[fileno(f)]++;
                     43:                }
                     44:        else
                     45:                f = fopen(file, how);
                     46:        if (f != (FILE *)NULL)
                     47:                assbuf(f);
                     48:        return(f);
                     49: }
                     50: 
                     51: 
                     52: /*
                     53:  * xclose --- close a file previously opened by xopen
                     54:  */
                     55: 
                     56: xclose(file)
                     57: register FILE  *file;
                     58: {
                     59:        register char   *b = file->_base;
                     60:        register int    i;
                     61: 
                     62:        i = fileno(file);
                     63:        if (pflgs[i])
                     64:                pclose(file);
                     65:        else
                     66:                fclose(file);
                     67:        pflgs[i] = 0;
                     68:        for (i = 0; i < MAXBUF; ++i)
                     69:                if (b == buffers[i])
                     70:                        bufflg[i] = 0;
                     71: }
                     72: 
                     73: 
                     74: /*
                     75:  * assbuf --- assign a buffer to a newly opened file
                     76:  */
                     77: 
                     78: assbuf(f)
                     79: register FILE  *f;
                     80: {
                     81:        register int    i;
                     82: 
                     83:        for (i = 0; i < MAXBUF; ++i)
                     84:                if (bufflg[i] == 0) {
                     85:                        setbuf(f, buffers[i]);
                     86:                        ++bufflg[i];
                     87:                        return;
                     88:                        }
                     89:        err("no buffers available");
                     90: }
                     91: 
                     92: 
                     93: /*
                     94:  * initio --- initialize i/o related structures
                     95:  */
                     96: 
                     97: initio()
                     98: {
                     99: 
                    100:        assbuf(stdin);
                    101:        clrio();
                    102: }
                    103: 
                    104: 
                    105: /*
                    106:  * clrio --- reinitialize i/o related structures
                    107:  */
                    108: 
                    109: clrio()
                    110: {
                    111:        register struct iotab   *i;
                    112: 
                    113:        for (i = units; i < &units[MAXUNIT]; ++i)
                    114:                if (i->io_flag)
                    115:                        iocls(i);
                    116: 
                    117:        units[INUNIT].io_flag = INPUT;
                    118:        units[INUNIT].io_ptr = stdin;
                    119:        units[INUNIT].io_col = 1;
                    120:        units[OUTUNIT].io_flag = OUTPUT;
                    121:        units[OUTUNIT].io_ptr = stdout;
                    122:        units[OUTUNIT].io_col = 1;
                    123: }
                    124: 
                    125: iocls(i)
                    126: register struct iotab  *i;
                    127: {
                    128:        if (i->io_flag) {
                    129:                if (i->io_ptr != stdin && i->io_ptr != stdout)
                    130:                        xclose(i->io_ptr);
                    131:                i->io_flag = 0;
                    132:                i->io_ptr = (FILE *)NULL;
                    133:                i->io_col = 1;
                    134:                }
                    135: }
                    136: 
                    137: 
                    138: /*
                    139:  * getunit --- get and check unit number for OPEN statement
                    140:  */
                    141: 
                    142: struct iotab *getunit(flag, defunit)
                    143: {
                    144:        register int            n;
                    145:        register struct iotab   *i;
                    146: 
                    147:        if (*inptr != SHARP)
                    148:                n = defunit;
                    149:        else {
                    150:                ++inptr;
                    151:                n = fexpr();
                    152:                if (!endtest()) {
                    153:                        while (*inptr == ' ' || *inptr == TAB)
                    154:                                ++inptr;
                    155:                        if (*inptr != THEN)
                    156:                                expectc(COMMA);
                    157:                        }
                    158:                }
                    159:        if (n < 0 || n >= MAXUNIT)
                    160:                err("invalid unit %d", n);
                    161:        i = &units[n];
                    162:        if (flag && flag != i->io_flag)
                    163:                err("unit not opened for %s",
                    164:                        ((flag == INPUT)? "input" : "output"));
                    165:        return(i);
                    166: }
                    167: 
                    168: 
                    169: /*
                    170:  * openstmt --- interpret an OPEN statement
                    171:  */
                    172: 
                    173: openstmt()
                    174: {
                    175:        register struct iotab   *i;
                    176:        int                     len, how;
                    177:        char                    *str, *code, *file;
                    178: 
                    179:        expr();
                    180:        file = strpop();
                    181:        expectc(FOR);
                    182:        how = *inptr;
                    183:        switch (how) {
                    184:        case INPUT:
                    185:                code = "r";
                    186:                break;
                    187:        case OUTPUT:
                    188:                code = "w";
                    189:                break;
                    190:        case APPEND:
                    191:                code = "a";
                    192:                how = OUTPUT;           /* same as OUTPUT mostly */
                    193:                break;
                    194:        default:
                    195:                badsyn();
                    196:                }
                    197:        ++inptr;
                    198:        i = getunit(0, ((how == INPUT)? INUNIT : OUTUNIT));
                    199:        i->io_ptr = xopen(file, code);
                    200:        if (i->io_ptr == (FILE *)NULL)
                    201:                err("cannot open %s", file);
                    202:        i->io_flag = how;
                    203:        i->io_col = 1;
                    204: }
                    205: 
                    206: 
                    207: /*
                    208:  * prtusing --- interpret a PRINT USING statement 
                    209:  */
                    210: 
                    211: prtusing(fmtptr)
                    212: char   *fmtptr;
                    213: {
                    214: 
                    215:        register struct iotab   *i;
                    216: 
                    217: 
                    218:        /*      linefeed and carriage return and
                    219:         *      set column count to 1
                    220:         */
                    221: 
                    222:        while (*inptr == ' ' || *inptr == COMMA || *inptr == TAB)
                    223:                inptr++;        /* skip spaces & first comma or tab */
                    224: 
                    225:        i = getunit(OUTPUT, OUTUNIT);
                    226:        col = i->io_col;
                    227:        if (col > 1) {
                    228:                i->io_col = 1;
                    229:                }
                    230: 
                    231:        getformat(fmtptr, i->io_ptr);
                    232: }
                    233: 
                    234: /*
                    235:  *     getformat - get format field and variable for print-using
                    236:  */
                    237: 
                    238: getformat(fmtptr, file)
                    239: char   *fmtptr;
                    240: FILE   *file;
                    241: {
                    242: 
                    243:        register Stkptr s;
                    244:        register int    l;
                    245:        int             flag;
                    246:        double          f;
                    247:        char            *p, *fp, *tmp, *doformat(), *doformat(), *donumeric();
                    248: 
                    249:        fp = fmtptr;
                    250:        while (!endtest()) {
                    251:                while (*inptr == ' ' || *inptr == COMMA || *inptr == TAB)
                    252:                        inptr++;        /* skip spaces & first comma or tab */
                    253:                expr();
                    254:                s = (Stkptr)stkptr;
                    255:                switch(s->k_type) {
                    256:                case    FLOATEXPR:
                    257:                        f = popfloat();
                    258:                        fp = donumeric(fp, f, file);
                    259:                        break;
                    260:                case    STRINGEXPR:
                    261:                        pop(ANYTYPE);
                    262:                        fp = doformat(fp, s->k_un.k_str.s_ptr,
                    263:                                s->k_un.k_str.s_len, file);
                    264:                        break;
                    265:                default:
                    266:                        badtype();
                    267:                        break;
                    268:                        }
                    269:                switch(*inptr) {
                    270:                case    ' ':
                    271:                case    ';':
                    272:                case    COMMA:
                    273:                        ++inptr;
                    274:                        break;
                    275:                case    '\0':
                    276:                case    '\n':
                    277:                case    ELSE:
                    278:                case    COLON:
                    279:                        break;
                    280:                default:
                    281:                        badsyn();
                    282:                        break;
                    283:                }
                    284:                }
                    285:        while (*fp > 0) {
                    286:                switch (*fp) {
                    287:                case '\'':      /* found a ' */
                    288:                        fp++;
                    289:                        switch (*fp) {
                    290:                        case 'l':
                    291:                        case 'L':
                    292:                        case 'r':
                    293:                        case 'R':
                    294:                        case 'c':
                    295:                        case 'C':
                    296:                                fprintf(file, " ");
                    297:                                for(tmp = fp+1;*fp && (*tmp == *fp); fp++,tmp++)
                    298:                                        fprintf(file, " ");
                    299:                                fprintf(file, " ");
                    300:                                fp++;
                    301:                                break;
                    302:                        default:
                    303:                                fprintf(file, "'");
                    304:                                break;
                    305:                        }
                    306:                        break;
                    307:                case '#':
                    308:                        fprintf(file, " ");
                    309:                        fp++;
                    310:                        break;
                    311:                default:
                    312:                        putc(*fp++, file);
                    313:                        break;
                    314:                }
                    315:                }
                    316:        if (*(inptr - 1) != ';')
                    317:                putc('\n', file);
                    318:        if (file == stdout)
                    319:                fflush(file);
                    320: 
                    321: }
                    322: 
                    323: /*
                    324:  * donumeric -- print numeric variable in print-using format
                    325:  */
                    326: 
                    327: char   *donumeric(fmtptr, num, file)
                    328: char   *fmtptr;
                    329: double num;
                    330: FILE   *file;
                    331: 
                    332: {
                    333:        register        int     k,c,d,l;
                    334:        register        char    *fp;
                    335:                        int     negativeflag, dollarflag, periodflag;
                    336:                        int     intsize, decsize;
                    337:                        long    intpart, decpart;
                    338:                        double  f;
                    339: 
                    340: 
                    341:        /* the next line is for testing 
                    342:        printf("beginning donumeric routine");*/
                    343: 
                    344:        fp = fmtptr;
                    345:        c = 0;
                    346:        d = 0;
                    347:        f = num;
                    348: 
                    349:        if (f > 999999999)
                    350:                err("number too large ( > 999,999,999)");
                    351:                /*      check to see is number is too large to handle  */
                    352: 
                    353:        if (f < 0) {
                    354:                negativeflag = YES;
                    355:                f = -f;
                    356:                }
                    357:        else
                    358:                negativeflag = NO;
                    359: 
                    360:        dollarflag = NO;        /* dollar in format field       */
                    361:        periodflag = NO;        /* period in format field       */
                    362:        intsize = 1;            /* 1 more than max integer part */
                    363:        decsize = 1;            /* 1 more than max decimal part */
                    364: 
                    365:        /* if character in the format line is not a $ or #, print it. 
                    366:         Or, if it is a $ or a . but is not followed by a #, print it. */
                    367: 
                    368:        while ((*fp > 0) && ((*fp != '$' && *fp != '#' && *fp != '.') ||  
                    369:                        (*fp == '$' && *(fp + 1) != '#') ||
                    370:                        (*fp == '.' && *(fp + 1) != '#')))
                    371:                fprintf(file, "%.1s", fp++);
                    372: 
                    373: 
                    374: 
                    375: 
                    376:        /* at this point we have either a # or 
                    377:                        a $ followed by a #             */
                    378: 
                    379: 
                    380:        if (*fp == '$') {
                    381:                dollarflag = YES;
                    382:                fp++;
                    383:                }
                    384: 
                    385:        while (*fp == '#') {
                    386:                c++;
                    387:                intsize = intsize * 10;
                    388:                fp++;
                    389:                }
                    390: 
                    391:        if (*fp == '.') {
                    392:                periodflag = YES;
                    393:                fp++;
                    394:                while (*fp == '#') {
                    395:                        d++;
                    396:                        decsize = decsize * 10;
                    397:                        fp++;
                    398:                        }
                    399:                }
                    400: 
                    401: 
                    402:        /* round-off number before checking for size    */
                    403: 
                    404:        f = f + (5 / (10 * (float)decsize));
                    405: 
                    406:        intpart = f;            /* integer part of passed float */
                    407: 
                    408:        /* check for number too large for field
                    409:        if so, print *-filled format field      */
                    410: 
                    411:        if (negativeflag == YES)
                    412:                intsize = intsize/10;   /* leave room for negative sign */
                    413: 
                    414:        if (intpart > (intsize -1)) {
                    415:                if (dollarflag == YES)
                    416:                        fprintf(file, "$");
                    417:                for (; c; c--)
                    418:                        fprintf(file, "*");
                    419:                if (periodflag == YES)
                    420:                        fprintf(file, ".");
                    421:                for (; d; d--)
                    422:                        fprintf(file, "*");
                    423:                return(fp);
                    424:                }
                    425: 
                    426: 
                    427:        /* number fits in field, begin print    */
                    428: 
                    429:        /* the following line is for testing only
                    430:        printf("beginning print %d %d", intsize, c);
                    431:        used to enclode previous line in a comment when not used */
                    432: 
                    433:        /* if number is zero, divide intsize by 10 to allow room
                    434:                for the printing of the zero    */
                    435: 
                    436:        if (intpart == 0)
                    437:                intsize = intsize/10;
                    438: 
                    439:        for (; intsize > ( 1 + intpart * 10); intsize = intsize / 10)
                    440:                fprintf(file, " ");
                    441: 
                    442:        if (negativeflag == YES)
                    443:                fprintf(file, "-");
                    444: 
                    445:        if (dollarflag == YES)
                    446:                fprintf(file, "$");
                    447: 
                    448:        if (intsize >= .01)
                    449:                fprintf(file, "%u", intpart);
                    450: 
                    451:        if (periodflag == YES)
                    452:                fprintf(file, ".");
                    453: 
                    454: 
                    455:        if (decsize > 1) {   /* if decsize is 1, no decimal part of # field  */
                    456: 
                    457:                decpart = (f - intpart) * decsize;
                    458:                if (decpart == 0)
                    459:                        while (d--)
                    460:                                fprintf(file, "0");
                    461:                else {
                    462:                        while (decpart < (decsize / 10)){
                    463:                                fprintf(file, "0");
                    464:                                decsize = decsize / 10;
                    465:                                }
                    466:                        fprintf(file, "%u", decpart);
                    467:                        }
                    468:                }
                    469: 
                    470: 
                    471:        return(fp);
                    472: 
                    473: }
                    474: 
                    475: /*
                    476:  *     doformat - determine format and print string
                    477:  */
                    478: 
                    479: char   *doformat(fmtptr, ptr, len, file)
                    480: char   *fmtptr;
                    481: char   *ptr;
                    482: int    len;
                    483: FILE   *file;
                    484:        {
                    485:        register int    k, c, d, l;
                    486:        register char   *p;
                    487:        register char   *fp, *tmp;
                    488: 
                    489:        p = ptr;
                    490:        fp = fmtptr;
                    491:        l = len;
                    492:        c = 1;
                    493:        while (*fp > 0) {
                    494:                if (*fp != '\'') {
                    495:                        fprintf(file, "%.1s", fp++);
                    496:                        continue;
                    497:                        }
                    498:                fp++;
                    499:                switch (*fp) {
                    500:                case 'l':
                    501:                case 'L':
                    502:                        tmp = fp + 1;
                    503:                        while (*fp == *tmp) {
                    504:                                c++;
                    505:                                fp++;
                    506:                                tmp++;
                    507:                                }
                    508:                        c = c + 1;  /* count the last l or L */
                    509:                        fp++;           /* move past last l or L */
                    510:                        while (c-- > 0 && l-- > 0)
                    511:                                fprintf(file, "%.1s", p++);
                    512:                        while (c-- >= 0)
                    513:                                fprintf(file, " ");
                    514:                        return (fp);
                    515:                        break;
                    516:                case 'r':
                    517:                case 'R':
                    518:                        tmp = fp + 1;
                    519:                        while (*fp == *tmp) {
                    520:                                c++;
                    521:                                fp++;
                    522:                                tmp++;
                    523:                                }
                    524:                        c = c + 1;  /* count the last r or R */
                    525:                        fp++;           /* move past last r or R */
                    526:                        if (l >= c) {
                    527:                                p = p + (l - c);
                    528:                                while (c-- > 0)
                    529:                                        fprintf(file, "%.1s", p++);
                    530:                                }
                    531:                        else {
                    532:                                for (d = c - l; d > 0; d--)
                    533:                                        fprintf(file, " ");
                    534:                                while (l-- > 0)
                    535:                                        fprintf(file, "%.1s", p++);
                    536:                                }
                    537:                        return (fp);
                    538:                        break;
                    539:                case 'c':
                    540:                case 'C':
                    541:                        tmp = fp + 1;
                    542:                        while (*fp == *tmp) {
                    543:                                c++;
                    544:                                fp++;
                    545:                                tmp++;
                    546:                                }
                    547:                        c = c + 1;  /* count the last c or C */
                    548:                        fp++;           /* move past last c or C */
                    549:                        if (l < c) {
                    550:                                d = (c - l)/2;
                    551:                                k = (c - l) - d;
                    552: 
                    553:        /* this next line is for testing 
                    554:                        printf( "d = %d c = %d k = %d l = %d, d, c, k, l);*/
                    555: 
                    556:                                while (d--)
                    557:                                        fprintf(file, " ");
                    558:                                while (l-- > 0)
                    559:                                        fprintf(file, "%.1s", p++);
                    560:                                while (k-- > 0)
                    561:                                        fprintf(file, " ");
                    562:                                }
                    563:                        else {
                    564:                                d = (l - c)/2;
                    565:                                p = p + d;
                    566:                                while (c-- > 0)
                    567:                                        fprintf(file, "%.1s", p++);
                    568:                                }
                    569:                        return(fp);
                    570:                        break;
                    571:                default:
                    572:                        fprintf(file, "'");
                    573:                        break;
                    574:  
                    575:                }
                    576:        }
                    577:        return(fp);
                    578: }
                    579: 
                    580: 
                    581: /*
                    582:  * prtstmt --- interpret a PRINT statement
                    583:  */
                    584: 
                    585: prtstmt()
                    586: {
                    587:        register struct iotab   *i;
                    588: 
                    589:        i = getunit(OUTPUT, OUTUNIT);
                    590:        col = i->io_col;
                    591:        print(i->io_ptr);
                    592:        i->io_col = col;
                    593: }
                    594: 
                    595: 
                    596: /*
                    597:  * clsstmt --- interpret a CLOSE statement
                    598:  */
                    599: 
                    600: clsstmt()
                    601: {
                    602:        register struct iotab   *i;
                    603: 
                    604:        i = getunit(0, 0);
                    605:        iocls(i);
                    606: }
                    607: 
                    608: 
                    609: /*
                    610:  * flsstmt --- interpret a FLUSH statement
                    611:  */
                    612: 
                    613: flsstmt()
                    614: {
                    615:        register struct iotab   *i;
                    616: 
                    617:        i = getunit(OUTPUT, OUTUNIT);
                    618:        if (i->io_flag == OUTPUT)
                    619:                fflush(i->io_ptr);
                    620: }
                    621: 
                    622: 
                    623: /*
                    624:  * print --- do the work for a PRINT statement
                    625:  */
                    626: 
                    627: print(file)
                    628: FILE   *file;
                    629: {
                    630:        register Stkptr s;
                    631:        register int    l;
                    632:        int             flag;
                    633:        float           f;
                    634: 
                    635:        flag = NO;
                    636:        while (!endtest()) {
                    637:                flag = NO;
                    638:                if (*inptr == TAB) {    /* tab(expr) */
                    639:                        ++inptr;
                    640:                        l = fexpr();
                    641:                        if (l < 0 || l > 80)
                    642:                                l = 1;
                    643:                        expectc(RPAR);
                    644:                        while (col < l - 8)
                    645:                                printstr("\t", 1, file);
                    646:                        if (col < l)
                    647:                                printstr("        ", l - col, file);
                    648:                        }
                    649:                else {
                    650:                        expr();
                    651:                        s = (Stkptr)stkptr;
                    652:                        switch (s->k_type) {
                    653:                        case FLOATEXPR:
                    654:                                printstr(fprint(popfloat()), MAXSTR, file);
                    655:                                break;
                    656:                        case STRINGEXPR:
                    657:                                pop(ANYTYPE);
                    658:                                printstr(s->k_un.k_str.s_ptr,
                    659:                                         s->k_un.k_str.s_len, file);
                    660:                                break;
                    661:                        default:
                    662:                                badtype();
                    663:                                }
                    664:                        }
                    665:                switch(*inptr) {
                    666:                case COMMA:
                    667:                        ++inptr;
                    668:                        printstr("\t", 1, file);
                    669:                        if ((col % 16) == 9)
                    670:                                printstr("\t", 1, file);
                    671:                        flag = YES;             /* suppress the NL */
                    672:                        break;
                    673:                case ';':
                    674:                        ++inptr;
                    675:                        flag = YES;
                    676:                        break;
                    677:                case '\0':
                    678:                case ELSE:
                    679:                case COLON:
                    680:                        break;
                    681:                default:
                    682:                        badsyn();
                    683:                        }
                    684:                }
                    685:        if (!flag)
                    686:                printstr("\n", 1, file);
                    687:        if (file == stdout)
                    688:                fflush(file);
                    689: }
                    690: 
                    691: 
                    692: /*
                    693:  * printstr --- print a string of specified length; update col
                    694:  */
                    695: 
                    696: printstr(ptr, len, file)
                    697: char   *ptr;
                    698: FILE   *file;
                    699: {
                    700:        register int    c, l;
                    701:        register char   *p;
                    702: 
                    703:        l = len;
                    704:        if ((p = ptr) == NULL && l)
                    705:                err("invalid string pointer");
                    706:        while (--l >= 0 && (c = *p++)) {
                    707:                switch (c) {
                    708:                case '\n':
                    709:                        col = 1;
                    710:                        break;
                    711:                case '\t':
                    712:                        col = ((col-1 + 8) & ~07) + 1;
                    713:                        break;
                    714:                default:
                    715:                        col++;
                    716:                        break;
                    717:                        }
                    718:                putc(c, file);
                    719:                }
                    720: }
                    721: 
                    722: 
                    723: /*
                    724:  * ask --- interpret an INPUT or ASK statement
                    725:  */
                    726: 
                    727: ask()
                    728: {
                    729:        register char   *v;
                    730:        char            *ptr;
                    731:        int             len, type;
                    732:        FILE            *f;
                    733: 
                    734:        f = getunit(INPUT, INUNIT)->io_ptr;
                    735:        askptr = askline;
                    736:        askline[0] = 0;
                    737:        while (!endtest()) {
                    738:                if (*inptr == QUOTE || *inptr == PRIME) {
                    739:                        strconst(*inptr++);
                    740:                        popstring(&ptr, &len);
                    741:                        printstr(ptr, len, stderr);
                    742:                        optional(askdelims);
                    743:                        }
                    744:                v = getsvar(&type);
                    745:                optional(askdelims);
                    746:                while (*askptr == ' ')
                    747:                        ++askptr;
                    748:                if (*askptr == 0) {
                    749:                        if (f == stdin)
                    750:                        fputs("? ", stderr);
                    751:                        if (readline(askline, f) < 0)
                    752:                                err("EOF on input");
                    753:                        askptr = askline;
                    754:                        }
                    755:                cvtdata(v, type, &askptr);
                    756:                }
                    757: }
                    758: 
                    759: 
                    760: /*
                    761:  * morefiledata --- check to see if specified file is at end
                    762:  */
                    763: 
                    764: morefiledata()
                    765: {
                    766:        int             c;
                    767:        FILE            *f;
                    768: 
                    769:        f = getunit(INPUT, INUNIT)->io_ptr;
                    770:        if ((c = getc(f)) != EOF) {
                    771: 
                    772:                /* not at end of file. put character back and return 1 */
                    773: 
                    774:                ungetc(c, f);
                    775:                return(1);
                    776:                }
                    777:        else
                    778: 
                    779:                /* at end of file. return 0 */
                    780: 
                    781:                return(0);
                    782:        
                    783: }
                    784: /*
                    785:  * strpop --- pop string from stack; convert to null-terminated format
                    786:  */
                    787: 
                    788: char *strpop()
                    789: {
                    790:        static char     strtemp[MAXSTR];
                    791:        char            *str;
                    792:        int             len;
                    793: 
                    794:        popstring(&str, &len);
                    795:        if (len >= MAXSTR - 1)
                    796:                err("string too long");
                    797:        move(len, str, strtemp);
                    798:        strtemp[len] = 0;
                    799:        return(strtemp);
                    800: }

unix.superglobalmegacorp.com

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