]> git.llucax.com Git - z.facultad/75.06/emufs.git/commitdiff
Se agrega lib de math al LDFLAGS.
authorLeandro Lucarella <llucax@gmail.com>
Fri, 16 Apr 2004 03:11:53 +0000 (03:11 +0000)
committerLeandro Lucarella <llucax@gmail.com>
Fri, 16 Apr 2004 03:11:53 +0000 (03:11 +0000)
emufs/Makefile
emufs/emufs.c
emufs/tipo1.c

index 787a5550af9e130c1b9fe6deddd2e827f9197046..84140d97286810cbe5fc5628a9e18cce7db2caf4 100644 (file)
@@ -1,5 +1,5 @@
 CFLAGS=-Wall -g -ansi -pedantic -DDEBUG 
-LDFLAGS=
+LDFLAGS=-lm
 
 EMUFS_COMMON=emufs.o tipo1.o tipo2.o tipo3.o idx.o did.o fsc.o
 
index 7bbc3b0ab9a4232933c320626fac560d2650d7ce..9f2a29d4eab6e1ba083b3cc0e223aa0df4db517b 100644 (file)
@@ -143,6 +143,8 @@ EMUFS *emufs_crear(const char *filename, EMUFS_Tipo tipo, EMUFS_BLOCK_SIZE tam_b
 
                case T1:
                        /* Asigna punteros a funciones. */
+                       /* TODO verificar que el tamaño de bloque sea como mínimo del
+                        * tamaño de la cabecera de un registro + N */
                        emufs_tipo1_inicializar(efs);
 
                        /* Guarda cabeceras propias. */
index 4c68ce432a40e4e490fef30213682678f728d385..dc6a813ee9f750f32aff8556abfd17c1aa7f57ed 100644 (file)
 #include <string.h>
 #include <unistd.h>
 
+#ifndef MIN
+#      define MIN(x, y) (((x) > (y)) ? (y) : (x))
+#endif
+
 /*------------------ Declaraciones privadas ----------------------*/
 
 /** Cabecera de un registro de un archivo tipo1. */
@@ -61,6 +65,9 @@ static int emufs_tipo1_block_jump(EMUFS*, FILE*, EMUFS_BLOCK_ID);
 static void emufs_tipo1_escribir_reg_en_memoria(char*, EMUFS_TIPO1_REG_HEADER,
                char*);
 
+static void emufs_tipo1_escribir_reg_chunk_en_memoria(char* dst,
+               EMUFS_TIPO1_REG_HEADER header, char* reg, EMUFS_REG_SIZE reg_size);
+
 /*------------------ Funciones públicas ----------------------*/
 
 int emufs_tipo1_inicializar(EMUFS* efs)
@@ -124,6 +131,42 @@ void* emufs_tipo1_leer_registro(EMUFS* efs, EMUFS_REG_ID reg_id,
        return registro;
 }
 
+void* emufs_tipo1_leer_registro_raw(EMUFS *efs, EMUFS_REG_ID id,
+               EMUFS_REG_SIZE *size, int *pos)
+{
+       char* block; /* bloque leido (en donde está el registro a leer) */
+       EMUFS_BLOCK_ID block_id; /* id del bloque en donde esta el registro a leer */
+       EMUFS_BLOCK_SIZE offset; /* offset del bloque leído */
+       EMUFS_BLOCK_SIZE block_size; /* tamaño del bloque leído */
+       EMUFS_TIPO1_REG_HEADER curr_reg_header; /* cabecera del registro a leer */
+       int err;
+
+       block_id = emufs_idx_buscar_registro(efs, id);
+       if (block_id == EMUFS_NOT_FOUND) {
+               return NULL;
+       }
+       if (!(block = (char*) emufs_tipo1_leer_bloque(efs, block_id, &err))) {
+               return NULL;
+       }
+
+       /* Busco secuencialmente en el bloque el registro a leer */
+       offset = 0;
+       do {
+               /* Copio la cabecera del registro. */
+               memcpy(&curr_reg_header, block + offset, sizeof(EMUFS_TIPO1_REG_HEADER));
+               offset += sizeof(EMUFS_TIPO1_REG_HEADER);
+               if (curr_reg_header.id == id) {
+                       *pos = offset - sizeof(EMUFS_TIPO1_REG_HEADER);
+                       break;
+               }
+               /* Desplazo el offset */
+               offset += curr_reg_header.size;
+       } while (offset < block_size);
+
+       (*size) = block_size;
+       return block;
+}
+
 void* emufs_tipo1_leer_bloque(EMUFS* efs, EMUFS_BLOCK_ID block_id, int *err)
 {
        FILE* file;
@@ -178,6 +221,9 @@ EMUFS_REG_ID emufs_tipo1_grabar_registro(EMUFS* efs, void* reg,
                        + sizeof(EMUFS_TIPO1_REG_HEADER), &fs);
        /* si no hay bloques con suficiente espacio creo un bloque nuevo */
        if (block_id == EMUFS_NOT_FOUND) {
+               /* Tamaño máximo ultilizable para datos en un bloque */
+               EMUFS_BLOCK_SIZE block_space;
+               block_space = efs->tam_bloque - sizeof(EMUFS_TIPO1_REG_HEADER);
                /* crear un nuevo bloque en memoria */
                block = (char*) malloc(efs->tam_bloque);
                if (block == NULL) {
@@ -186,10 +232,36 @@ EMUFS_REG_ID emufs_tipo1_grabar_registro(EMUFS* efs, void* reg,
                        *err = 2; /* EMUFS_ERROR_OUT_OF_MEMORY */
                        return EMUFS_NOT_FOUND;
                }
-               memset(block, 0, efs->tam_bloque); /* inicializa bloque */
                reg_header.id = emufs_idx_get_new_id(efs, err);
+               memset(block, 0, efs->tam_bloque); /* inicializa bloque */
+               /* verifica que el registro no sea más grande que el bloque */
+               if (reg_size > block_space) {
+                       EMUFS_REG_SIZE chunk_size = 0; /* Tamaño de la porción de registro */
+                       char* chunk_pointer = reg; /* Puntero a la poción del registro */
+                       do {
+                               memset(block, 0, efs->tam_bloque); /* inicializa bloque */
+                               reg_header.size -= chunk_size;
+                               chunk_size = MIN(reg_header.size, block_space);
+                               /* graba porción del registro en bloque */
+                               emufs_tipo1_escribir_reg_chunk_en_memoria(block, reg_header, reg,
+                                               chunk_size);
+                               /* graba el bloque en el archivo */
+                               block_id = emufs_tipo1_grabar_bloque(efs, block, block_id, err);
+                               if (*err) {
+                                       PERR("error al grabar bloque");
+                                       free(block);
+                                       return EMUFS_NOT_FOUND;
+                               }
+                               free(block);
+                               /* grabo el nuevo registro en el archivo de espacios libres */
+                               *err = emufs_fsc_agregar(efs, block_id, block_space - chunk_size);
+                               if (*err) {
+                                       PERR("No se pudo agregar fsc");
+                                       return EMUFS_NOT_FOUND;
+                               }
+                       } while (chunk_size > block_space);
+               }
                /* graba registro en bloque */
-               /* TODO if (reg_size > efs->tam_bloque) */
                emufs_tipo1_escribir_reg_en_memoria(block, reg_header, reg);
                /* graba el bloque en el archivo */
                block_id = emufs_tipo1_grabar_bloque(efs, block, block_id, err);
@@ -314,6 +386,13 @@ int emufs_tipo1_borrar_registro(EMUFS *emu, EMUFS_REG_ID id_reg)
        return -1; /* FIXME Error */
 }
 
+EMUFS_REG_ID emufs_tipo1_modificar_registro(EMUFS *emu, EMUFS_REG_ID id,
+               void *data, EMUFS_REG_SIZE size, int *error)
+{
+       emufs_tipo1_borrar_registro(emu, id);
+       return emufs_tipo1_grabar_registro(emu, data, size, error);
+}
+
 size_t emufs_tipo1_header_size(void)
 {
        return sizeof(EMUFS_Tipo) + sizeof(EMUFS_BLOCK_SIZE);
@@ -337,56 +416,20 @@ int emufs_tipo1_block_jump(EMUFS* efs, FILE* fp, EMUFS_BLOCK_ID block_count)
        return 0; /* EMUFS_OK */
 }
 
-void emufs_tipo1_escribir_reg_en_memoria(char* dst,    EMUFS_TIPO1_REG_HEADER header,
-               char* reg) {
+void emufs_tipo1_escribir_reg_en_memoria(char* dst, EMUFS_TIPO1_REG_HEADER header,
+               char* reg)
+{
+       return emufs_tipo1_escribir_reg_chunk_en_memoria(dst, header, reg, header.size);
+}
+
+void emufs_tipo1_escribir_reg_chunk_en_memoria(char* dst,
+               EMUFS_TIPO1_REG_HEADER header, char* reg, EMUFS_REG_SIZE reg_size)
+{
        /* grabo cabecera del registro en el bloque */
        memcpy(dst, &header, sizeof(EMUFS_TIPO1_REG_HEADER));
        /* incremento puntero de escritura */
        dst += sizeof(EMUFS_TIPO1_REG_HEADER);
        /* grabo el registro en el bloque */
-       memcpy(dst, reg, header.size);
-}
-
-EMUFS_REG_ID emufs_tipo1_modificar_registro(EMUFS *emu, EMUFS_REG_ID id,
-               void *data, EMUFS_REG_SIZE size, int *error)
-{
-       emufs_tipo1_borrar_registro(emu, id);
-       return emufs_tipo1_grabar_registro(emu, data, size, error);
-}
-
-void* emufs_tipo1_leer_registro_raw(EMUFS *efs, EMUFS_REG_ID id,
-               EMUFS_REG_SIZE *size, int *pos)
-{
-       char* block; /* bloque leido (en donde está el registro a leer) */
-       EMUFS_BLOCK_ID block_id; /* id del bloque en donde esta el registro a leer */
-       EMUFS_BLOCK_SIZE offset; /* offset del bloque leído */
-       EMUFS_BLOCK_SIZE block_size; /* tamaño del bloque leído */
-       EMUFS_TIPO1_REG_HEADER curr_reg_header; /* cabecera del registro a leer */
-       int err;
-
-       block_id = emufs_idx_buscar_registro(efs, id);
-       if (block_id == EMUFS_NOT_FOUND) {
-               return NULL;
-       }
-       if (!(block = (char*) emufs_tipo1_leer_bloque(efs, block_id, &err))) {
-               return NULL;
-       }
-
-       /* Busco secuencialmente en el bloque el registro a leer */
-       offset = 0;
-       do {
-               /* Copio la cabecera del registro. */
-               memcpy(&curr_reg_header, block + offset, sizeof(EMUFS_TIPO1_REG_HEADER));
-               offset += sizeof(EMUFS_TIPO1_REG_HEADER);
-               if (curr_reg_header.id == id) {
-                       *pos = offset - sizeof(EMUFS_TIPO1_REG_HEADER);
-                       break;
-               }
-               /* Desplazo el offset */
-               offset += curr_reg_header.size;
-       } while (offset < block_size);
-
-       (*size) = block_size;
-       return block;
+       memcpy(dst, reg, reg_size);
 }