summaryrefslogtreecommitdiff
path: root/qpid/extras/dispatch/src/parse.c
diff options
context:
space:
mode:
Diffstat (limited to 'qpid/extras/dispatch/src/parse.c')
-rw-r--r--qpid/extras/dispatch/src/parse.c385
1 files changed, 0 insertions, 385 deletions
diff --git a/qpid/extras/dispatch/src/parse.c b/qpid/extras/dispatch/src/parse.c
deleted file mode 100644
index c5ecc4e498..0000000000
--- a/qpid/extras/dispatch/src/parse.c
+++ /dev/null
@@ -1,385 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#include <qpid/dispatch/alloc.h>
-#include <qpid/dispatch/ctools.h>
-#include <qpid/dispatch/parse.h>
-#include <qpid/dispatch/amqp.h>
-
-DEQ_DECLARE(dx_parsed_field_t, dx_parsed_field_list_t);
-
-struct dx_parsed_field_t {
- DEQ_LINKS(dx_parsed_field_t);
- dx_parsed_field_t *parent;
- dx_parsed_field_list_t children;
- uint8_t tag;
- dx_field_iterator_t *raw_iter;
- const char *parse_error;
-};
-
-ALLOC_DECLARE(dx_parsed_field_t);
-ALLOC_DEFINE(dx_parsed_field_t);
-
-
-static char *get_type_info(dx_field_iterator_t *iter, uint8_t *tag, uint32_t *length, uint32_t *count, uint32_t *clen)
-{
- if (dx_field_iterator_end(iter))
- return "Insufficient Data to Determine Tag";
- *tag = dx_field_iterator_octet(iter);
- *count = 0;
- *length = 0;
- *clen = 0;
-
- switch (*tag & 0xF0) {
- case 0x40: *length = 0; break;
- case 0x50: *length = 1; break;
- case 0x60: *length = 2; break;
- case 0x70: *length = 4; break;
- case 0x80: *length = 8; break;
- case 0x90: *length = 16; break;
- case 0xB0:
- case 0xD0:
- case 0xF0:
- *length += ((unsigned int) dx_field_iterator_octet(iter)) << 24;
- *length += ((unsigned int) dx_field_iterator_octet(iter)) << 16;
- *length += ((unsigned int) dx_field_iterator_octet(iter)) << 8;
- // fall through to the next case
-
- case 0xA0:
- case 0xC0:
- case 0xE0:
- if (dx_field_iterator_end(iter))
- return "Insufficient Data to Determine Length";
- *length += (unsigned int) dx_field_iterator_octet(iter);
- break;
-
- default:
- return "Invalid Tag - No Length Information";
- }
-
- switch (*tag & 0xF0) {
- case 0xD0:
- case 0xF0:
- *count += ((unsigned int) dx_field_iterator_octet(iter)) << 24;
- *count += ((unsigned int) dx_field_iterator_octet(iter)) << 16;
- *count += ((unsigned int) dx_field_iterator_octet(iter)) << 8;
- *clen = 3;
- // fall through to the next case
-
- case 0xC0:
- case 0xE0:
- if (dx_field_iterator_end(iter))
- return "Insufficient Data to Determine Count";
- *count += (unsigned int) dx_field_iterator_octet(iter);
- *clen += 1;
- break;
- }
-
- if ((*tag == DX_AMQP_MAP8 || *tag == DX_AMQP_MAP32) && (*count & 1))
- return "Odd Number of Elements in a Map";
-
- if (*clen > *length)
- return "Insufficient Length to Determine Count";
-
- return 0;
-}
-
-
-static dx_parsed_field_t *dx_parse_internal(dx_field_iterator_t *iter, dx_parsed_field_t *p)
-{
- dx_parsed_field_t *field = new_dx_parsed_field_t();
- if (!field)
- return 0;
-
- DEQ_ITEM_INIT(field);
- DEQ_INIT(field->children);
- field->parent = p;
- field->raw_iter = 0;
-
- uint32_t length;
- uint32_t count;
- uint32_t length_of_count;
-
- field->parse_error = get_type_info(iter, &field->tag, &length, &count, &length_of_count);
-
- if (!field->parse_error) {
- field->raw_iter = dx_field_iterator_sub(iter, length);
- dx_field_iterator_advance(iter, length - length_of_count);
- for (uint32_t idx = 0; idx < count; idx++) {
- dx_parsed_field_t *child = dx_parse_internal(field->raw_iter, field);
- DEQ_INSERT_TAIL(field->children, child);
- if (!dx_parse_ok(child)) {
- field->parse_error = child->parse_error;
- break;
- }
- }
- }
-
- return field;
-}
-
-
-dx_parsed_field_t *dx_parse(dx_field_iterator_t *iter)
-{
- return dx_parse_internal(iter, 0);
-}
-
-
-void dx_parse_free(dx_parsed_field_t *field)
-{
- if (!field)
- return;
-
- assert(field->parent == 0);
- if (field->raw_iter)
- dx_field_iterator_free(field->raw_iter);
-
- dx_parsed_field_t *sub_field = DEQ_HEAD(field->children);
- while (sub_field) {
- dx_parsed_field_t *next = DEQ_NEXT(sub_field);
- DEQ_REMOVE_HEAD(field->children);
- sub_field->parent = 0;
- dx_parse_free(sub_field);
- sub_field = next;
- }
-
- free_dx_parsed_field_t(field);
-}
-
-
-int dx_parse_ok(dx_parsed_field_t *field)
-{
- return field->parse_error == 0;
-}
-
-
-const char *dx_parse_error(dx_parsed_field_t *field)
-{
- return field->parse_error;
-}
-
-
-uint8_t dx_parse_tag(dx_parsed_field_t *field)
-{
- return field->tag;
-}
-
-
-dx_field_iterator_t *dx_parse_raw(dx_parsed_field_t *field)
-{
- return field->raw_iter;
-}
-
-
-uint32_t dx_parse_as_uint(dx_parsed_field_t *field)
-{
- uint32_t result = 0;
-
- dx_field_iterator_reset(field->raw_iter);
-
- switch (field->tag) {
- case DX_AMQP_UINT:
- result |= ((uint32_t) dx_field_iterator_octet(field->raw_iter)) << 24;
- result |= ((uint32_t) dx_field_iterator_octet(field->raw_iter)) << 16;
-
- case DX_AMQP_USHORT:
- result |= ((uint32_t) dx_field_iterator_octet(field->raw_iter)) << 8;
- // Fall Through...
-
- case DX_AMQP_UBYTE:
- case DX_AMQP_SMALLUINT:
- case DX_AMQP_BOOLEAN:
- result |= (uint32_t) dx_field_iterator_octet(field->raw_iter);
- break;
-
- case DX_AMQP_TRUE:
- result = 1;
- break;
- }
-
- return result;
-}
-
-
-uint64_t dx_parse_as_ulong(dx_parsed_field_t *field)
-{
- uint64_t result = 0;
-
- dx_field_iterator_reset(field->raw_iter);
-
- switch (field->tag) {
- case DX_AMQP_ULONG:
- case DX_AMQP_TIMESTAMP:
- result |= ((uint64_t) dx_field_iterator_octet(field->raw_iter)) << 56;
- result |= ((uint64_t) dx_field_iterator_octet(field->raw_iter)) << 48;
- result |= ((uint64_t) dx_field_iterator_octet(field->raw_iter)) << 40;
- result |= ((uint64_t) dx_field_iterator_octet(field->raw_iter)) << 32;
- result |= ((uint64_t) dx_field_iterator_octet(field->raw_iter)) << 24;
- result |= ((uint64_t) dx_field_iterator_octet(field->raw_iter)) << 16;
- result |= ((uint64_t) dx_field_iterator_octet(field->raw_iter)) << 8;
- // Fall Through...
-
- case DX_AMQP_SMALLULONG:
- result |= (uint64_t) dx_field_iterator_octet(field->raw_iter);
- // Fall Through...
-
- case DX_AMQP_ULONG0:
- break;
- }
-
- return result;
-}
-
-
-int32_t dx_parse_as_int(dx_parsed_field_t *field)
-{
- int32_t result = 0;
-
- dx_field_iterator_reset(field->raw_iter);
-
- switch (field->tag) {
- case DX_AMQP_INT:
- result |= ((int32_t) dx_field_iterator_octet(field->raw_iter)) << 24;
- result |= ((int32_t) dx_field_iterator_octet(field->raw_iter)) << 16;
-
- case DX_AMQP_SHORT:
- result |= ((int32_t) dx_field_iterator_octet(field->raw_iter)) << 8;
- // Fall Through...
-
- case DX_AMQP_BYTE:
- case DX_AMQP_SMALLINT:
- case DX_AMQP_BOOLEAN:
- result |= (int32_t) dx_field_iterator_octet(field->raw_iter);
- break;
-
- case DX_AMQP_TRUE:
- result = 1;
- break;
- }
-
- return result;
-}
-
-
-int64_t dx_parse_as_long(dx_parsed_field_t *field)
-{
- int64_t result = 0;
-
- dx_field_iterator_reset(field->raw_iter);
-
- switch (field->tag) {
- case DX_AMQP_LONG:
- result |= ((int64_t) dx_field_iterator_octet(field->raw_iter)) << 56;
- result |= ((int64_t) dx_field_iterator_octet(field->raw_iter)) << 48;
- result |= ((int64_t) dx_field_iterator_octet(field->raw_iter)) << 40;
- result |= ((int64_t) dx_field_iterator_octet(field->raw_iter)) << 32;
- result |= ((int64_t) dx_field_iterator_octet(field->raw_iter)) << 24;
- result |= ((int64_t) dx_field_iterator_octet(field->raw_iter)) << 16;
- result |= ((int64_t) dx_field_iterator_octet(field->raw_iter)) << 8;
- // Fall Through...
-
- case DX_AMQP_SMALLLONG:
- result |= (uint64_t) dx_field_iterator_octet(field->raw_iter);
- break;
- }
-
- return result;
-}
-
-
-uint32_t dx_parse_sub_count(dx_parsed_field_t *field)
-{
- uint32_t count = DEQ_SIZE(field->children);
-
- if (field->tag == DX_AMQP_MAP8 || field->tag == DX_AMQP_MAP32)
- count = count >> 1;
-
- return count;
-}
-
-
-dx_parsed_field_t *dx_parse_sub_key(dx_parsed_field_t *field, uint32_t idx)
-{
- if (field->tag != DX_AMQP_MAP8 && field->tag != DX_AMQP_MAP32)
- return 0;
-
- idx = idx << 1;
- dx_parsed_field_t *key = DEQ_HEAD(field->children);
- while (idx && key) {
- idx--;
- key = DEQ_NEXT(key);
- }
-
- return key;
-}
-
-
-dx_parsed_field_t *dx_parse_sub_value(dx_parsed_field_t *field, uint32_t idx)
-{
- if (field->tag == DX_AMQP_MAP8 || field->tag == DX_AMQP_MAP32)
- idx = (idx << 1) + 1;
-
- dx_parsed_field_t *key = DEQ_HEAD(field->children);
- while (idx && key) {
- idx--;
- key = DEQ_NEXT(key);
- }
-
- return key;
-}
-
-
-int dx_parse_is_map(dx_parsed_field_t *field)
-{
- return field->tag == DX_AMQP_MAP8 || field->tag == DX_AMQP_MAP32;
-}
-
-
-int dx_parse_is_list(dx_parsed_field_t *field)
-{
- return field->tag == DX_AMQP_LIST8 || field->tag == DX_AMQP_LIST32;
-}
-
-
-int dx_parse_is_scalar(dx_parsed_field_t *field)
-{
- return DEQ_SIZE(field->children) == 0;
-}
-
-
-dx_parsed_field_t *dx_parse_value_by_key(dx_parsed_field_t *field, const char *key)
-{
- uint32_t count = dx_parse_sub_count(field);
-
- for (uint32_t idx = 0; idx < count; idx++) {
- dx_parsed_field_t *sub = dx_parse_sub_key(field, idx);
- if (!sub)
- return 0;
-
- dx_field_iterator_t *iter = dx_parse_raw(sub);
- if (!iter)
- return 0;
-
- if (dx_field_iterator_equal(iter, (const unsigned char*) key)) {
- return dx_parse_sub_value(field, idx);
- }
- }
-
- return 0;
-}