Home | History | Annotate | Line # | Download | only in ddb
db_expr.c revision 1.11.4.1
      1  1.11.4.1   thorpej /*	$NetBSD: db_expr.c,v 1.11.4.1 2002/01/10 19:52:38 thorpej Exp $	*/
      2       1.4       cgd 
      3       1.1       cgd /*
      4       1.1       cgd  * Mach Operating System
      5       1.1       cgd  * Copyright (c) 1991,1990 Carnegie Mellon University
      6       1.1       cgd  * All Rights Reserved.
      7       1.1       cgd  *
      8       1.1       cgd  * Permission to use, copy, modify and distribute this software and its
      9       1.1       cgd  * documentation is hereby granted, provided that both the copyright
     10       1.1       cgd  * notice and this permission notice appear in all copies of the
     11       1.1       cgd  * software, derivative works or modified versions, and any portions
     12       1.1       cgd  * thereof, and that both notices appear in supporting documentation.
     13       1.1       cgd  *
     14       1.9        pk  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
     15       1.1       cgd  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
     16       1.1       cgd  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
     17       1.1       cgd  *
     18       1.1       cgd  * Carnegie Mellon requests users of this software to return to
     19       1.1       cgd  *
     20       1.1       cgd  *  Software Distribution Coordinator  or  Software.Distribution (at) CS.CMU.EDU
     21       1.1       cgd  *  School of Computer Science
     22       1.1       cgd  *  Carnegie Mellon University
     23       1.1       cgd  *  Pittsburgh PA 15213-3890
     24       1.1       cgd  *
     25       1.1       cgd  * any improvements or extensions that they make and grant Carnegie the
     26       1.1       cgd  * rights to redistribute these changes.
     27       1.2       cgd  *
     28       1.1       cgd  *	Author: David B. Golub, Carnegie Mellon University
     29       1.1       cgd  *	Date:	7/90
     30       1.1       cgd  */
     31  1.11.4.1   thorpej 
     32  1.11.4.1   thorpej #include <sys/cdefs.h>
     33  1.11.4.1   thorpej __KERNEL_RCSID(0, "$NetBSD: db_expr.c,v 1.11.4.1 2002/01/10 19:52:38 thorpej Exp $");
     34       1.3   mycroft 
     35       1.3   mycroft #include <sys/param.h>
     36       1.3   mycroft #include <sys/proc.h>
     37       1.3   mycroft 
     38       1.1       cgd #include <machine/db_machdep.h>
     39       1.3   mycroft 
     40       1.1       cgd #include <ddb/db_lex.h>
     41       1.1       cgd #include <ddb/db_access.h>
     42       1.1       cgd #include <ddb/db_command.h>
     43       1.5  christos #include <ddb/db_sym.h>
     44       1.5  christos #include <ddb/db_extern.h>
     45       1.5  christos #include <ddb/db_variables.h>
     46       1.1       cgd 
     47       1.1       cgd boolean_t
     48       1.1       cgd db_term(valuep)
     49       1.1       cgd 	db_expr_t *valuep;
     50       1.1       cgd {
     51       1.1       cgd 	int	t;
     52       1.1       cgd 
     53       1.1       cgd 	t = db_read_token();
     54       1.1       cgd 	if (t == tIDENT) {
     55       1.1       cgd 	    if (!db_value_of_name(db_tok_string, valuep)) {
     56      1.10       eeh 		extern int  db_radix;
     57      1.10       eeh 		db_expr_t v = 0;
     58      1.10       eeh 		int	i, c, byte;
     59      1.10       eeh 
     60      1.10       eeh 		/* See if we can make a number out of all of it */
     61      1.11   mycroft 		for (i = 0; (c = db_tok_string[i]) != '\0'; i++) {
     62      1.10       eeh 		    byte = 0;
     63      1.10       eeh 		    if (c >= '0' && c <= '9')
     64      1.10       eeh 			    byte = c - '0';
     65      1.10       eeh 		    else if (db_radix == 16 && c >= 'a' && c <= 'f')
     66      1.10       eeh 			    byte = c - 'a' + 10;
     67      1.10       eeh 		    else if (db_radix == 16 && c >= 'A' && c <= 'F')
     68      1.10       eeh 			    byte = c - 'A' + 10;
     69      1.10       eeh 		    else
     70      1.10       eeh 			    db_error("Symbol not found\n");
     71      1.10       eeh 			    /*NOTREACHED*/
     72      1.10       eeh 		    v = v * db_radix + byte;
     73      1.10       eeh 		}
     74      1.10       eeh 		*valuep = (db_expr_t)v;
     75       1.1       cgd 	    }
     76       1.1       cgd 	    return (TRUE);
     77       1.1       cgd 	}
     78       1.1       cgd 	if (t == tNUMBER) {
     79       1.1       cgd 	    *valuep = (db_expr_t)db_tok_number;
     80       1.1       cgd 	    return (TRUE);
     81       1.1       cgd 	}
     82       1.1       cgd 	if (t == tDOT) {
     83       1.1       cgd 	    *valuep = (db_expr_t)db_dot;
     84       1.1       cgd 	    return (TRUE);
     85       1.1       cgd 	}
     86       1.1       cgd 	if (t == tDOTDOT) {
     87       1.1       cgd 	    *valuep = (db_expr_t)db_prev;
     88       1.1       cgd 	    return (TRUE);
     89       1.1       cgd 	}
     90       1.1       cgd 	if (t == tPLUS) {
     91       1.1       cgd 	    *valuep = (db_expr_t) db_next;
     92       1.1       cgd 	    return (TRUE);
     93       1.1       cgd 	}
     94       1.1       cgd 	if (t == tDITTO) {
     95       1.1       cgd 	    *valuep = (db_expr_t)db_last_addr;
     96       1.1       cgd 	    return (TRUE);
     97       1.1       cgd 	}
     98       1.1       cgd 	if (t == tDOLLAR) {
     99       1.1       cgd 	    if (!db_get_variable(valuep))
    100       1.1       cgd 		return (FALSE);
    101       1.1       cgd 	    return (TRUE);
    102       1.1       cgd 	}
    103       1.1       cgd 	if (t == tLPAREN) {
    104       1.1       cgd 	    if (!db_expression(valuep)) {
    105       1.1       cgd 		db_error("Syntax error\n");
    106       1.1       cgd 		/*NOTREACHED*/
    107       1.1       cgd 	    }
    108       1.1       cgd 	    t = db_read_token();
    109       1.1       cgd 	    if (t != tRPAREN) {
    110       1.1       cgd 		db_error("Syntax error\n");
    111       1.1       cgd 		/*NOTREACHED*/
    112       1.1       cgd 	    }
    113       1.1       cgd 	    return (TRUE);
    114       1.1       cgd 	}
    115       1.1       cgd 	db_unread_token(t);
    116       1.1       cgd 	return (FALSE);
    117       1.1       cgd }
    118       1.1       cgd 
    119       1.1       cgd boolean_t
    120       1.1       cgd db_unary(valuep)
    121       1.1       cgd 	db_expr_t *valuep;
    122       1.1       cgd {
    123       1.1       cgd 	int	t;
    124       1.1       cgd 
    125       1.1       cgd 	t = db_read_token();
    126       1.1       cgd 	if (t == tMINUS) {
    127       1.1       cgd 	    if (!db_unary(valuep)) {
    128       1.1       cgd 		db_error("Syntax error\n");
    129       1.1       cgd 		/*NOTREACHED*/
    130       1.1       cgd 	    }
    131       1.1       cgd 	    *valuep = -*valuep;
    132       1.1       cgd 	    return (TRUE);
    133       1.1       cgd 	}
    134       1.1       cgd 	if (t == tSTAR) {
    135       1.1       cgd 	    /* indirection */
    136       1.1       cgd 	    if (!db_unary(valuep)) {
    137       1.1       cgd 		db_error("Syntax error\n");
    138       1.1       cgd 		/*NOTREACHED*/
    139       1.1       cgd 	    }
    140       1.7   thorpej 	    *valuep = db_get_value((db_addr_t)*valuep, sizeof(db_expr_t),
    141       1.7   thorpej 	        FALSE);
    142       1.1       cgd 	    return (TRUE);
    143       1.1       cgd 	}
    144       1.1       cgd 	db_unread_token(t);
    145       1.1       cgd 	return (db_term(valuep));
    146       1.1       cgd }
    147       1.1       cgd 
    148       1.1       cgd boolean_t
    149       1.1       cgd db_mult_expr(valuep)
    150       1.1       cgd 	db_expr_t *valuep;
    151       1.1       cgd {
    152       1.1       cgd 	db_expr_t	lhs, rhs;
    153       1.1       cgd 	int		t;
    154       1.1       cgd 
    155       1.1       cgd 	if (!db_unary(&lhs))
    156       1.1       cgd 	    return (FALSE);
    157       1.1       cgd 
    158       1.1       cgd 	t = db_read_token();
    159       1.1       cgd 	while (t == tSTAR || t == tSLASH || t == tPCT || t == tHASH) {
    160       1.1       cgd 	    if (!db_term(&rhs)) {
    161       1.1       cgd 		db_error("Syntax error\n");
    162       1.1       cgd 		/*NOTREACHED*/
    163       1.1       cgd 	    }
    164       1.1       cgd 	    if (t == tSTAR)
    165       1.1       cgd 		lhs *= rhs;
    166       1.1       cgd 	    else {
    167       1.1       cgd 		if (rhs == 0) {
    168       1.1       cgd 		    db_error("Divide by 0\n");
    169       1.1       cgd 		    /*NOTREACHED*/
    170       1.1       cgd 		}
    171       1.1       cgd 		if (t == tSLASH)
    172       1.1       cgd 		    lhs /= rhs;
    173       1.1       cgd 		else if (t == tPCT)
    174       1.1       cgd 		    lhs %= rhs;
    175       1.1       cgd 		else
    176       1.1       cgd 		    lhs = ((lhs+rhs-1)/rhs)*rhs;
    177       1.1       cgd 	    }
    178       1.1       cgd 	    t = db_read_token();
    179       1.1       cgd 	}
    180       1.1       cgd 	db_unread_token(t);
    181       1.1       cgd 	*valuep = lhs;
    182       1.1       cgd 	return (TRUE);
    183       1.1       cgd }
    184       1.1       cgd 
    185       1.1       cgd boolean_t
    186       1.1       cgd db_add_expr(valuep)
    187       1.1       cgd 	db_expr_t *valuep;
    188       1.1       cgd {
    189       1.1       cgd 	db_expr_t	lhs, rhs;
    190       1.1       cgd 	int		t;
    191       1.1       cgd 
    192       1.1       cgd 	if (!db_mult_expr(&lhs))
    193       1.1       cgd 	    return (FALSE);
    194       1.1       cgd 
    195       1.1       cgd 	t = db_read_token();
    196       1.1       cgd 	while (t == tPLUS || t == tMINUS) {
    197       1.1       cgd 	    if (!db_mult_expr(&rhs)) {
    198       1.1       cgd 		db_error("Syntax error\n");
    199       1.1       cgd 		/*NOTREACHED*/
    200       1.1       cgd 	    }
    201       1.1       cgd 	    if (t == tPLUS)
    202       1.1       cgd 		lhs += rhs;
    203       1.1       cgd 	    else
    204       1.1       cgd 		lhs -= rhs;
    205       1.1       cgd 	    t = db_read_token();
    206       1.1       cgd 	}
    207       1.1       cgd 	db_unread_token(t);
    208       1.1       cgd 	*valuep = lhs;
    209       1.1       cgd 	return (TRUE);
    210       1.1       cgd }
    211       1.1       cgd 
    212       1.1       cgd boolean_t
    213       1.1       cgd db_shift_expr(valuep)
    214       1.1       cgd 	db_expr_t *valuep;
    215       1.1       cgd {
    216       1.1       cgd 	db_expr_t	lhs, rhs;
    217       1.1       cgd 	int		t;
    218       1.1       cgd 
    219       1.1       cgd 	if (!db_add_expr(&lhs))
    220       1.1       cgd 	    return (FALSE);
    221       1.1       cgd 
    222       1.1       cgd 	t = db_read_token();
    223       1.1       cgd 	while (t == tSHIFT_L || t == tSHIFT_R) {
    224       1.1       cgd 	    if (!db_add_expr(&rhs)) {
    225       1.1       cgd 		db_error("Syntax error\n");
    226       1.1       cgd 		/*NOTREACHED*/
    227       1.1       cgd 	    }
    228       1.1       cgd 	    if (rhs < 0) {
    229       1.1       cgd 		db_error("Negative shift amount\n");
    230       1.1       cgd 		/*NOTREACHED*/
    231       1.1       cgd 	    }
    232       1.1       cgd 	    if (t == tSHIFT_L)
    233       1.1       cgd 		lhs <<= rhs;
    234       1.1       cgd 	    else {
    235       1.1       cgd 		/* Shift right is unsigned */
    236       1.6       cgd 		lhs = (unsigned long) lhs >> rhs;
    237       1.1       cgd 	    }
    238       1.1       cgd 	    t = db_read_token();
    239       1.1       cgd 	}
    240       1.1       cgd 	db_unread_token(t);
    241       1.1       cgd 	*valuep = lhs;
    242       1.1       cgd 	return (TRUE);
    243       1.1       cgd }
    244       1.1       cgd 
    245       1.1       cgd int
    246       1.1       cgd db_expression(valuep)
    247       1.1       cgd 	db_expr_t *valuep;
    248       1.1       cgd {
    249       1.1       cgd 	return (db_shift_expr(valuep));
    250       1.1       cgd }
    251