#include #include #include "smart_map_priv.h" #define READ_KEY_INIT char key[512] #define LKEY(_le, _mk) snprintf(key, 512, "%i/%s", _le, _mk); static inline int _read_int_val(Eet_File *eet, char *key, int *intval) { int size; char *val; val = eet_read(eet, key, &size); if(val == NULL) { // _warn("reading %s failed\n", key); return -1; } *intval = atoi(val); free(val); return 0; } static inline int _read_double_val(Eet_File *eet, char *key, double *dval) { int size; char *val; val = eet_read(eet, key, &size); if(val == NULL) { // _warn("reading %s failed\n", key); return -1; } *dval = atof(val); free(val); return 0; } struct map_info *map_info_read(const char *path) { Eet_File *eet; int size, i; char *val; struct map_info *mi; mi = (struct map_info *)calloc(1, sizeof(struct map_info)); if(mi == NULL) return NULL; eet = eet_open(path, EET_FILE_MODE_READ); if(eet == NULL) return NULL; val = eet_read(eet, "min_level", &size); if(val == NULL) return NULL; mi->min_level = atoi(val); free(val); val = eet_read(eet, "max_level", &size); if(val == NULL) return NULL; mi->max_level = atoi(val); free(val); mi->level = (struct map_level_info *) calloc(mi->max_level - mi->min_level + 1, sizeof(struct map_level_info)); if(mi->level == NULL) { free(mi); return NULL; } mi->tile_size = 256; for(i = mi->min_level; i < mi->max_level + 1; i++) { READ_KEY_INIT; struct map_level_info *li; li = &mi->level[i - mi->min_level]; LKEY(i, "min_x"); if(_read_int_val(eet, key, &(li->min_x))) goto failure; LKEY(i, "max_x"); if(_read_int_val(eet, key, &(li->max_x))) goto failure; LKEY(i, "min_y"); if(_read_int_val(eet, key, &(li->min_y))) goto failure; LKEY(i, "max_y"); if(_read_int_val(eet, key, &(li->max_y))) goto failure; LKEY(i, "north"); if(_read_double_val(eet, key, &(li->north))) goto failure; LKEY(i, "west"); if(_read_double_val(eet, key, &(li->west))) goto failure; LKEY(i, "south"); if(_read_double_val(eet, key, &(li->south))) goto failure; LKEY(i, "east"); if(_read_double_val(eet, key, &(li->east))) goto failure; LKEY(i, "dx"); if(_read_double_val(eet, key, &(li->dx))) goto failure; LKEY(i, "dy"); if(_read_double_val(eet, key, &(li->dy))) goto failure; LKEY(i, "e0"); if(_read_double_val(eet, key, &(li->e0))) goto failure; LKEY(i, "n0"); if(_read_double_val(eet, key, &(li->n0))) goto failure; } mi->path = strdup(path); eet_close(eet); return mi; failure: free(mi->level); free(mi); return NULL; }