]> git.llucax.com Git - z.facultad/75.06/jacu.git/blob - src/mtf/mtf.c
Listo Huffman Canonico, con dos nuevos parametros s y m se permite grabar una tabla...
[z.facultad/75.06/jacu.git] / src / mtf / mtf.c
1 #include "mtf.h"
2
3 /****privadas*****/
4 int no_pertenece(char *z, char c, int len);
5
6 void pop_front(char *z, int pos);
7
8 int get_pos(char *z, int len, char c);
9 /****fin privadas******/
10
11 void print_z(char *z, int len)
12 {
13         int i;
14         for(i=0; i<len; i++)
15                 fprintf(stderr, "%c", z[i]);
16         fprintf(stderr, "\n");
17 }
18
19 char *jacu_mtf(char *datos, int len, char **_z, int *z_len)
20 {
21         char *z;
22         char *pos;
23         int i, size;
24         
25         pos = (char *)malloc(len*sizeof(char));
26         z = jacu_buscar_z(datos, len, &size);
27         *_z = (char*)malloc(len*sizeof(char));
28         memcpy(*_z, z, len*sizeof(char));
29         for(i=0; i<len; i++){
30                 pos[i] = get_pos(z, size, datos[i]);
31                 if (pos[i] != 0) 
32                         pop_front(z, pos[i]);
33         }
34         (*z_len) = size;
35         return pos;
36 }
37
38 char *jacu_mtf_inv(char *z, char *pos, int len)
39 {
40         char *datos;
41         int i;
42         
43         datos = (char*)malloc(sizeof(char)*len);
44         for(i=0; i<len; i++){
45                 datos[i] = z[(size_t)pos[i]];
46                 pop_front(z, pos[i]);
47         }
48         return datos;
49 }
50
51 char *jacu_buscar_z(char* datos, int len, int *size)
52 {
53         char *z;
54         int i, j=0;
55         
56         z = NULL; 
57         for(i=0; i<len; i++){
58                 if( no_pertenece(z, datos[i], j) == -1 ){
59                         j++;
60                         z = realloc(z, j*sizeof(char));
61                         z[j-1]=datos[i];
62                         *size = j;
63                 }
64         }
65         return z;
66 }
67         
68
69 int no_pertenece(char *z, char c, int len)
70 {
71         int i;
72         
73         /* XXX Z NO TIENE 255 POSICIONES XXX */
74         for(i=0; i<len; i++)
75                 if (z[i] == c)
76                         return 0;
77         return -1;
78 }
79                         
80 void pop_front(char *z, int pos)
81 {
82         char aux;
83         int i=0;
84         
85         aux = z[pos];
86         for(i=pos; i>0; i--)
87                 z[i]=z[i-1];
88         z[0]=aux;
89 }       
90         
91 int get_pos(char *z, int len, char c)
92 {
93         int pos;
94         if (z==NULL) return -1;
95
96         for(pos=0; pos<len; pos++)
97                 if ( z[pos] == c )
98                         return pos;
99         return -1;
100 }