| @@ -34,27 +34,27 @@ | | | @@ -34,27 +34,27 @@ |
34 | | | 34 | |
35 | #include "mj.h" | | 35 | #include "mj.h" |
36 | #include "defs.h" | | 36 | #include "defs.h" |
37 | | | 37 | |
38 | /* save 'n' chars of 's' in malloc'd memory */ | | 38 | /* save 'n' chars of 's' in malloc'd memory */ |
39 | static char * | | 39 | static char * |
40 | strnsave(const char *s, int n, unsigned esc) | | 40 | strnsave(const char *s, int n, unsigned esc) |
41 | { | | 41 | { |
42 | char *newc; | | 42 | char *newc; |
43 | char *cp; | | 43 | char *cp; |
44 | int i; | | 44 | int i; |
45 | | | 45 | |
46 | if (n < 0) { | | 46 | if (n < 0) { |
47 | n = strlen(s); | | 47 | n = (int)strlen(s); |
48 | } | | 48 | } |
49 | NEWARRAY(char, cp, (n * 2) + 1, "strnsave", return NULL); | | 49 | NEWARRAY(char, cp, (n * 2) + 1, "strnsave", return NULL); |
50 | if (esc) { | | 50 | if (esc) { |
51 | newc = cp; | | 51 | newc = cp; |
52 | for (i = 0 ; i < n ; i++) { | | 52 | for (i = 0 ; i < n ; i++) { |
53 | if (*s == '\\') { | | 53 | if (*s == '\\') { |
54 | *newc++ = *s++; | | 54 | *newc++ = *s++; |
55 | } else if (*s == '"') { | | 55 | } else if (*s == '"') { |
56 | *newc++ = '\\'; | | 56 | *newc++ = '\\'; |
57 | } | | 57 | } |
58 | *newc++ = *s++; | | 58 | *newc++ = *s++; |
59 | } | | 59 | } |
60 | *newc = 0x0; | | 60 | *newc = 0x0; |
| @@ -97,27 +97,27 @@ create_integer(mj_t *atom, int64_t i) | | | @@ -97,27 +97,27 @@ create_integer(mj_t *atom, int64_t i) |
97 | char number[128]; | | 97 | char number[128]; |
98 | | | 98 | |
99 | atom->type = MJ_NUMBER; | | 99 | atom->type = MJ_NUMBER; |
100 | atom->c = snprintf(number, sizeof(number), "%" PRIi64, i); | | 100 | atom->c = snprintf(number, sizeof(number), "%" PRIi64, i); |
101 | atom->value.s = strnsave(number, (int)atom->c, 0); | | 101 | atom->value.s = strnsave(number, (int)atom->c, 0); |
102 | } | | 102 | } |
103 | | | 103 | |
104 | /* create a string */ | | 104 | /* create a string */ |
105 | static void | | 105 | static void |
106 | create_string(mj_t *atom, const char *s) | | 106 | create_string(mj_t *atom, const char *s) |
107 | { | | 107 | { |
108 | atom->type = MJ_STRING; | | 108 | atom->type = MJ_STRING; |
109 | atom->value.s = strnsave(s, -1, 1); | | 109 | atom->value.s = strnsave(s, -1, 1); |
110 | atom->c = strlen(atom->value.s); | | 110 | atom->c = (unsigned)strlen(atom->value.s); |
111 | } | | 111 | } |
112 | | | 112 | |
113 | #define MJ_OPEN_BRACKET (MJ_OBJECT + 1) /* 8 */ | | 113 | #define MJ_OPEN_BRACKET (MJ_OBJECT + 1) /* 8 */ |
114 | #define MJ_CLOSE_BRACKET (MJ_OPEN_BRACKET + 1) /* 9 */ | | 114 | #define MJ_CLOSE_BRACKET (MJ_OPEN_BRACKET + 1) /* 9 */ |
115 | #define MJ_OPEN_BRACE (MJ_CLOSE_BRACKET + 1) /* 10 */ | | 115 | #define MJ_OPEN_BRACE (MJ_CLOSE_BRACKET + 1) /* 10 */ |
116 | #define MJ_CLOSE_BRACE (MJ_OPEN_BRACE + 1) /* 11 */ | | 116 | #define MJ_CLOSE_BRACE (MJ_OPEN_BRACE + 1) /* 11 */ |
117 | #define MJ_COLON (MJ_CLOSE_BRACE + 1) /* 12 */ | | 117 | #define MJ_COLON (MJ_CLOSE_BRACE + 1) /* 12 */ |
118 | #define MJ_COMMA (MJ_COLON + 1) /* 13 */ | | 118 | #define MJ_COMMA (MJ_COLON + 1) /* 13 */ |
119 | | | 119 | |
120 | /* return the token type, and start and finish locations in string */ | | 120 | /* return the token type, and start and finish locations in string */ |
121 | static int | | 121 | static int |
122 | gettok(const char *s, int *from, int *to, int *tok) | | 122 | gettok(const char *s, int *from, int *to, int *tok) |
123 | { | | 123 | { |
| @@ -255,31 +255,31 @@ mj_asprint(char **buf, mj_t *atom) | | | @@ -255,31 +255,31 @@ mj_asprint(char **buf, mj_t *atom) |
255 | (void) mj_snprint(*buf, (unsigned)(size + 1), atom); | | 255 | (void) mj_snprint(*buf, (unsigned)(size + 1), atom); |
256 | return size + 1; | | 256 | return size + 1; |
257 | } | | 257 | } |
258 | | | 258 | |
259 | /* read into a JSON tree from a string */ | | 259 | /* read into a JSON tree from a string */ |
260 | int | | 260 | int |
261 | mj_parse(mj_t *atom, const char *s, int *from, int *to, int *tok) | | 261 | mj_parse(mj_t *atom, const char *s, int *from, int *to, int *tok) |
262 | { | | 262 | { |
263 | int i; | | 263 | int i; |
264 | | | 264 | |
265 | switch(atom->type = *tok = gettok(s, from, to, tok)) { | | 265 | switch(atom->type = *tok = gettok(s, from, to, tok)) { |
266 | case MJ_NUMBER: | | 266 | case MJ_NUMBER: |
267 | atom->value.s = strnsave(&s[*from], *to - *from, 1); | | 267 | atom->value.s = strnsave(&s[*from], *to - *from, 1); |
268 | atom->c = atom->size = strlen(atom->value.s); | | 268 | atom->c = atom->size = (unsigned)strlen(atom->value.s); |
269 | return gettok(s, from, to, tok); | | 269 | return gettok(s, from, to, tok); |
270 | case MJ_STRING: | | 270 | case MJ_STRING: |
271 | atom->value.s = strnsave(&s[*from + 1], *to - *from - 2, 1); | | 271 | atom->value.s = strnsave(&s[*from + 1], *to - *from - 2, 1); |
272 | atom->c = atom->size = strlen(atom->value.s); | | 272 | atom->c = atom->size = (unsigned)strlen(atom->value.s); |
273 | return gettok(s, from, to, tok); | | 273 | return gettok(s, from, to, tok); |
274 | case MJ_NULL: | | 274 | case MJ_NULL: |
275 | case MJ_FALSE: | | 275 | case MJ_FALSE: |
276 | case MJ_TRUE: | | 276 | case MJ_TRUE: |
277 | atom->c = (unsigned)*to; | | 277 | atom->c = (unsigned)*to; |
278 | return gettok(s, from, to, tok); | | 278 | return gettok(s, from, to, tok); |
279 | case MJ_OPEN_BRACKET: | | 279 | case MJ_OPEN_BRACKET: |
280 | mj_create(atom, "array"); | | 280 | mj_create(atom, "array"); |
281 | ALLOC(mj_t, atom->value.v, atom->size, atom->c, 10, 10, "mj_parse()", return 0); | | 281 | ALLOC(mj_t, atom->value.v, atom->size, atom->c, 10, 10, "mj_parse()", return 0); |
282 | while (mj_parse(&atom->value.v[atom->c++], s, from, to, tok) >= 0 && *tok != MJ_CLOSE_BRACKET) { | | 282 | while (mj_parse(&atom->value.v[atom->c++], s, from, to, tok) >= 0 && *tok != MJ_CLOSE_BRACKET) { |
283 | if (*tok != MJ_COMMA) { | | 283 | if (*tok != MJ_COMMA) { |
284 | (void) fprintf(stderr, "1. expected comma (got %d) at '%s'\n", *tok, &s[*from]); | | 284 | (void) fprintf(stderr, "1. expected comma (got %d) at '%s'\n", *tok, &s[*from]); |
285 | break; | | 285 | break; |
| @@ -341,27 +341,27 @@ mj_deepcopy(mj_t *dst, mj_t *src) | | | @@ -341,27 +341,27 @@ mj_deepcopy(mj_t *dst, mj_t *src) |
341 | { | | 341 | { |
342 | unsigned i; | | 342 | unsigned i; |
343 | | | 343 | |
344 | switch(src->type) { | | 344 | switch(src->type) { |
345 | case MJ_FALSE: | | 345 | case MJ_FALSE: |
346 | case MJ_TRUE: | | 346 | case MJ_TRUE: |
347 | case MJ_NULL: | | 347 | case MJ_NULL: |
348 | (void) memcpy(dst, src, sizeof(*dst)); | | 348 | (void) memcpy(dst, src, sizeof(*dst)); |
349 | return 1; | | 349 | return 1; |
350 | case MJ_STRING: | | 350 | case MJ_STRING: |
351 | case MJ_NUMBER: | | 351 | case MJ_NUMBER: |
352 | (void) memcpy(dst, src, sizeof(*dst)); | | 352 | (void) memcpy(dst, src, sizeof(*dst)); |
353 | dst->value.s = strnsave(src->value.s, -1, 0); | | 353 | dst->value.s = strnsave(src->value.s, -1, 0); |
354 | dst->c = dst->size = strlen(dst->value.s); | | 354 | dst->c = dst->size = (unsigned)strlen(dst->value.s); |
355 | return 1; | | 355 | return 1; |
356 | case MJ_ARRAY: | | 356 | case MJ_ARRAY: |
357 | case MJ_OBJECT: | | 357 | case MJ_OBJECT: |
358 | (void) memcpy(dst, src, sizeof(*dst)); | | 358 | (void) memcpy(dst, src, sizeof(*dst)); |
359 | NEWARRAY(mj_t, dst->value.v, dst->size, "mj_deepcopy()", return 0); | | 359 | NEWARRAY(mj_t, dst->value.v, dst->size, "mj_deepcopy()", return 0); |
360 | for (i = 0 ; i < src->c ; i++) { | | 360 | for (i = 0 ; i < src->c ; i++) { |
361 | if (!mj_deepcopy(&dst->value.v[i], &src->value.v[i])) { | | 361 | if (!mj_deepcopy(&dst->value.v[i], &src->value.v[i])) { |
362 | return 0; | | 362 | return 0; |
363 | } | | 363 | } |
364 | } | | 364 | } |
365 | return 1; | | 365 | return 1; |
366 | default: | | 366 | default: |
367 | (void) fprintf(stderr, "weird type '%d'\n", src->type); | | 367 | (void) fprintf(stderr, "weird type '%d'\n", src->type); |