xref: /dflybsd-src/sys/ddb/db_variables.c (revision 86d7f5d305c6adaa56ff4582ece9859d73106103)
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