]> git.llucax.com Git - z.facultad/75.06/jacu.git/blobdiff - src/mtf/mtf.c
Fixed leak en MTF
[z.facultad/75.06/jacu.git] / src / mtf / mtf.c
index efc3700ab08611ea7f0a8322e1777348d5dbf359..5bf5b39ce0f28cfab8eaafa829be4619508aee2a 100644 (file)
@@ -3,7 +3,7 @@
 /****privadas*****/
 int no_pertenece(char *z, char c, int len);
 
 /****privadas*****/
 int no_pertenece(char *z, char c, int len);
 
-void pop_front(char *z, int pos);
+void pop_front(char *z, unsigned int pos);
 
 int get_pos(char *z, int len, char c);
 /****fin privadas******/
 
 int get_pos(char *z, int len, char c);
 /****fin privadas******/
@@ -16,39 +16,41 @@ void print_z(char *z, int len)
        fprintf(stderr, "\n");
 }
 
        fprintf(stderr, "\n");
 }
 
-char *jacu_mtf(char *datos, int len, char **_z, int *z_len)
+unsigned char *jacu_mtf(unsigned char *datos, int len, unsigned char **_z, int *z_len)
 {
 {
-       char *z;
-       char *pos;
+       unsigned char *z;
+       unsigned char *pos;
        int i, size;
        
        int i, size;
        
-       pos = (char *)malloc(len*sizeof(char));
+       pos = (unsigned char *)malloc(len*sizeof(unsigned char));
        z = jacu_buscar_z(datos, len, &size);
        z = jacu_buscar_z(datos, len, &size);
+       *_z = (unsigned char*)malloc(size*sizeof(unsigned char));
+       memcpy(*_z, z, size*sizeof(unsigned char));
        for(i=0; i<len; i++){
                pos[i] = get_pos(z, size, datos[i]);
                if (pos[i] != 0) 
        for(i=0; i<len; i++){
                pos[i] = get_pos(z, size, datos[i]);
                if (pos[i] != 0) 
-                       pop_front(z,pos[i]);
+                       pop_front(z, pos[i]);
        }
        }
-
-       (*_z) = z;
        (*z_len) = size;
        (*z_len) = size;
+       free(z);
        return pos;
 }
 
        return pos;
 }
 
-char *jacu_mtf_inv(char *z, char *pos, int len)
+unsigned char *jacu_mtf_inv(unsigned char *z, unsigned char *pos, int len)
 {
        char *datos;
        int i;
        
        datos = (char*)malloc(sizeof(char)*len);
        for(i=0; i<len; i++){
 {
        char *datos;
        int i;
        
        datos = (char*)malloc(sizeof(char)*len);
        for(i=0; i<len; i++){
-               datos[i] = z[(size_t)pos[i]];
-               pop_front(z,pos[i]);
+               datos[i] = z[(unsigned int)pos[i]];
+               if (pos[i] != 0)
+                       pop_front(z, (unsigned int)pos[i]);
        }
        return datos;
 }
 
        }
        return datos;
 }
 
-char *jacu_buscar_z(char* datos, int len, int *size)
+unsigned char *jacu_buscar_z(unsigned char* datos, int len, int *size)
 {
        char *z;
        int i, j=0;
 {
        char *z;
        int i, j=0;
@@ -70,18 +72,19 @@ int no_pertenece(char *z, char c, int len)
 {
        int i;
        
 {
        int i;
        
-       /* XXX Z NO TIENE 255 POSICIONES XXX */
        for(i=0; i<len; i++)
                if (z[i] == c)
                        return 0;
        return -1;
 }
                        
        for(i=0; i<len; i++)
                if (z[i] == c)
                        return 0;
        return -1;
 }
                        
-void pop_front(char *z, int pos)
+void pop_front(char *z, unsigned int pos)
 {
        char aux;
        int i=0;
 {
        char aux;
        int i=0;
-       
+
+       if (pos > 255) printf("pos > = %u\n", pos);
+       if (pos < 0u) printf("pos < = %d\n", pos);
        aux = z[pos];
        for(i=pos; i>0; i--)
                z[i]=z[i-1];
        aux = z[pos];
        for(i=pos; i>0; i--)
                z[i]=z[i-1];