Annotation of sys/ddb/db_expr.c, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: db_expr.c,v 1.8 2006/03/13 06:23:20 jsg Exp $ */
! 2: /* $NetBSD: db_expr.c,v 1.5 1996/02/05 01:56:58 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: #include <sys/param.h>
! 34: #include <sys/proc.h>
! 35:
! 36: #include <uvm/uvm_extern.h>
! 37:
! 38: #include <machine/db_machdep.h>
! 39:
! 40: #include <ddb/db_lex.h>
! 41: #include <ddb/db_access.h>
! 42: #include <ddb/db_command.h>
! 43: #include <ddb/db_sym.h>
! 44: #include <ddb/db_extern.h>
! 45: #include <ddb/db_variables.h>
! 46:
! 47: boolean_t
! 48: db_term(db_expr_t *valuep)
! 49: {
! 50: int t;
! 51:
! 52: t = db_read_token();
! 53: if (t == tIDENT) {
! 54: if (!db_value_of_name(db_tok_string, valuep)) {
! 55: db_error("Symbol not found\n");
! 56: /*NOTREACHED*/
! 57: }
! 58: return (TRUE);
! 59: }
! 60: if (t == tNUMBER) {
! 61: *valuep = db_tok_number;
! 62: return (TRUE);
! 63: }
! 64: if (t == tDOT) {
! 65: *valuep = (db_expr_t)db_dot;
! 66: return (TRUE);
! 67: }
! 68: if (t == tDOTDOT) {
! 69: *valuep = (db_expr_t)db_prev;
! 70: return (TRUE);
! 71: }
! 72: if (t == tPLUS) {
! 73: *valuep = (db_expr_t) db_next;
! 74: return (TRUE);
! 75: }
! 76: if (t == tDITTO) {
! 77: *valuep = (db_expr_t)db_last_addr;
! 78: return (TRUE);
! 79: }
! 80: if (t == tDOLLAR) {
! 81: if (!db_get_variable(valuep))
! 82: return (FALSE);
! 83: return (TRUE);
! 84: }
! 85: if (t == tLPAREN) {
! 86: if (!db_expression(valuep)) {
! 87: db_error("Syntax error\n");
! 88: /*NOTREACHED*/
! 89: }
! 90: t = db_read_token();
! 91: if (t != tRPAREN) {
! 92: db_error("Syntax error\n");
! 93: /*NOTREACHED*/
! 94: }
! 95: return (TRUE);
! 96: }
! 97: db_unread_token(t);
! 98: return (FALSE);
! 99: }
! 100:
! 101: boolean_t
! 102: db_unary(db_expr_t *valuep)
! 103: {
! 104: int t;
! 105:
! 106: t = db_read_token();
! 107: if (t == tMINUS) {
! 108: if (!db_unary(valuep)) {
! 109: db_error("Syntax error\n");
! 110: /*NOTREACHED*/
! 111: }
! 112: *valuep = -*valuep;
! 113: return (TRUE);
! 114: }
! 115: if (t == tSTAR) {
! 116: /* indirection */
! 117: if (!db_unary(valuep)) {
! 118: db_error("Syntax error\n");
! 119: /*NOTREACHED*/
! 120: }
! 121: *valuep = db_get_value((db_addr_t)*valuep, sizeof(int), FALSE);
! 122: return (TRUE);
! 123: }
! 124: db_unread_token(t);
! 125: return (db_term(valuep));
! 126: }
! 127:
! 128: boolean_t
! 129: db_mult_expr(db_expr_t *valuep)
! 130: {
! 131: db_expr_t lhs, rhs;
! 132: int t;
! 133:
! 134: if (!db_unary(&lhs))
! 135: return (FALSE);
! 136:
! 137: t = db_read_token();
! 138: while (t == tSTAR || t == tSLASH || t == tPCT || t == tHASH) {
! 139: if (!db_term(&rhs)) {
! 140: db_error("Syntax error\n");
! 141: /*NOTREACHED*/
! 142: }
! 143: if (t == tSTAR)
! 144: lhs *= rhs;
! 145: else {
! 146: if (rhs == 0) {
! 147: db_error("Divide by 0\n");
! 148: /*NOTREACHED*/
! 149: }
! 150: if (t == tSLASH)
! 151: lhs /= rhs;
! 152: else if (t == tPCT)
! 153: lhs %= rhs;
! 154: else
! 155: lhs = ((lhs+rhs-1)/rhs)*rhs;
! 156: }
! 157: t = db_read_token();
! 158: }
! 159: db_unread_token(t);
! 160: *valuep = lhs;
! 161: return (TRUE);
! 162: }
! 163:
! 164: boolean_t
! 165: db_add_expr(db_expr_t *valuep)
! 166: {
! 167: db_expr_t lhs, rhs;
! 168: int t;
! 169:
! 170: if (!db_mult_expr(&lhs))
! 171: return (FALSE);
! 172:
! 173: t = db_read_token();
! 174: while (t == tPLUS || t == tMINUS) {
! 175: if (!db_mult_expr(&rhs)) {
! 176: db_error("Syntax error\n");
! 177: /*NOTREACHED*/
! 178: }
! 179: if (t == tPLUS)
! 180: lhs += rhs;
! 181: else
! 182: lhs -= rhs;
! 183: t = db_read_token();
! 184: }
! 185: db_unread_token(t);
! 186: *valuep = lhs;
! 187: return (TRUE);
! 188: }
! 189:
! 190: boolean_t
! 191: db_shift_expr(db_expr_t *valuep)
! 192: {
! 193: db_expr_t lhs, rhs;
! 194: int t;
! 195:
! 196: if (!db_add_expr(&lhs))
! 197: return (FALSE);
! 198:
! 199: t = db_read_token();
! 200: while (t == tSHIFT_L || t == tSHIFT_R) {
! 201: if (!db_add_expr(&rhs)) {
! 202: db_error("Syntax error\n");
! 203: /*NOTREACHED*/
! 204: }
! 205: if (rhs < 0) {
! 206: db_error("Negative shift amount\n");
! 207: /*NOTREACHED*/
! 208: }
! 209: if (t == tSHIFT_L)
! 210: lhs <<= rhs;
! 211: else {
! 212: /* Shift right is unsigned */
! 213: lhs = (unsigned) lhs >> rhs;
! 214: }
! 215: t = db_read_token();
! 216: }
! 217: db_unread_token(t);
! 218: *valuep = lhs;
! 219: return (TRUE);
! 220: }
! 221:
! 222: int
! 223: db_expression(db_expr_t *valuep)
! 224: {
! 225: return (db_shift_expr(valuep));
! 226: }
CVSweb