Blame lzotest/lzotest.c

Packit 679830
/* lzotest.c -- very comprehensive test driver for the LZO library
Packit 679830
Packit 679830
   This file is part of the LZO real-time data compression library.
Packit 679830
Packit 679830
   Copyright (C) 1996-2014 Markus Franz Xaver Johannes Oberhumer
Packit 679830
   All Rights Reserved.
Packit 679830
Packit 679830
   The LZO library is free software; you can redistribute it and/or
Packit 679830
   modify it under the terms of the GNU General Public License as
Packit 679830
   published by the Free Software Foundation; either version 2 of
Packit 679830
   the License, or (at your option) any later version.
Packit 679830
Packit 679830
   The LZO library is distributed in the hope that it will be useful,
Packit 679830
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 679830
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit 679830
   GNU General Public License for more details.
Packit 679830
Packit 679830
   You should have received a copy of the GNU General Public License
Packit 679830
   along with the LZO library; see the file COPYING.
Packit 679830
   If not, write to the Free Software Foundation, Inc.,
Packit 679830
   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Packit 679830
Packit 679830
   Markus F.X.J. Oberhumer
Packit 679830
   <markus@oberhumer.com>
Packit 679830
   http://www.oberhumer.com/opensource/lzo/
Packit 679830
 */
Packit 679830
Packit 679830
Packit 679830
#include "lzo/lzoconf.h"
Packit 679830
Packit 679830
Packit 679830
/*************************************************************************
Packit 679830
// util
Packit 679830
**************************************************************************/
Packit 679830
Packit 679830
/* portability layer */
Packit 679830
#define WANT_LZO_MALLOC 1
Packit 679830
#define WANT_LZO_FREAD 1
Packit 679830
#define WANT_LZO_WILDARGV 1
Packit 679830
#define WANT_LZO_PCLOCK 1
Packit 679830
#define LZO_WANT_ACCLIB_GETOPT 1
Packit 679830
#include "examples/portab.h"
Packit 679830
Packit 679830
#if defined(HAVE_STRNICMP) && !defined(HAVE_STRNCASECMP)
Packit 679830
#  define strncasecmp(a,b,c) strnicmp(a,b,c)
Packit 679830
#  define HAVE_STRNCASECMP 1
Packit 679830
#endif
Packit 679830
Packit 679830
#if 0
Packit 679830
#  define is_digit(x)   (isdigit((unsigned char)(x)))
Packit 679830
#  define is_space(x)   (isspace((unsigned char)(x)))
Packit 679830
#else
Packit 679830
#  define is_digit(x)   ((unsigned)(x) - '0' <= 9)
Packit 679830
#  define is_space(x)   ((x)==' ' || (x)=='\t' || (x)=='\r' || (x)=='\n')
Packit 679830
#endif
Packit 679830
Packit 679830
Packit 679830
/*************************************************************************
Packit 679830
// compression include section
Packit 679830
**************************************************************************/
Packit 679830
Packit 679830
#define HAVE_LZO1_H 1
Packit 679830
#define HAVE_LZO1A_H 1
Packit 679830
#define HAVE_LZO1B_H 1
Packit 679830
#define HAVE_LZO1C_H 1
Packit 679830
#define HAVE_LZO1F_H 1
Packit 679830
#define HAVE_LZO1X_H 1
Packit 679830
#define HAVE_LZO1Y_H 1
Packit 679830
#define HAVE_LZO1Z_H 1
Packit 679830
#define HAVE_LZO2A_H 1
Packit 679830
Packit 679830
#if defined(NO_ZLIB_H) || (SIZEOF_INT < 4)
Packit 679830
#undef HAVE_ZLIB_H
Packit 679830
#endif
Packit 679830
#if defined(NO_BZLIB_H) || (SIZEOF_INT != 4)
Packit 679830
#undef HAVE_BZLIB_H
Packit 679830
#endif
Packit 679830
Packit 679830
#if 0 && defined(LZO_OS_DOS16)
Packit 679830
/* don't make this test program too big */
Packit 679830
#undef HAVE_LZO1_H
Packit 679830
#undef HAVE_LZO1A_H
Packit 679830
#undef HAVE_LZO1C_H
Packit 679830
#undef HAVE_LZO1Z_H
Packit 679830
#undef HAVE_LZO2A_H
Packit 679830
#undef HAVE_LZO2B_H
Packit 679830
#undef HAVE_ZLIB_H
Packit 679830
#endif
Packit 679830
Packit 679830
Packit 679830
/* LZO algorithms */
Packit 679830
#if defined(HAVE_LZO1_H)
Packit 679830
#  include "lzo/lzo1.h"
Packit 679830
#endif
Packit 679830
#if defined(HAVE_LZO1A_H)
Packit 679830
#  include "lzo/lzo1a.h"
Packit 679830
#endif
Packit 679830
#if defined(HAVE_LZO1B_H)
Packit 679830
#  include "lzo/lzo1b.h"
Packit 679830
#endif
Packit 679830
#if defined(HAVE_LZO1C_H)
Packit 679830
#  include "lzo/lzo1c.h"
Packit 679830
#endif
Packit 679830
#if defined(HAVE_LZO1F_H)
Packit 679830
#  include "lzo/lzo1f.h"
Packit 679830
#endif
Packit 679830
#if defined(HAVE_LZO1X_H)
Packit 679830
#  include "lzo/lzo1x.h"
Packit 679830
#  if defined(__LZO_PROFESSIONAL__)
Packit 679830
#    include "lzo/lzopro/lzo1x.h"
Packit 679830
#  endif
Packit 679830
#endif
Packit 679830
#if defined(HAVE_LZO1Y_H)
Packit 679830
#  include "lzo/lzo1y.h"
Packit 679830
#  if defined(__LZO_PROFESSIONAL__)
Packit 679830
#    include "lzo/lzopro/lzo1y.h"
Packit 679830
#  endif
Packit 679830
#endif
Packit 679830
#if defined(HAVE_LZO1Z_H)
Packit 679830
#  include "lzo/lzo1z.h"
Packit 679830
#endif
Packit 679830
#if defined(HAVE_LZO2A_H)
Packit 679830
#  include "lzo/lzo2a.h"
Packit 679830
#endif
Packit 679830
#if defined(HAVE_LZO2B_H)
Packit 679830
#  include "lzo/lzo2b.h"
Packit 679830
#endif
Packit 679830
#if defined(__LZO_PROFESSIONAL__)
Packit 679830
#  include "lzopro/t_config.ch"
Packit 679830
#endif
Packit 679830
/* other compressors */
Packit 679830
#if defined(HAVE_ZLIB_H)
Packit 679830
#  include <zlib.h>
Packit 679830
#  define ALG_ZLIB 1
Packit 679830
#endif
Packit 679830
#if defined(HAVE_BZLIB_H)
Packit 679830
#  include <bzlib.h>
Packit 679830
#  define ALG_BZIP2 1
Packit 679830
#endif
Packit 679830
Packit 679830
Packit 679830
/*************************************************************************
Packit 679830
// enumerate all methods
Packit 679830
**************************************************************************/
Packit 679830
Packit 679830
enum {
Packit 679830
/* compression algorithms */
Packit 679830
    M_LZO1B_1     =     1,
Packit 679830
    M_LZO1B_2, M_LZO1B_3, M_LZO1B_4, M_LZO1B_5,
Packit 679830
    M_LZO1B_6, M_LZO1B_7, M_LZO1B_8, M_LZO1B_9,
Packit 679830
Packit 679830
    M_LZO1C_1     =    11,
Packit 679830
    M_LZO1C_2, M_LZO1C_3, M_LZO1C_4, M_LZO1C_5,
Packit 679830
    M_LZO1C_6, M_LZO1C_7, M_LZO1C_8, M_LZO1C_9,
Packit 679830
Packit 679830
    M_LZO1        =    21,
Packit 679830
    M_LZO1A       =    31,
Packit 679830
Packit 679830
    M_LZO1B_99    =   901,
Packit 679830
    M_LZO1B_999   =   902,
Packit 679830
    M_LZO1C_99    =   911,
Packit 679830
    M_LZO1C_999   =   912,
Packit 679830
    M_LZO1_99     =   921,
Packit 679830
    M_LZO1A_99    =   931,
Packit 679830
Packit 679830
    M_LZO1F_1     =    61,
Packit 679830
    M_LZO1F_999   =   962,
Packit 679830
    M_LZO1X_1     =    71,
Packit 679830
    M_LZO1X_1_11  =   111,
Packit 679830
    M_LZO1X_1_12  =   112,
Packit 679830
    M_LZO1X_1_15  =   115,
Packit 679830
    M_LZO1X_999   =   972,
Packit 679830
    M_LZO1Y_1     =    81,
Packit 679830
    M_LZO1Y_999   =   982,
Packit 679830
    M_LZO1Z_999   =   992,
Packit 679830
Packit 679830
    M_LZO2A_999   =   942,
Packit 679830
    M_LZO2B_999   =   952,
Packit 679830
Packit 679830
    M_LAST_LZO_COMPRESSOR = 998,
Packit 679830
Packit 679830
/* other compressors */
Packit 679830
#if defined(ALG_ZLIB)
Packit 679830
    M_ZLIB_8_1 =  1101,
Packit 679830
    M_ZLIB_8_2, M_ZLIB_8_3, M_ZLIB_8_4, M_ZLIB_8_5,
Packit 679830
    M_ZLIB_8_6, M_ZLIB_8_7, M_ZLIB_8_8, M_ZLIB_8_9,
Packit 679830
#endif
Packit 679830
#if defined(ALG_BZIP2)
Packit 679830
    M_BZIP2_1  =  1201,
Packit 679830
    M_BZIP2_2, M_BZIP2_3, M_BZIP2_4, M_BZIP2_5,
Packit 679830
    M_BZIP2_6, M_BZIP2_7, M_BZIP2_8, M_BZIP2_9,
Packit 679830
#endif
Packit 679830
Packit 679830
/* dummy compressor - for benchmarking */
Packit 679830
    M_MEMCPY      =   999,
Packit 679830
Packit 679830
    M_LAST_COMPRESSOR = 4999,
Packit 679830
Packit 679830
/* dummy algorithms - for benchmarking */
Packit 679830
    M_MEMSET      =  5001,
Packit 679830
Packit 679830
/* checksum algorithms - for benchmarking */
Packit 679830
    M_ADLER32     =  6001,
Packit 679830
    M_CRC32       =  6002,
Packit 679830
#if defined(ALG_ZLIB)
Packit 679830
    M_Z_ADLER32   =  6011,
Packit 679830
    M_Z_CRC32     =  6012,
Packit 679830
#endif
Packit 679830
Packit 679830
#if defined(__LZO_PROFESSIONAL__)
Packit 679830
#  include "lzopro/m_enum.ch"
Packit 679830
#endif
Packit 679830
Packit 679830
    M_UNUSED
Packit 679830
};
Packit 679830
Packit 679830
Packit 679830
/*************************************************************************
Packit 679830
// command line options
Packit 679830
**************************************************************************/
Packit 679830
Packit 679830
int opt_verbose = 2;
Packit 679830
Packit 679830
long opt_c_loops = 0;
Packit 679830
long opt_d_loops = 0;
Packit 679830
const char *opt_corpus_path = NULL;
Packit 679830
const char *opt_dump_compressed_data = NULL;
Packit 679830
Packit 679830
lzo_bool opt_use_safe_decompressor = 0;
Packit 679830
lzo_bool opt_use_asm_decompressor = 0;
Packit 679830
lzo_bool opt_use_asm_fast_decompressor = 0;
Packit 679830
lzo_bool opt_optimize_compressed_data = 0;
Packit 679830
Packit 679830
int opt_dict = 0;
Packit 679830
lzo_uint opt_max_dict_len = LZO_UINT_MAX;
Packit 679830
const char *opt_dictionary_file = NULL;
Packit 679830
Packit 679830
lzo_bool opt_read_from_stdin = 0;
Packit 679830
Packit 679830
/* set these to 1 to measure the speed impact of a checksum */
Packit 679830
lzo_bool opt_compute_adler32 = 0;
Packit 679830
lzo_bool opt_compute_crc32 = 0;
Packit 679830
static lzo_uint32_t adler_in, adler_out;
Packit 679830
static lzo_uint32_t crc_in, crc_out;
Packit 679830
Packit 679830
lzo_bool opt_execution_time = 0;
Packit 679830
int opt_pclock = -1;
Packit 679830
lzo_bool opt_clear_wrkmem = 0;
Packit 679830
Packit 679830
static const lzo_bool opt_try_to_compress_0_bytes = 1;
Packit 679830
Packit 679830
Packit 679830
/*************************************************************************
Packit 679830
// misc globals
Packit 679830
**************************************************************************/
Packit 679830
Packit 679830
static const char *progname = "";
Packit 679830
static lzo_pclock_handle_t pch;
Packit 679830
Packit 679830
/* for statistics and benchmark */
Packit 679830
int opt_totals = 0;
Packit 679830
static unsigned long total_n = 0;
Packit 679830
static unsigned long total_c_len = 0;
Packit 679830
static unsigned long total_d_len = 0;
Packit 679830
static unsigned long total_blocks = 0;
Packit 679830
static double total_perc = 0.0;
Packit 679830
static const char *total_method_name = NULL;
Packit 679830
static unsigned total_method_names = 0;
Packit 679830
/* Note: the average value of a rate (e.g. compression speed) is defined
Packit 679830
 * by the Harmonic Mean (and _not_ by the Arithmethic Mean ) */
Packit 679830
static unsigned long total_c_mbs_n = 0;
Packit 679830
static unsigned long total_d_mbs_n = 0;
Packit 679830
static double total_c_mbs_harmonic = 0.0;
Packit 679830
static double total_d_mbs_harmonic = 0.0;
Packit 679830
static double total_c_mbs_sum = 0.0;
Packit 679830
static double total_d_mbs_sum = 0.0;
Packit 679830
Packit 679830
Packit 679830
#if defined(HAVE_LZO1X_H)
Packit 679830
int default_method = M_LZO1X_1;
Packit 679830
#elif defined(HAVE_LZO1B_H)
Packit 679830
int default_method = M_LZO1B_1;
Packit 679830
#elif defined(HAVE_LZO1C_H)
Packit 679830
int default_method = M_LZO1C_1;
Packit 679830
#elif defined(HAVE_LZO1F_H)
Packit 679830
int default_method = M_LZO1F_1;
Packit 679830
#elif defined(HAVE_LZO1Y_H)
Packit 679830
int default_method = M_LZO1Y_1;
Packit 679830
#else
Packit 679830
int default_method = M_MEMCPY;
Packit 679830
#endif
Packit 679830
Packit 679830
Packit 679830
static const int benchmark_methods[] = {
Packit 679830
    M_LZO1B_1, M_LZO1B_9,
Packit 679830
    M_LZO1C_1, M_LZO1C_9,
Packit 679830
    M_LZO1F_1,
Packit 679830
    M_LZO1X_1,
Packit 679830
    0
Packit 679830
};
Packit 679830
Packit 679830
static const int x1_methods[] = {
Packit 679830
    M_LZO1, M_LZO1A, M_LZO1B_1, M_LZO1C_1, M_LZO1F_1, M_LZO1X_1, M_LZO1Y_1,
Packit 679830
    0
Packit 679830
};
Packit 679830
Packit 679830
static const int x99_methods[] = {
Packit 679830
    M_LZO1_99, M_LZO1A_99, M_LZO1B_99, M_LZO1C_99,
Packit 679830
    0
Packit 679830
};
Packit 679830
Packit 679830
static const int x999_methods[] = {
Packit 679830
    M_LZO1B_999, M_LZO1C_999, M_LZO1F_999, M_LZO1X_999, M_LZO1Y_999,
Packit 679830
    M_LZO1Z_999,
Packit 679830
    M_LZO2A_999,
Packit 679830
    0
Packit 679830
};
Packit 679830
Packit 679830
Packit 679830
/* exit codes of this test program */
Packit 679830
#define EXIT_OK         0
Packit 679830
#define EXIT_USAGE      1
Packit 679830
#define EXIT_FILE       2
Packit 679830
#define EXIT_MEM        3
Packit 679830
#define EXIT_ADLER      4
Packit 679830
#define EXIT_LZO_ERROR  5
Packit 679830
#define EXIT_LZO_INIT   6
Packit 679830
#define EXIT_INTERNAL   7
Packit 679830
Packit 679830
Packit 679830
/*************************************************************************
Packit 679830
// memory setup
Packit 679830
**************************************************************************/
Packit 679830
Packit 679830
static lzo_uint opt_block_size;
Packit 679830
static lzo_uint opt_max_data_len;
Packit 679830
Packit 679830
typedef struct {
Packit 679830
    lzo_bytep   ptr;
Packit 679830
    lzo_uint    len;
Packit 679830
    lzo_uint32_t adler;
Packit 679830
    lzo_uint32_t crc;
Packit 679830
    lzo_bytep   alloc_ptr;
Packit 679830
    lzo_uint    alloc_len;
Packit 679830
    lzo_uint    saved_len;
Packit 679830
} mblock_t;
Packit 679830
Packit 679830
static mblock_t file_data;      /* original uncompressed data */
Packit 679830
static mblock_t block_c;        /* compressed data */
Packit 679830
static mblock_t block_d;        /* decompressed data */
Packit 679830
static mblock_t block_w;        /* wrkmem */
Packit 679830
static mblock_t dict;
Packit 679830
Packit 679830
Packit 679830
static void mb_alloc_extra(mblock_t *mb, lzo_uint len, lzo_uint extra_bottom, lzo_uint extra_top)
Packit 679830
{
Packit 679830
    lzo_uint align = (lzo_uint) sizeof(lzo_align_t);
Packit 679830
Packit 679830
    mb->alloc_ptr = mb->ptr = NULL;
Packit 679830
    mb->alloc_len = mb->len = 0;
Packit 679830
Packit 679830
    mb->alloc_len = extra_bottom + len + extra_top;
Packit 679830
    if (mb->alloc_len == 0) mb->alloc_len = 1;
Packit 679830
    mb->alloc_ptr = (lzo_bytep) lzo_malloc(mb->alloc_len);
Packit 679830
Packit 679830
    if (mb->alloc_ptr == NULL) {
Packit 679830
        fprintf(stderr, "%s: out of memory (wanted %lu bytes)\n", progname, (unsigned long)mb->alloc_len);
Packit 679830
        exit(EXIT_MEM);
Packit 679830
    }
Packit 679830
    if (mb->alloc_len >= align && __lzo_align_gap(mb->alloc_ptr, align) != 0) {
Packit 679830
        fprintf(stderr, "%s: C library problem: malloc() returned misaligned pointer!\n", progname);
Packit 679830
        exit(EXIT_MEM);
Packit 679830
    }
Packit 679830
Packit 679830
    mb->ptr = mb->alloc_ptr + extra_bottom;
Packit 679830
    mb->len = mb->saved_len = len;
Packit 679830
    mb->adler = 1;
Packit 679830
    mb->crc = 0;
Packit 679830
}
Packit 679830
Packit 679830
Packit 679830
static void mb_alloc(mblock_t *mb, lzo_uint len)
Packit 679830
{
Packit 679830
    mb_alloc_extra(mb, len, 0, 0);
Packit 679830
}
Packit 679830
Packit 679830
Packit 679830
static void mb_free(mblock_t *mb)
Packit 679830
{
Packit 679830
    if (!mb) return;
Packit 679830
    if (mb->alloc_ptr) lzo_free(mb->alloc_ptr);
Packit 679830
    mb->alloc_ptr = mb->ptr = NULL;
Packit 679830
    mb->alloc_len = mb->len = 0;
Packit 679830
}
Packit 679830
Packit 679830
Packit 679830
static lzo_uint get_max_compression_expansion(int m, lzo_uint bl)
Packit 679830
{
Packit 679830
    if (m == M_MEMCPY || m >= M_LAST_COMPRESSOR)
Packit 679830
        return 0;
Packit 679830
    if (m == M_LZO2A_999 || m == M_LZO2B_999)
Packit 679830
        return bl / 8 + 256;
Packit 679830
    if (m > 0  && m < M_LAST_LZO_COMPRESSOR)
Packit 679830
        return bl / 16 +  64 + 3;
Packit 679830
    return bl / 8 + 256;
Packit 679830
}
Packit 679830
Packit 679830
static lzo_uint get_max_decompression_overrun(int m, lzo_uint bl)
Packit 679830
{
Packit 679830
    LZO_UNUSED(m);
Packit 679830
    LZO_UNUSED(bl);
Packit 679830
    /* may overwrite 3 bytes past the end of the decompressed block */
Packit 679830
    if (opt_use_asm_fast_decompressor)
Packit 679830
        return  (lzo_uint) sizeof(lzo_voidp) - 1;
Packit 679830
    return 0;
Packit 679830
}
Packit 679830
Packit 679830
Packit 679830
/*************************************************************************
Packit 679830
// dictionary support
Packit 679830
**************************************************************************/
Packit 679830
Packit 679830
static void dict_alloc(lzo_uint max_dict_len)
Packit 679830
{
Packit 679830
    lzo_uint l = 0xbfff;    /* MAX_DICT_LEN */
Packit 679830
    if (max_dict_len > 0 && l > max_dict_len)
Packit 679830
        l = max_dict_len;
Packit 679830
    mb_alloc(&dict, l);
Packit 679830
}
Packit 679830
Packit 679830
Packit 679830
/* this default dictionary does not provide good contexts... */
Packit 679830
static void dict_set_default(void)
Packit 679830
{
Packit 679830
    lzo_uint d = 0;
Packit 679830
    unsigned i, j;
Packit 679830
Packit 679830
    dict.len = 16 * 256;
Packit 679830
    if (dict.len > dict.alloc_len)
Packit 679830
        dict.len = dict.alloc_len;
Packit 679830
Packit 679830
    lzo_memset(dict.ptr, 0, dict.len);
Packit 679830
Packit 679830
    for (i = 0; i < 256; i++)
Packit 679830
        for (j = 0; j < 16; j++) {
Packit 679830
            if (d >= dict.len)
Packit 679830
                goto done;
Packit 679830
            dict.ptr[d++] = (unsigned char) i;
Packit 679830
        }
Packit 679830
Packit 679830
done:
Packit 679830
    dict.adler = lzo_adler32(1, dict.ptr, dict.len);
Packit 679830
}
Packit 679830
Packit 679830
Packit 679830
static void dict_load(const char *file_name)
Packit 679830
{
Packit 679830
    FILE *fp;
Packit 679830
Packit 679830
    dict.len = 0;
Packit 679830
    fp = fopen(file_name, "rb");
Packit 679830
    if (fp)
Packit 679830
    {
Packit 679830
        dict.len = (lzo_uint) lzo_fread(fp, dict.ptr, dict.alloc_len);
Packit 679830
        (void) fclose(fp);
Packit 679830
        dict.adler = lzo_adler32(1, dict.ptr, dict.len);
Packit 679830
    }
Packit 679830
}
Packit 679830
Packit 679830
Packit 679830
/*************************************************************************
Packit 679830
// compression database
Packit 679830
**************************************************************************/
Packit 679830
Packit 679830
typedef struct
Packit 679830
{
Packit 679830
    const char *            name;
Packit 679830
    int                     id;
Packit 679830
    lzo_uint32_t            mem_compress;
Packit 679830
    lzo_uint32_t            mem_decompress;
Packit 679830
    lzo_compress_t          compress;
Packit 679830
    lzo_optimize_t          optimize;
Packit 679830
    lzo_decompress_t        decompress;
Packit 679830
    lzo_decompress_t        decompress_safe;
Packit 679830
    lzo_decompress_t        decompress_asm;
Packit 679830
    lzo_decompress_t        decompress_asm_safe;
Packit 679830
    lzo_decompress_t        decompress_asm_fast;
Packit 679830
    lzo_decompress_t        decompress_asm_fast_safe;
Packit 679830
    lzo_compress_dict_t     compress_dict;
Packit 679830
    lzo_decompress_dict_t   decompress_dict_safe;
Packit 679830
}
Packit 679830
compress_t;
Packit 679830
Packit 679830
#include "asm.h"
Packit 679830
Packit 679830
#ifdef __cplusplus
Packit 679830
extern "C" {
Packit 679830
#endif
Packit 679830
#include "wrap.h"
Packit 679830
#define M_PRIVATE       LZO_PRIVATE
Packit 679830
#define m_uint          lzo_uint
Packit 679830
#define m_uint32_t      lzo_uint32_t
Packit 679830
#define m_voidp         lzo_voidp
Packit 679830
#define m_bytep         lzo_bytep
Packit 679830
#define m_uintp         lzo_uintp
Packit 679830
#include "wrapmisc.h"
Packit 679830
#ifdef __cplusplus
Packit 679830
} /* extern "C" */
Packit 679830
#endif
Packit 679830
Packit 679830
static const compress_t compress_database[] = {
Packit 679830
#include "db.h"
Packit 679830
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
Packit 679830
};
Packit 679830
Packit 679830
Packit 679830
/*************************************************************************
Packit 679830
// method info
Packit 679830
**************************************************************************/
Packit 679830
Packit 679830
static
Packit 679830
lzo_decompress_t get_decomp_info ( const compress_t *c, const char **nn )
Packit 679830
{
Packit 679830
    lzo_decompress_t d = 0;
Packit 679830
    const char *n = NULL;
Packit 679830
Packit 679830
    /* safe has priority over asm/fast */
Packit 679830
    if (!d && opt_use_safe_decompressor && opt_use_asm_fast_decompressor)
Packit 679830
    {
Packit 679830
        d = c->decompress_asm_fast_safe;
Packit 679830
        n = " [fs]";
Packit 679830
    }
Packit 679830
    if (!d && opt_use_safe_decompressor && opt_use_asm_decompressor)
Packit 679830
    {
Packit 679830
        d = c->decompress_asm_safe;
Packit 679830
        n = " [as]";
Packit 679830
    }
Packit 679830
    if (!d && opt_use_safe_decompressor)
Packit 679830
    {
Packit 679830
        d = c->decompress_safe;
Packit 679830
        n = " [s]";
Packit 679830
    }
Packit 679830
    if (!d && opt_use_asm_fast_decompressor)
Packit 679830
    {
Packit 679830
        d = c->decompress_asm_fast;
Packit 679830
        n = " [f]";
Packit 679830
    }
Packit 679830
    if (!d && opt_use_asm_decompressor)
Packit 679830
    {
Packit 679830
        d = c->decompress_asm;
Packit 679830
        n = " [a]";
Packit 679830
    }
Packit 679830
    if (!d)
Packit 679830
    {
Packit 679830
        d = c->decompress;
Packit 679830
        n = "";
Packit 679830
    }
Packit 679830
    if (!d)
Packit 679830
        n = "(null)";
Packit 679830
Packit 679830
    if (opt_dict && c->decompress_dict_safe)
Packit 679830
        n = "";
Packit 679830
Packit 679830
    if (nn)
Packit 679830
        *nn = n;
Packit 679830
    return d;
Packit 679830
}
Packit 679830
Packit 679830
Packit 679830
static
Packit 679830
const compress_t *find_method_by_id ( int method )
Packit 679830
{
Packit 679830
    const compress_t *db;
Packit 679830
    size_t size = sizeof(compress_database) / sizeof(*(compress_database));
Packit 679830
    size_t i;
Packit 679830
Packit 679830
    db = compress_database;
Packit 679830
    for (i = 0; i < size && db->name != NULL; i++, db++)
Packit 679830
    {
Packit 679830
        if (method == db->id)
Packit 679830
            return db;
Packit 679830
    }
Packit 679830
    return NULL;
Packit 679830
}
Packit 679830
Packit 679830
Packit 679830
static
Packit 679830
const compress_t *find_method_by_name ( const char *name )
Packit 679830
{
Packit 679830
    const compress_t *db;
Packit 679830
    size_t size = sizeof(compress_database) / sizeof(*(compress_database));
Packit 679830
    size_t i;
Packit 679830
Packit 679830
    db = compress_database;
Packit 679830
    for (i = 0; i < size && db->name != NULL; i++, db++)
Packit 679830
    {
Packit 679830
        size_t n = strlen(db->name);
Packit 679830
Packit 679830
#if defined(HAVE_STRNCASECMP)
Packit 679830
        if (strncasecmp(name,db->name,n) == 0 && (!name[n] || name[n] == ','))
Packit 679830
            return db;
Packit 679830
#else
Packit 679830
        if (strncmp(name,db->name,n) == 0 && (!name[n] || name[n] == ','))
Packit 679830
            return db;
Packit 679830
#endif
Packit 679830
    }
Packit 679830
    return NULL;
Packit 679830
}
Packit 679830
Packit 679830
Packit 679830
static
Packit 679830
lzo_bool is_compressor ( const compress_t *c )
Packit 679830
{
Packit 679830
    return (c->id <= M_LAST_COMPRESSOR || c->id >= 9721);
Packit 679830
}
Packit 679830
Packit 679830
Packit 679830
/*************************************************************************
Packit 679830
// check that memory gets accessed within bounds
Packit 679830
**************************************************************************/
Packit 679830
Packit 679830
static void memchecker_init ( mblock_t *mb, lzo_uint l, unsigned char random_byte )
Packit 679830
{
Packit 679830
    lzo_uint i;
Packit 679830
    lzo_uint len = (lzo_uint) l;
Packit 679830
    lzo_bytep p;
Packit 679830
Packit 679830
    assert(len <= mb->len);
Packit 679830
Packit 679830
    /* bottom */
Packit 679830
    p = mb->ptr;
Packit 679830
    for (i = 0; i < 16 && p > mb->alloc_ptr; i++)
Packit 679830
        *--p = random_byte++;
Packit 679830
    /* top */
Packit 679830
    p = mb->ptr + len;
Packit 679830
    for (i = 0; i < 16 && p < mb->alloc_ptr + mb->alloc_len; i++)
Packit 679830
        *p++ = random_byte++;
Packit 679830
#if 0 || defined(LZO_DEBUG)
Packit 679830
    /* fill in garbage */
Packit 679830
    p = mb->ptr;
Packit 679830
    random_byte |= 1;
Packit 679830
    for (i = 0; i < len; i++, random_byte += 2)
Packit 679830
        *p++ = random_byte;
Packit 679830
#endif
Packit 679830
}
Packit 679830
Packit 679830
Packit 679830
static int memchecker_check ( mblock_t *mb, lzo_uint l, unsigned char random_byte )
Packit 679830
{
Packit 679830
    lzo_uint i;
Packit 679830
    lzo_uint len = (lzo_uint) l;
Packit 679830
    lzo_bytep p;
Packit 679830
Packit 679830
    assert(len <= mb->len);
Packit 679830
Packit 679830
    /* bottom */
Packit 679830
    p = mb->ptr;
Packit 679830
    for (i = 0; i < 16 && p > mb->alloc_ptr; i++)
Packit 679830
        if (*--p != random_byte++)
Packit 679830
            return -1;
Packit 679830
    /* top */
Packit 679830
    p = mb->ptr + len;
Packit 679830
    for (i = 0; i < 16 && p < mb->alloc_ptr + mb->alloc_len; i++)
Packit 679830
        if (*p++ != random_byte++)
Packit 679830
            return -1;
Packit 679830
    return 0;
Packit 679830
}
Packit 679830
Packit 679830
Packit 679830
/*************************************************************************
Packit 679830
// compress a block
Packit 679830
**************************************************************************/
Packit 679830
Packit 679830
static
Packit 679830
int call_compressor   ( const compress_t *c,
Packit 679830
                        const lzo_bytep src, lzo_uint  src_len,
Packit 679830
                              lzo_bytep dst, lzo_uintp dst_len )
Packit 679830
{
Packit 679830
    int r = -100;
Packit 679830
Packit 679830
    if (c && c->compress && block_w.len >= c->mem_compress)
Packit 679830
    {
Packit 679830
        unsigned char random_byte = (unsigned char) src_len;
Packit 679830
        memchecker_init(&block_w, c->mem_compress, random_byte);
Packit 679830
        if (opt_clear_wrkmem)
Packit 679830
            lzo_memset(block_w.ptr, 0, c->mem_compress);
Packit 679830
Packit 679830
        if (opt_dict && c->compress_dict)
Packit 679830
            r = c->compress_dict(src,src_len,dst,dst_len,block_w.ptr,dict.ptr,dict.len);
Packit 679830
        else
Packit 679830
            r = c->compress(src,src_len,dst,dst_len,block_w.ptr);
Packit 679830
Packit 679830
        if (memchecker_check(&block_w, c->mem_compress, random_byte) != 0)
Packit 679830
            printf("WARNING: wrkmem overwrite error (compress) !!!\n");
Packit 679830
    }
Packit 679830
Packit 679830
    if (r == 0 && opt_compute_adler32)
Packit 679830
    {
Packit 679830
        lzo_uint32_t adler;
Packit 679830
        adler = lzo_adler32(0, NULL, 0);
Packit 679830
        adler = lzo_adler32(adler, src, src_len);
Packit 679830
        adler_in = adler;
Packit 679830
    }
Packit 679830
    if (r == 0 && opt_compute_crc32)
Packit 679830
    {
Packit 679830
        lzo_uint32_t crc;
Packit 679830
        crc = lzo_crc32(0, NULL, 0);
Packit 679830
        crc = lzo_crc32(crc, src, src_len);
Packit 679830
        crc_in = crc;
Packit 679830
    }
Packit 679830
Packit 679830
    return r;
Packit 679830
}
Packit 679830
Packit 679830
Packit 679830
/*************************************************************************
Packit 679830
// decompress a block
Packit 679830
**************************************************************************/
Packit 679830
Packit 679830
static
Packit 679830
int call_decompressor ( const compress_t *c, lzo_decompress_t d,
Packit 679830
                        const lzo_bytep src, lzo_uint  src_len,
Packit 679830
                              lzo_bytep dst, lzo_uintp dst_len )
Packit 679830
{
Packit 679830
    int r = -100;
Packit 679830
Packit 679830
    if (c && d && block_w.len >= c->mem_decompress)
Packit 679830
    {
Packit 679830
        unsigned char random_byte = (unsigned char) src_len;
Packit 679830
        memchecker_init(&block_w, c->mem_decompress, random_byte);
Packit 679830
        if (opt_clear_wrkmem)
Packit 679830
            lzo_memset(block_w.ptr, 0, c->mem_decompress);
Packit 679830
Packit 679830
        if (opt_dict && c->decompress_dict_safe)
Packit 679830
            r = c->decompress_dict_safe(src,src_len,dst,dst_len,block_w.ptr,dict.ptr,dict.len);
Packit 679830
        else
Packit 679830
            r = d(src,src_len,dst,dst_len,block_w.ptr);
Packit 679830
Packit 679830
        if (memchecker_check(&block_w, c->mem_decompress, random_byte) != 0)
Packit 679830
            printf("WARNING: wrkmem overwrite error (decompress) !!!\n");
Packit 679830
    }
Packit 679830
Packit 679830
    if (r == 0 && opt_compute_adler32)
Packit 679830
        adler_out = lzo_adler32(1, dst, *dst_len);
Packit 679830
    if (r == 0 && opt_compute_crc32)
Packit 679830
        crc_out = lzo_crc32(0, dst, *dst_len);
Packit 679830
Packit 679830
    return r;
Packit 679830
}
Packit 679830
Packit 679830
Packit 679830
/*************************************************************************
Packit 679830
// optimize a block
Packit 679830
**************************************************************************/
Packit 679830
Packit 679830
static
Packit 679830
int call_optimizer   ( const compress_t *c,
Packit 679830
                             lzo_bytep src, lzo_uint  src_len,
Packit 679830
                             lzo_bytep dst, lzo_uintp dst_len )
Packit 679830
{
Packit 679830
    if (c && c->optimize && block_w.len >= c->mem_decompress)
Packit 679830
        return c->optimize(src,src_len,dst,dst_len,block_w.ptr);
Packit 679830
    return 0;
Packit 679830
}
Packit 679830
Packit 679830
Packit 679830
/***********************************************************************
Packit 679830
// read a file
Packit 679830
************************************************************************/
Packit 679830
Packit 679830
static int load_file(const char *file_name, lzo_uint max_data_len)
Packit 679830
{
Packit 679830
    FILE *fp;
Packit 679830
#if (HAVE_FTELLO)
Packit 679830
    off_t ll = -1;
Packit 679830
#else
Packit 679830
    long ll = -1;
Packit 679830
#endif
Packit 679830
    lzo_uint l;
Packit 679830
    int r;
Packit 679830
    mblock_t *mb = &file_data;
Packit 679830
Packit 679830
    mb_free(mb);
Packit 679830
Packit 679830
    fp = fopen(file_name, "rb");
Packit 679830
    if (fp == NULL)
Packit 679830
    {
Packit 679830
        fflush(stdout); fflush(stderr);
Packit 679830
        fprintf(stderr, "%s: ", file_name);
Packit 679830
        fflush(stderr);
Packit 679830
        perror("fopen");
Packit 679830
        fflush(stdout); fflush(stderr);
Packit 679830
        return EXIT_FILE;
Packit 679830
    }
Packit 679830
    r = fseek(fp, 0, SEEK_END);
Packit 679830
    if (r == 0)
Packit 679830
    {
Packit 679830
#if (HAVE_FTELLO)
Packit 679830
        ll = ftello(fp);
Packit 679830
#else
Packit 679830
        ll = ftell(fp);
Packit 679830
#endif
Packit 679830
        r = fseek(fp, 0, SEEK_SET);
Packit 679830
    }
Packit 679830
    if (r != 0 || ll < 0)
Packit 679830
    {
Packit 679830
        fflush(stdout); fflush(stderr);
Packit 679830
        fprintf(stderr, "%s: ", file_name);
Packit 679830
        fflush(stderr);
Packit 679830
        perror("fseek");
Packit 679830
        fflush(stdout); fflush(stderr);
Packit 679830
        (void) fclose(fp);
Packit 679830
        return EXIT_FILE;
Packit 679830
    }
Packit 679830
Packit 679830
    l = (lzo_uint) ll;
Packit 679830
    if (l > max_data_len) l = max_data_len;
Packit 679830
#if (HAVE_FTELLO)
Packit 679830
    if ((off_t) l != ll) l = max_data_len;
Packit 679830
#else
Packit 679830
    if ((long) l != ll) l = max_data_len;
Packit 679830
#endif
Packit 679830
Packit 679830
    mb_alloc(mb, l);
Packit 679830
    mb->len = (lzo_uint) lzo_fread(fp, mb->ptr, mb->len);
Packit 679830
Packit 679830
    r = ferror(fp);
Packit 679830
    if (fclose(fp) != 0 || r != 0)
Packit 679830
    {
Packit 679830
        mb_free(mb);
Packit 679830
        fflush(stdout); fflush(stderr);
Packit 679830
        fprintf(stderr, "%s: ", file_name);
Packit 679830
        fflush(stderr);
Packit 679830
        perror("fclose");
Packit 679830
        fflush(stdout); fflush(stderr);
Packit 679830
        return EXIT_FILE;
Packit 679830
    }
Packit 679830
Packit 679830
    return EXIT_OK;
Packit 679830
}
Packit 679830
Packit 679830
Packit 679830
/***********************************************************************
Packit 679830
// print some compression statistics
Packit 679830
************************************************************************/
Packit 679830
Packit 679830
static double t_div(double a, double b)
Packit 679830
{
Packit 679830
    return b > 0.00001 ? a / b : 0;
Packit 679830
}
Packit 679830
Packit 679830
static double set_perc_d(double perc, char *s)
Packit 679830
{
Packit 679830
    if (perc <= 0.0) {
Packit 679830
        strcpy(s, "0.0");
Packit 679830
        return 0;
Packit 679830
    }
Packit 679830
    if (perc <= 100 - 1.0 / 16) {
Packit 679830
        sprintf(s, "%4.1f", perc);
Packit 679830
    }
Packit 679830
    else {
Packit 679830
        long p = (long) (perc + 0.5);
Packit 679830
        if (p < 100)
Packit 679830
            strcpy(s, "???");
Packit 679830
        else if (p >= 9999)
Packit 679830
            strcpy(s, "9999");
Packit 679830
        else
Packit 679830
            sprintf(s, "%ld", p);
Packit 679830
    }
Packit 679830
    return perc;
Packit 679830
}
Packit 679830
Packit 679830
static double set_perc(unsigned long c_len, unsigned long d_len, char *s)
Packit 679830
{
Packit 679830
    double perc = 0.0;
Packit 679830
    if (d_len > 0)
Packit 679830
        perc = c_len * 100.0 / d_len;
Packit 679830
    return set_perc_d(perc, s);
Packit 679830
}
Packit 679830
Packit 679830
Packit 679830
static
Packit 679830
void print_stats ( const char *method_name, const char *file_name,
Packit 679830
                   long t_loops, long c_loops, long d_loops,
Packit 679830
                   double t_secs, double c_secs, double d_secs,
Packit 679830
                   unsigned long c_len, unsigned long d_len,
Packit 679830
                   unsigned long blocks )
Packit 679830
{
Packit 679830
    unsigned long x_len = d_len;
Packit 679830
    unsigned long t_bytes, c_bytes, d_bytes;
Packit 679830
    double c_mbs, d_mbs, t_mbs;
Packit 679830
    double perc;
Packit 679830
    char perc_str[4+1];
Packit 679830
Packit 679830
    perc = set_perc(c_len, d_len, perc_str);
Packit 679830
Packit 679830
    c_bytes = x_len * c_loops * t_loops;
Packit 679830
    d_bytes = x_len * d_loops * t_loops;
Packit 679830
    t_bytes = c_bytes + d_bytes;
Packit 679830
Packit 679830
    if (opt_pclock == 0)
Packit 679830
        c_secs = d_secs = t_secs = 0.0;
Packit 679830
Packit 679830
    /* speed in uncompressed megabytes per second (1 megabyte = 1.000.000 bytes) */
Packit 679830
    c_mbs = (c_secs > 0.001) ? (c_bytes / c_secs) / 1000000.0 : 0;
Packit 679830
    d_mbs = (d_secs > 0.001) ? (d_bytes / d_secs) / 1000000.0 : 0;
Packit 679830
    t_mbs = (t_secs > 0.001) ? (t_bytes / t_secs) / 1000000.0 : 0;
Packit 679830
Packit 679830
    total_n++;
Packit 679830
    total_c_len += c_len;
Packit 679830
    total_d_len += d_len;
Packit 679830
    total_blocks += blocks;
Packit 679830
    total_perc += perc;
Packit 679830
    if (c_mbs > 0) {
Packit 679830
        total_c_mbs_n += 1;
Packit 679830
        total_c_mbs_harmonic += 1.0 / c_mbs;
Packit 679830
        total_c_mbs_sum += c_mbs;
Packit 679830
    }
Packit 679830
    if (d_mbs > 0) {
Packit 679830
        total_d_mbs_n += 1;
Packit 679830
        total_d_mbs_harmonic += 1.0 / d_mbs;
Packit 679830
        total_d_mbs_sum += d_mbs;
Packit 679830
    }
Packit 679830
Packit 679830
    if (opt_verbose >= 2)
Packit 679830
    {
Packit 679830
        printf("  compressed into %lu bytes,  %s%%  (%s%.3f bits/byte)\n",
Packit 679830
               c_len, perc_str, "", perc * 0.08);
Packit 679830
Packit 679830
#if 0
Packit 679830
        printf("%-15s %5ld: ","overall", t_loops);
Packit 679830
        printf("%10lu bytes, %8.2f secs, %8.3f MB/sec\n",
Packit 679830
               t_bytes, t_secs, t_mbs);
Packit 679830
#else
Packit 679830
        LZO_UNUSED(t_mbs);
Packit 679830
#endif
Packit 679830
        printf("%-15s %5ld: ","compress", c_loops);
Packit 679830
        printf("%10lu bytes, %8.2f secs, %8.3f MB/sec\n",
Packit 679830
               c_bytes, c_secs, c_mbs);
Packit 679830
        printf("%-15s %5ld: ","decompress", d_loops);
Packit 679830
        printf("%10lu bytes, %8.2f secs, %8.3f MB/sec\n",
Packit 679830
               d_bytes, d_secs, d_mbs);
Packit 679830
        printf("\n");
Packit 679830
    }
Packit 679830
Packit 679830
    /* create a line for util/table.pl */
Packit 679830
    if (opt_verbose >= 1)
Packit 679830
    {
Packit 679830
        /* get basename */
Packit 679830
        const char *n, *nn, *b;
Packit 679830
        for (nn = n = b = file_name; *nn; nn++)
Packit 679830
            if (*nn == '/' || *nn == '\\' || *nn == ':')
Packit 679830
                b = nn + 1;
Packit 679830
            else
Packit 679830
                n = b;
Packit 679830
Packit 679830
        printf("%-13s| %-14s %8lu %4lu %9lu %4s %s%8.3f %8.3f |\n",
Packit 679830
               method_name, n, d_len, blocks, c_len, perc_str, "", c_mbs, d_mbs);
Packit 679830
    }
Packit 679830
Packit 679830
    if (opt_verbose >= 2)
Packit 679830
        printf("\n");
Packit 679830
}
Packit 679830
Packit 679830
Packit 679830
static
Packit 679830
void print_totals ( void )
Packit 679830
{
Packit 679830
    char perc_str[4+1];
Packit 679830
Packit 679830
    if ((opt_verbose >= 1 && total_n > 1) || (opt_totals >= 2))
Packit 679830
    {
Packit 679830
        unsigned long n = total_n > 0 ? total_n : 1;
Packit 679830
        const char *t1 = "-------";
Packit 679830
        const char *t2 = total_method_names == 1 ? total_method_name : "";
Packit 679830
#if 1 && defined(__LZOLIB_PCLOCK_CH_INCLUDED)
Packit 679830
        char pclock_mode[32+1];
Packit 679830
        sprintf(pclock_mode, "[clock=%d]", pch.mode);
Packit 679830
        t1 = pclock_mode;
Packit 679830
        if (opt_pclock == 0) t1 = t2;
Packit 679830
#endif
Packit 679830
Packit 679830
#if 1
Packit 679830
        set_perc_d(total_perc / n, perc_str);
Packit 679830
        printf("%-13s  %-12s %10lu %4.1f %9lu %4s %8.3f %8.3f\n",
Packit 679830
               t1, "***AVG***",
Packit 679830
               total_d_len / n, total_blocks * 1.0 / n, total_c_len / n, perc_str,
Packit 679830
               t_div((double)total_c_mbs_n, total_c_mbs_harmonic),
Packit 679830
               t_div((double)total_d_mbs_n, total_d_mbs_harmonic));
Packit 679830
#endif
Packit 679830
        set_perc(total_c_len, total_d_len, perc_str);
Packit 679830
        printf("%-13s  %-12s %10lu %4lu %9lu %4s %s%8.3f %8.3f\n",
Packit 679830
               t2, "***TOTALS***",
Packit 679830
               total_d_len, total_blocks, total_c_len, perc_str, "",
Packit 679830
               t_div((double)total_c_mbs_n, total_c_mbs_harmonic),
Packit 679830
               t_div((double)total_d_mbs_n, total_d_mbs_harmonic));
Packit 679830
    }
Packit 679830
}
Packit 679830
Packit 679830
Packit 679830
/*************************************************************************
Packit 679830
// compress and decompress a file
Packit 679830
**************************************************************************/
Packit 679830
Packit 679830
static __lzo_noinline
Packit 679830
int process_file ( const compress_t *c, lzo_decompress_t decompress,
Packit 679830
                   const char *method_name,
Packit 679830
                   const char *file_name,
Packit 679830
                   long t_loops, long c_loops, long d_loops )
Packit 679830
{
Packit 679830
    long t_i;
Packit 679830
    unsigned long blocks = 0;
Packit 679830
    unsigned long compressed_len = 0;
Packit 679830
    double t_time = 0, c_time = 0, d_time = 0;
Packit 679830
    lzo_pclock_t t_start, t_stop, x_start, x_stop;
Packit 679830
    FILE *fp_dump = NULL;
Packit 679830
Packit 679830
    if (opt_dump_compressed_data)
Packit 679830
        fp_dump = fopen(opt_dump_compressed_data,"wb");
Packit 679830
Packit 679830
/* process the file */
Packit 679830
Packit 679830
    lzo_pclock_flush_cpu_cache(&pch, 0);
Packit 679830
    lzo_pclock_read(&pch, &t_start);
Packit 679830
    for (t_i = 0; t_i < t_loops; t_i++)
Packit 679830
    {
Packit 679830
        lzo_uint len, c_len, c_len_max, d_len = 0;
Packit 679830
        const lzo_bytep d = file_data.ptr;
Packit 679830
Packit 679830
        len = file_data.len;
Packit 679830
        c_len = 0;
Packit 679830
        blocks = 0;
Packit 679830
Packit 679830
        /* process blocks */
Packit 679830
        if (len > 0 || opt_try_to_compress_0_bytes) do
Packit 679830
        {
Packit 679830
            lzo_uint bl;
Packit 679830
            long c_i;
Packit 679830
            int r;
Packit 679830
            unsigned char random_byte = (unsigned char) file_data.len;
Packit 679830
#if 1 && defined(CLOCKS_PER_SEC)
Packit 679830
            random_byte = (unsigned char) (random_byte ^ clock());
Packit 679830
#endif
Packit 679830
            blocks++;
Packit 679830
Packit 679830
            bl = len > opt_block_size ? opt_block_size : len;
Packit 679830
            /* update lengths for memchecker_xxx() */
Packit 679830
            block_c.len = bl + get_max_compression_expansion(c->id, bl);
Packit 679830
            block_d.len = bl + get_max_decompression_overrun(c->id, bl);
Packit 679830
#if defined(__LZO_CHECKER)
Packit 679830
            /* malloc a block of the exact size to detect any overrun */
Packit 679830
            assert(block_c.alloc_ptr == NULL);
Packit 679830
            assert(block_d.alloc_ptr == NULL);
Packit 679830
            mb_alloc(&block_c, block_c.len);
Packit 679830
            mb_alloc(&block_d, block_d.len);
Packit 679830
#endif
Packit 679830
            assert(block_c.len <= block_c.saved_len);
Packit 679830
            assert(block_d.len <= block_d.saved_len);
Packit 679830
Packit 679830
            memchecker_init(&block_c, block_c.len, random_byte);
Packit 679830
            memchecker_init(&block_d, block_d.len, random_byte);
Packit 679830
Packit 679830
        /* compress the block */
Packit 679830
            c_len = c_len_max = 0;
Packit 679830
            lzo_pclock_flush_cpu_cache(&pch, 0);
Packit 679830
            lzo_pclock_read(&pch, &x_start);
Packit 679830
            for (r = 0, c_i = 0; c_i < c_loops; c_i++)
Packit 679830
            {
Packit 679830
                c_len = block_c.len;
Packit 679830
                r = call_compressor(c, d, bl, block_c.ptr, &c_len);
Packit 679830
                if (r != 0)
Packit 679830
                    break;
Packit 679830
                if (c_len > c_len_max)
Packit 679830
                    c_len_max = c_len;
Packit 679830
                if (c_len > block_c.len)
Packit 679830
                    goto compress_overrun;
Packit 679830
            }
Packit 679830
            lzo_pclock_read(&pch, &x_stop);
Packit 679830
            c_time += lzo_pclock_get_elapsed(&pch, &x_start, &x_stop);
Packit 679830
            if (r != 0)
Packit 679830
            {
Packit 679830
                printf("  compression failed in block %lu (%d) (%lu %lu)\n",
Packit 679830
                       blocks, r, (unsigned long)c_len, (unsigned long)bl);
Packit 679830
                return EXIT_LZO_ERROR;
Packit 679830
            }
Packit 679830
            if (memchecker_check(&block_c, block_c.len, random_byte) != 0)
Packit 679830
            {
Packit 679830
compress_overrun:
Packit 679830
                printf("  compression overwrite error in block %lu "
Packit 679830
                       "(%lu %lu %lu %lu)\n",
Packit 679830
                       blocks, (unsigned long)c_len, (unsigned long)d_len, (unsigned long)bl, (unsigned long)block_c.len);
Packit 679830
                return EXIT_LZO_ERROR;
Packit 679830
            }
Packit 679830
Packit 679830
        /* optimize the compressed block */
Packit 679830
            if (c_len < bl && opt_optimize_compressed_data)
Packit 679830
            {
Packit 679830
                d_len = bl;
Packit 679830
                r = call_optimizer(c, block_c.ptr, c_len, block_d.ptr, &d_len);
Packit 679830
                if (r != 0 || d_len != bl)
Packit 679830
                {
Packit 679830
                    printf("  optimization failed in block %lu (%d) "
Packit 679830
                           "(%lu %lu %lu)\n", blocks, r,
Packit 679830
                           (unsigned long)c_len, (unsigned long)d_len, (unsigned long)bl);
Packit 679830
                    return EXIT_LZO_ERROR;
Packit 679830
                }
Packit 679830
                if (memchecker_check(&block_c, block_c.len, random_byte) != 0 ||
Packit 679830
                    memchecker_check(&block_d, block_d.len, random_byte) != 0)
Packit 679830
                {
Packit 679830
                    printf("  optimize overwrite error in block %lu "
Packit 679830
                           "(%lu %lu %lu %lu)\n",
Packit 679830
                           blocks, (unsigned long)c_len, (unsigned long)d_len, (unsigned long)bl, (unsigned long)block_c.len);
Packit 679830
                    return EXIT_LZO_ERROR;
Packit 679830
                }
Packit 679830
            }
Packit 679830
Packit 679830
            /* dump compressed data to disk */
Packit 679830
            if (fp_dump)
Packit 679830
            {
Packit 679830
                lzo_uint l = (lzo_uint) lzo_fwrite(fp_dump, block_c.ptr, c_len);
Packit 679830
                if (l != c_len || fflush(fp_dump) != 0) {
Packit 679830
                    /* write error */
Packit 679830
                    (void) fclose(fp_dump); fp_dump = NULL;
Packit 679830
                }
Packit 679830
            }
Packit 679830
Packit 679830
        /* decompress the block and verify */
Packit 679830
            lzo_pclock_flush_cpu_cache(&pch, 0);
Packit 679830
            lzo_pclock_read(&pch, &x_start);
Packit 679830
            for (r = 0, c_i = 0; c_i < d_loops; c_i++)
Packit 679830
            {
Packit 679830
                d_len = bl;
Packit 679830
                r = call_decompressor(c, decompress, block_c.ptr, c_len, block_d.ptr, &d_len);
Packit 679830
                if (r != 0 || d_len != bl)
Packit 679830
                    break;
Packit 679830
            }
Packit 679830
            lzo_pclock_read(&pch, &x_stop);
Packit 679830
            d_time += lzo_pclock_get_elapsed(&pch, &x_start, &x_stop);
Packit 679830
            if (r != 0)
Packit 679830
            {
Packit 679830
                printf("  decompression failed in block %lu (%d) "
Packit 679830
                       "(%lu %lu %lu)\n", blocks, r,
Packit 679830
                       (unsigned long)c_len, (unsigned long)d_len, (unsigned long)bl);
Packit 679830
                return EXIT_LZO_ERROR;
Packit 679830
            }
Packit 679830
            if (d_len != bl)
Packit 679830
            {
Packit 679830
                printf("  decompression size error in block %lu (%lu %lu %lu)\n",
Packit 679830
                       blocks, (unsigned long)c_len, (unsigned long)d_len, (unsigned long)bl);
Packit 679830
                return EXIT_LZO_ERROR;
Packit 679830
            }
Packit 679830
            if (is_compressor(c))
Packit 679830
            {
Packit 679830
                if (lzo_memcmp(d, block_d.ptr, bl) != 0)
Packit 679830
                {
Packit 679830
                    lzo_uint x = 0;
Packit 679830
                    while (x < bl && block_d.ptr[x] == d[x])
Packit 679830
                        x++;
Packit 679830
                    printf("  decompression data error in block %lu at offset "
Packit 679830
                           "%lu (%lu %lu)\n", blocks, (unsigned long)x,
Packit 679830
                           (unsigned long)c_len, (unsigned long)d_len);
Packit 679830
                    if (opt_compute_adler32)
Packit 679830
                        printf("      checksum: 0x%08lx 0x%08lx\n",
Packit 679830
                               (unsigned long)adler_in, (unsigned long)adler_out);
Packit 679830
#if 0
Packit 679830
                    printf("Orig:  ");
Packit 679830
                    r = (x >= 10) ? -10 : 0 - (int) x;
Packit 679830
                    for (j = r; j <= 10 && x + j < bl; j++)
Packit 679830
                        printf(" %02x", (int)d[x+j]);
Packit 679830
                    printf("\nDecomp:");
Packit 679830
                    for (j = r; j <= 10 && x + j < bl; j++)
Packit 679830
                        printf(" %02x", (int)block_d.ptr[x+j]);
Packit 679830
                    printf("\n");
Packit 679830
#endif
Packit 679830
                    return EXIT_LZO_ERROR;
Packit 679830
                }
Packit 679830
                if ((opt_compute_adler32 && adler_in != adler_out) ||
Packit 679830
                    (opt_compute_crc32 && crc_in != crc_out))
Packit 679830
                {
Packit 679830
                    printf("  checksum error in block %lu (%lu %lu)\n",
Packit 679830
                           blocks, (unsigned long)c_len, (unsigned long)d_len);
Packit 679830
                    printf("      adler32: 0x%08lx 0x%08lx\n",
Packit 679830
                           (unsigned long)adler_in, (unsigned long)adler_out);
Packit 679830
                    printf("      crc32: 0x%08lx 0x%08lx\n",
Packit 679830
                           (unsigned long)crc_in, (unsigned long)crc_out);
Packit 679830
                    return EXIT_LZO_ERROR;
Packit 679830
                }
Packit 679830
            }
Packit 679830
Packit 679830
            if (memchecker_check(&block_d, block_d.len, random_byte) != 0)
Packit 679830
            {
Packit 679830
                printf("  decompression overwrite error in block %lu "
Packit 679830
                       "(%lu %lu %lu %lu)\n",
Packit 679830
                       blocks, (unsigned long)c_len, (unsigned long)d_len,
Packit 679830
                       (unsigned long)bl, (unsigned long)block_d.len);
Packit 679830
                return EXIT_LZO_ERROR;
Packit 679830
            }
Packit 679830
Packit 679830
#if defined(__LZO_CHECKER)
Packit 679830
            /* free in reverse order of allocations */
Packit 679830
            mb_free(&block_d);
Packit 679830
            mb_free(&block_c);
Packit 679830
#endif
Packit 679830
Packit 679830
            d += bl;
Packit 679830
            len -= bl;
Packit 679830
            compressed_len += (unsigned long) c_len_max;
Packit 679830
        }
Packit 679830
        while (len > 0);
Packit 679830
    }
Packit 679830
    lzo_pclock_read(&pch, &t_stop);
Packit 679830
    t_time += lzo_pclock_get_elapsed(&pch, &t_start, &t_stop);
Packit 679830
Packit 679830
    if (fp_dump) {
Packit 679830
        (void) fclose(fp_dump); fp_dump = NULL;
Packit 679830
    }
Packit 679830
    opt_dump_compressed_data = NULL;    /* only dump the first file */
Packit 679830
Packit 679830
    print_stats(method_name, file_name,
Packit 679830
                t_loops, c_loops, d_loops,
Packit 679830
                t_time, c_time, d_time,
Packit 679830
                compressed_len, (unsigned long) file_data.len, blocks);
Packit 679830
    if (total_method_name != c->name) {
Packit 679830
        total_method_name = c->name;
Packit 679830
        total_method_names += 1;
Packit 679830
    }
Packit 679830
Packit 679830
    return EXIT_OK;
Packit 679830
}
Packit 679830
Packit 679830
Packit 679830
Packit 679830
static
Packit 679830
int do_file ( int method, const char *file_name,
Packit 679830
              long c_loops, long d_loops,
Packit 679830
              lzo_uint32_tp p_adler, lzo_uint32_tp p_crc )
Packit 679830
{
Packit 679830
    int r;
Packit 679830
    const compress_t *c;
Packit 679830
    lzo_decompress_t decompress;
Packit 679830
    lzo_uint32_t adler, crc;
Packit 679830
    char method_name[256+1];
Packit 679830
    const char *n;
Packit 679830
    const long t_loops = 1;
Packit 679830
Packit 679830
    adler_in = adler_out = 0;
Packit 679830
    crc_in = crc_out = 0;
Packit 679830
    if (p_adler)
Packit 679830
        *p_adler = 0;
Packit 679830
    if (p_crc)
Packit 679830
        *p_crc = 0;
Packit 679830
Packit 679830
    c = find_method_by_id(method);
Packit 679830
    if (c == NULL || c->name == NULL || c->compress == NULL)
Packit 679830
        return EXIT_INTERNAL;
Packit 679830
    decompress = get_decomp_info(c,&n);
Packit 679830
    if (!decompress || n == NULL || block_w.len < c->mem_decompress)
Packit 679830
        return EXIT_INTERNAL;
Packit 679830
    strcpy(method_name,c->name);
Packit 679830
    strcat(method_name,n);
Packit 679830
Packit 679830
    if (c_loops < 1)  c_loops = 1;
Packit 679830
    if (d_loops < 1)  d_loops = 1;
Packit 679830
Packit 679830
    fflush(stdout); fflush(stderr);
Packit 679830
Packit 679830
    /* read the whole file */
Packit 679830
    r = load_file(file_name, opt_max_data_len);
Packit 679830
    if (r != 0)
Packit 679830
        return r;
Packit 679830
Packit 679830
    /* compute some checksums */
Packit 679830
    adler = lzo_adler32(0, NULL, 0);
Packit 679830
    adler = lzo_adler32(adler, file_data.ptr, file_data.len);
Packit 679830
    if (p_adler)
Packit 679830
        *p_adler = adler;
Packit 679830
    crc = lzo_crc32(0, NULL, 0);
Packit 679830
    crc = lzo_crc32(crc, file_data.ptr, file_data.len);
Packit 679830
    if (p_crc)
Packit 679830
        *p_crc = crc;
Packit 679830
Packit 679830
    if (opt_verbose >= 2)
Packit 679830
    {
Packit 679830
        printf("File %s: %lu bytes   (0x%08lx, 0x%08lx)\n",
Packit 679830
               file_name, (unsigned long) file_data.len, (unsigned long) adler, (unsigned long) crc);
Packit 679830
        printf("  compressing %lu bytes (%ld/%ld/%ld loops, %lu block-size)\n",
Packit 679830
               (unsigned long) file_data.len, t_loops, c_loops, d_loops, (unsigned long) opt_block_size);
Packit 679830
        printf("  %s\n", method_name);
Packit 679830
    }
Packit 679830
Packit 679830
    r = process_file(c, decompress, method_name, file_name,
Packit 679830
                     t_loops, c_loops, d_loops);
Packit 679830
Packit 679830
    return r;
Packit 679830
}
Packit 679830
Packit 679830
Packit 679830
/*************************************************************************
Packit 679830
// Calgary Corpus and Silesia Corpus test suite driver
Packit 679830
**************************************************************************/
Packit 679830
Packit 679830
struct corpus_entry_t
Packit 679830
{
Packit 679830
    const char *name;
Packit 679830
    long loops;
Packit 679830
    lzo_uint32_t adler;
Packit 679830
    lzo_uint32_t crc;
Packit 679830
};
Packit 679830
Packit 679830
const struct corpus_entry_t *opt_corpus = NULL;
Packit 679830
Packit 679830
static const struct corpus_entry_t calgary_corpus[] =
Packit 679830
{
Packit 679830
    { "bib",       8,  0x4bd09e98L, 0xb856ebe8L },
Packit 679830
    { "book1",     1,  0xd4d3613eL, 0x24e19972L },
Packit 679830
    { "book2",     1,  0x6fe14cc3L, 0xba0f3f26L },
Packit 679830
    { "geo",       6,  0xf3cc5be0L, 0x4d3a6ed0L },
Packit 679830
    { "news",      2,  0x2ed405b8L, 0xcafac853L },
Packit 679830
    { "obj1",     35,  0x3887dd2cL, 0xc7b0cd26L },
Packit 679830
    { "obj2",      4,  0xf89407c4L, 0x3ae33007L },
Packit 679830
    { "paper1",   17,  0xfe65ce62L, 0x2b6baca0L },
Packit 679830
    { "paper2",   11,  0x1238b7c2L, 0xf76cba72L },
Packit 679830
    { "pic",       4,  0xf61a5702L, 0x4b17e59cL },
Packit 679830
    { "progc",    25,  0x4c00ba45L, 0x6fb16094L },
Packit 679830
    { "progl",    20,  0x4cba738eL, 0xddbf6baaL },
Packit 679830
    { "progp",    28,  0x7495b92bL, 0x493a1809L },
Packit 679830
    { "trans",    15,  0x52a2cec8L, 0xcdec06a6L },
Packit 679830
    { NULL,        0,  0x00000000L, 0x00000000L }
Packit 679830
};
Packit 679830
Packit 679830
static const struct corpus_entry_t silesia_corpus[] =
Packit 679830
{
Packit 679830
    { "dickens",   1,  0x170f606fL, 0xaf3a6b76L },
Packit 679830
    { "mozilla",   1,  0x1188dd4eL, 0x7fb0ab7dL },
Packit 679830
    { "mr",        1,  0xaea14b97L, 0xa341883fL },
Packit 679830
    { "nci",       1,  0x0af16f1fL, 0x60ff63d3L },
Packit 679830
    { "ooffice",   1,  0x83c8f689L, 0xa023e1faL },
Packit 679830
    { "osdb",      1,  0xb825b790L, 0xa0ca388cL },
Packit 679830
    { "reymont",   1,  0xce5c82caL, 0x50d35f03L },
Packit 679830
    { "samba",     1,  0x19dbb9f5L, 0x2beac5f3L },
Packit 679830
    { "sao",       1,  0x7edfc4a9L, 0xfda125bfL },
Packit 679830
    { "webster",   1,  0xf2962fc6L, 0x01f5a2e9L },
Packit 679830
    { "xml",       1,  0xeccd03d6L, 0xff8f3051L },
Packit 679830
    { "x-ray",     1,  0xc95435a0L, 0xc86a35c6L },
Packit 679830
    { NULL,        0,  0x00000000L, 0x00000000L }
Packit 679830
};
Packit 679830
Packit 679830
Packit 679830
static
Packit 679830
int do_corpus ( const struct corpus_entry_t *corpus, int method, const char *path,
Packit 679830
                long c_loops, long d_loops )
Packit 679830
{
Packit 679830
    size_t i, n;
Packit 679830
    char name[256];
Packit 679830
Packit 679830
    if (path == NULL || strlen(path) >= sizeof(name) - 12)
Packit 679830
        return EXIT_USAGE;
Packit 679830
Packit 679830
    strcpy(name,path);
Packit 679830
    n = strlen(name);
Packit 679830
    if (n > 0 && name[n-1] != '/' && name[n-1] != '\\' && name[n-1] != ':')
Packit 679830
    {
Packit 679830
        strcat(name,"/");
Packit 679830
        n++;
Packit 679830
    }
Packit 679830
Packit 679830
    for (i = 0; corpus[i].name != NULL; i++)
Packit 679830
    {
Packit 679830
        lzo_uint32_t adler, crc;
Packit 679830
        long c = c_loops * corpus[i].loops;
Packit 679830
        long d = d_loops * corpus[i].loops;
Packit 679830
        int r;
Packit 679830
Packit 679830
        strcpy(name+n,corpus[i].name);
Packit 679830
        r = do_file(method, name, c, d, &adler, &crc;;
Packit 679830
        if (r != 0)
Packit 679830
            return r;
Packit 679830
        if (adler != corpus[i].adler)
Packit 679830
        {
Packit 679830
            printf("  invalid test suite\n");
Packit 679830
            return EXIT_ADLER;
Packit 679830
        }
Packit 679830
        if (corpus[i].crc && crc != corpus[i].crc)
Packit 679830
        {
Packit 679830
            printf("  internal checksum error !!  (0x%08lx 0x%08lx)\n",
Packit 679830
                    (unsigned long) crc, (unsigned long) corpus[i].crc);
Packit 679830
            return EXIT_INTERNAL;
Packit 679830
        }
Packit 679830
    }
Packit 679830
    return EXIT_OK;
Packit 679830
}
Packit 679830
Packit 679830
Packit 679830
/*************************************************************************
Packit 679830
// usage
Packit 679830
**************************************************************************/
Packit 679830
Packit 679830
static
Packit 679830
void usage ( const char *name, int exit_code, lzo_bool show_methods )
Packit 679830
{
Packit 679830
    FILE *fp;
Packit 679830
    int i;
Packit 679830
Packit 679830
    fp = stdout;
Packit 679830
Packit 679830
    fflush(stdout); fflush(stderr);
Packit 679830
Packit 679830
    fprintf(fp,"Usage: %s [option..] file...\n", name);
Packit 679830
    fprintf(fp,"\n");
Packit 679830
    fprintf(fp,"Options:\n");
Packit 679830
    fprintf(fp,"  -m#     compression method\n");
Packit 679830
    fprintf(fp,"  -b#     set input block size (default %lu, max %lu)\n",
Packit 679830
            (unsigned long) opt_block_size, (unsigned long) opt_max_data_len);
Packit 679830
    fprintf(fp,"  -n#     number of compression/decompression runs\n");
Packit 679830
    fprintf(fp,"  -c#     number of compression runs\n");
Packit 679830
    fprintf(fp,"  -d#     number of decompression runs\n");
Packit 679830
    fprintf(fp,"  -S      use safe decompressor (if available)\n");
Packit 679830
    fprintf(fp,"  -A      use assembler decompressor (if available)\n");
Packit 679830
    fprintf(fp,"  -F      use fast assembler decompressor (if available)\n");
Packit 679830
    fprintf(fp,"  -O      optimize compressed data (if available)\n");
Packit 679830
    fprintf(fp,"  -s DIR  process Calgary Corpus test suite in directory `DIR'\n");
Packit 679830
    fprintf(fp,"  -@      read list of files to compress from stdin\n");
Packit 679830
    fprintf(fp,"  -q      be quiet\n");
Packit 679830
    fprintf(fp,"  -Q      be very quiet\n");
Packit 679830
    fprintf(fp,"  -v      be verbose\n");
Packit 679830
    fprintf(fp,"  -L      display software license\n");
Packit 679830
Packit 679830
    if (show_methods)
Packit 679830
    {
Packit 679830
#if defined(__LZOLIB_PCLOCK_CH_INCLUDED)
Packit 679830
        lzo_pclock_t t_dummy;
Packit 679830
        lzo_pclock_read(&pch, &t_dummy);
Packit 679830
        (void) lzo_pclock_get_elapsed(&pch, &t_dummy, &t_dummy);
Packit 679830
        fprintf(fp,"\nAll timings are recorded using pclock mode %d %s.\n", pch.mode, pch.name);
Packit 679830
#endif
Packit 679830
        fprintf(fp,"\n\n");
Packit 679830
        fprintf(fp,"The following compression methods are available:\n");
Packit 679830
        fprintf(fp,"\n");
Packit 679830
        fprintf(fp,"  usage   name           memory          available extras\n");
Packit 679830
        fprintf(fp,"  -----   ----           ------          ----------------\n");
Packit 679830
Packit 679830
        for (i = 0; i <= M_LAST_COMPRESSOR; i++)
Packit 679830
        {
Packit 679830
            const compress_t *c;
Packit 679830
            c = find_method_by_id(i);
Packit 679830
            if (c)
Packit 679830
            {
Packit 679830
                char n[16];
Packit 679830
                const char *sep = "          ";
Packit 679830
                unsigned long m = c->mem_compress;
Packit 679830
Packit 679830
                sprintf(n,"-m%d",i);
Packit 679830
                fprintf(fp,"  %-6s  %-13s",n,c->name);
Packit 679830
#if 1
Packit 679830
                fprintf(fp,"%9lu", m);
Packit 679830
#else
Packit 679830
                m = (m + 1023) / 1024;
Packit 679830
                fprintf(fp,"%6lu KiB", m);
Packit 679830
#endif
Packit 679830
Packit 679830
                if (c->decompress_safe)
Packit 679830
                    { fprintf(fp, "%s%s", sep, "safe"); sep = ", "; }
Packit 679830
                if (c->decompress_asm)
Packit 679830
                    { fprintf(fp, "%s%s", sep, "asm"); sep = ", "; }
Packit 679830
                if (c->decompress_asm_safe)
Packit 679830
                    { fprintf(fp, "%s%s", sep, "asm+safe"); sep = ", "; }
Packit 679830
                if (c->decompress_asm_fast)
Packit 679830
                    { fprintf(fp, "%s%s", sep, "fastasm"); sep = ", "; }
Packit 679830
                if (c->decompress_asm_fast_safe)
Packit 679830
                    { fprintf(fp, "%s%s", sep, "fastasm+safe"); sep = ", "; }
Packit 679830
                if (c->optimize)
Packit 679830
                    { fprintf(fp, "%s%s", sep, "optimize"); sep = ", "; }
Packit 679830
                fprintf(fp, "\n");
Packit 679830
            }
Packit 679830
        }
Packit 679830
    }
Packit 679830
    else
Packit 679830
    {
Packit 679830
        fprintf(fp,"\n");
Packit 679830
        fprintf(fp,"Type '%s -m' to list all available methods.\n", name);
Packit 679830
    }
Packit 679830
Packit 679830
    fflush(fp);
Packit 679830
    if (exit_code < 0)
Packit 679830
        exit_code = EXIT_USAGE;
Packit 679830
    exit(exit_code);
Packit 679830
}
Packit 679830
Packit 679830
Packit 679830
static
Packit 679830
void license(void)
Packit 679830
{
Packit 679830
    FILE *fp;
Packit 679830
Packit 679830
    fp = stdout;
Packit 679830
    fflush(stdout); fflush(stderr);
Packit 679830
Packit 679830
#if defined(__LZO_PROFESSIONAL__)
Packit 679830
#  include "lzopro/license.ch"
Packit 679830
#else
Packit 679830
fprintf(fp,
Packit 679830
"   The LZO library is free software; you can redistribute it and/or\n"
Packit 679830
"   modify it under the terms of the GNU General Public License as\n"
Packit 679830
"   published by the Free Software Foundation; either version 2 of\n"
Packit 679830
"   the License, or (at your option) any later version.\n"
Packit 679830
"\n"
Packit 679830
"   The LZO library is distributed in the hope that it will be useful,\n"
Packit 679830
"   but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
Packit 679830
"   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
Packit 679830
"   GNU General Public License for more details.\n"
Packit 679830
    );
Packit 679830
fprintf(fp,
Packit 679830
"\n"
Packit 679830
"   You should have received a copy of the GNU General Public License\n"
Packit 679830
"   along with the LZO library; see the file COPYING.\n"
Packit 679830
"   If not, write to the Free Software Foundation, Inc.,\n"
Packit 679830
"   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n"
Packit 679830
"\n"
Packit 679830
"   Markus F.X.J. Oberhumer\n"
Packit 679830
"   <markus@oberhumer.com>\n"
Packit 679830
"   http://www.oberhumer.com/opensource/lzo/\n"
Packit 679830
"\n"
Packit 679830
    );
Packit 679830
#endif
Packit 679830
Packit 679830
    fflush(fp);
Packit 679830
    exit(EXIT_OK);
Packit 679830
}
Packit 679830
Packit 679830
Packit 679830
/*************************************************************************
Packit 679830
// parse method option '-m'
Packit 679830
**************************************************************************/
Packit 679830
Packit 679830
static int methods[256+1];
Packit 679830
static int methods_n = 0;
Packit 679830
Packit 679830
static void add_method(int m)
Packit 679830
{
Packit 679830
    int i;
Packit 679830
Packit 679830
    if (m > 0)
Packit 679830
    {
Packit 679830
        if (!find_method_by_id(m)) {
Packit 679830
            fprintf(stdout,"%s: invalid method %d\n",progname,m);
Packit 679830
            exit(EXIT_USAGE);
Packit 679830
        }
Packit 679830
Packit 679830
        for (i = 0; i < methods_n; i++)
Packit 679830
            if (methods[i] == m)
Packit 679830
                return;
Packit 679830
Packit 679830
        if (methods_n >= 256)
Packit 679830
        {
Packit 679830
            fprintf(stderr,"%s: too many methods\n",progname);
Packit 679830
            exit(EXIT_USAGE);
Packit 679830
        }
Packit 679830
Packit 679830
        methods[methods_n++] = m;
Packit 679830
        methods[methods_n] = 0;
Packit 679830
    }
Packit 679830
}
Packit 679830
Packit 679830
Packit 679830
static void add_methods(const int *ml)
Packit 679830
{
Packit 679830
    while (*ml != 0)
Packit 679830
        add_method(*ml++);
Packit 679830
}
Packit 679830
Packit 679830
Packit 679830
static void add_all_methods(int first, int last)
Packit 679830
{
Packit 679830
    int m;
Packit 679830
Packit 679830
    for (m = first; m <= last; m++)
Packit 679830
        if (find_method_by_id(m) != NULL)
Packit 679830
            add_method(m);
Packit 679830
}
Packit 679830
Packit 679830
Packit 679830
static int m_strcmp(const char *a, const char *b)
Packit 679830
{
Packit 679830
    size_t n;
Packit 679830
Packit 679830
    if (a[0] == 0 || b[0] == 0)
Packit 679830
        return 1;
Packit 679830
    n = strlen(b);
Packit 679830
    if (strncmp(a,b,n) == 0 && (a[n] == 0 || a[n] == ','))
Packit 679830
        return 0;
Packit 679830
    return 1;
Packit 679830
}
Packit 679830
Packit 679830
Packit 679830
static lzo_bool m_strisdigit(const char *s)
Packit 679830
{
Packit 679830
    for (;;)
Packit 679830
    {
Packit 679830
        if (!is_digit(*s))
Packit 679830
            return 0;
Packit 679830
        s++;
Packit 679830
        if (*s == 0 || *s == ',')
Packit 679830
            break;
Packit 679830
    }
Packit 679830
    return 1;
Packit 679830
}
Packit 679830
Packit 679830
Packit 679830
static void parse_methods(const char *p)
Packit 679830
{
Packit 679830
    const compress_t *c;
Packit 679830
Packit 679830
    for (;;)
Packit 679830
    {
Packit 679830
        if (p == NULL || p[0] == 0)
Packit 679830
            usage(progname,-1,1);
Packit 679830
        else if ((c = find_method_by_name(p)) != NULL)
Packit 679830
            add_method(c->id);
Packit 679830
        else if (m_strcmp(p,"all") == 0 || m_strcmp(p,"avail") == 0)
Packit 679830
            add_all_methods(1,M_LAST_COMPRESSOR);
Packit 679830
        else if (m_strcmp(p,"ALL") == 0)
Packit 679830
        {
Packit 679830
            add_all_methods(1,M_LAST_COMPRESSOR);
Packit 679830
            add_all_methods(9721,9729);
Packit 679830
            add_all_methods(9781,9789);
Packit 679830
        }
Packit 679830
        else if (m_strcmp(p,"lzo") == 0)
Packit 679830
            add_all_methods(1,M_MEMCPY);
Packit 679830
        else if (m_strcmp(p,"bench") == 0)
Packit 679830
            add_methods(benchmark_methods);
Packit 679830
        else if (m_strcmp(p,"m1") == 0)
Packit 679830
            add_methods(x1_methods);
Packit 679830
        else if (m_strcmp(p,"m99") == 0)
Packit 679830
            add_methods(x99_methods);
Packit 679830
        else if (m_strcmp(p,"m999") == 0)
Packit 679830
            add_methods(x999_methods);
Packit 679830
        else if (m_strcmp(p,"1x999") == 0)
Packit 679830
            add_all_methods(9721,9729);
Packit 679830
        else if (m_strcmp(p,"1y999") == 0)
Packit 679830
            add_all_methods(9821,9829);
Packit 679830
#if defined(ALG_ZLIB)
Packit 679830
        else if (m_strcmp(p,"zlib") == 0)
Packit 679830
            add_all_methods(M_ZLIB_8_1,M_ZLIB_8_9);
Packit 679830
#endif
Packit 679830
#if defined(ALG_BZIP2)
Packit 679830
        else if (m_strcmp(p,"bzip2") == 0)
Packit 679830
            add_all_methods(M_BZIP2_1,M_BZIP2_9);
Packit 679830
#endif
Packit 679830
#if defined(__LZO_PROFESSIONAL__)
Packit 679830
#  include "lzopro/t_opt_m.ch"
Packit 679830
#endif
Packit 679830
        else if (m_strisdigit(p))
Packit 679830
            add_method(atoi(p));
Packit 679830
        else
Packit 679830
        {
Packit 679830
            printf("%s: invalid method '%s'\n\n",progname,p);
Packit 679830
            exit(EXIT_USAGE);
Packit 679830
        }
Packit 679830
Packit 679830
        while (*p && *p != ',')
Packit 679830
            p++;
Packit 679830
        while (*p == ',')
Packit 679830
            p++;
Packit 679830
        if (*p == 0)
Packit 679830
            return;
Packit 679830
    }
Packit 679830
}
Packit 679830
Packit 679830
Packit 679830
/*************************************************************************
Packit 679830
// options
Packit 679830
**************************************************************************/
Packit 679830
Packit 679830
enum {
Packit 679830
    OPT_LONGOPT_ONLY = 512,
Packit 679830
    OPT_ADLER32,
Packit 679830
    OPT_CALGARY_CORPUS,
Packit 679830
    OPT_CLEAR_WRKMEM,
Packit 679830
    OPT_CRC32,
Packit 679830
    OPT_DICT,
Packit 679830
    OPT_DUMP,
Packit 679830
    OPT_EXECUTION_TIME,
Packit 679830
    OPT_MAX_DATA_LEN,
Packit 679830
    OPT_MAX_DICT_LEN,
Packit 679830
    OPT_SILESIA_CORPUS,
Packit 679830
    OPT_PCLOCK,
Packit 679830
    OPT_UNUSED
Packit 679830
};
Packit 679830
Packit 679830
static const struct lzo_getopt_longopt_t longopts[] =
Packit 679830
{
Packit 679830
 /* { name  has_arg  *flag  val } */
Packit 679830
    {"help",             0, 0, 'h'+256}, /* give help */
Packit 679830
    {"license",          0, 0, 'L'},     /* display software license */
Packit 679830
    {"quiet",            0, 0, 'q'},     /* quiet mode */
Packit 679830
    {"verbose",          0, 0, 'v'},     /* verbose mode */
Packit 679830
    {"version",          0, 0, 'V'+256}, /* display version number */
Packit 679830
Packit 679830
    {"adler32",          0, 0, OPT_ADLER32},
Packit 679830
    {"calgary-corpus",   1, 0, OPT_CALGARY_CORPUS},
Packit 679830
    {"clear-wrkmem",     0, 0, OPT_CLEAR_WRKMEM},
Packit 679830
    {"clock",            1, 0, OPT_PCLOCK},
Packit 679830
    {"corpus",           1, 0, OPT_CALGARY_CORPUS},
Packit 679830
    {"crc32",            0, 0, OPT_CRC32},
Packit 679830
    {"dict",             1, 0, OPT_DICT},
Packit 679830
    {"dump-compressed",  1, 0, OPT_DUMP},
Packit 679830
    {"execution-time",   0, 0, OPT_EXECUTION_TIME},
Packit 679830
    {"max-data-length",  1, 0, OPT_MAX_DATA_LEN},
Packit 679830
    {"max-dict-length",  1, 0, OPT_MAX_DICT_LEN},
Packit 679830
    {"silesia-corpus",   1, 0, OPT_SILESIA_CORPUS},
Packit 679830
    {"uclock",           1, 0, OPT_PCLOCK},
Packit 679830
    {"methods",          1, 0, 'm'},
Packit 679830
    {"totals",           0, 0, 'T'},
Packit 679830
Packit 679830
    { 0, 0, 0, 0 }
Packit 679830
};
Packit 679830
Packit 679830
Packit 679830
static int do_option(lzo_getopt_p g, int optc)
Packit 679830
{
Packit 679830
#define mfx_optarg      g->optarg
Packit 679830
    switch (optc)
Packit 679830
    {
Packit 679830
    case 'A':
Packit 679830
        opt_use_asm_decompressor = 1;
Packit 679830
        break;
Packit 679830
    case 'b':
Packit 679830
        opt_block_size = 0; /* set to opt_max_data_len later */
Packit 679830
        if (mfx_optarg)
Packit 679830
        {
Packit 679830
            if (!mfx_optarg || !is_digit(mfx_optarg[0]))
Packit 679830
                return optc;
Packit 679830
            opt_block_size = atol(mfx_optarg);
Packit 679830
        }
Packit 679830
        break;
Packit 679830
    case 'c':
Packit 679830
    case 'C':
Packit 679830
        if (!mfx_optarg || !is_digit(mfx_optarg[0]))
Packit 679830
            return optc;
Packit 679830
        opt_c_loops = atol(mfx_optarg);
Packit 679830
        break;
Packit 679830
    case 'd':
Packit 679830
    case 'D':
Packit 679830
        if (!mfx_optarg || !is_digit(mfx_optarg[0]))
Packit 679830
            return optc;
Packit 679830
        opt_d_loops = atol(mfx_optarg);
Packit 679830
        break;
Packit 679830
    case 'F':
Packit 679830
        opt_use_asm_fast_decompressor = 1;
Packit 679830
        break;
Packit 679830
    case 'h':
Packit 679830
    case 'H':
Packit 679830
    case '?':
Packit 679830
    case 'h'+256:
Packit 679830
        usage(progname,EXIT_OK,0);
Packit 679830
        break;
Packit 679830
    case 'L':
Packit 679830
        license();
Packit 679830
        break;
Packit 679830
    case 'm':
Packit 679830
        parse_methods(mfx_optarg);
Packit 679830
        break;
Packit 679830
    case 'n':
Packit 679830
        if (!mfx_optarg || !is_digit(mfx_optarg[0]))
Packit 679830
            return optc;
Packit 679830
        opt_c_loops = opt_d_loops = atol(mfx_optarg);
Packit 679830
        break;
Packit 679830
    case 'O':
Packit 679830
        opt_optimize_compressed_data = 1;
Packit 679830
        break;
Packit 679830
    case 'q':
Packit 679830
        opt_verbose -= 1;
Packit 679830
        break;
Packit 679830
    case 'Q':
Packit 679830
        opt_verbose = 0;
Packit 679830
        break;
Packit 679830
    case 's':
Packit 679830
    case OPT_CALGARY_CORPUS:
Packit 679830
        if (!mfx_optarg || !mfx_optarg[0])
Packit 679830
            return optc;
Packit 679830
        opt_corpus_path = mfx_optarg;
Packit 679830
        opt_corpus = calgary_corpus;
Packit 679830
        break;
Packit 679830
    case OPT_SILESIA_CORPUS:
Packit 679830
        if (!mfx_optarg || !mfx_optarg[0])
Packit 679830
            return optc;
Packit 679830
        opt_corpus_path = mfx_optarg;
Packit 679830
        opt_corpus = silesia_corpus;
Packit 679830
        break;
Packit 679830
    case 'S':
Packit 679830
        opt_use_safe_decompressor = 1;
Packit 679830
        break;
Packit 679830
    case 'T':
Packit 679830
        opt_totals += 1;
Packit 679830
        break;
Packit 679830
    case 'v':
Packit 679830
        opt_verbose += 1;
Packit 679830
        break;
Packit 679830
    case 'V':
Packit 679830
    case 'V'+256:
Packit 679830
        exit(EXIT_OK);
Packit 679830
        break;
Packit 679830
    case '@':
Packit 679830
        opt_read_from_stdin = 1;
Packit 679830
        break;
Packit 679830
Packit 679830
    case '1': case '2': case '3': case '4': case '5':
Packit 679830
    case '6': case '7': case '8': case '9':
Packit 679830
        /* this is a dirty hack... */
Packit 679830
        if (g->shortpos == 0) {
Packit 679830
            char m[2]; m[0] = (char) optc; m[1] = 0;
Packit 679830
            parse_methods(m);
Packit 679830
        } else {
Packit 679830
            const char *m = &g->argv[g->optind][g->shortpos-1];
Packit 679830
            parse_methods(m);
Packit 679830
            ++g->optind; g->shortpos = 0;
Packit 679830
        }
Packit 679830
        break;
Packit 679830
Packit 679830
    case OPT_ADLER32:
Packit 679830
        opt_compute_adler32 = 1;
Packit 679830
        break;
Packit 679830
    case OPT_CLEAR_WRKMEM:
Packit 679830
        opt_clear_wrkmem = 1;
Packit 679830
        break;
Packit 679830
    case OPT_CRC32:
Packit 679830
        opt_compute_crc32 = 1;
Packit 679830
        break;
Packit 679830
    case OPT_DICT:
Packit 679830
        opt_dict = 1;
Packit 679830
        opt_dictionary_file = mfx_optarg;
Packit 679830
        break;
Packit 679830
    case OPT_EXECUTION_TIME:
Packit 679830
        opt_execution_time = 1;
Packit 679830
        break;
Packit 679830
    case OPT_DUMP:
Packit 679830
        opt_dump_compressed_data = mfx_optarg;
Packit 679830
        break;
Packit 679830
    case OPT_MAX_DATA_LEN:
Packit 679830
        if (!mfx_optarg || !is_digit(mfx_optarg[0]))
Packit 679830
            return optc;
Packit 679830
        opt_max_data_len = atol(mfx_optarg);
Packit 679830
        break;
Packit 679830
    case OPT_MAX_DICT_LEN:
Packit 679830
        if (!mfx_optarg || !is_digit(mfx_optarg[0]))
Packit 679830
            return optc;
Packit 679830
        opt_max_dict_len = atol(mfx_optarg);
Packit 679830
        break;
Packit 679830
    case OPT_PCLOCK:
Packit 679830
        if (!mfx_optarg || !is_digit(mfx_optarg[0]))
Packit 679830
            return optc;
Packit 679830
        opt_pclock = atoi(mfx_optarg);
Packit 679830
#if defined(__LZOLIB_PCLOCK_CH_INCLUDED)
Packit 679830
        if (opt_pclock > 0)
Packit 679830
            pch.mode = opt_pclock;
Packit 679830
#endif
Packit 679830
        break;
Packit 679830
Packit 679830
    case '\0':
Packit 679830
        return -1;
Packit 679830
    case ':':
Packit 679830
        return -2;
Packit 679830
    default:
Packit 679830
        fprintf(stderr,"%s: internal error in getopt (%d)\n",progname,optc);
Packit 679830
        return -3;
Packit 679830
    }
Packit 679830
    return 0;
Packit 679830
#undef mfx_optarg
Packit 679830
}
Packit 679830
Packit 679830
Packit 679830
static void handle_opterr(lzo_getopt_p g, const char *f, void *v)
Packit 679830
{
Packit 679830
    struct A { va_list ap; };
Packit 679830
    struct A *a = (struct A *) v;
Packit 679830
    fprintf( stderr, "%s: ", g->progname);
Packit 679830
    if (a)
Packit 679830
        vfprintf(stderr, f, a->ap);
Packit 679830
    else
Packit 679830
        fprintf( stderr, "UNKNOWN GETOPT ERROR");
Packit 679830
    fprintf( stderr, "\n");
Packit 679830
}
Packit 679830
Packit 679830
Packit 679830
static int get_options(int argc, char **argv)
Packit 679830
{
Packit 679830
    lzo_getopt_t mfx_getopt;
Packit 679830
    int optc;
Packit 679830
    static const char shortopts[] =
Packit 679830
        "Ab::c:C:d:D:FhHLm::n:OqQs:STvV@123456789";
Packit 679830
Packit 679830
    lzo_getopt_init(&mfx_getopt, 1, argc, argv);
Packit 679830
    mfx_getopt.progname = progname;
Packit 679830
    mfx_getopt.opterr = handle_opterr;
Packit 679830
    while ((optc = lzo_getopt(&mfx_getopt, shortopts, longopts, NULL)) >= 0)
Packit 679830
    {
Packit 679830
        if (do_option(&mfx_getopt, optc) != 0)
Packit 679830
            exit(EXIT_USAGE);
Packit 679830
    }
Packit 679830
Packit 679830
    return mfx_getopt.optind;
Packit 679830
}
Packit 679830
Packit 679830
Packit 679830
/*************************************************************************
Packit 679830
// main
Packit 679830
**************************************************************************/
Packit 679830
Packit 679830
int __lzo_cdecl_main main(int argc, char *argv[])
Packit 679830
{
Packit 679830
    int r = EXIT_OK;
Packit 679830
    int i, ii;
Packit 679830
    int m;
Packit 679830
    time_t t_total;
Packit 679830
    const char *s;
Packit 679830
Packit 679830
    lzo_wildargv(&argc, &argv);
Packit 679830
    lzo_pclock_open_default(&pch;;
Packit 679830
Packit 679830
    progname = argv[0];
Packit 679830
    for (s = progname; *s; s++)
Packit 679830
        if ((*s == '/' || *s == '\\') && s[1])
Packit 679830
            progname = s + 1;
Packit 679830
Packit 679830
#if defined(__LZO_PROFESSIONAL__)
Packit 679830
    printf("\nLZO Professional real-time data compression library (v%s, %s).\n",
Packit 679830
           lzo_version_string(), lzo_version_date());
Packit 679830
    printf("Copyright (C) 1996-2014 Markus Franz Xaver Johannes Oberhumer\nAll Rights Reserved.\n\n");
Packit 679830
#else
Packit 679830
    printf("\nLZO real-time data compression library (v%s, %s).\n",
Packit 679830
           lzo_version_string(), lzo_version_date());
Packit 679830
    printf("Copyright (C) 1996-2014 Markus Franz Xaver Johannes Oberhumer\nAll Rights Reserved.\n\n");
Packit 679830
#endif
Packit 679830
Packit 679830
Packit 679830
/*
Packit 679830
 * Step 1: initialize the LZO library
Packit 679830
 */
Packit 679830
Packit 679830
    if (lzo_init() != LZO_E_OK)
Packit 679830
    {
Packit 679830
        printf("internal error - lzo_init() failed !!!\n");
Packit 679830
        printf("(this usually indicates a compiler bug - try recompiling\nwithout optimizations, and enable `-DLZO_DEBUG' for diagnostics)\n");
Packit 679830
        exit(1);
Packit 679830
    }
Packit 679830
Packit 679830
Packit 679830
/*
Packit 679830
 * Step 2: setup default options
Packit 679830
 */
Packit 679830
Packit 679830
    opt_max_data_len = 64 * 1024L * 1024L;
Packit 679830
    opt_block_size = 256 * 1024L;
Packit 679830
Packit 679830
#if (LZO_ARCH_M68K && LZO_OS_TOS)
Packit 679830
    /* reduce memory requirements for 14 MB machines */
Packit 679830
    opt_max_data_len = 8 * 1024L * 1024L;
Packit 679830
#endif
Packit 679830
Packit 679830
Packit 679830
Packit 679830
/*
Packit 679830
 * Step 3: parse options
Packit 679830
 */
Packit 679830
Packit 679830
    if (argc < 2)
Packit 679830
        usage(progname,-1,0);
Packit 679830
    i = get_options(argc,argv);
Packit 679830
Packit 679830
    if (methods_n == 0)
Packit 679830
        add_method(default_method);
Packit 679830
    if (methods_n > 1 && opt_read_from_stdin)
Packit 679830
    {
Packit 679830
        printf("%s: cannot use multiple methods and '-@'\n", progname);
Packit 679830
        exit(EXIT_USAGE);
Packit 679830
    }
Packit 679830
Packit 679830
    if (opt_block_size == 0)
Packit 679830
        opt_block_size = opt_max_data_len;
Packit 679830
    if (opt_block_size > opt_max_data_len)
Packit 679830
        opt_block_size = opt_max_data_len;
Packit 679830
Packit 679830
    if (opt_c_loops < 1)
Packit 679830
        opt_c_loops = 1;
Packit 679830
    if (opt_d_loops < 1)
Packit 679830
        opt_d_loops = 1;
Packit 679830
Packit 679830
Packit 679830
/*
Packit 679830
 * Step 4: start work
Packit 679830
 */
Packit 679830
Packit 679830
    block_w.len = 0;
Packit 679830
    for (ii = 0; ii < methods_n; ii++) {
Packit 679830
        const compress_t *c = find_method_by_id(methods[ii]);
Packit 679830
        assert(c != NULL);
Packit 679830
        if (c->mem_compress > block_w.len)
Packit 679830
            block_w.len = c->mem_compress;
Packit 679830
        if (c->mem_decompress > block_w.len)
Packit 679830
            block_w.len = c->mem_decompress;
Packit 679830
    }
Packit 679830
Packit 679830
    mb_alloc(&block_w, block_w.len);
Packit 679830
    lzo_memset(block_w.ptr, 0, block_w.len);
Packit 679830
Packit 679830
#if !defined(__LZO_CHECKER)
Packit 679830
    mb_alloc_extra(&block_c, opt_block_size + get_max_compression_expansion(-1, opt_block_size), 16, 16);
Packit 679830
    mb_alloc_extra(&block_d, opt_block_size + get_max_decompression_overrun(-1, opt_block_size), 16, 16);
Packit 679830
#endif
Packit 679830
Packit 679830
    if (opt_dict)
Packit 679830
    {
Packit 679830
        opt_optimize_compressed_data = 0;
Packit 679830
        dict_alloc(opt_max_dict_len);
Packit 679830
        if (opt_dictionary_file)
Packit 679830
        {
Packit 679830
            dict_load(opt_dictionary_file);
Packit 679830
            if (dict.len > 0)
Packit 679830
                printf("Using dictionary '%s', %lu bytes, ID 0x%08lx.\n",
Packit 679830
                       opt_dictionary_file,
Packit 679830
                       (unsigned long) dict.len, (unsigned long) dict.adler);
Packit 679830
        }
Packit 679830
        if (dict.len == 0)
Packit 679830
        {
Packit 679830
            dict_set_default();
Packit 679830
            printf("Using default dictionary, %lu bytes, ID 0x%08lx.\n",
Packit 679830
                   (unsigned long) dict.len, (unsigned long) dict.adler);
Packit 679830
        }
Packit 679830
    }
Packit 679830
Packit 679830
    t_total = time(NULL);
Packit 679830
    ii = i;
Packit 679830
    for (m = 0; m < methods_n && r == EXIT_OK; m++)
Packit 679830
    {
Packit 679830
        int method = methods[m];
Packit 679830
Packit 679830
        i = ii;
Packit 679830
        if (i >= argc && opt_corpus_path == NULL && !opt_read_from_stdin)
Packit 679830
            usage(progname,-1,0);
Packit 679830
        if (m == 0 && opt_verbose >= 1)
Packit 679830
            printf("%lu block-size\n\n", (unsigned long) opt_block_size);
Packit 679830
Packit 679830
        assert(find_method_by_id(method) != NULL);
Packit 679830
Packit 679830
        if (opt_corpus_path != NULL)
Packit 679830
            r = do_corpus(opt_corpus, method, opt_corpus_path,
Packit 679830
                          opt_c_loops, opt_d_loops);
Packit 679830
        else
Packit 679830
        {
Packit 679830
            for ( ; i < argc && r == EXIT_OK; i++)
Packit 679830
            {
Packit 679830
                r = do_file(method,argv[i],opt_c_loops,opt_d_loops,NULL,NULL);
Packit 679830
                if (r == EXIT_FILE)     /* ignore file errors */
Packit 679830
                    r = EXIT_OK;
Packit 679830
            }
Packit 679830
            if (opt_read_from_stdin)
Packit 679830
            {
Packit 679830
                char buf[512], *p;
Packit 679830
Packit 679830
                while (r == EXIT_OK && fgets(buf,sizeof(buf)-1,stdin) != NULL)
Packit 679830
                {
Packit 679830
                    buf[sizeof(buf)-1] = 0;
Packit 679830
                    p = buf + strlen(buf);
Packit 679830
                    while (p > buf && is_space(p[-1]))
Packit 679830
                            *--p = 0;
Packit 679830
                    p = buf;
Packit 679830
                    while (*p && is_space(*p))
Packit 679830
                        p++;
Packit 679830
                    if (*p)
Packit 679830
                        r = do_file(method,p,opt_c_loops,opt_d_loops,NULL,NULL);
Packit 679830
                    if (r == EXIT_FILE)     /* ignore file errors */
Packit 679830
                        r = EXIT_OK;
Packit 679830
                }
Packit 679830
                opt_read_from_stdin = 0;
Packit 679830
            }
Packit 679830
        }
Packit 679830
    }
Packit 679830
    t_total = time(NULL) - t_total;
Packit 679830
Packit 679830
    if (opt_totals)
Packit 679830
        print_totals();
Packit 679830
    if (opt_execution_time || (methods_n > 1 && opt_verbose >= 1))
Packit 679830
        printf("\n%s: execution time: %lu seconds\n", progname, (unsigned long) t_total);
Packit 679830
    if (r != EXIT_OK)
Packit 679830
        printf("\n%s: exit code: %d\n", progname, r);
Packit 679830
Packit 679830
    lzo_pclock_close(&pch;;
Packit 679830
    return r;
Packit 679830
}
Packit 679830
Packit 679830
Packit 679830
/* vim:set ts=4 sw=4 et: */