xref: /plan9/sys/src/cmd/cc/pswt.c (revision 4ac975e2e38b792d24bc60de7fce5e6173f046ea)
1*4ac975e2SDavid du Colombier #include "gc.h"
2*4ac975e2SDavid du Colombier 
3*4ac975e2SDavid du Colombier int
4*4ac975e2SDavid du Colombier swcmp(const void *a1, const void *a2)
5*4ac975e2SDavid du Colombier {
6*4ac975e2SDavid du Colombier 	C1 *p1, *p2;
7*4ac975e2SDavid du Colombier 
8*4ac975e2SDavid du Colombier 	p1 = (C1*)a1;
9*4ac975e2SDavid du Colombier 	p2 = (C1*)a2;
10*4ac975e2SDavid du Colombier 	if(p1->val < p2->val)
11*4ac975e2SDavid du Colombier 		return -1;
12*4ac975e2SDavid du Colombier 	return p1->val > p2->val;
13*4ac975e2SDavid du Colombier }
14*4ac975e2SDavid du Colombier 
15*4ac975e2SDavid du Colombier void
16*4ac975e2SDavid du Colombier doswit(Node *n)
17*4ac975e2SDavid du Colombier {
18*4ac975e2SDavid du Colombier 	Case *c;
19*4ac975e2SDavid du Colombier 	C1 *q, *iq;
20*4ac975e2SDavid du Colombier 	long def, nc, i;
21*4ac975e2SDavid du Colombier 
22*4ac975e2SDavid du Colombier 	def = 0;
23*4ac975e2SDavid du Colombier 	nc = 0;
24*4ac975e2SDavid du Colombier 	for(c = cases; c->link != C; c = c->link) {
25*4ac975e2SDavid du Colombier 		if(c->def) {
26*4ac975e2SDavid du Colombier 			if(def)
27*4ac975e2SDavid du Colombier 				diag(n, "more than one default in switch");
28*4ac975e2SDavid du Colombier 			def = c->label;
29*4ac975e2SDavid du Colombier 			continue;
30*4ac975e2SDavid du Colombier 		}
31*4ac975e2SDavid du Colombier 		nc++;
32*4ac975e2SDavid du Colombier 	}
33*4ac975e2SDavid du Colombier 
34*4ac975e2SDavid du Colombier 	iq = alloc(nc*sizeof(C1));
35*4ac975e2SDavid du Colombier 	q = iq;
36*4ac975e2SDavid du Colombier 	for(c = cases; c->link != C; c = c->link) {
37*4ac975e2SDavid du Colombier 		if(c->def)
38*4ac975e2SDavid du Colombier 			continue;
39*4ac975e2SDavid du Colombier 		q->label = c->label;
40*4ac975e2SDavid du Colombier 		q->val = c->val;
41*4ac975e2SDavid du Colombier 		q++;
42*4ac975e2SDavid du Colombier 	}
43*4ac975e2SDavid du Colombier 	qsort(iq, nc, sizeof(C1), swcmp);
44*4ac975e2SDavid du Colombier 	if(debug['W'])
45*4ac975e2SDavid du Colombier 	for(i=0; i<nc; i++)
46*4ac975e2SDavid du Colombier 		print("case %2ld: = %.8llux\n", i, (vlong)iq[i].val);
47*4ac975e2SDavid du Colombier 	for(i=0; i<nc-1; i++)
48*4ac975e2SDavid du Colombier 		if(iq[i].val == iq[i+1].val)
49*4ac975e2SDavid du Colombier 			diag(n, "duplicate cases in switch %lld", (vlong)iq[i].val);
50*4ac975e2SDavid du Colombier 	if(def == 0) {
51*4ac975e2SDavid du Colombier 		def = breakpc;
52*4ac975e2SDavid du Colombier 		nbreak++;
53*4ac975e2SDavid du Colombier 	}
54*4ac975e2SDavid du Colombier 	swit1(iq, nc, def, n);
55*4ac975e2SDavid du Colombier }
56*4ac975e2SDavid du Colombier 
57*4ac975e2SDavid du Colombier void
58*4ac975e2SDavid du Colombier cas(void)
59*4ac975e2SDavid du Colombier {
60*4ac975e2SDavid du Colombier 	Case *c;
61*4ac975e2SDavid du Colombier 
62*4ac975e2SDavid du Colombier 	c = alloc(sizeof(*c));
63*4ac975e2SDavid du Colombier 	c->link = cases;
64*4ac975e2SDavid du Colombier 	cases = c;
65*4ac975e2SDavid du Colombier }
66*4ac975e2SDavid du Colombier 
67