summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
784073e)
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.
* Autores: Leandro Lucarella <llucare@fi.uba.ar>
*----------------------------------------------------------------------------
*
* Autores: Leandro Lucarella <llucare@fi.uba.ar>
*----------------------------------------------------------------------------
*
- * $Id: vfile.c 748 2004-06-21 00:46:08Z llucare $
+void zg_init(ZG* zg)
+{
+ zg->in_zero = 0;
+}
+
- * 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. */
* 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 (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 */
- 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 */
size_t zg_ungroup(char* dst, char *src, size_t size)
{
return 0;
}
size_t zg_ungroup(char* dst, char *src, size_t size)
{
return 0;
}
* Autores: Leandro Lucarella <llucare@fi.uba.ar>
*----------------------------------------------------------------------------
*
* Autores: Leandro Lucarella <llucare@fi.uba.ar>
*----------------------------------------------------------------------------
*
- * $Id: vfile.h 742 2004-06-20 22:34:13Z llucare $
+/** 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 */
/** 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);
size_t zg_ungroup(char *buffer, size_t size);
* Autores: Leandro Lucarella <llucare@fi.uba.ar>
*----------------------------------------------------------------------------
*
* Autores: Leandro Lucarella <llucare@fi.uba.ar>
*----------------------------------------------------------------------------
*
- * $Id: vfile.c 748 2004-06-21 00:46:08Z llucare $
-int main(int argc, char* argv[])
- size_t pagesize = BUFSIZ;
- 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);