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