Annotation of Net2/ddb/db_lex.c, revision 1.1.1.1

1.1       root        1: /* 
                      2:  * Mach Operating System
                      3:  * Copyright (c) 1991,1990 Carnegie Mellon University
                      4:  * All Rights Reserved.
                      5:  * 
                      6:  * Permission to use, copy, modify and distribute this software and its
                      7:  * documentation is hereby granted, provided that both the copyright
                      8:  * notice and this permission notice appear in all copies of the
                      9:  * software, derivative works or modified versions, and any portions
                     10:  * thereof, and that both notices appear in supporting documentation.
                     11:  * 
                     12:  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS 
                     13:  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
                     14:  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
                     15:  * 
                     16:  * Carnegie Mellon requests users of this software to return to
                     17:  * 
                     18:  *  Software Distribution Coordinator  or  [email protected]
                     19:  *  School of Computer Science
                     20:  *  Carnegie Mellon University
                     21:  *  Pittsburgh PA 15213-3890
                     22:  * 
                     23:  * any improvements or extensions that they make and grant Carnegie the
                     24:  * rights to redistribute these changes.
                     25:  */
                     26: /*
                     27:  * HISTORY
                     28:  * $Log: db_lex.c,v $
                     29:  * Revision 1.1  1992/03/25  21:45:13  pace
                     30:  * Initial revision
                     31:  *
                     32:  * Revision 2.3  91/02/05  17:06:36  mrt
                     33:  *     Changed to new Mach copyright
                     34:  *     [91/01/31  16:18:20  mrt]
                     35:  * 
                     36:  * Revision 2.2  90/08/27  21:51:10  dbg
                     37:  *     Add 'dotdot' token.
                     38:  *     [90/08/22            dbg]
                     39:  * 
                     40:  *     Allow backslash to quote any character into an identifier.
                     41:  *     Allow colon in identifier for symbol table qualification.
                     42:  *     [90/08/16            dbg]
                     43:  *     Reduce lint.
                     44:  *     [90/08/07            dbg]
                     45:  *     Created.
                     46:  *     [90/07/25            dbg]
                     47:  * 
                     48:  */
                     49: /*
                     50:  *     Author: David B. Golub, Carnegie Mellon University
                     51:  *     Date:   7/90
                     52:  */
                     53: /*
                     54:  * Lexical analyzer.
                     55:  */
                     56: #include <ddb/db_lex.h>
                     57: 
                     58: char   db_line[120];
                     59: char * db_lp, *db_endlp;
                     60: 
                     61: int
                     62: db_read_line()
                     63: {
                     64:        int     i;
                     65: 
                     66:        i = db_readline(db_line, sizeof(db_line));
                     67:        if (i == 0)
                     68:            return (0); /* EOI */
                     69:        db_lp = db_line;
                     70:        db_endlp = db_lp + i;
                     71:        return (i);
                     72: }
                     73: 
                     74: void
                     75: db_flush_line()
                     76: {
                     77:        db_lp = db_line;
                     78:        db_endlp = db_line;
                     79: }
                     80: 
                     81: int    db_look_char = 0;
                     82: 
                     83: int
                     84: db_read_char()
                     85: {
                     86:        int     c;
                     87: 
                     88:        if (db_look_char != 0) {
                     89:            c = db_look_char;
                     90:            db_look_char = 0;
                     91:        }
                     92:        else if (db_lp >= db_endlp)
                     93:            c = -1;
                     94:        else 
                     95:            c = *db_lp++;
                     96:        return (c);
                     97: }
                     98: 
                     99: void
                    100: db_unread_char(c)
                    101: {
                    102:        db_look_char = c;
                    103: }
                    104: 
                    105: int    db_look_token = 0;
                    106: 
                    107: void
                    108: db_unread_token(t)
                    109:        int     t;
                    110: {
                    111:        db_look_token = t;
                    112: }
                    113: 
                    114: int
                    115: db_read_token()
                    116: {
                    117:        int     t;
                    118: 
                    119:        if (db_look_token) {
                    120:            t = db_look_token;
                    121:            db_look_token = 0;
                    122:        }
                    123:        else
                    124:            t = db_lex();
                    125:        return (t);
                    126: }
                    127: 
                    128: int    db_tok_number;
                    129: char   db_tok_string[TOK_STRING_SIZE];
                    130: 
                    131: int    db_radix = 16;
                    132: 
                    133: void
                    134: db_flush_lex()
                    135: {
                    136:        db_flush_line();
                    137:        db_look_char = 0;
                    138:        db_look_token = 0;
                    139: }
                    140: 
                    141: int
                    142: db_lex()
                    143: {
                    144:        int     c;
                    145: 
                    146:        c = db_read_char();
                    147:        while (c <= ' ' || c > '~') {
                    148:            if (c == '\n' || c == -1)
                    149:                return (tEOL);
                    150:            c = db_read_char();
                    151:        }
                    152: 
                    153:        if (c >= '0' && c <= '9') {
                    154:            /* number */
                    155:            int r, digit;
                    156: 
                    157:            if (c > '0')
                    158:                r = db_radix;
                    159:            else {
                    160:                c = db_read_char();
                    161:                if (c == 'O' || c == 'o')
                    162:                    r = 8;
                    163:                else if (c == 'T' || c == 't')
                    164:                    r = 10;
                    165:                else if (c == 'X' || c == 'x')
                    166:                    r = 16;
                    167:                else {
                    168:                    r = db_radix;
                    169:                    db_unread_char(c);
                    170:                }
                    171:                c = db_read_char();
                    172:            }
                    173:            db_tok_number = 0;
                    174:            for (;;) {
                    175:                if (c >= '0' && c <= ((r == 8) ? '7' : '9'))
                    176:                    digit = c - '0';
                    177:                else if (r == 16 && ((c >= 'A' && c <= 'F') ||
                    178:                                     (c >= 'a' && c <= 'f'))) {
                    179:                    if (c >= 'a')
                    180:                        digit = c - 'a' + 10;
                    181:                    else if (c >= 'A')
                    182:                        digit = c - 'A' + 10;
                    183:                }
                    184:                else
                    185:                    break;
                    186:                db_tok_number = db_tok_number * r + digit;
                    187:                c = db_read_char();
                    188:            }
                    189:            if ((c >= '0' && c <= '9') ||
                    190:                (c >= 'A' && c <= 'Z') ||
                    191:                (c >= 'a' && c <= 'z') ||
                    192:                (c == '_'))
                    193:            {
                    194:                db_error("Bad character in number\n");
                    195:                db_flush_lex();
                    196:                return (tEOF);
                    197:            }
                    198:            db_unread_char(c);
                    199:            return (tNUMBER);
                    200:        }
                    201:        if ((c >= 'A' && c <= 'Z') ||
                    202:            (c >= 'a' && c <= 'z') ||
                    203:            c == '_' || c == '\\')
                    204:        {
                    205:            /* string */
                    206:            char *cp;
                    207: 
                    208:            cp = db_tok_string;
                    209:            if (c == '\\') {
                    210:                c = db_read_char();
                    211:                if (c == '\n' || c == -1)
                    212:                    db_error("Bad escape\n");
                    213:            }
                    214:            *cp++ = c;
                    215:            while (1) {
                    216:                c = db_read_char();
                    217:                if ((c >= 'A' && c <= 'Z') ||
                    218:                    (c >= 'a' && c <= 'z') ||
                    219:                    (c >= '0' && c <= '9') ||
                    220:                    c == '_' || c == '\\' || c == ':')
                    221:                {
                    222:                    if (c == '\\') {
                    223:                        c = db_read_char();
                    224:                        if (c == '\n' || c == -1)
                    225:                            db_error("Bad escape\n");
                    226:                    }
                    227:                    *cp++ = c;
                    228:                    if (cp == db_tok_string+sizeof(db_tok_string)) {
                    229:                        db_error("String too long\n");
                    230:                        db_flush_lex();
                    231:                        return (tEOF);
                    232:                    }
                    233:                    continue;
                    234:                }
                    235:                else {
                    236:                    *cp = '\0';
                    237:                    break;
                    238:                }
                    239:            }
                    240:            db_unread_char(c);
                    241:            return (tIDENT);
                    242:        }
                    243: 
                    244:        switch (c) {
                    245:            case '+':
                    246:                return (tPLUS);
                    247:            case '-':
                    248:                return (tMINUS);
                    249:            case '.':
                    250:                c = db_read_char();
                    251:                if (c == '.')
                    252:                    return (tDOTDOT);
                    253:                db_unread_char(c);
                    254:                return (tDOT);
                    255:            case '*':
                    256:                return (tSTAR);
                    257:            case '/':
                    258:                return (tSLASH);
                    259:            case '=':
                    260:                return (tEQ);
                    261:            case '%':
                    262:                return (tPCT);
                    263:            case '#':
                    264:                return (tHASH);
                    265:            case '(':
                    266:                return (tLPAREN);
                    267:            case ')':
                    268:                return (tRPAREN);
                    269:            case ',':
                    270:                return (tCOMMA);
                    271:            case '"':
                    272:                return (tDITTO);
                    273:            case '$':
                    274:                return (tDOLLAR);
                    275:            case '!':
                    276:                return (tEXCL);
                    277:            case '<':
                    278:                c = db_read_char();
                    279:                if (c == '<')
                    280:                    return (tSHIFT_L);
                    281:                db_unread_char(c);
                    282:                break;
                    283:            case '>':
                    284:                c = db_read_char();
                    285:                if (c == '>')
                    286:                    return (tSHIFT_R);
                    287:                db_unread_char(c);
                    288:                break;
                    289:            case -1:
                    290:                return (tEOF);
                    291:        }
                    292:        db_printf("Bad character\n");
                    293:        db_flush_lex();
                    294:        return (tEOF);
                    295: }

unix.superglobalmegacorp.com

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