#include<string.h>
#include<stdio.h>

#define LINE_LEN_MAX    128                  /* actual max line length  */
#define BUFFERSIZE      LINE_LEN_MAX + 2     /* ... including \n and \0 */
#define DATASIZE		LINE_LEN_MAX / 2	

enum ret_val
{
	NO_PROBLEMS,
	ERR_FOPEN,
	ERR_MEM,
	ERR_CFGFILE
};

struct cfg_strings
{
	char *name;
	char data[DATASIZE];
};

int CfgRead(char *file_name, struct cfg_strings *cfg_info);

void main()
{
    char *file_name = "dpacman.cfg";
	struct cfg_strings cfg[] =
	{
		{ "porta", NULL },
		{ "portb", NULL },
		{ "portc", NULL },
		{ "portd", NULL },
		{ "porte", NULL },
		{ "portf", NULL },
		{ NULL   , NULL },
	};
	int i;

    CfgRead(file_name, &cfg[0]);
	for (i = 0; cfg[i].name != NULL; i++)
		printf("\nEl valor de %s es: %s", cfg[i].name, cfg[i].data);
}


int CfgRead(char *file_name, struct cfg_strings *cfg)
{
	char *work_ptr;
	char buffer[BUFFERSIZE];
	char cfg_name[BUFFERSIZE];
	char cfg_data[BUFFERSIZE];
	FILE *cfg_file;
	int i;

	memset(buffer, 0, BUFFERSIZE);
	memset(cfg_name, 0, BUFFERSIZE);
	memset(cfg_data, 0, BUFFERSIZE);

	if ((cfg_file = fopen(file_name, "rt")) == NULL)
		return ERR_FOPEN;

	while (fgets(buffer, LINE_LEN_MAX, cfg_file) != NULL)
	{
printf("\n1-<%s><%d>", buffer, strlen(buffer));

		/* Voy al final */
		work_ptr = buffer + (strlen(buffer));

		/* Elimino blancos finales */
		work_ptr--;
		while(*work_ptr == ' ' || *work_ptr == '\t' || *work_ptr == '\n' ||
		      *work_ptr == '\r')
		{
			*work_ptr = '\0';
			work_ptr--;
		}

		/* Elimino blancos iniciales */
		work_ptr = &buffer[0];
		while(*work_ptr == ' ' || *work_ptr == '\t' || *work_ptr == '\n' ||
		      *work_ptr == '\r')
		{
			work_ptr++;
		}

		if (strlen(work_ptr) == 0)
			continue;

		/* Guardo el nombre del parametro */
		for (i = 0; *work_ptr != '=' && i < BUFFERSIZE; i++, work_ptr++)
			cfg_name[i] = *work_ptr;
		cfg_name[i] = '\0';

		/* Elimino blancos finales del nombre */
		cfg_name[i--];
		while(cfg_name[i] == ' '  || cfg_name[i] == '\t' ||
			  cfg_name[i] == '\n' || cfg_name[i] == '\r' )
		{
			cfg_name[i] = '\0';
			i--;
		}

printf("\n2-<%s><%d>", cfg_name, strlen(cfg_name));

		if(cfg_name[0] != '\0')
		{
			/* Elimino blancos iniciales (?) */
			while(*work_ptr == ' '  || *work_ptr == '\t' || 
				  *work_ptr == '\n' || *work_ptr == '\r' )
				work_ptr++;

			/* Salteo el '=' */
			if(*work_ptr == '=')
				work_ptr++;

			/* Elimino blancos posteriores al '=' */
			while(*work_ptr == ' '  || *work_ptr == '\t' || 
				  *work_ptr == '\n' || *work_ptr == '\r' )
				work_ptr++;

			/* Guardo el valor del parametro */
			for (i = 0;
				 *work_ptr != '\0' && i < BUFFERSIZE; 
				 i++, work_ptr++)
			{
				cfg_data[i] = *work_ptr;
			}
			cfg_data[i] = '\0';

printf("\n3-<%s><%d>", cfg_data, strlen(cfg_data));

			while(cfg->name != NULL && strcmp(cfg->name, cfg_name) != 0)
				cfg++;

			if (cfg_name != NULL)
			{
				strcpy(cfg->data, cfg_data); 

				if(cfg->data == NULL)
				{
					fclose(cfg_file);
					return ERR_MEM;
				}
			}
		}
	}
	fclose(cfg_file);
	return NO_PROBLEMS ;
}
