X-Git-Url: https://git.llucax.com/z.facultad/75.06/jacu.git/blobdiff_plain/5cde90ce82c099520a3cfe2f0bc533b65216137a..faf9e18aea52bbf7a8cfdbebdfe9ebe96a949d8c:/src/zerogrouping/zerogrouping.c diff --git a/src/zerogrouping/zerogrouping.c b/src/zerogrouping/zerogrouping.c index 0251725..4ee92f5 100644 --- a/src/zerogrouping/zerogrouping.c +++ b/src/zerogrouping/zerogrouping.c @@ -47,7 +47,7 @@ void zg_init(ZG* zg) * devuelve la cantidad de bytes escritos en dst. */ size_t zg_group(ZG* zg, char *dst, char src) { - if (src == '\0') + if (src == 0) { if (zg->in_zero) { @@ -58,7 +58,7 @@ size_t zg_group(ZG* zg, char *dst, char src) { zg->in_zero = 1; /* entramos en serie de ceros */ zg->count = 0; /* reiniciamos contador de ceros */ - *dst = '\0'; /* devuelvo el cero */ + *dst = 0; /* devuelvo el cero */ return 1; /* indico que hay un caracter */ } } @@ -67,7 +67,7 @@ size_t zg_group(ZG* zg, char *dst, char src) size_t ret = 1; if (zg->in_zero) { - zg->in_zero = 0; /* saldo de serie de ceros */ + zg->in_zero = 0; /* salgo de serie de ceros */ *dst = zg->count; /* devuelvo cantidad de ceros */ dst++; /* me muevo al siguiente caracter */ ret++; /* indico que hay un caracter más */ @@ -76,9 +76,40 @@ size_t zg_group(ZG* zg, char *dst, char src) return ret; /* indico la cantidad de caracteres devueltos */ } } -/* -size_t zg_ungroup(char* dst, char *src, size_t size) + +/** 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) { - return 0; + if (src == 0) + { + if (zg->in_zero) /* eran 2 ceros seguidos (1 cero orig. expandido) */ + { + zg->in_zero = 0; /* saldo de serie de ceros */ + return 0; /* indico que no hay nada */ + } + else /* empieza serie de ceros */ + { + zg->in_zero = 1; /* entramos en serie de ceros */ + *dst = 0; /* devuelvo el cero */ + return 1; /* indico que hay un caracter */ + } + } + else /* no es un cero */ + { + if (zg->in_zero) /* era una serie de ceros comprimida */ + { + 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 */ + } + else + { + *dst = src; /* devuelvo el caracter */ + return 1; /* indico que se devolvió un caracter */ + } + } } -*/ +