/* 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*/
- bloque = (char*)malloc(emu->tam_bloque);
+ 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 ){
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;
- }
-
+ iterador += tam_reg;
+ }
+
fclose(f_block_reg);
- /* TODO :Ver por que causa un SEGFAULT ACA!! */
- //free(bloque);
+ 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 ( (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 */
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];