|
|
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 */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.