Added simple WCSA
[SXSI/TextCollection.git] / swcsa / utils / basics.h
diff --git a/swcsa/utils/basics.h b/swcsa/utils/basics.h
new file mode 100755 (executable)
index 0000000..da91efb
--- /dev/null
@@ -0,0 +1,112 @@
+
+
+ // Basics
+#ifndef BASICSINCLUDED
+#define BASICSINCLUDED
+
+  // Includes 
+
+#include <sys/types.h>
+#include <stdio.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+#include <sys/times.h>
+#include <unistd.h>
+#include <errno.h>
+#include <string.h>
+
+  // Memory management
+
+#define malloc(n) Malloc(n)
+#define free(p) Free(p)
+#define realloc(p,n) Realloc(p,n)
+
+void *Malloc (int n);
+void Free (void *p);
+void *Realloc (void *p, int n);
+
+  // Data types
+
+#ifndef byte
+       #define byte unsigned char
+#endif 
+
+//typedef unsigned char byte;
+// typedef unsigned int uint;
+
+//typedef int bool;
+//#define true 1
+//#define false 0
+
+#define max(x,y) ((x)>(y)?(x):(y))
+#define min(x,y) ((x)<(y)?(x):(y))
+
+  // Bitstream management
+
+//#define W (8*sizeof(uint))
+#define W (32)
+
+       // bits needed to represent a number between 0 and n
+uint bits (uint n);
+        // returns e[p..p+len-1], assuming len <= W
+uint bitread (uint *e, uint p, uint len);
+        // writes e[p..p+len-1] = s, assuming len <= W
+void bitwrite (uint *e, uint p, uint len, uint s);
+    // writes e[p..p+len-1] = 0, no assumption on len
+        
+    /**/ //FARI. WITH ASSUMPTION ON LEN, OR IT CRASHES 
+         //NOt WORKING UPON THE LIMIT OF THE STARTING uint.
+void bitzero (uint *e, uint p, uint len);
+       // reads bit p from e
+#define bitget(e,p) (((e)[(p)/W] >> ((p)%W)) & 1)
+       // sets bit p in e
+#define bitset(e,p) ((e)[(p)/W] |= (1<<((p)%W)))
+       // cleans bit p in e
+#define bitclean(e,p) ((e)[(p)/W] &= ~(1<<((p)%W)))
+
+
+
+/* bitRead and bitWrite as MACROS */
+       // returns e[p..p+len-1], assuming len <= W
+       //mybitread (uint returned value, uint *e, uint p, uint len)
+#define mybitread(answ, v, p, len) \
+   { uint *e ; \
+        e=v;\
+     e += p/W; p %= W; \
+     answ = *e >> p; \
+     if (len == W) \
+         { if (p) answ |= (*(e+1)) << (W-p); \
+         } \
+     else { if (p+len > W) answ |= (*(e+1)) << (W-p); \
+            answ &= (1<<len)-1; \
+         } \
+   }
+
+
+       // writes e[p..p+len-1] = s, len <= W
+       //void bitwrite (uint *e, uint p, uint len, uint s)
+#define mybitwrite(v, p, len, s) \
+   { uint *e ; \
+        e=v; \
+    e += p/W; p %= W; \
+     if (len == W) \
+         { *e |= (*e & ((1<<p)-1)) | (s << p); \
+            if (p) { \
+               e++; \
+               *e = (*e & ~((1<<p)-1)) | (s >> (W-p)); \
+               } \
+         } \
+     else { if (p+len <= W) \
+              { *e = (*e & ~(((1<<len)-1)<<p)) | (s << p); \
+              } \
+              else { \
+               *e = (*e & ((1<<p)-1)) | (s << p); \
+            e++; len -= W-p; \
+            *e = (*e & ~((1<<len)-1)) | (s >> (W-p)); \
+           } \
+         } \
+   } 
+
+#endif