X-Git-Url: https://git.llucax.com/z.facultad/75.06/emufs.git/blobdiff_plain/6a1699c5c4c2ba05db94118fe15188372ab7d37e..7ccae609792550a7d81d2496742def35f003bf26:/emufs/external_sort/mergefile.h diff --git a/emufs/external_sort/mergefile.h b/emufs/external_sort/mergefile.h index 1183d14..6cbf748 100644 --- a/emufs/external_sort/mergefile.h +++ b/emufs/external_sort/mergefile.h @@ -22,7 +22,7 @@ * Autores: Leandro Lucarella *---------------------------------------------------------------------------- * - * $Id: tipo1.h 542 2004-05-28 19:45:02Z rmarkie $ + * $Id$ * */ @@ -35,33 +35,65 @@ * */ -#ifndef _MERGEFILE_H_ -#define _MERGEFILE_H_ +#ifndef _EXTSORT_MERGEFILE_H_ +#define _EXTSORT_MERGEFILE_H_ #include -#define MERGEFILE_TEMPLATE "sorted_chunk.%i" - +/** Archivo temporal con un fragmento ordenado. + * Es una especie de cola almacenada en un archivo temporal. El modo de + * utilización es el siguiente: primero \ref mergefile_push "se lo llena" , + * luego \ref mergefile_switch_to_input "lo pasa a modo de lectura" y + * finalmente se van \ref mergefile_pop "obteniendo los valores" en el mismo + * órden en que se los insertó. A diferencia de una cola regular, primero se + * insertan todos los valores y luego se los extrae. + */ typedef struct { - FILE* fp; - char* filename; - int next; - int more; + FILE* fp; /**< Puntero al archivo donde almacenar los datos. */ + size_t reg_size; /**< Tamaño del registro a almacenar. */ + void* next; /**< Buffer con el próximo dato a obtener. */ } MERGEFILE; -char* mergefile_makefilename(int i); - -MERGEFILE* mergefile_new(int i); +/** Crea un nuevo archivo temporal para ordenamiento externo. */ +MERGEFILE* mergefile_new(size_t reg_size); +/** Libera un archivo temporal para ordenamiento externo. */ void mergefile_delete(MERGEFILE* mf); -int mergefile_peek_next(MERGEFILE* mf); +/** Pasa a modo lectura el archivo. + * Antes de efectuar cualquier tipo de lectura (mergefile_pop() o + * mergefile_peek()) hay que llamar a esta función. + * \return 0 si hubo error. + */ +int mergefile_switch_to_input(MERGEFILE* mf); + +/** Inserta un nuevo dato en el archivo. + * \return 0 si hubo error. + */ +int mergefile_push(MERGEFILE* mf, void* data); -int mergefile_pop_next(MERGEFILE* mf); +/** Obtiene el próximo dato en el archivo, sacándolo de éste. + * \pre mergefile_switch_to_input() fue ejecutada. + * \return 0 si hubo error, si no, un puntero al próximo dato que debe ser + * liberado después de usado. + */ +void* mergefile_pop(MERGEFILE* mf); +/** Espía el próximo dato en el archivo sin sacarlo. + * \pre mergefile_switch_to_input() fue ejecutada. + * \return 0 si hubo error, si no, un puntero al próximo dato que no debe ser + * liberado hasta que se quite el dato del archivo con mergefile_pop() + * definitivamente. + */ +void* mergefile_peek(MERGEFILE* mf); + +/** Verifica si quedan más datos para leer en el archivo. + * \pre mergefile_switch_to_input() fue ejecutada. + * \return 0 si no hay más. + */ int mergefile_has_more(MERGEFILE* mf); -#endif /* _MERGEFILE_H_ */ +#endif /* _EXTSORT_MERGEFILE_H_ */