From: Leandro Lucarella Date: Sat, 26 Jun 2004 19:48:50 +0000 (+0000) Subject: Bugfixes y nueva funciónp para terminar de agrupar bien. X-Git-Tag: svn_import~55 X-Git-Url: https://git.llucax.com/z.facultad/75.06/jacu.git/commitdiff_plain/f2fb69e06dc888cd5d0339b91dd7f56c8a1fcd9c Bugfixes y nueva funciónp para terminar de agrupar bien. --- diff --git a/src/zerogrouping/zerogrouping.c b/src/zerogrouping/zerogrouping.c index 4ee92f5..569b9ad 100644 --- a/src/zerogrouping/zerogrouping.c +++ b/src/zerogrouping/zerogrouping.c @@ -45,13 +45,18 @@ void zg_init(ZG* zg) * El dst se asume que tiene al menos 2 bytes reservados para escribir, * por si se llegara a expandir. src es el caracter a encodear. Se * devuelve la cantidad de bytes escritos en dst. */ -size_t zg_group(ZG* zg, char *dst, char src) +size_t zg_group(ZG* zg, unsigned char *dst, unsigned char src) { if (src == 0) { if (zg->in_zero) { - zg->count++; /* FIXME verificar que no pase 255 */ + if (++(zg->count) == 255u) /* si es 255, salgo de serie de ceros */ + { + zg->in_zero = 0; /* salgo de serie de ceros */ + *dst = zg->count; /* devuelvo cantidad de ceros */ + return 1; /* indico que hay un caracter */ + } return 0; /* indico que no hay nada */ } else @@ -77,10 +82,22 @@ size_t zg_group(ZG* zg, char *dst, char src) } } +/** A lo sumo puede devolver un unsigned char */ +size_t zg_group_finish(ZG* zg, unsigned char *dst) +{ + if (zg->in_zero) /* sólo me interesa si estaba en una serie de ceros */ + { + zg->in_zero = 0; /* salgo de serie de ceros */ + *dst = zg->count; /* devuelvo cantidad de ceros */ + return 1; /* indico que hay un caracter */ + } + return 0; /* no había nada */ +} + /** FIXME * dst debe tener reservado al menos 256 bytes, src es el caracter a desencodear * y se devuelven la cantidad de bytes desencodeados en dst. */ -size_t zg_ungroup(ZG* zg, char *dst, char src) +size_t zg_ungroup(ZG* zg, unsigned char *dst, unsigned char src) { if (src == 0) { @@ -100,7 +117,7 @@ size_t zg_ungroup(ZG* zg, char *dst, char src) { if (zg->in_zero) /* era una serie de ceros comprimida */ { - char ret = src; + unsigned char ret = src; zg->in_zero = 0; /* salgo de serie de ceros */ while (src--) dst[(size_t)src] = 0; /* devuelve src cantidad de ceros */ return ret; /* indica que se devolvieron src cantidad de ceros */ diff --git a/src/zerogrouping/zerogrouping.h b/src/zerogrouping/zerogrouping.h index b1b9a2e..74e088a 100644 --- a/src/zerogrouping/zerogrouping.h +++ b/src/zerogrouping/zerogrouping.h @@ -42,8 +42,8 @@ /** Estado del agrupador de ceros. */ typedef struct { - char count; /**< Cantidad de ceros acumulados. */ - int in_zero; /**< Indica si está en una serie de ceros. */ + unsigned char count; /**< Cantidad de ceros acumulados. */ + int in_zero; /**< Indica si está en una serie de ceros. */ } ZG; @@ -52,10 +52,14 @@ void zg_init(ZG* zg); /** Agrupa varios ceros seguis en 2 bytes, el primero es cero y el segundo la * cantidad. FIXME */ -size_t zg_group(ZG* zg, char *dst, char src); +size_t zg_group(ZG* zg, unsigned char *dst, unsigned char src); + +/** Termina de obtener ceros agrupados por zg_group(), si los hubiera. + * FIXME */ +size_t zg_group_finish(ZG* zg, unsigned char *dst); /** Vuelve al original. FIXME */ -size_t zg_ungroup(ZG* zg, char *dst, char src); +size_t zg_ungroup(ZG* zg, unsigned char *dst, unsigned char src); #endif /* _JACU_ZG_H_ */ diff --git a/src/zerogrouping/zg.c b/src/zerogrouping/zg.c index 7d93343..779694f 100644 --- a/src/zerogrouping/zg.c +++ b/src/zerogrouping/zg.c @@ -47,6 +47,8 @@ int main() { if ((len = zg_group(&zg, buff, c))) fwrite(buff, 1, len, stdout); } + /* imprimo si quedó algo en el buffer */ + if ((len = zg_group_finish(&zg, buff))) fwrite(buff, 1, len, stdout); return 0; }