4 // #include "basics.h" included later to avoid macro recursion for malloc
9 uint nbits_aux1, *e_aux1, p_aux1;
10 uint nbits_aux2, *e_aux2, p_aux2;
11 uint nbits_aux3, *e_aux3, p_aux3;
25 if (n == 0) return NULL;
27 p = (void*) malloc (n);
29 p = (void*) (malloc (n+sizeof(int))+sizeof(int));
32 { fprintf (stderr,"Could not allocate %i bytes\n",n);
39 if (newmem > maxmem) maxmem = newmem;
40 if (currmem/1024 != newmem/1024)
41 printf ("Memory: %i Kb, maximum: %i Kb\n",newmem/1024,maxmem/1024);
56 { newmem = currmem - *(((int*)p)-1);
57 free ((void*)(((int)p)-sizeof(int)));
58 if (currmem/1024 != newmem/1024)
59 printf ("Memory: %i Kb, maximum: %i Kb\n",newmem/1024,maxmem/1024);
65 void *Realloc (void *p, int n)
67 { if (p == NULL) return Malloc (n);
68 if (n == 0) { Free(p); return NULL; }
70 p = (void*) realloc (p,n);
73 newmem = currmem - *(((int*)p)-1);
74 p = (void*) (realloc ((void*)(((int)p)-sizeof(int)),n+sizeof(int))+sizeof(int));
78 { fprintf (stderr,"Could not allocate %i bytes\n",n);
83 { newmem = newmem + n;
84 if (newmem > maxmem) maxmem = newmem;
85 if (currmem/1024 != newmem/1024)
86 printf ("Memory: %i Kb, maximum: %i Kb\n",newmem/1024,maxmem/1024);
95 // bits needed to represent a number between 0 and n
108 register uint i=(p_aux1>>5), j=p_aux1&0x1F, answ;
109 if (j+nbits_aux1 <= W)
110 answ = (e_aux1[i] << (W-j-nbits_aux1)) >> (W-nbits_aux1);
112 answ = e_aux1[i] >> j;
113 answ = answ | ((e_aux1[i+1] << (W-j-nbits_aux1)) >> (W-nbits_aux1));
120 register uint i=(p_aux2>>5), j=p_aux2&0x1F, answ;
121 if (j+nbits_aux2 <= W)
122 answ = (e_aux2[i] << (W-j-nbits_aux2)) >> (W-nbits_aux2);
124 answ = e_aux2[i] >> j;
125 answ = answ | ((e_aux2[i+1] << (W-j-nbits_aux2)) >> (W-nbits_aux2));
132 register uint i=(p_aux3>>5), j=p_aux3&0x1F, answ;
133 if (j+nbits_aux3 <= W)
134 answ = (e_aux3[i] << (W-j-nbits_aux3)) >> (W-nbits_aux3);
136 answ = e_aux3[i] >> j;
137 answ = answ | ((e_aux3[i+1] << (W-j-nbits_aux3)) >> (W-nbits_aux3));
143 // returns e[p..p+len-1], assuming len <= W
145 uint bitget (uint *e, uint p, uint len)
147 register uint i=(p>>5), j=p&0x1F, answ;
149 answ = (e[i] << (W-j-len)) >> (W-len);
152 answ = answ | ((e[i+1] << (W-j-len)) >> (W-len));
157 // writes e[p..p+len-1] = s, len <= W
159 void bitput (register uint *e, register uint p,
160 register uint len, register uint s)
162 { e += p >> bitsW; p &= (1<<bitsW)-1;
164 { *e |= (*e & ((1<<p)-1)) | (s << p);
167 *e = (*e & ~((1<<p)-1)) | (s >> (W-p));
169 else { if (p+len <= W)
170 { *e = (*e & ~(((1<<len)-1)<<p)) | (s << p);
173 *e = (*e & ((1<<p)-1)) | (s << p);
175 *e = (*e & ~((1<<len)-1)) | (s >> (W-p));