strcat(name_f_fsc,".fsc");
/*cargo el registro*/
- reg.block = num_bloque; /*no incremento cant, porque grabe el nuevo bloque antes y no lo conte!!*/
+ reg.block = num_bloque;
reg.free_space = fs;
/*lo guardo en el archivo al final "a+"*/
if ( (f_fsc = fopen(name_f_fsc,"a+"))==NULL ) return -1;
return 0;
}
+/* busca el bloque y le resta fs de espacio libre */
int emufs_fsc_actualizar(EMUFS *emu, int num_bloque, int fs)
{
FILE *f_fsc;
while ( !feof(f_fsc) ){
if ( fread(®,sizeof(BLOCK_FREE_T),1,f_fsc) != 1) continue;
if ( reg.block == num_bloque ){
- reg.free_space -= fs;
+ reg.free_space = fs;
fseek(f_fsc,-sizeof(BLOCK_FREE_T),SEEK_CUR);
fwrite(®,sizeof(BLOCK_FREE_T),1,f_fsc);
break;
fclose(f_fsc);
return 0;
}
+
+/* me devuelve el ID del bloque donde quepa un registro, y guarda en fs el espacio libre que queda en el bloque */
+int emufs_fsc_buscar_lugar(EMUFS *emu, unsigned long tam, int *fs)
+{
+ FILE *f_fsc;
+ BLOCK_FREE_T reg;
+ char name_f_fsc[255];
+
+ strcpy(name_f_fsc,emu->nombre);
+ strcat(name_f_fsc,".fsc");
+
+ if ( (f_fsc = fopen(name_f_fsc,"r"))==NULL ) return -1;
+
+ /* Inicializo la estructura para evitar que si el archivo esta vacio
+ * el resultado sea correcto
+ */
+ reg.block = -1;
+ *fs = emu->tam_bloque;
+ while( !feof(f_fsc) ){
+ if (fread(®,sizeof(BLOCK_FREE_T),1,f_fsc) != 1) continue;
+ if ( reg.free_space >= tam+sizeof(int))
+ break;
+ else {
+ reg.block = -1;
+ *fs = emu->tam_bloque;
+ }
+ }
+
+ fclose(f_fsc);
+ if (reg.block != -1)
+ *fs = reg.free_space;
+ return reg.block;
+}
+
+int emufs_fsc_get_fs(EMUFS *emu, int num_bloque)
+{
+ FILE *f_fsc;
+ BLOCK_FREE_T reg;
+ char name_f_fsc[255];
+
+ strcpy(name_f_fsc,emu->nombre);
+ strcat(name_f_fsc,".fsc");
+
+ if ( (f_fsc = fopen(name_f_fsc,"r"))==NULL ) return -1;
+
+ while ( !feof(f_fsc) ){
+ if ( fread(®,sizeof(BLOCK_FREE_T),1,f_fsc) != 1 ) continue;
+ if ( reg.block == num_bloque )
+ break;
+ }
+
+ fclose(f_fsc);
+ return reg.free_space;
+}
int emufs_fsc_actualizar(EMUFS *, int, int);
+int emufs_fsc_buscar_lugar(EMUFS *, unsigned long, int *);
+
+int emufs_fsc_get_fs(EMUFS *, int);
+
#endif /* _FSC_H */
if ( (file = fopen(name_f,"a+"))==NULL ) return -1; /*ERROR*/
/* me devuelve el ID del bloque donde quepa un registro y el espacio libre en "fs"*/
- num_bloque = emufs_tipo3_buscar_lugar(emu, tam, &fs);
+ num_bloque = emufs_fsc_buscar_lugar(emu, tam, &fs);
printf("Lugar = %d bloque = %d\n", fs, num_bloque);
/*si no hay bloques con suficiente espacio creo un bloque nuevo */
if (num_bloque == -1) {
fclose(file);
num_bloque = cant;
/* grabo el nuevo registro en el archivo de espacios libres */
- if ( emufs_fsc_agregar(emu, num_bloque, emu->tam_bloque - tam-sizeof(int)) != 0 ) {
+ if ( emufs_fsc_agregar(emu, num_bloque, emu->tam_bloque - tam - sizeof(int)) != 0 ) {
free(bloque);
return -1;
}
return -1; /* se produjo un error */
}
/*actualizo el archivo de espacios libres*/
- if ( emufs_fsc_actualizar(emu, num_bloque, tam+sizeof(int)) != 0 ){
+ if ( emufs_fsc_actualizar(emu, num_bloque, fs - tam - sizeof(int)) != 0 ){
free(bloque);
return -1;
}
return 0;
}
-
-
-/* me devuelve el ID del bloque donde quepa un registro, y guarda en fs el espacio libre que queda en el bloque */
-int emufs_tipo3_buscar_lugar(EMUFS *emu, unsigned long tam, int *fs)
-{
- FILE *f_block_free;
- BLOCK_FREE_T reg;
- char name_f_block_free[255];
-
- strcpy(name_f_block_free,emu->nombre);
- strcat(name_f_block_free,".fsc");
-
- if ( (f_block_free = fopen(name_f_block_free,"r"))==NULL ) return -1;
-
- /* Inicializo la estructura para evitar que si el archivo esta vacio
- * el resultado sea correcto
- */
- reg.block = -1;
- *fs = emu->tam_bloque;
- while( !feof(f_block_free) ){
- if (fread(®,sizeof(BLOCK_FREE_T),1,f_block_free) != 1) continue;
- if ( reg.free_space >= tam )
- break;
- else {
- reg.block = -1;
- *fs = emu->tam_bloque;
- }
- }
-
- fclose(f_block_free);
- if (reg.block != -1)
- *fs = reg.free_space;
- return reg.block;
-}
-
/*borra un registro de un bloque y acomoda los registros que quedan*/
int emufs_tipo3_borrar_registro(EMUFS *emu, int ID, int tam_reg)
{
- int num_bloque, ptr_elim, ptr_mov, ID_aux, cant, i;
+ int num_bloque, ptr_elim, ptr_mov, ID_aux, cant, i, fs;
long size;
char *bloque;
FILE *f_block_reg;
}
/*actualizo archivo .fsc*/
- if ( emufs_fsc_actualizar(emu, num_bloque, -(tam_reg + sizeof(int)) ) != 0 ) return -1;
+ fs = emufs_fsc_get_fs(emu, num_bloque);
+ if ( emufs_fsc_actualizar(emu, num_bloque, fs + tam_reg + sizeof(int)) != 0 ) return -1;
/*actualizo archivo .did*/
if ( emufs_did_agregar(emu, ID) != 0 ) return -1;
* Autores: Nicolás Dimov <sagardua@uolsinectis.com.ar>
*----------------------------------------------------------------------------
*
- * $Id: command.cpp 220 2003-11-19 23:10:40Z luca $
+ * $Id$
*
*/
fp->borrar_registro(fp, n4, 100);
+ fp->borrar_registro(fp, n2, 100);
+ fp->borrar_registro(fp, n6, 100);
n8 = fp->grabar_registro(fp, i, 100);
fp->leer_registro(fp, n8, b, 100);