root/ddb/db_expr.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. db_term
  2. db_unary
  3. db_mult_expr
  4. db_add_expr
  5. db_shift_expr
  6. db_expression

    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 }

/* [<][>][^][v][top][bottom][index][help] */