Merge pull request #185 from TeBoring/int64-json-fix

Change int64 json encoding to be string
pull/13171/head
Joshua Haberman 5 years ago committed by GitHub
commit a73ae43786
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 41
      upb/json/printer.c

@ -208,18 +208,32 @@ static size_t fmt_bool(bool val, char* buf, size_t length) {
return n; return n;
} }
static size_t fmt_int64(long val, char* buf, size_t length) { static size_t fmt_int64_as_number(long long val, char* buf, size_t length) {
size_t n = _upb_snprintf(buf, length, "%ld", val); size_t n = _upb_snprintf(buf, length, "%lld", val);
CHKLENGTH(n > 0 && n < length); CHKLENGTH(n > 0 && n < length);
return n; return n;
} }
static size_t fmt_uint64(unsigned long long val, char* buf, size_t length) { static size_t fmt_uint64_as_number(
unsigned long long val, char* buf, size_t length) {
size_t n = _upb_snprintf(buf, length, "%llu", val); size_t n = _upb_snprintf(buf, length, "%llu", val);
CHKLENGTH(n > 0 && n < length); CHKLENGTH(n > 0 && n < length);
return n; return n;
} }
static size_t fmt_int64_as_string(long long val, char* buf, size_t length) {
size_t n = _upb_snprintf(buf, length, "\"%lld\"", val);
CHKLENGTH(n > 0 && n < length);
return n;
}
static size_t fmt_uint64_as_string(
unsigned long long val, char* buf, size_t length) {
size_t n = _upb_snprintf(buf, length, "\"%llu\"", val);
CHKLENGTH(n > 0 && n < length);
return n;
}
/* Print a map key given a field name. Called by scalar field handlers and by /* Print a map key given a field name. Called by scalar field handlers and by
* startseq for repeated fields. */ * startseq for repeated fields. */
static bool putkey(void *closure, const void *handler_data) { static bool putkey(void *closure, const void *handler_data) {
@ -263,8 +277,11 @@ static bool putkey(void *closure, const void *handler_data) {
static bool putmapkey_##type(void *closure, const void *handler_data, \ static bool putmapkey_##type(void *closure, const void *handler_data, \
type val) { \ type val) { \
upb_json_printer *p = closure; \ upb_json_printer *p = closure; \
char data[64]; \
size_t length = fmt_func(val, data, sizeof(data)); \
UPB_UNUSED(handler_data); \
print_data(p, "\"", 1); \ print_data(p, "\"", 1); \
CHK(put##type(closure, handler_data, val)); \ print_data(p, data, length); \
print_data(p, "\":", 2); \ print_data(p, "\":", 2); \
return true; \ return true; \
} }
@ -272,17 +289,17 @@ static bool putkey(void *closure, const void *handler_data) {
TYPE_HANDLERS(double, fmt_double) TYPE_HANDLERS(double, fmt_double)
TYPE_HANDLERS(float, fmt_float) TYPE_HANDLERS(float, fmt_float)
TYPE_HANDLERS(bool, fmt_bool) TYPE_HANDLERS(bool, fmt_bool)
TYPE_HANDLERS(int32_t, fmt_int64) TYPE_HANDLERS(int32_t, fmt_int64_as_number)
TYPE_HANDLERS(uint32_t, fmt_int64) TYPE_HANDLERS(uint32_t, fmt_int64_as_number)
TYPE_HANDLERS(int64_t, fmt_int64) TYPE_HANDLERS(int64_t, fmt_int64_as_string)
TYPE_HANDLERS(uint64_t, fmt_uint64) TYPE_HANDLERS(uint64_t, fmt_uint64_as_string)
/* double and float are not allowed to be map keys. */ /* double and float are not allowed to be map keys. */
TYPE_HANDLERS_MAPKEY(bool, fmt_bool) TYPE_HANDLERS_MAPKEY(bool, fmt_bool)
TYPE_HANDLERS_MAPKEY(int32_t, fmt_int64) TYPE_HANDLERS_MAPKEY(int32_t, fmt_int64_as_number)
TYPE_HANDLERS_MAPKEY(uint32_t, fmt_int64) TYPE_HANDLERS_MAPKEY(uint32_t, fmt_int64_as_number)
TYPE_HANDLERS_MAPKEY(int64_t, fmt_int64) TYPE_HANDLERS_MAPKEY(int64_t, fmt_int64_as_number)
TYPE_HANDLERS_MAPKEY(uint64_t, fmt_uint64) TYPE_HANDLERS_MAPKEY(uint64_t, fmt_uint64_as_number)
#undef TYPE_HANDLERS #undef TYPE_HANDLERS
#undef TYPE_HANDLERS_MAPKEY #undef TYPE_HANDLERS_MAPKEY

Loading…
Cancel
Save