Annotation of 43BSD/ingres/source/parser/s_number.c, revision 1.1

1.1     ! root        1: # include      <ingres.h>
        !             2: # include      <aux.h>
        !             3: # include      "scanner.h"
        !             4: # include      <sccs.h>
        !             5: # include      <errors.h>
        !             6: 
        !             7: SCCSID(@(#)s_number.c  8.3     1/31/86)
        !             8: 
        !             9: /*
        !            10: ** NUMBER
        !            11: **     scans numerical constants (both integer and floating).  Each
        !            12: **     constant is converted from ascii to its numerical representation
        !            13: **     and is entered into the symbol table, indexed by 'yylval'.
        !            14: **     A token is returned for the number type.
        !            15: **
        !            16: **     due to the current atof in the utility library, floating overflow
        !            17: **     is not checked.
        !            18: */
        !            19: number(chr)
        !            20: char   chr;
        !            21: {
        !            22:        extern char     Cmap[];
        !            23:        extern int      yylval;
        !            24:        double          ftemp;
        !            25:        long            ltemp;
        !            26:        short           itemp;
        !            27:        char            buf[256];
        !            28:        register int    lsave;
        !            29:        register char   *ptr;
        !            30: 
        !            31:        lsave = Lcase;
        !            32:        Lcase = 0;
        !            33:        ptr = buf;
        !            34:        if ((*ptr = chr) != '.')
        !            35:        {
        !            36:                do
        !            37:                {
        !            38:                        /* get integer portion */
        !            39:                        if ((ptr - buf) >= 256)
        !            40:                                /* buffer overflow */
        !            41:                                par_error(NUMBUFOFLO, WARN, 0);
        !            42:                        *++ptr = get_scan(NORMAL);
        !            43:                } while (Cmap[*ptr] == NUMBR);
        !            44:        }
        !            45: 
        !            46:        /* do rest of type determination */
        !            47:        switch (*ptr)
        !            48:        {
        !            49:          case '.':
        !            50:                /* floating point */
        !            51:                do
        !            52:                {
        !            53:                        /* fill into ptr with up to next non-digit */
        !            54:                        if ((ptr - buf) >= 256)
        !            55:                                par_error(NUMBUFOFLO, WARN, 0); /* buf oflo */
        !            56:                        *++ptr = get_scan(NORMAL);
        !            57:                } while (Cmap[*ptr] == NUMBR);
        !            58:                if (*ptr != 'e' && *ptr != 'E')
        !            59:                {
        !            60:                        backup(*ptr);
        !            61:                        *ptr = 0;
        !            62:                        goto convr;
        !            63:                }
        !            64: 
        !            65:          case 'e':
        !            66:          case 'E':
        !            67:                if ((ptr - buf) >= 256)
        !            68:                        par_error(NUMBUFOFLO, WARN, 0); /* buf oflo */
        !            69:                *++ptr = get_scan(NORMAL);
        !            70:                if (Cmap[*ptr] == NUMBR || *ptr == '-' || *ptr == '+')
        !            71:                {
        !            72:                        do
        !            73:                        {
        !            74:                                /* get exponent */
        !            75:                                if ((ptr - buf) >= 256)
        !            76:                                        par_error(NUMBUFOFLO, WARN, 0); /* buf oflo */
        !            77:                                *++ptr = get_scan(NORMAL);
        !            78:                        } while (Cmap[*ptr] == NUMBR);
        !            79:                }
        !            80:                backup(*ptr);
        !            81:                *ptr = 0;
        !            82:        convr:
        !            83:                if (atof(buf, &ftemp))
        !            84:                        par_error(FCONSTERR, WARN, buf, 0);     /* floating conversion error */
        !            85:                yylval = syment(&ftemp, 8);
        !            86:                Lastok.toktyp = Tokens.f8const;
        !            87:                break;
        !            88: 
        !            89:          default:
        !            90:                /* integer */
        !            91:                backup(*ptr);
        !            92:                *ptr = 0;
        !            93:                if (atol(buf, &ltemp))  /* long conversion error */
        !            94:                        goto convr;
        !            95:                if (ltemp > 32767)
        !            96:                {
        !            97:                        yylval = syment(&ltemp, 4);
        !            98:                        Lastok.toktyp = Tokens.i4const;
        !            99:                        break;
        !           100:                }
        !           101:                itemp = ltemp;
        !           102:                yylval = syment(&itemp, 2);
        !           103:                Lastok.toktyp = Tokens.i2const;
        !           104:                break;
        !           105:        }
        !           106:        Lcase = lsave;
        !           107:        Lastok.tok = (char *) yylval;
        !           108:        Lastok.tokop = 0;
        !           109:        return (Lastok.toktyp);
        !           110: }

unix.superglobalmegacorp.com

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