Annotation of researchv10no/cmd/basic/bite/src/evals.c, revision 1.1.1.1

1.1       root        1: /* Copyright Bell Telephone Laboratories Whippany, N.J.
                      2: 
                      3:  *     /////////////////////////////////////
                      4:  *     /////////////////////////////////////
                      5:  *     /////////////// evals ///////////////
                      6:  *     /// J. P. Hawkins WH X4610 8C-001 ///
                      7:  *     ///// Mon Feb  2 07:33:54 1981 //////
                      8:  *     /////////////////////////////////////
                      9:  *     /////////////////////////////////////
                     10:  *     @(#) evals.c: V1.7 3/5/81
                     11: 
                     12:  * This is the string expression "evaluator". It's purpose is to
                     13:  * concatinate combinations of literals and expanded string variables
                     14:  * as they are fetched from memory. The only legal operation is '+'
                     15:  *
                     16:  * MOD,J.P.Hawkins,17-FEB-81 added string function handling
                     17:  * MOD,J.P.Hawkins,28-FEB-81 added string array handling
                     18: */
                     19: 
                     20: #include       "bas.h"
                     21: extern int     stpflg;
                     22: extern char    *eoexpr;
                     23: evals(exps,result)
                     24: char   exps[];
                     25: char   *result;
                     26: {
                     27:        int     type;           /* field classification */
                     28:        char    *objadr;        /* string object pointer */
                     29:        char    cat[512];       /* concatination buffer */
                     30:        char    *expptr;        /* expression string pointer */
                     31:        char    field[80];
                     32: 
                     33:        expptr = exps;
                     34:        cat[0] = '\0';          /* initialize buffer */
                     35: /*
                     36:  *
                     37:  * The only ways out of this loop are string terminator or
                     38:  * expression terminator (null char)
                     39:  * the codes 1 through 37(8) represent encoded keywords (defined in bed.c)
                     40:  * those being:
                     41:  * goto,go to,then,to,step,<=,=<,<,>=,=>,>, =, or <>
                     42:  *
                     43:  * This "while" loop is
                     44:  * not indented so "all this stuff" fits across standard page
                     45:  */
                     46: while(!(*expptr >= '\0' && *expptr <= '\37'))
                     47: {
                     48:        if((type=class(&expptr,field)) < 0) /* get field and type */
                     49:        {
                     50:                error(inst.thing.linno, 8);     /* EXPR SYNTAX */
                     51:                error(inst.thing.linno, 15);            /* FATAL ERROR */
                     52:                stpflg = 1;
                     53:                result[0] = '\0';       /* leave null string */
                     54:                return(0);/* return zero on error */
                     55:        }
                     56: 
                     57:        switch(type)
                     58:        {
                     59:                case SVCLASS:
                     60:                        sgetvar(field,&objadr); /* expand variable into
                     61:                                                   object pointer */
                     62:                        strcat(cat,objadr);
                     63:                        break;
                     64:                case STCLASS:
                     65:                        strcat(cat,field);      /* copy literal into
                     66:                                                    object pointer */
                     67:                        break;
                     68:                case SFCLASS:   /* STRING FUNCTION */
                     69:                        strcall(field,&objadr);
                     70:                        strcat(cat,objadr);
                     71:                        break;
                     72:                case SACLASS:   /* STRING ARRAY CLASS */
                     73:                        sagetvar(field,&objadr); /* expand variable into
                     74:                                                   object pointer */
                     75:                        strcat(cat,objadr);
                     76:                        break;
                     77:                case VRCLASS:   /* VARIABLE CLASS */
                     78:                case VACLASS:   /* SUBSCRIPTED VARIABLE */
                     79:                case NMCLASS:   /* NUMERIC FIELD */
                     80:                case FNCLASS:   /* FUNCTION REFERENCE */
                     81:                        error(inst.thing.linno, 51);    /* NUM in ST. */
                     82:                        stpflg = 1;
                     83:                        return(0);
                     84:                        break;
                     85:                case OPCLASS:   /* OPERATOR */
                     86:                        switch(*field) {
                     87:                                case '+':
                     88:                                case ')':
                     89:                                        break;
                     90:                                default:
                     91:                                        error2(inst.thing.linno, 52, ' ');
                     92:                                        printf("- '%c'\n",*field);
                     93:                                        break;
                     94:                        }
                     95:                        break;
                     96:                default:
                     97:                        printf("WHAT HAPPENED? TYPE = %d\n", type);
                     98:                        break;
                     99:                }
                    100: }      /* END OF WHILE LOOP */
                    101:        eoexpr = expptr;
                    102:        strcpy(result,cat);     /* put string in output */
                    103:        return 0;
                    104: }
                    105: /*
                    106:  *
                    107:  * ////// CALL STRING FUNCTION ////////
                    108:  *
                    109:  *
                    110:  *
                    111:  * calling format:
                    112:  *     value = strcall(strexp,&result);
                    113:  *
                    114:  *     where: strexp = string expression
                    115:  *            result = pointer to a expanded null terminated string
                    116:  */
                    117: 
                    118: /*
                    119:  *
                    120:  * //////// BASIC INTERPRETER STRING FUNCTION TABLE ////////
                    121:  *
                    122:  */
                    123: char *chr(); /* convert integer to ascii char */
                    124: char *left(); /* left$(string,n) return first n chars of string */
                    125: char *ext(); /* ext$(string,p,n) ret substr. of string start at p length n */
                    126: char *right(); /* right$(string,n) ret last n chars of string */
                    127: char *str(); /* str$(expr) converts numeric expression to string */
                    128: char *string(); /* string$(n,char) repeats char n times */
                    129: char *loc();   /* loc$(str) change upper case to lower case chars */
                    130: char *upc();   /* upc$(str) change lower case to upper case chars */
                    131: 
                    132: 
                    133: /*
                    134:  *
                    135:  * This is the BASIC interpreter string function
                    136:  * dispatch table.
                    137:  *
                    138:  */
                    139: 
                    140: /*
                    141:  * each entry contains the text for the STRING FUNCTION
                    142:  * in question and the address of the routine which services it
                    143:  */
                    144: struct tbl
                    145:        {
                    146:                char *cmdtxt;
                    147:                char *(*func)();
                    148:        };
                    149: struct tbl sfuntbl[] = {
                    150:        {"chr",         chr},
                    151:        {"left",        left},
                    152:        {"ext",         ext},   /* GE MNEMONIC */
                    153:        {"mid",         ext},   /* For TRS-80 FANS */
                    154:        {"right",       right},
                    155:        {"str",         str},
                    156:        {"string",      string}, 
                    157:        {"upc",         upc},
                    158:        {"loc",         loc},
                    159:        {0,             0}      
                    160:        };
                    161: /*
                    162:  *
                    163:  */
                    164: strcall(strexp,result)
                    165: char   strexp[];
                    166: char   **result;
                    167: {
                    168:        char    resbuf[132];    /* result buffer */
                    169:        char    funnam[20]; /* func name copied from 's'
                    170:                                used for string search */
                    171:        register char *x; /* pointer to paren enclosed expression */
                    172:        register  int i;                /* index reg. for expediency */
                    173:        x = strexp;     /* set pointer to func string */
                    174:        /*
                    175:         * copy the func name part up to the '$'
                    176:         * to use for a string search in the table of names
                    177:         */
                    178:        for(i=0; *x != '$' ;)
                    179:        {
                    180:                funnam[i++] = *x++;
                    181:        }
                    182:        *x++;   /* skip ( */
                    183:        funnam[i] = '\0';       /* null terminate */
                    184:        /*
                    185:         * compare each string in table with funnam
                    186:         * when match is found, call using offset code
                    187:         * if end-of-table (null) encountered return 0
                    188:         */
                    189:        for(i=0; sfuntbl[i].cmdtxt != 0 ; i++)
                    190:        {
                    191:                if(!(strcmp(funnam, sfuntbl[i].cmdtxt)))
                    192:                {
                    193:                        x++;
                    194:                        strcpy(resbuf,(*sfuntbl[i].func)(x));
                    195:                        *result = resbuf;
                    196:                        return(0);
                    197:                }
                    198:        }
                    199:        error(inst.thing.linno, 54); /* unknown string function */
                    200:        return(0);      /* oops not in this table, pal */
                    201: }

unix.superglobalmegacorp.com

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