mirror of
https://github.com/json-c/json-c.git
synced 2026-04-04 21:09:06 +08:00
Compare commits
10 Commits
json-c-0.1
...
json-c-0.1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f2b7d0b5cb | ||
|
|
74accb17cd | ||
|
|
0e1d83f980 | ||
|
|
2fc68d46ac | ||
|
|
c7e3e0d2de | ||
|
|
83c29cf1f4 | ||
|
|
431bd0c01e | ||
|
|
239c849575 | ||
|
|
ddc97b2950 | ||
|
|
ec8912bb91 |
1
README
1
README
@@ -24,6 +24,7 @@ Github repo for json-c:
|
|||||||
Then
|
Then
|
||||||
|
|
||||||
$ ./configure
|
$ ./configure
|
||||||
|
$ touch aclocal.m4 Makefile.in # hack around automake dependencies
|
||||||
$ make
|
$ make
|
||||||
$ make install
|
$ make install
|
||||||
|
|
||||||
|
|||||||
@@ -552,6 +552,7 @@ int64_t json_object_get_int64(struct json_object *jso)
|
|||||||
return jso->o.c_boolean;
|
return jso->o.c_boolean;
|
||||||
case json_type_string:
|
case json_type_string:
|
||||||
if (json_parse_int64(jso->o.c_string.str, &cint) == 0) return cint;
|
if (json_parse_int64(jso->o.c_string.str, &cint) == 0) return cint;
|
||||||
|
// fallthrough
|
||||||
default:
|
default:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -305,6 +305,7 @@ struct json_object* json_tokener_parse_ex(struct json_tokener *tok,
|
|||||||
tok->err = json_tokener_error_parse_unexpected;
|
tok->err = json_tokener_error_parse_unexpected;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
// fallthrough
|
||||||
case '"':
|
case '"':
|
||||||
state = json_tokener_state_string;
|
state = json_tokener_state_string;
|
||||||
printbuf_reset(tok->pb);
|
printbuf_reset(tok->pb);
|
||||||
@@ -684,6 +685,7 @@ struct json_object* json_tokener_parse_ex(struct json_tokener *tok,
|
|||||||
(c == 'i' || c == 'I'))
|
(c == 'i' || c == 'I'))
|
||||||
{
|
{
|
||||||
state = json_tokener_state_inf;
|
state = json_tokener_state_inf;
|
||||||
|
tok->st_pos = 0;
|
||||||
goto redo_char;
|
goto redo_char;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
34
linkhash.c
34
linkhash.c
@@ -10,6 +10,7 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@@ -376,17 +377,17 @@ static uint32_t hashlittle( const void *key, size_t length, uint32_t initval)
|
|||||||
/*-------------------------------- last block: affect all 32 bits of (c) */
|
/*-------------------------------- last block: affect all 32 bits of (c) */
|
||||||
switch(length) /* all the case statements fall through */
|
switch(length) /* all the case statements fall through */
|
||||||
{
|
{
|
||||||
case 12: c+=((uint32_t)k[11])<<24;
|
case 12: c+=((uint32_t)k[11])<<24; // fallthrough
|
||||||
case 11: c+=((uint32_t)k[10])<<16;
|
case 11: c+=((uint32_t)k[10])<<16; // fallthrough
|
||||||
case 10: c+=((uint32_t)k[9])<<8;
|
case 10: c+=((uint32_t)k[9])<<8; // fallthrough
|
||||||
case 9 : c+=k[8];
|
case 9 : c+=k[8]; // fallthrough
|
||||||
case 8 : b+=((uint32_t)k[7])<<24;
|
case 8 : b+=((uint32_t)k[7])<<24; // fallthrough
|
||||||
case 7 : b+=((uint32_t)k[6])<<16;
|
case 7 : b+=((uint32_t)k[6])<<16; // fallthrough
|
||||||
case 6 : b+=((uint32_t)k[5])<<8;
|
case 6 : b+=((uint32_t)k[5])<<8; // fallthrough
|
||||||
case 5 : b+=k[4];
|
case 5 : b+=k[4]; // fallthrough
|
||||||
case 4 : a+=((uint32_t)k[3])<<24;
|
case 4 : a+=((uint32_t)k[3])<<24; // fallthrough
|
||||||
case 3 : a+=((uint32_t)k[2])<<16;
|
case 3 : a+=((uint32_t)k[2])<<16; // fallthrough
|
||||||
case 2 : a+=((uint32_t)k[1])<<8;
|
case 2 : a+=((uint32_t)k[1])<<8; // fallthrough
|
||||||
case 1 : a+=k[0];
|
case 1 : a+=k[0];
|
||||||
break;
|
break;
|
||||||
case 0 : return c;
|
case 0 : return c;
|
||||||
@@ -431,6 +432,8 @@ struct lh_table* lh_table_new(int size, const char *name,
|
|||||||
int i;
|
int i;
|
||||||
struct lh_table *t;
|
struct lh_table *t;
|
||||||
|
|
||||||
|
/* Allocate space for elements to avoid divisions by zero. */
|
||||||
|
assert(size > 0);
|
||||||
t = (struct lh_table*)calloc(1, sizeof(struct lh_table));
|
t = (struct lh_table*)calloc(1, sizeof(struct lh_table));
|
||||||
if(!t) lh_abort("lh_table_new: calloc failed\n");
|
if(!t) lh_abort("lh_table_new: calloc failed\n");
|
||||||
t->count = 0;
|
t->count = 0;
|
||||||
@@ -495,7 +498,14 @@ int lh_table_insert(struct lh_table *t, void *k, const void *v)
|
|||||||
unsigned long h, n;
|
unsigned long h, n;
|
||||||
|
|
||||||
t->inserts++;
|
t->inserts++;
|
||||||
if(t->count >= t->size * LH_LOAD_FACTOR) lh_table_resize(t, t->size * 2);
|
if (t->count >= t->size * LH_LOAD_FACTOR) {
|
||||||
|
/* Avoid signed integer overflow with large tables. */
|
||||||
|
int new_size = (t->size > INT_MAX / 2) ? INT_MAX : (t->size * 2);
|
||||||
|
if (t->size == INT_MAX)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
lh_table_resize(t, new_size);
|
||||||
|
}
|
||||||
|
|
||||||
h = t->hash_fn(k);
|
h = t->hash_fn(k);
|
||||||
n = h % t->size;
|
n = h % t->size;
|
||||||
|
|||||||
18
printbuf.c
18
printbuf.c
@@ -15,6 +15,7 @@
|
|||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
|
#include <limits.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@@ -63,7 +64,16 @@ static int printbuf_extend(struct printbuf *p, int min_size)
|
|||||||
if (p->size >= min_size)
|
if (p->size >= min_size)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
new_size = json_max(p->size * 2, min_size + 8);
|
/* Prevent signed integer overflows with large buffers. */
|
||||||
|
if (min_size > INT_MAX - 8)
|
||||||
|
return -1;
|
||||||
|
if (p->size > INT_MAX / 2)
|
||||||
|
new_size = min_size + 8;
|
||||||
|
else {
|
||||||
|
new_size = p->size * 2;
|
||||||
|
if (new_size < min_size + 8)
|
||||||
|
new_size = min_size + 8;
|
||||||
|
}
|
||||||
#ifdef PRINTBUF_DEBUG
|
#ifdef PRINTBUF_DEBUG
|
||||||
MC_DEBUG("printbuf_memappend: realloc "
|
MC_DEBUG("printbuf_memappend: realloc "
|
||||||
"bpos=%d min_size=%d old_size=%d new_size=%d\n",
|
"bpos=%d min_size=%d old_size=%d new_size=%d\n",
|
||||||
@@ -78,6 +88,9 @@ static int printbuf_extend(struct printbuf *p, int min_size)
|
|||||||
|
|
||||||
int printbuf_memappend(struct printbuf *p, const char *buf, int size)
|
int printbuf_memappend(struct printbuf *p, const char *buf, int size)
|
||||||
{
|
{
|
||||||
|
/* Prevent signed integer overflows with large buffers. */
|
||||||
|
if (size > INT_MAX - p->bpos - 1)
|
||||||
|
return -1;
|
||||||
if (p->size <= p->bpos + size + 1) {
|
if (p->size <= p->bpos + size + 1) {
|
||||||
if (printbuf_extend(p, p->bpos + size + 1) < 0)
|
if (printbuf_extend(p, p->bpos + size + 1) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
@@ -94,6 +107,9 @@ int printbuf_memset(struct printbuf *pb, int offset, int charvalue, int len)
|
|||||||
|
|
||||||
if (offset == -1)
|
if (offset == -1)
|
||||||
offset = pb->bpos;
|
offset = pb->bpos;
|
||||||
|
/* Prevent signed integer overflows with large buffers. */
|
||||||
|
if (len > INT_MAX - offset)
|
||||||
|
return -1;
|
||||||
size_needed = offset + len;
|
size_needed = offset + len;
|
||||||
if (pb->size < size_needed)
|
if (pb->size < size_needed)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -2,9 +2,11 @@
|
|||||||
* gcc -o utf8 utf8.c -I/home/y/include -L./.libs -ljson
|
* gcc -o utf8 utf8.c -I/home/y/include -L./.libs -ljson
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
#include <assert.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
#include "json_inttypes.h"
|
#include "json_inttypes.h"
|
||||||
#include "json_object.h"
|
#include "json_object.h"
|
||||||
@@ -24,6 +26,30 @@ void print_hex( const char* s)
|
|||||||
printf("\n");
|
printf("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_lot_of_adds(void);
|
||||||
|
static void test_lot_of_adds()
|
||||||
|
{
|
||||||
|
int ii;
|
||||||
|
char key[50];
|
||||||
|
json_object *jobj = json_object_new_object();
|
||||||
|
assert(jobj != NULL);
|
||||||
|
for (ii = 0; ii < 500; ii++)
|
||||||
|
{
|
||||||
|
snprintf(key, sizeof(key), "k%d", ii);
|
||||||
|
json_object *iobj = json_object_new_int(ii);
|
||||||
|
assert(iobj != NULL);
|
||||||
|
json_object_object_add(jobj, key, iobj);
|
||||||
|
if (json_object_object_get_ex(jobj, key, &iobj) == FALSE)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "FAILED to add object #%d\n", ii);
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printf("%s\n", json_object_to_json_string(jobj));
|
||||||
|
assert(json_object_object_length(jobj) == 500);
|
||||||
|
json_object_put(jobj);
|
||||||
|
}
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
const char *input = "\"\\ud840\\udd26,\\ud840\\udd27,\\ud800\\udd26,\\ud800\\udd27\"";
|
const char *input = "\"\\ud840\\udd26,\\ud840\\udd27,\\ud800\\udd26,\\ud800\\udd27\"";
|
||||||
@@ -49,5 +75,8 @@ int main()
|
|||||||
retval = 1;
|
retval = 1;
|
||||||
}
|
}
|
||||||
json_object_put(parse_result);
|
json_object_put(parse_result);
|
||||||
|
|
||||||
|
test_lot_of_adds();
|
||||||
|
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -24,7 +24,7 @@ int main(int argc, char **argv)
|
|||||||
int orig_count = 0;
|
int orig_count = 0;
|
||||||
json_object_object_foreach(my_object, key0, val0)
|
json_object_object_foreach(my_object, key0, val0)
|
||||||
{
|
{
|
||||||
printf("Key at index %d is [%s]", orig_count, key0);
|
printf("Key at index %d is [%s] %d", orig_count, key0, (val0 == NULL));
|
||||||
if (strcmp(key0, "deleteme") == 0)
|
if (strcmp(key0, "deleteme") == 0)
|
||||||
{
|
{
|
||||||
json_object_object_del(my_object, key0);
|
json_object_object_del(my_object, key0);
|
||||||
@@ -41,7 +41,7 @@ int main(int argc, char **argv)
|
|||||||
orig_count = 0;
|
orig_count = 0;
|
||||||
json_object_object_foreach(my_object, key, val)
|
json_object_object_foreach(my_object, key, val)
|
||||||
{
|
{
|
||||||
printf("Key at index %d is [%s]\n", orig_count, key);
|
printf("Key at index %d is [%s] %d\n", orig_count, key, (val == NULL));
|
||||||
orig_count++;
|
orig_count++;
|
||||||
if (strcmp(key, "foo2") != 0)
|
if (strcmp(key, "foo2") != 0)
|
||||||
continue;
|
continue;
|
||||||
@@ -56,7 +56,7 @@ int main(int argc, char **argv)
|
|||||||
int retval = 0;
|
int retval = 0;
|
||||||
json_object_object_foreach(my_object, key2, val2)
|
json_object_object_foreach(my_object, key2, val2)
|
||||||
{
|
{
|
||||||
printf("Key at index %d is [%s]\n", new_count, key2);
|
printf("Key at index %d is [%s] %d\n", new_count, key2, (val2 == NULL));
|
||||||
new_count++;
|
new_count++;
|
||||||
if (strcmp(key2, "foo2") != 0)
|
if (strcmp(key2, "foo2") != 0)
|
||||||
continue;
|
continue;
|
||||||
|
|||||||
@@ -1,15 +1,15 @@
|
|||||||
==== delete-in-loop test starting ====
|
==== delete-in-loop test starting ====
|
||||||
Key at index 0 is [foo1] (kept)
|
Key at index 0 is [foo1] 0 (kept)
|
||||||
Key at index 1 is [foo2] (kept)
|
Key at index 1 is [foo2] 0 (kept)
|
||||||
Key at index 2 is [deleteme] (deleted)
|
Key at index 2 is [deleteme] 0 (deleted)
|
||||||
Key at index 3 is [foo3] (kept)
|
Key at index 3 is [foo3] 0 (kept)
|
||||||
==== replace-value first loop starting ====
|
==== replace-value first loop starting ====
|
||||||
Key at index 0 is [foo1]
|
Key at index 0 is [foo1] 0
|
||||||
Key at index 1 is [foo2]
|
Key at index 1 is [foo2] 0
|
||||||
replacing value for key [foo2]
|
replacing value for key [foo2]
|
||||||
Key at index 2 is [foo3]
|
Key at index 2 is [foo3] 0
|
||||||
==== second loop starting ====
|
==== second loop starting ====
|
||||||
Key at index 0 is [foo1]
|
Key at index 0 is [foo1] 0
|
||||||
Key at index 1 is [foo2]
|
Key at index 1 is [foo2] 0
|
||||||
pointer for key [foo2] does match
|
pointer for key [foo2] does match
|
||||||
Key at index 2 is [foo3]
|
Key at index 2 is [foo3] 0
|
||||||
|
|||||||
@@ -79,6 +79,10 @@ static void test_basic_parse()
|
|||||||
printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj));
|
printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj));
|
||||||
json_object_put(new_obj);
|
json_object_put(new_obj);
|
||||||
|
|
||||||
|
new_obj = json_tokener_parse("{ \"min\": Infinity, \"max\": -Infinity}");
|
||||||
|
printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj));
|
||||||
|
json_object_put(new_obj);
|
||||||
|
|
||||||
new_obj = json_tokener_parse("True");
|
new_obj = json_tokener_parse("True");
|
||||||
printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj));
|
printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj));
|
||||||
json_object_put(new_obj);
|
json_object_put(new_obj);
|
||||||
@@ -131,7 +135,7 @@ static void test_basic_parse()
|
|||||||
printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj));
|
printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj));
|
||||||
json_object_put(new_obj);
|
json_object_put(new_obj);
|
||||||
|
|
||||||
new_obj = json_tokener_parse("{ \"abc\": 12, \"foo\": \"bar\", \"bool0\": false, \"bool1\": true, \"arr\": [ 1, 2, 3, null, 5 ] }");
|
new_obj = json_tokener_parse("{ \"abc\": 12, \"foo\": \"bar\", \"bool0\": false, \"bool1\": true, \"arr\": [ 1, 2, 3, null, 5 ], \"inf\": Infinity, \"-inf\": -Infinity, \"nan\": NaN, \"def\" : -0.22, \"hij\": 0.31 }");
|
||||||
printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj));
|
printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj));
|
||||||
json_object_put(new_obj);
|
json_object_put(new_obj);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ new_obj.to_string()=Infinity
|
|||||||
new_obj.to_string()=Infinity
|
new_obj.to_string()=Infinity
|
||||||
new_obj.to_string()=-Infinity
|
new_obj.to_string()=-Infinity
|
||||||
new_obj.to_string()=-Infinity
|
new_obj.to_string()=-Infinity
|
||||||
|
new_obj.to_string()={ "min": Infinity, "max": -Infinity }
|
||||||
new_obj.to_string()=true
|
new_obj.to_string()=true
|
||||||
new_obj.to_string()=12
|
new_obj.to_string()=12
|
||||||
new_obj.to_string()=12.3
|
new_obj.to_string()=12.3
|
||||||
@@ -24,7 +25,7 @@ new_obj.to_string()={ }
|
|||||||
new_obj.to_string()={ "foo": "bar" }
|
new_obj.to_string()={ "foo": "bar" }
|
||||||
new_obj.to_string()={ "foo": "bar", "baz": null, "bool0": true }
|
new_obj.to_string()={ "foo": "bar", "baz": null, "bool0": true }
|
||||||
new_obj.to_string()={ "foo": [ null, "foo" ] }
|
new_obj.to_string()={ "foo": [ null, "foo" ] }
|
||||||
new_obj.to_string()={ "abc": 12, "foo": "bar", "bool0": false, "bool1": true, "arr": [ 1, 2, 3, null, 5 ] }
|
new_obj.to_string()={ "abc": 12, "foo": "bar", "bool0": false, "bool1": true, "arr": [ 1, 2, 3, null, 5 ], "inf": Infinity, "-inf": -Infinity, "nan": NaN, "def": -0.22, "hij": 0.31 }
|
||||||
==================================
|
==================================
|
||||||
json_tokener_parse_versbose() OK
|
json_tokener_parse_versbose() OK
|
||||||
==================================
|
==================================
|
||||||
|
|||||||
Reference in New Issue
Block a user