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 bp = bitmapLoadPcx("data/koishi^^.pcx");
80 bpp = planar_buf_from_bitmap0(&bp);
81 map->tiles->btdata = &bp;
82 //0000++++map->tiles->data = planar_buf_from_bitmap0(&bp);
83 map->tiles->data = bpp;
84 //map->tiles->data->data = malloc((16/**2*/)*16);
85 //map->tiles->data->width = (16/**2*/);
86 //map->tiles->data->height= 16;
87 map->tiles->tileHeight = 16;
88 map->tiles->tileWidth = 16;
91 map->tiles->debug_text=false;
92 strcpy(js_sv, "data");//strdup(js+t->start);//, t->end - t->start);
95 if (jsoneq(js, t, "height") == 0 && indent<=1)
97 strcpy(js_sv, "height");//strdup(js+t->start);//, t->end - t->start);
99 if(jsoneq(js, t, "width") == 0 && indent<=1)
101 strcpy(js_sv, "width");//strdup(js+t->start);//, t->end - t->start);
102 }else strcpy(js_sv, "\0");
104 } else if (t->type == JSMN_OBJECT) {
105 //fprintf(stdout, "\n");
107 for (i = 0; i < t->size; i++) {
108 //for (k = 0; k < indent; k++) fprintf(stdout, "\t");
109 j += dump(js, t+1+j, count-j, indent+1, js_sv, map, i);
110 //fprintf(stdout, ": ");
111 j += dump(js, t+1+j, count-j, indent+1, js_sv, map, i);
112 //fprintf(stdout, "\n");
115 } else if (t->type == JSMN_ARRAY) {
117 //fprintf(stdout, "==\n");
118 for (i = 0; i < t->size; i++) {
119 //for (k = 0; k < indent-1; k++) fprintf(stdout, "\t");
120 //fprintf(stdout, "\t-");
121 j += dump(js, t+1+j, count-j, indent+1, js_sv, map, i);
122 //fprintf(stdout, "==\n");
129 int loadmap(char *mn, map_t *map)
133 int eof_expected = 0;
137 static char js_ss[16];
143 FILE *fh = fopen(mn, "r");
148 /* Allocate some tokens as a start */
149 //0000fprintf(stderr, "tok malloc\n");
150 tok = malloc(sizeof(*tok) * tokcount);
152 fprintf(stderr, "malloc(): errno=%d\n", errno);
157 /* Read another chunk */
158 //0000fprintf(stderr, "read\n");
159 r = fread(buf, 1, sizeof(buf), fh);
161 fprintf(stderr, "fread(): %d, errno=%d\n", r, errno);
165 if (eof_expected != 0) {
168 fprintf(stderr, "fread(): unexpected EOF\n");
172 //0000fprintf(stdout, "r= [%d] BUFSIZ=%d\n", r, BUFSIZ);
173 //0000fprintf(stderr, "js alloc~\n");
174 js = realloc(js, jslen + r + 1);
176 fprintf(stderr, "*js=%Fp\n", *js);
177 fprintf(stderr, "realloc(): errno = %d\n", errno);
180 strncpy(js + jslen, buf, r);
184 //0000fprintf(stdout, " parse~ tok=%zu jslen=%zu r=%d _memavl()=%u BUFSIZ=%d~\n", tokcount, jslen, r, _memavl(), BUFSIZ);
185 //0000fprintf(stdout, "p=[%u] [%u] [%d]\n", p.pos, p.toknext, p.toksuper);
187 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
189 r = jsmn_parse(&p, js, jslen, tok, tokcount);
190 //0000fprintf(stdout, "r= [%d]\n", r);
192 if (r == JSMN_ERROR_NOMEM) {
193 tokcount = tokcount * 2;
194 //0000fprintf(stderr, "tok realloc~ %zu\n", tokcount);
195 tok = realloc(tok, sizeof(*tok) * tokcount);
197 fprintf(stderr, "realloc(): errno=%d\n", errno);
203 //printf("js=%Fp\n", (js));
204 //printf("*js=%Fp\n", (*(js)));
205 //printf("&*js=%s\n", &(*(js)));
206 //printf("&buf=[%Fp]\n", &buf);
207 //printf("&buf_seg=[%x]\n", FP_SEG(&buf));
208 //printf("&buf_off=[%x]\n", FP_OFF(&buf));
209 //printf("&buf_fp=[%Fp]\n", MK_FP(FP_SEG(&buf), FP_OFF(&buf)));
210 //printf("buf=[\n%s\n]\n", buf);
211 //printf("buff=[%Fp]\n", buff);
212 //printf("(*buff)=[%Fp]\n", (*buff));
213 //printf("&(*buff)=[\n%s\n]\n", &(*buff));
214 #ifdef DEBUG_DUMPVARS
215 fprintf(stdout, "running dump~\n");
217 dump(js, tok, p.toknext, incr, &js_ss, map, 0);