db_variables.c revision 12473
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 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 Software.Distribution@CS.CMU.EDU 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 the 24 * rights to redistribute these changes. 25 * 26 * $Id: db_variables.c,v 1.7 1995/05/30 07:57:17 rgrimes Exp $ 27 */ 28 29/* 30 * Author: David B. Golub, Carnegie Mellon University 31 * Date: 7/90 32 */ 33 34#include <sys/param.h> 35#include <sys/systm.h> 36#include <sys/proc.h> 37#include <ddb/ddb.h> 38 39#include <ddb/db_lex.h> 40#include <ddb/db_variables.h> 41 42extern int db_find_variable __P((struct db_variable **varp)); 43extern int db_set_variable __P((db_expr_t value)); 44static void db_write_variable __P((struct db_variable *, db_expr_t *)); 45 46struct db_variable db_vars[] = { 47 { "radix", &db_radix, FCN_NULL }, 48 { "maxoff", (int *)&db_maxoff, FCN_NULL }, 49 { "maxwidth", &db_max_width, FCN_NULL }, 50 { "tabstops", &db_tab_stop_width, FCN_NULL }, 51}; 52struct db_variable *db_evars = db_vars + sizeof(db_vars)/sizeof(db_vars[0]); 53 54int 55db_find_variable(varp) 56 struct db_variable **varp; 57{ 58 int t; 59 struct db_variable *vp; 60 61 t = db_read_token(); 62 if (t == tIDENT) { 63 for (vp = db_vars; vp < db_evars; vp++) { 64 if (!strcmp(db_tok_string, vp->name)) { 65 *varp = vp; 66 return (1); 67 } 68 } 69 for (vp = db_regs; vp < db_eregs; vp++) { 70 if (!strcmp(db_tok_string, vp->name)) { 71 *varp = vp; 72 return (1); 73 } 74 } 75 } 76 db_error("Unknown variable\n"); 77 return (0); 78} 79 80int 81db_get_variable(valuep) 82 db_expr_t *valuep; 83{ 84 struct db_variable *vp; 85 86 if (!db_find_variable(&vp)) 87 return (0); 88 89 db_read_variable(vp, valuep); 90 91 return (1); 92} 93 94int 95db_set_variable(value) 96 db_expr_t value; 97{ 98 struct db_variable *vp; 99 100 if (!db_find_variable(&vp)) 101 return (0); 102 103 db_write_variable(vp, &value); 104 105 return (1); 106} 107 108 109void 110db_read_variable(vp, valuep) 111 struct db_variable *vp; 112 db_expr_t *valuep; 113{ 114 db_varfcn_t *func = vp->fcn; 115 116 if (func == FCN_NULL) 117 *valuep = *(vp->valuep); 118 else 119 (*func)(vp, valuep, DB_VAR_GET); 120} 121 122static void 123db_write_variable(vp, valuep) 124 struct db_variable *vp; 125 db_expr_t *valuep; 126{ 127 db_varfcn_t *func = vp->fcn; 128 129 if (func == FCN_NULL) 130 *(vp->valuep) = *valuep; 131 else 132 (*func)(vp, valuep, DB_VAR_SET); 133} 134 135void 136db_set_cmd(dummy1, dummy2, dummy3, dummy4) 137 db_expr_t dummy1; 138 boolean_t dummy2; 139 db_expr_t dummy3; 140 char * dummy4; 141{ 142 db_expr_t value; 143 struct db_variable *vp; 144 int t; 145 146 t = db_read_token(); 147 if (t != tDOLLAR) { 148 db_error("Unknown variable\n"); 149 return; 150 } 151 if (!db_find_variable(&vp)) { 152 db_error("Unknown variable\n"); 153 return; 154 } 155 156 t = db_read_token(); 157 if (t != tEQ) 158 db_unread_token(t); 159 160 if (!db_expression(&value)) { 161 db_error("No value\n"); 162 return; 163 } 164 if (db_read_token() != tEOL) { 165 db_error("?\n"); 166 } 167 168 db_write_variable(vp, &value); 169} 170