1 #include "gc.h"
2
3 /*
4 Bits
5 bor(Bits a, Bits b)
6 {
7 Bits c;
8 int i;
9
10 for(i=0; i<BITS; i++)
11 c.b[i] = a.b[i] | b.b[i];
12 return c;
13 }
14 */
15
16 /*
17 Bits
18 band(Bits a, Bits b)
19 {
20 Bits c;
21 int i;
22
23 for(i=0; i<BITS; i++)
24 c.b[i] = a.b[i] & b.b[i];
25 return c;
26 }
27 */
28
29 /*
30 Bits
31 bnot(Bits a)
32 {
33 Bits c;
34 int i;
35
36 for(i=0; i<BITS; i++)
37 c.b[i] = ~a.b[i];
38 return c;
39 }
40 */
41
42 int
bany(Bits * a)43 bany(Bits *a)
44 {
45 int i;
46
47 for(i=0; i<BITS; i++)
48 if(a->b[i])
49 return 1;
50 return 0;
51 }
52
53 /*
54 int
55 beq(Bits a, Bits b)
56 {
57 int i;
58
59 for(i=0; i<BITS; i++)
60 if(a.b[i] != b.b[i])
61 return 0;
62 return 1;
63 }
64 */
65
66 int
bnum(Bits a)67 bnum(Bits a)
68 {
69 int i;
70 long b;
71
72 for(i=0; i<BITS; i++)
73 if(b = a.b[i])
74 return 32*i + bitno(b);
75 diag(Z, "bad in bnum");
76 return 0;
77 }
78
79 Bits
blsh(unsigned n)80 blsh(unsigned n)
81 {
82 Bits c;
83
84 c = zbits;
85 c.b[n/32] = 1L << (n%32);
86 return c;
87 }
88
89 /*
90 int
91 bset(Bits a, unsigned n)
92 {
93 int i;
94
95 if(a.b[n/32] & (1L << (n%32)))
96 return 1;
97 return 0;
98 }
99 */
100
101 int
Bconv(va_list * arg,Fconv * fp)102 Bconv(va_list *arg, Fconv *fp)
103 {
104 char str[STRINGSZ], ss[STRINGSZ], *s;
105 Bits bits;
106 int i;
107
108 str[0] = 0;
109 bits = va_arg(*arg, Bits);
110 while(bany(&bits)) {
111 i = bnum(bits);
112 if(str[0])
113 strcat(str, " ");
114 if(var[i].sym == S) {
115 sprint(ss, "$%ld", var[i].offset);
116 s = ss;
117 } else
118 s = var[i].sym->name;
119 if(strlen(str) + strlen(s) + 1 >= STRINGSZ)
120 break;
121 strcat(str, s);
122 bits.b[i/32] &= ~(1L << (i%32));
123 }
124 strconv(str, fp);
125 return 0;
126 }
127