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);