]> git.llucax.com Git - z.facultad/75.06/emufs.git/blobdiff - emufs/fsc.c
* Reestructuro para que quede mas claro
[z.facultad/75.06/emufs.git] / emufs / fsc.c
index 465d19fe9383e7a31f579d5d6130b3328a4fb59d..7e556bd0eedeb298b1061106fcba0fcb9c71c2a4 100644 (file)
@@ -81,32 +81,32 @@ int emufs_fsc_agregar(EMUFS *emu, EMUFS_BLOCK_ID marker, EMUFS_FREE freespace)
 /* Agrega un GAP en el archivo de Gaps para Filetype 2 */
 int emufs_fsc_agregar_gap(EMUFS *emu, EMUFS_OFFSET marker, EMUFS_FREE freespace)
 {
 /* Agrega un GAP en el archivo de Gaps para Filetype 2 */
 int emufs_fsc_agregar_gap(EMUFS *emu, EMUFS_OFFSET marker, EMUFS_FREE freespace)
 {
-       FILE *f_fsc;
+       FILE *f_fsc;
        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,limit,file_size,reg_count = 0,cant_moved = 0;
        char found = 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,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);
-       
+
        gap_before.marker = -1;
        gap_after.marker = -1;
        gap_before.marker = -1;
        gap_after.marker = -1;
-       
+
        /* Busco si hay un GAP por delante y/o por detras del que se esta por crear */
        /* para en dicho caso realizar un merge! */
        if ( (f_fsc = fopen(name_f_fsc,"r+")) == NULL) return -1; 
        while ( !feof(f_fsc) ){
                if ( fread(&gap_aux,sizeof(EMUFS_FSC),1,f_fsc) != 1) continue;
        /* Busco si hay un GAP por delante y/o por detras del que se esta por crear */
        /* para en dicho caso realizar un merge! */
        if ( (f_fsc = fopen(name_f_fsc,"r+")) == NULL) return -1; 
        while ( !feof(f_fsc) ){
                if ( fread(&gap_aux,sizeof(EMUFS_FSC),1,f_fsc) != 1) continue;
-               
+
                /* Chequeo si es un gap justo anterior al nuestro */
                if (gap_aux.marker+gap_aux.freespace == marker) {
                        gap_before.marker = gap_aux.marker;
                        gap_before.freespace = gap_aux.freespace;
                        pos_gap_before = reg_count;
                }
                /* Chequeo si es un gap justo anterior al nuestro */
                if (gap_aux.marker+gap_aux.freespace == marker) {
                        gap_before.marker = gap_aux.marker;
                        gap_before.freespace = gap_aux.freespace;
                        pos_gap_before = reg_count;
                }
-               
+
                /* Chequeo si es un gap justo posterior al nuestro */           
                if (gap_aux.marker == marker+freespace) {
                        gap_after.marker = gap_aux.marker;
                /* Chequeo si es un gap justo posterior al nuestro */           
                if (gap_aux.marker == marker+freespace) {
                        gap_after.marker = gap_aux.marker;
@@ -115,8 +115,8 @@ 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)) {
                /* Lo guardo ordenado donde deba ir */
                gap_new.marker = marker;
        if ((gap_before.marker == -1) && (gap_after.marker == -1)) {
                /* Lo guardo ordenado donde deba ir */
                gap_new.marker = marker;
@@ -153,69 +153,69 @@ int emufs_fsc_agregar_gap(EMUFS *emu, EMUFS_OFFSET marker, EMUFS_FREE freespace)
                        fseek(f_fsc,0,SEEK_END);
                        fwrite(&gap_new,sizeof(EMUFS_FSC),1,f_fsc);
                }
                        fseek(f_fsc,0,SEEK_END);
                        fwrite(&gap_new,sizeof(EMUFS_FSC),1,f_fsc);
                }
-               
+
                fclose(f_fsc);          
        }
                fclose(f_fsc);          
        }
-       
+
        /* Si encuentro un GAP Justo por delante pero no por detras */
        if ((gap_before.marker != -1) && (gap_after.marker == -1))
        {
        /* Si encuentro un GAP Justo por delante pero no por detras */
        if ((gap_before.marker != -1) && (gap_after.marker == -1))
        {
-         /* Me posiciono en el registro que indica dicho gap y lo reescribo con */
-         /* la suma de los espacios libres */    
-         fseek(f_fsc,sizeof(EMUFS_FSC)*pos_gap_before,0);
-      gap_new.marker = gap_before.marker;
-         gap_new.freespace = gap_before.freespace + freespace;
-         fwrite(&gap_new,sizeof(EMUFS_FSC),1,f_fsc);
-         fclose(f_fsc);
+               /* Me posiciono en el registro que indica dicho gap y lo reescribo con */
+               /* la suma de los espacios libres */      
+               fseek(f_fsc,sizeof(EMUFS_FSC)*pos_gap_before,0);
+               gap_new.marker = gap_before.marker;
+               gap_new.freespace = gap_before.freespace + freespace;
+               fwrite(&gap_new,sizeof(EMUFS_FSC),1,f_fsc);
+               fclose(f_fsc);
        }
        }
-       
+
        /* Si encuentro un GAP Justo por detras pero no por delante */
        if ((gap_before.marker == -1) && (gap_after.marker != -1))
        {  
        /* Si encuentro un GAP Justo por detras pero no por delante */
        if ((gap_before.marker == -1) && (gap_after.marker != -1))
        {  
-         /* Me posiciono en el registro que indica dicho gap y lo reescribo con */
-         /* los datos actualizados de offset y espacio */
-         fseek(f_fsc,sizeof(EMUFS_FSC)*pos_gap_after,0);
-      gap_new.marker = gap_after.marker - freespace;
-         gap_new.freespace = gap_after.freespace + freespace;
-         fwrite(&gap_new,sizeof(EMUFS_FSC),1,f_fsc);
-         fclose(f_fsc);
+               /* Me posiciono en el registro que indica dicho gap y lo reescribo con */
+               /* los datos actualizados de offset y espacio */
+               fseek(f_fsc,sizeof(EMUFS_FSC)*pos_gap_after,0);
+               gap_new.marker = gap_after.marker - freespace;
+               gap_new.freespace = gap_after.freespace + freespace;
+               fwrite(&gap_new,sizeof(EMUFS_FSC),1,f_fsc);
+               fclose(f_fsc);
        }
        }
-       
+
        /* Finalmente, si encuentro Justo por delante y por detras..*/
        if ((gap_before.marker != -1) && (gap_after.marker != -1))
        { 
        /* Finalmente, si encuentro Justo por delante y por detras..*/
        if ((gap_before.marker != -1) && (gap_after.marker != -1))
        { 
-         /* Guardo el nuevo GAP que posee los tres espacios sumados */
-         if (pos_gap_before < pos_gap_after) {
-               fseek(f_fsc,sizeof(EMUFS_FSC)*pos_gap_before,0);
-               destination = sizeof(EMUFS_FSC)*pos_gap_after;
-         }
-         else {
-               fseek(f_fsc,sizeof(EMUFS_FSC)*pos_gap_after,0);
-               destination = sizeof(EMUFS_FSC)*pos_gap_before;
-         }
-      gap_new.marker = gap_before.marker;
-         gap_new.freespace = gap_before.freespace + freespace + gap_after.freespace;
-         fwrite(&gap_new,sizeof(EMUFS_FSC),1,f_fsc);
-               
-         /* Preparo el escenario para la movida de registros */
-         source = destination+sizeof(EMUFS_FSC); /* Salteo el gap que elimino! */
-         fseek(f_fsc,0,SEEK_END);
-         file_size = ftell(f_fsc);
-         reg_count = (file_size - source) / sizeof(EMUFS_FSC);
-         
-         /* Comienzo a mover */
-         while (cant_moved < reg_count) {
-        fseek(f_fsc,source,0);
-        fread(&gap_new,sizeof(EMUFS_FSC),1,f_fsc);
-               fseek(f_fsc,-sizeof(EMUFS_FSC)*2,SEEK_CUR);
+               /* Guardo el nuevo GAP que posee los tres espacios sumados */
+               if (pos_gap_before < pos_gap_after) {
+                       fseek(f_fsc,sizeof(EMUFS_FSC)*pos_gap_before,0);
+                       destination = sizeof(EMUFS_FSC)*pos_gap_after;
+               }
+               else {
+                       fseek(f_fsc,sizeof(EMUFS_FSC)*pos_gap_after,0);
+                       destination = sizeof(EMUFS_FSC)*pos_gap_before;
+               }
+               gap_new.marker = gap_before.marker;
+               gap_new.freespace = gap_before.freespace + freespace + gap_after.freespace;
                fwrite(&gap_new,sizeof(EMUFS_FSC),1,f_fsc);
                fwrite(&gap_new,sizeof(EMUFS_FSC),1,f_fsc);
-               source += sizeof(EMUFS_FSC);            
-               ++cant_moved;
-         }
-         fclose(f_fsc);
-         truncate(name_f_fsc, file_size - sizeof(EMUFS_FSC));
+
+               /* Preparo el escenario para la movida de registros */
+               source = destination+sizeof(EMUFS_FSC); /* Salteo el gap que elimino! */
+               fseek(f_fsc,0,SEEK_END);
+               file_size = ftell(f_fsc);
+               reg_count = (file_size - source) / sizeof(EMUFS_FSC);
+
+               /* Comienzo a mover */
+               while (cant_moved < reg_count) {
+                       fseek(f_fsc,source,0);
+                       fread(&gap_new,sizeof(EMUFS_FSC),1,f_fsc);
+                       fseek(f_fsc,-sizeof(EMUFS_FSC)*2,SEEK_CUR);
+                       fwrite(&gap_new,sizeof(EMUFS_FSC),1,f_fsc);
+                       source += sizeof(EMUFS_FSC);            
+                       ++cant_moved;
+               }
+               fclose(f_fsc);
+               truncate(name_f_fsc, file_size - sizeof(EMUFS_FSC));
        }       
        }       
-       
+
     return 0;
 }
 
     return 0;
 }
 
@@ -519,12 +519,12 @@ EMUFS_FREE emufs_fsc_get_media_fs(EMUFS *emu)
        else return 0;
 }
 
        else return 0;
 }
 
-int emufs_fsc_get_cant_bloques_vacios(EMUFS *emu)
+EMUFS_BLOCK_ID emufs_fsc_get_cant_bloques_vacios(EMUFS *emu)
 {
        FILE *f_fsc;
        EMUFS_FSC reg;
        char name_f_fsc[255];
 {
        FILE *f_fsc;
        EMUFS_FSC reg;
        char name_f_fsc[255];
-       int cant=0;
+       EMUFS_BLOCK_ID cant=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);
@@ -548,3 +548,22 @@ int emufs_fsc_truncate(EMUFS* efs, EMUFS_BLOCK_ID blocks)
        strcat(name_f_fsc, EMUFS_FSC_EXT);
        return truncate(name_f_fsc, blocks * sizeof(EMUFS_FSC));
 }
        strcat(name_f_fsc, EMUFS_FSC_EXT);
        return truncate(name_f_fsc, blocks * sizeof(EMUFS_FSC));
 }
+
+EMUFS_BLOCK_ID emufs_fsc_get_num_blocks(EMUFS* efs)
+{
+       FILE *f_fsc;
+       char name_f_fsc[255];
+       EMUFS_BLOCK_ID cant = 0;
+       
+       strcpy(name_f_fsc, efs->nombre);
+       strcat(name_f_fsc, EMUFS_FSC_EXT);
+
+       if (!(f_fsc = fopen(name_f_fsc, "ab"))) {
+               PERR("error al abrir archivo .fsc");
+               return EMUFS_NOT_FOUND;
+       }
+       cant = ftell(f_fsc) / sizeof(EMUFS_FSC);
+       fclose(f_fsc);
+       return cant;
+}
+