diff options
Diffstat (limited to 'upb/json/printer.c')
-rw-r--r-- | upb/json/printer.c | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/upb/json/printer.c b/upb/json/printer.c index 4a6f1ad..0db7b80 100644 --- a/upb/json/printer.c +++ b/upb/json/printer.c @@ -33,15 +33,28 @@ struct upb_json_printer { /* StringPiece; a pointer plus a length. */ typedef struct { - const char *ptr; + char *ptr; size_t len; } strpc; +void freestrpc(void *ptr) { + strpc *pc = ptr; + free(pc->ptr); + free(pc); +} + +/* Convert fielddef name to JSON name and return as a string piece. */ strpc *newstrpc(upb_handlers *h, const upb_fielddef *f) { + /* TODO(haberman): handle malloc failure. */ strpc *ret = malloc(sizeof(*ret)); - ret->ptr = upb_fielddef_name(f); - ret->len = strlen(ret->ptr); - upb_handlers_addcleanup(h, ret, free); + size_t len; + ret->len = upb_fielddef_getjsonname(f, NULL, 0); + ret->ptr = malloc(ret->len); + len = upb_fielddef_getjsonname(f, ret->ptr, ret->len); + UPB_ASSERT_VAR(len, len == ret->len); + ret->len--; /* NULL */ + + upb_handlers_addcleanup(h, ret, freestrpc); return ret; } |