int grabar_registro(EMUFS *emu, void *ptr, unsigned long tam)
{
- int ID_aux, fs, num_bloque;
+ int ID_aux, fs, num_bloque, cant;
FILE *file;
+ FILE *f_id;
+ FILE *f_block_reg;
+ FILE *f_block_free;
+ BLOCK_FREE_T reg;
+ BLOCK_REG_T reg_b;
char name_f[255];
+ char name_f_block_reg[255];
+ char name_f_id[255];
+ char name_f_free[255];
char* bloque;
strcpy(name_f,emu->nombre);
strcat(name_f,".dat");
- if ( (file = fopen(name_f,"r"))==NULL ) return -1; /*ERROR*/
- /*FIXME: FALTA ACTUALIZAR LOS ARCHIVOS DE ESPACIO LIBRE Y TODO LO DEMAS !!!!!!!!
- *FIXME: FALTA ACTUALIZAR LOS ARCHIVOS DE ESPACIO LIBRE Y TODO LO DEMAS !!!!!!!!
- *FIXME: FALTA ACTUALIZAR LOS ARCHIVOS DE ESPACIO LIBRE Y TODO LO DEMAS !!!!!!!!
- *FIXME: FALTA ACTUALIZAR LOS ARCHIVOS DE ESPACIO LIBRE Y TODO LO DEMAS !!!!!!!!
- *FIXME: FALTA ACTUALIZAR LOS ARCHIVOS DE ESPACIO LIBRE Y TODO LO DEMAS !!!!!!!!
- *FIXME: FALTA ACTUALIZAR LOS ARCHIVOS DE ESPACIO LIBRE Y TODO LO DEMAS !!!!!!!!
- *FIXME: FALTA ACTUALIZAR LOS ARCHIVOS DE ESPACIO LIBRE Y TODO LO DEMAS !!!!!!!!
- */
+ strcpy(name_f_block_reg,emu->nombre);
+ strcat(name_f_block_reg,".id3");
+
+ strcpy(name_f_id,emu->nombre);
+ strcat(name_f_id,".idc");
+
+ strcpy(name_f_free,emu->nombre);
+ strcat(name_f_free,".fsc");
+
+
+ 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);
/*si no hay bloques con suficiente espacio creo un bloque nuevo */
/*cargo el bloque en "bloque"*/
bloque = (char*)malloc(emu->tam_bloque);
if ( leer_bloque(emu,num_bloque,bloque)== -1) return -1;
- /*El error puede haberse producido porque la funcion buscar_lugar devolvio -1, el cual es un bloque invalido*/
+ /*El error puede haberse producido porque la funcion leer_bloque devolvio -1, el cual es un bloque invalido*/
/*insertar el registro en el bloque*/
/*tengo que buscar un ID valido para el nuevo registro*/
ID_aux = get_id(emu);
/*guardo el bloque en el archivo*/
if ( grabar_bloque(emu, bloque, num_bloque) != 0) return -1; /* se produjo un error */
}
+
+ /*actualizo el archivo de id`s*/
+ if ( (f_id = fopen(name_f_id,"a+"))==NULL ) return -1; /*ERROR*/
+ fwrite(&ID_aux,sizeof(ID_aux),1,f_id);
+ fclose(f_id);
+
+ /*actualizo el archivo de espacios libres*/
+ /*tengo que buscar la cantidad de bloques que existen*/
+ /*me paro al principio salteando el encabezado del archivo*/
+ fseek(file,sizeof(int)+sizeof(char),SEEK_CUR);
+ while ( !feof(file) ){
+ fread(bloque,emu->tam_bloque,1,file);
+ cant++; /*ya grabe el nuevo bloque !!!*/
+ }
+ 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;
+ /*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);
+ fclose(f_block_free);
+
+ /*actualizo el archivo de bloques y registros*/
+ if ( (f_block_reg = fopen(name_f_block_reg,"a+"))==NULL ) return -1; /*ERROR*/
+ reg_b.block = reg.block;
+ reg_b.id_reg = ID_aux;
+ fwrite(®_b,sizeof(reg_b),1,f_block_reg);
+ fclose(f_block_reg);
+
free(bloque);
return ID_aux;
}
fread(®,sizeof(reg),1,f_block_free);
if ( reg.free_space >= tam )
break;
- else reg.block = -1;
+ else {
+ reg.block = -1;
+ *fs = emu->tam_bloque;
+ }
}
fclose(f_block_free);