5 /* Block Sorting Optimizado en memoria! */
7 typedef struct _bs_decode_t_ {
12 char es_menor(char *data, t_BlockSort *bs, int i, int j);
14 int _compare(const void *d1, const void *d2) {
15 t_BlockSortDecode *s1, *s2;
17 s1 = (t_BlockSortDecode *)d1;
18 s2 = (t_BlockSortDecode *)d2;
20 /* Hack si es el mismo caracter, dejo como mejor la de menor sig */
22 return (s1->sig - s2->sig);
25 return (s1->c - s2->c);
28 int __compare(const void *d1, const void *d2) {
29 t_BlockSortData *s1, *s2;
32 s1 = (t_BlockSortData *)d1;
33 s2 = (t_BlockSortData *)d2;
35 i = es_menor(s1->bs->data, s1->bs, s1->pos_inicial, s2->pos_inicial);
38 /* si ambos strings son iguales, fuerzo a que d1 quede primero */
44 char es_menor(char *data, t_BlockSort *bs, int i, int j)
48 for(k=0; k<bs->len; k++) {
52 if (data[pi] > data[pj]) return 1; /* El primero es mayor */
53 if (data[pi] < data[pj]) return -1; /* El primero es menor */
60 void generar_array(char *data, t_BlockSort *bs)
63 for(i=0; i<bs->len; i++) {
64 bs->array[i].pos_inicial = i;
65 bs->array[i].pos_final = (i+bs->len-1)%bs->len;
66 bs->array[i].ord = (i==0)?1:0;
71 void ordenar_array(char *data, t_BlockSort *bs)
73 qsort(bs->array, bs->len, sizeof(t_BlockSortData), __compare);
76 void print_(char *data, Uint32 pos, Uint32 len)
81 fprintf(stderr, "%c", data[(pos+i)%len]);
82 fprintf(stderr, "\n");
85 int generar_salida(char *data, t_BlockSort *bs, char *salida)
90 /* Dejo lugar para guardar el k y el tamaño de este bloque */
91 out = salida + sizeof(Uint32)*2;
94 for(i=0; i<bs->len; i++) {
95 /* print_(data, bs->array[i].pos_inicial, bs->len); */
96 out[i] = data[bs->array[i].pos_final];
97 if (bs->array[i].ord == 1) k = i;
102 void bs_solve(char *in, char *out, t_BlockSort *bs, Uint32 *k, Uint32 leido)
106 /* Hack para pedasos menores a la pagina */
107 if (leido < bs->len) bs->len = leido;
110 generar_array(in, bs);
111 ordenar_array(in, bs);
112 (*k) = generar_salida(in, bs, out);
114 /* Guardo el k y el tamaño en el array */
115 memcpy(out, &leido, sizeof(Uint32));
116 memcpy(out+sizeof(Uint32), k, sizeof(Uint32));
120 void print_v(t_BlockSortDecode *d, size_t len)
125 printf("(%ld)", d[i].sig);
128 printf("(%d)", d[i].c);
132 void bs_restore(char *dst, char *c, Uint32 k, Uint32 len)
135 t_BlockSortDecode *in;
137 in = malloc(sizeof(t_BlockSortDecode)*len);
139 for(i=0; i<len; i++) {
144 /*printf("Antes de QSort\n");
146 qsort(in, len, sizeof(t_BlockSortDecode), _compare);
147 /*printf("Despues de QSort\n");
153 dst[i++] = in[current].c;
154 current = in[current].sig;
155 } while (current != k);
158 if (i < len) printf("Noo %ld != %ld\n", i, len);
161 t_BlockSort *bs_create(Uint32 len)
165 tmp = malloc(sizeof(t_BlockSort));
166 tmp->array = malloc(sizeof(t_BlockSortData)*len);
173 void bs_destroy(t_BlockSort *bs)