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

1.1       root        1: /* Copyright Bell Telephone Laboratories Whippany, N.J.
                      2: 
                      3:  *     /////////////////////////////////////
                      4:  *     /////////////////////////////////////
                      5:  *     ////////////// class.c //////////////
                      6:  *     /// J. P. Hawkins WH X4610 8C-001 ///
                      7:  *     ///// Fri Aug 24 16:52:56 1979 //////
                      8:  *     /////////////////////////////////////
                      9:  *     /////////////////////////////////////
                     10:  *
                     11:  *      ALGEBRAIC EXPRESSION FIELD and OPERATOR CLASSIFIER
                     12:  *                 and SYNTAX CHECKER
                     13:  *             (LEXICAL analyzer of sorts)
                     14:  *
                     15:  * MOD,J.P.Hawkins,31-JAN-81 to recognize string variables and strings
                     16:  * MOD,J.P.Hawkins,17-FEB-81 to recognize string functions
                     17:  *
                     18:  * calling format:
                     19:  *
                     20:  *     field class (or error) = class(&sptr, field);
                     21:  *
                     22:  *     where the ADDRESS of the Pointer sptr MUST be passed
                     23:  *             the input string pointer will be MODIFIED and
                     24:  *             LEFT at a point after the field just parsed
                     25:  *
                     26:  *             field = pointer to txtbuf where a null terminated copy
                     27:  *                     of the field just parsed will be left
                     28:  *
                     29:  *             error code = negative of class
                     30:  *                     (i.e. a certain type field was attempted
                     31:  *                      but something illegal happened
                     32:  */
                     33: /*   "@(#) class.c:  V 1.4  3/1/81" */
                     34: #include       "bas.h"
                     35: #define cpychr()       {*fptr++ = **sptr ; *sptr += 1; }
                     36: /*
                     37:  * the legdlm(X) test implies that those fields as checked by class
                     38:  * may have the defined limited char values following the field
                     39:  * the chars 1 through 37(8) are keywords (defined in bed.c) which
                     40:  * replace "goto","go to","then","to","step","<=","=<","<",">=","=>",">"
                     41:  * "=" or "<>"  which is done at input time to compact the code and to
                     42:  * simplify run time tests for these combinations
                     43:  */
                     44: #define legdlm(X) ((any(X," ^*+/-)")  || (X>='\0' && X <= '\37')))
                     45: /*
                     46: #define        skip00()        {while(**sptr == ' ' || **sptr == '\t') *sptr +=1;}
                     47: */
                     48: #define        skip00()        {}      /* skip00 does nothing */
                     49: class(sptr, field)
                     50: char   **sptr;         /* input string pointer */
                     51: char   *field;         /* pointer to output field */
                     52: {
                     53:        char    *fptr;  /* output field pointer */
                     54:        int     pcnt;   /* parenthesis best counter */
                     55: #ifdef STRINGS
                     56:        int     strflg; /* string function flag */
                     57: #endif
                     58:        pcnt = 0;       /* init paren nest counter */
                     59:        fptr = field;   /* init output field pointer */
                     60:        skip00();               /* skip leading blanks and tabs */
                     61:        /*
                     62:         * QUOTED LITERAL STRING?
                     63:         */
                     64: #ifdef STRINGS
                     65:        if(**sptr == '"')       /* if beginning of string */
                     66:        {
                     67:                *sptr += 1;     /* bump past 1st quote */
                     68:                while(!(**sptr == '"' || **sptr == '\0'))
                     69:                        cpychr();
                     70:                if(**sptr == '"')
                     71:                {
                     72:                        *sptr += 1; /* bump past end delimiter */
                     73:                        *fptr = '\0'; /* null terminate */
                     74:                        return(STCLASS); /* LITERAL STRING CLASS */
                     75:                }
                     76:                return(-STCLASS); /* unbalanced quotes */
                     77:        }
                     78: #endif
                     79:        if(alpha(**sptr))       /* if 1st char is alpha */
                     80:        {
                     81:                cpychr();       /* copy first alpha */
                     82:                if(alpha(**sptr))       /* if second alpha it must be func */
                     83:                {
                     84:                        /*
                     85:                         * copy until first non-alphanumeric
                     86:                         * this must be a FUNCTION FIELD.
                     87:                         * The first non-alpha numeric must be a '('
                     88:                         */
                     89:                        while(alpha(**sptr) || num(**sptr))
                     90:                                cpychr();
                     91: #ifdef STRINGS
                     92:                        strflg = 0;
                     93:                        if(**sptr == '$')       /* string function? */
                     94:                        {
                     95:                                strflg = 1;     /* yes */
                     96:                                cpychr();
                     97:                        }
                     98: #endif
                     99: 
                    100:                        if(**sptr == '(') /* func name followed by '(' */
                    101:                        {
                    102:                                pcnt = 1; /* count first nest deep */
                    103:                                cpychr(); /* copy initial '(' */
                    104:                                /*
                    105:                                 * scan stuff inside of parens.
                    106:                                 * parens must be balanced to terminate
                    107:                                 * function field.
                    108:                                 */
                    109:                                while(pcnt > 0 && **sptr != 0)
                    110:                                {
                    111:                                        switch(**sptr){
                    112:                                                case '(':
                    113:                                                        pcnt += 1;
                    114:                                                        break;
                    115:                                                case ')':
                    116:                                                        pcnt -= 1;
                    117:                                                        break;
                    118:                                                default:
                    119:                                                        break;
                    120:                                        }
                    121:                                        cpychr();
                    122:                                }
                    123:                                if(**sptr == 0 && pcnt != 0)
                    124:                                {
                    125:                                        *fptr='\0';
                    126:                                        /*
                    127:                                         * line terminates before
                    128:                                         * function defined.
                    129:                                         */
                    130: #ifdef STRINGS
                    131:                                        if(strflg)
                    132:                                                return(-SFCLASS);
                    133:                                        else
                    134: #endif
                    135:                                                return(-FNCLASS);
                    136:                                }
                    137:                                if(legdlm(**sptr))
                    138:                                {
                    139:                                        *fptr = '\0'; /* null term */
                    140:                                        /*
                    141:                                         * Return function class code
                    142:                                         */
                    143: #ifdef STRINGS
                    144:                                        if(strflg)
                    145:                                                return(SFCLASS);
                    146:                                        else
                    147: #endif
                    148:                                                return(FNCLASS);
                    149:                                }
                    150:                                else /* illegal delim */
                    151:                                        return(-FNCLASS);
                    152:                        }
                    153:                        else
                    154:                        {
                    155:                                return(-FNCLASS); /* function def without
                    156:                                                      '('  */
                    157:                        }
                    158:                }
                    159:                else    /* VARIABLE OR VARIABLE ARRAY FIELD */
                    160:                {
                    161:                        if(num(**sptr))
                    162:                                cpychr(); /* cpy numeric part of var name */
                    163: #ifdef STRINGS
                    164:                        strflg = 0;
                    165:                        if(**sptr == '$')       /* string function? */
                    166:                        {
                    167:                                strflg = 1;     /* yes */
                    168:                                cpychr();
                    169:                        }
                    170: #endif
                    171:                        if(**sptr == '(') /* array paren? */
                    172:                        {
                    173:                                pcnt = 1;       /* init paren count */
                    174:                                cpychr();       /* copy 1st paren */
                    175:                                /*
                    176:                                 * scan stuff inside of parens.
                    177:                                 * parens must be balanced to terminate
                    178:                                 * function field.
                    179:                                 */
                    180:                                while(pcnt > 0 && **sptr != 0)
                    181:                                {
                    182:                                        switch(**sptr){
                    183:                                                case '(':
                    184:                                                        pcnt += 1;
                    185:                                                        break;
                    186:                                                case ')':
                    187:                                                        pcnt -= 1;
                    188:                                                        break;
                    189:                                                default:
                    190:                                                        break;
                    191:                                        }
                    192:                                        cpychr();
                    193:                                }
                    194:                                if(**sptr == 0 && pcnt != 0)
                    195:                                {
                    196:                                        *fptr='\0';
                    197:                                        /*
                    198:                                         * line terminates before array
                    199:                                         * defined
                    200:                                         */
                    201: #ifdef STRINGS
                    202:                                        if(strflg)
                    203:                                                return(-SACLASS);
                    204:                                        else
                    205: #endif
                    206:                                                return(-VACLASS);
                    207:                                }
                    208:                                if(legdlm(**sptr))
                    209:                                {
                    210:                                        *fptr = '\0'; /* null term */
                    211: #ifdef STRINGS
                    212:                                        if(strflg)
                    213:                                                return(SACLASS);
                    214:                                        else
                    215: #endif
                    216:                                                return(VACLASS);
                    217:                                }
                    218:                                else
                    219:                                {
                    220:                                        *fptr = '\0';
                    221:                                        /* ill delim */
                    222: #ifdef STRINGS
                    223:                                        if(strflg)
                    224:                                                return(-SACLASS);
                    225:                                        else
                    226: #endif
                    227:                                                return(-VACLASS);
                    228:                                }
                    229:                        }
                    230:                        else /* VARIABLE NAME FIELD */
                    231:                        {
                    232:                                if(legdlm(**sptr)) /* legal delimiter */
                    233:                                {
                    234:                                        *fptr = '\0'; /* null term */
                    235: #ifdef STRINGS
                    236:                                        if(strflg)
                    237:                                                return(SVCLASS);
                    238:                                        else
                    239: #endif
                    240:                                                return(VRCLASS);
                    241:                                }
                    242:                                else
                    243:                                {
                    244: #ifdef STRINGS
                    245:                                        if(strflg)
                    246:                                                return(-SVCLASS);
                    247:                                        else
                    248: #endif
                    249:                                                return(-VRCLASS); /* ill delim */
                    250:                                }
                    251:                        }
                    252:                }
                    253:        }
                    254:        else /* EITHER NUMERIC OR OPERATOR FIELD */
                    255:        {
                    256:                if(num(**sptr) || **sptr == '.')
                    257:                {
                    258:                        cpychr(); /* copy 1st dig of num */
                    259:                        while(num(**sptr)) /* copy all consec dig */
                    260:                                cpychr();
                    261:                        if(**sptr == '.') /* embedded '.' is allowed */
                    262:                        {
                    263:                                cpychr();       /* copy '.' */
                    264:                                while(num(**sptr)) /* get digits following
                    265:                                                      decimal point */
                    266:                                        cpychr();
                    267:                        }
                    268:                        if(**sptr == 'e' || **sptr == 'E')
                    269:                        {
                    270:                                cpychr();
                    271:                                /*
                    272:                                 * HANDLE EXPONENTIAL NOTATION TYPE
                    273:                                 */
                    274:                                if(**sptr == '+' || **sptr == '-')
                    275:                                {
                    276:                                        cpychr();
                    277:                                        if(num(**sptr))
                    278:                                        {
                    279:                                                /* copy exponent */
                    280:                                                while(num(**sptr))
                    281:                                                        cpychr();
                    282:                                        }
                    283:                                        else
                    284:                                        {
                    285:                                                return(-NMCLASS);
                    286:                                        }
                    287:                                }
                    288:                                else
                    289:                                {
                    290:                                        return(-NMCLASS);
                    291:                                }
                    292:                        }
                    293:                        if(legdlm(**sptr)) /* check for legal delim */
                    294:                        {
                    295:                                *fptr = '\0'; /* null term */
                    296:                                return(NMCLASS); /* numeric */
                    297:                        }
                    298:                        else
                    299:                                return(-NMCLASS); /* ill delim */
                    300:                }
                    301:                else /* OPERATOR FIELD */
                    302:                {
                    303:                        if(any(**sptr, "^*/+-()"))
                    304:                        {
                    305:                                cpychr(); /* copy the operator */
                    306:                                *fptr = '\0'; /* term with null */
                    307:                                return(OPCLASS); /* operator */
                    308:                        }
                    309:                        else
                    310:                                return(-OPCLASS); /* illegal delim */
                    311:                }
                    312:        }
                    313: }
                    314: /*
                    315:  *
                    316:  * //////// TRUE IF ANY CHARS IN STRING as MATCH c ////////
                    317:  */
                    318: any(c, as)
                    319: int c;
                    320: char *as;
                    321: {
                    322:        register char *s;
                    323: 
                    324:        s = as;
                    325:        while(*s)
                    326:                if(*s++ == c)
                    327:                        return(1);
                    328:        return(0);
                    329: }
                    330: 
                    331: /*
                    332:  * //// TRUE IF ALPHA lower case ////
                    333:  */
                    334: alpha(c)
                    335: char   c;
                    336: {
                    337:        if(c >= 'a' && c <= 'z')
                    338:                return(1);
                    339:        else
                    340:                return(0);
                    341: }
                    342: 
                    343: /*
                    344:  * //// TRUE IF NUMERIC ////
                    345:  */
                    346: num(c)
                    347: char   c;
                    348: {
                    349:        if(c >= '0' && c <= '9')
                    350:                return(1);
                    351:        else
                    352:                return(0);
                    353: }

unix.superglobalmegacorp.com

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