|
|
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: #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: } 1.1.1.2 ! root 87: 1.1 root 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; 1.1.1.2 ! root 96: 1.1 root 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 1.1.1.2 ! root 106: || (level > 0 && (ap->suffix[0] < vp->low 1.1 root 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: 1.1.1.2 ! root 241: #endif /* MACH_KDB */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.