From f2fb69e06dc888cd5d0339b91dd7f56c8a1fcd9c Mon Sep 17 00:00:00 2001 From: Leandro Lucarella Date: Sat, 26 Jun 2004 19:48:50 +0000 Subject: [PATCH] =?utf8?q?Bugfixes=20y=20nueva=20funci=C3=B3np=20para=20te?= =?utf8?q?rminar=20de=20agrupar=20bien.?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- src/zerogrouping/zerogrouping.c | 25 +++++++++++++++++++++---- src/zerogrouping/zerogrouping.h | 12 ++++++++---- src/zerogrouping/zg.c | 2 ++ 3 files changed, 31 insertions(+), 8 deletions(-) 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; } -- 2.43.0