git » orga2-tp1.git » master » tree

[master] / tpcopado.c

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include "bintree.h"


#ifdef DEBUG
#define DLOG(...) printf("DEBUG:: "); printf(__VA_ARGS__);
#else
#define DLOG(...)
#endif

char* getParam(char * needle, char* haystack[], int count) {
	int i = 0;
	for (i = 0; i < count; i ++) {
		if (strcmp(needle, haystack[i]) == 0) {
			if (i < count -1) {
				return haystack[i+1];
			}	
		}
	}
	return 0;	
}


int isParam(char * needle, char* haystack[], int count) {
	int i = 0;
	for (i = 0; i < count; i ++) {
		if (strcmp(needle, haystack[i]) == 0) {
			return 1;
		}
	}
	return 0;	
}

int parsecommand(char *comando, nodo **arbol);

void showusage(char* filename);

int main (int argc, char *argv[]) {

	int result = 0;
	DLOG("--------------------------------\n");
	DLOG("     ORGA 2 - TP 1 - 1c 2011    \n");
	DLOG("--------------------------------\n");
	DLOG("============= DEBUG ============ \n");
	DLOG("\n");
	
	
	if (! isParam("-f", argv, argc)) {
		showusage(argv[0]);
		return 0;
	}
		
#ifdef DEBUG	
	int st = sizeof(size_t);
	DLOG("SIZE_T %d\n", st);
	int sl = sizeof(long int);
	DLOG("LONG INT %d\n", sl);
	DLOG("Parametros(%d): ", argc)
	int i;
	for (i=0; i < argc; i++) {
		printf("%s ", argv[i]);
	}
	printf("\n");
#endif
	
	char * testfilename = getParam("-f", argv, argc);
	
	FILE* filename = fopen(testfilename, "r");	
	

	
	if (filename == NULL) {
		printf("El archivo no existe o no puede ser abierto %#x %s\n", errno, strerror(errno));
		return 0;
	}
	
	nodo *arbol = NULL;
	char c;
	char buf[4096];
	int len = 0;
	int line = 0;
	while ((c = fgetc(filename) ) != EOF) {
		buf[len++] = c;
		if (c == '\n'){
			buf[len] = 0;
			if (parsecommand(buf, &arbol) != 0) {
				printf("Commando invalido en %s linea %d\n", testfilename, line);
				return 0;
			} 
			len = 0;
			line++;
		}
	}
	
	destruirArbol(arbol);
	
	fclose(filename);
	return result;
}

void showusage(char* filename) {
	printf("Uso: %s -f ARCHIVO\n", filename);
	printf("\n");
	printf("Utiliza ARCHIVO como un conjunto de acciones a seguir. Cada linea del archivo de texto representa una accion a realizar.\n");
	printf("\n");
	printf("Las acciones posibles son:\n");
	printf("-Insertar elemento: INSERTAR N NOMBRE PUNTAJE\n");
	printf("\tInserta el elemento con id N, nombre NOMBRE y puntaje PUNTAJE\n");
	printf("-Eliminar elemento: ELIMINAR N\n");
	printf("\tEliminar el elemento con id N\n");
	printf("-Listar elementos:  IMPRIMIR ARCHIVO\n");
	printf("\tImprime los elementos en forma INORDER en el archivo ARCHIVO\n");
}


int parsecommand(char* comando, nodo **arbol) {
	DLOG("Parseando comando %s\n", comando);
	char * token = strtok(comando, " ");
	DLOG("token %s\n", token);
	if (strncmp(token, "INSERTAR", 8) == 0) {
		
		token = strtok(NULL, " ");
		if (token == NULL) return -1;
		DLOG("token %s\n", token);
		short id = atoi(token);
		token = strtok(NULL, " ");
		if (token == NULL) return -1;
		DLOG("token %s\n", token);
		double puntaje = atof(token);
		token = strtok(NULL, "\n");
		if (token == NULL) return -1;
		DLOG("token %s\n", token);
		char* nombre = token;
		DLOG("Insertando un nuevo nodo con id %d, nombre %s y puntaje %f\n", id, nombre, puntaje);
		insertar(arbol, nombre, id, puntaje); 
	} else if (strncmp(token, "ELIMINAR", 8) == 0) {
		token = strtok(NULL, " \n");
		short id = atoi(token);
		if (token == NULL) return -1;
		DLOG("token %s\n", token);
		DLOG("Eliminando el nodo %d al arbol %p\n", id, (void*)arbol);
		eliminar(arbol, id);
	} else if (strncmp(token, "IMPRIMIR", 8) == 0) {
		char* outfile = strtok(NULL, " \n");
		if (outfile == NULL) return -1;
		DLOG("token %s\n", outfile);
		imprimir(*arbol, outfile);
	} else if (strncmp(token, "BORRAR", 8) == 0) {
		char* outfile = strtok(NULL, " \n");
		if (outfile == NULL) return -1;
		DLOG("token %s\n", outfile);
		FILE * file = fopen(outfile, "w");
		fclose(file);
	}
	
	return 0;
}

void printerrno() {
	printf("%#x\n", errno);
}