SURFEX v8.1
General documentation of Surfex
bitbuff.c
Go to the documentation of this file.
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 
int outbrem
Definition: bitbuff.c:36
void GET_EXTRACTIDX(unsigned *idx, unsigned *bitoffset)
Definition: bitbuff.c:86
unsigned long uint64_t
Definition: bitbuff.c:10
int outidx
Definition: bitbuff.c:35
int inidx
Definition: bitbuff.c:38
void GET_FILLIDX(unsigned *idx, unsigned *bitoffset)
Definition: bitbuff.c:47
int inbrem
Definition: bitbuff.c:39
__uint64_t WORD
Definition: bitbuff.c:7
void SET_FILLIDX(unsigned *idx, unsigned *bitoffset)
Definition: bitbuff.c:41
void extract_bbuff_rec(WORD *buff, int *n, unsigned *val)
Definition: bitbuff.c:92
void SET_EXTRACTIDX(unsigned *idx, unsigned *bitoffset)
Definition: bitbuff.c:80
ERROR in n
Definition: ecsort_shared.h:90
void EXTRACT_BBUFF(WORD *buff, int *n, unsigned *val)
Definition: bitbuff.c:110
void FILL_BBUFF(WORD *out, int *n, unsigned *val)
Definition: bitbuff.c:52