/* archivo con bloques parametrizados y registro constante */
#include "param_cte.h"
-FILE* f_block_reg;
-FILE* f_block_free;
-FILE* f_reg_exist;
/** Leo un registro del archivo, devuelve cero si no lo encuentra.**/
int leer_registro(EMUFS *emu, int ID, void *ptr, unsigned long tam_reg)
{
+ FILE* f_block_reg;
+ //FILE* f_block_free;
+ //FILE* f_reg_exist;
char* bloque;
char name_f_block_reg[255];
int block, ID_aux;
/*si existe, lo busco en el archivo de bloques*/
block = buscar_registro(emu,ID); /*me devuelve el nro de bloque al que pertenece el registro*/
- printf("block %d\n", block);
- bloque = (char*)malloc(emu->tam_bloque);
- if (leer_bloque(emu, block, bloque)==-1)
+ bloque = (char*)malloc(emu->tam_bloque);
+ if (bloque == NULL) {
+ printf("No hay memoria.\n");
+ return -1;
+ }
+ if (leer_bloque(emu, block, bloque)==-1) {
+ free(bloque);
return -1; /*No se pudo leer el bloque*/
-
- while ( iterador != emu->tam_bloque ){
+ }
+
+ while ( iterador < emu->tam_bloque ){
memcpy(&ID_aux, bloque+iterador, sizeof(int));
- iterador += 4;
+ iterador += sizeof(int);
if ( ID_aux == ID ){
- memcpy(ptr,&bloque[iterador],tam_reg);
+ memcpy(ptr,bloque+iterador,tam_reg);
break;
}
- iterador += tam_reg;
- }
-
- fclose(f_block_reg);
+ iterador += tam_reg;
+ }
+
+ fclose(f_block_reg);
free(bloque);
return 0;
}
/*busco el ID en el archivo xxxxx.ids, para ver si puedo usar ese ID.*/
int existe_registro(EMUFS *emu, int ID)
{
+ FILE* f_reg_exist;
int reg;
char name_f_reg_exist[255];
strcpy(name_f_reg_exist,emu->nombre);
/*busca el registro ID en el archivo "block_reg.dat" y devuelve el nro de bloque en el que se encuentra*/
int buscar_registro(EMUFS *emu, int ID)
{
+ FILE* f_block_reg;
BLOCK_REG_T reg;
char name_f_block_reg[255];
strcpy(name_f_block_reg,emu->nombre);
if (fread(®,sizeof(reg),1,f_block_reg) != 1) continue;
if ( reg.id_reg == ID ){
fclose(f_block_reg);
- printf("%d %d %d\n", reg.id_reg, ID, reg.block);
return reg.block;
}
}
strcat(name_f,".dat");
if ( (file = fopen(name_f,"r"))==NULL ) return -1; /*ERROR*/
- fseek(file,sizeof(int)+sizeof(char),SEEK_SET);
+ fseek(file,sizeof(int)+sizeof(char)+sizeof(int),SEEK_SET);
/*FIXME: verificar que no se pase de fin de archivo*/
fseek(file,ID*emu->tam_bloque,SEEK_CUR);
if (fread(ptr,emu->tam_bloque,1,file)!=1) return -1;
-
+
fclose(file);
return 0;
}
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 = buscar_lugar(emu, tam, &fs);
+ printf("Lugar %d\n", fs);
/*si no hay bloques con suficiente espacio creo un bloque nuevo */
if (num_bloque == -1) {
/*crear un nuevo bloque en memoria */
/*me paro al principio salteando el encabezado del archivo*/
fseek(file, 0, SEEK_END); /* Me paro al final */
cant = (ftell(file)-(sizeof(int)+sizeof(char))) / emu->tam_bloque;
+ cant--; /* Resto uno porque el numero de bloque debe empezar en 0 */
fclose(file);
/*cargo el registro*/
reg.block = cant; /*no incremento cant, porque grabe el nuevo bloque antes y no lo conte!!*/
- reg.free_space = fs - tam;
+ /* GAZER */
+ printf("FS = %d\n", fs);
+ reg.free_space = fs-tam;
/*lo guardo en el archivo al final "a+"*/
if ( (f_block_free = fopen(name_f_free,"a+"))==NULL ) return -1; /*ERROR*/
fwrite(®,sizeof(reg),1,f_block_free);
/* me devuelve el ID del bloque donde quepa un registro, y guarda en fs el espacio libre que queda en el bloque */
int buscar_lugar(EMUFS *emu, unsigned long tam, int *fs)
{
+ FILE *f_block_free;
BLOCK_FREE_T reg;
char name_f_block_reg[255];
* el resultado sea correcto
*/
reg.block = -1;
+ *fs = emu->tam_bloque;
while( !feof(f_block_free) ){
fread(®,sizeof(reg),1,f_block_free);
if ( reg.free_space >= tam )
}
fclose(f_block_free);
- *fs = reg.free_space;
+ if (reg.block != -1)
+ *fs = reg.free_space;
return reg.block;
}
/*Busco en el archivo de Id`s un Id valido para un nuevo registro*/
int get_id(EMUFS *emu)
{
+ FILE *f_reg_exist, *f_block_reg;
BLOCK_REG_T reg;
int id, max = -1;
char name_f_reg_exist[255];