This source file includes following definitions.
- db_find_variable
- db_get_variable
- db_set_variable
- db_read_variable
- db_write_variable
- db_set_cmd
- db_var_rw_int
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 #include <sys/param.h>
31 #include <sys/proc.h>
32
33 #include <uvm/uvm_extern.h>
34
35 #include <machine/db_machdep.h>
36
37 #include <ddb/db_lex.h>
38 #include <ddb/db_variables.h>
39 #include <ddb/db_command.h>
40 #include <ddb/db_sym.h>
41 #include <ddb/db_extern.h>
42 #include <ddb/db_var.h>
43
44 struct db_variable db_vars[] = {
45 { "radix", (long *)&db_radix, db_var_rw_int },
46 { "maxoff", (long *)&db_maxoff, db_var_rw_int },
47 { "maxwidth", (long *)&db_max_width, db_var_rw_int },
48 { "tabstops", (long *)&db_tab_stop_width, db_var_rw_int },
49 { "lines", (long *)&db_max_line, db_var_rw_int },
50 { "log", (long *)&db_log, db_var_rw_int }
51 };
52 struct db_variable *db_evars = db_vars + sizeof(db_vars)/sizeof(db_vars[0]);
53
54 int
55 db_find_variable(struct db_variable **varp)
56 {
57 int t;
58 struct db_variable *vp;
59
60 t = db_read_token();
61 if (t == tIDENT) {
62 for (vp = db_vars; vp < db_evars; vp++) {
63 if (!strcmp(db_tok_string, vp->name)) {
64 *varp = vp;
65 return (1);
66 }
67 }
68 for (vp = db_regs; vp < db_eregs; vp++) {
69 if (!strcmp(db_tok_string, vp->name)) {
70 *varp = vp;
71 return (1);
72 }
73 }
74 }
75 db_error("Unknown variable\n");
76
77 return 0;
78 }
79
80 int
81 db_get_variable(db_expr_t *valuep)
82 {
83 struct db_variable *vp;
84
85 if (!db_find_variable(&vp))
86 return (0);
87
88 db_read_variable(vp, valuep);
89
90 return (1);
91 }
92
93 int
94 db_set_variable(db_expr_t value)
95 {
96 struct db_variable *vp;
97
98 if (!db_find_variable(&vp))
99 return (0);
100
101 db_write_variable(vp, &value);
102
103 return (1);
104 }
105
106
107 void
108 db_read_variable(struct db_variable *vp, db_expr_t *valuep)
109 {
110 int (*func)(struct db_variable *, db_expr_t *, int) = vp->fcn;
111
112 if (func == FCN_NULL)
113 *valuep = *(vp->valuep);
114 else
115 (*func)(vp, valuep, DB_VAR_GET);
116 }
117
118 void
119 db_write_variable(struct db_variable *vp, db_expr_t *valuep)
120 {
121 int (*func)(struct db_variable *, db_expr_t *, int) = vp->fcn;
122
123 if (func == FCN_NULL)
124 *(vp->valuep) = *valuep;
125 else
126 (*func)(vp, valuep, DB_VAR_SET);
127 }
128
129
130 void
131 db_set_cmd(db_expr_t addr, int have_addr, db_expr_t count, char *modif)
132 {
133 db_expr_t value;
134 struct db_variable *vp;
135 int t;
136
137 t = db_read_token();
138 if (t != tDOLLAR) {
139 db_error("Unknown variable\n");
140
141 }
142 if (!db_find_variable(&vp)) {
143 db_error("Unknown variable\n");
144
145 }
146
147 t = db_read_token();
148 if (t != tEQ)
149 db_unread_token(t);
150
151 if (!db_expression(&value)) {
152 db_error("No value\n");
153
154 }
155 if (db_read_token() != tEOL) {
156 db_error("?\n");
157
158 }
159
160 db_write_variable(vp, &value);
161 }
162
163 int
164 db_var_rw_int(struct db_variable *var, db_expr_t *expr, int mode)
165 {
166
167 if (mode == DB_VAR_SET)
168 *var->valuep = *(int *)expr;
169 else
170 *expr = *(int *)var->valuep;
171 return (0);
172 }
173