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

Annotation of sys/ddb/db_variables.c, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: db_variables.c,v 1.12 2006/07/06 19:05:58 miod Exp $  */
                      2: /*     $NetBSD: db_variables.c,v 1.8 1996/02/05 01:57:19 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:
                     30: #include <sys/param.h>
                     31: #include <sys/proc.h>
                     32:
                     33: #include <uvm/uvm_extern.h>
                     34:
                     35: #include <machine/db_machdep.h>
                     36:
                     37: #include <ddb/db_lex.h>
                     38: #include <ddb/db_variables.h>
                     39: #include <ddb/db_command.h>
                     40: #include <ddb/db_sym.h>
                     41: #include <ddb/db_extern.h>
                     42: #include <ddb/db_var.h>
                     43:
                     44: struct db_variable db_vars[] = {
                     45:        { "radix",      (long *)&db_radix, db_var_rw_int },
                     46:        { "maxoff",     (long *)&db_maxoff, db_var_rw_int },
                     47:        { "maxwidth",   (long *)&db_max_width, db_var_rw_int },
                     48:        { "tabstops",   (long *)&db_tab_stop_width, db_var_rw_int },
                     49:        { "lines",      (long *)&db_max_line, db_var_rw_int },
                     50:        { "log",        (long *)&db_log, db_var_rw_int }
                     51: };
                     52: struct db_variable *db_evars = db_vars + sizeof(db_vars)/sizeof(db_vars[0]);
                     53:
                     54: int
                     55: db_find_variable(struct db_variable **varp)
                     56: {
                     57:        int     t;
                     58:        struct db_variable *vp;
                     59:
                     60:        t = db_read_token();
                     61:        if (t == tIDENT) {
                     62:            for (vp = db_vars; vp < db_evars; vp++) {
                     63:                if (!strcmp(db_tok_string, vp->name)) {
                     64:                    *varp = vp;
                     65:                    return (1);
                     66:                }
                     67:            }
                     68:            for (vp = db_regs; vp < db_eregs; vp++) {
                     69:                if (!strcmp(db_tok_string, vp->name)) {
                     70:                    *varp = vp;
                     71:                    return (1);
                     72:                }
                     73:            }
                     74:        }
                     75:        db_error("Unknown variable\n");
                     76:        /*NOTREACHED*/
                     77:        return 0;
                     78: }
                     79:
                     80: int
                     81: db_get_variable(db_expr_t *valuep)
                     82: {
                     83:        struct db_variable *vp;
                     84:
                     85:        if (!db_find_variable(&vp))
                     86:            return (0);
                     87:
                     88:        db_read_variable(vp, valuep);
                     89:
                     90:        return (1);
                     91: }
                     92:
                     93: int
                     94: db_set_variable(db_expr_t value)
                     95: {
                     96:        struct db_variable *vp;
                     97:
                     98:        if (!db_find_variable(&vp))
                     99:            return (0);
                    100:
                    101:        db_write_variable(vp, &value);
                    102:
                    103:        return (1);
                    104: }
                    105:
                    106:
                    107: void
                    108: db_read_variable(struct db_variable *vp, db_expr_t *valuep)
                    109: {
                    110:        int     (*func)(struct db_variable *, db_expr_t *, int) = vp->fcn;
                    111:
                    112:        if (func == FCN_NULL)
                    113:            *valuep = *(vp->valuep);
                    114:        else
                    115:            (*func)(vp, valuep, DB_VAR_GET);
                    116: }
                    117:
                    118: void
                    119: db_write_variable(struct db_variable *vp, db_expr_t *valuep)
                    120: {
                    121:        int     (*func)(struct db_variable *, db_expr_t *, int) = vp->fcn;
                    122:
                    123:        if (func == FCN_NULL)
                    124:            *(vp->valuep) = *valuep;
                    125:        else
                    126:            (*func)(vp, valuep, DB_VAR_SET);
                    127: }
                    128:
                    129: /*ARGSUSED*/
                    130: void
                    131: db_set_cmd(db_expr_t addr, int have_addr, db_expr_t count, char *modif)
                    132: {
                    133:        db_expr_t       value;
                    134:        struct db_variable *vp;
                    135:        int     t;
                    136:
                    137:        t = db_read_token();
                    138:        if (t != tDOLLAR) {
                    139:            db_error("Unknown variable\n");
                    140:            /*NOTREACHED*/
                    141:        }
                    142:        if (!db_find_variable(&vp)) {
                    143:            db_error("Unknown variable\n");
                    144:            /*NOTREACHED*/
                    145:        }
                    146:
                    147:        t = db_read_token();
                    148:        if (t != tEQ)
                    149:            db_unread_token(t);
                    150:
                    151:        if (!db_expression(&value)) {
                    152:            db_error("No value\n");
                    153:            /*NOTREACHED*/
                    154:        }
                    155:        if (db_read_token() != tEOL) {
                    156:            db_error("?\n");
                    157:            /*NOTREACHED*/
                    158:        }
                    159:
                    160:        db_write_variable(vp, &value);
                    161: }
                    162:
                    163: int
                    164: db_var_rw_int(struct db_variable *var, db_expr_t *expr, int mode)
                    165: {
                    166:
                    167:        if (mode == DB_VAR_SET)
                    168:                *var->valuep = *(int *)expr;
                    169:        else
                    170:                *expr = *(int *)var->valuep;
                    171:        return (0);
                    172: }
                    173:

CVSweb