qdr_field_t *qdr_field(const char *text) { size_t length = text ? strlen(text) : 0; size_t ilength = length; if (length == 0) return 0; qdr_field_t *field = new_qdr_field_t(); qd_buffer_t *buf; ZERO(field); while (length > 0) { buf = qd_buffer(); size_t cap = qd_buffer_capacity(buf); size_t copy = length > cap ? cap : length; memcpy(qd_buffer_cursor(buf), text, copy); qd_buffer_insert(buf, copy); length -= copy; text += copy; DEQ_INSERT_TAIL(field->buffers, buf); } field->iterator = qd_field_iterator_buffer(DEQ_HEAD(field->buffers), 0, ilength); return field; }
qd_field_iterator_t *qd_message_field_iterator_typed(qd_message_t *msg, qd_message_field_t field) { qd_field_location_t *loc = qd_message_field_location(msg, field); if (!loc) return 0; return qd_field_iterator_buffer(loc->buffer, loc->offset, loc->length + loc->hdr_length); }
qd_field_iterator_t *qd_message_field_iterator(qd_message_t *msg, qd_message_field_t field) { qd_field_location_t *loc = qd_message_field_location(msg, field); if (!loc) return 0; if (loc->tag == QD_AMQP_NULL) return 0; qd_buffer_t *buffer = loc->buffer; unsigned char *cursor = qd_buffer_base(loc->buffer) + loc->offset; advance(&cursor, &buffer, loc->hdr_length, 0, 0); return qd_field_iterator_buffer(buffer, cursor - qd_buffer_base(buffer), loc->length); }
qdr_field_t *qdr_field_from_iter(qd_field_iterator_t *iter) { qdr_field_t *field = new_qdr_field_t(); qd_buffer_t *buf; int remaining; int length; ZERO(field); qd_field_iterator_reset(iter); remaining = qd_field_iterator_remaining(iter); length = remaining; while (remaining) { buf = qd_buffer(); size_t cap = qd_buffer_capacity(buf); int copied = qd_field_iterator_ncopy(iter, qd_buffer_cursor(buf), cap); qd_buffer_insert(buf, copied); DEQ_INSERT_TAIL(field->buffers, buf); remaining = qd_field_iterator_remaining(iter); } field->iterator = qd_field_iterator_buffer(DEQ_HEAD(field->buffers), 0, length); return field; }