]> git.llucax.com Git - z.facultad/75.06/emufs.git/blob - emufs/tipo2.c
Cambios Realizados (son varios, read carefuly):
[z.facultad/75.06/emufs.git] / emufs / tipo2.c
1 /* vim: set noexpandtab tabstop=4 shiftwidth=4:
2  *----------------------------------------------------------------------------
3  *                                  emufs
4  *----------------------------------------------------------------------------
5  * This file is part of emufs.
6  *
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
10  * version.
11  *
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
15  * details.
16  *
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  *----------------------------------------------------------------------------
24  *
25  * $Id: tipo3.c 85 2004-04-08 23:39:28Z sagar $
26  *
27  */
28
29 /***************************************************************/
30 /* Implementación del Tipo Archivo 2: Registros Variables, Sin */
31 /* Bloques at all.                                             */
32 /***************************************************************/
33
34 #include "tipo2.h"
35 #include "idx.h"
36 #include "fsc.h"
37 #include "did.h"
38
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)
48 {
49         EMUFS_REG_ID n_IdReg;
50         EMUFS_FREE n_FreeSpace;
51         EMUFS_OFFSET n_WrtOffset,n_RegOffset;
52         FILE *f_data;
53         char name_f[255];
54         
55         /* Armamos el filename del archivo de datos */
56         strcpy(name_f,emu->nombre);
57         strcat(name_f,".dat");
58         
59         if ( (f_data = fopen(name_f,"a+"))==NULL ) return -1; /*ERROR*/
60         
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);
65         
66         /* Si no encontre un gap, entonces escribo el registro al final */
67         if (n_WrtOffset == -1) {                       
68                 
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);
73
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);
78                                 
79                 /* Bye */
80                 printf("Tipo2.c >> RegNr: %lu inserted at Offset: %lu\n",n_IdReg,n_RegOffset);
81                 fclose(f_data);
82                 
83         } else {
84                 
85         }
86                 
87         /* Finalmente, actualizamos el indice de registros (offsets) */
88         emufs_idx_agregar(emu,n_IdReg,n_RegOffset);
89                 
90         return n_IdReg;
91 }
92
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)
101 {       
102         FILE *f_data;
103         char name_f[255];
104         EMUFS_OFFSET n_RegOffset;
105          
106     /* Armamos el filename del archivo de datos */
107         strcpy(name_f,emu->nombre);
108         strcat(name_f,".dat");
109
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);
113         else 
114           return -1;
115                         
116         if ((f_data = fopen(name_f,"a+")) == NULL) return -1; /* ERROR */
117         fclose(f_data);
118         
119         return(0);
120 }
121
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)
128 {
129         EMUFS_REG_ID n_RegId;
130
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);
134         
135         return n_RegId; 
136 }