X-Git-Url: https://git.llucax.com/z.facultad/75.06/emufs.git/blobdiff_plain/8ed872279800f018aa1dfa690d646428d68820c1..HEAD:/emufs/external_sort/mergefile.c diff --git a/emufs/external_sort/mergefile.c b/emufs/external_sort/mergefile.c index f5bf0b0..52dabd7 100644 --- a/emufs/external_sort/mergefile.c +++ b/emufs/external_sort/mergefile.c @@ -22,7 +22,7 @@ * Autores: Leandro Lucarella *---------------------------------------------------------------------------- * - * $Id: tipo1.c 548 2004-05-28 22:44:27Z llucare $ + * $Id$ * */ @@ -41,18 +41,22 @@ #include #include -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; } @@ -61,42 +65,59 @@ void mergefile_delete(MERGEFILE* 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; } @@ -104,6 +125,6 @@ int mergefile_has_more(MERGEFILE* mf) { assert(mf); assert(mf->fp); - return mf->more; + return mf->next != 0; }