1*86d7f5d3SJohn Marino /*
2*86d7f5d3SJohn Marino * Mach Operating System
3*86d7f5d3SJohn Marino * Copyright (c) 1991,1990 Carnegie Mellon University
4*86d7f5d3SJohn Marino * All Rights Reserved.
5*86d7f5d3SJohn Marino *
6*86d7f5d3SJohn Marino * Permission to use, copy, modify and distribute this software and its
7*86d7f5d3SJohn Marino * documentation is hereby granted, provided that both the copyright
8*86d7f5d3SJohn Marino * notice and this permission notice appear in all copies of the
9*86d7f5d3SJohn Marino * software, derivative works or modified versions, and any portions
10*86d7f5d3SJohn Marino * thereof, and that both notices appear in supporting documentation.
11*86d7f5d3SJohn Marino *
12*86d7f5d3SJohn Marino * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS
13*86d7f5d3SJohn Marino * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
14*86d7f5d3SJohn Marino * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
15*86d7f5d3SJohn Marino *
16*86d7f5d3SJohn Marino * Carnegie Mellon requests users of this software to return to
17*86d7f5d3SJohn Marino *
18*86d7f5d3SJohn Marino * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
19*86d7f5d3SJohn Marino * School of Computer Science
20*86d7f5d3SJohn Marino * Carnegie Mellon University
21*86d7f5d3SJohn Marino * Pittsburgh PA 15213-3890
22*86d7f5d3SJohn Marino *
23*86d7f5d3SJohn Marino * any improvements or extensions that they make and grant Carnegie the
24*86d7f5d3SJohn Marino * rights to redistribute these changes.
25*86d7f5d3SJohn Marino *
26*86d7f5d3SJohn Marino * $FreeBSD: src/sys/ddb/db_variables.c,v 1.18 1999/08/28 00:41:11 peter Exp $
27*86d7f5d3SJohn Marino */
28*86d7f5d3SJohn Marino
29*86d7f5d3SJohn Marino /*
30*86d7f5d3SJohn Marino * Author: David B. Golub, Carnegie Mellon University
31*86d7f5d3SJohn Marino * Date: 7/90
32*86d7f5d3SJohn Marino */
33*86d7f5d3SJohn Marino
34*86d7f5d3SJohn Marino #include <sys/param.h>
35*86d7f5d3SJohn Marino #include <sys/systm.h>
36*86d7f5d3SJohn Marino
37*86d7f5d3SJohn Marino #include <ddb/ddb.h>
38*86d7f5d3SJohn Marino #include <ddb/db_lex.h>
39*86d7f5d3SJohn Marino #include <ddb/db_variables.h>
40*86d7f5d3SJohn Marino
41*86d7f5d3SJohn Marino static int db_find_variable (struct db_variable **varp);
42*86d7f5d3SJohn Marino static void db_write_variable (struct db_variable *, db_expr_t *);
43*86d7f5d3SJohn Marino
44*86d7f5d3SJohn Marino #ifdef notused
45*86d7f5d3SJohn Marino static int db_set_variable (db_expr_t value);
46*86d7f5d3SJohn Marino #endif
47*86d7f5d3SJohn Marino
48*86d7f5d3SJohn Marino static struct db_variable db_vars[] = {
49*86d7f5d3SJohn Marino { "radix", &db_radix, NULL },
50*86d7f5d3SJohn Marino { "maxoff", &db_maxoff, NULL },
51*86d7f5d3SJohn Marino { "maxwidth", &db_max_width, NULL },
52*86d7f5d3SJohn Marino { "tabstops", &db_tab_stop_width, NULL },
53*86d7f5d3SJohn Marino };
54*86d7f5d3SJohn Marino static struct db_variable *db_evars = db_vars + NELEM(db_vars);
55*86d7f5d3SJohn Marino
56*86d7f5d3SJohn Marino static int
db_find_variable(struct db_variable ** varp)57*86d7f5d3SJohn Marino db_find_variable(struct db_variable **varp)
58*86d7f5d3SJohn Marino {
59*86d7f5d3SJohn Marino int t;
60*86d7f5d3SJohn Marino struct db_variable *vp;
61*86d7f5d3SJohn Marino
62*86d7f5d3SJohn Marino t = db_read_token();
63*86d7f5d3SJohn Marino if (t == tIDENT) {
64*86d7f5d3SJohn Marino for (vp = db_vars; vp < db_evars; vp++) {
65*86d7f5d3SJohn Marino if (!strcmp(db_tok_string, vp->name)) {
66*86d7f5d3SJohn Marino *varp = vp;
67*86d7f5d3SJohn Marino return (1);
68*86d7f5d3SJohn Marino }
69*86d7f5d3SJohn Marino }
70*86d7f5d3SJohn Marino for (vp = db_regs; vp < db_eregs; vp++) {
71*86d7f5d3SJohn Marino if (!strcmp(db_tok_string, vp->name)) {
72*86d7f5d3SJohn Marino *varp = vp;
73*86d7f5d3SJohn Marino return (1);
74*86d7f5d3SJohn Marino }
75*86d7f5d3SJohn Marino }
76*86d7f5d3SJohn Marino }
77*86d7f5d3SJohn Marino db_error("Unknown variable\n");
78*86d7f5d3SJohn Marino return (0);
79*86d7f5d3SJohn Marino }
80*86d7f5d3SJohn Marino
81*86d7f5d3SJohn Marino int
db_get_variable(db_expr_t * valuep)82*86d7f5d3SJohn Marino db_get_variable(db_expr_t *valuep)
83*86d7f5d3SJohn Marino {
84*86d7f5d3SJohn Marino struct db_variable *vp;
85*86d7f5d3SJohn Marino
86*86d7f5d3SJohn Marino if (!db_find_variable(&vp))
87*86d7f5d3SJohn Marino return (0);
88*86d7f5d3SJohn Marino
89*86d7f5d3SJohn Marino db_read_variable(vp, valuep);
90*86d7f5d3SJohn Marino
91*86d7f5d3SJohn Marino return (1);
92*86d7f5d3SJohn Marino }
93*86d7f5d3SJohn Marino
94*86d7f5d3SJohn Marino #ifdef notused
95*86d7f5d3SJohn Marino static int
db_set_variable(db_expr_t value)96*86d7f5d3SJohn Marino db_set_variable(db_expr_t value)
97*86d7f5d3SJohn Marino {
98*86d7f5d3SJohn Marino struct db_variable *vp;
99*86d7f5d3SJohn Marino
100*86d7f5d3SJohn Marino if (!db_find_variable(&vp))
101*86d7f5d3SJohn Marino return (0);
102*86d7f5d3SJohn Marino
103*86d7f5d3SJohn Marino db_write_variable(vp, &value);
104*86d7f5d3SJohn Marino
105*86d7f5d3SJohn Marino return (1);
106*86d7f5d3SJohn Marino }
107*86d7f5d3SJohn Marino #endif
108*86d7f5d3SJohn Marino
109*86d7f5d3SJohn Marino void
db_read_variable(struct db_variable * vp,db_expr_t * valuep)110*86d7f5d3SJohn Marino db_read_variable(struct db_variable *vp, db_expr_t *valuep)
111*86d7f5d3SJohn Marino {
112*86d7f5d3SJohn Marino db_varfcn_t *func = vp->fcn;
113*86d7f5d3SJohn Marino
114*86d7f5d3SJohn Marino if (func == NULL)
115*86d7f5d3SJohn Marino *valuep = *(vp->valuep);
116*86d7f5d3SJohn Marino else
117*86d7f5d3SJohn Marino (*func)(vp, valuep, DB_VAR_GET);
118*86d7f5d3SJohn Marino }
119*86d7f5d3SJohn Marino
120*86d7f5d3SJohn Marino static void
db_write_variable(struct db_variable * vp,db_expr_t * valuep)121*86d7f5d3SJohn Marino db_write_variable(struct db_variable *vp, db_expr_t *valuep)
122*86d7f5d3SJohn Marino {
123*86d7f5d3SJohn Marino db_varfcn_t *func = vp->fcn;
124*86d7f5d3SJohn Marino
125*86d7f5d3SJohn Marino if (func == NULL)
126*86d7f5d3SJohn Marino *(vp->valuep) = *valuep;
127*86d7f5d3SJohn Marino else
128*86d7f5d3SJohn Marino (*func)(vp, valuep, DB_VAR_SET);
129*86d7f5d3SJohn Marino }
130*86d7f5d3SJohn Marino
131*86d7f5d3SJohn Marino void
db_set_cmd(db_expr_t dummy1,boolean_t dummy2,db_expr_t dummy3,char * dummy4)132*86d7f5d3SJohn Marino db_set_cmd(db_expr_t dummy1, boolean_t dummy2, db_expr_t dummy3, char *dummy4)
133*86d7f5d3SJohn Marino {
134*86d7f5d3SJohn Marino db_expr_t value;
135*86d7f5d3SJohn Marino struct db_variable *vp;
136*86d7f5d3SJohn Marino int t;
137*86d7f5d3SJohn Marino
138*86d7f5d3SJohn Marino t = db_read_token();
139*86d7f5d3SJohn Marino if (t != tDOLLAR) {
140*86d7f5d3SJohn Marino db_error("Unknown variable\n");
141*86d7f5d3SJohn Marino return;
142*86d7f5d3SJohn Marino }
143*86d7f5d3SJohn Marino if (!db_find_variable(&vp)) {
144*86d7f5d3SJohn Marino db_error("Unknown variable\n");
145*86d7f5d3SJohn Marino return;
146*86d7f5d3SJohn Marino }
147*86d7f5d3SJohn Marino
148*86d7f5d3SJohn Marino t = db_read_token();
149*86d7f5d3SJohn Marino if (t != tEQ)
150*86d7f5d3SJohn Marino db_unread_token(t);
151*86d7f5d3SJohn Marino
152*86d7f5d3SJohn Marino if (!db_expression(&value)) {
153*86d7f5d3SJohn Marino db_error("No value\n");
154*86d7f5d3SJohn Marino return;
155*86d7f5d3SJohn Marino }
156*86d7f5d3SJohn Marino if (db_read_token() != tEOL) {
157*86d7f5d3SJohn Marino db_error("?\n");
158*86d7f5d3SJohn Marino }
159*86d7f5d3SJohn Marino
160*86d7f5d3SJohn Marino db_write_variable(vp, &value);
161*86d7f5d3SJohn Marino }
162