xref: /plan9-contrib/sys/src/cmd/acid/util.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
1bd389b36SDavid du Colombier #include <u.h>
2bd389b36SDavid du Colombier #include <libc.h>
3bd389b36SDavid du Colombier #include <bio.h>
4bd389b36SDavid du Colombier #include <ctype.h>
5bd389b36SDavid du Colombier #include <mach.h>
6bd389b36SDavid du Colombier #define Extern extern
7bd389b36SDavid du Colombier #include "acid.h"
8bd389b36SDavid du Colombier #include "y.tab.h"
9bd389b36SDavid du Colombier 
10bd389b36SDavid du Colombier static int syren;
11bd389b36SDavid du Colombier 
12*219b2ee8SDavid du Colombier Lsym*
13*219b2ee8SDavid du Colombier unique(char *buf, Sym *s)
14*219b2ee8SDavid du Colombier {
15*219b2ee8SDavid du Colombier 	Lsym *l;
16*219b2ee8SDavid du Colombier 	int i, renamed;
17*219b2ee8SDavid du Colombier 
18*219b2ee8SDavid du Colombier 	renamed = 0;
19*219b2ee8SDavid du Colombier 	strcpy(buf, s->name);
20*219b2ee8SDavid du Colombier 	for(;;) {
21*219b2ee8SDavid du Colombier 		l = look(buf);
22*219b2ee8SDavid du Colombier 		if(l == 0 || (l->lexval == Tid && l->v->set == 0))
23*219b2ee8SDavid du Colombier 			break;
24*219b2ee8SDavid du Colombier 
25*219b2ee8SDavid du Colombier 		if(syren == 0 && !quiet) {
26*219b2ee8SDavid du Colombier 			print("Symbol renames:\n");
27*219b2ee8SDavid du Colombier 			syren = 1;
28*219b2ee8SDavid du Colombier 		}
29*219b2ee8SDavid du Colombier 		i = strlen(buf)+1;
30*219b2ee8SDavid du Colombier 		memmove(buf+1, buf, i);
31*219b2ee8SDavid du Colombier 		buf[0] = '$';
32*219b2ee8SDavid du Colombier 		renamed++;
33*219b2ee8SDavid du Colombier 		if(renamed > 5 && !quiet) {
34*219b2ee8SDavid du Colombier 			print("Too many renames; must be X source!\n");
35*219b2ee8SDavid du Colombier 			break;
36*219b2ee8SDavid du Colombier 		}
37*219b2ee8SDavid du Colombier 	}
38*219b2ee8SDavid du Colombier 	if(renamed && !quiet)
39*219b2ee8SDavid du Colombier 		print("\t%s=%s %c/%lux\n", s->name, buf, s->type, s->value);
40*219b2ee8SDavid du Colombier 	if(l == 0)
41*219b2ee8SDavid du Colombier 		l = enter(buf, Tid);
42*219b2ee8SDavid du Colombier 	return l;
43*219b2ee8SDavid du Colombier }
44*219b2ee8SDavid du Colombier 
45bd389b36SDavid du Colombier void
46bd389b36SDavid du Colombier varsym(void)
47bd389b36SDavid du Colombier {
48bd389b36SDavid du Colombier 	int i;
49bd389b36SDavid du Colombier 	Sym *s;
50bd389b36SDavid du Colombier 	long n;
51bd389b36SDavid du Colombier 	Lsym *l;
52bd389b36SDavid du Colombier 	ulong v;
53*219b2ee8SDavid du Colombier 	char buf[1024];
54bd389b36SDavid du Colombier 	List *list, **tail, *l2, *tl;
55bd389b36SDavid du Colombier 
56bd389b36SDavid du Colombier 	tail = &l2;
57*219b2ee8SDavid du Colombier 	l2 = 0;
58bd389b36SDavid du Colombier 
59bd389b36SDavid du Colombier 	symbase(&n);
60bd389b36SDavid du Colombier 	for(i = 0; i < n; i++) {
61bd389b36SDavid du Colombier 		s = getsym(i);
62bd389b36SDavid du Colombier 		switch(s->type) {
63bd389b36SDavid du Colombier 		case 'T':
64bd389b36SDavid du Colombier 		case 'L':
65bd389b36SDavid du Colombier 		case 'D':
66bd389b36SDavid du Colombier 		case 'B':
67bd389b36SDavid du Colombier 		case 'b':
68bd389b36SDavid du Colombier 		case 'd':
69bd389b36SDavid du Colombier 		case 'l':
70bd389b36SDavid du Colombier 		case 't':
71bd389b36SDavid du Colombier 			if(s->name[0] == '.')
72bd389b36SDavid du Colombier 				continue;
73bd389b36SDavid du Colombier 
74bd389b36SDavid du Colombier 			v = s->value;
75bd389b36SDavid du Colombier 			tl = al(TLIST);
76bd389b36SDavid du Colombier 			*tail = tl;
77bd389b36SDavid du Colombier 			tail = &tl->next;
78bd389b36SDavid du Colombier 
79*219b2ee8SDavid du Colombier 			l = unique(buf, s);
80bd389b36SDavid du Colombier 
81bd389b36SDavid du Colombier 			l->v->set = 1;
82bd389b36SDavid du Colombier 			l->v->type = TINT;
83bd389b36SDavid du Colombier 			l->v->ival = v;
84*219b2ee8SDavid du Colombier 			if(l->v->comt == 0)
85bd389b36SDavid du Colombier 				l->v->fmt = 'X';
86bd389b36SDavid du Colombier 
87bd389b36SDavid du Colombier 			/* Enter as list of { name, type, value } */
88bd389b36SDavid du Colombier 			list = al(TSTRING);
89bd389b36SDavid du Colombier 			tl->l = list;
90bd389b36SDavid du Colombier 			list->string = strnode(buf);
91bd389b36SDavid du Colombier 			list->fmt = 's';
92bd389b36SDavid du Colombier 			list->next = al(TINT);
93bd389b36SDavid du Colombier 			list = list->next;
94bd389b36SDavid du Colombier 			list->fmt = 'c';
95bd389b36SDavid du Colombier 			list->ival = s->type;
96bd389b36SDavid du Colombier 			list->next = al(TINT);
97bd389b36SDavid du Colombier 			list = list->next;
98bd389b36SDavid du Colombier 			list->fmt = 'X';
99bd389b36SDavid du Colombier 			list->ival = v;
100bd389b36SDavid du Colombier 
101bd389b36SDavid du Colombier 		}
102bd389b36SDavid du Colombier 	}
103bd389b36SDavid du Colombier 	l = mkvar("symbols");
104bd389b36SDavid du Colombier 	l->v->set = 1;
105bd389b36SDavid du Colombier 	l->v->type = TLIST;
106bd389b36SDavid du Colombier 	l->v->l = l2;
107*219b2ee8SDavid du Colombier 	if(l2 == 0)
108*219b2ee8SDavid du Colombier 		print("no symbol information\n");
109bd389b36SDavid du Colombier }
110bd389b36SDavid du Colombier 
111bd389b36SDavid du Colombier void
112bd389b36SDavid du Colombier varreg(void)
113bd389b36SDavid du Colombier {
114bd389b36SDavid du Colombier 	Lsym *l;
115bd389b36SDavid du Colombier 	Value *v;
116bd389b36SDavid du Colombier 	Reglist *r;
117bd389b36SDavid du Colombier 	List **tail, *li;
118bd389b36SDavid du Colombier 
119bd389b36SDavid du Colombier 	l = mkvar("registers");
120bd389b36SDavid du Colombier 	v = l->v;
121bd389b36SDavid du Colombier 	v->set = 1;
122bd389b36SDavid du Colombier 	v->type = TLIST;
123bd389b36SDavid du Colombier 	v->l = 0;
124bd389b36SDavid du Colombier 	tail = &v->l;
125bd389b36SDavid du Colombier 
126bd389b36SDavid du Colombier 	for(r = mach->reglist; r->rname; r++) {
127bd389b36SDavid du Colombier 		l = mkvar(r->rname);
128bd389b36SDavid du Colombier 		v = l->v;
129bd389b36SDavid du Colombier 		v->set = 1;
130bd389b36SDavid du Colombier 		v->ival = mach->kbase+r->roffs;
131bd389b36SDavid du Colombier 		v->fmt = r->rformat;
132bd389b36SDavid du Colombier 		v->type = TINT;
133bd389b36SDavid du Colombier 
134bd389b36SDavid du Colombier 		li = al(TSTRING);
135bd389b36SDavid du Colombier 		li->string = strnode(r->rname);
136bd389b36SDavid du Colombier 		li->fmt = 's';
137bd389b36SDavid du Colombier 		*tail = li;
138bd389b36SDavid du Colombier 		tail = &li->next;
139bd389b36SDavid du Colombier 	}
140bd389b36SDavid du Colombier 
141bd389b36SDavid du Colombier 	if(machdata == 0)
142bd389b36SDavid du Colombier 		return;
143bd389b36SDavid du Colombier 
144bd389b36SDavid du Colombier 	l = mkvar("bpinst");	/* Breakpoint text */
145bd389b36SDavid du Colombier 	v = l->v;
146bd389b36SDavid du Colombier 	v->type = TSTRING;
147bd389b36SDavid du Colombier 	v->fmt = 's';
148bd389b36SDavid du Colombier 	v->set = 1;
149bd389b36SDavid du Colombier 	v->string = gmalloc(sizeof(String));
150bd389b36SDavid du Colombier 	v->string->len = machdata->bpsize;
151bd389b36SDavid du Colombier 	v->string->string = gmalloc(machdata->bpsize);
152bd389b36SDavid du Colombier 	memmove(v->string->string, machdata->bpinst, machdata->bpsize);
153bd389b36SDavid du Colombier }
154bd389b36SDavid du Colombier 
155*219b2ee8SDavid du Colombier void
156*219b2ee8SDavid du Colombier loadvars(void)
157bd389b36SDavid du Colombier {
158*219b2ee8SDavid du Colombier 	Lsym *l;
159*219b2ee8SDavid du Colombier 	Value *v;
160*219b2ee8SDavid du Colombier 
161*219b2ee8SDavid du Colombier 	l =  mkvar("proc");
162*219b2ee8SDavid du Colombier 	v = l->v;
163*219b2ee8SDavid du Colombier 	v->type = TINT;
164*219b2ee8SDavid du Colombier 	v->fmt = 'X';
165*219b2ee8SDavid du Colombier 	v->set = 1;
166*219b2ee8SDavid du Colombier 	v->ival = 0;
167*219b2ee8SDavid du Colombier 
168*219b2ee8SDavid du Colombier 	l = mkvar("pid");		/* Current process */
169*219b2ee8SDavid du Colombier 	v = l->v;
170*219b2ee8SDavid du Colombier 	v->type = TINT;
171*219b2ee8SDavid du Colombier 	v->fmt = 'D';
172*219b2ee8SDavid du Colombier 	v->set = 1;
173*219b2ee8SDavid du Colombier 	v->ival = 0;
174*219b2ee8SDavid du Colombier 
175*219b2ee8SDavid du Colombier 	mkvar("notes");			/* Pending notes */
176*219b2ee8SDavid du Colombier 
177*219b2ee8SDavid du Colombier 	l = mkvar("proclist");		/* Attached processes */
178*219b2ee8SDavid du Colombier 	l->v->type = TLIST;
179*219b2ee8SDavid du Colombier }
180*219b2ee8SDavid du Colombier 
181*219b2ee8SDavid du Colombier ulong
182*219b2ee8SDavid du Colombier rget(Map *map, char *reg)
183*219b2ee8SDavid du Colombier {
184*219b2ee8SDavid du Colombier 	Lsym *s;
185*219b2ee8SDavid du Colombier 	long x;
186*219b2ee8SDavid du Colombier 
187*219b2ee8SDavid du Colombier 	s = look(reg);
188*219b2ee8SDavid du Colombier 	if(s == 0)
189*219b2ee8SDavid du Colombier 		fatal("rget: %s\n", reg);
190*219b2ee8SDavid du Colombier 
191*219b2ee8SDavid du Colombier 	if (get4(map, s->v->ival, &x) < 0)
192*219b2ee8SDavid du Colombier 		error("can't get register %s: %r\n", reg);
193*219b2ee8SDavid du Colombier 	return x;
194*219b2ee8SDavid du Colombier }
195*219b2ee8SDavid du Colombier 
196*219b2ee8SDavid du Colombier String*
197*219b2ee8SDavid du Colombier strnodlen(char *name, int len)
198*219b2ee8SDavid du Colombier {
199bd389b36SDavid du Colombier 	String *s;
200bd389b36SDavid du Colombier 
201bd389b36SDavid du Colombier 	s = gmalloc(sizeof(String)+len+1);
202bd389b36SDavid du Colombier 	s->string = (char*)s+sizeof(String);
203bd389b36SDavid du Colombier 	s->len = len;
204*219b2ee8SDavid du Colombier 	if(name != 0)
205*219b2ee8SDavid du Colombier 		memmove(s->string, name, len);
206*219b2ee8SDavid du Colombier 	s->string[len] = '\0';
207*219b2ee8SDavid du Colombier 
208*219b2ee8SDavid du Colombier 	s->gclink = gcl;
209*219b2ee8SDavid du Colombier 	gcl = s;
210*219b2ee8SDavid du Colombier 
211*219b2ee8SDavid du Colombier 	return s;
212*219b2ee8SDavid du Colombier }
213*219b2ee8SDavid du Colombier 
214*219b2ee8SDavid du Colombier String*
215*219b2ee8SDavid du Colombier strnode(char *name)
216*219b2ee8SDavid du Colombier {
217*219b2ee8SDavid du Colombier 	return strnodlen(name, strlen(name));
218*219b2ee8SDavid du Colombier }
219*219b2ee8SDavid du Colombier 
220*219b2ee8SDavid du Colombier String*
221*219b2ee8SDavid du Colombier runenode(Rune *name)
222*219b2ee8SDavid du Colombier {
223*219b2ee8SDavid du Colombier 	int len;
224*219b2ee8SDavid du Colombier 	Rune *p;
225*219b2ee8SDavid du Colombier 	String *s;
226*219b2ee8SDavid du Colombier 
227*219b2ee8SDavid du Colombier 	p = name;
228*219b2ee8SDavid du Colombier 	for(len = 0; *p; p++)
229*219b2ee8SDavid du Colombier 		len++;
230*219b2ee8SDavid du Colombier 
231*219b2ee8SDavid du Colombier 	len++;
232*219b2ee8SDavid du Colombier 	len *= sizeof(Rune);
233*219b2ee8SDavid du Colombier 	s = gmalloc(sizeof(String)+len);
234*219b2ee8SDavid du Colombier 	s->string = (char*)s+sizeof(String);
235*219b2ee8SDavid du Colombier 	s->len = len;
236*219b2ee8SDavid du Colombier 	memmove(s->string, name, len);
237bd389b36SDavid du Colombier 
238bd389b36SDavid du Colombier 	s->gclink = gcl;
239bd389b36SDavid du Colombier 	gcl = s;
240bd389b36SDavid du Colombier 
241bd389b36SDavid du Colombier 	return s;
242bd389b36SDavid du Colombier }
243bd389b36SDavid du Colombier 
244bd389b36SDavid du Colombier String*
245bd389b36SDavid du Colombier stradd(String *l, String *r)
246bd389b36SDavid du Colombier {
247bd389b36SDavid du Colombier 	int len;
248bd389b36SDavid du Colombier 	String *s;
249bd389b36SDavid du Colombier 
250bd389b36SDavid du Colombier 	len = l->len+r->len;
251bd389b36SDavid du Colombier 	s = gmalloc(sizeof(String)+len+1);
252bd389b36SDavid du Colombier 	s->gclink = gcl;
253bd389b36SDavid du Colombier 	gcl = s;
254bd389b36SDavid du Colombier 	s->len = len;
255bd389b36SDavid du Colombier 	s->string = (char*)s+sizeof(String);
256bd389b36SDavid du Colombier 	memmove(s->string, l->string, l->len);
257bd389b36SDavid du Colombier 	memmove(s->string+l->len, r->string, r->len);
258bd389b36SDavid du Colombier 	s->string[s->len] = 0;
259bd389b36SDavid du Colombier 	return s;
260bd389b36SDavid du Colombier }
261bd389b36SDavid du Colombier 
262bd389b36SDavid du Colombier int
263bd389b36SDavid du Colombier scmp(String *sr, String *sl)
264bd389b36SDavid du Colombier {
265bd389b36SDavid du Colombier 	if(sr->len != sl->len)
266bd389b36SDavid du Colombier 		return 0;
267bd389b36SDavid du Colombier 
268bd389b36SDavid du Colombier 	if(memcmp(sr->string, sl->string, sl->len))
269bd389b36SDavid du Colombier 		return 0;
270bd389b36SDavid du Colombier 
271bd389b36SDavid du Colombier 	return 1;
272bd389b36SDavid du Colombier }
273