]> 4ch.mooo.com Git - 16.git/blob - src/lib/mapread.c
aa9761ec623d25ce7c35cd46604c96eef6dc4ddb
[16.git] / src / lib / mapread.c
1 #include "src/lib/mapread.h"
2
3 int jsoneq(const char /*far*/ *json, jsmntok_t /*far*/ *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 int dump(const char /*far*/ *js, jsmntok_t /*far*/ *t, size_t count, int indent, char *js_sv, map_t *map, int q) {
13         int i, j, k;
14         bitmap_t bp;
15         #ifdef DEBUG_JS
16         if(indent==0)
17         {
18                 fprintf(stdout, "%s\n", js);
19                 fprintf(stdout, "\n");
20         }
21         #endif
22         #ifdef DEBUG_DUMPVARS
23         fprintf(stdout, "indent= [%d]   ", indent);
24         fprintf(stdout, "js_sv= [%s]\n", js_sv);
25         #endif
26         if (count == 0) {
27                 return 0;
28         }
29         /* We may want to do strtol() here to get numeric value */
30         if (t->type == JSMN_PRIMITIVE) {
31                 if(strstr(js_sv, "data"))
32                 {
33                         /*
34                                 here we should recursivly call dump again here to skip over the array until we get the facking width of the map.
35                                 so we can initiate the map which allocates the facking map->tiles->data->data properly and THEN we can return
36                                 here to read the data.... That is my design for this... wwww
37
38                                 FUCK well i am stuck.... wwww
39                         */
40 //----                  map->data[q] = (byte)strtol(js+t->start, (char **)t->end, 10);
41                         map->data[q] = (byte)atoi(js+t->start);
42                         #ifdef DEBUG_MAPDATA
43                                 fprintf(stdout, "%d[%d]", q, map->data[q]);
44                         #endif
45                 }
46                 else
47                 if(strstr(js_sv, "height"))
48                 {
49 //----                  map->height = (unsigned int)strtol(js+t->start, (char **)js+t->end, 10);
50                         map->height = (unsigned int)atoi(js+t->start);
51                         #ifdef DEBUG_MAPVAR
52                         fprintf(stdout, "indent= [%d]   ", indent);
53                         fprintf(stdout, "h:[%d]\n", map->height);
54                         #endif
55                 }else if(strstr(js_sv, "width"))
56                 {
57 //----                  map->width = (unsigned int)strtol(js+t->start, (char **)js+t->end, 10);
58                         map->width = (unsigned int)atoi(js+t->start);
59                         #ifdef DEBUG_MAPVAR
60                         fprintf(stdout, "indent= [%d]   ", indent);
61                         fprintf(stdout, "w:[%d]\n", map->width);
62                         #endif
63                 }
64                 return 1;
65                 /* We may use strndup() to fetch string value */
66         } else if (t->type == JSMN_STRING) {
67                 if(jsoneq(js, t, "data") == 0)
68                 {
69 //                      fprintf(stdout, "[[[[%d|%d]]]]\n", &(t+1)->size, (t+1)->size);
70 //                      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);
71                         map->data = /*_f*/malloc(sizeof(byte) * (t+1)->size);
72                         map->tiles = /*_f*/malloc(sizeof(tiles_t));
73                         //map->tiles->data = malloc(sizeof(bitmap_t));
74                         //fix this
75                         bp = bitmapLoadPcx("data/ed.pcx");
76                         map->tiles->data = &bp;
77                         //map->tiles->data->data = malloc((16/**2*/)*16);
78                         //map->tiles->data->width = (16/**2*/);\r
79                         //map->tiles->data->height= 16;\r
80                         map->tiles->tileHeight = 16;\r
81                         map->tiles->tileWidth = 16;\r
82                         map->tiles->rows = 1;\r
83                         map->tiles->cols = 1;
84                         strcpy(js_sv, "data");//strdup(js+t->start);//, t->end - t->start);
85                 }
86                 else
87                 if (jsoneq(js, t, "height") == 0 && indent<=1)
88                 {
89                         strcpy(js_sv, "height");//strdup(js+t->start);//, t->end - t->start);
90                 }else if(jsoneq(js, t, "width") == 0 && indent<=1)
91                 {
92                         strcpy(js_sv, "width");//strdup(js+t->start);//, t->end - t->start);
93                 }else strcpy(js_sv, "\0");
94                 return 1;
95         } else if (t->type == JSMN_OBJECT) {
96                 //fprintf(stdout, "\n");
97                 j = 0;
98                 for (i = 0; i < t->size; i++) {
99                         //for (k = 0; k < indent; k++) fprintf(stdout, "\t");
100                         j += dump(js, t+1+j, count-j, indent+1, js_sv, map, i);
101                         //fprintf(stdout, ": ");
102                         j += dump(js, t+1+j, count-j, indent+1, js_sv, map, i);
103                         //fprintf(stdout, "\n");
104                 }
105                 return j+1;
106         } else if (t->type == JSMN_ARRAY) {
107                 j = 0;
108                 //fprintf(stdout, "==\n");
109                 for (i = 0; i < t->size; i++) {
110                         //for (k = 0; k < indent-1; k++) fprintf(stdout, "\t");
111                         //fprintf(stdout, "\t-");
112                         j += dump(js, t+1+j, count-j, indent+1, js_sv, map, i);
113                         //fprintf(stdout, "==\n");
114                 }
115                 return j+1;
116         }
117         return 0;
118 }
119
120 int loadmap(char *mn, map_t *map)
121 {
122         int r;
123         static int incr=0;
124         int eof_expected = 0;
125         char /*far*/ *js = NULL;
126         size_t jslen = 0;
127         char buf[BUFSIZ];
128         static char js_ss[16];
129
130         jsmn_parser p;
131         jsmntok_t /*far*/ *tok;
132         size_t tokcount = 2;
133
134         FILE *fh = fopen(mn, "r");
135
136         /* Prepare parser */
137         jsmn_init(&p);
138
139         /* Allocate some tokens as a start */
140         tok = /*_f*/malloc(sizeof(*tok) * tokcount);
141         if (tok == NULL) {
142                 fprintf(stderr, "malloc(): errno=%d\n", errno);
143                 return 3;
144         }
145
146         for (;;) {
147                 /* Read another chunk */
148                 r = fread(buf, 1, sizeof(buf), fh);
149                 if (r < 0) {
150                         fprintf(stderr, "fread(): %d, errno=%d\n", r, errno);
151                         return 1;
152                 }
153                 if (r == 0) {
154                         if (eof_expected != 0) {
155                                 return 0;
156                         } else {
157                                 fprintf(stderr, "fread(): unexpected EOF\n");
158                                 return 2;
159                         }
160                 }
161
162                 js = /*_f*/realloc(js, jslen + r + 1);
163                 if (js == NULL) {
164                         fprintf(stderr, "realloc(): errno = %d\n", errno);
165                         return 3;
166                 }
167                 strncpy(js + jslen, buf, r);
168                 jslen = jslen + r;
169
170 again:
171                 r = jsmn_parse(&p, js, jslen, tok, tokcount);
172                 if (r < 0) {
173                         if (r == JSMN_ERROR_NOMEM) {
174                                 tokcount = tokcount * 2;
175                                 tok = /*_f*/realloc(tok, sizeof(*tok) * tokcount);
176                                 if (tok == NULL) {
177                                         fprintf(stderr, "realloc(): errno=%d\n", errno);
178                                         return 3;
179                                 }
180                                 goto again;
181                         }
182                 } else {
183                         dump(js, tok, p.toknext, incr, &js_ss, map, 0);
184                         eof_expected = 1;
185                 }
186         }
187
188         /*_f*/free(js);
189         /*_f*/free(tok);
190         fclose(fh);
191
192         return 0;
193 }