Annotation of researchv10no/cmd/basic/bas/misc.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: double popfloat(), cvtnumber();
                      8: Linep  findline();
                      9: Lnr    cvtlnr();
                     10: char   *getsvar();
                     11: Symptr getvar();
                     12: 
                     13: 
                     14: /*
                     15:  * moredatastmt --- check for more data before reading
                     16:  */
                     17: 
                     18: moredatastmt()
                     19: {
                     20: 
                     21:        register char   *p;
                     22:        register Linep  s;
                     23: 
                     24:                /* if we have found a data line, move past
                     25:                any spaces */
                     26: 
                     27:                if (data.k_un.k_gosub.g_inptr != NULL)
                     28:                        while (*data.k_un.k_gosub.g_inptr == ' ')
                     29:                                ++data.k_un.k_gosub.g_inptr;
                     30: 
                     31:                /* if we have not found a data line yet or
                     32:                we are at the end of a data line, see if there
                     33:                is another data line   */
                     34: 
                     35:                if (data.k_un.k_gosub.g_inptr == NULL  ||
                     36:                                *data.k_un.k_gosub.g_inptr == 0) {
                     37:                        for (s = data.k_un.k_gosub.g_curline; 
                     38:                                        isline(s); s = nextline(s)) {
                     39:                                p = s->l_line;
                     40:                                if (*p++ == DATA) {
                     41:                                        data.k_un.k_gosub.g_inptr = p;
                     42:                                        data.k_un.k_gosub.g_curline 
                     43:                                                                = nextline(s);
                     44:                                        return(1);
                     45:                                        }
                     46:                                }
                     47:                        return(0);
                     48:                }
                     49:                else
                     50:                        return(1);
                     51: 
                     52: 
                     53: 
                     54: }
                     55: 
                     56: 
                     57: 
                     58: /*
                     59:  * ifstmt --- interpret an IF statement
                     60:  */
                     61: 
                     62: ifstmt()
                     63: {
                     64:        Lnr             line1;
                     65:        int             s;
                     66: 
                     67: 
                     68:        if (endtest()) badsyn();  /* check for end of statement */
                     69: 
                     70:        while (*inptr == ' ' || *inptr == TAB)
                     71:                ++inptr;
                     72: 
                     73:        /* check for  moredata  token */
                     74: 
                     75:        if (*inptr == MORE) {
                     76:                ++inptr;
                     77:                while (*inptr == ' ' || *inptr == TAB)
                     78:                        ++inptr;
                     79: 
                     80:                /* 
                     81:                 *  we've got a more so let's check for a unit(file) number 
                     82:                 */
                     83: 
                     84:                if (endtest()) badsyn();  /* check for end of statement */
                     85: 
                     86:                if (*inptr == SHARP)
                     87:                        s = morefiledata();
                     88: 
                     89:                /* 
                     90:                 *  found a # so it's a file.  go do morefiledata() in io.c 
                     91:                 */
                     92: 
                     93:                else
                     94:                        s = moredatastmt();
                     95: 
                     96:                /* 
                     97:                 *  no # so it's a check for more data in data statements 
                     98:                 */
                     99: 
                    100:                if (s != 0)
                    101:                        goto thendo;
                    102:                else
                    103:                        goto elsedo;
                    104:                }
                    105:        else {
                    106: 
                    107:                /* 
                    108:                 *  it's not a check for moredata, so usual routine 
                    109:                 */
                    110: 
                    111:                if (fexpr() != 0) {
                    112:                        thendo:
                    113:                        while (*inptr == ' ' || *inptr == TAB)
                    114:                                ++inptr;
                    115: 
                    116:                        if (endtest()) 
                    117:                                badsyn();
                    118:                                  /* check for end of statement */
                    119: 
                    120:                        if (*inptr == THEN)
                    121:                                ++inptr;
                    122: 
                    123:                        if (endtest()) 
                    124:                                badsyn();
                    125:                                  /* check for end of statement */
                    126: 
                    127:                        if (isdigit(*inptr)) {
                    128:                                line1 = cvtlnr();
                    129:                                curline = findline(line1, EXACTLNR);
                    130:                                inptr = NULL;
                    131:                                }
                    132:                        }
                    133:                else {
                    134:                                /* move past then actions and look for
                    135:                                        end of line or an else          */
                    136:                        elsedo:
                    137:                        while (*inptr && *inptr != ELSE)
                    138:                                ++inptr;
                    139:        
                    140:                                /* if we are not at the end of the line
                    141:                                        then we must have found an else */
                    142:        
                    143:                        if (*inptr)
                    144:                                ++inptr;
                    145:                                /* if not at end of line, must be an else.
                    146:                                        so, move past it.       */
                    147: 
                    148:                        if (!endtest()) {
                    149:                                while (*inptr == ' ' || *inptr == TAB)
                    150:                                        ++inptr;
                    151:                                if (isdigit(*inptr)) {
                    152:                                        line1 = cvtlnr();
                    153:                                        endchk();
                    154:                                        curline = findline(line1, EXACTLNR);
                    155:                                        inptr = NULL;
                    156:                                        }
                    157:                                }
                    158:                                
                    159:                        else {
                    160: 
                    161:                        /* we were at the end of line so no else  */
                    162: 
                    163:                                curline = nextline(curline);
                    164:                                inptr = NULL;
                    165:                                }
                    166:                        }
                    167:                }
                    168: }
                    169: 
                    170: 
                    171: /*
                    172:  * gotostmt --- interpret a GOTO statement
                    173:  */
                    174: 
                    175: gotostmt()
                    176: {
                    177:        register Lnr    line1;
                    178: 
                    179:        line1 = cvtlnr();
                    180:        endchk();
                    181:        curline = findline(line1, EXACTLNR);
                    182:        inptr = NULL;
                    183: }
                    184: 
                    185: 
                    186: /*
                    187:  * forstmt --- interpret a FOR statement
                    188:  */
                    189: 
                    190: forstmt()
                    191: {
                    192:        register Symptr v;
                    193:        Stkfr           f;
                    194:        int             type;
                    195: 
                    196:        f.k_len = FORFRLEN;
                    197:        f.k_type = STK_FOR;
                    198:        f.k_un.k_frk.frk_symp = v = getvar(&type, NO);
                    199:        if (type != FLOAT)      
                    200:                typeerr();
                    201:        expectc(EQ);
                    202:        if (SINGLE)
                    203:                v->v_un.v_float = fexpr();
                    204:        else
                    205:                v->v_un.v_double = fexpr();
                    206:        expectc(TO);
                    207:        f.k_un.k_frk.frk_last = fexpr();
                    208:        if (*inptr == STEP) {
                    209:                ++inptr;
                    210:                f.k_un.k_frk.frk_incr = fexpr();
                    211:                }
                    212:        else
                    213:                f.k_un.k_frk.frk_incr = 1.0;
                    214:        endchk();
                    215:        f.k_un.k_frk.frk_inptr = inptr;
                    216:        f.k_un.k_frk.frk_curline = curline;
                    217:        push(&f);
                    218: }
                    219: 
                    220: 
                    221: /*
                    222:  * nextstmt --- interpret a NEXT statement
                    223:  */
                    224: 
                    225: nextstmt()
                    226: {
                    227:        register Stkptr s;
                    228:        register Symptr v;
                    229:        int             type;
                    230:        double          f;
                    231: 
                    232:        s = (Stkptr)stkptr;
                    233:        if (s->k_type != STK_FOR)
                    234:                err("for missing");
                    235:        v = s->k_un.k_frk.frk_symp;
                    236:        while (!endtest() && getvar(&type, NO) != v) {
                    237:                pop(STK_FOR);
                    238:                s = (Stkptr)stkptr;
                    239:                if (s->k_type != STK_FOR)
                    240:                        err("for missing");
                    241:                v = s->k_un.k_frk.frk_symp;
                    242:                }
                    243:        endchk();
                    244:        if (SINGLE)
                    245:                f = v->v_un.v_float += s->k_un.k_frk.frk_incr;
                    246:        else
                    247:                f = v->v_un.v_double += s->k_un.k_frk.frk_incr;
                    248:        if (s->k_un.k_frk.frk_incr > 0)
                    249:                if (f > s->k_un.k_frk.frk_last + .00000000000001)
                    250:                        pop(STK_FOR);
                    251:                else {
                    252:                        inptr = s->k_un.k_frk.frk_inptr;
                    253:                        curline = s->k_un.k_frk.frk_curline;
                    254:                        }
                    255:        else
                    256:                if (f <  s->k_un.k_frk.frk_last)
                    257:                        pop(STK_FOR);
                    258:                else {
                    259:                        inptr = s->k_un.k_frk.frk_inptr;
                    260:                        curline = s->k_un.k_frk.frk_curline;
                    261:                        }
                    262: }
                    263: 
                    264: 
                    265: /*
                    266:  * typeerr --- report a data type error
                    267:  */
                    268: 
                    269: typeerr()
                    270: {
                    271: 
                    272:        err("invalid type");
                    273: }
                    274: 
                    275: 
                    276: /*
                    277:  * readdata --- interpret a READ statement
                    278:  */
                    279: 
                    280: readdata()
                    281: {
                    282:        register char   *v;
                    283:        char            *ptr;
                    284:        int             type, len;
                    285: 
                    286:        while (!endtest()) {
                    287:                v = getsvar(&type);
                    288:                optional(askdelims);
                    289:                if (data.k_un.k_gosub.g_inptr == NULL)
                    290:                        getdata();
                    291:                while (*data.k_un.k_gosub.g_inptr == ' ')
                    292:                        ++data.k_un.k_gosub.g_inptr;
                    293:                if (*data.k_un.k_gosub.g_inptr == 0)
                    294:                        getdata();
                    295:                cvtdata(v, type, &data.k_un.k_gosub.g_inptr);
                    296:                }
                    297: }
                    298: 
                    299: 
                    300: /*
                    301:  * getdata --- scan input lines for DATA statements
                    302:  */
                    303: 
                    304: getdata()
                    305: {
                    306:        register char   *p;
                    307:        register Linep  s;
                    308: 
                    309:        for (s = data.k_un.k_gosub.g_curline; isline(s); s = nextline(s)) {
                    310:                p = s->l_line;
                    311:                if (*p++ == DATA) {
                    312:                        data.k_un.k_gosub.g_inptr = p;
                    313:                        data.k_un.k_gosub.g_curline = nextline(s);
                    314:                        return;
                    315:                        }
                    316:                }
                    317:        err("out of data");
                    318: }
                    319: 
                    320: 
                    321: /*
                    322:  * cvtdata --- convert one data item from a DATA statement
                    323:  */
                    324: 
                    325: cvtdata(vp, type, ptr)
                    326: char   **ptr, *vp;
                    327: {
                    328:        register char   *v;
                    329:        char            *p;
                    330: 
                    331:        v = vp;
                    332:        p = *ptr;
                    333:        while (*p == ' ')
                    334:                ++p;
                    335:        switch(type) {
                    336:        case INT:
                    337:                *(int *)v = cvtnumber(&p, MAXINT);
                    338:                break;
                    339:        case FLOAT:
                    340:                if (SINGLE)
                    341:                        *(float *)v = cvtnumber(&p, MAXINT);
                    342:                else
                    343:                        *(double *)v = cvtnumber(&p, MAXINT);
                    344:                break;
                    345:        case STRING:
                    346:                cvtstring(&p);
                    347:                storestring(v);
                    348:                break;
                    349:        default:
                    350:                badtype();
                    351:                }
                    352:        while (*p == ' ')
                    353:                ++p;
                    354:        if (*p)
                    355:                if (*p == ',')
                    356:                        ++p;
                    357:                else
                    358:                        err("bad input");
                    359:        *ptr = p;
                    360: }
                    361: 
                    362: 
                    363: /*
                    364:  * cvtstring --- convert a string element of a DATA statement
                    365:  */
                    366: 
                    367: cvtstring(cvtptr)
                    368: char   **cvtptr;
                    369: {
                    370:        register int    c;
                    371:        register char   *p, *ptr;
                    372:        int             len;
                    373: 
                    374:        p = *cvtptr;
                    375:        if (*p == '"' || *p == '\'')
                    376:                c = *p++;
                    377:        else
                    378:                c = ',';
                    379:        ptr = p;
                    380:        while (*p && *p != c)
                    381:                ++p;
                    382:        len = p - ptr;
                    383:        if (*p && *p != ',')
                    384:                ++p;
                    385:        *cvtptr = p;
                    386:        pushstring(ptr, len);
                    387: }
                    388: 
                    389: 
                    390: /*
                    391:  * ongoto --- interpret an ON statement
                    392:  */
                    393: 
                    394: ongoto()
                    395: {
                    396:        register int    l, s;
                    397:        register Lnr    lnr;
                    398: 
                    399:        l = fexpr();
                    400:        s = *inptr++;
                    401:        if (s != GOTO && s != GOSUB)
                    402:                badsyn();
                    403:        if (l <= 0)
                    404:                err("on index less than one");
                    405:        while (!endtest()) {
                    406:                lnr = cvtlnr();
                    407:                if (--l == 0) {
                    408:                        if (s == GOSUB) {
                    409:                                while (!endtest())
                    410:                                        ++inptr;
                    411:                                gosub.k_un.k_gosub.g_curline = curline;
                    412:                                gosub.k_un.k_gosub.g_inptr = inptr;
                    413:                                gosub.k_type = STK_GOSUB;
                    414:                                gosub.k_len = GOSUBFRLEN;
                    415:                                push(&gosub);
                    416:                                }
                    417:                        curline = findline(lnr, EXACTLNR);
                    418:                        inptr = NULL;
                    419:                        return;
                    420:                        }
                    421:                if (*inptr == COMMA)
                    422:                        ++inptr;
                    423:                else
                    424:                        break;
                    425:                }
                    426:        err("on index too big");
                    427: }
                    428: 
                    429: 
                    430: /*
                    431:  * hgr ---
                    432:  */
                    433: 
                    434: hgr()
                    435: {
                    436: 
                    437:        pltcls();
                    438:        pltini(NULL);
                    439: }
                    440: 
                    441: 
                    442: /*
                    443:  * hplot ---
                    444:  */
                    445: 
                    446: hplot()
                    447: {
                    448:        register int    x, y;
                    449: 
                    450:        do {
                    451:                x = fexpr();
                    452:                expectc(COMMA);
                    453:                y = fexpr();
                    454:                plot(x, y);
                    455:                pendn();
                    456:                } while (*inptr == TO && ++inptr);
                    457:        penup();
                    458: }

unix.superglobalmegacorp.com

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