AlcapDAQ  1
io_buffer.cpp
Go to the documentation of this file.
1 //
3 // Bitwise I/O buffers.
4 //
6 
7 #include <stdio.h>
8 #include <assert.h>
9 
10 #include "midas.h"
11 
12 #include "mucap_compress.h"
13 
14 void start_output_buffer(io_buffer * buffer, unsigned char *p)
15 {
16  buffer->w = 0;
17  buffer->w_bits = 32;
18  buffer->start = (unsigned int *) p;
19  buffer->p = buffer->start + 1;
20  buffer->num_codes = 0;
21 }
22 
24 {
25  // store the last word
26  *((buffer->p)++) = buffer->w << buffer->w_bits;
27 
28  // remember the length of the buffer, in bytes and in codes
29  *(buffer->start) = buffer->num_codes;
30 
31  //return ((unsigned int) buffer->p) - ((unsigned int) buffer->start);
32  return (int) (((char *) buffer->p) - ((char *) buffer->start));
33 }
34 
35 void
36 io_buffer_put(io_buffer * buffer, unsigned int code_bits, int code_length)
37 {
38 
39  assert(code_length > 0 && code_length < 32);
40 
41  // Does this symbol fit in our buffer word?
42  if (code_length < buffer->w_bits) {
43  // OK, so put it there...
44  buffer->w = (buffer->w << code_length) | code_bits;
45  buffer->w_bits -= code_length;
46  } else if (code_length == buffer->w_bits) {
47  // Only barely...write out the buffer word
48  buffer->w = (buffer->w << code_length) | code_bits;
49  *((buffer->p)++) = buffer->w;
50  buffer->w_bits = 32;
51  } else {
52  // No, we'll have to split the code across two words.
53  unsigned int first_code_bits =
54  code_bits >> (code_length - buffer->w_bits);
55  *((buffer->p)++) = (buffer->w << buffer->w_bits) | first_code_bits;
56  buffer->w = code_bits;
57  buffer->w_bits = 32 - code_length + buffer->w_bits;
58  }
59 }
60 
61 void start_input_buffer(io_buffer * buffer, unsigned char *p)
62 {
63  buffer->w = 0;
64  buffer->w_bits = 0;
65  buffer->start = (unsigned int *) p;
66  buffer->p = buffer->start + 1;
67  buffer->num_codes = *(buffer->start);
68 }
69 
70 unsigned int io_buffer_get(io_buffer * buffer, int num_bits)
71 {
72  if (buffer->w_bits == 0) {
73  buffer->w = *((buffer->p)++);
74  buffer->w_bits = 32;
75  }
76 
77  int w_bits = buffer->w_bits;
78 
79  unsigned int retval;
80  if (num_bits <= w_bits) {
81  retval = buffer->w >> (32 - num_bits);
82  buffer->w = buffer->w << num_bits;
83  buffer->w_bits = w_bits - num_bits;
84 
85  } else {
86  unsigned int first_part =
87  io_buffer_get(buffer, w_bits) << (num_bits - w_bits);
88  retval = first_part | io_buffer_get(buffer, num_bits - w_bits);
89  }
90 
91  return retval;
92 }
93