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