[BACK]Return to db_lex.c CVS log [TXT][DIR] Up to [local] / sys / ddb

Annotation of sys/ddb/db_lex.c, Revision 1.1

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

CVSweb