X-Git-Url: http://4ch.mooo.com/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fjsmn%2Fexample%2Fmaptest2.c;h=017fbf8520111b28161a7dbdfb252496ae9beed1;hb=acc96b5371d3d51633b9175609b0ce030a3d75db;hp=ae663a2fad9c308484e04de583b7700749b0fd0b;hpb=57aa59c0ea066dd3df8321d29871f6c9303ecf49;p=16.git diff --git a/src/lib/jsmn/example/maptest2.c b/src/lib/jsmn/example/maptest2.c index ae663a2f..017fbf85 100644 --- a/src/lib/jsmn/example/maptest2.c +++ b/src/lib/jsmn/example/maptest2.c @@ -1,30 +1,32 @@ #include -#include #include +#include +#include #include "../jsmn.c" +#include "../../../lib/types.h" /* - * A small example of jsmn parsing when JSON structure is known and number of - * tokens is predictable. - */ + * An example of reading JSON from stdin and printing its content to stdout. + * The output looks like YAML, but I'm not sure if it's really compatible. + */ -/*char *JSON_S = - "{\"user\": \"johndoe\", \"admin\": false, \"uid\": 1000,\n " - "\"groups\": [\"users\", \"wheel\", \"audio\", \"video\"]}";*/ +char *js_sv; -char *JSON_STRING; -char JSON_S[BUFSIZ]; - -long int filesize(FILE *fp) -{ - long int save_pos, size_of_file; +typedef struct { + //bitmap_t *data; + byte *data; + word tileHeight; + word tileWidth; + unsigned int rows; + unsigned int cols; +} tiles_t; - save_pos = ftell(fp); - fseek(fp, 0L, SEEK_END); - size_of_file = ftell(fp); - fseek(fp, save_pos, SEEK_SET); - return(size_of_file); -} +typedef struct { + byte *data; + tiles_t *tiles; + int width; + int height; +} map_t; static int jsoneq(const char *json, jsmntok_t *tok, const char *s) { if (tok->type == JSMN_STRING && (int) strlen(s) == tok->end - tok->start && @@ -34,77 +36,135 @@ static int jsoneq(const char *json, jsmntok_t *tok, const char *s) { return -1; } -int main() { - int i; +static int dump(const char *js, jsmntok_t *t, size_t count, int indent, /*char *js_sv,*/ map_t *map) { + int i, j, k; + if (count == 0) { + return 0; + } + /* We may want to do strtol() here to get numeric value */ + if (t->type == JSMN_PRIMITIVE) { + if(js_sv == "height") + { + map->height = (int)strtol(js+t->start, (char **)js+t->end, 10); + printf("h:[%d]\n", map->height); + }else if(js_sv == "width") + { + map->width = (int)strtol(js+t->start, (char **)js+t->end, 10); + printf("w:[%d]\n", map->width); + } + return 1; + /* We may use strndup() to fetch string value */ + } else if (t->type == JSMN_STRING) { + //printf("'%.*s'", t->end - t->start, js+t->start); + if (jsoneq(js, t, "height") == 0 && indent==1) + { + js_sv="height";//strdup(js+t->start);//, t->end - t->start); + printf("%s\n", js_sv); + }else if (jsoneq(js, t, "width") == 0 && indent==1) + { + js_sv="width";//strdup(js+t->start);//, t->end - t->start); + printf("%s\n", js_sv); + }else js_sv=NULL; + return 1; + } else if (t->type == JSMN_OBJECT) { + //printf("\n"); + j = 0; + for (i = 0; i < t->size; i++) { + //for (k = 0; k < indent; k++) printf("\t"); + j += dump(js, t+1+j, count-j, indent+1, map); + //printf(": "); + j += dump(js, t+1+j, count-j, indent+1, map); + //printf("\n"); + } + return j+1; + } else if (t->type == JSMN_ARRAY) { + j = 0; + //printf("==\n"); + for (i = 0; i < t->size; i++) { + //for (k = 0; k < indent-1; k++) printf("\t"); + //printf("\t-"); + j += dump(js, t+1+j, count-j, indent+1, map); + //printf("==\n"); + } + return j+1; + } + return 0; +} + +int loadmap(char *mn, map_t *map) +{ int r; + int eof_expected = 0; + char *js = NULL; + size_t jslen = 0; + char buf[BUFSIZ]; + jsmn_parser p; - FILE *fh = fopen("../../../../data/test.map", "r"); - jsmntok_t *t; /* We expect no more than 128 tokens */ - size_t tokcount = 2048; - /* Allocate some tokens as a start */ - t = malloc(sizeof(*t) * tokcount); - //memset(JSON_S, 0, sizeof(JSON_S)); + jsmntok_t *tok; + size_t tokcount = 2; - if(fh != NULL) - { - fread(JSON_S, 1, filesize(fh), fh); - // we can now close the file - //printf("]%s[\n", JSON_S); - JSON_STRING=JSON_S; - //printf("[[%s]]\n", JSON_STRING); + FILE *fh = fopen(mn, "r"); + /* Prepare parser */ 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; + /* Allocate some tokens as a start */ + tok = malloc(sizeof(*tok) * tokcount); + if (tok == NULL) { + fprintf(stderr, "malloc(): errno=%d\n", errno); + return 3; } - /* 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 (;;) { + /* Read another chunk */ + r = fread(buf, 1, sizeof(buf), fh); + if (r < 0) { + fprintf(stderr, "fread(): %d, errno=%d\n", r, errno); + return 1; + } + if (r == 0) { + if (eof_expected != 0) { + return 0; + } else { + fprintf(stderr, "fread(): unexpected EOF\n"); + return 2; } - 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); + } + + js = realloc(js, jslen + r + 1); + if (js == NULL) { + fprintf(stderr, "realloc(): errno=%d\n", errno); + return 3; + } + strncpy(js + jslen, buf, r); + jslen = jslen + r; + +again: + r = jsmn_parse(&p, js, jslen, tok, tokcount); + if (r < 0) { + if (r == JSMN_ERROR_NOMEM) { + tokcount = tokcount * 2; + tok = realloc(tok, sizeof(*tok) * tokcount); + if (tok == NULL) { + fprintf(stderr, "realloc(): errno=%d\n", errno); + return 3; + } + goto again; } - i += t[i+1].size + 1; } else { - printf("Unexpected key: %.*s\n", t[i].end-t[i].start, - JSON_STRING + t[i].start); + dump(js, tok, p.toknext, 0, map); + //fprintf(stdout, "[[[[%d]]]]\n", sizeof(tok)); + //printf("[\n%d\n]", jslen); + eof_expected = 1; } } - //free(JSON_STRING); - } - if (fh != NULL) fclose(fh); - ////} + return 0; +} + +int main() +{ + map_t map; + loadmap("../../../../data/test.map", &map); return 0; }