]> git.llucax.com Git - z.facultad/75.06/emufs.git/commitdiff
* cosas que no subi ayer en el trabajo
authorRicardo Markiewicz <gazer.arg@gmail.com>
Sat, 17 Apr 2004 17:29:03 +0000 (17:29 +0000)
committerRicardo Markiewicz <gazer.arg@gmail.com>
Sat, 17 Apr 2004 17:29:03 +0000 (17:29 +0000)
emufs/tipo1.c
emufs_gui/registros.c

index 0c3f32dd2b55b1ca075b671e8ff0b4500efb428a..78a3806991816ac9efb2262deffe79db6498b5d7 100644 (file)
@@ -188,37 +188,75 @@ void* emufs_tipo1_leer_registro(EMUFS* efs, EMUFS_REG_ID reg_id,
 void* emufs_tipo1_leer_registro_raw(EMUFS *efs, EMUFS_REG_ID id,
                EMUFS_REG_SIZE *size, int *pos)
 {
+       char *chunk_ptr;
        char* block; /* bloque leido (en donde está el registro a leer) */
+       char* registro; /* 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 offset, block_space; /* offset del bloque leído */
        EMUFS_TIPO1_REG_HEADER curr_reg_header; /* cabecera del registro a leer */
-       int err;
+       EMUFS_REG_SIZE cant_bloques;
+       int err, i;
 
        block_id = emufs_idx_buscar_registro(efs, id);
        if (block_id == EMUFS_NOT_FOUND) {
+               /* TODO Manejo de errores */
+               PERR("Registro no encontrado");
+               *pos = 0;
+               *size = 0;
                return NULL;
        }
        err = 0;
        if (!(block = (char*) emufs_tipo1_leer_bloque(efs, block_id, &err))) {
+               /* TODO Manejo de errores */
+               PERR("no se pudo reservar memoria");
+               *pos = 0;
+               *size = 0;
                return NULL;
        }
 
        /* Busco secuencialmente en el bloque el registro a leer */
        offset = 0;
        do {
-               /* Copio la cabecera del registro. */
+               /* Copio la cabecera del registro actual. */
                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);
+                       /* tamaño máximo ultilizable para datos en un bloque */
+                       *pos = offset-sizeof(EMUFS_TIPO1_REG_HEADER);
+                       block_space = efs->tam_bloque - sizeof(EMUFS_TIPO1_REG_HEADER);
+                       /* tamaño de la porción de registro que se guarda */
+
+                       cant_bloques = curr_reg_header.size / block_space + 1;
+                       *size = cant_bloques*efs->tam_bloque;
+                       registro = chunk_ptr = (char*) malloc(*size - (cant_bloques-1)*sizeof(EMUFS_TIPO1_REG_HEADER));
+                       if (registro == NULL) {
+                               /* TODO Manejo de errores */
+                               free(block);
+                               PERR("No hay memoria");
+                               *pos = 0;
+                               *size = 0;
+                               return NULL;
+                       }
+                       memcpy(registro, block, efs->tam_bloque);
+                       chunk_ptr += efs->tam_bloque;
+                       /* Copio los otros bloques, si los hay */
+                       free(block);
+                       for(i=1; i<cant_bloques; i++) {
+                               err = 0;
+                               block = (char*)emufs_tipo1_leer_bloque(efs, block_id+i, &err);
+                               /* Solo grabo el header del primer pedazo! */
+                               memcpy(registro, block+sizeof(EMUFS_TIPO1_REG_HEADER), efs->tam_bloque);
+                               chunk_ptr += efs->tam_bloque;
+                               free(block);
+                       }
+                       /* Todo listo! */
                        break;
                }
                /* Desplazo el offset */
                offset += curr_reg_header.size;
        } while (offset < efs->tam_bloque);
 
-       (*size) = efs->tam_bloque;
-       return block;
+       return registro;
 }
 
 void* emufs_tipo1_leer_bloque(EMUFS* efs, EMUFS_BLOCK_ID block_id, int *err)
index e08df568e0a1453c5ab6c0b20face75f1910c79f..319973649b70c63954b54d8e33a80b4d3a3ef6a7 100644 (file)
@@ -388,7 +388,7 @@ char *procesar_registro_articulo_tipo1(EMUFS *emu, char *ptr, EMUFS_REG_SIZE *si
        (*size) = (*size)-sizeof(unsigned int)*cant_header*3+3*cant_header*10+1;
        memset(tmp1, '.', (*size)-(tmp1-salida)); 
        free(ptr);
-       salida[*size] = '\0';
+       salida[*size-1] = '\0';
        
        return salida;
 }