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