From: sparky4 Date: Sat, 21 Mar 2015 20:19:23 +0000 (-0500) Subject: modified: src/lib/jsmn/example/MAPTEST.EXE X-Git-Url: http://4ch.mooo.com/gitweb/?a=commitdiff_plain;h=7994a69cce701cad83f52ce246e4181cb5be0f88;p=16.git modified: src/lib/jsmn/example/MAPTEST.EXE modified: src/lib/jsmn/example/maptest modified: src/lib/jsmn/example/maptest.c new file: src/lib/jsmn/example/maptest2.c --- diff --git a/src/lib/jsmn/example/MAPTEST.EXE b/src/lib/jsmn/example/MAPTEST.EXE index 12a0c0c9..697c8c9e 100644 Binary files a/src/lib/jsmn/example/MAPTEST.EXE and b/src/lib/jsmn/example/MAPTEST.EXE differ diff --git a/src/lib/jsmn/example/maptest b/src/lib/jsmn/example/maptest index 5f954f9a..3f32276d 100644 Binary files a/src/lib/jsmn/example/maptest and b/src/lib/jsmn/example/maptest differ diff --git a/src/lib/jsmn/example/maptest.c b/src/lib/jsmn/example/maptest.c index 860c8f94..9de99e28 100644 --- a/src/lib/jsmn/example/maptest.c +++ b/src/lib/jsmn/example/maptest.c @@ -46,13 +46,13 @@ int main() { { fread(JSON_S, sizeof(char), filesize(fh), fh); // we can now close the file - fclose(fh); fh = NULL; //printf("]%s[\n", JSON_S); JSON_STRING=JSON_S; //printf("[[%s]]\n", JSON_STRING); jsmn_init(&p); - r = jsmn_parse(&p, JSON_STRING, strlen(JSON_STRING), t, sizeof(t)/sizeof(t[0])); + r = jsmn_parse(&p, JSON_STRING, filesize(fh), t, sizeof(t)/sizeof(t[0])); + fclose(fh); fh = NULL; printf("%s", JSON_STRING); if (r < 0) { printf("Failed to parse JSON: %d\n", r); diff --git a/src/lib/jsmn/example/maptest2.c b/src/lib/jsmn/example/maptest2.c new file mode 100644 index 00000000..9de99e28 --- /dev/null +++ b/src/lib/jsmn/example/maptest2.c @@ -0,0 +1,107 @@ +#include +#include +#include +#include "../jsmn.c" + +/* + * A small example of jsmn parsing when JSON structure is known and number of + * tokens is predictable. + */ + +/*char *JSON_S = + "{\"user\": \"johndoe\", \"admin\": false, \"uid\": 1000,\n " + "\"groups\": [\"users\", \"wheel\", \"audio\", \"video\"]}";*/ + +char *JSON_STRING; + +long int filesize(FILE *fp) +{ + long int save_pos, size_of_file; + + save_pos = ftell(fp); + fseek(fp, 0L, SEEK_END); + size_of_file = ftell(fp); + fseek(fp, save_pos, SEEK_SET); + return(size_of_file); +} + +static int jsoneq(const char *json, jsmntok_t *tok, const char *s) { + if (tok->type == JSMN_STRING && (int) strlen(s) == tok->end - tok->start && + strncmp(json + tok->start, s, tok->end - tok->start) == 0) { + return 0; + } + return -1; +} + +int main() { + int i; + int r; + jsmn_parser p; + FILE *fh = fopen("../../../../data/test.map", "r"); + jsmntok_t t[1536]; /* We expect no more than 128 tokens */ + char JSON_S[6144]; + memset(JSON_S, 0, sizeof(JSON_S)); + + if(fh != NULL) + { + fread(JSON_S, sizeof(char), filesize(fh), fh); + // we can now close the file + //printf("]%s[\n", JSON_S); + JSON_STRING=JSON_S; + //printf("[[%s]]\n", JSON_STRING); + + jsmn_init(&p); + r = jsmn_parse(&p, JSON_STRING, filesize(fh), t, sizeof(t)/sizeof(t[0])); + fclose(fh); fh = NULL; + printf("%s", JSON_STRING); + if (r < 0) { + printf("Failed to parse JSON: %d\n", r); + return 1; + } + + /* Assume the top-level element is an object */ + if (r < 1 || t[0].type != JSMN_OBJECT) { + printf("Object expected\n"); + return 1; + } + + /* Loop over all keys of the root object */ + for (i = 1; i < r; i++) { + if (jsoneq(JSON_STRING, &t[i], "image") == 0) { + /* We may use strndup() to fetch string value */ + printf("- image: %.*s\n", t[i+1].end-t[i+1].start, + JSON_STRING + t[i+1].start); + i++; + } else if (jsoneq(JSON_STRING, &t[i], "admin") == 0) { + /* We may additionally check if the value is either "true" or "false" */ + printf("- Admin: %.*s\n", t[i+1].end-t[i+1].start, + JSON_STRING + t[i+1].start); + i++; + } else if (jsoneq(JSON_STRING, &t[i], "uid") == 0) { + /* We may want to do strtol() here to get numeric value */ + printf("- UID: %.*s\n", t[i+1].end-t[i+1].start, + JSON_STRING + t[i+1].start); + i++; + } else if (jsoneq(JSON_STRING, &t[i], "tilesets") == 0) { + int j; + printf("- tilesets:\n"); + if (t[i+1].type != JSMN_ARRAY) { + continue; /* We expect groups to be an array of strings */ + } + for (j = 0; j < t[i+1].size; j++) { + jsmntok_t *g = &t[i+j+2]; + printf(" * %.*s\n", g->end - g->start, JSON_STRING + g->start); + } + i += t[i+1].size + 1; + } else { + printf("Unexpected key: %.*s\n", t[i].end-t[i].start, + JSON_STRING + t[i].start); + } + } + + //free(JSON_STRING); + } + if (fh != NULL) fclose(fh); + ////} + return 0; +}