]> git.llucax.com Git - z.facultad/75.06/jacu.git/blob - src/mtf/mtf.c
e88981736638ecd4d66084d4f2523931aa05925b
[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)
20 {
21         char *z;
22         int *pos;
23         int i, size;
24         
25         pos = (char *)malloc(len*sizeof(char));
26         z = jacu_buscar_z(datos, len, &size);
27         for(i=0; i<len; i++){
28                 pos[i] = get_pos(z, size, datos[i]);
29                 if (pos[i] != 0) 
30                         pop_front(z,pos[i]);
31         }
32         return pos;
33 }
34
35 char *jacu_mtf_inv(char *z, int *pos, int len)
36 {
37         char *datos;
38         int i;
39         
40         datos = (char*)malloc(sizeof(char)*len);
41         for(i=0; i<len; i++){
42                 datos[i] = z[pos[i]];
43                 pop_front(z,pos[i]);
44         }
45         return datos;
46 }
47
48 char *jacu_buscar_z(char* datos, int len, int *size)
49 {
50         char *z;
51         int i, j=0;
52         
53         z = NULL; 
54         for(i=0; i<len; i++){
55                 if( no_pertenece(z, datos[i], j) == -1 ){
56                         j++;
57                         z = realloc(z, j*sizeof(char));
58                         z[j-1]=datos[i];
59                         *size = j;
60                 }
61         }
62         return z;
63 }
64         
65
66 int no_pertenece(char *z, char c, int len)
67 {
68         int i;
69         
70         /* XXX Z NO TIENE 255 POSICIONES XXX */
71         for(i=0; i<len; i++)
72                 if (z[i] == c)
73                         return 0;
74         return -1;
75 }
76                         
77 void pop_front(char *z, int pos)
78 {
79         char aux;
80         int i=0;
81         
82         aux = z[pos];
83         for(i=pos; i>0; i--)
84                 z[i]=z[i-1];
85         z[0]=aux;
86 }       
87         
88 int get_pos(char *z, int len, char c)
89 {
90         int pos;
91         if (z==NULL) return -1;
92
93         for(pos=0; pos<len; pos++)
94                 if ( z[pos] == c )
95                         return pos;
96         return -1;
97 }