]> 4ch.mooo.com Git - 16.git/blob - src/lib/mapread.c
running maptest.exe 2 times produces the results in maptest.out....
[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 *s) {
4         if (tok->type == JSMN_STRING && (int) strlen(s) == tok->end - tok->start &&
5                         strncmp((char const near *)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(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((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(strstr(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(strstr(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
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                         strcpy(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                         strcpy(js_sv, "height");//strdup(js+t->start);//, t->end - t->start);
91                 }else
92                 if(jsoneq(js, t, "width") == 0 && indent<=1)
93                 {
94                         strcpy(js_sv, "width");//strdup(js+t->start);//, t->end - t->start);
95                 }else strcpy(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 *jz = NULL;
128         char huge *js = NULL;
129         size_t jslen = 0;
130         char buf[BUFSIZ];
131         char huge *buff = &buf;//(char huge *)(MK_FP(FP_SEG(&buf), FP_OFF(&buf)));//
132         static char js_ss[16];
133
134         jsmn_parser p;
135         jsmntok_t huge *tok;
136         size_t tokcount = 2;
137
138         FILE *fh = fopen(mn, "r");
139
140         /* Prepare parser */
141         jsmn_init(&p);
142
143         /* Allocate some tokens as a start */
144         tok = _fmalloc(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                 r = fread(buf, 1, sizeof(buf), fh);
153                 if (r < 0) {
154                         fprintf(stderr, "fread(): %d, errno=%d\n", r, errno);
155                         return 1;
156                 }
157                 if (r == 0) {
158                         if (eof_expected != 0) {
159                                 return 0;
160                         } else {
161                                 fprintf(stderr, "fread(): unexpected EOF\n");
162                                 return 2;
163                         }
164                 }
165                 //buf[BUFSIZ]=(char)"\0";
166                 js = _frealloc(js, jslen + r + 1);
167                 if (js == NULL) {
168                         fprintf(stderr, "*js=%Fp\n", *js);
169                         fprintf(stderr, "realloc(): errno = %d\n", errno);
170                         return 3;
171                 }
172                 //printf("strncpy~\n");
173                 //strncpy(jz + jslen, buf, r);
174                 //if(
175                 //_fstrncpy(js + jslen, &(*buff), r);
176                 _fstrncpy(js + jslen, &(*buff), r);
177                 //strncpy((char *)js + jslen, buf, r);
178                 // == NULL)
179 //                      fprintf(stderr, "_fstrncpy(): errno = %d\n", errno);
180                 //printf("strncpy okies~~\n");
181                 jslen = jslen + r;
182
183 again:
184                 //printf("(*js)=%Fp\n", (*js));
185                 r = jsmn_parse(&p, js, jslen, tok, tokcount);
186                 if (r < 0) {
187                         if (r == JSMN_ERROR_NOMEM) {
188                                 tokcount = tokcount * 2;
189                                 tok = _frealloc(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                         dump(js, tok, p.toknext, incr, &js_ss, map, 0);
209                         eof_expected = 1;
210                 }
211         }
212
213         _ffree(js);
214         _ffree(buff);
215         _ffree(tok);
216         fclose(fh);
217
218         return 0;
219 }