xref: /plan9-contrib/sys/src/games/music/jukefs/catset.c (revision 57ea29230156334add5f192279098aead66e5fca)
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