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