* 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
}
}
+/** 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)
{
{
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 */
/** 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;
/** 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_ */
{
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;
}