Debug swcsa
[SXSI/TextCollection.git] / lzindex / basics.c
1
2 // Basics
3
4 // #include "basics.h" included later to avoid macro recursion for malloc
5 #include <sys/types.h>
6 #include <stdio.h>
7 #include <stdlib.h>
8
9 uint nbits_aux1, *e_aux1, p_aux1;
10 uint nbits_aux2, *e_aux2, p_aux2;
11 uint nbits_aux3, *e_aux3, p_aux3;
12
13         // Memory management
14
15 #ifdef MEMCTRL
16 int account = 1;
17 int currmem = 0;
18 int newmem;
19 int maxmem = 0;
20 #endif
21
22 void *Malloc (int n)
23
24    { void *p;
25      if (n == 0) return NULL;
26 #ifndef MEMCTRL
27      p = (void*) malloc (n);
28 #else
29      p = (void*) (malloc (n+sizeof(int))+sizeof(int));
30 #endif
31      if (p == NULL)
32         { fprintf (stderr,"Could not allocate %i bytes\n",n);
33           exit(1);
34         }
35 #ifdef MEMCTRL
36      *(((int*)p)-1) = n;
37      if (account)
38         { newmem = currmem+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);
42           currmem = newmem;
43         }
44 #endif
45      return p;
46    }
47
48 void Free (void *p)
49
50    { 
51 #ifndef MEMCTRL
52      if (p) free (p);
53 #else
54      if (!p) return;
55      if (account)
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);
60           currmem = newmem;
61         }
62 #endif
63    }
64
65 void *Realloc (void *p, int n)
66
67    { if (p == NULL) return Malloc (n);
68      if (n == 0) { Free(p); return NULL; }
69 #ifndef MEMCTRL
70      p = (void*) realloc (p,n);
71 #else
72      if (account)
73         newmem = currmem - *(((int*)p)-1);
74      p = (void*) (realloc ((void*)(((int)p)-sizeof(int)),n+sizeof(int))+sizeof(int));
75      *(((int*)p)-1) = n;
76 #endif
77      if (p == NULL)
78         { fprintf (stderr,"Could not allocate %i bytes\n",n);
79           exit(1);
80         }
81 #ifdef MEMCTRL
82      if (account)
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);
87           currmem = newmem;
88         }
89 #endif
90      return p;
91    }
92
93 #include "basics.h"
94
95         // bits needed to represent a number between 0 and n
96
97 uint bits (uint n)
98
99    { uint b = 0;
100      while (n)
101         { b++; n >>= 1; }
102      return b;
103    }
104
105
106 uint bitget_aux1()
107  {
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);
111      else {
112         answ = e_aux1[i] >> j;
113         answ = answ | ((e_aux1[i+1] << (W-j-nbits_aux1)) >> (W-nbits_aux1));
114      }
115      return answ;
116  }
117 /* 
118 uint bitget_aux2()
119  {
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);
123      else {
124         answ = e_aux2[i] >> j;
125         answ = answ | ((e_aux2[i+1] << (W-j-nbits_aux2)) >> (W-nbits_aux2));
126      }
127      return answ;
128  }
129
130 uint bitget_aux3()
131  {
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);
135      else {
136         answ = e_aux3[i] >> j;
137         answ = answ | ((e_aux3[i+1] << (W-j-nbits_aux3)) >> (W-nbits_aux3));
138      }
139      return answ;
140  }*/
141
142
143         // returns e[p..p+len-1], assuming len <= W
144
145 uint bitget (uint *e, uint p, uint len)
146  {
147     register uint i=(p>>5), j=p&0x1F, answ;
148     if (j+len <= W)
149        answ = (e[i] << (W-j-len)) >> (W-len);
150     else {
151        answ = e[i] >> j;
152        answ = answ | ((e[i+1] << (W-j-len)) >> (W-len));
153     }
154     return answ;
155  }
156
157         // writes e[p..p+len-1] = s, len <= W
158
159 void bitput (register uint *e, register uint p, 
160              register uint len, register uint s)
161
162    { e += p >> bitsW; p &= (1<<bitsW)-1;
163      if (len == W)
164           { *e |= (*e & ((1<<p)-1)) | (s << p);
165             if (!p) return;
166             e++;
167             *e = (*e & ~((1<<p)-1)) | (s >> (W-p));
168           }
169      else { if (p+len <= W)
170                { *e = (*e & ~(((1<<len)-1)<<p)) | (s << p);
171                  return;
172                }
173             *e = (*e & ((1<<p)-1)) | (s << p);
174             e++; len -= W-p;
175             *e = (*e & ~((1<<len)-1)) | (s >> (W-p));
176           }
177    }