diff options
Diffstat (limited to 'daemon/Buffer.cpp')
-rw-r--r-- | daemon/Buffer.cpp | 199 |
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 | ||
143 | void Buffer::packInt (const int32_t x) { | 143 | void 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 | ||
185 | void Buffer::packInt64 (const int64_t x) { | 164 | void 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 | ||
312 | void Buffer::frame () { | 185 | void Buffer::frame () { |