]> git.llucax.com Git - z.facultad/75.06/emufs.git/blob - emufs/external_sort/sort_test.c
65c653d467d10756d8cf24e9f475735e9941b2c0
[z.facultad/75.06/emufs.git] / emufs / external_sort / sort_test.c
1
2 #include "bufford.h"
3 #include "mergefile.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         FILE* fp;
39         int i;
40         BUFFORD* b = bufford_new(8, sizeof(int), &cmp);
41         if (!b) return 1;
42         if (!(fp = fopen(argv[1], "r"))) {
43                 bufford_delete(b);
44                 return 2;
45         }
46         /* lleno el buffer */
47         while (1) {
48                 int reg;
49                 fscanf(fp, "%i", &reg);
50                 if (feof(fp)) break;
51                 if (!bufford_push(b, &reg)) break;
52         }
53         printf("Buffer lleno, hago el primer lote...\n");
54         buffer_dump(b);
55         /* Hago lotes */
56         i = 0;
57         while (!bufford_empty(b)) {
58                 int* c;
59                 int x;
60                 FILE* fpo;
61                 char filename[32];
62                 snprintf(filename, sizeof(filename), "sorted_chunk.%i", i);
63                 if (!(fpo = fopen(filename, "w"))) {
64                         fclose(fp);
65                         bufford_delete(b);
66                         return 3;
67                 }
68                 printf("Creando lote %i:\n", i);
69                 for (c = bufford_pop_min(b); c; c = bufford_pop_next(b, &x)) {
70                         /* si hay un valor en la entrada, lo inserto */
71                         if (!feof(fp)) fscanf(fp, "%i", &x);
72                         if (!feof(fp) && !bufford_push(b, &x)) {
73                                 /* ERROR: no se pudo insertar */
74                                 fclose(fpo);
75                                 fclose(fp);
76                                 bufford_delete(b);
77                                 return 4;
78                         }
79                         x = *c;
80                         free(c);
81                         printf("%- 8i\t", x);
82                         fprintf(fpo, "%i\n", x);
83                         buffer_dump(b);
84                 }
85                 printf("Lote %i finalizado!\n\n", i);
86                 i++;
87                 fclose(fpo);
88         }
89         fclose(fp);
90         /* Mezclo lotes */
91         {
92         int n, min;
93         MERGEFILE** mfpool = malloc(sizeof(MERGEFILE) * i);
94         MERGEFILE* min_mf;
95         FILE* fp = fopen("salida.txt", "w");
96         assert(fp);
97         assert(mfpool);
98         printf("Abriendo archivos y buscando mínimo...\n");
99         for (n = 0; n < i; n++) {
100                 mfpool[n] = mergefile_new(n);
101                 assert(mfpool[n]);
102                 printf("Archivo %i: leído = %i\n", n, mergefile_peek_next(mfpool[n]));
103                 if (!n || mergefile_peek_next(mfpool[n]) < min) {
104                         min = mergefile_peek_next(mfpool[n]);
105                         min_mf = mfpool[n];
106                         printf("min = %i\n", min);
107                 }
108         }
109         printf("Iterando...\n");
110         while (1) {
111                 int assigned = 0;
112                 /* guardo el mínimo en el archivo de salida */
113                 fprintf(fp, "%i\n", min);
114                 mergefile_pop_next(min_mf); /* lo saco del archivo */
115                 /* obtengo el próximo mínimo */
116                 for (n = 0; n < i; n++) {
117                         if (mergefile_has_more(mfpool[n])) {
118                                 printf("Archivo %i: leído = %i\n", n, mergefile_peek_next(mfpool[n]));
119                         } else {
120                                 printf("Archivo %i: No hay más datos\n", n);
121                         }
122                         if (mergefile_has_more(mfpool[n]) && (!assigned || mergefile_peek_next(mfpool[n]) < min)) {
123                                 assigned = 1;
124                                 min = mergefile_peek_next(mfpool[n]);
125                                 min_mf = mfpool[n];
126                                 printf("min = %i\n", min);
127                         }
128                 }
129                 /* si no hay más datos en los archivos, salimos */
130                 if (!assigned) break;
131         }
132         fclose(fp);
133         for (n = 0; n < i; n++) {
134                 mergefile_delete(mfpool[n]);
135         }
136         free(mfpool);
137         }
138         bufford_delete(b);
139         return 0;
140 }
141