From: Nicolás Dimov Date: Fri, 16 Apr 2004 17:54:34 +0000 (+0000) Subject: Soporte para bloques mas chicos que el registro. X-Git-Tag: svn_import_r684~451 X-Git-Url: https://git.llucax.com/z.facultad/75.06/emufs.git/commitdiff_plain/b345e9c1eaee7c09afb43b6983f34502cd8584e3?ds=sidebyside Soporte para bloques mas chicos que el registro. Bueno, por lo pronto parece que anda todo bien... Faltaria dedicarle un tiempo de testing pero lo probe en la gui y se ve bastante cariñoso. Espero que no falle. Puede ser que queden cosas raras en el archivo de espacios libres. Pero en los otros queda todo pipon. --- diff --git a/emufs/idx.c b/emufs/idx.c index 18d4722..35ebcf4 100644 --- a/emufs/idx.c +++ b/emufs/idx.c @@ -140,7 +140,7 @@ int emufs_idx_agregar(EMUFS *emu, EMUFS_REG_ID id_reg, EMUFS_BLOCK_ID location) strcpy(name_f_idx,emu->nombre); strcat(name_f_idx, EMUFS_IDX_EXT); - if ( (f_idx = fopen(name_f_idx,"a+"))==NULL ) return -1; + if ( (f_idx = fopen(name_f_idx,"r+"))==NULL ) return -1; fseek(f_idx, sizeof(EMUFS_IDX)*id_reg, SEEK_SET); reg.id_reg = id_reg; @@ -214,12 +214,10 @@ EMUFS_REG_ID *emufs_idx_get(EMUFS *emu, EMUFS_REG_ID *cant) count = 0; while (!feof(f_idx)) { if (fread(®, sizeof(EMUFS_IDX), 1, f_idx) != 1) continue; + count++; /* TODO : Verificar errores :-D */ - if (reg.location != EMUFS_NOT_FOUND) { - count++; - tmp = realloc(tmp, count); - tmp[count-1] = reg.id_reg; - } + tmp = realloc(tmp, count); + tmp[count-1] = reg.id_reg; } fclose(f_idx); @@ -265,7 +263,6 @@ int emufs_idx_actualizar(EMUFS *emu, int ID, EMUFS_BLOCK_ID bloque) PERR("No se pudo abrir el archivo"); return -1; } - printf("actualice el id = %d\n",ID); fseek(f_idx,0,SEEK_SET); fseek(f_idx,ID*sizeof(EMUFS_IDX),SEEK_SET); fread(®,sizeof(EMUFS_IDX),1,f_idx); diff --git a/emufs/tipo3.c b/emufs/tipo3.c index 6375a7e..30f63f4 100644 --- a/emufs/tipo3.c +++ b/emufs/tipo3.c @@ -80,7 +80,7 @@ void* emufs_tipo3_leer_registro(EMUFS *emu, EMUFS_REG_ID ID, memcpy(&ID_aux, bloque+iterador, sizeof(EMUFS_REG_ID)); iterador += sizeof(EMUFS_REG_ID); if ( ID_aux == ID ){ - if ( cant_bloques == 0 ) + if ( cant_bloques == 1 ) memcpy(registro,bloque+iterador,emu->tam_reg); else { if ( cant_bloques-1 == i ) @@ -144,7 +144,7 @@ EMUFS_REG_ID emufs_tipo3_grabar_registro(EMUFS *emu, void *ptr, EMUFS_REG_SIZE t FILE *file; char name_f[255]; char* bloque; - int cant_bloques, resto, i; + int cant_bloques, resto, i=0; strcpy(name_f,emu->nombre); strcat(name_f,".dat"); @@ -153,7 +153,6 @@ EMUFS_REG_ID emufs_tipo3_grabar_registro(EMUFS *emu, void *ptr, EMUFS_REG_SIZE t resto = emu->tam_bloque - sizeof(EMUFS_REG_ID); /* me devuelve el ID del bloque donde quepa un registro y el espacio libre en "fs"*/ num_bloque = emufs_fsc_buscar_lugar(emu, emu->tam_reg+sizeof(EMUFS_REG_ID), &fs); - fprintf(stderr, "encontre lugar en %d\n", num_bloque); /*si no hay bloques con suficiente espacio creo un bloque nuevo */ if (num_bloque == -1) { if ( (file = fopen(name_f,"a+"))==NULL ) return -1; /*ERROR*/ @@ -191,7 +190,7 @@ EMUFS_REG_ID emufs_tipo3_grabar_registro(EMUFS *emu, void *ptr, EMUFS_REG_SIZE t if ( emufs_idx_agregar(emu, ID_aux, num_bloque) != 0 ){ free(bloque); return -1; - } + } } /* grabo el nuevo registro en el archivo de espacios libres */ @@ -205,6 +204,8 @@ EMUFS_REG_ID emufs_tipo3_grabar_registro(EMUFS *emu, void *ptr, EMUFS_REG_SIZE t } fclose(file); } else { + /*tengo que buscar un ID valido para el nuevo registro*/ + ID_aux = emufs_idx_get_new_id(emu, err); for (i=0; itam_bloque-sizeof(EMUFS_REG_ID) < emu->tam_reg) - memcpy(bloque+sizeof(EMUFS_REG_ID),&ID_aux,sizeof(EMUFS_REG_ID)); + memcpy(bloque,&ID_aux,sizeof(EMUFS_REG_ID)); else memcpy(bloque+emu->tam_bloque-fs,&ID_aux,sizeof(EMUFS_REG_ID)); /*grabo el registro en el bloque*/ @@ -247,29 +245,21 @@ EMUFS_REG_ID emufs_tipo3_grabar_registro(EMUFS *emu, void *ptr, EMUFS_REG_SIZE t if (bloque != NULL) free(bloque); return -1; } - /*agrego al idx*/ - if ( emufs_idx_agregar(emu, ID_aux, num_bloque) != 0 ){ - if (bloque != NULL) free(bloque); - return -1; - } } else { if ( cant_bloques-1 == i ) resto = emu->tam_reg - i*(emu->tam_bloque - sizeof(EMUFS_REG_ID)); - fs = emufs_fsc_get_fs(emu,num_bloque+i); if ( emufs_fsc_agregar(emu, num_bloque+i, fs-resto) !=0 ){ fclose(file); if (bloque != NULL) free(bloque); return -1; } - /*actualizo el archivo de bloques y registros*/ - if (i == 0) { - /* Tengo que agregar el primer bloque en IDX */ - if( emufs_idx_agregar(emu, ID_aux, num_bloque) != 0 ){ - if (bloque != NULL) free(bloque); - return -1; - } + } + if ( i == 0 ){ + if ( emufs_idx_agregar(emu, ID_aux, num_bloque) != 0 ){ + if (bloque != NULL) free(bloque); + return -1; } - } + } } } free(bloque); @@ -345,10 +335,10 @@ int emufs_tipo3_borrar_registro(EMUFS *emu, EMUFS_REG_ID ID) /*actualizo archivo .fsc*/ if ( emu->tam_bloque < emu->tam_reg ) { for (i=0; itam_reg/(emu->tam_bloque-sizeof(EMUFS_REG_ID))+1; i++) - if ( emufs_fsc_actualizar(emu, num_bloque+i, emu->tam_bloque) != 0 ) return -1; + if ( emufs_fsc_agregar(emu, num_bloque+i, emu->tam_bloque) != 0 ) return -1; } else { fs = emufs_fsc_get_fs(emu, num_bloque); - if ( emufs_fsc_actualizar(emu, num_bloque, fs + emu->tam_reg + sizeof(EMUFS_REG_ID)) != 0 ) return -1; + if ( emufs_fsc_agregar(emu, num_bloque, fs + emu->tam_reg + sizeof(EMUFS_REG_ID)) != 0 ) return -1; } /*actualizo archivo .did*/ if ( emufs_did_agregar(emu, ID) != 0 ) return -1; diff --git a/emufs/tipo3_main.c b/emufs/tipo3_main.c index 602609a..367bb7e 100644 --- a/emufs/tipo3_main.c +++ b/emufs/tipo3_main.c @@ -59,6 +59,14 @@ int main(int argc, char *argv[]) return 1; } + memset(a,'#',100); + memset(c,'#',100); + memset(d,'#',100); + memset(e,'#',100); + memset(f,'#',100); + memset(g,'#',100); + memset(h,'#',100); + memset(i,'#',100); strcpy(a, "1234567890"); strcpy(c, "REGISTRO NUMERO 2. ESTE REGISTRO ES MUCHO MAS LARGO QUE EL UNO"); strcpy(d, "ABCDEFGHIJKL"); @@ -87,13 +95,12 @@ int main(int argc, char *argv[]) b_ptr = fp->leer_registro(fp, v[j], ®_size, &err); printf("Recuperado : %s\n", b_ptr); } - + ver_archivo_FS(fp); printf("BORRANDO REGISTROS....\n"); for (j=0; j<8; j++){ fp->borrar_registro(fp, v[j]); printf("borrado : %d\n", v[j]); } - printf("GRABANDO REGISTROS....\n"); v[0] = fp->grabar_registro(fp, a, 100, &err); v[1] = fp->grabar_registro(fp, c, 100, &err); @@ -103,7 +110,11 @@ int main(int argc, char *argv[]) v[5] = fp->grabar_registro(fp, g, 100, &err); v[6] = fp->grabar_registro(fp, h, 100, &err); v[7] = fp->grabar_registro(fp, i, 100, &err); - + for (j=0; j<8; j++){ + b_ptr = fp->leer_registro(fp, v[j], ®_size, &err); + printf("Recuperado : %s\n", b_ptr); + } + free(b_ptr); ver_archivo_FS(fp);