From 5cde90ce82c099520a3cfe2f0bc533b65216137a Mon Sep 17 00:00:00 2001 From: Leandro Lucarella Date: Mon, 21 Jun 2004 20:40:53 +0000 Subject: [PATCH 1/1] =?utf8?q?Se=20implementa=20zerogrouping=20sin=20uso?= =?utf8?q?=20de=20buffer=20(caracter=20a=20caracter).=20Esto=20mejora=20la?= =?utf8?q?=20eficacia=20porque=20si=20el=20buffer=20part=C3=ADa=20una=20se?= =?utf8?q?rie=20de=20ceros,=20la=20serie=20ocupaba=204=20bytes=20(2=20en?= =?utf8?q?=20el=20primer=20buffer=20y=202=20en=20el=20segundo)=20en=20vez?= =?utf8?q?=20de=202.?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- src/zerogrouping/zerogrouping.c | 62 ++++++++++++++++----------------- src/zerogrouping/zerogrouping.h | 19 +++++++--- src/zerogrouping/zg.c | 24 +++++-------- 3 files changed, 53 insertions(+), 52 deletions(-) diff --git a/src/zerogrouping/zerogrouping.c b/src/zerogrouping/zerogrouping.c index b7e8c2c..0251725 100644 --- a/src/zerogrouping/zerogrouping.c +++ b/src/zerogrouping/zerogrouping.c @@ -22,7 +22,7 @@ * Autores: Leandro Lucarella *---------------------------------------------------------------------------- * - * $Id: vfile.c 748 2004-06-21 00:46:08Z llucare $ + * $Id$ * */ @@ -36,51 +36,49 @@ * */ +void zg_init(ZG* zg) +{ + zg->in_zero = 0; +} + /** FIXME - * El dst se asume que tiene reservada al menos ceil(size/2.0)+size bytes de - * memoria por si se llegara a expandir. size es el tamaño a leer de src. Se + * 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(char* dst, char *src, size_t size) +size_t zg_group(ZG* zg, char *dst, char src) { - char count; - size_t i; - size_t total = 0; - int in_zero = 0; - for (i = 0; i < size; ++i) + if (src == '\0') { - if (src[i] == '\0') + if (zg->in_zero) { - if (in_zero) - { - ++count; /* FIXME verificar que no pase 255 */ - } - else - { - in_zero = 1; /* entramos en serie de ceros */ - count = 0; /* reiniciamos contador de ceros */ - } + zg->count++; /* FIXME verificar que no pase 255 */ + return 0; /* indico que no hay nada */ } else { - if (in_zero) - { - in_zero = 0; - dst[total++] = '\0'; - dst[total++] = count; - } - dst[total++] = src[i]; + zg->in_zero = 1; /* entramos en serie de ceros */ + zg->count = 0; /* reiniciamos contador de ceros */ + *dst = '\0'; /* devuelvo el cero */ + return 1; /* indico que hay un caracter */ } } - if (in_zero) /* si estaba en una serie de ceros, terminamos de escribir. */ + else /* no es un cero */ { - dst[total++] = '\0'; - dst[total++] = count; + size_t ret = 1; + if (zg->in_zero) + { + zg->in_zero = 0; /* saldo 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 */ + } + *dst = src; /* devuelvo el caracter */ + return ret; /* indico la cantidad de caracteres devueltos */ } - return total; } - +/* size_t zg_ungroup(char* dst, char *src, size_t size) { return 0; } - +*/ diff --git a/src/zerogrouping/zerogrouping.h b/src/zerogrouping/zerogrouping.h index 2153bbf..750da9a 100644 --- a/src/zerogrouping/zerogrouping.h +++ b/src/zerogrouping/zerogrouping.h @@ -22,7 +22,7 @@ * Autores: Leandro Lucarella *---------------------------------------------------------------------------- * - * $Id: vfile.h 742 2004-06-20 22:34:13Z llucare $ + * $Id$ * */ @@ -39,12 +39,23 @@ * */ +/** Estado del agrupador de ceros. */ +typedef struct +{ + char count; /**< Cantidad de ceros acumulados. */ + int in_zero; /**< Indica si está en una serie de ceros. */ +} +ZG; + +/** Inicializa un agrupador de ceros. */ +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(char* dst, char *src, size_t size); +size_t zg_group(ZG* zg, char *dst, char src); -/** Vuelve al original. FIXME */ +/** Vuelve al original. FIXME * / size_t zg_ungroup(char *buffer, size_t size); - +*/ #endif /* _JACU_ZG_H_ */ diff --git a/src/zerogrouping/zg.c b/src/zerogrouping/zg.c index a3ef8e2..7d93343 100644 --- a/src/zerogrouping/zg.c +++ b/src/zerogrouping/zg.c @@ -22,7 +22,7 @@ * Autores: Leandro Lucarella *---------------------------------------------------------------------------- * - * $Id: vfile.c 748 2004-06-21 00:46:08Z llucare $ + * $Id$ * */ @@ -36,25 +36,17 @@ * */ -int main(int argc, char* argv[]) +int main() { - size_t pagesize = BUFSIZ; size_t len; - char* page; - char* pageout; - if (argc > 1) pagesize = atoi(argv[1]); - if (!(page = malloc(pagesize))) return 1; - if (!(pageout = malloc(pagesize/2+pagesize+1))) /* por si se expande */ + char buff[2]; + int c; + ZG zg; + zg_init(&zg); + while ((c = getchar()) != EOF) { - free(page); - return 1; + if ((len = zg_group(&zg, buff, c))) fwrite(buff, 1, len, stdout); } - while ((len = fread(page, 1, pagesize, stdin))) - { - len = zg_group(pageout, page, len); - fwrite(pageout, 1, len, stdout); - } - free(page); return 0; } -- 2.43.0