Home | History | Annotate | Line # | Download | only in ddb
db_expr.c revision 1.7.16.2.2.1
      1  1.7.16.2.2.1   thorpej /*	$NetBSD: db_expr.c,v 1.7.16.2.2.1 1999/06/21 01:16:21 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.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