db_variables.c revision 623
1223637Sbz/*
2126353Smlaier * Mach Operating System
3126353Smlaier * Copyright (c) 1991,1990 Carnegie Mellon University
4126353Smlaier * All Rights Reserved.
5126353Smlaier *
6126353Smlaier * Permission to use, copy, modify and distribute this software and its
7126353Smlaier * documentation is hereby granted, provided that both the copyright
8126353Smlaier * notice and this permission notice appear in all copies of the
9126353Smlaier * software, derivative works or modified versions, and any portions
10126353Smlaier * thereof, and that both notices appear in supporting documentation.
11126353Smlaier *
12126353Smlaier * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS
13126353Smlaier * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
14126353Smlaier * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
15126353Smlaier *
16148787Sbrueffer * Carnegie Mellon requests users of this software to return to
17148787Sbrueffer *
18148787Sbrueffer *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
19223637Sbz *  School of Computer Science
20126353Smlaier *  Carnegie Mellon University
21126353Smlaier *  Pittsburgh PA 15213-3890
22126353Smlaier *
23126353Smlaier * any improvements or extensions that they make and grant Carnegie the
24126353Smlaier * rights to redistribute these changes.
25126353Smlaier *
26126353Smlaier *	$Id$
27126353Smlaier */
28126353Smlaier
29148787Sbrueffer/*
30126353Smlaier * 	Author: David B. Golub, Carnegie Mellon University
31126353Smlaier *	Date:	7/90
32126353Smlaier */
33126353Smlaier
34126353Smlaier#include "param.h"
35126353Smlaier#include "proc.h"
36126353Smlaier#include <machine/db_machdep.h>
37126353Smlaier
38126353Smlaier#include <ddb/db_lex.h>
39126353Smlaier#include <ddb/db_variables.h>
40126353Smlaier
41126353Smlaierextern unsigned int	db_maxoff;
42126353Smlaier
43126353Smlaierextern int	db_radix;
44126353Smlaierextern int	db_max_width;
45126353Smlaierextern int	db_tab_stop_width;
46126353Smlaier
47126353Smlaierstruct db_variable db_vars[] = {
48126353Smlaier	{ "radix",	&db_radix, FCN_NULL },
49126353Smlaier	{ "maxoff",	(int *)&db_maxoff, FCN_NULL },
50126353Smlaier	{ "maxwidth",	&db_max_width, FCN_NULL },
51126353Smlaier	{ "tabstops",	&db_tab_stop_width, FCN_NULL },
52126353Smlaier};
53126353Smlaierstruct db_variable *db_evars = db_vars + sizeof(db_vars)/sizeof(db_vars[0]);
54126353Smlaier
55126353Smlaierint
56126353Smlaierdb_find_variable(varp)
57126353Smlaier	struct db_variable	**varp;
58126353Smlaier{
59126353Smlaier	int	t;
60126353Smlaier	struct db_variable *vp;
61126353Smlaier
62126353Smlaier	t = db_read_token();
63126353Smlaier	if (t == tIDENT) {
64126353Smlaier	    for (vp = db_vars; vp < db_evars; vp++) {
65126353Smlaier		if (!strcmp(db_tok_string, vp->name)) {
66126353Smlaier		    *varp = vp;
67126353Smlaier		    return (1);
68126353Smlaier		}
69126353Smlaier	    }
70126353Smlaier	    for (vp = db_regs; vp < db_eregs; vp++) {
71126353Smlaier		if (!strcmp(db_tok_string, vp->name)) {
72126353Smlaier		    *varp = vp;
73126353Smlaier		    return (1);
74126353Smlaier		}
75126353Smlaier	    }
76126353Smlaier	}
77126353Smlaier	db_error("Unknown variable\n");
78126353Smlaier	return (0);
79126353Smlaier}
80126353Smlaier
81126353Smlaierint
82126353Smlaierdb_get_variable(valuep)
83130614Smlaier	db_expr_t	*valuep;
84126353Smlaier{
85126353Smlaier	struct db_variable *vp;
86126353Smlaier
87126353Smlaier	if (!db_find_variable(&vp))
88126353Smlaier	    return (0);
89126353Smlaier
90126353Smlaier	db_read_variable(vp, valuep);
91126353Smlaier
92126353Smlaier	return (1);
93126353Smlaier}
94126353Smlaier
95126353Smlaierint
96126353Smlaierdb_set_variable(value)
97126353Smlaier	db_expr_t	value;
98126353Smlaier{
99126353Smlaier	struct db_variable *vp;
100126353Smlaier
101126353Smlaier	if (!db_find_variable(&vp))
102126353Smlaier	    return (0);
103126353Smlaier
104126353Smlaier	db_write_variable(vp, &value);
105126353Smlaier
106126353Smlaier	return (1);
107126353Smlaier}
108126353Smlaier
109126353Smlaier
110126353Smlaierdb_read_variable(vp, valuep)
111126353Smlaier	struct db_variable *vp;
112126353Smlaier	db_expr_t	*valuep;
113126353Smlaier{
114126353Smlaier	int	(*func)() = vp->fcn;
115126353Smlaier
116126353Smlaier	if (func == FCN_NULL)
117126353Smlaier	    *valuep = *(vp->valuep);
118126353Smlaier	else
119126353Smlaier	    (*func)(vp, valuep, DB_VAR_GET);
120126353Smlaier}
121126353Smlaier
122126353Smlaierdb_write_variable(vp, valuep)
123126353Smlaier	struct db_variable *vp;
124126353Smlaier	db_expr_t	*valuep;
125126353Smlaier{
126126353Smlaier	int	(*func)() = vp->fcn;
127126353Smlaier
128126353Smlaier	if (func == FCN_NULL)
129126353Smlaier	    *(vp->valuep) = *valuep;
130126353Smlaier	else
131126353Smlaier	    (*func)(vp, valuep, DB_VAR_SET);
132126353Smlaier}
133126353Smlaier
134126353Smlaiervoid
135126353Smlaierdb_set_cmd()
136126353Smlaier{
137126353Smlaier	db_expr_t	value;
138126353Smlaier	int	(*func)();
139126353Smlaier	struct db_variable *vp;
140126353Smlaier	int	t;
141126353Smlaier
142126353Smlaier	t = db_read_token();
143126353Smlaier	if (t != tDOLLAR) {
144126353Smlaier	    db_error("Unknown variable\n");
145126353Smlaier	    return;
146126353Smlaier	}
147126353Smlaier	if (!db_find_variable(&vp)) {
148126353Smlaier	    db_error("Unknown variable\n");
149126353Smlaier	    return;
150126353Smlaier	}
151126353Smlaier
152126353Smlaier	t = db_read_token();
153126353Smlaier	if (t != tEQ)
154126353Smlaier	    db_unread_token(t);
155126353Smlaier
156126353Smlaier	if (!db_expression(&value)) {
157126353Smlaier	    db_error("No value\n");
158126353Smlaier	    return;
159126353Smlaier	}
160126353Smlaier	if (db_read_token() != tEOL) {
161126353Smlaier	    db_error("?\n");
162126353Smlaier	}
163126353Smlaier
164126353Smlaier	db_write_variable(vp, &value);
165126353Smlaier}
166145837Smlaier