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