6 /* Block Sorting Optimizado en memoria! */
8 typedef struct _bs_decode_t_ {
13 char es_menor(char *data, t_BlockSort *bs, int i, int j);
15 int _compare(const void *d1, const void *d2) {
16 t_BlockSortDecode *s1, *s2;
18 s1 = (t_BlockSortDecode *)d1;
19 s2 = (t_BlockSortDecode *)d2;
21 /* Hack si es el mismo caracter, dejo como mejor la de menor sig */
23 return (s1->sig - s2->sig);
26 return (s1->c - s2->c);
29 int __compare(const void *d1, const void *d2) {
30 t_BlockSortData *s1, *s2;
32 s1 = (t_BlockSortData *)d1;
33 s2 = (t_BlockSortData *)d2;
35 return es_menor(s1->bs->data, s1->bs, s1->pos_inicial, s2->pos_inicial);
38 char es_menor(char *data, t_BlockSort *bs, int i, int j)
42 for(k=0; k<bs->len; k++) {
46 if (data[pi] > data[pj]) return 1; /* El primero es mayor */
47 if (data[pi] < data[pj]) return -1; /* El primero es menor */
54 void generar_array(char *data, t_BlockSort *bs)
57 for(i=0; i<bs->len; i++) {
58 bs->array[i].pos_inicial = i;
59 bs->array[i].pos_final = (i+bs->len-1)%bs->len;
60 bs->array[i].ord = (i==0)?1:0;
65 void ordenar_array(char *data, t_BlockSort *bs)
67 qsort(bs->array, bs->len, sizeof(t_BlockSortData), __compare);
70 int generar_salida(char *data, t_BlockSort *bs, char *salida)
75 /* Dejo lugar para guardar el K */
76 out = salida + sizeof(Uint32);
79 for(i=0; i<bs->len; i++) {
80 out[i] = data[bs->array[i].pos_final];
81 if (bs->array[i].ord == 1) k = i;
86 void bs_solve(char *in, char *out, t_BlockSort *bs, Uint32 *k, Uint32 leido)
90 /* Hack para pedasos menores a la pagina */
91 if (leido < bs->len) bs->len = leido;
94 generar_array(in, bs);
95 ordenar_array(in, bs);
96 (*k) = generar_salida(in, bs, out);
98 /* Guardo el k y el tamaño en el array */
99 memcpy(out, k, sizeof(Uint32));
103 void bs_restore(char *dst, char *c, Uint32 k, Uint32 len)
106 t_BlockSortDecode *in;
108 in = malloc(sizeof(t_BlockSortDecode)*len);
110 for(i=0; i<len; i++) {
115 qsort(in, len, sizeof(t_BlockSortDecode), _compare);
120 dst[i++] = in[current].c;
121 current = in[current].sig;
122 } while (current != k);
126 t_BlockSort *bs_create(Uint32 len)
130 tmp = malloc(sizeof(t_BlockSort));
131 tmp->array = malloc(sizeof(t_BlockSortData)*len);
138 void bs_destroy(t_BlockSort *bs)
145 void bs_EOL(char *data, Uint32 pagesize, Uint32 *j)
147 /* Trato de agregar 4 espacios antes y 4 despues de un \n */
150 /* Verifico poder hacerlo */
151 if ((i+9) >= pagesize) return; /* No pude! */
166 int bs_readblock(FILE *fp, char *data, Uint32 pagesize)
170 while ((!feof(fp)) && (i < pagesize)) {
174 /* Debo encodear el \0 para que no complique */
180 data[i++] = tolower(c);
185 bs_EOL(data, pagesize, &i);*/
188 /* Saco un EOF que lee de mas */