Changeset 8563fe7


Ignore:
Timestamp:
2015-05-05T22:39:39Z (10 years ago)
Author:
Wilmer van der Gaast <wilmer@…>
Children:
f81d8b8
Parents:
5726a0d
Message:

Make my fork of parson non-JSON-compliant. I don't care that JavaScript's
tiny little brain doesn't comprehend integers and wants everything to be a
float, the adults need integers now. Big integers. So add them, just like
the old js lib did. This also lets me clean up some horrible things in the
RPC module.

Try to have behaviour similar to the old lib: Throw as much as possible into
an integer, only switch to double when there's a non-int or a number larger
than what fits a "signed long long".

Yes this is horrible, and no I don't think the parson upstreams will accept
this. But the alternative is to stay compliant to an accidentally popular
data interchange format based on accidentally popular joke language and do
a lot of manual string-to-int64 parsing in the Twitter codebase. How about
NOPE.

Location:
lib
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • lib/parson.c

    r5726a0d r8563fe7  
    2727#include "parson.h"
    2828
     29#include <errno.h>
    2930#include <stdio.h>
    3031#include <stdlib.h>
     
    3839#define MAX_NESTING               19
    3940#define DOUBLE_SERIALIZATION_FORMAT "%f"
     41#define JINT_SERIALIZATION_FORMAT "%lld"
    4042
    4143#define SIZEOF_TOKEN(a)       (sizeof(a) - 1)
     
    5355#define IS_CONT(b) (((unsigned char)(b) & 0xC0) == 0x80) /* is utf-8 continuation byte */
    5456
     57typedef long long jint;
     58
    5559/* Type definitions */
    5660typedef union json_value_value {
    5761    const char  *string;
    5862    double       number;
     63    jint         integer;
    5964    JSON_Object *object;
    6065    JSON_Array  *array;
     
    670675
    671676static JSON_Value * parse_number_value(const char **string) {
    672     char *end;
    673     double number = strtod(*string, &end);
     677    char *jint_end, *double_end;
     678    double number = strtod(*string, &double_end);
     679    jint integer = strtoll(*string, &jint_end, 10);
    674680    JSON_Value *output_value;
    675     if (is_decimal(*string, end - *string)) {
    676         *string = end;
    677         output_value = json_value_init_number(number);
     681    if (double_end > jint_end || errno == ERANGE) {
     682        if (is_decimal(*string, double_end - *string)) {
     683            *string = double_end;
     684            output_value = json_value_init_number(number);
     685        } else {
     686            output_value = NULL;
     687        }
    678688    } else {
    679         output_value = NULL;
     689        *string = jint_end;
     690        output_value = json_value_init_integer(integer);
    680691    }
    681692    return output_value;
     
    700711    size_t i = 0, count = 0;
    701712    double num = 0.0;
     713    jint intnum = 0;
    702714    switch (json_value_get_type(value)) {
    703715        case JSONArray:
     
    731743            else
    732744                return 5; /* strlen("false"); */
     745        case JSONInteger:
     746            intnum = json_value_get_integer(value);
     747            return (size_t)sprintf(buf, JINT_SERIALIZATION_FORMAT, intnum);
    733748        case JSONNumber:
    734749            num = json_value_get_number(value);
    735             if (num == ((double)(int)num) ) /*  check if num is integer */
    736                 return (size_t)sprintf(buf, "%d", (int)num);
     750            if (num == ((double)(jint)num) ) /*  check if num is integer */
     751                return (size_t)sprintf(buf, JINT_SERIALIZATION_FORMAT, (jint)num);
    737752            return (size_t)sprintf(buf, DOUBLE_SERIALIZATION_FORMAT, num);
    738753        case JSONNull:
     
    753768    size_t i = 0, count = 0;
    754769    double num = 0.0;
     770    jint intnum = 0;
    755771    switch (json_value_get_type(value)) {
    756772        case JSONArray:
     
    798814            }
    799815            return buf;
     816        case JSONInteger:
     817            intnum = json_value_get_integer(value);
     818            PRINTF_AND_SKIP(buf, JINT_SERIALIZATION_FORMAT, intnum);
     819            return buf;
    800820        case JSONNumber:
    801821            num = json_value_get_number(value);
     
    912932}
    913933
     934jint json_object_get_integer(const JSON_Object *object, const char *name) {
     935    return json_value_get_integer(json_object_get_value(object, name));
     936}
     937
    914938double json_object_get_number(const JSON_Object *object, const char *name) {
    915939    return json_value_get_number(json_object_get_value(object, name));
     
    938962const char * json_object_dotget_string(const JSON_Object *object, const char *name) {
    939963    return json_value_get_string(json_object_dotget_value(object, name));
     964}
     965
     966jint json_object_dotget_integer(const JSON_Object *object, const char *name) {
     967    return json_value_get_integer(json_object_dotget_value(object, name));
    940968}
    941969
     
    9861014}
    9871015
     1016jint json_array_get_integer(const JSON_Array *array, size_t index) {
     1017    return json_value_get_integer(json_array_get_value(array, index));
     1018}
     1019
    9881020double json_array_get_number(const JSON_Array *array, size_t index) {
    9891021    return json_value_get_number(json_array_get_value(array, index));
     
    10231055}
    10241056
     1057jint json_value_get_integer(const JSON_Value *value) {
     1058    if (json_value_get_type(value) == JSONNumber) {
     1059        return value->value.number;
     1060    } else if (json_value_get_type(value) == JSONInteger) {
     1061        return value->value.integer;
     1062    } else {
     1063        return 0;
     1064    }
     1065}
     1066
    10251067double json_value_get_number(const JSON_Value *value) {
    1026     return json_value_get_type(value) == JSONNumber ? value->value.number : 0;
     1068    if (json_value_get_type(value) == JSONNumber) {
     1069        return value->value.number;
     1070    } else if (json_value_get_type(value) == JSONInteger) {
     1071        return value->value.integer;
     1072    } else {
     1073        return 0;
     1074    }
    10271075}
    10281076
     
    10901138        PARSON_FREE(copy);
    10911139    return value;
     1140}
     1141
     1142JSON_Value * json_value_init_integer(jint number) {
     1143    JSON_Value *new_value = (JSON_Value*)PARSON_MALLOC(sizeof(JSON_Value));
     1144    if (!new_value)
     1145        return NULL;
     1146    new_value->type = JSONInteger;
     1147    new_value->value.integer = number;
     1148    return new_value;
    10921149}
    10931150
     
    12771334}
    12781335
     1336JSON_Status json_array_replace_integer(JSON_Array *array, size_t i, jint integer) {
     1337    JSON_Value *value = json_value_init_integer(integer);
     1338    if (value == NULL)
     1339        return JSONFailure;
     1340    if (json_array_replace_value(array, i, value) == JSONFailure) {
     1341        json_value_free(value);
     1342        return JSONFailure;
     1343    }
     1344    return JSONSuccess;
     1345}
     1346
    12791347JSON_Status json_array_replace_number(JSON_Array *array, size_t i, double number) {
    12801348    JSON_Value *value = json_value_init_number(number);
     
    13291397JSON_Status json_array_append_string(JSON_Array *array, const char *string) {
    13301398    JSON_Value *value = json_value_init_string(string);
     1399    if (value == NULL)
     1400        return JSONFailure;
     1401    if (json_array_append_value(array, value) == JSONFailure) {
     1402        json_value_free(value);
     1403        return JSONFailure;
     1404    }
     1405    return JSONSuccess;
     1406}
     1407
     1408JSON_Status json_array_append_integer(JSON_Array *array, jint integer) {
     1409    JSON_Value *value = json_value_init_integer(integer);
    13311410    if (value == NULL)
    13321411        return JSONFailure;
     
    13921471JSON_Status json_object_set_string(JSON_Object *object, const char *name, const char *string) {
    13931472    return json_object_set_value(object, name, json_value_init_string(string));
     1473}
     1474
     1475JSON_Status json_object_set_integer(JSON_Object *object, const char *name, jint integer) {
     1476    return json_object_set_value(object, name, json_value_init_integer(integer));
    13941477}
    13951478
     
    14391522JSON_Status json_object_dotset_string(JSON_Object *object, const char *name, const char *string) {
    14401523    JSON_Value *value = json_value_init_string(string);
     1524    if (value == NULL)
     1525        return JSONFailure;
     1526    if (json_object_dotset_value(object, name, value) == JSONFailure) {
     1527        json_value_free(value);
     1528        return JSONFailure;
     1529    }
     1530    return JSONSuccess;
     1531}
     1532
     1533JSON_Status json_object_dotset_integer(JSON_Object *object, const char *name, jint integer) {
     1534    JSON_Value *value = json_value_init_integer(integer);
    14411535    if (value == NULL)
    14421536        return JSONFailure;
     
    16631757}
    16641758
     1759jint json_integer (const JSON_Value *value) {
     1760    return json_value_get_integer(value);
     1761}
     1762
    16651763double json_number (const JSON_Value *value) {
    16661764    return json_value_get_number(value);
  • lib/parson.h

    r5726a0d r8563fe7  
    3737typedef struct json_value_t  JSON_Value;
    3838
     39typedef long long jint;
     40
    3941enum json_value_type {
    4042    JSONError   = -1,
    4143    JSONNull    = 1,
    4244    JSONString  = 2,
     45    JSONInteger = 7,
    4346    JSONNumber  = 3,
    4447    JSONObject  = 4,
     
    100103JSON_Object * json_object_get_object (const JSON_Object *object, const char *name);
    101104JSON_Array  * json_object_get_array  (const JSON_Object *object, const char *name);
     105jint          json_object_get_integer(const JSON_Object *object, const char *name); /* returns 0 on fail */
    102106double        json_object_get_number (const JSON_Object *object, const char *name); /* returns 0 on fail */
    103107int           json_object_get_boolean(const JSON_Object *object, const char *name); /* returns -1 on fail */
     
    111115JSON_Object * json_object_dotget_object (const JSON_Object *object, const char *name);
    112116JSON_Array  * json_object_dotget_array  (const JSON_Object *object, const char *name);
     117jint          json_object_dotget_integer(const JSON_Object *object, const char *name); /* returns 0 on fail */
    113118double        json_object_dotget_number (const JSON_Object *object, const char *name); /* returns 0 on fail */
    114119int           json_object_dotget_boolean(const JSON_Object *object, const char *name); /* returns -1 on fail */
     
    123128JSON_Status json_object_set_value(JSON_Object *object, const char *name, JSON_Value *value);
    124129JSON_Status json_object_set_string(JSON_Object *object, const char *name, const char *string);
     130JSON_Status json_object_set_integer(JSON_Object *object, const char *name, jint number);
    125131JSON_Status json_object_set_number(JSON_Object *object, const char *name, double number);
    126132JSON_Status json_object_set_boolean(JSON_Object *object, const char *name, int boolean);
     
    130136JSON_Status json_object_dotset_value(JSON_Object *object, const char *name, JSON_Value *value);
    131137JSON_Status json_object_dotset_string(JSON_Object *object, const char *name, const char *string);
     138JSON_Status json_object_dotset_integer(JSON_Object *object, const char *name, jint number);
    132139JSON_Status json_object_dotset_number(JSON_Object *object, const char *name, double number);
    133140JSON_Status json_object_dotset_boolean(JSON_Object *object, const char *name, int boolean);
     
    150157JSON_Object * json_array_get_object (const JSON_Array *array, size_t index);
    151158JSON_Array  * json_array_get_array  (const JSON_Array *array, size_t index);
     159jint          json_array_get_integer(const JSON_Array *array, size_t index); /* returns 0 on fail */
    152160double        json_array_get_number (const JSON_Array *array, size_t index); /* returns 0 on fail */
    153161int           json_array_get_boolean(const JSON_Array *array, size_t index); /* returns -1 on fail */
     
    162170JSON_Status json_array_replace_value(JSON_Array *array, size_t i, JSON_Value *value);
    163171JSON_Status json_array_replace_string(JSON_Array *array, size_t i, const char* string);
     172JSON_Status json_array_replace_integer(JSON_Array *array, size_t i, jint number);
    164173JSON_Status json_array_replace_number(JSON_Array *array, size_t i, double number);
    165174JSON_Status json_array_replace_boolean(JSON_Array *array, size_t i, int boolean);
     
    172181JSON_Status json_array_append_value(JSON_Array *array, JSON_Value *value);
    173182JSON_Status json_array_append_string(JSON_Array *array, const char *string);
     183JSON_Status json_array_append_integer(JSON_Array *array, jint number);
    174184JSON_Status json_array_append_number(JSON_Array *array, double number);
    175185JSON_Status json_array_append_boolean(JSON_Array *array, int boolean);
     
    182192JSON_Value * json_value_init_array  (void);
    183193JSON_Value * json_value_init_string (const char *string); /* copies passed string */
     194JSON_Value * json_value_init_integer(jint number);
    184195JSON_Value * json_value_init_number (double number);
    185196JSON_Value * json_value_init_boolean(int boolean);
     
    192203JSON_Array  *   json_value_get_array  (const JSON_Value *value);
    193204const char  *   json_value_get_string (const JSON_Value *value);
     205jint            json_value_get_integer(const JSON_Value *value);
    194206double          json_value_get_number (const JSON_Value *value);
    195207int             json_value_get_boolean(const JSON_Value *value);
     
    200212JSON_Array  *   json_array  (const JSON_Value *value);
    201213const char  *   json_string (const JSON_Value *value);
     214jint            json_integer(const JSON_Value *value);
    202215double          json_number (const JSON_Value *value);
    203216int             json_boolean(const JSON_Value *value);
Note: See TracChangeset for help on using the changeset viewer.