Skip to content

Commit

Permalink
Update JSON parser
Browse files Browse the repository at this point in the history
  • Loading branch information
Barenboim committed Jan 16, 2024
1 parent fefd0f5 commit b71d37c
Show file tree
Hide file tree
Showing 2 changed files with 90 additions and 88 deletions.
176 changes: 89 additions & 87 deletions src/util/json_parser.c
Original file line number Diff line number Diff line change
Expand Up @@ -74,18 +74,15 @@ static int __json_string_length(const char *cursor)
{
int len = 0;

while (1)
while (*cursor != '\"')
{
if (*cursor == '\"')
break;

if (*(const unsigned char *)cursor < ' ')
if ((unsigned char)*cursor < ' ')
return -2;

cursor++;
if (cursor[-1] == '\\')
{
if (!*cursor)
if (*cursor == '\0')
return -2;

cursor++;
Expand Down Expand Up @@ -249,68 +246,68 @@ static int __parse_json_string(const char *cursor, const char **end,
}

static const double __power_of_10[309] = {
1.0e0, 1.0e1, 1.0e2, 1.0e3, 1.0e4,
1.0e5, 1.0e6, 1.0e7, 1.0e8, 1.0e9,
1.0e10, 1.0e11, 1.0e12, 1.0e13, 1.0e14,
1.0e15, 1.0e16, 1.0e17, 1.0e18, 1.0e19,
1.0e20, 1.0e21, 1.0e22, 1.0e23, 1.0e24,
1.0e25, 1.0e26, 1.0e27, 1.0e28, 1.0e29,
1.0e30, 1.0e31, 1.0e32, 1.0e33, 1.0e34,
1.0e35, 1.0e36, 1.0e37, 1.0e38, 1.0e39,
1.0e40, 1.0e41, 1.0e42, 1.0e43, 1.0e44,
1.0e45, 1.0e46, 1.0e47, 1.0e48, 1.0e49,
1.0e50, 1.0e51, 1.0e52, 1.0e53, 1.0e54,
1.0e55, 1.0e56, 1.0e57, 1.0e58, 1.0e59,
1.0e60, 1.0e61, 1.0e62, 1.0e63, 1.0e64,
1.0e65, 1.0e66, 1.0e67, 1.0e68, 1.0e69,
1.0e70, 1.0e71, 1.0e72, 1.0e73, 1.0e74,
1.0e75, 1.0e76, 1.0e77, 1.0e78, 1.0e79,
1.0e80, 1.0e81, 1.0e82, 1.0e83, 1.0e84,
1.0e85, 1.0e86, 1.0e87, 1.0e88, 1.0e89,
1.0e90, 1.0e91, 1.0e92, 1.0e93, 1.0e94,
1.0e95, 1.0e96, 1.0e97, 1.0e98, 1.0e99,
1.0e100, 1.0e101, 1.0e102, 1.0e103, 1.0e104,
1.0e105, 1.0e106, 1.0e107, 1.0e108, 1.0e109,
1.0e110, 1.0e111, 1.0e112, 1.0e113, 1.0e114,
1.0e115, 1.0e116, 1.0e117, 1.0e118, 1.0e119,
1.0e120, 1.0e121, 1.0e122, 1.0e123, 1.0e124,
1.0e125, 1.0e126, 1.0e127, 1.0e128, 1.0e129,
1.0e130, 1.0e131, 1.0e132, 1.0e133, 1.0e134,
1.0e135, 1.0e136, 1.0e137, 1.0e138, 1.0e139,
1.0e140, 1.0e141, 1.0e142, 1.0e143, 1.0e144,
1.0e145, 1.0e146, 1.0e147, 1.0e148, 1.0e149,
1.0e150, 1.0e151, 1.0e152, 1.0e153, 1.0e154,
1.0e155, 1.0e156, 1.0e157, 1.0e158, 1.0e159,
1.0e160, 1.0e161, 1.0e162, 1.0e163, 1.0e164,
1.0e165, 1.0e166, 1.0e167, 1.0e168, 1.0e169,
1.0e170, 1.0e171, 1.0e172, 1.0e173, 1.0e174,
1.0e175, 1.0e176, 1.0e177, 1.0e178, 1.0e179,
1.0e180, 1.0e181, 1.0e182, 1.0e183, 1.0e184,
1.0e185, 1.0e186, 1.0e187, 1.0e188, 1.0e189,
1.0e190, 1.0e191, 1.0e192, 1.0e193, 1.0e194,
1.0e195, 1.0e196, 1.0e197, 1.0e198, 1.0e199,
1.0e200, 1.0e201, 1.0e202, 1.0e203, 1.0e204,
1.0e205, 1.0e206, 1.0e207, 1.0e208, 1.0e209,
1.0e210, 1.0e211, 1.0e212, 1.0e213, 1.0e214,
1.0e215, 1.0e216, 1.0e217, 1.0e218, 1.0e219,
1.0e220, 1.0e221, 1.0e222, 1.0e223, 1.0e224,
1.0e225, 1.0e226, 1.0e227, 1.0e228, 1.0e229,
1.0e230, 1.0e231, 1.0e232, 1.0e233, 1.0e234,
1.0e235, 1.0e236, 1.0e237, 1.0e238, 1.0e239,
1.0e240, 1.0e241, 1.0e242, 1.0e243, 1.0e244,
1.0e245, 1.0e246, 1.0e247, 1.0e248, 1.0e249,
1.0e250, 1.0e251, 1.0e252, 1.0e253, 1.0e254,
1.0e255, 1.0e256, 1.0e257, 1.0e258, 1.0e259,
1.0e260, 1.0e261, 1.0e262, 1.0e263, 1.0e264,
1.0e265, 1.0e266, 1.0e267, 1.0e268, 1.0e269,
1.0e270, 1.0e271, 1.0e272, 1.0e273, 1.0e274,
1.0e275, 1.0e276, 1.0e277, 1.0e278, 1.0e279,
1.0e280, 1.0e281, 1.0e282, 1.0e283, 1.0e284,
1.0e285, 1.0e286, 1.0e287, 1.0e288, 1.0e289,
1.0e290, 1.0e291, 1.0e292, 1.0e293, 1.0e294,
1.0e295, 1.0e296, 1.0e297, 1.0e298, 1.0e299,
1.0e300, 1.0e301, 1.0e302, 1.0e303, 1.0e304,
1.0e305, 1.0e306, 1.0e307, 1.0e308
1e0, 1e1, 1e2, 1e3, 1e4,
1e5, 1e6, 1e7, 1e8, 1e9,
1e10, 1e11, 1e12, 1e13, 1e14,
1e15, 1e16, 1e17, 1e18, 1e19,
1e20, 1e21, 1e22, 1e23, 1e24,
1e25, 1e26, 1e27, 1e28, 1e29,
1e30, 1e31, 1e32, 1e33, 1e34,
1e35, 1e36, 1e37, 1e38, 1e39,
1e40, 1e41, 1e42, 1e43, 1e44,
1e45, 1e46, 1e47, 1e48, 1e49,
1e50, 1e51, 1e52, 1e53, 1e54,
1e55, 1e56, 1e57, 1e58, 1e59,
1e60, 1e61, 1e62, 1e63, 1e64,
1e65, 1e66, 1e67, 1e68, 1e69,
1e70, 1e71, 1e72, 1e73, 1e74,
1e75, 1e76, 1e77, 1e78, 1e79,
1e80, 1e81, 1e82, 1e83, 1e84,
1e85, 1e86, 1e87, 1e88, 1e89,
1e90, 1e91, 1e92, 1e93, 1e94,
1e95, 1e96, 1e97, 1e98, 1e99,
1e100, 1e101, 1e102, 1e103, 1e104,
1e105, 1e106, 1e107, 1e108, 1e109,
1e110, 1e111, 1e112, 1e113, 1e114,
1e115, 1e116, 1e117, 1e118, 1e119,
1e120, 1e121, 1e122, 1e123, 1e124,
1e125, 1e126, 1e127, 1e128, 1e129,
1e130, 1e131, 1e132, 1e133, 1e134,
1e135, 1e136, 1e137, 1e138, 1e139,
1e140, 1e141, 1e142, 1e143, 1e144,
1e145, 1e146, 1e147, 1e148, 1e149,
1e150, 1e151, 1e152, 1e153, 1e154,
1e155, 1e156, 1e157, 1e158, 1e159,
1e160, 1e161, 1e162, 1e163, 1e164,
1e165, 1e166, 1e167, 1e168, 1e169,
1e170, 1e171, 1e172, 1e173, 1e174,
1e175, 1e176, 1e177, 1e178, 1e179,
1e180, 1e181, 1e182, 1e183, 1e184,
1e185, 1e186, 1e187, 1e188, 1e189,
1e190, 1e191, 1e192, 1e193, 1e194,
1e195, 1e196, 1e197, 1e198, 1e199,
1e200, 1e201, 1e202, 1e203, 1e204,
1e205, 1e206, 1e207, 1e208, 1e209,
1e210, 1e211, 1e212, 1e213, 1e214,
1e215, 1e216, 1e217, 1e218, 1e219,
1e220, 1e221, 1e222, 1e223, 1e224,
1e225, 1e226, 1e227, 1e228, 1e229,
1e230, 1e231, 1e232, 1e233, 1e234,
1e235, 1e236, 1e237, 1e238, 1e239,
1e240, 1e241, 1e242, 1e243, 1e244,
1e245, 1e246, 1e247, 1e248, 1e249,
1e250, 1e251, 1e252, 1e253, 1e254,
1e255, 1e256, 1e257, 1e258, 1e259,
1e260, 1e261, 1e262, 1e263, 1e264,
1e265, 1e266, 1e267, 1e268, 1e269,
1e270, 1e271, 1e272, 1e273, 1e274,
1e275, 1e276, 1e277, 1e278, 1e279,
1e280, 1e281, 1e282, 1e283, 1e284,
1e285, 1e286, 1e287, 1e288, 1e289,
1e290, 1e291, 1e292, 1e293, 1e294,
1e295, 1e296, 1e297, 1e298, 1e299,
1e300, 1e301, 1e302, 1e303, 1e304,
1e305, 1e306, 1e307, 1e308
};

static double __evaluate_json_number(const char *integer,
Expand Down Expand Up @@ -380,18 +377,23 @@ static double __evaluate_json_number(const char *integer,
}
}

if (exp == 0 || figures == 0)
num = mant;
else if (exp > 291)
num = INFINITY;
else if (exp > 0)
num = mant * __power_of_10[exp];
else if (exp > -309)
num = mant / __power_of_10[-exp];
else if (exp > -324 - figures)
num = mant / __power_of_10[-exp - 308] / __power_of_10[308];
else
num = 0.0;
num = mant;
if (exp != 0 && figures != 0)
{
if (exp > 291)
num = INFINITY;
else if (exp > 0)
num *= __power_of_10[exp];
else if (exp > -309)
num /= __power_of_10[-exp];
else if (exp > -324 - figures)
{
num /= __power_of_10[-exp - 308];
num /= __power_of_10[308];
}
else
num = 0.0;
}

return sign ? -num : num;
}
Expand Down Expand Up @@ -879,23 +881,23 @@ static int __set_json_value(int type, va_list ap, json_value_t *val)
return 0;
}

json_value_t *json_value_parse(const char *doc)
json_value_t *json_value_parse(const char *cursor)
{
json_value_t *val;

val = (json_value_t *)malloc(sizeof (json_value_t));
if (!val)
return NULL;

while (isspace(*doc))
doc++;
while (isspace(*cursor))
cursor++;

if (__parse_json_value(doc, &doc, 0, val) >= 0)
if (__parse_json_value(cursor, &cursor, 0, val) >= 0)
{
while (isspace(*doc))
doc++;
while (isspace(*cursor))
cursor++;

if (*doc == '\0')
if (*cursor == '\0')
return val;

__destroy_json_value(val);
Expand Down
2 changes: 1 addition & 1 deletion src/util/json_parser.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ extern "C"
{
#endif

json_value_t *json_value_parse(const char *doc);
json_value_t *json_value_parse(const char *text);
json_value_t *json_value_create(int type, ...);
void json_value_destroy(json_value_t *val);

Expand Down

0 comments on commit b71d37c

Please sign in to comment.