annotate src/lib/numpack.c @ 22664:fea53c2725c0

director: Fix director_max_parallel_moves/kicks type Should be uint, not time.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Thu, 09 Nov 2017 12:24:16 +0200
parents 2e2563132d5f
children cb108f786fb4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
21390
2e2563132d5f Updated copyright notices to include the year 2017.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 19552
diff changeset
1 /* Copyright (c) 2013-2017 Dovecot authors, see the included COPYING file */
14861
b45d968adff8 liblib: Added "number packing" API.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
b45d968adff8 liblib: Added "number packing" API.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
b45d968adff8 liblib: Added "number packing" API.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4 #include "buffer.h"
b45d968adff8 liblib: Added "number packing" API.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5 #include "numpack.h"
b45d968adff8 liblib: Added "number packing" API.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6
b45d968adff8 liblib: Added "number packing" API.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7 void numpack_encode(buffer_t *buf, uint64_t num)
b45d968adff8 liblib: Added "number packing" API.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8 {
b45d968adff8 liblib: Added "number packing" API.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9 /* number continues as long as the highest bit is set */
b45d968adff8 liblib: Added "number packing" API.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10 while (num >= 0x80) {
b45d968adff8 liblib: Added "number packing" API.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11 buffer_append_c(buf, (num & 0x7f) | 0x80);
b45d968adff8 liblib: Added "number packing" API.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12 num >>= 7;
b45d968adff8 liblib: Added "number packing" API.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 }
b45d968adff8 liblib: Added "number packing" API.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14
b45d968adff8 liblib: Added "number packing" API.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15 buffer_append_c(buf, num);
b45d968adff8 liblib: Added "number packing" API.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16 }
b45d968adff8 liblib: Added "number packing" API.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17
b45d968adff8 liblib: Added "number packing" API.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18 int numpack_decode(const uint8_t **p, const uint8_t *end, uint64_t *num_r)
b45d968adff8 liblib: Added "number packing" API.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19 {
b45d968adff8 liblib: Added "number packing" API.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
20 const uint8_t *c = *p;
b45d968adff8 liblib: Added "number packing" API.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21 uint64_t value = 0;
b45d968adff8 liblib: Added "number packing" API.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
22 unsigned int bits = 0;
b45d968adff8 liblib: Added "number packing" API.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
23
17450
1c276f2e59a5 lib: fix numpack overflow checking
Phil Carmody <phil@dovecot.fi>
parents: 17130
diff changeset
24 while (bits < 64) {
14861
b45d968adff8 liblib: Added "number packing" API.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
25 if (c == end)
b45d968adff8 liblib: Added "number packing" API.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
26 return -1;
b45d968adff8 liblib: Added "number packing" API.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
27
b45d968adff8 liblib: Added "number packing" API.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
28 value |= (uint64_t)(*c & 0x7f) << bits;
b45d968adff8 liblib: Added "number packing" API.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
29 if (*c < 0x80)
b45d968adff8 liblib: Added "number packing" API.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
30 break;
b45d968adff8 liblib: Added "number packing" API.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
31
b45d968adff8 liblib: Added "number packing" API.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
32 bits += 7;
b45d968adff8 liblib: Added "number packing" API.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
33 c++;
b45d968adff8 liblib: Added "number packing" API.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
34 }
b45d968adff8 liblib: Added "number packing" API.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
35
17450
1c276f2e59a5 lib: fix numpack overflow checking
Phil Carmody <phil@dovecot.fi>
parents: 17130
diff changeset
36 bits += bits_required8(*c);
1c276f2e59a5 lib: fix numpack overflow checking
Phil Carmody <phil@dovecot.fi>
parents: 17130
diff changeset
37 if (bits > 64) /* overflow */
14861
b45d968adff8 liblib: Added "number packing" API.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
38 return -1;
b45d968adff8 liblib: Added "number packing" API.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
39
b45d968adff8 liblib: Added "number packing" API.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40 *p = c + 1;
b45d968adff8 liblib: Added "number packing" API.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
41 *num_r = value;
b45d968adff8 liblib: Added "number packing" API.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
42 return 0;
b45d968adff8 liblib: Added "number packing" API.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
43 }
18480
1c275f718758 lib: Added numpack_decode32()
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
44
1c275f718758 lib: Added numpack_decode32()
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
45 int numpack_decode32(const uint8_t **p, const uint8_t *end, uint32_t *num_r)
1c275f718758 lib: Added numpack_decode32()
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
46 {
1c275f718758 lib: Added numpack_decode32()
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
47 uint64_t num;
1c275f718758 lib: Added numpack_decode32()
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
48
1c275f718758 lib: Added numpack_decode32()
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
49 if (numpack_decode(p, end, &num) < 0)
1c275f718758 lib: Added numpack_decode32()
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
50 return -1;
1c275f718758 lib: Added numpack_decode32()
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
51 if (num > 4294967295U)
1c275f718758 lib: Added numpack_decode32()
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
52 return -1;
1c275f718758 lib: Added numpack_decode32()
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
53
1c275f718758 lib: Added numpack_decode32()
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
54 *num_r = (uint32_t)num;
1c275f718758 lib: Added numpack_decode32()
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
55 return 0;
1c275f718758 lib: Added numpack_decode32()
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
56 }