root/ddb/db_variables.c

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

DEFINITIONS

This source file includes following definitions.
  1. db_find_variable
  2. db_get_variable
  3. db_set_variable
  4. db_read_variable
  5. db_write_variable
  6. db_set_cmd
  7. db_var_rw_int

    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 

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