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