db_variables.c revision 22975
196263Sobrien/* 296263Sobrien * Mach Operating System 396263Sobrien * Copyright (c) 1991,1990 Carnegie Mellon University 496263Sobrien * All Rights Reserved. 596263Sobrien * 696263Sobrien * Permission to use, copy, modify and distribute this software and its 796263Sobrien * documentation is hereby granted, provided that both the copyright 896263Sobrien * notice and this permission notice appear in all copies of the 996263Sobrien * software, derivative works or modified versions, and any portions 1096263Sobrien * thereof, and that both notices appear in supporting documentation. 1196263Sobrien * 1296263Sobrien * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS 1396263Sobrien * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR 1496263Sobrien * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. 1596263Sobrien * 1696263Sobrien * Carnegie Mellon requests users of this software to return to 1796263Sobrien * 1896263Sobrien * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU 1996263Sobrien * School of Computer Science 2096263Sobrien * Carnegie Mellon University 2196263Sobrien * Pittsburgh PA 15213-3890 2296263Sobrien * 2396263Sobrien * any improvements or extensions that they make and grant Carnegie the 2496263Sobrien * rights to redistribute these changes. 2596263Sobrien * 2696263Sobrien * $Id$ 2796263Sobrien */ 2896263Sobrien 2996263Sobrien/* 3096263Sobrien * Author: David B. Golub, Carnegie Mellon University 3196263Sobrien * Date: 7/90 3296263Sobrien */ 3396263Sobrien 3496263Sobrien#include <sys/param.h> 3596263Sobrien#include <sys/systm.h> 3696263Sobrien 3796263Sobrien#include <ddb/ddb.h> 3896263Sobrien#include <ddb/db_lex.h> 3996263Sobrien#include <ddb/db_variables.h> 4096263Sobrien 4196263Sobrienstatic int db_find_variable __P((struct db_variable **varp)); 4296263Sobrienstatic void db_write_variable __P((struct db_variable *, db_expr_t *)); 4396263Sobrien 4496263Sobrien#ifdef notused 4596263Sobrienstatic int db_set_variable __P((db_expr_t value)); 4696263Sobrien#endif 4796263Sobrien 4896263Sobrienstatic struct db_variable db_vars[] = { 4996263Sobrien { "radix", &db_radix, FCN_NULL }, 5096263Sobrien { "maxoff", (int *)&db_maxoff, FCN_NULL }, 5196263Sobrien { "maxwidth", &db_max_width, FCN_NULL }, 5296263Sobrien { "tabstops", &db_tab_stop_width, FCN_NULL }, 5396263Sobrien}; 5496263Sobrienstatic struct db_variable *db_evars = 5596263Sobrien db_vars + sizeof(db_vars)/sizeof(db_vars[0]); 5696263Sobrien 5796263Sobrienstatic int 5896263Sobriendb_find_variable(varp) 5996263Sobrien struct db_variable **varp; 6096263Sobrien{ 6196263Sobrien int t; 6296263Sobrien struct db_variable *vp; 6396263Sobrien 6496263Sobrien t = db_read_token(); 6596263Sobrien if (t == tIDENT) { 6696263Sobrien for (vp = db_vars; vp < db_evars; vp++) { 6796263Sobrien if (!strcmp(db_tok_string, vp->name)) { 6896263Sobrien *varp = vp; 6996263Sobrien return (1); 7096263Sobrien } 7196263Sobrien } 7296263Sobrien for (vp = db_regs; vp < db_eregs; vp++) { 7396263Sobrien if (!strcmp(db_tok_string, vp->name)) { 7496263Sobrien *varp = vp; 7596263Sobrien return (1); 7696263Sobrien } 7796263Sobrien } 7896263Sobrien } 7996263Sobrien db_error("Unknown variable\n"); 8096263Sobrien return (0); 8196263Sobrien} 8296263Sobrien 8396263Sobrienint 8496263Sobriendb_get_variable(valuep) 8596263Sobrien db_expr_t *valuep; 8696263Sobrien{ 8796263Sobrien struct db_variable *vp; 8896263Sobrien 8996263Sobrien if (!db_find_variable(&vp)) 9096263Sobrien return (0); 9196263Sobrien 9296263Sobrien db_read_variable(vp, valuep); 9396263Sobrien 9496263Sobrien return (1); 9596263Sobrien} 9696263Sobrien 9796263Sobrien#ifdef notused 9896263Sobrienstatic int 9996263Sobriendb_set_variable(value) 10096263Sobrien db_expr_t value; 10196263Sobrien{ 10296263Sobrien struct db_variable *vp; 10396263Sobrien 10496263Sobrien if (!db_find_variable(&vp)) 10596263Sobrien return (0); 10696263Sobrien 10796263Sobrien db_write_variable(vp, &value); 10896263Sobrien 10996263Sobrien return (1); 11096263Sobrien} 11196263Sobrien#endif 11296263Sobrien 11396263Sobrienvoid 11496263Sobriendb_read_variable(vp, valuep) 11596263Sobrien struct db_variable *vp; 11696263Sobrien db_expr_t *valuep; 11796263Sobrien{ 11896263Sobrien db_varfcn_t *func = vp->fcn; 11996263Sobrien 12096263Sobrien if (func == FCN_NULL) 12196263Sobrien *valuep = *(vp->valuep); 12296263Sobrien else 12396263Sobrien (*func)(vp, valuep, DB_VAR_GET); 12496263Sobrien} 12596263Sobrien 12696263Sobrienstatic void 12796263Sobriendb_write_variable(vp, valuep) 12896263Sobrien struct db_variable *vp; 12996263Sobrien db_expr_t *valuep; 13096263Sobrien{ 13196263Sobrien db_varfcn_t *func = vp->fcn; 13296263Sobrien 13396263Sobrien if (func == FCN_NULL) 13496263Sobrien *(vp->valuep) = *valuep; 13596263Sobrien else 13696263Sobrien (*func)(vp, valuep, DB_VAR_SET); 13796263Sobrien} 13896263Sobrien 13996263Sobrienvoid 14096263Sobriendb_set_cmd(dummy1, dummy2, dummy3, dummy4) 14196263Sobrien db_expr_t dummy1; 14296263Sobrien boolean_t dummy2; 14396263Sobrien db_expr_t dummy3; 14496263Sobrien char * dummy4; 14596263Sobrien{ 14696263Sobrien db_expr_t value; 14796263Sobrien struct db_variable *vp; 14896263Sobrien int t; 14996263Sobrien 15096263Sobrien t = db_read_token(); 15196263Sobrien if (t != tDOLLAR) { 15296263Sobrien db_error("Unknown variable\n"); 15396263Sobrien return; 15496263Sobrien } 15596263Sobrien if (!db_find_variable(&vp)) { 15696263Sobrien db_error("Unknown variable\n"); 15796263Sobrien return; 15896263Sobrien } 15996263Sobrien 16096263Sobrien t = db_read_token(); 16196263Sobrien if (t != tEQ) 16296263Sobrien db_unread_token(t); 16396263Sobrien 16496263Sobrien if (!db_expression(&value)) { 16596263Sobrien db_error("No value\n"); 16696263Sobrien return; 16796263Sobrien } 16896263Sobrien if (db_read_token() != tEOL) { 16996263Sobrien db_error("?\n"); 17096263Sobrien } 17196263Sobrien 17296263Sobrien db_write_variable(vp, &value); 17396263Sobrien} 17496263Sobrien