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

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