Annotation of Gnu-Mach/ddb/db_variables.c, revision 1.1.1.3

1.1.1.2   root        1: /*
1.1       root        2:  * Mach Operating System
                      3:  * Copyright (c) 1991,1990 Carnegie Mellon University
                      4:  * All Rights Reserved.
1.1.1.2   root        5:  *
1.1       root        6:  * Permission to use, copy, modify and distribute this software and its
                      7:  * documentation is hereby granted, provided that both the copyright
                      8:  * notice and this permission notice appear in all copies of the
                      9:  * software, derivative works or modified versions, and any portions
                     10:  * thereof, and that both notices appear in supporting documentation.
1.1.1.2   root       11:  *
1.1       root       12:  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
                     13:  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
                     14:  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
1.1.1.2   root       15:  *
1.1       root       16:  * Carnegie Mellon requests users of this software to return to
1.1.1.2   root       17:  *
1.1       root       18:  *  Software Distribution Coordinator  or  [email protected]
                     19:  *  School of Computer Science
                     20:  *  Carnegie Mellon University
                     21:  *  Pittsburgh PA 15213-3890
1.1.1.2   root       22:  *
1.1       root       23:  * any improvements or extensions that they make and grant Carnegie Mellon
                     24:  * the rights to redistribute these changes.
                     25:  */
                     26: /*
                     27:  *     Author: David B. Golub, Carnegie Mellon University
                     28:  *     Date:   7/90
                     29:  */
                     30: 
                     31: #if MACH_KDB
                     32: 
                     33: #include <machine/db_machdep.h>
                     34: 
1.1.1.3 ! root       35: #include <ddb/db_command.h>
        !            36: #include <ddb/db_examine.h>
        !            37: #include <ddb/db_expr.h>
1.1       root       38: #include <ddb/db_lex.h>
1.1.1.3 ! root       39: #include <ddb/db_output.h>
1.1       root       40: #include <ddb/db_variables.h>
                     41: #include <ddb/db_task_thread.h>
                     42: 
                     43: extern unsigned long   db_maxoff;
                     44: 
                     45: extern db_expr_t       db_radix;
                     46: extern db_expr_t       db_max_width;
                     47: extern db_expr_t       db_tab_stop_width;
                     48: extern db_expr_t       db_max_line;
                     49: extern int     db_set_default_thread();
                     50: extern int     db_get_task_thread();
                     51: extern int     db_arg_variable();
                     52: 
                     53: #define DB_NWORK       32              /* number of work variable */
                     54: 
                     55: db_expr_t      db_work[DB_NWORK];              /* work variable */
                     56: 
                     57: struct db_variable db_vars[] = {
                     58:        { "radix",      &db_radix,              FCN_NULL },
                     59:        { "maxoff",     (db_expr_t*)&db_maxoff, FCN_NULL },
                     60:        { "maxwidth",   &db_max_width,          FCN_NULL },
                     61:        { "tabstops",   &db_tab_stop_width,     FCN_NULL },
                     62:        { "lines",      &db_max_line,           FCN_NULL },
                     63:        { "thread",     0,                      db_set_default_thread   },
                     64:        { "task",       0,                      db_get_task_thread,
                     65:          1,            2,                      -1,     -1              },
                     66:        { "work",       &db_work[0],            FCN_NULL,
                     67:          1,            1,                      0,      DB_NWORK-1      },
                     68:        { "arg",        0,                      db_arg_variable,
                     69:          1,            1,                      -1,     -1              },
                     70: };
                     71: struct db_variable *db_evars = db_vars + sizeof(db_vars)/sizeof(db_vars[0]);
                     72: 
                     73: char *
                     74: db_get_suffix(suffix, suffix_value)
                     75:        register char   *suffix;
                     76:        short           *suffix_value;
                     77: {
1.1.1.3 ! root       78:        register int value;
1.1       root       79: 
                     80:        for (value = 0; *suffix && *suffix != '.' && *suffix != ':'; suffix++) {
                     81:            if (*suffix < '0' || *suffix > '9')
                     82:                return(0);
                     83:            value = value*10 + *suffix - '0';
                     84:        }
                     85:        *suffix_value = value;
                     86:        if (*suffix == '.')
                     87:            suffix++;
                     88:        return(suffix);
                     89: }
1.1.1.2   root       90: 
1.1       root       91: static boolean_t
                     92: db_cmp_variable_name(vp, name, ap)
                     93:        struct db_variable              *vp;
                     94:        char                            *name;
                     95:        register db_var_aux_param_t     ap;
                     96: {
                     97:        register char *var_np, *np;
1.1.1.3 ! root       98:        register int level;
1.1.1.2   root       99: 
1.1       root      100:        for (np = name, var_np = vp->name; *var_np; ) {
                    101:            if (*np++ != *var_np++)
                    102:                return(FALSE);
                    103:        }
                    104:        for (level = 0; *np && *np != ':' && level < vp->max_level; level++){
                    105:            if ((np = db_get_suffix(np, &ap->suffix[level])) == 0)
                    106:                return(FALSE);
                    107:        }
                    108:        if ((*np && *np != ':') || level < vp->min_level
1.1.1.2   root      109:            || (level > 0 && (ap->suffix[0] < vp->low
1.1       root      110:                              || (vp->high >= 0 && ap->suffix[0] > vp->high))))
                    111:            return(FALSE);
                    112:        db_strcpy(ap->modif, (*np)? np+1: "");
                    113:        ap->thread = (db_option(ap->modif, 't')?db_default_thread: THREAD_NULL);
                    114:        ap->level = level;
                    115:        return(TRUE);
                    116: }
                    117: 
                    118: int
                    119: db_find_variable(varp, ap)
                    120:        struct db_variable      **varp;
                    121:        db_var_aux_param_t      ap;
                    122: {
                    123:        int     t;
                    124:        struct db_variable *vp;
                    125: 
                    126:        t = db_read_token();
                    127:        if (t == tIDENT) {
                    128:            for (vp = db_vars; vp < db_evars; vp++) {
                    129:                if (db_cmp_variable_name(vp, db_tok_string, ap)) {
                    130:                    *varp = vp;
                    131:                    return (1);
                    132:                }
                    133:            }
                    134:            for (vp = db_regs; vp < db_eregs; vp++) {
                    135:                if (db_cmp_variable_name(vp, db_tok_string, ap)) {
                    136:                    *varp = vp;
                    137:                    return (1);
                    138:                }
                    139:            }
                    140:        }
                    141:        db_printf("Unknown variable \"$%s\"\n", db_tok_string);
                    142:        db_error(0);
                    143:        return (0);
                    144: }
                    145: 
                    146: 
                    147: void db_read_write_variable(); /* forward */
                    148: 
                    149: int
                    150: db_get_variable(valuep)
                    151:        db_expr_t       *valuep;
                    152: {
                    153:        struct db_variable *vp;
                    154:        struct db_var_aux_param aux_param;
                    155:        char            modif[TOK_STRING_SIZE];
                    156: 
                    157:        aux_param.modif = modif;
                    158:        if (!db_find_variable(&vp, &aux_param))
                    159:            return (0);
                    160: 
                    161:        db_read_write_variable(vp, valuep, DB_VAR_GET, &aux_param);
                    162: 
                    163:        return (1);
                    164: }
                    165: 
                    166: int
                    167: db_set_variable(value)
                    168:        db_expr_t       value;
                    169: {
                    170:        struct db_variable *vp;
                    171:        struct db_var_aux_param aux_param;
                    172:        char            modif[TOK_STRING_SIZE];
                    173: 
                    174:        aux_param.modif = modif;
                    175:        if (!db_find_variable(&vp, &aux_param))
                    176:            return (0);
                    177: 
                    178:        db_read_write_variable(vp, &value, DB_VAR_SET, &aux_param);
                    179: 
                    180:        return (1);
                    181: }
                    182: 
                    183: void
                    184: db_read_write_variable(vp, valuep, rw_flag, ap)
                    185:        struct db_variable      *vp;
                    186:        db_expr_t               *valuep;
                    187:        int                     rw_flag;
                    188:        db_var_aux_param_t      ap;
                    189: {
                    190:        int     (*func)() = vp->fcn;
                    191:        struct  db_var_aux_param aux_param;
                    192: 
                    193:        if (ap == 0) {
                    194:            ap = &aux_param;
                    195:            ap->modif = "";
                    196:            ap->level = 0;
                    197:            ap->thread = THREAD_NULL;
                    198:        }
                    199:        if (func == FCN_NULL) {
                    200:            if (rw_flag == DB_VAR_SET)
                    201:                vp->valuep[(ap->level)? (ap->suffix[0] - vp->low): 0] = *valuep;
                    202:            else
                    203:                *valuep = vp->valuep[(ap->level)? (ap->suffix[0] - vp->low): 0];
                    204:        } else
                    205:            (*func)(vp, valuep, rw_flag, ap);
                    206: }
                    207: 
                    208: void
                    209: db_set_cmd()
                    210: {
                    211:        db_expr_t       value;
                    212:        int             t;
                    213:        struct db_variable *vp;
                    214:        struct db_var_aux_param aux_param;
                    215:        char            modif[TOK_STRING_SIZE];
                    216: 
                    217:        aux_param.modif = modif;
                    218:        t = db_read_token();
                    219:        if (t != tDOLLAR) {
                    220:            db_error("Variable name should be prefixed with $\n");
                    221:            return;
                    222:        }
                    223:        if (!db_find_variable(&vp, &aux_param)) {
                    224:            db_error("Unknown variable\n");
                    225:            return;
                    226:        }
                    227: 
                    228:        t = db_read_token();
                    229:        if (t != tEQ)
                    230:            db_unread_token(t);
                    231: 
                    232:        if (!db_expression(&value)) {
                    233:            db_error("No value\n");
                    234:            return;
                    235:        }
                    236:        if ((t = db_read_token()) == tSEMI_COLON)
                    237:            db_unread_token(t);
                    238:        else if (t != tEOL)
                    239:            db_error("?\n");
                    240: 
                    241:        db_read_write_variable(vp, &value, DB_VAR_SET, &aux_param);
                    242: }
                    243: 
1.1.1.2   root      244: #endif /* MACH_KDB */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.