]> git.llucax.com Git - z.facultad/75.06/emufs.git/commitdiff
* Agrego indices a EMUFS (doc de como usarlos pronto!)
authorRicardo Markiewicz <gazer.arg@gmail.com>
Sat, 8 May 2004 21:30:11 +0000 (21:30 +0000)
committerRicardo Markiewicz <gazer.arg@gmail.com>
Sat, 8 May 2004 21:30:11 +0000 (21:30 +0000)
emufs/Makefile
emufs/emufs.c
emufs/emufs.h
emufs/indices.c [new file with mode: 0644]
emufs/indices.h [new file with mode: 0644]

index a92896fdc51b121dcfe13fbd7dca058a47e825f1..e97109340c0c5097aa5a00d0b60ab658b3892cc2 100644 (file)
@@ -1,7 +1,7 @@
 CFLAGS=-Wall -g -ansi -pedantic -DDEBUG 
 LDFLAGS=-lm
 
 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
 
 
 all: libemufs.a tipo1_main tipo2_main tipo3_main
 
index d24386107c17ac12a463e86fdd8ec902246836c9..760fc49da8759d8cc746f9728f56fb574269a14c 100644 (file)
@@ -101,6 +101,7 @@ EMUFS *emufs_crear(const char *filename, EMUFS_Tipo tipo, EMUFS_BLOCK_SIZE tam_b
        efs->tam_bloque = tam_bloque;
        efs->tam_reg = tam_reg;
        efs->nombre = str_dup(filename);
        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);
 
        /* Abre archivo de datos. */
        strcpy(name, filename);
@@ -341,3 +342,19 @@ int debug_ver_estadisticas(EMUFS* efs)
        return 0;
 }
 
        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;
+}
+
index 381049dd08f3545fe070670d03a0035bbea01e70..d610a8a2dd1b04606e05d117fc0a579c7d8b94a6 100644 (file)
@@ -44,6 +44,8 @@
 #include <stdio.h>
 #include <limits.h>
 
 #include <stdio.h>
 #include <limits.h>
 
+#include "indices.h"
+
 /** Tipo de archivo. */
 typedef enum {
        T1, /**< Archivo de bloque parametrizado y registro variable. */
 /** Tipo de archivo. */
 typedef enum {
        T1, /**< Archivo de bloque parametrizado y registro variable. */
@@ -106,7 +108,7 @@ typedef struct _emufs_est_t {
  *  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.
  */
  *  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_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 */        
@@ -120,7 +122,9 @@ typedef struct _emu_fs_t {
        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_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*);
 
 /** Crea un archivo auxiliar. */
 int emufs_crear_archivo_auxiliar(const char*, const char*);
@@ -169,4 +173,6 @@ int ver_archivo_FS(EMUFS *emu);
 /** muestra estadisticas, para debug. */
 int debug_ver_estadisticas(EMUFS *emu);
 
 /** 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_ */
 #endif /* _EMUFS_H_ */
diff --git a/emufs/indices.c b/emufs/indices.c
new file mode 100644 (file)
index 0000000..8766054
--- /dev/null
@@ -0,0 +1,64 @@
+
+#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;
+}
+
diff --git a/emufs/indices.h b/emufs/indices.h
new file mode 100644 (file)
index 0000000..935bc6e
--- /dev/null
@@ -0,0 +1,46 @@
+
+#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
+