Philippe 02/05/2016: moved all LIBTOOLS files in LIBTOOLS directory
[MNH-git_open_source-lfs.git] / LIBTOOLS / lib / COMPRESS / src / bitbuff.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4
5 #ifdef VPP
6 # include <sys/types.h>
7 typedef __uint64_t WORD;
8 #else
9 #ifdef SX5
10 typedef unsigned long uint64_t;
11 #else
12 # include <inttypes.h>
13 #endif
14 typedef uint64_t WORD;
15 #endif
16
17 #define WORDSIZE 64
18
19 #ifdef NO_UNDERSCORE
20 # define SET_FILLIDX set_fillidx
21 # define GET_FILLIDX get_fillidx
22 # define FILL_BBUFF  fill_bbuff
23 # define SET_EXTRACTIDX set_extractidx
24 # define GET_EXTRACTIDX get_extractidx
25 # define EXTRACT_BBUFF  extract_bbuff
26 #else
27 # define SET_FILLIDX set_fillidx_
28 # define GET_FILLIDX get_fillidx_
29 # define FILL_BBUFF  fill_bbuff_
30 # define SET_EXTRACTIDX set_extractidx_
31 # define GET_EXTRACTIDX get_extractidx_
32 # define EXTRACT_BBUFF  extract_bbuff_
33 #endif
34
35 int outidx = 0;
36 int outbrem = WORDSIZE ;
37
38 int inidx = 0;
39 int inbrem = WORDSIZE;
40
41 void SET_FILLIDX(unsigned *idx, unsigned *bitoffset){
42     inidx  = *idx;
43     inidx += (*bitoffset/WORDSIZE);
44     inbrem = WORDSIZE - (*bitoffset%WORDSIZE);
45 }
46
47 void GET_FILLIDX(unsigned *idx, unsigned *bitoffset){
48     *idx    = inidx;
49     *bitoffset = WORDSIZE - inbrem;
50 }
51
52 void FILL_BBUFF(WORD *out, int *n, unsigned *val){
53     /* inidx = index of the current buffer elt to fill */
54     /* inbrem = number of bits remaining on buffer elt out[idx] */
55
56     /* fill buffer out with n low bits of val */
57
58     if (inbrem >= *n){
59         inbrem = inbrem - *n;
60         /* turn to 0 the n bits of out */
61         out[inidx] &= ~(~(~(WORD)0 << *n) << inbrem);
62         /* now set the n bits of out to val */
63         out[inidx] |= (*val & ~(~(WORD)0 << *n)) << inbrem;
64         return;
65     } else {
66         int nex = *n - inbrem; /* number of bits that will be filled later */
67         if (inbrem != 0){
68             /* turn to 0 the inbrem lower bits of out */
69             out[inidx] &= (~(WORD)0 << inbrem) ;
70             /* now set the inbrem lower bits of out with val */
71             out[inidx] |= ((*val >> nex) & ~(~(WORD)0 << inbrem));
72         }
73         inidx++;
74         inbrem = WORDSIZE;
75         FILL_BBUFF(out, &nex, val);
76     }
77
78 }
79
80 void SET_EXTRACTIDX(unsigned *idx, unsigned *bitoffset) {
81     outidx = *idx;
82     outidx += (*bitoffset/WORDSIZE);
83     outbrem = WORDSIZE-(*bitoffset%WORDSIZE);
84 }
85
86 void GET_EXTRACTIDX(unsigned *idx, unsigned *bitoffset){
87     *idx = outidx;
88     *bitoffset = WORDSIZE - outbrem;
89 }
90
91     
92 void extract_bbuff_rec(WORD *buff, int *n, unsigned *val) {
93     
94     if (outbrem >= *n){
95         outbrem = outbrem - *n;
96         *val = (*val << *n) | (unsigned)((buff[outidx]>>outbrem) & ~(~(WORD)0 << *n));
97         return;
98     } else {
99         int nex = *n - outbrem;
100         if (outbrem != 0){
101             *val = (*val << outbrem)| (unsigned)(buff[outidx] & ~(~(WORD)0 << outbrem));
102
103         }
104         outidx++;
105         outbrem=WORDSIZE;
106         extract_bbuff_rec(buff,&nex,val);
107     }
108 }
109
110 void EXTRACT_BBUFF(WORD *buff, int *n, unsigned *val) {
111     
112     unsigned tmpval;
113
114     tmpval=0;
115     extract_bbuff_rec(buff,n,&tmpval);
116     *val = tmpval;
117 }
118