]> git.llucax.com Git - z.facultad/75.06/emufs.git/blobdiff - emufs/external_sort/mergefile.c
Paso el fin de línea a formato Unix (perdon tenia que verlo para estudiar :P).
[z.facultad/75.06/emufs.git] / emufs / external_sort / mergefile.c
index f5bf0b0a53da80673939409c167c71497950ab30..52dabd7ea81bec491b464fb8dffca6cec3714fd5 100644 (file)
@@ -22,7 +22,7 @@
  * 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;
 }
 
@@ -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;
 }