386BSD 0.1 development
[unix-history] / usr / src / sys.386bsd / ddb / db_variables.c
CommitLineData
c1cfdb7a
WJ
1/*
2 * Mach Operating System
3 * Copyright (c) 1991,1990 Carnegie Mellon University
4 * All Rights Reserved.
5 *
6 * Permission to use, copy, modify and distribute this software and its
7 * documentation is hereby granted, provided that both the copyright
8 * notice and this permission notice appear in all copies of the
9 * software, derivative works or modified versions, and any portions
10 * thereof, and that both notices appear in supporting documentation.
11 *
12 * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS
13 * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
14 * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
15 *
16 * Carnegie Mellon requests users of this software to return to
17 *
18 * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
19 * School of Computer Science
20 * Carnegie Mellon University
21 * Pittsburgh PA 15213-3890
22 *
23 * any improvements or extensions that they make and grant Carnegie the
24 * rights to redistribute these changes.
25 */
26/*
27 * HISTORY
28 * $Log: db_variables.c,v $
29 * Revision 1.1 1992/03/25 21:45:33 pace
30 * Initial revision
31 *
32 * Revision 2.3 91/02/05 17:07:19 mrt
33 * Changed to new Mach copyright
34 * [91/01/31 16:19:46 mrt]
35 *
36 * Revision 2.2 90/08/27 21:53:24 dbg
37 * New db_read/write_variable functions. Should be used instead
38 * of dereferencing valuep directly, which might not be a true
39 * pointer if there is an fcn() access function.
40 * [90/08/20 af]
41 *
42 * Fix declarations.
43 * Check for trailing garbage after last expression on command line.
44 * [90/08/10 14:34:54 dbg]
45 *
46 * Created.
47 * [90/07/25 dbg]
48 *
49 */
50/*
51 * Author: David B. Golub, Carnegie Mellon University
52 * Date: 7/90
53 */
54
55#include "param.h"
56#include "proc.h"
57#include <machine/db_machdep.h>
58
59#include <ddb/db_lex.h>
60#include <ddb/db_variables.h>
61
62extern unsigned int db_maxoff;
63
64extern int db_radix;
65extern int db_max_width;
66extern int db_tab_stop_width;
67
68struct db_variable db_vars[] = {
69 { "radix", &db_radix, FCN_NULL },
70 { "maxoff", (int *)&db_maxoff, FCN_NULL },
71 { "maxwidth", &db_max_width, FCN_NULL },
72 { "tabstops", &db_tab_stop_width, FCN_NULL },
73};
74struct db_variable *db_evars = db_vars + sizeof(db_vars)/sizeof(db_vars[0]);
75
76int
77db_find_variable(varp)
78 struct db_variable **varp;
79{
80 int t;
81 struct db_variable *vp;
82
83 t = db_read_token();
84 if (t == tIDENT) {
85 for (vp = db_vars; vp < db_evars; vp++) {
86 if (!strcmp(db_tok_string, vp->name)) {
87 *varp = vp;
88 return (1);
89 }
90 }
91 for (vp = db_regs; vp < db_eregs; vp++) {
92 if (!strcmp(db_tok_string, vp->name)) {
93 *varp = vp;
94 return (1);
95 }
96 }
97 }
98 db_error("Unknown variable\n");
99 return (0);
100}
101
102int
103db_get_variable(valuep)
104 db_expr_t *valuep;
105{
106 struct db_variable *vp;
107
108 if (!db_find_variable(&vp))
109 return (0);
110
111 db_read_variable(vp, valuep);
112
113 return (1);
114}
115
116int
117db_set_variable(value)
118 db_expr_t value;
119{
120 struct db_variable *vp;
121
122 if (!db_find_variable(&vp))
123 return (0);
124
125 db_write_variable(vp, &value);
126
127 return (1);
128}
129
130
131db_read_variable(vp, valuep)
132 struct db_variable *vp;
133 db_expr_t *valuep;
134{
135 int (*func)() = vp->fcn;
136
137 if (func == FCN_NULL)
138 *valuep = *(vp->valuep);
139 else
140 (*func)(vp, valuep, DB_VAR_GET);
141}
142
143db_write_variable(vp, valuep)
144 struct db_variable *vp;
145 db_expr_t *valuep;
146{
147 int (*func)() = vp->fcn;
148
149 if (func == FCN_NULL)
150 *(vp->valuep) = *valuep;
151 else
152 (*func)(vp, valuep, DB_VAR_SET);
153}
154
155void
156db_set_cmd()
157{
158 db_expr_t value;
159 int (*func)();
160 struct db_variable *vp;
161 int t;
162
163 t = db_read_token();
164 if (t != tDOLLAR) {
165 db_error("Unknown variable\n");
166 return;
167 }
168 if (!db_find_variable(&vp)) {
169 db_error("Unknown variable\n");
170 return;
171 }
172
173 t = db_read_token();
174 if (t != tEQ)
175 db_unread_token(t);
176
177 if (!db_expression(&value)) {
178 db_error("No value\n");
179 return;
180 }
181 if (db_read_token() != tEOL) {
182 db_error("?\n");
183 }
184
185 db_write_variable(vp, &value);
186}