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) {
19 fprintf(stdout, "%s\n", js);
20 fprintf(stdout, "\n");
24 fprintf(stdout, "t->size=[%d] ", t->size);
25 fprintf(stdout, "q=[%d] ", q);
26 fprintf(stdout, "indent= [%d] ", indent);
27 fprintf(stdout, "js_sv= [%s]\n", js_sv);
32 /* We may want to do strtol() here to get numeric value */
33 //0000fprintf(stderr, "t->type=%d\n", t->type);
34 if (t->type == JSMN_PRIMITIVE) {
35 if(strstr(js_sv, "data"))
38 here we should recursivly call dump again here to skip over the array until we get the facking width of the map.
39 so we can initiate the map which allocates the facking map->tiles->data->data properly and THEN we can return
40 here to read the data.... That is my design for this... wwww
42 FUCK well i am stuck.... wwww
44 map->data[q] = (byte)atoi(js+t->start);
46 fprintf(stdout, "%d[%d]", q, map->data[q]);
50 if(strstr(js_sv, "height"))
52 map->height = atoi(js+t->start);
54 fprintf(stdout, "indent= [%d] ", indent);
55 fprintf(stdout, "h:[%d]\n", map->height);
57 }else if(strstr(js_sv, "width"))
59 map->width = atoi(js+t->start);
61 fprintf(stdout, "indent= [%d] ", indent);
62 fprintf(stdout, "w:[%d]\n", map->width);
66 /* We may use strndup() to fetch string value */
67 } else if (t->type == JSMN_STRING) {
68 if(jsoneq(js, t, "data") == 0)
70 // fprintf(stdout, "[[[[%d|%d]]]]\n", &(t+1)->size, (t+1)->size);
71 // 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);
72 map->data = malloc(sizeof(byte) * (t+1)->size);
73 map->tiles = malloc(sizeof(tiles_t));
74 //map->tiles->data = malloc(sizeof(bitmap_t));
76 bp = bitmapLoadPcx("data/ed.pcx");
77 map->tiles->data = &bp;
78 //map->tiles->data->data = malloc((16/**2*/)*16);
79 //map->tiles->data->width = (16/**2*/);
\r
80 //map->tiles->data->height= 16;
\r
81 map->tiles->tileHeight = 16;
\r
82 map->tiles->tileWidth = 16;
\r
83 map->tiles->rows = 1;
\r
85 strcpy(js_sv, "data");//strdup(js+t->start);//, t->end - t->start);
88 if (jsoneq(js, t, "height") == 0 && indent<=1)
90 strcpy(js_sv, "height");//strdup(js+t->start);//, t->end - t->start);
92 if(jsoneq(js, t, "width") == 0 && indent<=1)
94 strcpy(js_sv, "width");//strdup(js+t->start);//, t->end - t->start);
95 }else strcpy(js_sv, "\0");
97 } else if (t->type == JSMN_OBJECT) {
98 //fprintf(stdout, "\n");
100 for (i = 0; i < t->size; i++) {
101 //for (k = 0; k < indent; k++) fprintf(stdout, "\t");
102 j += dump(js, t+1+j, count-j, indent+1, js_sv, map, i);
103 //fprintf(stdout, ": ");
104 j += dump(js, t+1+j, count-j, indent+1, js_sv, map, i);
105 //fprintf(stdout, "\n");
108 } else if (t->type == JSMN_ARRAY) {
110 //fprintf(stdout, "==\n");
111 for (i = 0; i < t->size; i++) {
112 //for (k = 0; k < indent-1; k++) fprintf(stdout, "\t");
113 //fprintf(stdout, "\t-");
114 j += dump(js, t+1+j, count-j, indent+1, js_sv, map, i);
115 //fprintf(stdout, "==\n");
122 int loadmap(char *mn, map_t *map)
126 int eof_expected = 0;
130 //---- char *buff = &buf;
131 static char js_ss[16];
137 FILE *fh = fopen(mn, "r");
142 /* Allocate some tokens as a start */
143 //0000fprintf(stderr, "tok malloc\n");
144 tok = malloc(sizeof(*tok) * tokcount);
146 fprintf(stderr, "malloc(): errno=%d\n", errno);
151 /* Read another chunk */
152 //0000fprintf(stderr, "read\n");
153 r = fread(buf, 1, sizeof(buf), fh);
155 fprintf(stderr, "fread(): %d, errno=%d\n", r, errno);
159 if (eof_expected != 0) {
162 fprintf(stderr, "fread(): unexpected EOF\n");
166 //0000fprintf(stdout, "r= [%d] BUFSIZ=%d\n", r, BUFSIZ);
167 //0000fprintf(stderr, "js alloc~\n");
168 js = realloc(js, jslen + r + 1);
170 fprintf(stderr, "*js=%Fp\n", *js);
171 fprintf(stderr, "realloc(): errno = %d\n", errno);
174 strncpy(js + jslen, buf, r);
178 //0000fprintf(stdout, " parse~ tok=%zu jslen=%zu r=%d _memavl()=%u BUFSIZ=%d~\n", tokcount, jslen, r, _memavl(), BUFSIZ);
179 //0000fprintf(stdout, "p=[%u] [%u] [%d]\n", p.pos, p.toknext, p.toksuper);
181 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
183 r = jsmn_parse(&p, js, jslen, tok, tokcount);
184 //0000fprintf(stdout, "r= [%d]\n", r);
186 if (r == JSMN_ERROR_NOMEM) {
187 tokcount = tokcount * 2;
188 //0000fprintf(stderr, "tok realloc~ %zu\n", tokcount);
189 tok = realloc(tok, sizeof(*tok) * tokcount);
191 fprintf(stderr, "realloc(): errno=%d\n", errno);
197 //printf("js=%Fp\n", (js));
198 //printf("*js=%Fp\n", (*(js)));
199 //printf("&*js=%s\n", &(*(js)));
200 //printf("&buf=[%Fp]\n", &buf);
201 //printf("&buf_seg=[%x]\n", FP_SEG(&buf));
202 //printf("&buf_off=[%x]\n", FP_OFF(&buf));
203 //printf("&buf_fp=[%Fp]\n", MK_FP(FP_SEG(&buf), FP_OFF(&buf)));
204 //printf("buf=[\n%s\n]\n", buf);
205 //printf("buff=[%Fp]\n", buff);
206 //printf("(*buff)=[%Fp]\n", (*buff));
207 //printf("&(*buff)=[\n%s\n]\n", &(*buff));
208 #ifdef DEBUG_DUMPVARS
209 fprintf(stdout, "running dump~\n");
211 dump(js, tok, p.toknext, incr, &js_ss, map, 0);