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