]> git.llucax.com Git - z.facultad/75.06/emufs.git/blob - emufs/external_sort/sort_test.c
0814e98165881c3c9dee198cf7e38c161f3b2816
[z.facultad/75.06/emufs.git] / emufs / external_sort / sort_test.c
1
2 #include "bufford.h"
3 #include "mergepool.h"
4 #include <stdio.h>
5 #include <string.h>
6 #include <assert.h>
7
8 /*
9 typedef struct
10 {
11         int id;
12         int estado;
13         int nrofac;
14 }
15 RECORD;
16 */
17
18 int cmp(void* x, void* y)
19 {
20         int xx = *(int*)x;
21         int yy = *(int*)y;
22         if (xx > yy) return 1;
23         if (xx < yy) return -1;
24         return 0;
25 }
26
27 void buffer_dump(BUFFORD* b)
28 {
29         int* c;
30         printf("Buffer: ");
31         for (c = bufford_get_min(b); c; c = bufford_get_next(b, c))
32                 printf("%i ", *c);
33         printf("\n");
34 }
35
36 int main(int argc, char* argv[])
37 {
38         MERGEPOOL* pool;
39         FILE* fp;
40         int i;
41         BUFFORD* b = bufford_new(8, sizeof(int), &cmp);
42         if (!b) return 1;
43         if (!(pool = mergepool_new())) {
44                 bufford_delete(b);
45                 return 2;
46         }
47         if (!(fp = fopen(argv[1], "r"))) {
48                 mergepool_delete(pool);
49                 bufford_delete(b);
50                 return 12;
51         }
52         /* lleno el buffer */
53         while (1) {
54                 int reg;
55                 fscanf(fp, "%i", &reg);
56                 if (feof(fp)) break;
57                 if (!bufford_push(b, &reg)) break;
58         }
59         printf("Buffer lleno, hago el primer lote...\n");
60         buffer_dump(b);
61         /* Hago lotes */
62         i = 0;
63         while (!bufford_empty(b)) {
64                 int* c;
65                 int x;
66                 printf("Creando lote %i:\n", i);
67                 if (!mergepool_add_file(pool)) {
68                         fclose(fp);
69                         mergepool_delete(pool);
70                         bufford_delete(b);
71                         return 3;
72                 }
73                 for (c = bufford_pop_min(b); c; c = bufford_pop_next(b, &x)) {
74                         /* si hay un valor en la entrada, lo inserto */
75                         if (!feof(fp)) fscanf(fp, "%i", &x);
76                         if (!feof(fp) && !bufford_push(b, &x)) {
77                                 /* ERROR: no se pudo insertar */
78                                 fclose(fp);
79                                 mergepool_delete(pool);
80                                 bufford_delete(b);
81                                 return 4;
82                         }
83                         x = *c;
84                         free(c);
85                         printf("%- 8i\t", x);
86                         if (!mergepool_append_data(pool, x)) {
87                                 printf("No se pudo escribir en el mergefile %i\n", i);
88                                 fclose(fp);
89                                 mergepool_delete(pool);
90                                 bufford_delete(b);
91                                 return 4;
92                         }
93                         buffer_dump(b);
94                 }
95                 printf("Lote %i finalizado!\n\n", i);
96                 i++;
97         }
98         fclose(fp);
99         /* Mezclo lotes */
100         {
101         int min;
102         FILE* fp = fopen("salida.txt", "w");
103         assert(fp);
104         printf("Abriendo archivos y buscando mínimo...\n");
105         printf("Iterando...\n");
106         /* voy obteniendo el próximo mínimo y guardándolo en el archivo de salida */
107         while (mergepool_pop_min(pool, &min)) fprintf(fp, "%i\n", min);
108         fclose(fp);
109         }
110         mergepool_delete(pool);
111         bufford_delete(b);
112         return 0;
113 }
114