xref: /plan9-contrib/sys/src/cmd/9c/bits.c (revision fbadb1c4d4463e58337ffb1ed396c9caee5d1889)
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