You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by st...@apache.org on 2016/01/19 19:01:58 UTC

[1/5] incubator-mynewt-larva git commit: have json decoding work directly on mbufs. unify encode & decode in nmgr task. convert echo to json.

Repository: incubator-mynewt-larva
Updated Branches:
  refs/heads/master bf84ccc0f -> 54576ff76


have json decoding work directly on mbufs.  unify encode & decode in nmgr task.  convert echo to json.


Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/commit/54576ff7
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/tree/54576ff7
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/diff/54576ff7

Branch: refs/heads/master
Commit: 54576ff76a1e13accc161c9c8a3fba1eac20691f
Parents: dad64f0
Author: Sterling Hughes <st...@apache.org>
Authored: Tue Jan 19 10:01:41 2016 -0800
Committer: Sterling Hughes <st...@apache.org>
Committed: Tue Jan 19 10:01:51 2016 -0800

----------------------------------------------------------------------
 libs/json/include/json/json.h          |  19 ++-
 libs/json/src/json_decode.c            | 220 +++++++++++++---------------
 libs/json/src/json_encode.c            |   8 +-
 libs/newtmgr/include/newtmgr/newtmgr.h |  16 ++
 libs/newtmgr/src/newtmgr.c             | 146 +++++++++++++++++-
 5 files changed, 282 insertions(+), 127 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/54576ff7/libs/json/include/json/json.h
----------------------------------------------------------------------
diff --git a/libs/json/include/json/json.h b/libs/json/include/json/json.h
index d220cc7..1d41100 100644
--- a/libs/json/include/json/json.h
+++ b/libs/json/include/json/json.h
@@ -69,7 +69,7 @@ struct json_value {
 
 #define JSON_VALUE_STRINGN(__jv, __str, __len) \
     (__jv)->jv_type = JSON_VALUE_TYPE_STRING;  \
-    (__jv)->jv_len = __len;                    \
+    (__jv)->jv_len = (uint16_t) (__len);                    \
     (__jv)->jv_val.str = (__str);
 
 #define JSON_VALUE_BOOL(__jv, __v)            \
@@ -97,7 +97,7 @@ struct json_encoder {
 
 #define JSON_NITEMS(x) (int)(sizeof(x)/sizeof(x[0]))
 
-int json_encode_object_start(struct json_encoder *, void *, json_write_func_t);
+int json_encode_object_start(struct json_encoder *);
 int json_encode_object_entry(struct json_encoder *, char *, 
         struct json_value *);
 int json_encode_object_finish(struct json_encoder *);
@@ -178,11 +178,22 @@ struct json_attr_t {
     bool nodefault;
 };
 
+struct json_buffer;
+typedef char (*json_buffer_read_next_byte_t)(struct json_buffer *);
+typedef char (*json_buffer_read_prev_byte_t)(struct json_buffer *);
+typedef int (*json_buffer_readn_t)(struct json_buffer *, char *buf, int n);
+
+struct json_buffer {
+    json_buffer_readn_t jb_readn;
+    json_buffer_read_next_byte_t jb_read_next;
+    json_buffer_read_prev_byte_t jb_read_prev;
+};
+
 #define JSON_ATTR_MAX        31        /* max chars in JSON attribute name */
 #define JSON_VAL_MAX        512        /* max chars in JSON value part */
 
-int json_read_object(const char *, const struct json_attr_t *, const char **);
-int json_read_array(const char *, const struct json_array_t *, const char **);
+int json_read_object(struct json_buffer *, const struct json_attr_t *);
+int json_read_array(struct json_buffer *, const struct json_array_t *);
 
 #define JSON_ERR_OBSTART     1   /* non-WS when expecting object start */
 #define JSON_ERR_ATTRSTART   2   /* non-WS when expecting attrib start */

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/54576ff7/libs/json/src/json_decode.c
----------------------------------------------------------------------
diff --git a/libs/json/src/json_decode.c b/libs/json/src/json_decode.c
index 5c058a6..87b98c4 100644
--- a/libs/json/src/json_decode.c
+++ b/libs/json/src/json_decode.c
@@ -138,9 +138,10 @@ json_target_address(const struct json_attr_t *cursor,
 }
 
 static int 
-json_internal_read_object(const char *cp, const struct json_attr_t *attrs, 
-        const struct json_array_t *parent, int offset, const char **end)
+json_internal_read_object(struct json_buffer *jb, const struct json_attr_t *attrs, 
+        const struct json_array_t *parent, int offset)
 {
+    char c;
     enum { 
         init, await_attr, in_attr, await_value, in_val_string,
         in_escape, in_val_token, post_val, post_array
@@ -161,11 +162,6 @@ json_internal_read_object(const char *cp, const struct json_attr_t *attrs,
     memset(attrbuf, '\0', sizeof(attrbuf));
 #endif /* S_SPLINT_S */
 
-    if (end != NULL) { 
-        /* give it a well-defined value on parse failure */
-        *end = NULL; 
-    }
-
     /* stuff fields with defaults in case they're omitted in the JSON input */
     for (cursor = attrs; cursor->attribute != NULL; cursor++) {
         if (!cursor->nodefault) {
@@ -207,35 +203,26 @@ json_internal_read_object(const char *cp, const struct json_attr_t *attrs,
     }
 
     /* parse input JSON */
-    for (; *cp != '\0'; cp++) {
+    for (c = jb->jb_read_next(jb); c != '\0'; c = jb->jb_read_next(jb)) {
         switch (state) {
         case init:
-            if (isspace((unsigned char) *cp)) {
+            if (isspace((unsigned char) c)) {
                 continue;
-            } else if (*cp == '{') {
+            } else if (c == '{') {
                 state = await_attr;
             } else {
-                if (end != NULL) {
-                    *end = cp;
-                }
                 return JSON_ERR_OBSTART;
             }
             break;
         case await_attr:
-            if (isspace((unsigned char) *cp)) {
+            if (isspace((unsigned char) c)) {
                 continue;
-            } else if (*cp == '"') {
+            } else if (c == '"') {
                 state = in_attr;
                 pattr = attrbuf;
-                if (end != NULL) {
-                    *end = cp;
-                }
-            } else if (*cp == '}') {
+            } else if (c == '}') {
                 break;
             } else {
-                if (end != NULL) {
-                    *end = cp;
-                }
                 return JSON_ERR_ATTRSTART;
             }
             break;
@@ -244,7 +231,7 @@ json_internal_read_object(const char *cp, const struct json_attr_t *attrs,
                 /* don't update end here, leave at attribute start */
                 return JSON_ERR_NULLPTR;
             }
-            if (*cp == '"') {
+            if (c == '"') {
                 *pattr++ = '\0';
                 for (cursor = attrs; cursor->attribute != NULL; cursor++) {
                     if (strcmp(cursor->attribute, attrbuf) == 0) {
@@ -270,30 +257,25 @@ json_internal_read_object(const char *cp, const struct json_attr_t *attrs,
                 /* don't update end here, leave at attribute start */
                 return JSON_ERR_ATTRLEN;
             } else {
-                *pattr++ = *cp;
+                *pattr++ = c;
             }
             break;
         case await_value:
-            if (isspace((unsigned char) *cp) || *cp == ':') {
+            if (isspace((unsigned char) c) || c == ':') {
                 continue;
-            } else if (*cp == '[') {
+            } else if (c == '[') {
                 if (cursor->type != t_array) {
-                    if (end != NULL) {
-                        *end = cp;
-                    }
                     return JSON_ERR_NOARRAY;
                 }
-                substatus = json_read_array(cp, &cursor->addr.array, &cp);
+                c = jb->jb_read_prev(jb);
+                substatus = json_read_array(jb, &cursor->addr.array);
                 if (substatus != 0) {
                     return substatus;
                 }
                 state = post_array;
             } else if (cursor->type == t_array) {
-                if (end != NULL) {
-                    *end = cp;
-                }
                 return JSON_ERR_NOBRAK;
-            } else if (*cp == '"') {
+            } else if (c == '"') {
                 value_quoted = true;
                 state = in_val_string;
                 pval = valbuf;
@@ -301,7 +283,7 @@ json_internal_read_object(const char *cp, const struct json_attr_t *attrs,
                 value_quoted = false;
                 state = in_val_token;
                 pval = valbuf;
-                *pval++ = *cp;
+                *pval++ = c;
             }
             break;
         case in_val_string:
@@ -309,9 +291,9 @@ json_internal_read_object(const char *cp, const struct json_attr_t *attrs,
                 /* don't update end here, leave at value start */
                 return JSON_ERR_NULLPTR;
             }
-            if (*cp == '\\') {
+            if (c == '\\') {
                 state = in_escape;
-            } else if (*cp == '"') {
+            } else if (c == '"') {
                 *pval++ = '\0';
                 state = post_val;
             } else if (pval > valbuf + JSON_VAL_MAX - 1
@@ -319,7 +301,7 @@ json_internal_read_object(const char *cp, const struct json_attr_t *attrs,
                 /* don't update end here, leave at value start */
                 return JSON_ERR_STRLONG;        /*  */
             } else {
-                *pval++ = *cp;
+                *pval++ = c;
             }
             break;
         case in_escape:
@@ -327,7 +309,7 @@ json_internal_read_object(const char *cp, const struct json_attr_t *attrs,
                 /* don't update end here, leave at value start */
                 return JSON_ERR_NULLPTR;
             }
-            switch (*cp) {
+            switch (c) {
             case 'b':
                 *pval++ = '\b';
                 break;
@@ -344,15 +326,17 @@ json_internal_read_object(const char *cp, const struct json_attr_t *attrs,
                 *pval++ = '\t';
                 break;
             case 'u':
-                for (n = 0; n < 4 && cp[n] != '\0'; n++) {
-                    uescape[n] = *cp++;
+                for (n = 0; n < 4 && c != '\0'; n++) {
+                    uescape[n] = c;
+                    c = jb->jb_read_next(jb);
                 }
-                --cp;
+                // Scroll back one
+                c = jb->jb_read_prev(jb);
                 (void)sscanf(uescape, "%04x", &u);
                 *pval++ = (char)u;        /* will truncate values above 0xff */
                 break;
             default:                /* handles double quote and solidus */
-                *pval++ = *cp;
+                *pval++ = c;
                 break;
             }
             state = in_val_string;
@@ -362,17 +346,17 @@ json_internal_read_object(const char *cp, const struct json_attr_t *attrs,
                 /* don't update end here, leave at value start */
                 return JSON_ERR_NULLPTR;
             }
-            if (isspace((unsigned char) *cp) || *cp == ',' || *cp == '}') {
+            if (isspace((unsigned char) c) || c == ',' || c == '}') {
                 *pval = '\0';
                 state = post_val;
-                if (*cp == '}' || *cp == ',') {
-                    --cp;
+                if (c == '}' || c == ',') {
+                    c = jb->jb_read_prev(jb);
                 }
             } else if (pval > valbuf + JSON_VAL_MAX - 1) {
                 /* don't update end here, leave at value start */
                 return JSON_ERR_TOKLONG;
             } else {
-                *pval++ = *cp;
+                *pval++ = c;
             }
             break;
         case post_val:
@@ -486,17 +470,14 @@ json_internal_read_object(const char *cp, const struct json_attr_t *attrs,
             }
             /*@fallthrough@*/
         case post_array:
-            if (isspace((unsigned char) *cp)) {
+            if (isspace((unsigned char) c)) {
                 continue;
-            } else if (*cp == ',') {
+            } else if (c == ',') {
                 state = await_attr;
-            } else if (*cp == '}') {
-                ++cp;
+            } else if (c == '}') {
+                c = jb->jb_read_next(jb);
                 goto good_parse;
             } else {
-                if (end != NULL) {
-                    *end = cp;
-                }
                 return JSON_ERR_BADTRAIL;
             }
             break;
@@ -505,45 +486,34 @@ json_internal_read_object(const char *cp, const struct json_attr_t *attrs,
 
   good_parse:
     /* in case there's another object following, consume trailing WS */
-    while (isspace((unsigned char) *cp)) {
-        ++cp;
-    }
-    if (end != NULL) {
-        *end = cp;
+    while (isspace((unsigned char) jb->jb_read_next(jb))) {
     }
     return 0;
 }
 
 int 
-json_read_array(const char *cp, const struct json_array_t *arr, 
-        const char **end)
+json_read_array(struct json_buffer *jb, const struct json_array_t *arr)
 {
+    char valbuf[64];
+    char c;
     int substatus, offset, arrcount;
     char *tp;
+    int n, count;
 
-    if (end != NULL) {
-        /* give it a well-defined value on parse failure */
-        *end = NULL;
+    for (c = jb->jb_read_next(jb); isspace(c); c = jb->jb_read_next(jb)) {
     }
 
-    while (isspace((unsigned char) *cp)) {
-        cp++;
-    }
-
-    if (*cp != '[') {
+    if (c != '[') {
         return JSON_ERR_ARRAYSTART;
-    } else {
-        cp++;
-    }
+    } 
 
     tp = arr->arr.strings.store;
     arrcount = 0;
 
-    /* Check for empty array */
-    while (isspace((unsigned char) *cp)) {
-        cp++;
+    for (c = jb->jb_read_next(jb); isspace(c); c = jb->jb_read_next(jb)) {
     }
-    if (*cp == ']') {
+
+    if (c == ']') {
         goto breakout;
     }
 
@@ -551,25 +521,26 @@ json_read_array(const char *cp, const struct json_array_t *arr,
         char *ep = NULL;
         switch (arr->element_type) {
         case t_string:
-            if (isspace((unsigned char) *cp)) {
-                cp++;
+            if (isspace((unsigned char) c)) {
+                c = jb->jb_read_next(jb);
             }
-            if (*cp != '"') {
+            if (c != '"') {
                 return JSON_ERR_BADSTRING;
             } else {
-                ++cp;
+                c = jb->jb_read_next(jb);
             }
             arr->arr.strings.ptrs[offset] = tp;
             for (; tp - arr->arr.strings.store < arr->arr.strings.storelen;
                  tp++) {
-                if (*cp == '"') {
-                    ++cp;
+                if (c == '"') {
+                    c = jb->jb_read_next(jb);
                     *tp++ = '\0';
                     goto stringend;
-                } else if (*cp == '\0') {
+                } else if (c == '\0') {
                     return JSON_ERR_BADSTRING;
                 } else {
-                    *tp = *cp++;
+                    *tp = c;
+                    c = jb->jb_read_next(jb);
                 }
             }
             return JSON_ERR_BADSTRING;
@@ -578,47 +549,71 @@ json_read_array(const char *cp, const struct json_array_t *arr,
         case t_object:
         case t_structobject:
             substatus =
-                json_internal_read_object(cp, arr->arr.objects.subtype, arr,
-                                          offset, &cp);
+                json_internal_read_object(jb, arr->arr.objects.subtype, arr,
+                                          offset);
             if (substatus != 0) {
-                if (end != NULL) {
-                    end = &cp;
-                }
                 return substatus;
             }
             break;
         case t_integer:
-            arr->arr.integers.store[offset] = (int)strtol(cp, &ep, 0);
-            if (ep == cp) {
+            n = jb->jb_readn(jb, valbuf, sizeof(valbuf)-1);
+            valbuf[n] = '\0';
+
+            arr->arr.integers.store[offset] = (int)strtol(valbuf, &ep, 0);
+            if (ep == valbuf) {
                 return JSON_ERR_BADNUM;
             } else {
-                cp = ep;
+                count = ep - valbuf;
+                while (count-- > 0) {
+                    c = jb->jb_read_next(jb);
+                }
             }
             break;
         case t_uinteger:
-            arr->arr.uintegers.store[offset] = (unsigned int)strtoul(cp, &ep, 0);
-            if (ep == cp) {
+            n = jb->jb_readn(jb, valbuf, sizeof(valbuf)-1);
+            valbuf[n] = '\0';
+
+            arr->arr.uintegers.store[offset] = (unsigned int)strtoul(valbuf, &ep, 0);
+            if (ep == valbuf) {
                 return JSON_ERR_BADNUM;
             } else {
-                cp = ep;
+                count = ep - valbuf;
+                while (count-- > 0) {
+                    c = jb->jb_read_next(jb);
+                }
             }
             break;
         case t_real:
-            arr->arr.reals.store[offset] = strtod(cp, &ep);
-            if (ep == cp) {
+            n = jb->jb_readn(jb, valbuf, sizeof(valbuf)-1);
+            valbuf[n] = '\0';
+
+            arr->arr.reals.store[offset] = strtod(valbuf, &ep);
+            if (ep == valbuf) {
                 return JSON_ERR_BADNUM;
             } else {
-                cp = ep;
+                count = ep - valbuf;
+                while (count-- > 0) {
+                    c = jb->jb_read_next(jb);
+                }
             }
             break;
         case t_boolean:
-            if (strncmp(cp, "true", 4) == 0) {
+            n = jb->jb_readn(jb, valbuf, 5);
+            valbuf[n] = '\0';
+
+            if (strncmp(valbuf, "true", 4) == 0) {
                 arr->arr.booleans.store[offset] = true;
-                cp += 4;
+                count = 4;
+                while (count-- > 0) {
+                    c = jb->jb_read_next(jb);
+                }
             }
-            else if (strncmp(cp, "false", 5) == 0) {
+            else if (strncmp(valbuf, "false", 5) == 0) {
                 arr->arr.booleans.store[offset] = false;
-                cp += 5;
+                count = 5;
+                while (count-- > 0) {
+                    c = jb->jb_read_next(jb);
+                }
             }
             break;
         case t_character:
@@ -628,38 +623,31 @@ json_read_array(const char *cp, const struct json_array_t *arr,
             return JSON_ERR_SUBTYPE;
         }
         arrcount++;
-        if (isspace((unsigned char) *cp)) {
-            cp++;
+        if (isspace((unsigned char) c)) {
+            c = jb->jb_read_next(jb);
         }
-        if (*cp == ']') {
+        if (c == ']') {
             goto breakout;
-        } else if (*cp == ',') {
-            cp++;
+        } else if (c == ',') {
+            c = jb->jb_read_next(jb);
         } else {
             return JSON_ERR_BADSUBTRAIL;
         }
     }
-    if (end != NULL) {
-        *end = cp;
-    }
     return JSON_ERR_SUBTOOLONG;
   breakout:
     if (arr->count != NULL) {
         *(arr->count) = arrcount;
     }
-    if (end != NULL) {
-        *end = cp;
-    }
     return 0;
 }
 
 int 
-json_read_object(const char *cp, const struct json_attr_t *attrs, 
-        const char **end)
+json_read_object(struct json_buffer *jb, const struct json_attr_t *attrs)
 {
     int st;
 
-    st = json_internal_read_object(cp, attrs, NULL, 0, end);
+    st = json_internal_read_object(jb, attrs, NULL, 0);
     return st;
 }
 

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/54576ff7/libs/json/src/json_encode.c
----------------------------------------------------------------------
diff --git a/libs/json/src/json_encode.c b/libs/json/src/json_encode.c
index a5f6018..d1229ef 100644
--- a/libs/json/src/json_encode.c
+++ b/libs/json/src/json_encode.c
@@ -34,12 +34,8 @@
 
 
 int 
-json_encode_object_start(struct json_encoder *encoder, void *buf, 
-        json_write_func_t wf)
+json_encode_object_start(struct json_encoder *encoder)
 {
-    encoder->je_write = wf;
-    encoder->je_arg = buf;
-
     JSON_ENCODE_OBJECT_START(encoder);
 
     return (0);
@@ -68,6 +64,7 @@ json_encode_value(struct json_encoder *encoder, struct json_value *jv)
             encoder->je_write(encoder->je_arg, encoder->je_encode_buf, len);
             break;
         case JSON_VALUE_TYPE_STRING:
+            encoder->je_write(encoder->je_arg, "\"", sizeof("\"")-1);
             for (i = 0; i < jv->jv_len; i++) {
                 switch (jv->jv_val.str[i]) {
                     case '"':
@@ -106,6 +103,7 @@ json_encode_value(struct json_encoder *encoder, struct json_value *jv)
                 }
 
             }
+            encoder->je_write(encoder->je_arg, "\"", sizeof("\"")-1);
             break;
         case JSON_VALUE_TYPE_ARRAY:
             JSON_ENCODE_ARRAY_START(encoder);

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/54576ff7/libs/newtmgr/include/newtmgr/newtmgr.h
----------------------------------------------------------------------
diff --git a/libs/newtmgr/include/newtmgr/newtmgr.h b/libs/newtmgr/include/newtmgr/newtmgr.h
index 5251612..b00a47f 100644
--- a/libs/newtmgr/include/newtmgr/newtmgr.h
+++ b/libs/newtmgr/include/newtmgr/newtmgr.h
@@ -17,6 +17,7 @@
 #ifndef _NEWTMGR_H_
 #define _NEWTMGR_H_
 
+#include <json/json.h> 
 #include <inttypes.h>
 #include <os/os.h>
 
@@ -46,6 +47,21 @@ struct nmgr_hdr {
     uint16_t nh_id;
 };
 
+struct nmgr_jbuf {
+    /* json_buffer must be first element in the structure */
+    struct json_buffer njb_buf;
+    struct json_encoder njb_enc;
+    struct os_mbuf *njb_m;
+    struct nmgr_hdr *njb_hdr;
+    uint16_t njb_off;
+    uint16_t njb_end;
+};
+int nmgr_jbuf_init(struct nmgr_jbuf *njb);
+int nmgr_jbuf_setibuf(struct nmgr_jbuf *njb, struct os_mbuf *m, uint16_t off, 
+        uint16_t len);
+int nmgr_jbuf_setobuf(struct nmgr_jbuf *njb, struct nmgr_hdr *hdr, 
+        struct os_mbuf *m);
+
 typedef int (*nmgr_handler_func_t)(struct nmgr_hdr *nmr, struct os_mbuf *req, 
         uint16_t srcoff, struct nmgr_hdr *rsp_hdr, struct os_mbuf *rsp);
 

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/54576ff7/libs/newtmgr/src/newtmgr.c
----------------------------------------------------------------------
diff --git a/libs/newtmgr/src/newtmgr.c b/libs/newtmgr/src/newtmgr.c
index f001a4a..8f54040 100644
--- a/libs/newtmgr/src/newtmgr.c
+++ b/libs/newtmgr/src/newtmgr.c
@@ -49,24 +49,44 @@ static struct nmgr_handler nmgr_def_group_handlers[] = {
     [NMGR_ID_CONS_ECHO_CTRL] = {nmgr_def_console_echo, nmgr_def_console_echo}
 };
 
+/* JSON buffer for NMGR task
+ */
+struct nmgr_jbuf nmgr_task_jbuf;
 
 static int
 nmgr_def_echo(struct nmgr_hdr *nmr, struct os_mbuf *req, uint16_t srcoff,
         struct nmgr_hdr *rsp_hdr, struct os_mbuf *rsp)
 {
     uint8_t echo_buf[128];
+    struct json_attr_t attrs[] = {
+        { "d", t_string, .addr.string = (char *) &echo_buf[0], 
+            .len = sizeof(echo_buf) },
+        { NULL },
+    };
+    struct json_value jv;
     int rc;
 
-    rc = os_mbuf_copydata(req, srcoff + sizeof(*nmr), nmr->nh_len, echo_buf);
+    rc = nmgr_jbuf_setibuf(&nmgr_task_jbuf, req, srcoff + sizeof(*nmr),
+            nmr->nh_len);
+    if (rc != 0) {
+        goto err;
+    }
+
+    rc = json_read_object((struct json_buffer *) &nmgr_task_jbuf, attrs);
     if (rc != 0) {
         goto err;
     }
 
-    rc = nmgr_rsp_extend(rsp_hdr, rsp, echo_buf, nmr->nh_len);
+    rc = nmgr_jbuf_setobuf(&nmgr_task_jbuf, rsp_hdr, rsp);
     if (rc != 0) {
         goto err;
     }
 
+    json_encode_object_start(&nmgr_task_jbuf.njb_enc);
+    JSON_VALUE_STRINGN(&jv, (char *) echo_buf, strlen((char *) echo_buf));
+    json_encode_object_entry(&nmgr_task_jbuf.njb_enc, "r", &jv);
+    json_encode_object_finish(&nmgr_task_jbuf.njb_enc);
+
     return (0);
 err:
     return (rc);
@@ -226,6 +246,126 @@ err:
     return (rc);
 }
 
+static char 
+nmgr_jbuf_read_next(struct json_buffer *jb)
+{
+    struct nmgr_jbuf *njb;
+    char c;
+    int rc;
+
+    njb = (struct nmgr_jbuf *) jb;
+
+    if (njb->njb_off + 1 > njb->njb_end) {
+        return '\0';
+    }
+
+    rc = os_mbuf_copydata(njb->njb_m, njb->njb_off, 1, &c);
+    if (rc == -1) {
+        c = '\0';
+    }
+    ++njb->njb_off;
+
+    return (c);
+}
+
+static char 
+nmgr_jbuf_read_prev(struct json_buffer *jb)
+{
+    struct nmgr_jbuf *njb;
+    char c;
+    int rc;
+
+    njb = (struct nmgr_jbuf *) jb;
+
+    if (njb->njb_off == 0) {
+        return '\0';
+    }
+
+    --njb->njb_off;
+    rc = os_mbuf_copydata(njb->njb_m, njb->njb_off, 1, &c);
+    if (rc == -1) {
+        c = '\0';
+    }
+
+    return (c);
+}
+
+static int 
+nmgr_jbuf_readn(struct json_buffer *jb, char *buf, int size)
+{
+    struct nmgr_jbuf *njb;
+    int read;
+    int left;
+    int rc;
+
+    njb = (struct nmgr_jbuf *) jb;
+   
+    left = njb->njb_end - njb->njb_off;
+    read = size > left ? left : size;
+
+    rc = os_mbuf_copydata(njb->njb_m, njb->njb_off, read, buf);
+    if (rc != 0) {
+        goto err;
+    }
+
+    return (read);
+err:
+    return (rc);
+}
+
+int 
+nmgr_jbuf_write(void *arg, char *data, int len)
+{
+    struct nmgr_jbuf *njb;
+    int rc;
+
+    njb = (struct nmgr_jbuf *) arg;
+
+    rc = nmgr_rsp_extend(njb->njb_hdr, njb->njb_m, data, len);
+    if (rc != 0) {
+        goto err;
+    }
+
+    return (0);
+err:
+    return (rc);
+}
+
+int 
+nmgr_jbuf_init(struct nmgr_jbuf *njb)
+{
+    memset(njb, 0, sizeof(*njb));
+
+    njb->njb_buf.jb_read_next = nmgr_jbuf_read_next;
+    njb->njb_buf.jb_read_prev = nmgr_jbuf_read_prev;
+    njb->njb_buf.jb_readn = nmgr_jbuf_readn;
+    njb->njb_enc.je_write = nmgr_jbuf_write;
+    njb->njb_enc.je_arg = njb; 
+
+    return (0);
+}
+
+int 
+nmgr_jbuf_setibuf(struct nmgr_jbuf *njb, struct os_mbuf *m, 
+        uint16_t off, uint16_t len)
+{
+    njb->njb_off = off;
+    njb->njb_end = off + len;
+    njb->njb_m = m;
+
+    return (0);
+}
+
+int 
+nmgr_jbuf_setobuf(struct nmgr_jbuf *njb, struct nmgr_hdr *hdr,
+        struct os_mbuf *m)
+{
+    njb->njb_m = m;
+    njb->njb_hdr = hdr;
+
+    return (0);
+}
+
 static int 
 nmgr_handle_req(struct nmgr_transport *nt, struct os_mbuf *req)
 {
@@ -326,6 +466,8 @@ nmgr_task(void *arg)
     struct nmgr_transport *nt;
     struct os_event *ev;
 
+    nmgr_jbuf_init(&nmgr_task_jbuf);
+
     while (1) {
         ev = os_eventq_get(&g_nmgr_evq);
         switch (ev->ev_type) {


[2/5] incubator-mynewt-larva git commit: fix json encoding. add test code to slinky, prior to rebase.

Posted by st...@apache.org.
fix json encoding.  add test code to slinky, prior to rebase.


Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/commit/8f7f01ad
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/tree/8f7f01ad
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/diff/8f7f01ad

Branch: refs/heads/master
Commit: 8f7f01ad8d5fb5dbdce5736213980be0c51a7d35
Parents: 4fb9ec5
Author: Sterling Hughes <st...@apache.org>
Authored: Fri Jan 15 13:21:37 2016 -0800
Committer: Sterling Hughes <st...@apache.org>
Committed: Tue Jan 19 10:01:51 2016 -0800

----------------------------------------------------------------------
 libs/json/include/json/json.h |  6 +++---
 libs/json/src/json_encode.c   | 28 +++++++++++++++++++++----
 project/slinky/src/main.c     | 43 ++++++++++++++++++++++++++++++++++----
 3 files changed, 66 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/8f7f01ad/libs/json/include/json/json.h
----------------------------------------------------------------------
diff --git a/libs/json/include/json/json.h b/libs/json/include/json/json.h
index 346fc59..d220cc7 100644
--- a/libs/json/include/json/json.h
+++ b/libs/json/include/json/json.h
@@ -65,16 +65,16 @@ struct json_value {
 #define JSON_VALUE_STRING(__jv, __str)        \
     (__jv)->jv_type = JSON_VALUE_TYPE_STRING; \
     (__jv)->jv_len = strlen(__str);           \
-    (__jv)->jv_val.str = str;
+    (__jv)->jv_val.str = (__str);
 
 #define JSON_VALUE_STRINGN(__jv, __str, __len) \
     (__jv)->jv_type = JSON_VALUE_TYPE_STRING;  \
     (__jv)->jv_len = __len;                    \
-    (__jv)->jv_val.str = str;
+    (__jv)->jv_val.str = (__str);
 
 #define JSON_VALUE_BOOL(__jv, __v)            \
     (__jv)->jv_type = JSON_VALUE_TYPE_BOOL;   \
-    (__jv)->jv_val.u = __v;
+    (__jv)->jv_val.u = (__v);
 
 #define JSON_VALUE_INT(__jv, __v)             \
     (__jv)->jv_type = JSON_VALUE_TYPE_INT64;  \

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/8f7f01ad/libs/json/src/json_encode.c
----------------------------------------------------------------------
diff --git a/libs/json/src/json_encode.c b/libs/json/src/json_encode.c
index 94a877f..a5f6018 100644
--- a/libs/json/src/json_encode.c
+++ b/libs/json/src/json_encode.c
@@ -73,18 +73,38 @@ json_encode_value(struct json_encoder *encoder, struct json_value *jv)
                     case '"':
                     case '/':
                     case '\\':
+                        encoder->je_write(encoder->je_arg, "\\", 
+                                sizeof("\\")-1);
+                        encoder->je_write(encoder->je_arg, 
+                                (char *) &jv->jv_val.str[i], 1);
+ 
+                        break;
                     case '\t':
+                        encoder->je_write(encoder->je_arg, "\\t", 
+                                sizeof("\\t")-1);
+                        break;
                     case '\r':
+                        encoder->je_write(encoder->je_arg, "\\r", 
+                                sizeof("\\r")-1);
+                        break;
                     case '\n':
+                        encoder->je_write(encoder->je_arg, "\\n", 
+                                sizeof("\\n")-1);
+                        break;
                     case '\f':
+                        encoder->je_write(encoder->je_arg, "\\f", 
+                                sizeof("\\f")-1);
+                        break;
                     case '\b':
-                        encoder->je_write(encoder->je_arg, "\\", 
-                                sizeof("\\")-1);
+                        encoder->je_write(encoder->je_arg, "\\b", 
+                                sizeof("\\b")-1);
+                        break;
+                   default:
+                        encoder->je_write(encoder->je_arg, 
+                                (char *) &jv->jv_val.str[i], 1);
                         break;
                 }
 
-                encoder->je_write(encoder->je_arg, (char *) &jv->jv_val.str[i], 
-                        1);
             }
             break;
         case JSON_VALUE_TYPE_ARRAY:

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/8f7f01ad/project/slinky/src/main.c
----------------------------------------------------------------------
diff --git a/project/slinky/src/main.c b/project/slinky/src/main.c
index bad9dda..42991ad 100755
--- a/project/slinky/src/main.c
+++ b/project/slinky/src/main.c
@@ -19,16 +19,18 @@
 #include <hal/hal_flash.h>
 #include <console/console.h>
 #include <shell/shell.h>
-#include <log/log.h>
-#include <stats/stats.h>
-#include <config/config.h>
-#include <hal/flash_map.h>
+#include <util/log.h>
+#include <util/stats.h>
+#include <util/config.h>
+#include <util/flash_map.h>
 #include <fs/fs.h>
 #include <nffs/nffs.h>
 #include <newtmgr/newtmgr.h>
 #include <imgmgr/imgmgr.h>
 #include <assert.h>
 #include <string.h>
+#include <json/json.h>
+
 #ifdef ARCH_sim
 #include <mcu/mcu_sim.h>
 #endif
@@ -153,6 +155,37 @@ init_tasks(void)
     return 0;
 }
 
+static void 
+json_test(void)
+{
+    char req[128];
+    char req1[128];
+    char req2[128];
+    int rc;
+
+    struct json_attr_t attrs[] = {
+        {"cmd", t_string, .addr.string = req, .len = sizeof(req)},
+        {"group", t_string, .addr.string = req1, .len = sizeof(req1)},
+        {"req", t_string, .addr.string = req2, .len = sizeof(req2)},
+        {NULL},
+    };
+
+    char *json_data = "{\n" 
+        "  \"group\": \"sterly\",\n"
+        "  \"cmd\": \"read\",\n"
+        "  \"req\": \"{ \\\"name\\\": \\\"blablabalblala\\\" }\", \n"
+        "}\n";
+
+    rc = json_read_object(json_data, attrs, NULL);
+    req[127] = 0;
+
+    puts(json_data);
+    printf("%d req = %s, req1 = %s, req2 = %s\n", rc, req, req1, req2);
+}
+
+
+
+
 /**
  * main
  *
@@ -224,6 +257,8 @@ main(int argc, char **argv)
 
     stats_module_init();
 
+    json_test();
+
     rc = init_tasks();
     os_start();
 


[4/5] incubator-mynewt-larva git commit: remove json test code

Posted by st...@apache.org.
remove json test code


Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/commit/dad64f08
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/tree/dad64f08
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/diff/dad64f08

Branch: refs/heads/master
Commit: dad64f08c1ea05ca5e6edde5992be075e9fc0f40
Parents: 8f7f01a
Author: Sterling Hughes <st...@apache.org>
Authored: Sun Jan 17 18:17:18 2016 -0800
Committer: Sterling Hughes <st...@apache.org>
Committed: Tue Jan 19 10:01:51 2016 -0800

----------------------------------------------------------------------
 project/slinky/src/main.c | 40 ++++------------------------------------
 1 file changed, 4 insertions(+), 36 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/dad64f08/project/slinky/src/main.c
----------------------------------------------------------------------
diff --git a/project/slinky/src/main.c b/project/slinky/src/main.c
index 42991ad..d02f8f4 100755
--- a/project/slinky/src/main.c
+++ b/project/slinky/src/main.c
@@ -19,10 +19,10 @@
 #include <hal/hal_flash.h>
 #include <console/console.h>
 #include <shell/shell.h>
-#include <util/log.h>
-#include <util/stats.h>
-#include <util/config.h>
-#include <util/flash_map.h>
+#include <log/log.h>
+#include <stats/stats.h>
+#include <config/config.h>
+#include <hal/flash_map.h>
 #include <fs/fs.h>
 #include <nffs/nffs.h>
 #include <newtmgr/newtmgr.h>
@@ -155,36 +155,6 @@ init_tasks(void)
     return 0;
 }
 
-static void 
-json_test(void)
-{
-    char req[128];
-    char req1[128];
-    char req2[128];
-    int rc;
-
-    struct json_attr_t attrs[] = {
-        {"cmd", t_string, .addr.string = req, .len = sizeof(req)},
-        {"group", t_string, .addr.string = req1, .len = sizeof(req1)},
-        {"req", t_string, .addr.string = req2, .len = sizeof(req2)},
-        {NULL},
-    };
-
-    char *json_data = "{\n" 
-        "  \"group\": \"sterly\",\n"
-        "  \"cmd\": \"read\",\n"
-        "  \"req\": \"{ \\\"name\\\": \\\"blablabalblala\\\" }\", \n"
-        "}\n";
-
-    rc = json_read_object(json_data, attrs, NULL);
-    req[127] = 0;
-
-    puts(json_data);
-    printf("%d req = %s, req1 = %s, req2 = %s\n", rc, req, req1, req2);
-}
-
-
-
 
 /**
  * main
@@ -257,8 +227,6 @@ main(int argc, char **argv)
 
     stats_module_init();
 
-    json_test();
-
     rc = init_tasks();
     os_start();
 


[3/5] incubator-mynewt-larva git commit: add brackets around if() in decode.

Posted by st...@apache.org.
add brackets around if() in decode.


Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/commit/7dd823f2
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/tree/7dd823f2
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/diff/7dd823f2

Branch: refs/heads/master
Commit: 7dd823f22d279d0ae3894a8584443ffaf8cbbc83
Parents: bf84ccc
Author: Sterling Hughes <st...@apache.org>
Authored: Fri Jan 15 10:12:07 2016 -0800
Committer: Sterling Hughes <st...@apache.org>
Committed: Tue Jan 19 10:01:51 2016 -0800

----------------------------------------------------------------------
 libs/json/src/json_decode.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/7dd823f2/libs/json/src/json_decode.c
----------------------------------------------------------------------
diff --git a/libs/json/src/json_decode.c b/libs/json/src/json_decode.c
index bd2d0f5..5c058a6 100644
--- a/libs/json/src/json_decode.c
+++ b/libs/json/src/json_decode.c
@@ -170,7 +170,7 @@ json_internal_read_object(const char *cp, const struct json_attr_t *attrs,
     for (cursor = attrs; cursor->attribute != NULL; cursor++) {
         if (!cursor->nodefault) {
             lptr = json_target_address(cursor, parent, offset);
-            if (lptr != NULL)
+            if (lptr != NULL) {
                 switch (cursor->type) {
                 case t_integer:
                     memcpy(lptr, &cursor->dflt.integer, sizeof(int));
@@ -202,6 +202,7 @@ json_internal_read_object(const char *cp, const struct json_attr_t *attrs,
                 case t_ignore:
                     break;
                 }
+            }
         }
     }
 


[5/5] incubator-mynewt-larva git commit: escape string characters when encoding...

Posted by st...@apache.org.
escape string characters when encoding...


Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/commit/4fb9ec50
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/tree/4fb9ec50
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/diff/4fb9ec50

Branch: refs/heads/master
Commit: 4fb9ec506fd010a1dd4b85b7a1abeb56ab990f08
Parents: 7dd823f
Author: Sterling Hughes <st...@apache.org>
Authored: Fri Jan 15 10:12:47 2016 -0800
Committer: Sterling Hughes <st...@apache.org>
Committed: Tue Jan 19 10:01:51 2016 -0800

----------------------------------------------------------------------
 libs/json/src/json_encode.c | 19 ++++++++++++++++++-
 1 file changed, 18 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/4fb9ec50/libs/json/src/json_encode.c
----------------------------------------------------------------------
diff --git a/libs/json/src/json_encode.c b/libs/json/src/json_encode.c
index ccaf615..94a877f 100644
--- a/libs/json/src/json_encode.c
+++ b/libs/json/src/json_encode.c
@@ -68,7 +68,24 @@ json_encode_value(struct json_encoder *encoder, struct json_value *jv)
             encoder->je_write(encoder->je_arg, encoder->je_encode_buf, len);
             break;
         case JSON_VALUE_TYPE_STRING:
-            encoder->je_write(encoder->je_arg, jv->jv_val.str, jv->jv_len);
+            for (i = 0; i < jv->jv_len; i++) {
+                switch (jv->jv_val.str[i]) {
+                    case '"':
+                    case '/':
+                    case '\\':
+                    case '\t':
+                    case '\r':
+                    case '\n':
+                    case '\f':
+                    case '\b':
+                        encoder->je_write(encoder->je_arg, "\\", 
+                                sizeof("\\")-1);
+                        break;
+                }
+
+                encoder->je_write(encoder->je_arg, (char *) &jv->jv_val.str[i], 
+                        1);
+            }
             break;
         case JSON_VALUE_TYPE_ARRAY:
             JSON_ENCODE_ARRAY_START(encoder);