CFLAGS=-Wall -g -ansi -pedantic -DDEBUG
LDFLAGS=-lm
-EMUFS_COMMON=emufs.o tipo1.o tipo2.o tipo3.o idx.o did.o fsc.o common.o
+EMUFS_COMMON=emufs.o tipo1.o tipo2.o tipo3.o idx.o did.o fsc.o common.o indices.o
all: libemufs.a tipo1_main tipo2_main tipo3_main
efs->tam_bloque = tam_bloque;
efs->tam_reg = tam_reg;
efs->nombre = str_dup(filename);
+ efs->indices = NULL;
/* Abre archivo de datos. */
strcpy(name, filename);
return 0;
}
+int emufs_agregar_indice(EMUFS *emu, char *nombre, INDICE_TIPO tipo, INDICE_TIPO_DATO tipo_dato, unsigned int offset)
+{
+ INDICE *tmp;
+ tmp = emufs_indice_crear(emu, nombre, tipo, tipo_dato, offset);
+
+ if (tmp == NULL) return 0;
+
+ if (emu->indices==NULL)
+ emu->indices = tmp;
+ else {
+ tmp->sig = emu->indices;
+ emu->indices = tmp;
+ }
+ return 1;
+}
+
#include <stdio.h>
#include <limits.h>
+#include "indices.h"
+
/** Tipo de archivo. */
typedef enum {
T1, /**< Archivo de bloque parametrizado y registro variable. */
* la necesidad de que el usuario tenga que hacer una selección previa del tipo
* para llamar al método correspondiente a cada tipo de archivo.
*/
-typedef struct _emu_fs_t {
+struct _emu_fs_t {
EMUFS_Tipo tipo;
EMUFS_BLOCK_SIZE tam_bloque; /**< Tamaño de bloque. 0 Si no tiene bloques */
EMUFS_REG_SIZE tam_reg; /**< Tamaño de registro. 0 Si son registros variables */
EMUFS_Estadisticas (*leer_estadisticas)(struct _emu_fs_t *); /**< Método para obtener estádisticas sobre el archivo */
void (*compactar)(struct _emu_fs_t *); /**< Método para compactar el archivo reorganizándolo físicamente */
char *nombre; /**< Nombre del archivo */
-} EMUFS;
+
+ INDICE *indices;
+};
/** Crea un archivo auxiliar. */
int emufs_crear_archivo_auxiliar(const char*, const char*);
/** muestra estadisticas, para debug. */
int debug_ver_estadisticas(EMUFS *emu);
+int emufs_agregar_indice(EMUFS *emu, char *nombre, INDICE_TIPO tipo, INDICE_TIPO_DATO tipo_dato, unsigned int offset);
+
#endif /* _EMUFS_H_ */
--- /dev/null
+
+#include "indices.h"
+#include "emufs.h"
+
+INDICE *emufs_indice_crear(EMUFS *emu, char *nombre, INDICE_TIPO tipo, INDICE_TIPO_DATO tipo_dato, unsigned int offset)
+{
+ int len;
+ INDICE *tmp;
+ tmp = (INDICE *)malloc(sizeof(INDICE));
+ if (tmp == NULL) return NULL;
+
+ len = strlen(emu->nombre);
+ len += strlen(nombre);
+
+ tmp->filename = (char *)malloc(sizeof(char)*(len+6));
+ strcpy(tmp->filename, emu->nombre);
+ strcat(tmp->filename, "_");
+ strcat(tmp->filename, nombre);
+ strcat(tmp->filename, ".idx");
+
+ tmp->nombre = (char *)malloc(sizeof(char)*(strlen(nombre)+1));
+ strcpy(tmp->nombre, nombre);
+
+ tmp->tipo = tipo;
+ tmp->tipo_dato = tipo_dato;
+
+ tmp->offset = offset;
+ tmp->sig = NULL;
+
+ switch (tipo) {
+ case IND_B_MAS:
+ /* llenar metodos */
+ case IND_B_ASC:
+ /* llenar metodos */
+ break;
+ }
+
+ return tmp;
+}
+
+void emufs_indice_destruir(EMUFS *emu, INDICE *i)
+{
+ /* TODO Sacar el indice de la lista en EMUFS */
+
+ free(i->filename);
+ free(i->nombre);
+ free(i);
+}
+
+
+CLAVE emufs_indice_obtenet_clave(INDICE *idx, char *data)
+{
+ CLAVE k;
+ switch (idx->tipo_dato) {
+ case IDX_FLOAT:
+ k.f_clave= *((float *)(data+idx->offset));
+ break;
+ case IDX_INT:
+ k.i_clave = *((int *)(data+idx->offset));
+ }
+
+ return k;
+}
+
--- /dev/null
+
+#ifndef _INDICES_H_
+#define _INDICES_H_
+
+#include <stdlib.h>
+#include <string.h>
+
+typedef struct _emu_fs_t EMUFS;
+
+typedef enum {IND_B_MAS, IND_B_ASC} INDICE_TIPO;
+
+typedef enum {IDX_FLOAT, IDX_INT} INDICE_TIPO_DATO;
+
+typedef union _data_ {
+ float f_clave;
+ int i_clave;
+} CLAVE;
+
+typedef struct _indices_h_ {
+ INDICE_TIPO tipo;
+ INDICE_TIPO_DATO tipo_dato;
+ int offset;
+
+ /** Agrega la clave k de posicion location en el
+ * indice de forma ordenada
+ */
+ int (*agregar_entrada)(struct _indices_h_ *idx, CLAVE k, int location);
+ /** Borra del indice la clave k */
+ int (*borrar_entrada)(struct _indices_h_ *idx, CLAVE k);
+ /** Determina si existe la clave k retornando su posicion o -1
+ * en caso fallido
+ */
+ int (*existe_entrada)(struct _indices_h_ *idx, CLAVE k);
+
+ char *nombre; /* nombre de busqueda */
+ char *filename; /* nombre del archivo indice */
+
+ struct _indices_h_ *sig;
+} INDICE;
+
+INDICE *emufs_indice_crear(EMUFS *emu, char *nombre, INDICE_TIPO tipo, INDICE_TIPO_DATO tipo_dato, unsigned int offset);
+void emufs_indice_destruir(EMUFS *emu, INDICE *i);
+
+CLAVE emufs_indice_obtenet_clave(INDICE *idx, char *data);
+#endif
+