+
+EMUFS_Estadisticas emufs_tipo3_leer_estadisticas(EMUFS *emu)
+{
+ FILE *f;
+ EMUFS_Estadisticas stats;
+ EMUFS_REG_ID *tmp;
+ char name_f[255];
+
+ memset(&stats,0,sizeof(EMUFS_Estadisticas));
+ strcpy(name_f,emu->nombre);
+ strcat(name_f,".dat");
+ if ( (f = fopen(name_f,"r")) == NULL){
+ PERR("No se pudo abrir el archivo");
+ return stats;
+ }
+
+ fseek(f,0,SEEK_END);
+ stats.tam_archivo_bytes = ftell(f);
+ stats.cant_bloques =(stats.tam_archivo_bytes-sizeof(EMUFS_Tipo)-sizeof(EMUFS_BLOCK_SIZE)-sizeof(EMUFS_REG_SIZE))/
+ emu->tam_bloque;
+ tmp = emufs_idx_get(emu, &stats.tam_archivo);
+ if (tmp) free(tmp);
+ stats.info_control=stats.tam_archivo*sizeof(EMUFS_REG_ID)+sizeof(EMUFS_Tipo)+
+ sizeof(EMUFS_BLOCK_SIZE)+sizeof(EMUFS_REG_SIZE);
+ /* Obtengo las stats de FSC */
+ stats.total_fs = emufs_fsc_get_total_fs(emu);
+ stats.media_fs = emufs_fsc_get_media_fs(emu);
+ emufs_fsc_get_max_min_fs(emu,&stats.min_fs,&stats.max_fs);
+
+ fclose(f);
+ return stats;
+}
+
+EMUFS_REG_ID emufs_tipo3_modificar_registro(EMUFS *emu, EMUFS_REG_ID id, void *data, EMUFS_REG_SIZE size, int *error)
+{
+ emufs_tipo3_borrar_registro(emu, id);
+ return emufs_tipo3_grabar_registro(emu, data, size, error);
+}
+
+void* emufs_tipo3_leer_registro_raw(EMUFS *emu, EMUFS_REG_ID ID, EMUFS_REG_SIZE *size, int *pos)
+{
+ char* bloque, *tmp, *cur;
+ EMUFS_BLOCK_ID block;
+ EMUFS_REG_ID ID_aux;
+ EMUFS_BLOCK_SIZE iterador = 0;
+ int err, cant_bloques, i;
+
+ bloque = NULL;
+ if (emu->tam_reg < emu->tam_bloque) {
+ /* Aca estoy en el caso de que 1 registro entra en 1 solo bloque */
+ block = emufs_idx_buscar_registro(emu,ID);
+ if ( block == EMUFS_NOT_FOUND ) {
+ return NULL;
+ }
+ if ((bloque = emufs_tipo3_leer_bloque(emu, block, &err)) == NULL) {
+ return NULL;
+ }
+
+ ID_aux = -1;
+ iterador = 0;
+
+ /* Busco el offset desde el comienzo desde donde arranca el registro
+ * buscado, para luego resaltarlo en al GUI
+ */
+ while ( iterador < emu->tam_bloque ) {
+ memcpy(&ID_aux, bloque+iterador, sizeof(EMUFS_REG_ID));
+ if ( ID_aux == ID ){
+ *pos = iterador;
+ *size = emu->tam_bloque;
+ break;
+ }
+ iterador += sizeof(EMUFS_REG_ID);
+ iterador += emu->tam_reg;
+ }
+ } else {
+ /* Junto todos los bloques que ocupa el registro y agrego un separador de bloques */
+
+ /* Busco el primer bloque */
+ block = emufs_idx_buscar_registro(emu,ID);
+ if ( block == EMUFS_NOT_FOUND ){
+ return NULL;
+ }
+ cant_bloques = emu->tam_reg / (emu->tam_bloque - sizeof(EMUFS_REG_ID))+1;
+ *size = emu->tam_bloque*cant_bloques + cant_bloques*2 - sizeof(EMUFS_REG_ID)*(cant_bloques-1);
+ bloque = (char *)malloc(*size);
+ cur = bloque;
+ *pos = 0;
+
+ /* El bloque 0 va completo */
+ err = 0;
+ if ((tmp = emufs_tipo3_leer_bloque(emu, block, &err)) == NULL) {
+ /* Oops! ... un bloque no existe, todo mal! */
+ free(bloque);
+ return NULL;
+ }
+ memcpy(cur, tmp, emu->tam_bloque);
+ cur += emu->tam_bloque;
+ memcpy(cur, "<>", 2);
+ cur += 2;
+ free(tmp);
+
+ /* En resto de los bloques no pongo el ID porque ya esta en el primero */
+ for(i=1; i<cant_bloques; i++) {
+ err = 0;
+ if ((tmp = emufs_tipo3_leer_bloque(emu, block+i, &err)) == NULL) {
+ /* Oops! ... un bloque no existe, todo mal! */
+ free(bloque);
+ return NULL;
+ }
+ memcpy(cur, tmp+sizeof(EMUFS_REG_ID), emu->tam_bloque-sizeof(EMUFS_REG_ID));
+ cur += emu->tam_bloque - sizeof(EMUFS_REG_ID);
+ memcpy(cur, "<>", 2);
+ cur += 2;
+ free(tmp);
+ }
+ (*cur) = '\0';
+ }
+ return bloque;
+}