source: trunk/indexers/mgpp/lib/bitio_m_random.cpp@ 9612

Last change on this file since 9612 was 9612, checked in by kjdon, 19 years ago

added in x++ -> ++x changes submitted by Emanuel Dejanu

  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 3.7 KB
Line 
1#include <stdlib.h>
2#include <stdio.h>
3
4#include "longlong.h"
5#include "sysfuncs.h"
6#include "memlib.h"
7
8#include "bitio_m_abstract.h"
9#include "bitio_m_random.h"
10
11random_bitio_buffer::random_bitio_buffer(FILE *f, unsigned long length)
12{
13 buffer = NULL;
14 attachFile (f, length);
15}
16
17random_bitio_buffer::~random_bitio_buffer() {
18 if (buffer != NULL) delete []buffer;
19}
20
21void random_bitio_buffer::attachFile (FILE *f, unsigned long length) {
22 // delete the old buffer
23 if (buffer != NULL) {
24 delete []buffer;
25 buffer = NULL;
26 }
27
28 // reset all the values
29 file = f;
30 pos = 0;
31 base = 0;
32 used = 0;
33 len = length - 1;
34 shift = 0;
35
36 // make sure the length is a power of 2
37 while (len != 0) {
38 ++shift;
39 len = len >> 1;
40 }
41 len = 1 << shift;
42
43 // allocate a new buffer
44 buffer = new u_char[len];
45
46 // fill up the buffer
47 if (file != NULL) {
48 fseek(file, 0, 0);
49 fread(buffer, 1, len, file);
50 }
51}
52
53random_bitio_buffer &random_bitio_buffer::operator= (const random_bitio_buffer &_rbb) {
54 // delete the old buffer
55 if (buffer != NULL) {
56 delete []buffer;
57 buffer = NULL;
58 }
59
60 file = _rbb.file;
61
62 base = _rbb.base;
63 used = _rbb.used;
64 pos = _rbb.pos;
65 len = _rbb.len;
66 shift = _rbb.shift;
67
68 // copy the buffer
69 buffer = new u_char [len];
70 // memcpy (buffer, _rbb.buffer, len);
71memcpy (buffer, _rbb.buffer, len);
72
73 return (*this);
74}
75
76void random_bitio_buffer::error() {
77}
78
79void random_bitio_buffer::writeRead()
80{
81 if (used)
82 {
83 fseek(file, base, 0);
84 fwrite(buffer, 1, len, file);
85 }
86 // else
87 // {
88 base += len;
89 fseek(file, base, 0);
90 fread(buffer, 1, len, file);
91 pos = 0;
92 used = 0;
93 // }
94}
95
96void random_bitio_buffer::encodeBit(int bit)
97{
98 do
99 {
100 if (bit != 0)
101 {
102 buffer[pos >> 3] |= 0x80 >> (pos & 0x07);
103 }
104 else
105 {
106 buffer[pos >> 3] &= 0xff7f >> (pos & 0x07);
107 }
108 used = 1;
109 ++pos;
110
111 if ((pos >> 3) >= len)
112 {
113 writeRead();
114 }
115 }
116 while (0);
117}
118
119void random_bitio_buffer::flush()
120{
121 if (used != 0)
122 {
123 fseek(file, base, 0);
124 fwrite(buffer, 1, len, file);
125 used = 0;
126 }
127}
128
129void random_bitio_buffer::encodeDone()
130{
131 flush();
132 if (buffer != NULL) {
133 delete []buffer;
134 buffer = NULL;
135 }
136}
137
138unsigned long random_bitio_buffer::tell()
139{
140 return ((base << 3) + pos);
141}
142
143void random_bitio_buffer::seek(unsigned long toPos)
144{
145 if (((toPos >> 3) >= base) && (((toPos+7) >> 3) < (base + len)))
146 {
147 pos = toPos - (base << 3);
148 }
149 else
150 {
151 flush();
152 base = toPos >> 3;
153 base = (toPos >> (shift + 3)) << shift;
154 fseek(file, base, 0);
155 fread(buffer, 1, len, file);
156 pos = toPos & 0x07;
157 pos = toPos & ((8 << shift) - 1);
158 }
159}
160
161int random_bitio_buffer::bit()
162{
163 // fprintf(stderr, "Bit in");
164 ++pos;
165 if (((pos - 1) >> 3) >= len)
166 {
167 writeRead();
168 pos = 1;
169 }
170 return (buffer[(pos - 1) >> 3] & (0x80 >> ((pos - 1) & 0x07))) != 0;
171}
172
173long random_bitio_buffer::addff(long b)
174{
175 return b + b + bit();
176}
177
178long random_bitio_buffer::add00(long b)
179{
180 return addff(b);
181}
182
183int random_bitio_buffer::bitOffset()
184{
185 return 0;
186}
187
188void random_bitio_buffer::done()
189{
190 encodeDone();
191}
192
193
194#ifdef USE_LONG_LONG
195void random_bitio_buffer::seek_LL(mg_ullong toPos)
196{
197 if (((toPos >> 3) >= (mg_ullong) base) &&
198 (((toPos + 7) >> 3) < (mg_ullong) (base + len)))
199 {
200 pos = (long) (toPos - (mg_ullong) (base << 3));
201 }
202 else
203 {
204 flush();
205 base = (long) ((toPos >> (shift + 3)) << shift);
206
207 fseek(file, base, 0);
208 fread(buffer, 1, len, file);
209 pos = (long) (toPos & ((8 << shift) - 1));
210 }
211}
212
213mg_ullong random_bitio_buffer::tell_LL()
214{
215 return (((mg_ullong) base) << 3ull) + pos;
216}
217#endif
218
Note: See TracBrowser for help on using the repository browser.