From 6cbb6dd9d88a109b94be99d834c781cf1faf7c55 Mon Sep 17 00:00:00 2001 From: Laurent Vivier Date: Wed, 22 Dec 2004 22:46:41 +0000 Subject: [PATCH] First revision --- libemile/emile_get_uncompressed_size.c | 85 ++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 libemile/emile_get_uncompressed_size.c diff --git a/libemile/emile_get_uncompressed_size.c b/libemile/emile_get_uncompressed_size.c new file mode 100644 index 0000000..e49277e --- /dev/null +++ b/libemile/emile_get_uncompressed_size.c @@ -0,0 +1,85 @@ +static __attribute__((used)) char* rcsid = "$CVSHeader$"; +/* + * + * (c) 2004 Laurent Vivier + * + */ + +#include +#include +#include +#include + +#include "libemile.h" + +int emile_get_uncompressed_size(char *file) +{ + int ret; + int i; + int tube[2]; + char buffer[1024]; + char *uncompressed; + + ret = pipe(tube); + if (ret == -1) + return -1; + + if (fork() == 0) + { + /* child */ + + close(tube[0]); + + close(STDOUT_FILENO); + dup(tube[1]); + close(STDERR_FILENO); + + execlp("gzip", "gzip", "-l", file, NULL); + + /* never comes here ... */ + + exit(1); + } + + /* parent */ + + close(tube[1]); + + ret = read(tube[0], buffer, 1024); + if (ret <= 0) + return -1; + + /* skip first line */ + + i = 0; + while ( (buffer[i] != '\n') && (i < 1024)) + i++; + i++; /* skip '\n' */ + + /* skip space */ + + while ( (buffer[i] == ' ') && (i < 1024)) + i++; + + /* skip compressed size */ + + while ( (buffer[i] >= '0') && buffer[i] <= '9' && (i < 1024)) + i++; + buffer[i++] = 0; + + /* skip space */ + + while ( (buffer[i] == ' ') && (i < 1024)) + i++; + + /* get uncompressed size */ + + uncompressed = &buffer[i]; + while ( (buffer[i] >= '0') && buffer[i] <= '9' && (i < 1024)) + i++; + buffer[i++] = 0; + + close(tube[0]); + + return atoi(uncompressed); +}