summaryrefslogblamecommitdiffstats
path: root/friendfinder/map/map_reader.c
blob: fb475fc11452406f941e95929fabb35598198230 (plain) (tree)












































































































































                                                                          
#include <string.h>
#include <Eet.h>

#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;
}