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