1 #include "src/lib/mapread.h"
3 int jsoneq(const char /*far*/ *json, jsmntok_t /*far*/ *tok, const char *s) {
4 if (tok->type == JSMN_STRING && (int) strlen(s) == tok->end - tok->start &&
5 strncmp(json + tok->start, s, tok->end - tok->start) == 0) {
11 //this function is quite messy ^^; sorry! it is a quick and dirty fix~
12 int dump(const char /*far*/ *js, jsmntok_t /*far*/ *t, size_t count, int indent, char *js_sv, map_t *map, int q) {
18 fprintf(stdout, "%s\n", js);
19 fprintf(stdout, "\n");
23 fprintf(stdout, "indent= [%d] ", indent);
24 fprintf(stdout, "js_sv= [%s]\n", js_sv);
29 /* We may want to do strtol() here to get numeric value */
30 if (t->type == JSMN_PRIMITIVE) {
31 if(strstr(js_sv, "data"))
34 here we should recursivly call dump again here to skip over the array until we get the facking width of the map.
35 so we can initiate the map which allocates the facking map->tiles->data->data properly and THEN we can return
36 here to read the data.... That is my design for this... wwww
38 FUCK well i am stuck.... wwww
40 //---- map->data[q] = (byte)strtol(js+t->start, (char **)t->end, 10);
41 map->data[q] = (byte)atoi(js+t->start);
43 fprintf(stdout, "%d[%d]", q, map->data[q]);
47 if(strstr(js_sv, "height"))
49 //---- map->height = (unsigned int)strtol(js+t->start, (char **)js+t->end, 10);
50 map->height = (unsigned int)atoi(js+t->start);
52 fprintf(stdout, "indent= [%d] ", indent);
53 fprintf(stdout, "h:[%d]\n", map->height);
55 }else if(strstr(js_sv, "width"))
57 //---- map->width = (unsigned int)strtol(js+t->start, (char **)js+t->end, 10);
58 map->width = (unsigned int)atoi(js+t->start);
60 fprintf(stdout, "indent= [%d] ", indent);
61 fprintf(stdout, "w:[%d]\n", map->width);
65 /* We may use strndup() to fetch string value */
66 } else if (t->type == JSMN_STRING) {
67 if(jsoneq(js, t, "data") == 0)
69 // fprintf(stdout, "[[[[%d|%d]]]]\n", &(t+1)->size, (t+1)->size);
70 // fprintf(stdout, "\n%.*s[xx[%d|%d]xx]\n", (t+1)->end - (t+1)->start, js+(t+1)->start, &(t+1)->size, (t+1)->size);
71 map->data = /*_f*/malloc(sizeof(byte) * (t+1)->size);
72 map->tiles = /*_f*/malloc(sizeof(tiles_t));
73 //map->tiles->data = malloc(sizeof(bitmap_t));
75 bp = bitmapLoadPcx("data/ed.pcx");
76 map->tiles->data = &bp;
77 //map->tiles->data->data = malloc((16/**2*/)*16);
78 //map->tiles->data->width = (16/**2*/);
\r
79 //map->tiles->data->height= 16;
\r
80 map->tiles->tileHeight = 16;
\r
81 map->tiles->tileWidth = 16;
\r
82 map->tiles->rows = 1;
\r
84 strcpy(js_sv, "data");//strdup(js+t->start);//, t->end - t->start);
87 if (jsoneq(js, t, "height") == 0 && indent<=1)
89 strcpy(js_sv, "height");//strdup(js+t->start);//, t->end - t->start);
90 }else if(jsoneq(js, t, "width") == 0 && indent<=1)
92 strcpy(js_sv, "width");//strdup(js+t->start);//, t->end - t->start);
93 }else strcpy(js_sv, "\0");
95 } else if (t->type == JSMN_OBJECT) {
96 //fprintf(stdout, "\n");
98 for (i = 0; i < t->size; i++) {
99 //for (k = 0; k < indent; k++) fprintf(stdout, "\t");
100 j += dump(js, t+1+j, count-j, indent+1, js_sv, map, i);
101 //fprintf(stdout, ": ");
102 j += dump(js, t+1+j, count-j, indent+1, js_sv, map, i);
103 //fprintf(stdout, "\n");
106 } else if (t->type == JSMN_ARRAY) {
108 //fprintf(stdout, "==\n");
109 for (i = 0; i < t->size; i++) {
110 //for (k = 0; k < indent-1; k++) fprintf(stdout, "\t");
111 //fprintf(stdout, "\t-");
112 j += dump(js, t+1+j, count-j, indent+1, js_sv, map, i);
113 //fprintf(stdout, "==\n");
120 int loadmap(char *mn, map_t *map)
124 int eof_expected = 0;
125 char /*far*/ *js = NULL;
128 static char js_ss[16];
131 jsmntok_t /*far*/ *tok;
134 FILE *fh = fopen(mn, "r");
139 /* Allocate some tokens as a start */
140 tok = /*_f*/malloc(sizeof(*tok) * tokcount);
142 fprintf(stderr, "malloc(): errno=%d\n", errno);
147 /* Read another chunk */
148 r = fread(buf, 1, sizeof(buf), fh);
150 fprintf(stderr, "fread(): %d, errno=%d\n", r, errno);
154 if (eof_expected != 0) {
157 fprintf(stderr, "fread(): unexpected EOF\n");
162 js = /*_f*/realloc(js, jslen + r + 1);
164 fprintf(stderr, "realloc(): errno = %d\n", errno);
167 strncpy(js + jslen, buf, r);
171 r = jsmn_parse(&p, js, jslen, tok, tokcount);
173 if (r == JSMN_ERROR_NOMEM) {
174 tokcount = tokcount * 2;
175 tok = /*_f*/realloc(tok, sizeof(*tok) * tokcount);
177 fprintf(stderr, "realloc(): errno=%d\n", errno);
183 dump(js, tok, p.toknext, incr, &js_ss, map, 0);