- tipo2.c | .h: Added funcion emufs_tipo2_leer_registro, por lo cual el tipo 2 ya se encuentra terminado. Also Added inicializador de punteros a funciones para la estructura EMUFS*, mencionado arriba.
- tipo2_main.c: Se agregaron algunos tests de leer registro, espacio libre, etc.
switch (tipo) {
case T1:
+ /* Asigna punteros a funciones. */
emufs_tipo1_inicializar(efs);
/* Guarda cabeceras propias. */
case T2:
/* Asigna punteros a funciones. */
- efs->grabar_registro = emufs_tipo2_grabar_registro;
- efs->borrar_registro = emufs_tipo2_borrar_registro;
- efs->nombre = str_dup(filename);
- /*efs->leer_registro = emufs_tipo2_leer_registro;*/
+ emufs_tipo2_inicializar(efs);
break;
case T3:
switch (tipo) {
case T1:
+ /* Asigna punteros a funciones. */
emufs_tipo1_inicializar(efs);
/* Lee cabeceras propias. */
if (!fread(&(efs->tam_bloque), sizeof(EMUFS_BLOCK_SIZE), 1, fp)) {
}
break;
case T2:
+ /* Asigna punteros a funciones. */
+ emufs_tipo2_inicializar(efs);
break;
case T3:
if ((!fread(&(efs->tam_bloque), sizeof(EMUFS_BLOCK_SIZE), 1, fp)) ||
fclose(fp);
return NULL;
}
+ /* Asigna punteros a funciones. */
efs->leer_bloque = emufs_tipo3_leer_bloque;
efs->leer_registro = emufs_tipo3_leer_registro;
efs->grabar_registro = emufs_tipo3_grabar_registro;
- /*efs->borrar_registro = emufs_tipo3_borrar_registro;*/
+ efs->borrar_registro = emufs_tipo3_borrar_registro;
break;
}
#include "fsc.h"
#include "did.h"
+/* Asigna los punteros a las funciones apropiadas para el Tipo2 */
+int emufs_tipo2_inicializar(EMUFS* efs)
+{
+ efs->grabar_registro = emufs_tipo2_grabar_registro;
+ efs->borrar_registro = emufs_tipo2_borrar_registro;
+ efs->leer_registro = emufs_tipo2_leer_registro;
+}
+
+/**********************************************************************/
+/* EMUFS_REG_ID emufs_tipo2_grabar_registro(EMUFS *efs, void *ptr, */
+/* EMUFS_REG_SIZE n_RegSize) */
+/* Objetivo: Grabar un registro en un archivo del Tipo 2. */
+/* Parametros: EMUFS *efs // Struct con handlers + info del openfile. */
+/* void *ptr // Puntero al buffer (registro) a guardar */
+/* EMUFS_REG_SIZE n_RegSize // Size del reg en cuestion */
+/**********************************************************************/
+void *emufs_tipo2_leer_registro(EMUFS* efs, EMUFS_REG_ID reg_id,
+ EMUFS_REG_SIZE* reg_size, int *err)
+{
+ 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, reg_id);
+ if (reg_offset == EMUFS_NOT_FOUND) {
+ /* TODO Manejo de errores */
+ PERR("Registro no encontrado");
+ *err = EMUFS_NOT_FOUND;
+ return NULL;
+ }
+
+ /* Levantamos el registro */
+ if ((f_data = fopen(name_f, "rb")) == NULL) {
+ PERR("No se puede abrir archivo");
+ *err = 4; /* EMUFS_ERROR_CANT_OPEN_FILE */
+ return NULL; /* FIXME ERROR */
+ }
+ fseek(f_data,reg_offset+sizeof(EMUFS_REG_ID),0);
+ fread(reg_size,sizeof(EMUFS_REG_SIZE),1,f_data);
+ registro = (char*)malloc(*reg_size);
+ fread(registro,*reg_size,1,f_data);
+ fclose(f_data);
+
+ return registro;
+}
+
/**********************************************************************/
/* EMUFS_REG_ID emufs_tipo2_grabar_registro(EMUFS *efs, void *ptr, */
/* EMUFS_REG_SIZE n_RegSize) */
fclose(f_data);
/* printf("Dummy Fill: %s\n",dummyfill); */ /*Uncomment to check */
-
+ free(dummyfill);
return (0);
}
#include <unistd.h>
#include "emufs.h"
-EMUFS_REG_ID emufs_tipo2_grabar_registro(EMUFS *, void *, EMUFS_REG_SIZE, int*);
+int emufs_tipo2_inicializar(EMUFS*);
+void *emufs_tipo2_leer_registro(EMUFS* , EMUFS_REG_ID , EMUFS_REG_SIZE *, int *);
+EMUFS_REG_ID emufs_tipo2_grabar_registro(EMUFS *, void *, EMUFS_REG_SIZE, int *);
int emufs_tipo2_borrar_registro(EMUFS*, EMUFS_REG_ID);
-int emufs_tipo2_get_regsize(EMUFS *efs, EMUFS_OFFSET n_RegPos,EMUFS_REG_SIZE *n_RegSize);
-int emufs_tipo2_dummyfill(EMUFS *efs, EMUFS_OFFSET n_RegPos,EMUFS_REG_SIZE n_Amount);
-
-/* OJO!! Fijate que cambio el prototipo:
- int emufs_tipo2_leer_registro(EMUFS *, EMUFS_REG_ID , void *, EMUFS_REG_SIZE);
- int emufs_tipo2_buscar_registro(EMUFS *, int); */
+int emufs_tipo2_get_regsize(EMUFS *, EMUFS_OFFSET n_RegPos,EMUFS_REG_SIZE *);
+int emufs_tipo2_dummyfill(EMUFS *, EMUFS_OFFSET n_RegPos,EMUFS_REG_SIZE n_Amount);
#endif /* _EMUFS_TIPO2_H_ */
#include <stdio.h>
#include <string.h>
#include "emufs.h"
+#include "fsc.h"
int main(int argc, char *argv[])
{
- EMUFS *fp;
+ EMUFS *efs;
EMUFS_REG_ID n0, n1, n2, n3, n4, n5, n6, n7, n8;
+ EMUFS_REG_SIZE reg_size;
+ char *registro;
char a[11];
char b[63];
char c[13];
char h[63];
char i[43];
int err = 0;
+ EMUFS_FREE totalfsc = 0;
strcpy(a, "1234567890");
strcpy(b, "REGISTRO NUMERO 2. ESTE REGISTRO ES MUCHO MAS LARGO QUE EL UNO");
/* Creamos el archivo Tipo 2. Pasamos blocksize = 0 y Regsize = 0 pues estar */
/* variable. */
- fp = emufs_crear("articulos", T2, 0, 0);
+ efs = emufs_crear("articulos", T2, 0, 0);
/* Grabamos un par de registros */
- n0 = fp->grabar_registro(fp, a, 11, &err);
- n1 = fp->grabar_registro(fp, b, 63, &err);
- n2 = fp->grabar_registro(fp, c, 13, &err);
- n3 = fp->grabar_registro(fp, d, 8, &err);
- n4 = fp->grabar_registro(fp, e, 39, &err);
- n5 = fp->grabar_registro(fp, f, 9, &err);
- n6 = fp->grabar_registro(fp, g, 41, &err);
- n7 = fp->grabar_registro(fp, h, 63, &err);
+ n0 = efs->grabar_registro(efs, a, 11, &err);
+ n1 = efs->grabar_registro(efs, b, 63, &err);
+ n2 = efs->grabar_registro(efs, c, 13, &err);
+ n3 = efs->grabar_registro(efs, d, 8, &err);
+ n4 = efs->grabar_registro(efs, e, 39, &err);
+ n5 = efs->grabar_registro(efs, f, 9, &err);
+ n6 = efs->grabar_registro(efs, g, 41, &err);
+ n7 = efs->grabar_registro(efs, h, 63, &err);
/* Borramos un registro del medio */
printf("tipo2_main.c >> Borrando registro: %lu\n",n5);
- fp->borrar_registro(fp, n5);
+ efs->borrar_registro(efs, n5);
printf("tipo2_main.c >> Borrando registro: %lu\n",n1);
- fp->borrar_registro(fp, n1);
+ efs->borrar_registro(efs, n1);
printf("tipo2_main.c >> Borrando registro: %lu\n",n0);
- fp->borrar_registro(fp, n0);
+ efs->borrar_registro(efs, n0);
printf("tipo2_main.c >> Borrando registro: %lu\n",n3);
- fp->borrar_registro(fp, n3);
+ efs->borrar_registro(efs, n3);
printf("tipo2_main.c >> Borrando registro: %lu\n",n7);
- fp->borrar_registro(fp, n7);
+ efs->borrar_registro(efs, n7);
printf("tipo2_main.c >> Borrando registro: %lu\n",n4);
- fp->borrar_registro(fp, n4);
+ efs->borrar_registro(efs, n4);
- n8 = fp->grabar_registro(fp, d, 8, &err);
+ n8 = efs->grabar_registro(efs, d, 8, &err);
printf("tipo2_main.c >> Id recuperado: %lu\n",n8);
- emufs_destruir(fp);
+ totalfsc = emufs_fsc_get_total_fs(efs);
+ printf("tipo2_main.c >> Total de espacio libre en el .dat: %lu\n",totalfsc);
+
+ registro = efs->leer_registro(efs,n2,®_size,&err);
+ if (err == 0) {
+ printf("tipo2_main.c >>Registro: %lu Size: %lu Content: %s\n\n",n2,reg_size,registro);
+ printf("Total de espacio libre en el .dat: %lu\n",totalfsc);
+ }
+
+ emufs_destruir(efs);
return 0;
}