[BACK]Return to db_expr.c CVS log [TXT][DIR] Up to [local] / sys / ddb

Annotation of sys/ddb/db_expr.c, Revision 1.1.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