]> 4ch.mooo.com Git - 16.git/blob - src/lib/mapread.c
205bf39a6ca32163ce9c483d6e58d9038973fa8f
[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         #ifdef DEBUG_JS
17         if(indent==0)
18         {
19                 fprintf(stdout, "%s\n", js);
20                 fprintf(stdout, "\n");
21         }
22         #endif
23         #ifdef DEBUG_DUMPVARS
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);
28         #endif
29         if (count == 0) {
30                 return 0;
31         }
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"))
36                 {
37                         /*
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
41
42                                 FUCK well i am stuck.... wwww
43                         */
44                         map->data[q] = (byte)atoi(js+t->start);
45                         #ifdef DEBUG_MAPDATA
46                                 fprintf(stdout, "%d[%d]", q, map->data[q]);
47                         #endif
48                 }
49                 else
50                 if(strstr(js_sv, "height"))
51                 {
52                         map->height = atoi(js+t->start);
53                         #ifdef DEBUG_MAPVAR
54                         fprintf(stdout, "indent= [%d]   ", indent);
55                         fprintf(stdout, "h:[%d]\n", map->height);
56                         #endif
57                 }else if(strstr(js_sv, "width"))
58                 {
59                         map->width = atoi(js+t->start);
60                         #ifdef DEBUG_MAPVAR
61                         fprintf(stdout, "indent= [%d]   ", indent);
62                         fprintf(stdout, "w:[%d]\n", map->width);
63                         #endif
64                 }
65                 return 1;
66                 /* We may use strndup() to fetch string value */
67         } else if (t->type == JSMN_STRING) {
68                 if(jsoneq(js, t, "data") == 0)
69                 {
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));
75                         //fix this to be far~
76                         bp = bitmapLoadPcx("data/ed.pcx");
77                         map->tiles->btdata = &bp;
78                         //map->tiles->data->data = malloc((16/**2*/)*16);
79                         //map->tiles->data->width = (16/**2*/);
80                         //map->tiles->data->height= 16;
81                         map->tiles->tileHeight = 16;
82                         map->tiles->tileWidth = 16;
83                         map->tiles->rows = 1;
84                         map->tiles->cols = 1;
85                         map->tiles->debug_text=false;
86                         strcpy(js_sv, "data");//strdup(js+t->start);//, t->end - t->start);
87                 }
88                 else
89                 if (jsoneq(js, t, "height") == 0 && indent<=1)
90                 {
91                         strcpy(js_sv, "height");//strdup(js+t->start);//, t->end - t->start);
92                 }else
93                 if(jsoneq(js, t, "width") == 0 && indent<=1)
94                 {
95                         strcpy(js_sv, "width");//strdup(js+t->start);//, t->end - t->start);
96                 }else strcpy(js_sv, "\0");
97                 return 1;
98         } else if (t->type == JSMN_OBJECT) {
99                 //fprintf(stdout, "\n");
100                 j = 0;
101                 for (i = 0; i < t->size; i++) {
102                         //for (k = 0; k < indent; k++) fprintf(stdout, "\t");
103                         j += dump(js, t+1+j, count-j, indent+1, js_sv, map, i);
104                         //fprintf(stdout, ": ");
105                         j += dump(js, t+1+j, count-j, indent+1, js_sv, map, i);
106                         //fprintf(stdout, "\n");
107                 }
108                 return j+1;
109         } else if (t->type == JSMN_ARRAY) {
110                 j = 0;
111                 //fprintf(stdout, "==\n");
112                 for (i = 0; i < t->size; i++) {
113                         //for (k = 0; k < indent-1; k++) fprintf(stdout, "\t");
114                         //fprintf(stdout, "\t-");
115                         j += dump(js, t+1+j, count-j, indent+1, js_sv, map, i);
116                         //fprintf(stdout, "==\n");
117                 }
118                 return j+1;
119         }
120         return 0;
121 }
122
123 int loadmap(char *mn, map_t *map)
124 {
125         int r;
126         static word incr=0;
127         int eof_expected = 0;
128         char *js = NULL;
129         size_t jslen = 0;
130         char buf[BUFSIZ];
131         static char js_ss[16];
132
133         jsmn_parser p;
134         jsmntok_t *tok;
135         size_t tokcount = 2;
136
137         FILE *fh = fopen(mn, "r");
138
139         /* Prepare parser */
140         jsmn_init(&p);
141
142         /* Allocate some tokens as a start */
143 //0000fprintf(stderr, "tok malloc\n");
144         tok = malloc(sizeof(*tok) * tokcount);
145         if (tok == NULL) {
146                 fprintf(stderr, "malloc(): errno=%d\n", errno);
147                 return 3;
148         }
149
150         for (;;) {
151                 /* Read another chunk */
152 //0000fprintf(stderr, "read\n");
153                 r = fread(buf, 1, sizeof(buf), fh);
154                 if (r < 0) {
155                         fprintf(stderr, "fread(): %d, errno=%d\n", r, errno);
156                         return 1;
157                 }
158                 if (r == 0) {
159                         if (eof_expected != 0) {
160                                 return 0;
161                         } else {
162                                 fprintf(stderr, "fread(): unexpected EOF\n");
163                                 return 2;
164                         }
165                 }
166 //0000fprintf(stdout, "r=       [%d]    BUFSIZ=%d\n", r, BUFSIZ);
167 //0000fprintf(stderr, "js alloc~\n");
168                 js = realloc(js, jslen + r + 1);
169                 if (js == NULL) {
170                         fprintf(stderr, "*js=%Fp\n", *js);
171                         fprintf(stderr, "realloc(): errno = %d\n", errno);
172                         return 3;
173                 }
174                 strncpy(js + jslen, buf, r);
175                 jslen = jslen + r;
176
177 again:
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);
180 /*
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
182 */
183                 r = jsmn_parse(&p, js, jslen, tok, tokcount);
184 //0000fprintf(stdout, "r=       [%d]\n", r);
185                 if (r < 0) {
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);
190                                 if (tok == NULL) {
191                                         fprintf(stderr, "realloc(): errno=%d\n", errno);
192                                         return 3;
193                                 }
194                                 goto again;
195                         }
196                 } else {
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");
210                         #endif
211                         dump(js, tok, p.toknext, incr, &js_ss, map, 0);
212                         eof_expected = 1;
213                 }
214         }
215
216         free(js);
217         free(tok);
218         fclose(fh);
219
220         return 0;
221 }