|
|
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 "AS IS" ! 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 Mellon ! 24: * the rights to redistribute these changes. ! 25: */ ! 26: /* ! 27: * Author: David B. Golub, Carnegie Mellon University ! 28: * Date: 7/90 ! 29: */ ! 30: #include "mach_kdb.h" ! 31: #if MACH_KDB ! 32: ! 33: #include <mach/boolean.h> ! 34: #include <machine/db_machdep.h> ! 35: #include <ddb/db_lex.h> ! 36: #include <ddb/db_access.h> ! 37: #include <ddb/db_command.h> ! 38: #include <kern/task.h> ! 39: ! 40: ! 41: boolean_t ! 42: db_term(valuep) ! 43: db_expr_t *valuep; ! 44: { ! 45: int t; ! 46: ! 47: switch(t = db_read_token()) { ! 48: case tIDENT: ! 49: if (!db_value_of_name(db_tok_string, valuep)) { ! 50: db_printf("Symbol \"%s\" not found\n", db_tok_string); ! 51: db_error(0); ! 52: /*NOTREACHED*/ ! 53: } ! 54: return (TRUE); ! 55: case tNUMBER: ! 56: *valuep = db_tok_number; ! 57: return (TRUE); ! 58: case tDOT: ! 59: *valuep = (db_expr_t)db_dot; ! 60: return (TRUE); ! 61: case tDOTDOT: ! 62: *valuep = (db_expr_t)db_prev; ! 63: return (TRUE); ! 64: case tPLUS: ! 65: *valuep = (db_expr_t) db_next; ! 66: return (TRUE); ! 67: case tQUOTE: ! 68: *valuep = (db_expr_t)db_last_addr; ! 69: return (TRUE); ! 70: case tDOLLAR: ! 71: if (!db_get_variable(valuep)) ! 72: return (FALSE); ! 73: return (TRUE); ! 74: case tLPAREN: ! 75: if (!db_expression(valuep)) { ! 76: db_error("Unmached ()s\n"); ! 77: /*NOTREACHED*/ ! 78: } ! 79: t = db_read_token(); ! 80: if (t != tRPAREN) { ! 81: db_printf("')' expected at \"%s...\"\n", db_tok_string); ! 82: db_error(0); ! 83: /*NOTREACHED*/ ! 84: } ! 85: return (TRUE); ! 86: default: ! 87: db_unread_token(t); ! 88: return (FALSE); ! 89: } ! 90: } ! 91: ! 92: int ! 93: db_size_option(modif, u_option, t_option) ! 94: char *modif; ! 95: boolean_t *u_option; ! 96: boolean_t *t_option; ! 97: { ! 98: register char *p; ! 99: int size = sizeof(int); ! 100: ! 101: *u_option = FALSE; ! 102: *t_option = FALSE; ! 103: for (p = modif; *p; p++) { ! 104: switch(*p) { ! 105: case 'b': ! 106: size = sizeof(char); ! 107: break; ! 108: case 'h': ! 109: size = sizeof(short); ! 110: break; ! 111: case 'l': ! 112: size = sizeof(long); ! 113: break; ! 114: case 'u': ! 115: *u_option = TRUE; ! 116: break; ! 117: case 't': ! 118: *t_option = TRUE; ! 119: break; ! 120: } ! 121: } ! 122: return(size); ! 123: } ! 124: ! 125: boolean_t ! 126: db_unary(valuep) ! 127: db_expr_t *valuep; ! 128: { ! 129: int t; ! 130: int size; ! 131: boolean_t u_opt, t_opt; ! 132: task_t task; ! 133: extern task_t db_default_task; ! 134: ! 135: t = db_read_token(); ! 136: if (t == tMINUS) { ! 137: if (!db_unary(valuep)) { ! 138: db_error("Expression syntax error after '-'\n"); ! 139: /*NOTREACHED*/ ! 140: } ! 141: *valuep = -*valuep; ! 142: return (TRUE); ! 143: } ! 144: if (t == tSTAR) { ! 145: /* indirection */ ! 146: if (!db_unary(valuep)) { ! 147: db_error("Expression syntax error after '*'\n"); ! 148: /*NOTREACHED*/ ! 149: } ! 150: task = TASK_NULL; ! 151: size = sizeof(db_addr_t); ! 152: u_opt = FALSE; ! 153: t = db_read_token(); ! 154: if (t == tIDENT && db_tok_string[0] == ':') { ! 155: size = db_size_option(&db_tok_string[1], &u_opt, &t_opt); ! 156: if (t_opt) ! 157: task = db_default_task; ! 158: } else ! 159: db_unread_token(t); ! 160: *valuep = db_get_task_value((db_addr_t)*valuep, size, !u_opt, task); ! 161: return (TRUE); ! 162: } ! 163: if (t == tEXCL) { ! 164: if (!db_unary(valuep)) { ! 165: db_error("Expression syntax error after '!'\n"); ! 166: /*NOTREACHED*/ ! 167: } ! 168: *valuep = (!(*valuep)); ! 169: return (TRUE); ! 170: } ! 171: db_unread_token(t); ! 172: return (db_term(valuep)); ! 173: } ! 174: ! 175: boolean_t ! 176: db_mult_expr(valuep) ! 177: db_expr_t *valuep; ! 178: { ! 179: db_expr_t lhs, rhs; ! 180: int t; ! 181: char c; ! 182: ! 183: if (!db_unary(&lhs)) ! 184: return (FALSE); ! 185: ! 186: t = db_read_token(); ! 187: while (t == tSTAR || t == tSLASH || t == tPCT || t == tHASH ! 188: || t == tBIT_AND) { ! 189: c = db_tok_string[0]; ! 190: if (!db_term(&rhs)) { ! 191: db_printf("Expression syntax error after '%c'\n", c); ! 192: db_error(0); ! 193: /*NOTREACHED*/ ! 194: } ! 195: switch(t) { ! 196: case tSTAR: ! 197: lhs *= rhs; ! 198: break; ! 199: case tBIT_AND: ! 200: lhs &= rhs; ! 201: break; ! 202: default: ! 203: if (rhs == 0) { ! 204: db_error("Divide by 0\n"); ! 205: /*NOTREACHED*/ ! 206: } ! 207: if (t == tSLASH) ! 208: lhs /= rhs; ! 209: else if (t == tPCT) ! 210: lhs %= rhs; ! 211: else ! 212: lhs = ((lhs+rhs-1)/rhs)*rhs; ! 213: } ! 214: t = db_read_token(); ! 215: } ! 216: db_unread_token(t); ! 217: *valuep = lhs; ! 218: return (TRUE); ! 219: } ! 220: ! 221: boolean_t ! 222: db_add_expr(valuep) ! 223: db_expr_t *valuep; ! 224: { ! 225: db_expr_t lhs, rhs; ! 226: int t; ! 227: char c; ! 228: ! 229: if (!db_mult_expr(&lhs)) ! 230: return (FALSE); ! 231: ! 232: t = db_read_token(); ! 233: while (t == tPLUS || t == tMINUS || t == tBIT_OR) { ! 234: c = db_tok_string[0]; ! 235: if (!db_mult_expr(&rhs)) { ! 236: db_printf("Expression syntax error after '%c'\n", c); ! 237: db_error(0); ! 238: /*NOTREACHED*/ ! 239: } ! 240: if (t == tPLUS) ! 241: lhs += rhs; ! 242: else if (t == tMINUS) ! 243: lhs -= rhs; ! 244: else ! 245: lhs |= rhs; ! 246: t = db_read_token(); ! 247: } ! 248: db_unread_token(t); ! 249: *valuep = lhs; ! 250: return (TRUE); ! 251: } ! 252: ! 253: boolean_t ! 254: db_shift_expr(valuep) ! 255: db_expr_t *valuep; ! 256: { ! 257: db_expr_t lhs, rhs; ! 258: int t; ! 259: ! 260: if (!db_add_expr(&lhs)) ! 261: return (FALSE); ! 262: ! 263: t = db_read_token(); ! 264: while (t == tSHIFT_L || t == tSHIFT_R) { ! 265: if (!db_add_expr(&rhs)) { ! 266: db_printf("Expression syntax error after \"%s\"\n", ! 267: (t == tSHIFT_L)? "<<": ">>"); ! 268: db_error(0); ! 269: /*NOTREACHED*/ ! 270: } ! 271: if (rhs < 0) { ! 272: db_error("Negative shift amount\n"); ! 273: /*NOTREACHED*/ ! 274: } ! 275: if (t == tSHIFT_L) ! 276: lhs <<= rhs; ! 277: else { ! 278: /* Shift right is unsigned */ ! 279: lhs = (natural_t) lhs >> rhs; ! 280: } ! 281: t = db_read_token(); ! 282: } ! 283: db_unread_token(t); ! 284: *valuep = lhs; ! 285: return (TRUE); ! 286: } ! 287: ! 288: boolean_t ! 289: db_logical_relation_expr(valuep) ! 290: db_expr_t *valuep; ! 291: { ! 292: db_expr_t lhs, rhs; ! 293: int t; ! 294: char op[3]; ! 295: ! 296: if (!db_shift_expr(&lhs)) ! 297: return(FALSE); ! 298: ! 299: t = db_read_token(); ! 300: while (t == tLOG_EQ || t == tLOG_NOT_EQ ! 301: || t == tGREATER || t == tGREATER_EQ ! 302: || t == tLESS || t == tLESS_EQ) { ! 303: op[0] = db_tok_string[0]; ! 304: op[1] = db_tok_string[1]; ! 305: op[2] = 0; ! 306: if (!db_shift_expr(&rhs)) { ! 307: db_printf("Expression syntax error after \"%s\"\n", op); ! 308: db_error(0); ! 309: /*NOTREACHED*/ ! 310: } ! 311: switch(t) { ! 312: case tLOG_EQ: ! 313: lhs = (lhs == rhs); ! 314: break; ! 315: case tLOG_NOT_EQ: ! 316: lhs = (lhs != rhs); ! 317: break; ! 318: case tGREATER: ! 319: lhs = (lhs > rhs); ! 320: break; ! 321: case tGREATER_EQ: ! 322: lhs = (lhs >= rhs); ! 323: break; ! 324: case tLESS: ! 325: lhs = (lhs < rhs); ! 326: break; ! 327: case tLESS_EQ: ! 328: lhs = (lhs <= rhs); ! 329: break; ! 330: } ! 331: t = db_read_token(); ! 332: } ! 333: db_unread_token(t); ! 334: *valuep = lhs; ! 335: return (TRUE); ! 336: } ! 337: ! 338: boolean_t ! 339: db_logical_and_expr(valuep) ! 340: db_expr_t *valuep; ! 341: { ! 342: db_expr_t lhs, rhs; ! 343: int t; ! 344: ! 345: if (!db_logical_relation_expr(&lhs)) ! 346: return(FALSE); ! 347: ! 348: t = db_read_token(); ! 349: while (t == tLOG_AND) { ! 350: if (!db_logical_relation_expr(&rhs)) { ! 351: db_error("Expression syntax error after \"&&\"\n"); ! 352: /*NOTREACHED*/ ! 353: } ! 354: lhs = (lhs && rhs); ! 355: } ! 356: db_unread_token(t); ! 357: *valuep = lhs; ! 358: return (TRUE); ! 359: } ! 360: ! 361: boolean_t ! 362: db_logical_or_expr(valuep) ! 363: db_expr_t *valuep; ! 364: { ! 365: db_expr_t lhs, rhs; ! 366: int t; ! 367: ! 368: if (!db_logical_and_expr(&lhs)) ! 369: return(FALSE); ! 370: ! 371: t = db_read_token(); ! 372: while (t == tLOG_OR) { ! 373: if (!db_logical_and_expr(&rhs)) { ! 374: db_error("Expression syntax error after \"||\"\n"); ! 375: /*NOTREACHED*/ ! 376: } ! 377: lhs = (lhs || rhs); ! 378: } ! 379: db_unread_token(t); ! 380: *valuep = lhs; ! 381: return (TRUE); ! 382: } ! 383: ! 384: int ! 385: db_expression(valuep) ! 386: db_expr_t *valuep; ! 387: { ! 388: return (db_logical_or_expr(valuep)); ! 389: } ! 390: ! 391: #endif MACH_KDB
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.