|
|
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_expr.c,v $ ! 29: * Revision 1.1 1992/03/25 21:45:09 pace ! 30: * Initial revision ! 31: * ! 32: * Revision 2.3 91/02/05 17:06:25 mrt ! 33: * Changed to new Mach copyright ! 34: * [91/01/31 16:17:46 mrt] ! 35: * ! 36: * Revision 2.2 90/08/27 21:50:57 dbg ! 37: * Use '..' instead of '$$' for db_prev. ! 38: * Use '+' for db_next. ! 39: * [90/08/22 dbg] ! 40: * ! 41: * Allow repeated unary operators. ! 42: * [90/08/20 dbg] ! 43: * ! 44: * Reflected back rename of db_symbol_value->db_value_of_name ! 45: * [90/08/20 af] ! 46: * Reduce lint. ! 47: * [90/08/07 dbg] ! 48: * Created. ! 49: * [90/07/25 dbg] ! 50: * ! 51: */ ! 52: /* ! 53: * Author: David B. Golub, Carnegie Mellon University ! 54: * Date: 7/90 ! 55: */ ! 56: #include "param.h" ! 57: #include "proc.h" ! 58: #include <machine/db_machdep.h> ! 59: #include <ddb/db_lex.h> ! 60: #include <ddb/db_access.h> ! 61: #include <ddb/db_command.h> ! 62: ! 63: boolean_t ! 64: db_term(valuep) ! 65: db_expr_t *valuep; ! 66: { ! 67: int t; ! 68: ! 69: t = db_read_token(); ! 70: if (t == tIDENT) { ! 71: if (!db_value_of_name(db_tok_string, valuep)) { ! 72: db_error("Symbol not found\n"); ! 73: /*NOTREACHED*/ ! 74: } ! 75: return (TRUE); ! 76: } ! 77: if (t == tNUMBER) { ! 78: *valuep = (db_expr_t)db_tok_number; ! 79: return (TRUE); ! 80: } ! 81: if (t == tDOT) { ! 82: *valuep = (db_expr_t)db_dot; ! 83: return (TRUE); ! 84: } ! 85: if (t == tDOTDOT) { ! 86: *valuep = (db_expr_t)db_prev; ! 87: return (TRUE); ! 88: } ! 89: if (t == tPLUS) { ! 90: *valuep = (db_expr_t) db_next; ! 91: return (TRUE); ! 92: } ! 93: if (t == tDITTO) { ! 94: *valuep = (db_expr_t)db_last_addr; ! 95: return (TRUE); ! 96: } ! 97: if (t == tDOLLAR) { ! 98: if (!db_get_variable(valuep)) ! 99: return (FALSE); ! 100: return (TRUE); ! 101: } ! 102: if (t == tLPAREN) { ! 103: if (!db_expression(valuep)) { ! 104: db_error("Syntax error\n"); ! 105: /*NOTREACHED*/ ! 106: } ! 107: t = db_read_token(); ! 108: if (t != tRPAREN) { ! 109: db_error("Syntax error\n"); ! 110: /*NOTREACHED*/ ! 111: } ! 112: return (TRUE); ! 113: } ! 114: db_unread_token(t); ! 115: return (FALSE); ! 116: } ! 117: ! 118: boolean_t ! 119: db_unary(valuep) ! 120: db_expr_t *valuep; ! 121: { ! 122: int t; ! 123: ! 124: t = db_read_token(); ! 125: if (t == tMINUS) { ! 126: if (!db_unary(valuep)) { ! 127: db_error("Syntax error\n"); ! 128: /*NOTREACHED*/ ! 129: } ! 130: *valuep = -*valuep; ! 131: return (TRUE); ! 132: } ! 133: if (t == tSTAR) { ! 134: /* indirection */ ! 135: if (!db_unary(valuep)) { ! 136: db_error("Syntax error\n"); ! 137: /*NOTREACHED*/ ! 138: } ! 139: *valuep = db_get_value((db_addr_t)*valuep, sizeof(int), FALSE); ! 140: return (TRUE); ! 141: } ! 142: db_unread_token(t); ! 143: return (db_term(valuep)); ! 144: } ! 145: ! 146: boolean_t ! 147: db_mult_expr(valuep) ! 148: db_expr_t *valuep; ! 149: { ! 150: db_expr_t lhs, rhs; ! 151: int t; ! 152: ! 153: if (!db_unary(&lhs)) ! 154: return (FALSE); ! 155: ! 156: t = db_read_token(); ! 157: while (t == tSTAR || t == tSLASH || t == tPCT || t == tHASH) { ! 158: if (!db_term(&rhs)) { ! 159: db_error("Syntax error\n"); ! 160: /*NOTREACHED*/ ! 161: } ! 162: if (t == tSTAR) ! 163: lhs *= rhs; ! 164: else { ! 165: if (rhs == 0) { ! 166: db_error("Divide by 0\n"); ! 167: /*NOTREACHED*/ ! 168: } ! 169: if (t == tSLASH) ! 170: lhs /= rhs; ! 171: else if (t == tPCT) ! 172: lhs %= rhs; ! 173: else ! 174: lhs = ((lhs+rhs-1)/rhs)*rhs; ! 175: } ! 176: t = db_read_token(); ! 177: } ! 178: db_unread_token(t); ! 179: *valuep = lhs; ! 180: return (TRUE); ! 181: } ! 182: ! 183: boolean_t ! 184: db_add_expr(valuep) ! 185: db_expr_t *valuep; ! 186: { ! 187: db_expr_t lhs, rhs; ! 188: int t; ! 189: ! 190: if (!db_mult_expr(&lhs)) ! 191: return (FALSE); ! 192: ! 193: t = db_read_token(); ! 194: while (t == tPLUS || t == tMINUS) { ! 195: if (!db_mult_expr(&rhs)) { ! 196: db_error("Syntax error\n"); ! 197: /*NOTREACHED*/ ! 198: } ! 199: if (t == tPLUS) ! 200: lhs += rhs; ! 201: else ! 202: lhs -= rhs; ! 203: t = db_read_token(); ! 204: } ! 205: db_unread_token(t); ! 206: *valuep = lhs; ! 207: return (TRUE); ! 208: } ! 209: ! 210: boolean_t ! 211: db_shift_expr(valuep) ! 212: db_expr_t *valuep; ! 213: { ! 214: db_expr_t lhs, rhs; ! 215: int t; ! 216: ! 217: if (!db_add_expr(&lhs)) ! 218: return (FALSE); ! 219: ! 220: t = db_read_token(); ! 221: while (t == tSHIFT_L || t == tSHIFT_R) { ! 222: if (!db_add_expr(&rhs)) { ! 223: db_error("Syntax error\n"); ! 224: /*NOTREACHED*/ ! 225: } ! 226: if (rhs < 0) { ! 227: db_error("Negative shift amount\n"); ! 228: /*NOTREACHED*/ ! 229: } ! 230: if (t == tSHIFT_L) ! 231: lhs <<= rhs; ! 232: else { ! 233: /* Shift right is unsigned */ ! 234: lhs = (unsigned) lhs >> rhs; ! 235: } ! 236: t = db_read_token(); ! 237: } ! 238: db_unread_token(t); ! 239: *valuep = lhs; ! 240: return (TRUE); ! 241: } ! 242: ! 243: int ! 244: db_expression(valuep) ! 245: db_expr_t *valuep; ! 246: { ! 247: return (db_shift_expr(valuep)); ! 248: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.