+/* vim: set noexpandtab tabstop=4 shiftwidth=4:
+ *----------------------------------------------------------------------------
+ * emufs
+ *----------------------------------------------------------------------------
+ * This file is part of emufs.
+ *
+ * emufs is free software; you can redistribute it and/or modify it under the
+ * terms of the GNU General Public License as published by the Free Software
+ * Foundation; either version 2 of the License, or (at your option) any later
+ * version.
+ *
+ * emufs is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with emufs; if not, write to the Free Software Foundation, Inc., 59 Temple
+ * Place, Suite 330, Boston, MA 02111-1307 USA
+ *----------------------------------------------------------------------------
+ * Creado: vie abr 9 16:47:32 ART 2004
+ * Autores: Leandro Lucarella <llucare@fi.uba.ar>
+ *----------------------------------------------------------------------------
+ *
+ * $Id$
+ *
+ */
+
+/** \file
+ *
+ * Archivo con bloque de longitud parametrizada, registro de longitud variable.
+ *
+ * Implementación del archivo con bloques de longitud parametrizada y registros
+ * de longitud variable.
+ *
+ */
+
+#include "tipo1.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <malloc.h>
+
+int emufs_tipo1_leer_registro(EMUFS* efs, int reg_id, void* reg_ptr, unsigned long reg_size)
+{
+ int block_id; /* id del bloque en donde esta el registro a leer */
+ char* block; /* bloque leido (en donde está el registro a leer) */
+ ptrdiff_t offset; /* offset del bloque a leido */
+ unsigned long curr_reg_size; /* tamaño del registro leido secuencialmente */
+ int curr_reg_id; /* id del registro leido secuencialmente */
+
+ block_id = emufs_idx_buscar_registro(efs, reg_id);
+ block = (char*) malloc(efs->tam_bloque);
+ if (block == NULL) {
+ /* TODO Manejo de errores */
+ printf("No hay memoria.\n");
+ return -1;
+ }
+
+ if (emufs_tipo1_leer_bloque(efs, block_id, block) == -1) {
+ /* TODO Manejo de errores */
+ free(block);
+ printf("no se pudo leer el bloque\n");
+ return -1;
+ }
+
+ /* Busco secuencialmente en el bloque el registro a leer */
+ offset = 0;
+ do {
+ /* Copio el id del registro de la cabecera. */
+ memcpy(&curr_reg_id, block + offset, sizeof(int));
+ offset += sizeof(int);
+ /* Copio el tamaño del registro de la cabecera. */
+ memcpy(&curr_reg_size, block + offset, sizeof(unsigned long));
+ offset += sizeof(unsigned long);
+ if (curr_reg_id == reg_id) {
+ /* XXX Posible checkeo de reg_size == curr_reg_size */
+ memcpy(reg_ptr, block + offset, curr_reg_size);
+ break;
+ }
+ /* Desplazo el offset */
+ offset += curr_reg_size;
+ } while (offset < efs->tam_bloque);
+
+ free(block);
+ return 0;
+}
+
+int emufs_tipo1_leer_bloque(EMUFS *emu, int ID, void* ptr)
+{
+ return -1; /* FIXME Error */
+}
+
+int emufs_tipo1_grabar_registro(EMUFS *emu, void *ptr, unsigned long tam)
+{
+ return -1; /* FIXME Error */
+}
+
+/*Busco en el archivo de Id`s un Id valido para un nuevo registro*/
+int emufs_tipo1_get_id(EMUFS *emu)
+{
+ return -1; /* FIXME Error */
+}
+
+/*Graba un bloque en el archivo*/
+int emufs_tipo1_grabar_bloque(EMUFS *emu, void *ptr, int num)
+{
+ return -1; /* FIXME Error */
+}
+
+/*borra un registro de un bloque y acomoda los registros que quedan*/
+int emufs_tipo1_borrar_registro(EMUFS *emu, int ID, unsigned long tam_reg)
+{
+ return -1; /* FIXME Error */
+}