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