1 #include "src/lib/mapread.h"
3 int jsoneq(const char *json, jsmntok_t *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 word dump(const char *js, jsmntok_t *t, size_t count, word indent, char *js_sv, map_t *map, dword q) {
20 fprintf(stdout, "%s\n", js);
21 fprintf(stdout, "\n");
25 fprintf(stdout, "t->size=[%d] ", t->size);
26 fprintf(stdout, "q=[%d] ", q);
27 fprintf(stdout, "indent= [%d] ", indent);
28 fprintf(stdout, "js_sv= [%s]\n", js_sv);
33 /* We may want to do strtol() here to get numeric value */
34 //0000fprintf(stderr, "t->type=%d\n", t->type);
35 if (t->type == JSMN_PRIMITIVE) {
36 if(strstr(js_sv, "data"))
39 here we should recursivly call dump again here to skip over the array until we get the facking width of the map.
40 so we can initiate the map which allocates the facking map->tiles->data->data properly and THEN we can return
41 here to read the data.... That is my design for this... wwww
43 FUCK well i am stuck.... wwww
45 map->data[q] = (byte)atoi(js+t->start);
47 fprintf(stdout, "%d[%d]", q, map->data[q]);
51 if(strstr(js_sv, "height"))
53 map->height = atoi(js+t->start);
55 fprintf(stdout, "indent= [%d] ", indent);
56 fprintf(stdout, "h:[%d]\n", map->height);
58 }else if(strstr(js_sv, "width"))
60 map->width = atoi(js+t->start);
62 fprintf(stdout, "indent= [%d] ", indent);
63 fprintf(stdout, "w:[%d]\n", map->width);
67 /* We may use strndup() to fetch string value */
68 } else if (t->type == JSMN_STRING) {
69 if(jsoneq(js, t, "data") == 0)
71 // fprintf(stdout, "[[[[%d|%d]]]]\n", &(t+1)->size, (t+1)->size);
72 // 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);
73 map->data = malloc(sizeof(byte) * (t+1)->size);
74 map->tiles = malloc(sizeof(tiles_t));
75 map->tiles->btdata = malloc(sizeof(bitmap_t));
76 map->tiles->btdata = malloc(sizeof(bitmap_t));
78 bp = bitmapLoadPcx("data/ed.pcx");
79 bpp = planar_buf_from_bitmap0(&bp);
80 map->tiles->btdata = &bp;
81 //0000++++map->tiles->data = planar_buf_from_bitmap0(&bp);
82 map->tiles->data = bpp;
83 //map->tiles->data->data = malloc((16/**2*/)*16);
84 //map->tiles->data->width = (16/**2*/);
85 //map->tiles->data->height= 16;
86 map->tiles->tileHeight = 16;
87 map->tiles->tileWidth = 16;
90 map->tiles->debug_text=false;
91 strcpy(js_sv, "data");//strdup(js+t->start);//, t->end - t->start);
94 if (jsoneq(js, t, "height") == 0 && indent<=1)
96 strcpy(js_sv, "height");//strdup(js+t->start);//, t->end - t->start);
98 if(jsoneq(js, t, "width") == 0 && indent<=1)
100 strcpy(js_sv, "width");//strdup(js+t->start);//, t->end - t->start);
101 }else strcpy(js_sv, "\0");
103 } else if (t->type == JSMN_OBJECT) {
104 //fprintf(stdout, "\n");
106 for (i = 0; i < t->size; i++) {
107 //for (k = 0; k < indent; k++) fprintf(stdout, "\t");
108 j += dump(js, t+1+j, count-j, indent+1, js_sv, map, i);
109 //fprintf(stdout, ": ");
110 j += dump(js, t+1+j, count-j, indent+1, js_sv, map, i);
111 //fprintf(stdout, "\n");
114 } else if (t->type == JSMN_ARRAY) {
116 //fprintf(stdout, "==\n");
117 for (i = 0; i < t->size; i++) {
118 //for (k = 0; k < indent-1; k++) fprintf(stdout, "\t");
119 //fprintf(stdout, "\t-");
120 j += dump(js, t+1+j, count-j, indent+1, js_sv, map, i);
121 //fprintf(stdout, "==\n");
128 int loadmap(char *mn, map_t *map)
132 int eof_expected = 0;
136 static char js_ss[16];
142 FILE *fh = fopen(mn, "r");
147 /* Allocate some tokens as a start */
148 //0000fprintf(stderr, "tok malloc\n");
149 tok = malloc(sizeof(*tok) * tokcount);
151 fprintf(stderr, "malloc(): errno=%d\n", errno);
156 /* Read another chunk */
157 //0000fprintf(stderr, "read\n");
158 r = fread(buf, 1, sizeof(buf), fh);
160 fprintf(stderr, "fread(): %d, errno=%d\n", r, errno);
164 if (eof_expected != 0) {
167 fprintf(stderr, "fread(): unexpected EOF\n");
171 //0000fprintf(stdout, "r= [%d] BUFSIZ=%d\n", r, BUFSIZ);
172 //0000fprintf(stderr, "js alloc~\n");
173 js = realloc(js, jslen + r + 1);
175 fprintf(stderr, "*js=%Fp\n", *js);
176 fprintf(stderr, "realloc(): errno = %d\n", errno);
179 strncpy(js + jslen, buf, r);
183 //0000fprintf(stdout, " parse~ tok=%zu jslen=%zu r=%d _memavl()=%u BUFSIZ=%d~\n", tokcount, jslen, r, _memavl(), BUFSIZ);
184 //0000fprintf(stdout, "p=[%u] [%u] [%d]\n", p.pos, p.toknext, p.toksuper);
186 I think it crashes on the line below when it tries to parse the data of huge maps... wwww this is a jsmn problem wwww
188 r = jsmn_parse(&p, js, jslen, tok, tokcount);
189 //0000fprintf(stdout, "r= [%d]\n", r);
191 if (r == JSMN_ERROR_NOMEM) {
192 tokcount = tokcount * 2;
193 //0000fprintf(stderr, "tok realloc~ %zu\n", tokcount);
194 tok = realloc(tok, sizeof(*tok) * tokcount);
196 fprintf(stderr, "realloc(): errno=%d\n", errno);
202 //printf("js=%Fp\n", (js));
203 //printf("*js=%Fp\n", (*(js)));
204 //printf("&*js=%s\n", &(*(js)));
205 //printf("&buf=[%Fp]\n", &buf);
206 //printf("&buf_seg=[%x]\n", FP_SEG(&buf));
207 //printf("&buf_off=[%x]\n", FP_OFF(&buf));
208 //printf("&buf_fp=[%Fp]\n", MK_FP(FP_SEG(&buf), FP_OFF(&buf)));
209 //printf("buf=[\n%s\n]\n", buf);
210 //printf("buff=[%Fp]\n", buff);
211 //printf("(*buff)=[%Fp]\n", (*buff));
212 //printf("&(*buff)=[\n%s\n]\n", &(*buff));
213 #ifdef DEBUG_DUMPVARS
214 fprintf(stdout, "running dump~\n");
216 dump(js, tok, p.toknext, incr, &js_ss, map, 0);