8
#include "amqp_private.h"
12
#define INITIAL_TABLE_SIZE 16
14
int amqp_decode_table(amqp_bytes_t encoded,
19
int offset = *offsetptr;
20
uint32_t tablesize = D_32(encoded, offset);
22
amqp_table_entry_t *entries = malloc(INITIAL_TABLE_SIZE * sizeof(amqp_table_entry_t));
23
int allocated_entries = INITIAL_TABLE_SIZE;
26
if (entries == NULL) {
31
limit = offset + tablesize;
33
while (offset < limit) {
35
amqp_table_entry_t *entry;
37
keylen = D_8(encoded, offset);
40
if (num_entries >= allocated_entries) {
42
allocated_entries = allocated_entries * 2;
43
newentries = realloc(entries, allocated_entries * sizeof(amqp_table_entry_t));
44
if (newentries == NULL) {
50
entry = &entries[num_entries];
52
entry->key.len = keylen;
53
entry->key.bytes = D_BYTES(encoded, offset, keylen);
56
entry->kind = D_8(encoded, offset);
59
switch (entry->kind) {
61
entry->value.bytes.len = D_32(encoded, offset);
63
entry->value.bytes.bytes = D_BYTES(encoded, offset, entry->value.bytes.len);
64
offset += entry->value.bytes.len;
67
entry->value.i32 = (int32_t) D_32(encoded, offset);
71
entry->value.decimal.decimals = D_8(encoded, offset);
73
entry->value.decimal.value = D_32(encoded, offset);
77
entry->value.u64 = D_64(encoded, offset);
81
AMQP_CHECK_RESULT(amqp_decode_table(encoded, pool, &(entry->value.table), &offset));
90
output->num_entries = num_entries;
91
output->entries = amqp_pool_alloc(pool, num_entries * sizeof(amqp_table_entry_t));
92
memcpy(output->entries, entries, num_entries * sizeof(amqp_table_entry_t));
98
int amqp_encode_table(amqp_bytes_t encoded,
102
int offset = *offsetptr;
103
int tablesize_offset = offset;
106
offset += 4; /* skip space for the size of the table to be filled in later */
108
for (i = 0; i < input->num_entries; i++) {
109
amqp_table_entry_t *entry = &(input->entries[i]);
111
E_8(encoded, offset, entry->key.len);
114
E_BYTES(encoded, offset, entry->key.len, entry->key.bytes);
115
offset += entry->key.len;
117
E_8(encoded, offset, entry->kind);
120
switch (entry->kind) {
122
E_32(encoded, offset, entry->value.bytes.len);
124
E_BYTES(encoded, offset, entry->value.bytes.len, entry->value.bytes.bytes);
125
offset += entry->value.bytes.len;
128
E_32(encoded, offset, (uint32_t) entry->value.i32);
132
E_8(encoded, offset, entry->value.decimal.decimals);
134
E_32(encoded, offset, entry->value.decimal.value);
138
E_64(encoded, offset, entry->value.u64);
142
AMQP_CHECK_RESULT(amqp_encode_table(encoded, &(entry->value.table), &offset));
149
E_32(encoded, tablesize_offset, (offset - *offsetptr - 4));
154
int amqp_table_entry_cmp(void const *entry1, void const *entry2) {
155
amqp_table_entry_t const *p1 = (amqp_table_entry_t const *) entry1;
156
amqp_table_entry_t const *p2 = (amqp_table_entry_t const *) entry2;
161
minlen = p1->key.len;
162
if (p2->key.len < minlen) minlen = p2->key.len;
164
d = memcmp(p1->key.bytes, p2->key.bytes, minlen);
169
return p1->key.len - p2->key.len;