]> git.llucax.com Git - z.facultad/75.06/jacu.git/commitdiff
Se implementa zerogrouping sin uso de buffer (caracter a caracter). Esto mejora
authorLeandro Lucarella <llucax@gmail.com>
Mon, 21 Jun 2004 20:40:53 +0000 (20:40 +0000)
committerLeandro Lucarella <llucax@gmail.com>
Mon, 21 Jun 2004 20:40:53 +0000 (20:40 +0000)
la eficacia porque si el buffer partía una serie de ceros, la serie ocupaba 4
bytes (2 en el primer buffer y 2 en el segundo) en vez de 2.

src/zerogrouping/zerogrouping.c
src/zerogrouping/zerogrouping.h
src/zerogrouping/zg.c

index b7e8c2cf6f4bec9c83dea7bf3b264cb49839d70c..0251725fceeef5f07ca963fd84685ecb820bace6 100644 (file)
@@ -22,7 +22,7 @@
  * Autores: Leandro Lucarella <llucare@fi.uba.ar>
  *----------------------------------------------------------------------------
  *
- * $Id: vfile.c 748 2004-06-21 00:46:08Z llucare $
+ * $Id$
  *
  */
 
  *
  */
 
+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;
 }
-
+*/
index 2153bbf87ffe4b449ee1cc83163e7017153b428c..750da9aed2ff6ea6115a4a0e4336a29dd9e9c758 100644 (file)
@@ -22,7 +22,7 @@
  * Autores: Leandro Lucarella <llucare@fi.uba.ar>
  *----------------------------------------------------------------------------
  *
- * $Id: vfile.h 742 2004-06-20 22:34:13Z llucare $
+ * $Id$
  *
  */
 
  *
  */
 
+/** 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_ */
 
index a3ef8e24b0aa9330d40c255f27d7bd9632d838b5..7d93343ddc05e565b6a3605b6bf08ce60584974d 100644 (file)
@@ -22,7 +22,7 @@
  * Autores: Leandro Lucarella <llucare@fi.uba.ar>
  *----------------------------------------------------------------------------
  *
- * $Id: vfile.c 748 2004-06-21 00:46:08Z llucare $
+ * $Id$
  *
  */
 
  *
  */
 
-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;
 }