]> git.llucax.com Git - z.facultad/75.06/emufs.git/blobdiff - emufs/external_sort/mergepool.c
Se termina el external sort. La interfaz ya es completamente genérica y pasó un
[z.facultad/75.06/emufs.git] / emufs / external_sort / mergepool.c
index c60af0267a3ce3b22c1f33d3391577c615342bcb..a3646f85b15972edea1027e67b0293b84156900f 100644 (file)
 
 static int mergepool_switch_to_input(MERGEPOOL* mp);
 
-MERGEPOOL* mergepool_new()
+MERGEPOOL* mergepool_new(size_t reg_size, CMP_FUNC cmp)
 {
        MERGEPOOL* mp = malloc(sizeof(MERGEPOOL));
        if (!mp) return 0; /* ERROR: no hay más memoria */
        mp->pool = 0;
        mp->size = 0;
        mp->mode = OUTPUT;
+       mp->reg_size = reg_size;
+       mp->cmp = cmp;
        return mp;
 }
 
@@ -65,7 +67,7 @@ void mergepool_delete(MERGEPOOL* mp)
 MERGEFILE* mergepool_add_file(MERGEPOOL* mp)
 {
        MERGEFILE** pool;
-       MERGEFILE*  new_mf = mergefile_new();
+       MERGEFILE*  new_mf = mergefile_new(mp->reg_size);
        assert(mp);
        assert(mp->mode == OUTPUT);
        if (!new_mf) return 0;
@@ -78,8 +80,9 @@ MERGEFILE* mergepool_add_file(MERGEPOOL* mp)
        return mp->pool[mp->size++];
 }
 
-int mergepool_append_data(MERGEPOOL* mp, int data)
+int mergepool_append_data(MERGEPOOL* mp, void* data)
 {
+       assert(data);
        assert(mp);
        assert(mp->pool);
        assert(mp->pool[mp->size-1]);
@@ -87,28 +90,32 @@ int mergepool_append_data(MERGEPOOL* mp, int data)
        return mergefile_push(mp->pool[mp->size-1], data);
 }
 
-int mergepool_pop_min(MERGEPOOL* mp, int* min)
+void* mergepool_pop_min(MERGEPOOL* mp)
 {
+       void* min;
        int i;
-       int assigned = -1;
+       int assigned = -1; /* no asignado */
        assert(mp);
        assert(mp->pool);
        assert(mp->size);
+       /* si todavía está en modo OUTPUT, lo pasó a INPUT */
        if (mp->mode == OUTPUT) {
                mergepool_switch_to_input(mp);
        }
+       /* busco el mínimo */
        for (i = 0; i < mp->size; i++) {
-               if (mergefile_has_more(mp->pool[i])
-                               && ((assigned == -1) || mergefile_peek(mp->pool[i]) < *min)) {
-                       assigned = i;
-                       *min = mergefile_peek(mp->pool[i]);
+               if (mergefile_has_more(mp->pool[i])     &&
+                               ((assigned == -1) || LT(mp, mergefile_peek(mp->pool[i]), min))){
+                       assigned = i; /* se asigno el valor del archivo i */
+                       min = mergefile_peek(mp->pool[i]);
                }
        }
+       /* si fue asignado */
        if (assigned != -1) {
                        mergefile_pop(mp->pool[assigned]); /* lo saco del archivo */
-                       return 1; /* OK, se obtuvo un mínimo */
+                       return min; /* OK, se obtuvo un mínimo */
        }
-       return 0; /* No hay más */
+       return 0; /* si no fue asignado es porque no hay más archivos con datos */
 }
 
 int mergepool_switch_to_input(MERGEPOOL* mp)
@@ -117,7 +124,8 @@ int mergepool_switch_to_input(MERGEPOOL* mp)
        assert(mp);
        assert(mp->pool);
        for (i = 0; i < mp->size; i++) {
-               if (!mergefile_switch_to_input(mp->pool[i])) return 0;
+               /* lo paso a modo INPUT y si hubo error salgo */
+               if (!mergefile_switch_to_input(mp->pool[i])) return 0; /* ERROR */
        }
        mp->mode = INPUT;
        return 1; /* OK */