]> git.llucax.com Git - z.facultad/75.06/jacu.git/blob - src/mtf/mtf.c
Fixed leak en MTF
[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, unsigned 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 unsigned char *jacu_mtf(unsigned char *datos, int len, unsigned char **_z, int *z_len)
20 {
21         unsigned char *z;
22         unsigned char *pos;
23         int i, size;
24         
25         pos = (unsigned char *)malloc(len*sizeof(unsigned char));
26         z = jacu_buscar_z(datos, len, &size);
27         *_z = (unsigned char*)malloc(size*sizeof(unsigned char));
28         memcpy(*_z, z, size*sizeof(unsigned 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         free(z);
36         return pos;
37 }
38
39 unsigned char *jacu_mtf_inv(unsigned char *z, unsigned char *pos, int len)
40 {
41         char *datos;
42         int i;
43         
44         datos = (char*)malloc(sizeof(char)*len);
45         for(i=0; i<len; i++){
46                 datos[i] = z[(unsigned int)pos[i]];
47                 if (pos[i] != 0)
48                         pop_front(z, (unsigned int)pos[i]);
49         }
50         return datos;
51 }
52
53 unsigned char *jacu_buscar_z(unsigned char* datos, int len, int *size)
54 {
55         char *z;
56         int i, j=0;
57         
58         z = NULL; 
59         for(i=0; i<len; i++){
60                 if( no_pertenece(z, datos[i], j) == -1 ){
61                         j++;
62                         z = realloc(z, j*sizeof(char));
63                         z[j-1]=datos[i];
64                         *size = j;
65                 }
66         }
67         return z;
68 }
69         
70
71 int no_pertenece(char *z, char c, int len)
72 {
73         int i;
74         
75         for(i=0; i<len; i++)
76                 if (z[i] == c)
77                         return 0;
78         return -1;
79 }
80                         
81 void pop_front(char *z, unsigned int pos)
82 {
83         char aux;
84         int i=0;
85
86         if (pos > 255) printf("pos > = %u\n", pos);
87         if (pos < 0u) printf("pos < = %d\n", pos);
88         aux = z[pos];
89         for(i=pos; i>0; i--)
90                 z[i]=z[i-1];
91         z[0]=aux;
92 }       
93         
94 int get_pos(char *z, int len, char c)
95 {
96         int pos;
97         if (z==NULL) return -1;
98
99         for(pos=0; pos<len; pos++)
100                 if ( z[pos] == c )
101                         return pos;
102         return -1;
103 }