* Autores: Leandro Lucarella <llucare@fi.uba.ar>
*----------------------------------------------------------------------------
*
- * $Id: tipo1.c 548 2004-05-28 22:44:27Z llucare $
+ * $Id$
*
*/
#include <string.h>
#include <assert.h>
-MERGEFILE* mergefile_new()
+MERGEFILE* mergefile_new(size_t reg_size)
{
- MERGEFILE* mf = malloc(sizeof(MERGEFILE));
+ MERGEFILE* mf;
+ assert(reg_size);
+ mf = malloc(sizeof(MERGEFILE));
if (!mf) {
return 0;
}
/* abre archivo */
if (!(mf->fp = tmpfile())) {
+ free(mf->next);
free(mf);
return 0;
}
- mf->more = 0;
+ mf->next = 0;
+ mf->reg_size = reg_size;
return mf;
}
assert(mf);
assert(mf->fp);
fclose(mf->fp);
+ if (mf->next) free(mf->next);
free(mf);
}
int mergefile_switch_to_input(MERGEFILE* mf)
{
- /* obtiene dato, debe tener al menos uno para ser un mergefile */
+ assert(mf);
+ assert(mf->fp);
+ assert(!mf->next);
+ /* retrocede al principio del archivo y obtiene el primer dato */
if (fseek(mf->fp, 0L, SEEK_SET)) return 0;
- if (fscanf(mf->fp, "%i", &(mf->next)) <= 0) return 0;
- mf->more = 1;
+ /* aloco memoria para el próximo */
+ if (!(mf->next = malloc(mf->reg_size))) return 0;
+ /* leo primer valor */
+ if (!fread(mf->next, mf->reg_size, 1, mf->fp)) {
+ free(mf->next);
+ mf->next = 0;
+ }
return 1; /* OK */
}
-int mergefile_push(MERGEFILE* mf, int data)
+int mergefile_push(MERGEFILE* mf, void* data)
{
assert(mf);
assert(mf->fp);
- return fprintf(mf->fp, "%i\n", data);
+ return fwrite(data, mf->reg_size, 1, mf->fp);
}
-int mergefile_pop(MERGEFILE* mf)
+void* mergefile_pop(MERGEFILE* mf)
{
- int ret;
+ void* ret;
assert(mf);
assert(mf->fp);
- assert(mf->more);
+ /* Si no hay más, devuelvo 0 */
+ if (!mf->next) return 0;
ret = mf->next;
+ /* aloco memoria para el próximo */
+ if (!(mf->next = malloc(mf->reg_size))) {
+ mf->next = ret;
+ return 0;
+ }
/* obtiene dato, si no hay más, se activa el flag */
- if (fscanf(mf->fp, "%i", &(mf->next)) <= 0) mf->more = 0;
+ if (!fread(mf->next, mf->reg_size, 1, mf->fp)) {
+ free(mf->next);
+ mf->next = 0;
+ }
return ret;
}
-int mergefile_peek(MERGEFILE* mf)
+void* mergefile_peek(MERGEFILE* mf)
{
assert(mf);
assert(mf->fp);
- assert(mf->more);
return mf->next;
}
{
assert(mf);
assert(mf->fp);
- return mf->more;
+ return mf->next != 0;
}