summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'daemon/Buffer.cpp')
-rw-r--r--daemon/Buffer.cpp199
1 files changed, 36 insertions, 163 deletions
diff --git a/daemon/Buffer.cpp b/daemon/Buffer.cpp
index ee391bc..56cf42c 100644
--- a/daemon/Buffer.cpp
+++ b/daemon/Buffer.cpp
@@ -140,173 +140,46 @@ void Buffer::check (const uint64_t time) {
140 } 140 }
141} 141}
142 142
143void Buffer::packInt (const int32_t x) { 143void Buffer::packInt (int32_t x) {
144 const int write0 = (writePos + 0) & mask; 144 int packedBytes = 0;
145 const int write1 = (writePos + 1) & mask; 145 int more = true;
146 146 while (more) {
147 if ((x & 0xffffff80) == 0) { 147 // low order 7 bits of x
148 buf[write0] = x & 0x7f; 148 char b = x & 0x7f;
149 writePos = write1; 149 x >>= 7;
150 } else if ((x & 0xffffc000) == 0) { 150
151 const int write2 = (writePos + 2) & mask; 151 if ((x == 0 && (b & 0x40) == 0) || (x == -1 && (b & 0x40) != 0)) {
152 buf[write0] = x | 0x80; 152 more = false;
153 buf[write1] = (x >> 7) & 0x7f; 153 } else {
154 writePos = write2; 154 b |= 0x80;
155 } else if ((x & 0xffe00000) == 0) { 155 }
156 const int write2 = (writePos + 2) & mask; 156
157 const int write3 = (writePos + 3) & mask; 157 buf[(writePos + packedBytes) & mask] = b;
158 buf[write0] = x | 0x80; 158 packedBytes++;
159 buf[write1] = (x >> 7) | 0x80;
160 buf[write2] = (x >> 14) & 0x7f;
161 writePos = write3;
162 } else if ((x & 0xf0000000) == 0) {
163 const int write2 = (writePos + 2) & mask;
164 const int write3 = (writePos + 3) & mask;
165 const int write4 = (writePos + 4) & mask;
166 buf[write0] = x | 0x80;
167 buf[write1] = (x >> 7) | 0x80;
168 buf[write2] = (x >> 14) | 0x80;
169 buf[write3] = (x >> 21) & 0x7f;
170 writePos = write4;
171 } else {
172 const int write2 = (writePos + 2) & mask;
173 const int write3 = (writePos + 3) & mask;
174 const int write4 = (writePos + 4) & mask;
175 const int write5 = (writePos + 5) & mask;
176 buf[write0] = x | 0x80;
177 buf[write1] = (x >> 7) | 0x80;
178 buf[write2] = (x >> 14) | 0x80;
179 buf[write3] = (x >> 21) | 0x80;
180 buf[write4] = (x >> 28) & 0x0f;
181 writePos = write5;
182 } 159 }
160
161 writePos = (writePos + packedBytes) & mask;
183} 162}
184 163
185void Buffer::packInt64 (const int64_t x) { 164void Buffer::packInt64 (int64_t x) {
186 const int write0 = (writePos + 0) & mask; 165 int packedBytes = 0;
187 const int write1 = (writePos + 1) & mask; 166 int more = true;
188 167 while (more) {
189 if ((x & 0xffffffffffffff80LL) == 0) { 168 // low order 7 bits of x
190 buf[write0] = x & 0x7f; 169 char b = x & 0x7f;
191 writePos = write1; 170 x >>= 7;
192 } else if ((x & 0xffffffffffffc000LL) == 0) { 171
193 const int write2 = (writePos + 2) & mask; 172 if ((x == 0 && (b & 0x40) == 0) || (x == -1 && (b & 0x40) != 0)) {
194 buf[write0] = x | 0x80; 173 more = false;
195 buf[write1] = (x >> 7) & 0x7f; 174 } else {
196 writePos = write2; 175 b |= 0x80;
197 } else if ((x & 0xffffffffffe00000LL) == 0) { 176 }
198 const int write2 = (writePos + 2) & mask; 177
199 const int write3 = (writePos + 3) & mask; 178 buf[(writePos + packedBytes) & mask] = b;
200 buf[write0] = x | 0x80; 179 packedBytes++;
201 buf[write1] = (x >> 7) | 0x80;
202 buf[write2] = (x >> 14) & 0x7f;
203 writePos = write3;
204 } else if ((x & 0xfffffffff0000000LL) == 0) {
205 const int write2 = (writePos + 2) & mask;
206 const int write3 = (writePos + 3) & mask;
207 const int write4 = (writePos + 4) & mask;
208 buf[write0] = x | 0x80;
209 buf[write1] = (x >> 7) | 0x80;
210 buf[write2] = (x >> 14) | 0x80;
211 buf[write3] = (x >> 21) & 0x7f;
212 writePos = write4;
213 } else if ((x & 0xfffffff800000000LL) == 0) {
214 const int write2 = (writePos + 2) & mask;
215 const int write3 = (writePos + 3) & mask;
216 const int write4 = (writePos + 4) & mask;
217 const int write5 = (writePos + 5) & mask;
218 buf[write0] = x | 0x80;
219 buf[write1] = (x >> 7) | 0x80;
220 buf[write2] = (x >> 14) | 0x80;
221 buf[write3] = (x >> 21) | 0x80;
222 buf[write4] = (x >> 28) & 0x7f;
223 writePos = write5;
224 } else if ((x & 0xfffffc0000000000LL) == 0) {
225 const int write2 = (writePos + 2) & mask;
226 const int write3 = (writePos + 3) & mask;
227 const int write4 = (writePos + 4) & mask;
228 const int write5 = (writePos + 5) & mask;
229 const int write6 = (writePos + 6) & mask;
230 buf[write0] = x | 0x80;
231 buf[write1] = (x >> 7) | 0x80;
232 buf[write2] = (x >> 14) | 0x80;
233 buf[write3] = (x >> 21) | 0x80;
234 buf[write4] = (x >> 28) | 0x80;
235 buf[write5] = (x >> 35) & 0x7f;
236 writePos = write6;
237 } else if ((x & 0xfffe000000000000LL) == 0) {
238 const int write2 = (writePos + 2) & mask;
239 const int write3 = (writePos + 3) & mask;
240 const int write4 = (writePos + 4) & mask;
241 const int write5 = (writePos + 5) & mask;
242 const int write6 = (writePos + 6) & mask;
243 const int write7 = (writePos + 7) & mask;
244 buf[write0] = x | 0x80;
245 buf[write1] = (x >> 7) | 0x80;
246 buf[write2] = (x >> 14) | 0x80;
247 buf[write3] = (x >> 21) | 0x80;
248 buf[write4] = (x >> 28) | 0x80;
249 buf[write5] = (x >> 35) | 0x80;
250 buf[write6] = (x >> 42) & 0x7f;
251 writePos = write7;
252 } else if ((x & 0xff00000000000000LL) == 0) {
253 const int write2 = (writePos + 2) & mask;
254 const int write3 = (writePos + 3) & mask;
255 const int write4 = (writePos + 4) & mask;
256 const int write5 = (writePos + 5) & mask;
257 const int write6 = (writePos + 6) & mask;
258 const int write7 = (writePos + 7) & mask;
259 const int write8 = (writePos + 8) & mask;
260 buf[write0] = x | 0x80;
261 buf[write1] = (x >> 7) | 0x80;
262 buf[write2] = (x >> 14) | 0x80;
263 buf[write3] = (x >> 21) | 0x80;
264 buf[write4] = (x >> 28) | 0x80;
265 buf[write5] = (x >> 35) | 0x80;
266 buf[write6] = (x >> 42) | 0x80;
267 buf[write7] = (x >> 49) & 0x7f;
268 writePos = write8;
269 } else if ((x & 0x8000000000000000LL) == 0) {
270 const int write2 = (writePos + 2) & mask;
271 const int write3 = (writePos + 3) & mask;
272 const int write4 = (writePos + 4) & mask;
273 const int write5 = (writePos + 5) & mask;
274 const int write6 = (writePos + 6) & mask;
275 const int write7 = (writePos + 7) & mask;
276 const int write8 = (writePos + 8) & mask;
277 const int write9 = (writePos + 9) & mask;
278 buf[write0] = x | 0x80;
279 buf[write1] = (x >> 7) | 0x80;
280 buf[write2] = (x >> 14) | 0x80;
281 buf[write3] = (x >> 21) | 0x80;
282 buf[write4] = (x >> 28) | 0x80;
283 buf[write5] = (x >> 35) | 0x80;
284 buf[write6] = (x >> 42) | 0x80;
285 buf[write7] = (x >> 49) | 0x80;
286 buf[write8] = (x >> 56) & 0x7f;
287 writePos = write9;
288 } else {
289 const int write2 = (writePos + 2) & mask;
290 const int write3 = (writePos + 3) & mask;
291 const int write4 = (writePos + 4) & mask;
292 const int write5 = (writePos + 5) & mask;
293 const int write6 = (writePos + 6) & mask;
294 const int write7 = (writePos + 7) & mask;
295 const int write8 = (writePos + 8) & mask;
296 const int write9 = (writePos + 9) & mask;
297 const int write10 = (writePos + 10) & mask;
298 buf[write0] = x | 0x80;
299 buf[write1] = (x >> 7) | 0x80;
300 buf[write2] = (x >> 14) | 0x80;
301 buf[write3] = (x >> 21) | 0x80;
302 buf[write4] = (x >> 28) | 0x80;
303 buf[write5] = (x >> 35) | 0x80;
304 buf[write6] = (x >> 42) | 0x80;
305 buf[write7] = (x >> 49) | 0x80;
306 buf[write8] = (x >> 56) | 0x80;
307 buf[write9] = (x >> 63) & 0x7f;
308 writePos = write10;
309 } 180 }
181
182 writePos = (writePos + packedBytes) & mask;
310} 183}
311 184
312void Buffer::frame () { 185void Buffer::frame () {