+/* 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: Fri Apr 10 17:10:00 ART 2004
+ * Autores: Alan Kennedy <kennedya@3dgames.com.ar>
+ *----------------------------------------------------------------------------
+ *
+ * $Id: tipo3.c 85 2004-04-08 23:39:28Z sagar $
+ *
+ */
+
+/***************************************************************/
+/* Implementación del Tipo Archivo 2: Registros Variables, Sin */
+/* Bloques at all. */
+/***************************************************************/
+
+#include "tipo2.h"
+#include "idx.h"
+#include "fsc.h"
+#include "did.h"
+
+/**********************************************************************/
+/* EMUFS_REG_ID emufs_tipo2_grabar_registro(EMUFS *emu, void *ptr, */
+/* EMUFS_REG_SIZE n_RegSize) */
+/* Objetivo: Grabar un registro en un archivo del Tipo 2. */
+/* Parametros: EMUFS *emu // Struct con handlers + info del openfile. */
+/* void *ptr // Puntero al buffer (registro) a guardar */
+/* EMUFS_REG_SIZE n_RegSize // Size del reg en cuestion */
+/**********************************************************************/
+EMUFS_REG_ID emufs_tipo2_grabar_registro(EMUFS *emu, void *ptr, EMUFS_REG_SIZE n_RegSize)
+{
+ EMUFS_REG_ID n_IdReg;
+ EMUFS_FREE n_FreeSpace;
+ EMUFS_OFFSET n_WrtOffset,n_RegOffset;
+ FILE *f_data;
+ char name_f[255];
+
+ /* Armamos el filename del archivo de datos */
+ strcpy(name_f,emu->nombre);
+ strcat(name_f,".dat");
+
+ if ( (f_data = fopen(name_f,"a+"))==NULL ) return -1; /*ERROR*/
+
+ /* Obtengo un offset en donde iniciar la escritura de mi registro */
+ /* de manera segura (habra espacio suficiente) */
+ n_WrtOffset = emufs_fsc_buscar_lugar(emu, n_RegSize, &n_FreeSpace);
+ printf("tipo2.c >> Searching FSC: Offset = %lu FSpace: %lu\n", n_WrtOffset, n_FreeSpace);
+
+ /* Si no encontre un gap, entonces escribo el registro al final */
+ if (n_WrtOffset == -1) {
+
+ /* Obtengo un ID libre para el registro y luego grabo a disco */
+ n_IdReg = emufs_tipo2_get_id(emu);
+ fseek(f_data, 0, SEEK_END);
+ n_RegOffset = ftell(f_data);
+
+ /* Escribo [RegId]|[RegSize]|[RegData] */
+ fwrite(&n_IdReg,sizeof(int),1,f_data);
+ fwrite(&n_RegSize,sizeof(int),1,f_data);
+ fwrite(ptr,n_RegSize,1,f_data);
+
+ /* Bye */
+ printf("Tipo2.c >> RegNr: %lu inserted at Offset: %lu\n",n_IdReg,n_RegOffset);
+ fclose(f_data);
+
+ } else {
+
+ }
+
+ /* Finalmente, actualizamos el indice de registros (offsets) */
+ emufs_idx_agregar(emu,n_IdReg,n_RegOffset);
+
+ return n_IdReg;
+}
+
+/**********************************************************************/
+/* int emufs_tipo2_borrar_registro(EMUFS *emu, EMUFS_REG_ID n_IdReg) */
+/* Objetivo: Borra un registro determinado y actualiza los archivos */
+/* de Posicion Relativa (Indice-Offset) y el de Gaps */
+/* Parametros: EMUFS *emu // Struct con handlers + info del openfile. */
+/* EMUFS_REG_ID n_IdReg // Id del registro a eliminar. */
+/**********************************************************************/
+int emufs_tipo2_borrar_registro(EMUFS *emu, EMUFS_REG_ID n_IdReg)
+{
+ FILE *f_data;
+ char name_f[255];
+ EMUFS_OFFSET n_RegOffset;
+
+ /* Armamos el filename del archivo de datos */
+ strcpy(name_f,emu->nombre);
+ strcat(name_f,".dat");
+
+ /* Obtenemos el tamanio del bloque */
+ if ((n_RegOffset = emufs_idx_buscar_registro(emu,n_IdReg)) != -1)
+ printf("tipo2.c >> Searching Reg %lu...Found at offset: %lu\n",n_IdReg,n_RegOffset);
+ else
+ return -1;
+
+ if ((f_data = fopen(name_f,"a+")) == NULL) return -1; /* ERROR */
+ fclose(f_data);
+
+ return(0);
+}
+
+/**********************************************************************/
+/* EMUFS_REG_ID emufs_tipo2_get_id(EMUFS *emu) */
+/* Objetivo: Devuelve un Id apropiado y disponible para un nuevo reg */
+/* Parametros: EMUFS *emu // Struct con handlers + info del openfile. */
+/**********************************************************************/
+EMUFS_REG_ID emufs_tipo2_get_id(EMUFS *emu)
+{
+ EMUFS_REG_ID n_RegId;
+
+ /* Si no se hallo un id libre, entonces debo usar el maximo + 1 */
+ if ( (n_RegId = emufs_did_get_last(emu)) == -1 )
+ n_RegId = emufs_idx_buscar_mayor_id(emu);
+
+ return n_RegId;
+}