Annotation of 42BSD/ingres/source/equel/operator.c, revision 1.1.1.1

1.1       root        1: # include      <stdio.h>
                      2: # include      "constants.h"
                      3: # include      "globals.h"
                      4: # include      "y.tab.h"
                      5: # include      <sccs.h>
                      6: 
                      7: SCCSID(@(#)operator.c  7.1     2/5/81)
                      8: 
                      9: 
                     10: /*
                     11: **  OPERATOR -- process a token starting with an operator
                     12: **
                     13: **     Processes operators, strings, comments, and 
                     14: **     floating constants without a leading 0.
                     15: **
                     16: **     Parameters:
                     17: **             chr - first character of token {Cmap [chr] == OPATR}
                     18: **
                     19: **     Returns:
                     20: **             NUMBER or STRING token, or operator token.
                     21: **             CONTINUE on error.
                     22: **
                     23: **     Side Effects:
                     24: **             Adds a node to the Symbol space, and returns adress
                     25: **             in "yylval".
                     26: **             Opcode is set to the opcode of the operator.
                     27: **             May backup a character.
                     28: */
                     29: 
                     30: operator(chr)
                     31: char   chr;
                     32: {
                     33:        register struct optab   *op;
                     34:        char                    opbuf [3];
                     35: 
                     36:        opbuf [0] = chr;
                     37:        opbuf [1] = getch();
                     38:        opbuf [2] = '\0';
                     39: 
                     40:        if (opbuf [0] == '.' && Cmap [opbuf [1]] == NUMBR)
                     41:        {
                     42:                /* floating mantissa w/o leading 0 */
                     43:                backup(opbuf [1]);
                     44:                return (number(opbuf [0]));
                     45:        }
                     46:        if (Cmap [opbuf [1]] != OPATR)
                     47:        {
                     48:                backup(opbuf [1]);
                     49:                opbuf [1] = '\0';
                     50:        }
                     51:        /* operator has been reduced to its smallest 
                     52:         * possible length, now try to find it in the
                     53:         * operator table [tokens.y]
                     54:         */
                     55:        for ( ; ; )
                     56:        {
                     57:                for (op = Optab; op->op_term; op++)
                     58:                        if (sequal(op->op_term, opbuf))
                     59:                                break;
                     60:                if (!op->op_term && opbuf [1])
                     61:                {
                     62:                        /* reduce a 2 char operator to 1 char,
                     63:                         * and re-search
                     64:                         */
                     65:                        backup(opbuf[1]);
                     66:                        opbuf [1] = '\0';
                     67:                        continue;
                     68:                }
                     69:                break;
                     70:        }
                     71:        if (op->op_term)
                     72:        {
                     73:                /* string quotes ? */
                     74:                if (op->op_token == Tokens.sp_quote)
                     75:                        return (string(op));
                     76: 
                     77:                /* comment indicator ? */
                     78:                if (op->op_token == Tokens.sp_bgncmnt)
                     79:                        return (comment());
                     80: 
                     81:                /* {sequal(opbuf, op->op_term)} */
                     82:                Opcode = op->op_code;
                     83:                yylval.u_dn = addsym(op->op_term);
                     84:                return (op->op_token);
                     85:        }
                     86:        yysemerr("bad operator", opbuf);
                     87: 
                     88:        /* operator not found, skip token and try again */
                     89:        return (CONTINUE);
                     90: }

unix.superglobalmegacorp.com

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