From 15e2ff58d562e0806549711129d83a33d701d850 Mon Sep 17 00:00:00 2001 From: Alan Kennedy Date: Sat, 17 Apr 2004 18:48:12 +0000 Subject: [PATCH] Ahora si, recompactacion finalizada. Se me habia cagado un file de anoche para hoy cuando hize un svn up y estaba mal la insersion de GAPS (no la hacia ordenada), ergo mi recompactar se volvia loco --- emufs/fsc.c | 42 +++++++++++++++++++++++++++++++++++++----- emufs/tipo2.c | 7 ++----- emufs/tipo2_main.c | 2 +- 3 files changed, 40 insertions(+), 11 deletions(-) diff --git a/emufs/fsc.c b/emufs/fsc.c index 562ae32..cc634c5 100644 --- a/emufs/fsc.c +++ b/emufs/fsc.c @@ -84,7 +84,8 @@ int emufs_fsc_agregar_gap(EMUFS *emu, EMUFS_OFFSET marker, EMUFS_FREE freespace) EMUFS_FSC gap_aux,gap_before,gap_after,gap_new; char name_f_fsc[255]; EMUFS_REG_ID pos_gap_before = 0, pos_gap_after = 0; - unsigned long source,destination,file_size,reg_count = 0,cant_moved = 0; + unsigned long source,destination,limit,file_size,reg_count = 0,cant_moved = 0; + char found = 0; strcpy(name_f_fsc,emu->nombre); strcat(name_f_fsc, EMUFS_FSC_EXT); @@ -114,13 +115,44 @@ int emufs_fsc_agregar_gap(EMUFS *emu, EMUFS_OFFSET marker, EMUFS_FREE freespace) reg_count += 1; } - /* Si no encontre gaps ni por delante ni por detras */ +/* Si no encontre gaps ni por delante ni por detras */ if ((gap_before.marker == -1) && (gap_after.marker == -1)) { - /* Lo guardo en el archivo al final */ + /* Lo guardo ordenado donde deba ir */ gap_new.marker = marker; gap_new.freespace = freespace; - fseek(f_fsc,0,SEEK_END); - fwrite(&gap_new,sizeof(EMUFS_FSC),1,f_fsc); + /* Busco el gap que sucede a este */ + fseek(f_fsc,0,SEEK_SET); + while (!feof(f_fsc)) { + fread(&gap_aux,sizeof(EMUFS_FSC),1,f_fsc); + if (gap_aux.marker > gap_new.marker) { + found = 1; + break; + } + } + if (found == 1) { + /* Movemos todos los gaps desde el sucesor hasta el final, una pos adelante */ + limit = ftell(f_fsc) - sizeof(EMUFS_FSC); + fseek(f_fsc,0,SEEK_END); + reg_count = (ftell(f_fsc) - limit) / sizeof(EMUFS_FSC); + source = ftell(f_fsc) - sizeof(EMUFS_FSC); + + while (cant_moved < reg_count) + { + fseek(f_fsc,source,SEEK_SET); + fread(&gap_aux,sizeof(EMUFS_FSC),1,f_fsc); + fwrite(&gap_aux,sizeof(EMUFS_FSC),1,f_fsc); + source -= sizeof(EMUFS_FSC); + ++cant_moved; + } + /* Agrego el nuevo registro */ + fseek(f_fsc,limit,SEEK_SET); + fwrite(&gap_new,sizeof(EMUFS_FSC),1,f_fsc); + } + else { + fseek(f_fsc,0,SEEK_END); + fwrite(&gap_new,sizeof(EMUFS_FSC),1,f_fsc); + } + fclose(f_fsc); } diff --git a/emufs/tipo2.c b/emufs/tipo2.c index 9f28dc6..10867d6 100644 --- a/emufs/tipo2.c +++ b/emufs/tipo2.c @@ -210,8 +210,7 @@ int emufs_tipo2_dummyfill(EMUFS *efs, EMUFS_OFFSET reg_pos, EMUFS_REG_SIZE amoun FILE *f_data; char name_f[255]; char *dummyfill; - char *ptr_cur; - unsigned long fill_size,byte_count; + unsigned long fill_size; /* Armamos el filename del archivo de datos */ strcpy(name_f,efs->nombre); @@ -223,8 +222,6 @@ int emufs_tipo2_dummyfill(EMUFS *efs, EMUFS_OFFSET reg_pos, EMUFS_REG_SIZE amoun fill_size = amount+sizeof(EMUFS_REG_ID)+sizeof(EMUFS_REG_SIZE); dummyfill = (char*)malloc(fill_size); memset(dummyfill, 0, fill_size); - ptr_cur = dummyfill; - for (byte_count = 0; byte_count < fill_size; ++byte_count) memcpy(ptr_cur+byte_count,0,1); fseek(f_data,reg_pos,SEEK_SET); fwrite(dummyfill,fill_size,1,f_data); fclose(f_data); @@ -314,7 +311,7 @@ void emufs_tipo2_compactar(EMUFS *efs) EMUFS_FSC reg1,reg2; unsigned long cant_gaps = 0,mustmove_bytes = 0,source = 0, destination = 0,datsize = 0,totalfsc = 0; - + strcpy(name_fdat,efs->nombre); strcpy(name_ffsc,efs->nombre); strcat(name_fdat,".dat"); diff --git a/emufs/tipo2_main.c b/emufs/tipo2_main.c index 42dffce..108a0a2 100644 --- a/emufs/tipo2_main.c +++ b/emufs/tipo2_main.c @@ -115,7 +115,7 @@ int main(int argc, char *argv[]) /* Recompacto */ printf("Recompactando...\n"); - emufs_tipo2_compactar(efs); + efs->compactar(efs); /* Obtengo stats nevas */ stats = efs->leer_estadisticas(efs); -- 2.43.0