]> 4ch.mooo.com Git - 16.git/blob - src/lib/mapread.c
wwww closer~
[16.git] / src / lib / mapread.c
1 #include "src/lib/mapread.h"
2
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) {
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 huge *js, jsmntok_t huge *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(_fstrstr(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((const char *)js+t->start);
42                         #ifdef DEBUG_MAPDATA
43                                 fprintf(stdout, "%d[%d]", q, map->data[q]);
44                         #endif
45                 }
46                 else
47                 if(_fstrstr(js_sv, "height"))
48                 {
49 //----                  map->height = (unsigned int)strtol(js+t->start, (char **)js+t->end, 10);
50                         map->height = atoi((const char *)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(_fstrstr(js_sv, "width"))
56                 {
57 //----                  map->width = (unsigned int)strtol(js+t->start, (char **)js+t->end, 10);
58                         map->width = atoi((const char *)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 = halloc(sizeof(byte) * (t+1)->size, sizeof(byte));
72                         //map->data = malloc(sizeof(byte) * (t+1)->size);
73                         map->tiles = /*_f*/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->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
84                         map->tiles->cols = 1;
85                         _fstrcpy(js_sv, "data");//strdup(js+t->start);//, t->end - t->start);
86                 }
87                 else
88                 if (jsoneq(js, t, "height") == 0 && indent<=1)
89                 {
90                         _fstrcpy(js_sv, "height");//strdup(js+t->start);//, t->end - t->start);
91                 }else
92                 if(jsoneq(js, t, "width") == 0 && indent<=1)
93                 {
94                         _fstrcpy(js_sv, "width");//strdup(js+t->start);//, t->end - t->start);
95                 }else _fstrcpy(js_sv, "\0");
96                 return 1;
97         } else if (t->type == JSMN_OBJECT) {
98                 //fprintf(stdout, "\n");
99                 j = 0;
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");
106                 }
107                 return j+1;
108         } else if (t->type == JSMN_ARRAY) {
109                 j = 0;
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");
116                 }
117                 return j+1;
118         }
119         return 0;
120 }
121
122 int loadmap(char *mn, map_t *map)
123 {
124         int r;
125         static int incr=0;
126         int eof_expected = 0;
127         char huge *js = NULL;
128         size_t jslen = 0;
129         char buf[BUFSIZ];
130         char huge *buff = &buf;
131         static char js_ss[16];
132
133         jsmn_parser p;
134         jsmntok_t huge *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         tok = _fmalloc(sizeof(*tok) * tokcount);
144         if (tok == NULL) {
145                 fprintf(stderr, "malloc(): errno=%d\n", errno);
146                 return 3;
147         }
148
149         for (;;) {
150                 /* Read another chunk */
151                 r = fread(buf, 1, sizeof(buf), fh);
152                 if (r < 0) {
153                         fprintf(stderr, "fread(): %d, errno=%d\n", r, errno);
154                         return 1;
155                 }
156                 if (r == 0) {
157                         if (eof_expected != 0) {
158                                 return 0;
159                         } else {
160                                 fprintf(stderr, "fread(): unexpected EOF\n");
161                                 return 2;
162                         }
163                 }
164                 js = _frealloc(js, jslen + r + 1);
165                 if (js == NULL) {
166                         fprintf(stderr, "*js=%Fp\n", *js);
167                         fprintf(stderr, "realloc(): errno = %d\n", errno);
168                         return 3;
169                 }
170                 _fstrncpy(js + jslen, &(*buff), r);
171                 jslen = jslen + r;
172
173 again:
174                 r = jsmn_parse(&p, js, jslen, tok, tokcount);
175                 if (r < 0) {
176                         if (r == JSMN_ERROR_NOMEM) {
177                                 tokcount = tokcount * 2;
178                                 tok = _frealloc(tok, sizeof(*tok) * tokcount);
179                                 if (tok == NULL) {
180                                         fprintf(stderr, "realloc(): errno=%d\n", errno);
181                                         return 3;
182                                 }
183                                 goto again;
184                         }
185                 } else {
186                         //printf("js=%Fp\n", (js));
187                         //printf("*js=%Fp\n", (*(js)));
188                         //printf("&*js=%s\n", &(*(js)));
189                         //printf("&buf=[%Fp]\n", &buf);
190                         //printf("&buf_seg=[%x]\n", FP_SEG(&buf));
191                         //printf("&buf_off=[%x]\n", FP_OFF(&buf));
192                         //printf("&buf_fp=[%Fp]\n", MK_FP(FP_SEG(&buf), FP_OFF(&buf)));
193                         //printf("buf=[\n%s\n]\n", buf);
194                         //printf("buff=[%Fp]\n", buff);
195                         //printf("(*buff)=[%Fp]\n", (*buff));
196                         //printf("&(*buff)=[\n%s\n]\n", &(*buff));
197                         dump(js, tok, p.toknext, incr, &js_ss, map, 0);
198                         eof_expected = 1;
199                 }
200         }
201
202         _ffree(js);
203         _ffree(buff);
204         _ffree(tok);
205         fclose(fh);
206
207         return 0;
208 }