diff --git a/lrzip.h b/lrzip.h index ab40853..4c15832 100644 --- a/lrzip.h +++ b/lrzip.h @@ -19,15 +19,29 @@ #ifndef LRZIP_H #define LRZIP_H -#define LRZIP_MAJOR_VERSION 0 -#define LRZIP_MINOR_VERSION 5 -#define LRZIP_MINOR_SUBVERSION 70 +#define LRZIP_MAJOR_VERSION VMAJ +#define LRZIP_MINOR_VERSION VMIN +#define LRZIP_MINOR_SUBVERSION VMIC #define NUM_STREAMS 2 #define STREAM_BUFSIZE (1024 * 1024 * 10) -#include "config.h" +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include #include +#include + +#ifdef __APPLE__ +# define fmemopen fake_fmemopen +# define open_memstream fake_open_memstream +# define memstream_update_buffer fake_open_memstream_update_buffer +# define mremap fake_mremap +#else +# define memstream_update_buffer(A, B, C) (0) +#endif #ifndef uchar #define uchar unsigned char @@ -100,6 +114,113 @@ typedef uint32_t u32; #endif typedef struct rzip_control rzip_control; +typedef struct md5_ctx md5_ctx; + +#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) + #define mremap fake_mremap +#endif + +#define FLAG_SHOW_PROGRESS (1 << 0) +#define FLAG_KEEP_FILES (1 << 1) +#define FLAG_TEST_ONLY (1 << 2) +#define FLAG_FORCE_REPLACE (1 << 3) +#define FLAG_DECOMPRESS (1 << 4) +#define FLAG_NO_COMPRESS (1 << 5) +#define FLAG_LZO_COMPRESS (1 << 6) +#define FLAG_BZIP2_COMPRESS (1 << 7) +#define FLAG_ZLIB_COMPRESS (1 << 8) +#define FLAG_ZPAQ_COMPRESS (1 << 9) +#define FLAG_VERBOSITY (1 << 10) +#define FLAG_VERBOSITY_MAX (1 << 11) +#define FLAG_STDIN (1 << 12) +#define FLAG_STDOUT (1 << 13) +#define FLAG_INFO (1 << 14) +#define FLAG_UNLIMITED (1 << 15) +#define FLAG_HASH (1 << 16) +#define FLAG_MD5 (1 << 17) +#define FLAG_CHECK (1 << 18) +#define FLAG_KEEP_BROKEN (1 << 19) +#define FLAG_THRESHOLD (1 << 20) + +#define NO_MD5 (!(HASH_CHECK) && !(HAS_MD5)) + +#define BITS32 (sizeof(long) == 4) + +#define CTYPE_NONE 3 +#define CTYPE_BZIP2 4 +#define CTYPE_LZO 5 +#define CTYPE_LZMA 6 +#define CTYPE_GZIP 7 +#define CTYPE_ZPAQ 8 + +/* Structure to save state of computation between the single steps. */ +struct md5_ctx +{ + uint32_t A; + uint32_t B; + uint32_t C; + uint32_t D; + + uint32_t total[2]; + uint32_t buflen; + uint32_t buffer[32]; +}; + +struct rzip_control { + char *infile; + char *outname; + char *outfile; + char *outdir; + char *tmpdir; // when stdin, stdout, or test used + FILE *msgout; //stream for output messages + const char *suffix; + int compression_level; + i64 overhead; // compressor overhead + i64 maxram; // the largest chunk of ram to allocate + unsigned char lzma_properties[5]; // lzma properties, encoded + i64 window; + unsigned long flags; + i64 ramsize; + i64 max_chunk; + i64 max_mmap; + int threads; + int nice_val; // added for consistency + int major_version; + int minor_version; + i64 st_size; + long page_size; + int fd_out; + md5_ctx ctx; + void *data; // random data pointer associated for use in callbacks + i64 md5_read; // How far into the file the md5 has done so far +}; + +struct stream { + i64 last_head; + uchar *buf; + i64 buflen; + i64 bufp; + int eos; + long uthread_no; + long unext_thread; + long base_thread; + int total_threads; +}; + +struct stream_info { + struct stream *s; + int num_streams; + int fd; + i64 bufsize; + i64 cur_pos; + i64 initial_pos; + i64 total_read; + i64 ram_alloced; + long thread_no; + long next_thread; + int chunks; + char chunk_bytes; +}; void write_magic(rzip_control *control, int fd_in, int fd_out); void read_magic(rzip_control *control, int fd_in, i64 *expected_size); diff --git a/main.c b/main.c index 56acd8e..3311420 100644 --- a/main.c +++ b/main.c @@ -19,6 +19,7 @@ /* lrzip compression - main program */ #define MAIN_C #include "rzip.h" + /* main() defines, different from liblrzip defines */ #define FLAG_VERBOSE (FLAG_VERBOSITY | FLAG_VERBOSITY_MAX) #define FLAG_NOT_LZMA (FLAG_NO_COMPRESS | FLAG_LZO_COMPRESS | FLAG_BZIP2_COMPRESS | FLAG_ZLIB_COMPRESS | FLAG_ZPAQ_COMPRESS) @@ -67,7 +68,50 @@ print_output(format, ##args); \ } while (0) -struct rzip_control control; +rzip_control control; + +#ifdef __APPLE__ +# include +static inline i64 get_ram(void) +{ + int mib[2]; + size_t len; + i64 *p, ramsize; + + mib[0] = CTL_HW; + mib[1] = HW_MEMSIZE; + sysctl(mib, 2, NULL, &len, NULL, 0); + p = malloc(len); + sysctl(mib, 2, p, &len, NULL, 0); + ramsize = *p; + + return ramsize; +} +#else /* __APPLE__ */ +static inline i64 get_ram(void) +{ + i64 ramsize; + FILE *meminfo; + char aux[256]; + char *ignore; + + ramsize = (i64)sysconf(_SC_PHYS_PAGES) * PAGE_SIZE; + if (ramsize > 0) + return ramsize; + + /* Workaround for uclibc which doesn't properly support sysconf */ + if(!(meminfo = fopen("/proc/meminfo", "r"))) + fatal("fopen\n"); + + while(!feof(meminfo) && !fscanf(meminfo, "MemTotal: %Lu kB", &ramsize)) + ignore = fgets(aux, sizeof(aux), meminfo); + if (fclose(meminfo) == -1) + fatal("fclose"); + ramsize *= 1000; + + return ramsize; +} +#endif static void usage(void) { @@ -114,6 +158,7 @@ static void usage(void) } + static void show_summary(void) { /* OK, if verbosity set, print summary of options selected */ @@ -179,6 +224,159 @@ static void show_summary(void) } } +static void read_config( struct rzip_control *control ) +{ + /* check for lrzip.conf in ., $HOME/.lrzip and /etc/lrzip */ + + FILE *fp; + char *parameter; + char *parametervalue; + char *line, *s; + char *HOME, *homeconf; + + line = malloc(255); + homeconf = malloc(255); + if (line == NULL || homeconf == NULL) + fatal("Fatal Memory Error in read_config"); + + fp = fopen("lrzip.conf", "r"); + if (fp) + fprintf(control->msgout, "Using configuration file ./lrzip.conf\n"); + if (fp == NULL) { + fp = fopen("/etc/lrzip/lrzip.conf", "r"); + if (fp) + fprintf(control->msgout, "Using configuration file /etc/lrzip/lrzip.conf\n"); + } + if (fp == NULL) { + HOME=getenv("HOME"); + if (HOME) { + strcpy(homeconf, HOME); + strcat(homeconf,"/.lrzip/lrzip.conf"); + fp = fopen(homeconf, "r"); + if (fp) + fprintf(control->msgout, "Using configuration file %s\n", homeconf); + } + } + if (fp == NULL) + return; + + /* if we get here, we have a file. read until no more. */ + + while ((s = fgets(line, 255, fp)) != NULL) { + if (strlen(line)) + line[strlen(line) - 1] = '\0'; + parameter = strtok(line, " ="); + if (parameter == NULL) + continue; + /* skip if whitespace or # */ + if (isspace(*parameter)) + continue; + if (*parameter == '#') + continue; + + parametervalue = strtok(NULL, " ="); + if (parametervalue == NULL) + continue; + + /* have valid parameter line, now assign to control */ + + if (isparameter(parameter, "window")) + control->window = atoi(parametervalue); + else if (isparameter(parameter, "unlimited")) { + if (isparameter(parametervalue, "yes")) + control->flags |= FLAG_UNLIMITED; + } else if (isparameter(parameter, "compressionlevel")) { + control->compression_level = atoi(parametervalue); + if ( control->compression_level < 1 || control->compression_level > 9 ) + failure("CONF.FILE error. Compression Level must between 1 and 9"); + } else if (isparameter(parameter, "compressionmethod")) { + /* valid are rzip, gzip, bzip2, lzo, lzma (default), and zpaq */ + if (control->flags & FLAG_NOT_LZMA) + failure("CONF.FILE error. Can only specify one compression method"); + if (isparameter(parametervalue, "bzip2")) + control->flags |= FLAG_BZIP2_COMPRESS; + else if (isparameter(parametervalue, "gzip")) + control->flags |= FLAG_ZLIB_COMPRESS; + else if (isparameter(parametervalue, "lzo")) + control->flags |= FLAG_LZO_COMPRESS; + else if (isparameter(parametervalue, "rzip")) + control->flags |= FLAG_NO_COMPRESS; + else if (isparameter(parametervalue, "zpaq")) + control->flags |= FLAG_ZPAQ_COMPRESS; + else if (!isparameter(parametervalue, "lzma")) /* oops, not lzma! */ + failure("CONF.FILE error. Invalid compression method %s specified\n",parametervalue); + } else if (isparameter(parameter, "lzotest")) { + /* default is yes */ + if (isparameter(parametervalue, "no")) + control->flags &= ~FLAG_THRESHOLD; + } else if (isparameter(parameter, "hashcheck")) { + if (isparameter(parametervalue, "yes")) { + control->flags |= FLAG_CHECK; + control->flags |= FLAG_HASH; + } + } else if (isparameter(parameter, "showhash")) { + if (isparameter(parametervalue, "yes")) + control->flags |= FLAG_HASH; + } else if (isparameter(parameter, "outputdirectory")) { + control->outdir = malloc(strlen(parametervalue) + 2); + if (!control->outdir) + fatal("Fatal Memory Error in read_config"); + strcpy(control->outdir, parametervalue); + if (strcmp(parametervalue + strlen(parametervalue) - 1, "/")) + strcat(control->outdir, "/"); + } else if (isparameter(parameter,"verbosity")) { + if (control->flags & FLAG_VERBOSE) + failure("CONF.FILE error. Verbosity already defined."); + if (isparameter(parametervalue, "yes")) + control->flags |= FLAG_VERBOSITY; + else if (isparameter(parametervalue,"max")) + control->flags |= FLAG_VERBOSITY_MAX; + else /* oops, unrecognized value */ + print_err("lrzip.conf: Unrecognized verbosity value %s. Ignored.\n", parametervalue); + } else if (isparameter(parameter, "showprogress")) { + /* Yes by default */ + if (isparameter(parametervalue, "NO")) + control->flags &= ~FLAG_SHOW_PROGRESS; + } else if (isparameter(parameter,"nice")) { + control->nice_val = atoi(parametervalue); + if (control->nice_val < -20 || control->nice_val > 19) + failure("CONF.FILE error. Nice must be between -20 and 19"); + } else if (isparameter(parameter, "keepbroken")) { + if (isparameter(parametervalue, "yes" )) + control->flags |= FLAG_KEEP_BROKEN; + } else if (iscaseparameter(parameter, "DELETEFILES")) { + /* delete files must be case sensitive */ + if (iscaseparameter(parametervalue, "YES")) + control->flags &= ~FLAG_KEEP_FILES; + } else if (iscaseparameter(parameter, "REPLACEFILE")) { + /* replace lrzip file must be case sensitive */ + if (iscaseparameter(parametervalue, "YES")) + control->flags |= FLAG_FORCE_REPLACE; + } else if (isparameter(parameter, "tmpdir")) { + control->tmpdir = realloc(NULL, strlen(parametervalue) + 2); + if (!control->tmpdir) + fatal("Fatal Memory Error in read_config"); + strcpy(control->tmpdir, parametervalue); + if (strcmp(parametervalue + strlen(parametervalue) - 1, "/")) + strcat(control->tmpdir, "/"); + } else + /* oops, we have an invalid parameter, display */ + print_err("lrzip.conf: Unrecognized parameter value, %s = %s. Continuing.\n",\ + parameter, parametervalue); + } + + /* clean up */ + free(line); + free(homeconf); + +/* fprintf(stderr, "\nWindow = %d \ + \nCompression Level = %d \ + \nThreshold = %1.2f \ + \nOutput Directory = %s \ + \nFlags = %d\n", control->window,control->compression_level, control->threshold, control->outdir, control->flags); +*/ +} + int main(int argc, char *argv[]) { struct timeval start_time, end_time; diff --git a/md5.h b/md5.h index 7097556..136085a 100644 --- a/md5.h +++ b/md5.h @@ -62,19 +62,6 @@ extern "C" { # endif -/* Structure to save state of computation between the single steps. */ -struct md5_ctx -{ - uint32_t A; - uint32_t B; - uint32_t C; - uint32_t D; - - uint32_t total[2]; - uint32_t buflen; - uint32_t buffer[32]; -}; - /* * The following three functions are build up the low level used in * the functions `md5_stream' and `md5_buffer'. diff --git a/rzip.h b/rzip.h index 2179f01..547e4b8 100644 --- a/rzip.h +++ b/rzip.h @@ -74,147 +74,6 @@ void fatal(const char *format, ...); void failure(const char *format, ...); -#ifdef __APPLE__ - #include - #define fmemopen fake_fmemopen - #define open_memstream fake_open_memstream - #define memstream_update_buffer fake_open_memstream_update_buffer - #define mremap fake_mremap -static inline i64 get_ram(void) -{ - int mib[2]; - size_t len; - i64 *p, ramsize; - - mib[0] = CTL_HW; - mib[1] = HW_MEMSIZE; - sysctl(mib, 2, NULL, &len, NULL, 0); - p = malloc(len); - sysctl(mib, 2, p, &len, NULL, 0); - ramsize = *p; - - return ramsize; -} -#else /* __APPLE__ */ - #define memstream_update_buffer(A, B, C) (0) -static inline i64 get_ram(void) -{ - i64 ramsize; - FILE *meminfo; - char aux[256]; - char *ignore; - - ramsize = (i64)sysconf(_SC_PHYS_PAGES) * PAGE_SIZE; - if (ramsize > 0) - return ramsize; - - /* Workaround for uclibc which doesn't properly support sysconf */ - if(!(meminfo = fopen("/proc/meminfo", "r"))) - fatal("fopen\n"); - - while(!feof(meminfo) && !fscanf(meminfo, "MemTotal: %Lu kB", &ramsize)) - ignore = fgets(aux, sizeof(aux), meminfo); - if (fclose(meminfo) == -1) - fatal("fclose"); - ramsize *= 1000; - - return ramsize; -} -#endif - -#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) - #define mremap fake_mremap -#endif - -#define FLAG_SHOW_PROGRESS (1 << 0) -#define FLAG_KEEP_FILES (1 << 1) -#define FLAG_TEST_ONLY (1 << 2) -#define FLAG_FORCE_REPLACE (1 << 3) -#define FLAG_DECOMPRESS (1 << 4) -#define FLAG_NO_COMPRESS (1 << 5) -#define FLAG_LZO_COMPRESS (1 << 6) -#define FLAG_BZIP2_COMPRESS (1 << 7) -#define FLAG_ZLIB_COMPRESS (1 << 8) -#define FLAG_ZPAQ_COMPRESS (1 << 9) -#define FLAG_VERBOSITY (1 << 10) -#define FLAG_VERBOSITY_MAX (1 << 11) -#define FLAG_STDIN (1 << 12) -#define FLAG_STDOUT (1 << 13) -#define FLAG_INFO (1 << 14) -#define FLAG_UNLIMITED (1 << 15) -#define FLAG_HASH (1 << 16) -#define FLAG_MD5 (1 << 17) -#define FLAG_CHECK (1 << 18) -#define FLAG_KEEP_BROKEN (1 << 19) -#define FLAG_THRESHOLD (1 << 20) - -#define NO_MD5 (!(HASH_CHECK) && !(HAS_MD5)) - -#define BITS32 (sizeof(long) == 4) - -#define CTYPE_NONE 3 -#define CTYPE_BZIP2 4 -#define CTYPE_LZO 5 -#define CTYPE_LZMA 6 -#define CTYPE_GZIP 7 -#define CTYPE_ZPAQ 8 - -struct rzip_control { - char *infile; - char *outname; - char *outfile; - char *outdir; - char *tmpdir; // when stdin, stdout, or test used - FILE *msgout; //stream for output messages - const char *suffix; - int compression_level; - i64 overhead; // compressor overhead - i64 maxram; // the largest chunk of ram to allocate - unsigned char lzma_properties[5]; // lzma properties, encoded - i64 window; - unsigned long flags; - i64 ramsize; - i64 max_chunk; - i64 max_mmap; - int threads; - int nice_val; // added for consistency - int major_version; - int minor_version; - i64 st_size; - long page_size; - int fd_out; - struct md5_ctx ctx; - void *data; // random data pointer associated for use in callbacks - i64 md5_read; // How far into the file the md5 has done so far -}; - -struct stream { - i64 last_head; - uchar *buf; - i64 buflen; - i64 bufp; - int eos; - long uthread_no; - long unext_thread; - long base_thread; - int total_threads; -}; - -struct stream_info { - struct stream *s; - int num_streams; - int fd; - i64 bufsize; - i64 cur_pos; - i64 initial_pos; - i64 total_read; - i64 ram_alloced; - long thread_no; - long next_thread; - int chunks; - char chunk_bytes; -}; - void sighandler(); i64 runzip_fd(rzip_control *control, int fd_in, int fd_out, int fd_hist, i64 expected_size); void rzip_fd(rzip_control *control, int fd_in, int fd_out); @@ -225,7 +84,6 @@ i64 read_stream(rzip_control *control, void *ss, int stream, uchar *p, i64 len); int close_stream_out(rzip_control *control, void *ss); int close_stream_in(void *ss); void flush_buffer(rzip_control *control, struct stream_info *sinfo, int stream); -void read_config(struct rzip_control *s); ssize_t write_1g(int fd, void *buf, i64 len); ssize_t read_1g(int fd, void *buf, i64 len); void zpipe_compress(FILE *in, FILE *out, FILE *msgout, long long int buf_len, int progress, long thread); diff --git a/util.c b/util.c index b5ca605..cc1a465 100644 --- a/util.c +++ b/util.c @@ -113,156 +113,3 @@ void round_to_page(i64 *size) if (unlikely(!*size)) *size = PAGE_SIZE; } - -void read_config( struct rzip_control *control ) -{ - /* check for lrzip.conf in ., $HOME/.lrzip and /etc/lrzip */ - - FILE *fp; - char *parameter; - char *parametervalue; - char *line, *s; - char *HOME, *homeconf; - - line = malloc(255); - homeconf = malloc(255); - if (line == NULL || homeconf == NULL) - fatal("Fatal Memory Error in read_config"); - - fp = fopen("lrzip.conf", "r"); - if (fp) - fprintf(control->msgout, "Using configuration file ./lrzip.conf\n"); - if (fp == NULL) { - fp = fopen("/etc/lrzip/lrzip.conf", "r"); - if (fp) - fprintf(control->msgout, "Using configuration file /etc/lrzip/lrzip.conf\n"); - } - if (fp == NULL) { - HOME=getenv("HOME"); - if (HOME) { - strcpy(homeconf, HOME); - strcat(homeconf,"/.lrzip/lrzip.conf"); - fp = fopen(homeconf, "r"); - if (fp) - fprintf(control->msgout, "Using configuration file %s\n", homeconf); - } - } - if (fp == NULL) - return; - - /* if we get here, we have a file. read until no more. */ - - while ((s = fgets(line, 255, fp)) != NULL) { - if (strlen(line)) - line[strlen(line) - 1] = '\0'; - parameter = strtok(line, " ="); - if (parameter == NULL) - continue; - /* skip if whitespace or # */ - if (isspace(*parameter)) - continue; - if (*parameter == '#') - continue; - - parametervalue = strtok(NULL, " ="); - if (parametervalue == NULL) - continue; - - /* have valid parameter line, now assign to control */ - - if (isparameter(parameter, "window")) - control->window = atoi(parametervalue); - else if (isparameter(parameter, "unlimited")) { - if (isparameter(parametervalue, "yes")) - control->flags |= FLAG_UNLIMITED; - } else if (isparameter(parameter, "compressionlevel")) { - control->compression_level = atoi(parametervalue); - if ( control->compression_level < 1 || control->compression_level > 9 ) - failure("CONF.FILE error. Compression Level must between 1 and 9"); - } else if (isparameter(parameter, "compressionmethod")) { - /* valid are rzip, gzip, bzip2, lzo, lzma (default), and zpaq */ - if (control->flags & FLAG_NOT_LZMA) - failure("CONF.FILE error. Can only specify one compression method"); - if (isparameter(parametervalue, "bzip2")) - control->flags |= FLAG_BZIP2_COMPRESS; - else if (isparameter(parametervalue, "gzip")) - control->flags |= FLAG_ZLIB_COMPRESS; - else if (isparameter(parametervalue, "lzo")) - control->flags |= FLAG_LZO_COMPRESS; - else if (isparameter(parametervalue, "rzip")) - control->flags |= FLAG_NO_COMPRESS; - else if (isparameter(parametervalue, "zpaq")) - control->flags |= FLAG_ZPAQ_COMPRESS; - else if (!isparameter(parametervalue, "lzma")) /* oops, not lzma! */ - failure("CONF.FILE error. Invalid compression method %s specified\n",parametervalue); - } else if (isparameter(parameter, "lzotest")) { - /* default is yes */ - if (isparameter(parametervalue, "no")) - control->flags &= ~FLAG_THRESHOLD; - } else if (isparameter(parameter, "hashcheck")) { - if (isparameter(parametervalue, "yes")) { - control->flags |= FLAG_CHECK; - control->flags |= FLAG_HASH; - } - } else if (isparameter(parameter, "showhash")) { - if (isparameter(parametervalue, "yes")) - control->flags |= FLAG_HASH; - } else if (isparameter(parameter, "outputdirectory")) { - control->outdir = malloc(strlen(parametervalue) + 2); - if (!control->outdir) - fatal("Fatal Memory Error in read_config"); - strcpy(control->outdir, parametervalue); - if (strcmp(parametervalue + strlen(parametervalue) - 1, "/")) - strcat(control->outdir, "/"); - } else if (isparameter(parameter,"verbosity")) { - if (control->flags & FLAG_VERBOSE) - failure("CONF.FILE error. Verbosity already defined."); - if (isparameter(parametervalue, "yes")) - control->flags |= FLAG_VERBOSITY; - else if (isparameter(parametervalue,"max")) - control->flags |= FLAG_VERBOSITY_MAX; - else /* oops, unrecognized value */ - print_err("lrzip.conf: Unrecognized verbosity value %s. Ignored.\n", parametervalue); - } else if (isparameter(parameter, "showprogress")) { - /* Yes by default */ - if (isparameter(parametervalue, "NO")) - control->flags &= ~FLAG_SHOW_PROGRESS; - } else if (isparameter(parameter,"nice")) { - control->nice_val = atoi(parametervalue); - if (control->nice_val < -20 || control->nice_val > 19) - failure("CONF.FILE error. Nice must be between -20 and 19"); - } else if (isparameter(parameter, "keepbroken")) { - if (isparameter(parametervalue, "yes" )) - control->flags |= FLAG_KEEP_BROKEN; - } else if (iscaseparameter(parameter, "DELETEFILES")) { - /* delete files must be case sensitive */ - if (iscaseparameter(parametervalue, "YES")) - control->flags &= ~FLAG_KEEP_FILES; - } else if (iscaseparameter(parameter, "REPLACEFILE")) { - /* replace lrzip file must be case sensitive */ - if (iscaseparameter(parametervalue, "YES")) - control->flags |= FLAG_FORCE_REPLACE; - } else if (isparameter(parameter, "tmpdir")) { - control->tmpdir = realloc(NULL, strlen(parametervalue) + 2); - if (!control->tmpdir) - fatal("Fatal Memory Error in read_config"); - strcpy(control->tmpdir, parametervalue); - if (strcmp(parametervalue + strlen(parametervalue) - 1, "/")) - strcat(control->tmpdir, "/"); - } else - /* oops, we have an invalid parameter, display */ - print_err("lrzip.conf: Unrecognized parameter value, %s = %s. Continuing.\n",\ - parameter, parametervalue); - } - - /* clean up */ - free(line); - free(homeconf); - -/* fprintf(stderr, "\nWindow = %d \ - \nCompression Level = %d \ - \nThreshold = %1.2f \ - \nOutput Directory = %s \ - \nFlags = %d\n", control->window,control->compression_level, control->threshold, control->outdir, control->flags); -*/ -}