X-Git-Url: https://git.llucax.com/z.facultad/75.06/emufs.git/blobdiff_plain/9593941016d3b3af6ae22e59391ae5bade27fb47..ab2b55bebc2846e5f7c5270e23c1529ddebb6fef:/emufs/external_sort/mergepool.c diff --git a/emufs/external_sort/mergepool.c b/emufs/external_sort/mergepool.c index c60af02..a3646f8 100644 --- a/emufs/external_sort/mergepool.c +++ b/emufs/external_sort/mergepool.c @@ -42,13 +42,15 @@ 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 */