Repository: qpid-dispatch
Updated Branches:
  refs/heads/master 113228490 -> 0d047bebf


DISPATCH-513 - Added a typed iterator to parsed field (qd_parsed_field_t). [PR 
from Ganesh Murthy]
This closes #100


Project: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/commit/0d047beb
Tree: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/tree/0d047beb
Diff: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/diff/0d047beb

Branch: refs/heads/master
Commit: 0d047bebf1ecc93e4dc95d00fdb35f4ca451b1fb
Parents: 1132284
Author: Ted Ross <tr...@redhat.com>
Authored: Fri Sep 16 13:05:53 2016 -0400
Committer: Ted Ross <tr...@redhat.com>
Committed: Fri Sep 16 13:05:53 2016 -0400

----------------------------------------------------------------------
 include/qpid/dispatch/parse.h | 12 ++++++++++++
 src/parse.c                   | 11 +++++++++++
 tests/parse_test.c            |  8 ++++++++
 3 files changed, 31 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/0d047beb/include/qpid/dispatch/parse.h
----------------------------------------------------------------------
diff --git a/include/qpid/dispatch/parse.h b/include/qpid/dispatch/parse.h
index 47f3069..d38a5fa 100644
--- a/include/qpid/dispatch/parse.h
+++ b/include/qpid/dispatch/parse.h
@@ -91,6 +91,18 @@ uint8_t qd_parse_tag(qd_parsed_field_t *field);
  */
 qd_field_iterator_t *qd_parse_raw(qd_parsed_field_t *field);
 
+
+/**
+ * Return an iterator for the typed content of the field. Contains the type 
followed by the raw content.
+ *
+ * IMPORTANT: The returned iterator is owned by the field and *must not* be
+ * freed by the caller of this function.
+ *
+ * @param field The field pointer returned by qd_parse.
+ * @return A field iterator that describes the field's typed content.
+ */
+qd_field_iterator_t *qd_parse_typed(qd_parsed_field_t *field);
+
 /**
  * Return the raw content as an unsigned integer up to 32-bits.  This is
  * valid only for scalar fields of a fixed size of 4-octets or fewer.

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/0d047beb/src/parse.c
----------------------------------------------------------------------
diff --git a/src/parse.c b/src/parse.c
index 662b37a..7a633f1 100644
--- a/src/parse.c
+++ b/src/parse.c
@@ -30,6 +30,7 @@ struct qd_parsed_field_t {
     qd_parsed_field_list_t  children;
     uint8_t                 tag;
     qd_field_iterator_t    *raw_iter;
+    qd_field_iterator_t    *typed_iter;
     const char             *parse_error;
 };
 
@@ -111,6 +112,7 @@ static qd_parsed_field_t 
*qd_parse_internal(qd_field_iterator_t *iter, qd_parsed
     DEQ_INIT(field->children);
     field->parent   = p;
     field->raw_iter = 0;
+    field->typed_iter = qd_field_iterator_dup(iter);
 
     uint32_t length;
     uint32_t count;
@@ -152,6 +154,9 @@ void qd_parse_free(qd_parsed_field_t *field)
     if (field->raw_iter)
         qd_field_iterator_free(field->raw_iter);
 
+    if (field->typed_iter)
+        qd_field_iterator_free(field->typed_iter);
+
     qd_parsed_field_t *sub_field = DEQ_HEAD(field->children);
     while (sub_field) {
         qd_parsed_field_t *next = DEQ_NEXT(sub_field);
@@ -189,6 +194,12 @@ qd_field_iterator_t *qd_parse_raw(qd_parsed_field_t *field)
 }
 
 
+qd_field_iterator_t *qd_parse_typed(qd_parsed_field_t *field)
+{
+    return field->typed_iter;
+}
+
+
 uint32_t qd_parse_as_uint(qd_parsed_field_t *field)
 {
     uint32_t result = 0;

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/0d047beb/tests/parse_test.c
----------------------------------------------------------------------
diff --git a/tests/parse_test.c b/tests/parse_test.c
index 4d30cce..ec7d74a 100644
--- a/tests/parse_test.c
+++ b/tests/parse_test.c
@@ -70,6 +70,14 @@ static char *test_parser_fixed_scalars(void *context)
         qd_field_iterator_t *field  = 
qd_field_iterator_binary(fs_vectors[idx].data,
                                                                
fs_vectors[idx].length);
         qd_parsed_field_t *parsed = qd_parse(field);
+
+        qd_field_iterator_t *typed_iter = qd_parse_typed(parsed);
+
+        int length = qd_field_iterator_length(typed_iter);
+
+        if (length != fs_vectors[idx].length)
+            return "Length of typed iterator does not match actual length";
+
         if (!qd_parse_ok(parsed)) return "Unexpected Parse Error";
         if (qd_parse_tag(parsed) != fs_vectors[idx].expected_tag) {
             sprintf(error, "(%d) Tag: Expected %02x, Got %02x", idx,


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@qpid.apache.org
For additional commands, e-mail: commits-h...@qpid.apache.org

Reply via email to