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