1 /* vim: set noexpandtab tabstop=4 shiftwidth=4:
2 *----------------------------------------------------------------------------
4 *----------------------------------------------------------------------------
5 * This file is part of emufs.
7 * emufs is free software; you can redistribute it and/or modify it under the
8 * terms of the GNU General Public License as published by the Free Software
9 * Foundation; either version 2 of the License, or (at your option) any later
12 * emufs is distributed in the hope that it will be useful, but WITHOUT ANY
13 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
17 * You should have received a copy of the GNU General Public License along
18 * with emufs; if not, write to the Free Software Foundation, Inc., 59 Temple
19 * Place, Suite 330, Boston, MA 02111-1307 USA
20 *----------------------------------------------------------------------------
21 * Creado: vie abr 9 16:47:32 ART 2004
22 * Autores: Leandro Lucarella <llucare@fi.uba.ar>
23 *----------------------------------------------------------------------------
31 * Archivo con bloque de longitud parametrizada, registro de longitud variable.
33 * Implementación del archivo con bloques de longitud parametrizada y registros
34 * de longitud variable.
45 int emufs_tipo1_leer_registro(EMUFS* efs, int reg_id, void* reg_ptr, unsigned long reg_size)
47 int block_id; /* id del bloque en donde esta el registro a leer */
48 char* block; /* bloque leido (en donde está el registro a leer) */
49 ptrdiff_t offset; /* offset del bloque a leido */
50 unsigned long curr_reg_size; /* tamaño del registro leido secuencialmente */
51 int curr_reg_id; /* id del registro leido secuencialmente */
53 block_id = emufs_idx_buscar_registro(efs, reg_id);
54 block = (char*) malloc(efs->tam_bloque);
56 /* TODO Manejo de errores */
57 printf("No hay memoria.\n");
61 if (emufs_tipo1_leer_bloque(efs, block_id, block) == -1) {
62 /* TODO Manejo de errores */
64 printf("no se pudo leer el bloque\n");
68 /* Busco secuencialmente en el bloque el registro a leer */
71 /* Copio el id del registro de la cabecera. */
72 memcpy(&curr_reg_id, block + offset, sizeof(int));
73 offset += sizeof(int);
74 /* Copio el tamaño del registro de la cabecera. */
75 memcpy(&curr_reg_size, block + offset, sizeof(unsigned long));
76 offset += sizeof(unsigned long);
77 if (curr_reg_id == reg_id) {
78 /* XXX Posible checkeo de reg_size == curr_reg_size */
79 memcpy(reg_ptr, block + offset, curr_reg_size);
82 /* Desplazo el offset */
83 offset += curr_reg_size;
84 } while (offset < efs->tam_bloque);
90 int emufs_tipo1_leer_bloque(EMUFS *emu, int ID, void* ptr)
92 return -1; /* FIXME Error */
95 int emufs_tipo1_grabar_registro(EMUFS *emu, void *ptr, unsigned long tam)
97 return -1; /* FIXME Error */
100 /*Busco en el archivo de Id`s un Id valido para un nuevo registro*/
101 int emufs_tipo1_get_id(EMUFS *emu)
103 return -1; /* FIXME Error */
106 /*Graba un bloque en el archivo*/
107 int emufs_tipo1_grabar_bloque(EMUFS *emu, void *ptr, int num)
109 return -1; /* FIXME Error */
112 /*borra un registro de un bloque y acomoda los registros que quedan*/
113 int emufs_tipo1_borrar_registro(EMUFS *emu, int ID, unsigned long tam_reg)
115 return -1; /* FIXME Error */