1 #include <u.h>
2 #include <libc.h>
3 #include <bio.h>
4
5 #include "object.h"
6 #include "catset.h"
7
8 static int debug = 0;
9
10 int
catsetneeded(int v)11 catsetneeded(int v)
12 {
13 return (v / 8) + 1;
14 }
15
16 static void
catsetprint(int f,Catset * cs)17 catsetprint(int f, Catset*cs)
18 {
19 int i;
20 fprint(2, "(%p %d:", cs->bitpiece, cs->nbitpiece);
21 for (i = 0; i < cs->nbitpiece; i++)
22 fprint(f, "[%d]=%x", i, cs->bitpiece[i]);
23 fprint(2, ")");
24 }
25
26 void
catsetrealloc(Catset * cs,int sz)27 catsetrealloc(Catset *cs, int sz)
28 {
29 if (debug) fprint(2, "catsetrealloc %p %d (%p %d)", cs, sz, cs->bitpiece, cs->nbitpiece);
30 if (sz > cs->nbitpiece) {
31 cs->bitpiece = realloc(cs->bitpiece, sz*sizeof(uchar));
32 memset(cs->bitpiece + cs->nbitpiece, 0, sz - cs->nbitpiece);
33 cs->nbitpiece = sz;
34 }
35 if (debug) fprint(2, " -> %p %d\n", cs->bitpiece, cs->nbitpiece);
36 }
37
38 void
catsetfree(Catset * cs)39 catsetfree(Catset *cs)
40 {
41 free(cs->bitpiece);
42 cs->bitpiece = 0;
43 cs->nbitpiece = 0;
44 }
45
46 void
catsetinit(Catset * cs,int v)47 catsetinit(Catset*cs, int v)
48 {
49 int n;
50
51 n = catsetneeded(v);
52 if (debug) fprint(2, "catsetinit %p %d -> ", cs, v);
53 catsetrealloc(cs, n);
54 catsetset(cs, v);
55 if (debug) catsetprint(2, cs);
56 if (debug) fprint(2, "\n");
57 }
58
59 void
catsetcopy(Catset * dst,Catset * src)60 catsetcopy(Catset*dst, Catset*src)
61 {
62 if (debug) fprint(2, "catsetcopy %p %p ", dst, src);
63 if (debug) catsetprint(2, dst);
64 if (debug) fprint(2, " ");
65 if (debug) catsetprint(2, src);
66 if (dst->nbitpiece < src->nbitpiece)
67 catsetrealloc(dst, src->nbitpiece);
68 else
69 memset(dst->bitpiece, 0, dst->nbitpiece);
70 memcpy(dst->bitpiece, src->bitpiece, src->nbitpiece);
71 dst->nbitpiece = src->nbitpiece;
72 if (debug) fprint(2, "-> ");
73 if (debug) catsetprint(2, dst);
74 if (debug) fprint(2, "\n");
75 }
76
77 void
catsetset(Catset * cs,int v)78 catsetset(Catset*cs, int v)
79 {
80 int p = v / 8;
81 int b = v % 8;
82 if (debug) fprint(2, "catsetset %p %d ", cs, v);
83 if (debug) catsetprint(2, cs);
84 cs->bitpiece[p] = 1 << b;
85 if (debug) fprint(2, "-> ");
86 if (debug) catsetprint(2, cs);
87 if (debug) fprint(2, "\n");
88 }
89
90 int
catsetisset(Catset * cs)91 catsetisset(Catset*cs)
92 {
93 int i;
94
95 if (debug) fprint(2, "catsetisset %p ", cs);
96 if (debug) catsetprint(2, cs);
97 if (debug) fprint(2, "\n");
98 for (i =0; i < cs->nbitpiece; i++) {
99 if (cs->bitpiece[i])
100 return 1;
101 }
102 return 0;
103 }
104
105 void
catsetorset(Catset * dst,Catset * src)106 catsetorset(Catset*dst, Catset*src)
107 {
108 int i;
109
110 if (debug) fprint(2, "catsetorset %p %p ", dst, src);
111 if (debug) catsetprint(2, dst);
112 if (debug) fprint(2, " ");
113 if (debug) catsetprint(2, src);
114 if (src->nbitpiece > dst->nbitpiece)
115 catsetrealloc(dst, src->nbitpiece);
116
117 for (i =0; i < src->nbitpiece; i++) {
118 dst->bitpiece[i] |= src->bitpiece[i];
119 }
120 if (debug) fprint(2, "-> ");
121 if (debug) catsetprint(2, dst);
122 if (debug) fprint(2, "\n");
123 }
124
125 int
catseteq(Catset * cs1,Catset * cs2)126 catseteq(Catset*cs1, Catset*cs2)
127 {
128 int i;
129 Catset *css, * csl;
130
131 if (debug) fprint(2, "catseteq %p %p ", cs1, cs2);
132 if (debug) catsetprint(2, cs1);
133 if (debug) fprint(2, " ");
134 if (debug) catsetprint(2, cs2);
135 if (debug) fprint(2, "\n");
136 if (cs1->nbitpiece > cs2->nbitpiece) {
137 csl = cs1;
138 css = cs2;
139 } else {
140 csl = cs2;
141 css = cs1;
142 }
143 for (i =0; i < css->nbitpiece; i++) {
144 if (css->bitpiece[i] != csl->bitpiece[i])
145 return 0;
146 }
147 for (i = css->nbitpiece; i < csl->nbitpiece; i++) {
148 if (csl->bitpiece[i])
149 return 0;
150 }
151 return 1;
152 }
153