1 #include "src/lib/mapread.h"
3 int jsoneq(const char huge *json, jsmntok_t huge *tok, const char huge *s) {
4 if (tok->type == JSMN_STRING && (int)_fstrlen(s) == tok->end - tok->start &&
5 _fstrncmp((char const *)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 huge *js, jsmntok_t huge *t, size_t count, word indent, char *js_sv, map_t *map, unsigned long 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(_fstrstr(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)strtol(js+t->start, (char **)t->end, 10);
45 map->data[q] = (byte)atoi((const char *)js+t->start);
47 fprintf(stdout, "%d[%d]", q, map->data[q]);
51 if(_fstrstr(js_sv, "height"))
53 //---- map->height = (unsigned int)strtol(js+t->start, (char **)js+t->end, 10);
54 map->height = atoi((const char *)js+t->start);
56 fprintf(stdout, "indent= [%d] ", indent);
57 fprintf(stdout, "h:[%d]\n", map->height);
59 }else if(_fstrstr(js_sv, "width"))
61 //---- map->width = (unsigned int)strtol(js+t->start, (char **)js+t->end, 10);
62 map->width = atoi((const char *)js+t->start);
64 fprintf(stdout, "indent= [%d] ", indent);
65 fprintf(stdout, "w:[%d]\n", map->width);
69 /* We may use strndup() to fetch string value */
70 } else if (t->type == JSMN_STRING) {
71 if(jsoneq(js, t, "data") == 0)
73 // fprintf(stdout, "[[[[%d|%d]]]]\n", &(t+1)->size, (t+1)->size);
74 // 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);
75 map->data = halloc(sizeof(byte) * (t+1)->size, sizeof(byte));
76 //map->data = malloc(sizeof(byte) * (t+1)->size);
77 map->tiles = /*_f*/malloc(sizeof(tiles_t));
78 //map->tiles->data = malloc(sizeof(bitmap_t));
80 bp = bitmapLoadPcx("data/ed.pcx");
81 map->tiles->data = &bp;
82 //map->tiles->data->data = malloc((16/**2*/)*16);
83 //map->tiles->data->width = (16/**2*/);
\r
84 //map->tiles->data->height= 16;
\r
85 map->tiles->tileHeight = 16;
\r
86 map->tiles->tileWidth = 16;
\r
87 map->tiles->rows = 1;
\r
89 _fstrcpy(js_sv, "data");//strdup(js+t->start);//, t->end - t->start);
92 if (jsoneq(js, t, "height") == 0 && indent<=1)
94 _fstrcpy(js_sv, "height");//strdup(js+t->start);//, t->end - t->start);
96 if(jsoneq(js, t, "width") == 0 && indent<=1)
98 _fstrcpy(js_sv, "width");//strdup(js+t->start);//, t->end - t->start);
99 }else _fstrcpy(js_sv, "\0");
101 } else if (t->type == JSMN_OBJECT) {
102 //fprintf(stdout, "\n");
104 for (i = 0; i < t->size; i++) {
105 //for (k = 0; k < indent; k++) fprintf(stdout, "\t");
106 j += dump(js, t+1+j, count-j, indent+1, js_sv, map, i);
107 //fprintf(stdout, ": ");
108 j += dump(js, t+1+j, count-j, indent+1, js_sv, map, i);
109 //fprintf(stdout, "\n");
112 } else if (t->type == JSMN_ARRAY) {
114 //fprintf(stdout, "==\n");
115 for (i = 0; i < t->size; i++) {
116 //for (k = 0; k < indent-1; k++) fprintf(stdout, "\t");
117 //fprintf(stdout, "\t-");
118 j += dump(js, t+1+j, count-j, indent+1, js_sv, map, i);
119 //fprintf(stdout, "==\n");
126 int loadmap(char *mn, map_t *map)
130 int eof_expected = 0;
131 char huge *js = NULL;
134 char huge *buff = &buf;
135 static char js_ss[16];
141 FILE *fh = fopen(mn, "r");
146 /* Allocate some tokens as a start */
147 //0000fprintf(stderr, "tok malloc\n");
148 tok = _fmalloc(sizeof(*tok) * tokcount);
150 fprintf(stderr, "malloc(): errno=%d\n", errno);
155 /* Read another chunk */
156 //0000fprintf(stderr, "read\n");
157 r = fread(buf, 1, sizeof(buf), fh);
159 fprintf(stderr, "fread(): %d, errno=%d\n", r, errno);
163 if (eof_expected != 0) {
166 fprintf(stderr, "fread(): unexpected EOF\n");
170 //0000fprintf(stdout, "r= [%d] BUFSIZ=%d\n", r, BUFSIZ);
171 //0000fprintf(stderr, "js alloc~\n");
172 js = _frealloc(js, jslen + r + 1);
174 fprintf(stderr, "*js=%Fp\n", *js);
175 fprintf(stderr, "realloc(): errno = %d\n", errno);
178 _fstrncpy(js + jslen, &(*buff), r);
182 //fprintf(stdout, " parse~ tok=%zu jslen=%zu r=%d _memavl()=%u BUFSIZ=%d~\n", tokcount, jslen, r, _memavl(), BUFSIZ);
184 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
186 r = jsmn_parse(&p, js, jslen, tok, tokcount);
187 //0000fprintf(stdout, "r= [%d]\n", r);
189 if (r == JSMN_ERROR_NOMEM) {
190 tokcount = tokcount * 2;
191 //0000fprintf(stderr, "tok realloc~ %zu\n", tokcount);
192 tok = _frealloc(tok, sizeof(*tok) * tokcount);
194 fprintf(stderr, "realloc(): errno=%d\n", errno);
200 //printf("js=%Fp\n", (js));
201 //printf("*js=%Fp\n", (*(js)));
202 //printf("&*js=%s\n", &(*(js)));
203 //printf("&buf=[%Fp]\n", &buf);
204 //printf("&buf_seg=[%x]\n", FP_SEG(&buf));
205 //printf("&buf_off=[%x]\n", FP_OFF(&buf));
206 //printf("&buf_fp=[%Fp]\n", MK_FP(FP_SEG(&buf), FP_OFF(&buf)));
207 //printf("buf=[\n%s\n]\n", buf);
208 //printf("buff=[%Fp]\n", buff);
209 //printf("(*buff)=[%Fp]\n", (*buff));
210 //printf("&(*buff)=[\n%s\n]\n", &(*buff));
211 #ifdef DEBUG_DUMPVARS
212 fprintf(stdout, "running dump~\n");
214 dump(js, tok, p.toknext, incr, &js_ss, map, 0);