xref: /openbsd-src/sys/ddb/db_variables.c (revision 5b133f3f277e80f096764111e64f3a1284acb179)
1*5b133f3fSguenther /*	$OpenBSD: db_variables.c,v 1.22 2023/03/08 04:43:07 guenther Exp $	*/
2d724e01aSderaadt /*	$NetBSD: db_variables.c,v 1.8 1996/02/05 01:57:19 christos Exp $	*/
3df930be7Sderaadt 
4df930be7Sderaadt /*
5df930be7Sderaadt  * Mach Operating System
6b2471a9dSmickey  * Copyright (c) 1993,1992,1991,1990 Carnegie Mellon University
7df930be7Sderaadt  * All Rights Reserved.
8df930be7Sderaadt  *
9df930be7Sderaadt  * Permission to use, copy, modify and distribute this software and its
10df930be7Sderaadt  * documentation is hereby granted, provided that both the copyright
11df930be7Sderaadt  * notice and this permission notice appear in all copies of the
12df930be7Sderaadt  * software, derivative works or modified versions, and any portions
13df930be7Sderaadt  * thereof, and that both notices appear in supporting documentation.
14df930be7Sderaadt  *
15b2471a9dSmickey  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
16df930be7Sderaadt  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
17df930be7Sderaadt  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
18df930be7Sderaadt  *
19df930be7Sderaadt  * Carnegie Mellon requests users of this software to return to
20df930be7Sderaadt  *
21df930be7Sderaadt  *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
22df930be7Sderaadt  *  School of Computer Science
23df930be7Sderaadt  *  Carnegie Mellon University
24df930be7Sderaadt  *  Pittsburgh PA 15213-3890
25df930be7Sderaadt  *
26b2471a9dSmickey  * any improvements or extensions that they make and grant Carnegie Mellon
27b2471a9dSmickey  * the rights to redistribute these changes.
28df930be7Sderaadt  */
29df930be7Sderaadt 
30df930be7Sderaadt #include <sys/param.h>
31cb6b0ad0Stedu #include <sys/systm.h>
32df930be7Sderaadt 
33df930be7Sderaadt #include <machine/db_machdep.h>
34df930be7Sderaadt 
35df930be7Sderaadt #include <ddb/db_lex.h>
36df930be7Sderaadt #include <ddb/db_variables.h>
373ed44a89Smickey #include <ddb/db_command.h>
383ed44a89Smickey #include <ddb/db_sym.h>
393ed44a89Smickey #include <ddb/db_extern.h>
40d6c7fc58Smickey #include <ddb/db_var.h>
41df930be7Sderaadt 
42df930be7Sderaadt struct db_variable db_vars[] = {
43ddfdb362Smiod 	{ "radix",	(long *)&db_radix, db_var_rw_int },
44ddfdb362Smiod 	{ "maxoff",	(long *)&db_maxoff, db_var_rw_int },
45ddfdb362Smiod 	{ "maxwidth",	(long *)&db_max_width, db_var_rw_int },
46ddfdb362Smiod 	{ "tabstops",	(long *)&db_tab_stop_width, db_var_rw_int },
47ddfdb362Smiod 	{ "lines",	(long *)&db_max_line, db_var_rw_int },
48ddfdb362Smiod 	{ "log",	(long *)&db_log, db_var_rw_int }
49df930be7Sderaadt };
50d9c3e9c1Sjasper struct db_variable *db_evars = db_vars + nitems(db_vars);
51df930be7Sderaadt 
52df930be7Sderaadt int
db_find_variable(struct db_variable ** varp)536ecb06d0Sjsg db_find_variable(struct db_variable **varp)
54df930be7Sderaadt {
55df930be7Sderaadt 	int	t;
56df930be7Sderaadt 	struct db_variable *vp;
57df930be7Sderaadt 
58df930be7Sderaadt 	t = db_read_token();
59df930be7Sderaadt 	if (t == tIDENT) {
60df930be7Sderaadt 		for (vp = db_vars; vp < db_evars; vp++) {
61df930be7Sderaadt 			if (!strcmp(db_tok_string, vp->name)) {
62df930be7Sderaadt 				*varp = vp;
63df930be7Sderaadt 				return (1);
64df930be7Sderaadt 			}
65df930be7Sderaadt 		}
66df930be7Sderaadt 		for (vp = db_regs; vp < db_eregs; vp++) {
67df930be7Sderaadt 			if (!strcmp(db_tok_string, vp->name)) {
68df930be7Sderaadt 				*varp = vp;
69df930be7Sderaadt 				return (1);
70df930be7Sderaadt 			}
71df930be7Sderaadt 		}
72df930be7Sderaadt 	}
73df930be7Sderaadt 	db_error("Unknown variable\n");
74df930be7Sderaadt 	/*NOTREACHED*/
753ed44a89Smickey 	return 0;
76df930be7Sderaadt }
77df930be7Sderaadt 
78df930be7Sderaadt int
db_get_variable(db_expr_t * valuep)796ecb06d0Sjsg db_get_variable(db_expr_t *valuep)
80df930be7Sderaadt {
81df930be7Sderaadt 	struct db_variable *vp;
82df930be7Sderaadt 
83df930be7Sderaadt 	if (!db_find_variable(&vp))
84df930be7Sderaadt 		return (0);
85df930be7Sderaadt 
86df930be7Sderaadt 	db_read_variable(vp, valuep);
87df930be7Sderaadt 
88df930be7Sderaadt 	return (1);
89df930be7Sderaadt }
90df930be7Sderaadt 
91df930be7Sderaadt int
db_set_variable(db_expr_t value)926ecb06d0Sjsg db_set_variable(db_expr_t value)
93df930be7Sderaadt {
94df930be7Sderaadt 	struct db_variable *vp;
95df930be7Sderaadt 
96df930be7Sderaadt 	if (!db_find_variable(&vp))
97df930be7Sderaadt 		return (0);
98df930be7Sderaadt 
99df930be7Sderaadt 	db_write_variable(vp, &value);
100df930be7Sderaadt 
101df930be7Sderaadt 	return (1);
102df930be7Sderaadt }
103df930be7Sderaadt 
104df930be7Sderaadt 
1053ed44a89Smickey void
db_read_variable(struct db_variable * vp,db_expr_t * valuep)1066ecb06d0Sjsg db_read_variable(struct db_variable *vp, db_expr_t *valuep)
107df930be7Sderaadt {
108c4071fd1Smillert 	int	(*func)(struct db_variable *, db_expr_t *, int) = vp->fcn;
109df930be7Sderaadt 
110df930be7Sderaadt 	if (func == FCN_NULL)
111df930be7Sderaadt 		*valuep = *(vp->valuep);
112df930be7Sderaadt 	else
113df930be7Sderaadt 		(*func)(vp, valuep, DB_VAR_GET);
114df930be7Sderaadt }
115df930be7Sderaadt 
1163ed44a89Smickey void
db_write_variable(struct db_variable * vp,db_expr_t * valuep)1176ecb06d0Sjsg db_write_variable(struct db_variable *vp, db_expr_t *valuep)
118df930be7Sderaadt {
119c4071fd1Smillert 	int	(*func)(struct db_variable *, db_expr_t *, int) = vp->fcn;
120df930be7Sderaadt 
121df930be7Sderaadt 	if (func == FCN_NULL)
122df930be7Sderaadt 		*(vp->valuep) = *valuep;
123df930be7Sderaadt 	else
124df930be7Sderaadt 		(*func)(vp, valuep, DB_VAR_SET);
125df930be7Sderaadt }
126df930be7Sderaadt 
127df930be7Sderaadt void
db_set_cmd(db_expr_t addr,int have_addr,db_expr_t count,char * modif)1286ecb06d0Sjsg db_set_cmd(db_expr_t addr, int have_addr, db_expr_t count, char *modif)
129df930be7Sderaadt {
130df930be7Sderaadt 	db_expr_t	value;
131df930be7Sderaadt 	struct db_variable *vp;
132df930be7Sderaadt 	int	t;
133df930be7Sderaadt 
134df930be7Sderaadt 	t = db_read_token();
135df930be7Sderaadt 	if (t != tDOLLAR) {
136df930be7Sderaadt 		db_error("Unknown variable\n");
137df930be7Sderaadt 		/*NOTREACHED*/
138df930be7Sderaadt 	}
139df930be7Sderaadt 	if (!db_find_variable(&vp)) {
140df930be7Sderaadt 		db_error("Unknown variable\n");
141df930be7Sderaadt 		/*NOTREACHED*/
142df930be7Sderaadt 	}
143df930be7Sderaadt 
144df930be7Sderaadt 	t = db_read_token();
145df930be7Sderaadt 	if (t != tEQ)
146df930be7Sderaadt 		db_unread_token(t);
147df930be7Sderaadt 
148df930be7Sderaadt 	if (!db_expression(&value)) {
149df930be7Sderaadt 		db_error("No value\n");
150df930be7Sderaadt 		/*NOTREACHED*/
151df930be7Sderaadt 	}
152df930be7Sderaadt 	if (db_read_token() != tEOL) {
153df930be7Sderaadt 		db_error("?\n");
154df930be7Sderaadt 		/*NOTREACHED*/
155df930be7Sderaadt 	}
156df930be7Sderaadt 
157df930be7Sderaadt 	db_write_variable(vp, &value);
158df930be7Sderaadt }
159ddfdb362Smiod 
160ddfdb362Smiod int
db_var_rw_int(struct db_variable * var,db_expr_t * expr,int mode)161ddfdb362Smiod db_var_rw_int(struct db_variable *var, db_expr_t *expr, int mode)
162ddfdb362Smiod {
163ddfdb362Smiod 
164ddfdb362Smiod 	if (mode == DB_VAR_SET)
165291f8f71Santon 		*(int *)var->valuep = *expr;
166ddfdb362Smiod 	else
167ddfdb362Smiod 		*expr = *(int *)var->valuep;
168ddfdb362Smiod 	return (0);
169ddfdb362Smiod }
170