]> 4ch.mooo.com Git - 16.git/blob - src/lib/mapread.c
7713597a515af6aa6dac553f170eb2edcddd52d1
[16.git] / src / lib / mapread.c
1 #include "src/lib/mapread.h"
2
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) {
6                 return 0;
7         }
8         return -1;
9 }
10
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) {
13         dword i;
14         word j;//, k;
15         bitmap_t bp;
16         planar_buf_t bpp;
17         #ifdef DEBUG_JS
18         if(indent==0)
19         {
20                 fprintf(stdout, "%s\n", js);
21                 fprintf(stdout, "\n");
22         }
23         #endif
24         #ifdef DEBUG_DUMPVARS
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);
29         #endif
30         if (count == 0) {
31                 return 0;
32         }
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"))
37                 {
38                         /*
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
42
43                                 FUCK well i am stuck.... wwww
44                         */
45                         map->data[q] = (byte)atoi(js+t->start);
46                         #ifdef DEBUG_MAPDATA
47                                 fprintf(stdout, "%d[%d]", q, map->data[q]);
48                         #endif
49                 }
50                 else
51                 if(strstr(js_sv, "height"))
52                 {
53                         map->height = atoi(js+t->start);
54                         #ifdef DEBUG_MAPVAR
55                         fprintf(stdout, "indent= [%d]   ", indent);
56                         fprintf(stdout, "h:[%d]\n", map->height);
57                         #endif
58                 }else if(strstr(js_sv, "width"))
59                 {
60                         map->width = atoi(js+t->start);
61                         #ifdef DEBUG_MAPVAR
62                         fprintf(stdout, "indent= [%d]   ", indent);
63                         fprintf(stdout, "w:[%d]\n", map->width);
64                         #endif
65                 }
66                 return 1;
67                 /* We may use strndup() to fetch string value */
68         } else if (t->type == JSMN_STRING) {
69                 if(jsoneq(js, t, "data") == 0)
70                 {
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));
77                         //fix this to be far~
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;
88                         map->tiles->rows = 1;
89                         map->tiles->cols = 1;
90                         map->tiles->debug_text=false;
91                         strcpy(js_sv, "data");//strdup(js+t->start);//, t->end - t->start);
92                 }
93                 else
94                 if (jsoneq(js, t, "height") == 0 && indent<=1)
95                 {
96                         strcpy(js_sv, "height");//strdup(js+t->start);//, t->end - t->start);
97                 }else
98                 if(jsoneq(js, t, "width") == 0 && indent<=1)
99                 {
100                         strcpy(js_sv, "width");//strdup(js+t->start);//, t->end - t->start);
101                 }else strcpy(js_sv, "\0");
102                 return 1;
103         } else if (t->type == JSMN_OBJECT) {
104                 //fprintf(stdout, "\n");
105                 j = 0;
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");
112                 }
113                 return j+1;
114         } else if (t->type == JSMN_ARRAY) {
115                 j = 0;
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");
122                 }
123                 return j+1;
124         }
125         return 0;
126 }
127
128 int loadmap(char *mn, map_t *map)
129 {
130         int r;
131         static word incr=0;
132         int eof_expected = 0;
133         char *js = NULL;
134         size_t jslen = 0;
135         char buf[BUFSIZ];
136         static char js_ss[16];
137
138         jsmn_parser p;
139         jsmntok_t *tok;
140         size_t tokcount = 2;
141
142         FILE *fh = fopen(mn, "r");
143
144         /* Prepare parser */
145         jsmn_init(&p);
146
147         /* Allocate some tokens as a start */
148 //0000fprintf(stderr, "tok malloc\n");
149         tok = malloc(sizeof(*tok) * tokcount);
150         if (tok == NULL) {
151                 fprintf(stderr, "malloc(): errno=%d\n", errno);
152                 return 3;
153         }
154
155         for (;;) {
156                 /* Read another chunk */
157 //0000fprintf(stderr, "read\n");
158                 r = fread(buf, 1, sizeof(buf), fh);
159                 if (r < 0) {
160                         fprintf(stderr, "fread(): %d, errno=%d\n", r, errno);
161                         return 1;
162                 }
163                 if (r == 0) {
164                         if (eof_expected != 0) {
165                                 return 0;
166                         } else {
167                                 fprintf(stderr, "fread(): unexpected EOF\n");
168                                 return 2;
169                         }
170                 }
171 //0000fprintf(stdout, "r=       [%d]    BUFSIZ=%d\n", r, BUFSIZ);
172 //0000fprintf(stderr, "js alloc~\n");
173                 js = realloc(js, jslen + r + 1);
174                 if (js == NULL) {
175                         fprintf(stderr, "*js=%Fp\n", *js);
176                         fprintf(stderr, "realloc(): errno = %d\n", errno);
177                         return 3;
178                 }
179                 strncpy(js + jslen, buf, r);
180                 jslen = jslen + r;
181
182 again:
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);
185 /*
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
187 */
188                 r = jsmn_parse(&p, js, jslen, tok, tokcount);
189 //0000fprintf(stdout, "r=       [%d]\n", r);
190                 if (r < 0) {
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);
195                                 if (tok == NULL) {
196                                         fprintf(stderr, "realloc(): errno=%d\n", errno);
197                                         return 3;
198                                 }
199                                 goto again;
200                         }
201                 } else {
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");
215                         #endif
216                         dump(js, tok, p.toknext, incr, &js_ss, map, 0);
217                         eof_expected = 1;
218                 }
219         }
220
221         free(js);
222         free(tok);
223         fclose(fh);
224
225         return 0;
226 }