+/*----------------------------------------------------------------------------
+ * jacu - Just Another Compression Utility
+ *----------------------------------------------------------------------------
+ * This file is part of jacu.
+ *
+ * jacu is free software; you can redistribute it and/or modify it under the
+ * terms of the GNU General Public License as published by the Free Software
+ * Foundation; either version 2 of the License, or (at your option) any later
+ * version.
+ *
+ * jacu is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with jacu; if not, write to the Free Software Foundation, Inc., 59 Temple
+ * Place, Suite 330, Boston, MA 02111-1307 USA
+ *----------------------------------------------------------------------------
+ */
+
#include "mtf.h"
/****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******/
fprintf(stderr, "\n");
}
-char *jacu_mtf(char *datos, int len)
+unsigned char *jacu_mtf(unsigned char *datos, int len, unsigned char **_z, int *z_len)
{
- char *z;
- int *pos;
+ unsigned char *z;
+ unsigned char *pos;
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 = (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)
- pop_front(z,pos[i]);
+ pop_front(z, pos[i]);
}
+ (*z_len) = size;
+ free(z);
return pos;
}
-char *jacu_mtf_inv(char *z, int *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++){
- datos[i] = z[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;
}
-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;
{
int i;
- /* XXX Z NO TIENE 255 POSICIONES XXX */
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;
-
+
+ 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];