From: sparky4 Date: Tue, 24 Mar 2015 16:34:47 +0000 (-0500) Subject: modified: maptest.exe X-Git-Url: http://4ch.mooo.com/gitweb/?a=commitdiff_plain;h=304183221f870f5597a0355ac12c16365fe25ea9;p=16.git modified: maptest.exe modified: scroll.exe new file: src/lib/jsmn/example/JSONDUMP.EXE new file: src/lib/jsmn/example/MAPTEST.EXE new file: src/lib/jsmn/example/MAPTEST2.EXE new file: src/lib/jsmn/example/SIMPLE.EXE new file: src/lib/jsmn/example/jsondump new file: src/lib/jsmn/example/jsondump.c new file: src/lib/jsmn/example/maptest new file: src/lib/jsmn/example/maptest.c new file: src/lib/jsmn/example/maptest2 new file: src/lib/jsmn/example/maptest2.c new file: src/lib/jsmn/example/simple.c deleted: src/lib/jsmn/jsmn.7z modified: src/lib/mapread.c --- diff --git a/maptest.exe b/maptest.exe index 996e0fdf..859234ac 100644 Binary files a/maptest.exe and b/maptest.exe differ diff --git a/scroll.exe b/scroll.exe index 2b1044d3..4462643d 100644 Binary files a/scroll.exe and b/scroll.exe differ diff --git a/src/lib/jsmn/example/JSONDUMP.EXE b/src/lib/jsmn/example/JSONDUMP.EXE new file mode 100644 index 00000000..dccede19 Binary files /dev/null and b/src/lib/jsmn/example/JSONDUMP.EXE differ diff --git a/src/lib/jsmn/example/MAPTEST.EXE b/src/lib/jsmn/example/MAPTEST.EXE new file mode 100644 index 00000000..f3a71677 Binary files /dev/null and b/src/lib/jsmn/example/MAPTEST.EXE differ diff --git a/src/lib/jsmn/example/MAPTEST2.EXE b/src/lib/jsmn/example/MAPTEST2.EXE new file mode 100644 index 00000000..df045463 Binary files /dev/null and b/src/lib/jsmn/example/MAPTEST2.EXE differ diff --git a/src/lib/jsmn/example/SIMPLE.EXE b/src/lib/jsmn/example/SIMPLE.EXE new file mode 100644 index 00000000..77ee0f40 Binary files /dev/null and b/src/lib/jsmn/example/SIMPLE.EXE differ diff --git a/src/lib/jsmn/example/jsondump b/src/lib/jsmn/example/jsondump new file mode 100644 index 00000000..bf6541f5 Binary files /dev/null and b/src/lib/jsmn/example/jsondump differ diff --git a/src/lib/jsmn/example/jsondump.c b/src/lib/jsmn/example/jsondump.c new file mode 100644 index 00000000..b7d25cb0 --- /dev/null +++ b/src/lib/jsmn/example/jsondump.c @@ -0,0 +1,124 @@ +#include +#include +#include +#include +#include "../jsmn.c" + +/* + * 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 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) { + int i, j, k; + if (count == 0) { + return 0; + } + if (t->type == JSMN_PRIMITIVE) { + printf("%.*s", t->end - t->start, js+t->start); + return 1; + } else if (t->type == JSMN_STRING) { + if(jsoneq(js, t, "data") == 0 ) + { +// printf("[[[[%d|%d]]]]\n", &(t+1)->size, (t+1)->size); + printf("\n%.*s[xx[%d|%d]xx]\n", (t+1)->end - (t+1)->start, js+(t+1)->start, &(t+1)->size, (t+1)->size); + } + printf("'%.*s'", t->end - t->start, js+t->start); + 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(" "); + j += dump(js, t+1+j, count-j, indent+1); + printf(": "); + j += dump(js, t+1+j, count-j, indent+1); + 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(" "); + printf(" - "); + j += dump(js, t+1+j, count-j, indent+1); + printf("\n"); + } + return j+1; + } + return 0; +} + +int main() { + int r; + int eof_expected = 0; + char *js = NULL; + size_t jslen = 0; + char buf[BUFSIZ]; + + jsmn_parser p; + jsmntok_t *tok; + size_t tokcount = 2; + + /* Prepare parser */ + jsmn_init(&p); + + /* Allocate some tokens as a start */ + tok = malloc(sizeof(*tok) * tokcount); + if (tok == NULL) { + fprintf(stderr, "malloc(): errno=%d\n", errno); + return 3; + } + + for (;;) { + /* Read another chunk */ + r = fread(buf, 1, sizeof(buf), stdin); + 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; + } + } + + 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; + } + } else { + dump(js, tok, p.toknext, 0); + eof_expected = 1; + } + } + + return 0; +} diff --git a/src/lib/jsmn/example/maptest b/src/lib/jsmn/example/maptest new file mode 100644 index 00000000..a72fa7f9 Binary files /dev/null and b/src/lib/jsmn/example/maptest differ diff --git a/src/lib/jsmn/example/maptest.c b/src/lib/jsmn/example/maptest.c new file mode 100644 index 00000000..7cceabb8 --- /dev/null +++ b/src/lib/jsmn/example/maptest.c @@ -0,0 +1,122 @@ +#include +#include +#include +//#include +#include "../jsmn.c" + +//#define BUFSIZ 2048 + +/* + * A small example of jsmn parsing when JSON structure is known and number of + * tokens is predictable. + */ + +/*char *json_string = + "{\"user\": \"johndoe\", \"admin\": false, \"uid\": 1000,\n " + "\"groups\": [\"users\", \"wheel\", \"audio\", \"video\"]}";*/ + +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; + size_t z; + jsmn_parser p; + jsmntok_t t[(BUFSIZ/sizeof(jsmntok_t))*2]; /* We expect no more than 128 tokens */ + FILE *fh = fopen("../../../../data/test.map", "r"); + char *json_string = malloc(filesize(fh)); + + if(fh != NULL) + { + /*t = malloc(2048); + if (t == NULL) { + fprintf(stderr, "malloc(): errno=%d\n", errno); + return 3; + }*/ + //printf("\n%d\n\n", sizeof(*t)); + printf("\n%d", sizeof(*t)); + printf("\n%d", sizeof(t)); + printf("\n%d\n\n", sizeof(t)/sizeof(t[0])); + z = fread(json_string, 1, filesize(fh), fh); + //char json_s[2048]; + fclose(fh); fh = NULL; + printf("[%d]\n", z); + json_string[z] = '\0'; + // 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, strlen(json_string), t, sizeof(t)/sizeof(t[0])); + //t[(BUFSIZ/sizeof(jsmntok_t))*2+1].type=JSMN_OBJECT; + printf("[\n%s\n]", json_string); + printf("[[%d]]\n",r); + 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; +} diff --git a/src/lib/jsmn/example/maptest2 b/src/lib/jsmn/example/maptest2 new file mode 100644 index 00000000..abc5640f Binary files /dev/null and b/src/lib/jsmn/example/maptest2 differ diff --git a/src/lib/jsmn/example/maptest2.c b/src/lib/jsmn/example/maptest2.c new file mode 100644 index 00000000..017fbf85 --- /dev/null +++ b/src/lib/jsmn/example/maptest2.c @@ -0,0 +1,170 @@ +#include +#include +#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. + */ + +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) { + 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; + jsmntok_t *tok; + size_t tokcount = 2; + + FILE *fh = fopen(mn, "r"); + + /* Prepare parser */ + jsmn_init(&p); + + /* Allocate some tokens as a start */ + tok = malloc(sizeof(*tok) * tokcount); + if (tok == NULL) { + fprintf(stderr, "malloc(): errno=%d\n", errno); + return 3; + } + + 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; + } + } + + 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; + } + } else { + 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; +} diff --git a/src/lib/jsmn/example/simple.c b/src/lib/jsmn/example/simple.c new file mode 100644 index 00000000..ca2902b5 --- /dev/null +++ b/src/lib/jsmn/example/simple.c @@ -0,0 +1,75 @@ +#include +#include +#include "../jsmn.c" + +/* + * A small example of jsmn parsing when JSON structure is known and number of + * tokens is predictable. + */ + +const char *JSON_STRING = + "{\"user\": \"johndoe\", \"admin\": false, \"uid\": 1000,\n " + "\"groups\": [\"users\", \"wheel\", \"audio\", \"video\"]}"; + +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; + jsmntok_t t[128]; /* We expect no more than 128 tokens */ + + jsmn_init(&p); + r = jsmn_parse(&p, JSON_STRING, strlen(JSON_STRING), t, sizeof(t)/sizeof(t[0])); + 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], "user") == 0) { + /* We may use strndup() to fetch string value */ + printf("- User: %.*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], "groups") == 0) { + int j; + printf("- Groups:\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); + } + } + return 0; +} diff --git a/src/lib/jsmn/jsmn.7z b/src/lib/jsmn/jsmn.7z deleted file mode 100644 index 58ba68e0..00000000 Binary files a/src/lib/jsmn/jsmn.7z and /dev/null differ diff --git a/src/lib/mapread.c b/src/lib/mapread.c index ed8ca99f..de1515a4 100644 --- a/src/lib/mapread.c +++ b/src/lib/mapread.c @@ -28,16 +28,19 @@ static int dump(const char *js, jsmntok_t *t, size_t count, int indent, /*char * */ //bgdata[q] = strtol(js+t->start, (char **)js+t->end, 10); //if(strtol(js+t->start, (char **)js+t->end, 10)==0){ /*printf("%d\n", sizeof(map->tiles->data->data));*/ fprintf(stderr, "\nFACK! %d\n", errno); exit(-1); } -// map->tiles->data->data[q] = (byte)strtol(js+t->start, (char **)js+t->end, 10); -// printf("%d[%d]", q, (byte)strtol(js+t->start, (char **)js+t->end, 10)); + //printf("%.*s", (t-1)->end - (t-1)->start, js+(t-1)->start); + map->tiles->data->data[q] = (byte)strtol(js+t->start, (char **)js+t->end, 0); + printf("[%d]", map->tiles->data->data[q]); } else if(js_sv == "height") { + //map->height = (int)malloc(sizeof(int)); 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)malloc(sizeof(int)); map->width = (int)strtol(js+t->start, (char **)js+t->end, 10); printf("w:[%d]\n", map->width); } @@ -50,7 +53,7 @@ static int dump(const char *js, jsmntok_t *t, size_t count, int indent, /*char * { // printf("[[[[%d|%d]]]]\n", &(t+1)->size, (t+1)->size); printf("\n%.*s[xx[%d|%d]xx]\n", (t+1)->end - (t+1)->start, js+(t+1)->start, &(t+1)->size, (t+1)->size); - map->data = malloc(sizeof(byte) * (t+1)->size +1); + map->data = malloc(sizeof(byte) * (t+1)->size); map->tiles = malloc(sizeof(tiles_t)); map->tiles->data = malloc(sizeof(bitmap_t)); map->tiles->data->width = (16*2); @@ -161,6 +164,7 @@ again: } } else { //printf("================================================================================%s================================================================================", js); + js_sv=malloc(sizeof(char)*10); dump(js, tok, p.toknext, 0, map, 0); eof_expected = 1; }