]> git.llucax.com Git - z.facultad/75.06/emufs.git/commitdiff
Ahora si, recompactacion finalizada. Se me habia cagado un file de anoche para hoy...
authorAlan Kennedy <kennedya@3dgames.com.ar>
Sat, 17 Apr 2004 18:48:12 +0000 (18:48 +0000)
committerAlan Kennedy <kennedya@3dgames.com.ar>
Sat, 17 Apr 2004 18:48:12 +0000 (18:48 +0000)
emufs/fsc.c
emufs/tipo2.c
emufs/tipo2_main.c

index 562ae32fa2bd905b597718761a15cd1a6733365e..cc634c51f136bee9fe01f21df6f978c1fb756871 100644 (file)
@@ -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;
        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);
                
        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;
        }
        
                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)) {
        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;
                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);          
        }
        
                fclose(f_fsc);          
        }
        
index 9f28dc687a53d74ea625d35a9cd90a23eca4367e..10867d678c7a89625d050d0e11a095316e8e67e6 100644 (file)
@@ -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;
        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);
        
        /* 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);
        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);
        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;
        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");
        strcpy(name_fdat,efs->nombre);
        strcpy(name_ffsc,efs->nombre);
        strcat(name_fdat,".dat");
index 42dffceb237f88e424dc0113207992dafe48bcd8..108a0a2b1bf6113bbee71270557141a4fe236b7d 100644 (file)
@@ -115,7 +115,7 @@ int main(int argc, char *argv[])
        
        /* Recompacto */
        printf("Recompactando...\n");
        
        /* Recompacto */
        printf("Recompactando...\n");
-       emufs_tipo2_compactar(efs);
+       efs->compactar(efs);
        
        /* Obtengo stats nevas */
        stats = efs->leer_estadisticas(efs);
        
        /* Obtengo stats nevas */
        stats = efs->leer_estadisticas(efs);