+
+void emufs_tipo3_compactar(EMUFS *emu)
+{
+ FILE *f;
+ EMUFS_REG_ID *tmp, max_id;
+ EMUFS_REG_SIZE size;
+ EMUFS_Estadisticas s;
+ char name[255];
+ char *reg;
+ int err=0, ID_aux, cant_bloques, i, bloques_vacios=0;
+
+ /* si el bloque es mas chico que el registro no hace falta compactar */
+ /*if( emu->tam_reg-sizeof(EMUFS_REG_ID) > emu->tam_bloque ) return; */
+
+ strcpy(name,emu->nombre);
+ strcat(name,".dat");
+
+ if ( (f=fopen(name,"r") == NULL) ){
+ PERR("No se pudo abrir el archivo");
+ return;
+ }
+ s = emufs_tipo3_leer_estadisticas(emu);
+ cant_bloques = s.cant_bloques;
+
+ /* si solo hay un bloque no hace falta compactar */
+ if ( cant_bloques == 0 ){
+ fclose(f);
+ return;
+ }
+ tmp = emufs_idx_get(emu, &max_id);
+ if (tmp) free(tmp);
+ for( i=0; i<=max_id; i++){
+ /* si el id no existe paso al siguiente*/
+ if ( emufs_idx_existe_id(emu, i) != 0 ) continue;
+ reg = emufs_tipo3_leer_registro(emu, i, &size, &err);
+ if (err){
+ PERR("No se pudo leer el registro");
+ fclose(f);
+ return;
+ }
+ emufs_tipo3_borrar_registro(emu, i);
+ ID_aux = emufs_tipo3_grabar_registro(emu, reg, emu->tam_reg, &err);
+ i++;
+ }
+ /*tengo que truncar el archivo*/
+ bloques_vacios = emufs_fsc_get_cant_bloques_vacios(emu)-1;
+ truncate(name, sizeof(EMUFS_Tipo)+sizeof(EMUFS_REG_SIZE)+sizeof(EMUFS_BLOCK_SIZE)+emu->tam_bloque*(cant_bloques-bloques_vacios));
+ /*fclose(f); problemas con el fclose FIXME!!!*/
+ free(reg);
+}