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: Fri Apr 10 17:10:00 ART 2004
22 * Autores: Alan Kennedy <kennedya@3dgames.com.ar>
23 *----------------------------------------------------------------------------
25 * $Id: tipo3.c 85 2004-04-08 23:39:28Z sagar $
29 /***************************************************************/
30 /* Implementación del Tipo Archivo 2: Registros Variables, Sin */
32 /***************************************************************/
39 /**********************************************************************/
40 /* EMUFS_REG_ID emufs_tipo2_grabar_registro(EMUFS *emu, void *ptr, */
41 /* EMUFS_REG_SIZE n_RegSize) */
42 /* Objetivo: Grabar un registro en un archivo del Tipo 2. */
43 /* Parametros: EMUFS *emu // Struct con handlers + info del openfile. */
44 /* void *ptr // Puntero al buffer (registro) a guardar */
45 /* EMUFS_REG_SIZE n_RegSize // Size del reg en cuestion */
46 /**********************************************************************/
47 EMUFS_REG_ID emufs_tipo2_grabar_registro(EMUFS *emu, void *ptr, EMUFS_REG_SIZE n_RegSize)
50 EMUFS_FREE n_FreeSpace;
51 EMUFS_OFFSET n_WrtOffset,n_RegOffset;
55 /* Armamos el filename del archivo de datos */
56 strcpy(name_f,emu->nombre);
57 strcat(name_f,".dat");
59 if ( (f_data = fopen(name_f,"a+"))==NULL ) return -1; /*ERROR*/
61 /* Obtengo un offset en donde iniciar la escritura de mi registro */
62 /* de manera segura (habra espacio suficiente) */
63 n_WrtOffset = emufs_fsc_buscar_lugar(emu, n_RegSize, &n_FreeSpace);
64 printf("tipo2.c >> Searching FSC: Offset = %lu FSpace: %lu\n", n_WrtOffset, n_FreeSpace);
66 /* Si no encontre un gap, entonces escribo el registro al final */
67 if (n_WrtOffset == -1) {
69 /* Obtengo un ID libre para el registro y luego grabo a disco */
70 n_IdReg = emufs_tipo2_get_id(emu);
71 fseek(f_data, 0, SEEK_END);
72 n_RegOffset = ftell(f_data);
74 /* Escribo [RegId]|[RegSize]|[RegData] */
75 fwrite(&n_IdReg,sizeof(int),1,f_data);
76 fwrite(&n_RegSize,sizeof(int),1,f_data);
77 fwrite(ptr,n_RegSize,1,f_data);
80 printf("Tipo2.c >> RegNr: %lu inserted at Offset: %lu\n",n_IdReg,n_RegOffset);
87 /* Finalmente, actualizamos el indice de registros (offsets) */
88 emufs_idx_agregar(emu,n_IdReg,n_RegOffset);
93 /**********************************************************************/
94 /* int emufs_tipo2_borrar_registro(EMUFS *emu, EMUFS_REG_ID n_IdReg) */
95 /* Objetivo: Borra un registro determinado y actualiza los archivos */
96 /* de Posicion Relativa (Indice-Offset) y el de Gaps */
97 /* Parametros: EMUFS *emu // Struct con handlers + info del openfile. */
98 /* EMUFS_REG_ID n_IdReg // Id del registro a eliminar. */
99 /**********************************************************************/
100 int emufs_tipo2_borrar_registro(EMUFS *emu, EMUFS_REG_ID n_IdReg)
104 EMUFS_OFFSET n_RegOffset;
106 /* Armamos el filename del archivo de datos */
107 strcpy(name_f,emu->nombre);
108 strcat(name_f,".dat");
110 /* Obtenemos el tamanio del bloque */
111 if ((n_RegOffset = emufs_idx_buscar_registro(emu,n_IdReg)) != -1)
112 printf("tipo2.c >> Searching Reg %lu...Found at offset: %lu\n",n_IdReg,n_RegOffset);
116 if ((f_data = fopen(name_f,"a+")) == NULL) return -1; /* ERROR */
122 /**********************************************************************/
123 /* EMUFS_REG_ID emufs_tipo2_get_id(EMUFS *emu) */
124 /* Objetivo: Devuelve un Id apropiado y disponible para un nuevo reg */
125 /* Parametros: EMUFS *emu // Struct con handlers + info del openfile. */
126 /**********************************************************************/
127 EMUFS_REG_ID emufs_tipo2_get_id(EMUFS *emu)
129 EMUFS_REG_ID n_RegId;
131 /* Si no se hallo un id libre, entonces debo usar el maximo + 1 */
132 if ( (n_RegId = emufs_did_get_last(emu)) == -1 )
133 n_RegId = emufs_idx_buscar_mayor_id(emu);