Debug swcsa
[SXSI/TextCollection.git] / swcsa / utils / basics.h
1
2
3  // Basics
4
5 #ifndef BASICSINCLUDED
6 #define BASICSINCLUDED
7
8 #ifdef __cplusplus
9 extern "C" {
10 #endif
11
12   // Includes
13
14 #include <sys/types.h>
15 #include <stdio.h>
16 #include <fcntl.h>
17 #include <stdlib.h>
18 #include <sys/stat.h>
19 #include <sys/times.h>
20 #include <unistd.h>
21 #include <errno.h>
22 #include <string.h>
23
24   // Memory management
25
26 #define malloc(n) Malloc_(n,__LINE__,__FILE__)
27 #define free(p) Free_(p,__LINE__,__FILE__)
28 #define realloc(p,n) Realloc_(p,n,__LINE__,__FILE__)
29
30 void *Malloc_ (size_t n, size_t l, char * file);
31 void Free_ (void *p, size_t l, char * file);
32 void *Realloc_ (void *p, size_t n, size_t l, char * file);
33
34   // Data types
35
36 #ifndef byte
37         #define byte unsigned char
38 #endif 
39
40 //typedef unsigned char byte;
41 // typedef unsigned int uint;
42
43 //typedef int bool;
44 //#define true 1
45 //#define false 0
46
47 #define max(x,y) ((x)>(y)?(x):(y))
48 #define min(x,y) ((x)<(y)?(x):(y))
49
50   // Bitstream management
51
52 //#define W (8*sizeof(uint))
53 #define W (32)
54
55         // bits needed to represent a number between 0 and n
56 uint _bits (uint n);
57         // returns e[p..p+len-1], assuming len <= W
58 uint bitread (uint *e, uint p, uint len);
59         // writes e[p..p+len-1] = s, assuming len <= W
60 void bitwrite (uint *e, uint p, uint len, uint s);
61     // writes e[p..p+len-1] = 0, no assumption on len
62         
63     /**/ //FARI. WITH ASSUMPTION ON LEN, OR IT CRASHES 
64          //NOt WORKING UPON THE LIMIT OF THE STARTING uint.
65 void bitzero2 (uint *e, uint p, uint len);
66         // reads bit p from e
67 #define bitget(e,p) (((e)[(p)/W] >> ((p)%W)) & 1)
68         // sets bit p in e
69 #define bitset(e,p) ((e)[(p)/W] |= (1<<((p)%W)))
70         // cleans bit p in e
71 #define bitclean(e,p) ((e)[(p)/W] &= ~(1<<((p)%W)))
72
73
74
75 /* bitRead and bitWrite as MACROS */
76         // returns e[p..p+len-1], assuming len <= W
77         //mybitread (uint returned value, uint *e, uint p, uint len)
78 #define mybitread(answ, v, p, len) \
79    { uint *e ; \
80          e=v;\
81      e += p/W; p %= W; \
82      answ = *e >> p; \
83      if (len == W) \
84           { if (p) answ |= (*(e+1)) << (W-p); \
85           } \
86      else { if (p+len > W) answ |= (*(e+1)) << (W-p); \
87             answ &= (1<<len)-1; \
88           } \
89    }
90
91
92         // writes e[p..p+len-1] = s, len <= W
93         //void bitwrite (uint *e, uint p, uint len, uint s)
94 #define mybitwrite(v, p, len, s) \
95    { uint *e ; \
96          e=v; \
97     e += p/W; p %= W; \
98      if (len == W) \
99           { *e |= (*e & ((1<<p)-1)) | (s << p); \
100             if (p) { \
101                 e++; \
102                 *e = (*e & ~((1<<p)-1)) | (s >> (W-p)); \
103                 } \
104           } \
105      else { if (p+len <= W) \
106                { *e = (*e & ~(((1<<len)-1)<<p)) | (s << p); \
107                } \
108                else { \
109                 *e = (*e & ((1<<p)-1)) | (s << p); \
110             e++; len -= W-p; \
111             *e = (*e & ~((1<<len)-1)) | (s >> (W-p)); \
112            } \
113           } \
114    } 
115 #ifdef __cplusplus
116  }
117 #endif
118
119 #endif