source: trunk/gsdl/src/mgpp/lib/bitio_m_random.cpp@ 2928

Last change on this file since 2928 was 2928, checked in by jrm21, 22 years ago

replaced bzero and bcopy with memset and memcpy in the src, even though it was
already done in the headers, just to make the code a bit clearer.

  • 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.