+
+/* Sincroniza el Index con las posiciones de los datos, luego de un recompactar */
+int emufs_tipo2_updateidx(EMUFS *efs)
+{
+ char name_fdat[255];
+ FILE *datfile;
+ EMUFS_REG_ID reg_id = -1;
+ EMUFS_OFFSET reg_offset = -1;
+ EMUFS_REG_SIZE reg_size = -1;
+
+ strcpy(name_fdat,efs->nombre);
+ strcat(name_fdat,".dat");
+
+ /* Obtengo el tamanio del .dat */
+ if ( (datfile = fopen(name_fdat,"rb+")) == NULL){
+ PERR("No se pudo abrir el archivo");
+ return -1;
+ }
+
+ /* Recorremos el archivo y actualizamos el .idx */
+ fseek(datfile,sizeof(EMUFS_Tipo),SEEK_SET);
+ while (!feof(datfile))
+ {
+ /* Leo un ID y actualizo el offset en el .idx */
+ reg_offset = ftell(datfile);
+ if (fread(®_id,sizeof(EMUFS_REG_ID),1,datfile) != 1) continue;
+ emufs_idx_actualizar(efs,reg_id,reg_offset);
+ /* Salteo la data del registro, para leer el proximo header */
+ fread(®_size,sizeof(EMUFS_REG_SIZE),1,datfile);
+ fseek(datfile,reg_size,SEEK_CUR);
+ }
+
+ return 0;
+}
+
+void* emufs_tipo2_leer_registro_raw(EMUFS *efs, EMUFS_REG_ID id, EMUFS_REG_SIZE *size, int *pos)
+{
+ FILE* f_data;
+ char *registro; /* registro a leer */
+ char name_f[255];
+ EMUFS_OFFSET reg_offset; /* offset donde se encuentra el registro */
+
+ strcpy(name_f,efs->nombre);
+ strcat(name_f,".dat");
+
+ /* Obtenemos la posicion del registro en el .dat */
+ reg_offset = emufs_idx_buscar_registro(efs, id);
+ if (reg_offset == EMUFS_NOT_FOUND) {
+ PERR("Registro no encontrado");
+ return NULL;
+ }
+
+ /* Levantamos el registro */
+ if ((f_data = fopen(name_f, "rb")) == NULL) {
+ PERR("No se puede abrir archivo");
+ return NULL;
+ }
+ fseek(f_data,reg_offset+sizeof(EMUFS_REG_ID), SEEK_SET);
+ fread(size,sizeof(EMUFS_REG_SIZE),1,f_data);
+ registro = (char*)malloc(*size+sizeof(EMUFS_REG_ID)+sizeof(EMUFS_REG_SIZE)+100);
+ if (reg_offset >= 50) {
+ fseek(f_data, reg_offset - 50, SEEK_SET);
+ (*pos) = 50;
+ } else {
+ /* Si no hay 50 antes mio, estoy cerca del 0! */
+ (*pos) = reg_offset;
+ fseek(f_data, 0, SEEK_SET);
+ }
+ (*size) += sizeof(EMUFS_REG_ID)+sizeof(EMUFS_REG_SIZE)+100;
+ fread(registro,*size, 1,f_data);
+ fclose(f_data);
+
+ return registro;
+}