static char *test_sub_iterator(void *context) { qd_iterator_t *iter = qd_iterator_string("test_sub_iterator", ITER_VIEW_ALL); qd_iterator_t *sub1 = qd_iterator_sub(iter, qd_iterator_remaining(iter)); qd_iterator_advance(iter, 5); qd_iterator_t *sub2 = qd_iterator_sub(iter, qd_iterator_remaining(iter)); qd_iterator_t *sub3 = qd_iterator_sub(iter, 3); if (!qd_iterator_equal(sub1, (unsigned char*) "test_sub_iterator")) return "Sub Iterator failed - 1"; if (!qd_iterator_equal(sub2, (unsigned char*) "sub_iterator")) return "Sub Iterator failed - 2"; if (!qd_iterator_equal(sub3, (unsigned char*) "sub")) return "Sub Iterator failed - 3"; qd_iterator_free(iter); qd_iterator_free(sub1); qd_iterator_free(sub2); qd_iterator_free(sub3); return 0; }
void qd_parse_annotations( bool strip_annotations_in, qd_iterator_t *ma_iter_in, qd_parsed_field_t **ma_ingress, qd_parsed_field_t **ma_phase, qd_parsed_field_t **ma_to_override, qd_parsed_field_t **ma_trace, qd_iterator_pointer_t *blob_pointer, uint32_t *blob_item_count) { *ma_ingress = 0; *ma_phase = 0; *ma_to_override = 0; *ma_trace = 0; ZERO(blob_pointer); *blob_item_count = 0; if (!ma_iter_in) return; uint8_t tag = 0; uint32_t size = 0; uint32_t length_of_count = 0; uint32_t length_of_size = 0; const char *parse_error = get_type_info(ma_iter_in, &tag, &size, blob_item_count, &length_of_size, &length_of_count); if (parse_error) return; if (!is_tag_a_map(tag)) { return; } // Initial snapshot on size/content of annotation payload qd_iterator_t *raw_iter = qd_iterator_sub(ma_iter_in, (size - length_of_count)); // If there are no router annotations then all annotations // are the user's opaque blob. qd_iterator_get_view_cursor(raw_iter, blob_pointer); qd_iterator_free(raw_iter); (void) qd_parse_annotations_v1(strip_annotations_in, ma_iter_in, ma_ingress, ma_phase, ma_to_override, ma_trace, blob_pointer, blob_item_count); return; }
static qd_parsed_field_t *qd_parse_internal(qd_iterator_t *iter, qd_parsed_field_t *p) { qd_parsed_field_t *field = new_qd_parsed_field_t(); if (!field) return 0; DEQ_ITEM_INIT(field); DEQ_INIT(field->children); field->parent = p; field->raw_iter = 0; field->typed_iter = qd_iterator_dup(iter); uint32_t size = 0; uint32_t count = 0; uint32_t length_of_count = 0; uint32_t length_of_size = 0; field->parse_error = get_type_info(iter, &field->tag, &size, &count, &length_of_size, &length_of_count); if (!field->parse_error) { qd_iterator_trim_view(field->typed_iter, size + length_of_size + 1); // + 1 accounts for the tag length field->raw_iter = qd_iterator_sub(iter, size - length_of_count); qd_iterator_advance(iter, size - length_of_count); for (uint32_t idx = 0; idx < count; idx++) { qd_parsed_field_t *child = qd_parse_internal(field->raw_iter, field); DEQ_INSERT_TAIL(field->children, child); if (!qd_parse_ok(child)) { field->parse_error = child->parse_error; break; } } } return field; }