X-Git-Url: http://4ch.mooo.com/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fjsmn%2Fexample%2Fmaptest2.c;h=017fbf8520111b28161a7dbdfb252496ae9beed1;hb=acc96b5371d3d51633b9175609b0ce030a3d75db;hp=41e2544ab65732de4fb9ec014cb6484993361671;hpb=63e17af2d27904baaf078579fc4fad8fbb3a832d;p=16.git diff --git a/src/lib/jsmn/example/maptest2.c b/src/lib/jsmn/example/maptest2.c index 41e2544a..017fbf85 100644 --- a/src/lib/jsmn/example/maptest2.c +++ b/src/lib/jsmn/example/maptest2.c @@ -3,50 +3,96 @@ #include #include #include "../jsmn.c" +#include "../../../lib/types.h" /* * 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. - */ + */ -static int dump(const char *js, jsmntok_t *t, size_t count, int indent) { +char *js_sv; + +typedef struct { + //bitmap_t *data; + byte *data; + word tileHeight; + word tileWidth; + unsigned int rows; + unsigned int cols; +} tiles_t; + +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 && + strncmp(json + tok->start, s, tok->end - tok->start) == 0) { + return 0; + } + return -1; +} + +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) { - printf("%.*s", t->end - t->start, js+t->start); + 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); + //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"); + //printf("\n"); j = 0; for (i = 0; i < t->size; i++) { - for (k = 0; k < indent; k++) printf(" "); - j += dump(js, t+1+j, count-j, indent+1); - printf(": "); - j += dump(js, t+1+j, count-j, indent+1); - printf("\n"); + //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"); + //printf("==\n"); for (i = 0; i < t->size; i++) { - for (k = 0; k < indent-1; k++) printf(" "); - printf(" - "); - j += dump(js, t+1+j, count-j, indent+1); - printf("\n"); + //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 main() { - FILE *fh = fopen("../../../../data/test.map", "r"); +int loadmap(char *mn, map_t *map) +{ int r; int eof_expected = 0; char *js = NULL; @@ -57,6 +103,8 @@ int main() { jsmntok_t *tok; size_t tokcount = 2; + FILE *fh = fopen(mn, "r"); + /* Prepare parser */ jsmn_init(&p); @@ -104,10 +152,19 @@ again: goto again; } } else { - dump(js, tok, p.toknext, 0); + dump(js, tok, p.toknext, 0, map); + //fprintf(stdout, "[[[[%d]]]]\n", sizeof(tok)); + //printf("[\n%d\n]", jslen); eof_expected = 1; } } return 0; } + +int main() +{ + map_t map; + loadmap("../../../../data/test.map", &map); + return 0; +}