1e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project/* 2e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 3e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * All rights reserved. 4e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * 5e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * Redistribution and use in source and binary forms, with or without 6e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * modification, are permitted provided that the following conditions 7e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * are met: 8e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * * Redistributions of source code must retain the above copyright 9e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * notice, this list of conditions and the following disclaimer. 10e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * * Redistributions in binary form must reproduce the above copyright 11e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * notice, this list of conditions and the following disclaimer in 12e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * the documentation and/or other materials provided with the 13e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * distribution. 14e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * 15e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 16e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 17e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 18e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 19e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 20e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 21e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 22e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 23e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 24e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 25e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * SUCH DAMAGE. 27e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project */ 28e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project/* this small program is used to measure the performance of zlib's inflate 29e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * algorithm... 30e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project */ 31e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 32e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project/* most code lifted from the public-domain http://www.zlib.net/zpipe.c */ 33e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 34e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <zlib.h> 35e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <time.h> 36e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <stdio.h> 37e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <stdlib.h> 38e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <string.h> 39e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <errno.h> 40e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <unistd.h> 41e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <sys/time.h> 42e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 43e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define CHUNK 32768 44e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 45e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint def(FILE *source, FILE *dest, int level) 46e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{ 47e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int ret, flush; 48e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project unsigned have; 49e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project z_stream strm; 50e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project unsigned char in[CHUNK]; 51e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project unsigned char out[CHUNK]; 52e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 53e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project /* allocate deflate state */ 54e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project strm.zalloc = Z_NULL; 55e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project strm.zfree = Z_NULL; 56e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project strm.opaque = Z_NULL; 57e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project ret = deflateInit(&strm, level); 58e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (ret != Z_OK) 59e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project return ret; 60e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 61e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project /* compress until end of file */ 62e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project do { 63e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project strm.avail_in = fread(in, 1, CHUNK, source); 64e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (ferror(source)) { 65e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project (void)deflateEnd(&strm); 66e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project return Z_ERRNO; 67e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 68e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project flush = feof(source) ? Z_FINISH : Z_NO_FLUSH; 69e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project strm.next_in = in; 70e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 71e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project /* run deflate() on input until output buffer not full, finish 72e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project compression if all of source has been read in */ 73e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project do { 74e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project strm.avail_out = CHUNK; 75e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project strm.next_out = out; 76e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project ret = deflate(&strm, flush); /* no bad return value */ 77e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project have = CHUNK - strm.avail_out; 78e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (fwrite(out, 1, have, dest) != have || ferror(dest)) { 79e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project (void)deflateEnd(&strm); 80e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project return Z_ERRNO; 81e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 82e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } while (strm.avail_out == 0); 83e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 84e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project /* done when last data in file processed */ 85e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } while (flush != Z_FINISH); 86e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 87e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project /* clean up and return */ 88e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project (void)deflateEnd(&strm); 89e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project return Z_OK; 90e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 91e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 92e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 93e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint inf(FILE *source) 94e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{ 95e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int ret; 96e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project unsigned have; 97e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project z_stream strm; 98e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project static unsigned char in[CHUNK]; 99e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project static unsigned char out[CHUNK]; 100e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 101e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project /* allocate inflate state */ 102e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project strm.zalloc = Z_NULL; 103e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project strm.zfree = Z_NULL; 104e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project strm.opaque = Z_NULL; 105e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project strm.avail_in = 0; 106e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project strm.next_in = Z_NULL; 107e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project ret = inflateInit(&strm); 108e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (ret != Z_OK) 109e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project return ret; 110e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 111e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project /* decompress until deflate stream ends or end of file */ 112e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project do { 113e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project strm.avail_in = fread(in, 1, CHUNK, source); 114e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (ferror(source)) { 115e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project (void)inflateEnd(&strm); 116e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project return Z_ERRNO; 117e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 118e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (strm.avail_in == 0) 119e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project break; 120e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project strm.next_in = in; 121e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 122e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project /* run inflate() on input until output buffer not full */ 123e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project do { 124e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project strm.avail_out = CHUNK; 125e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project strm.next_out = out; 126e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project ret = inflate(&strm, Z_NO_FLUSH); 127e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project switch (ret) { 128e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project case Z_NEED_DICT: 129e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project ret = Z_DATA_ERROR; /* and fall through */ 130e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project case Z_DATA_ERROR: 131e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project case Z_MEM_ERROR: 132e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project (void)inflateEnd(&strm); 133e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project return ret; 134e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 135e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } while (strm.avail_out == 0); 136e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 137e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project /* done when inflate() says it's done */ 138e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } while (ret != Z_STREAM_END); 139e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 140e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project /* clean up and return */ 141e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project (void)inflateEnd(&strm); 142e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project return ret == Z_STREAM_END ? Z_OK : Z_DATA_ERROR; 143e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 144e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 145e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define DEFAULT_REPEAT 10 146e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define DEFAULT_LEVEL 9 147e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 148e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic void usage(void) 149e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{ 150e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fprintf(stderr, "usage: test_zlib [options] filename [filename2 ...]\n" ); 151e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fprintf(stderr, "options: -r NN repeat count (default %d)\n", DEFAULT_REPEAT ); 152e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fprintf(stderr, " -N set compression level (default %d)\n", DEFAULT_LEVEL ); 153e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project exit(1); 154e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 155e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 156e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic double 157e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectget_time_usec( void ) 158e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{ 159e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#ifdef HAVE_ANDROID_OS 160e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project struct timespec ts; 161e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 162e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if ( clock_gettime( CLOCK_MONOTONIC, &ts ) < 0 ) 163e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fprintf(stderr, "clock_gettime: %s\n", strerror(errno) ); 164e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 165e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project return ts.tv_sec*1e6 + ts.tv_nsec*1e-3; 166e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#else 167e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project struct timeval tv; 168e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (gettimeofday( &tv, NULL ) < 0) 169e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fprintf(stderr, "gettimeofday: %s\n", strerror(errno) ); 170e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 171e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project return tv.tv_sec*1000000. + tv.tv_usec*1.0; 172e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#endif 173e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 174e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 175e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint main( int argc, char** argv ) 176e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{ 177e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project FILE* f; 178e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project char tempfile[256]; 179e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int repeat_count = DEFAULT_REPEAT; 180e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int compression_level = DEFAULT_LEVEL; 181e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project double usec0, usec1; 182e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 183e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (argc < 2) 184e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project usage(); 185e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 186e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project for ( ; argc > 1 && argv[1][0] == '-'; argc--, argv++) { 187e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project const char* arg = &argv[1][1]; 188e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project switch (arg[0]) { 189e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project case 'r': 190e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (arg[1] == 0) { 191e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (argc < 3) 192e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project usage(); 193e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project arg = argv[2]; 194e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project argc--; 195e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project argv++; 196e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } else 197e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project arg += 1; 198e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 199e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project repeat_count = strtol(arg, NULL, 10); 200e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 201e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (repeat_count <= 0) 202e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project repeat_count = 1; 203e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project break; 204e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 205e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project case '0': case '1': case '2': case '3': case '4': 206e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project case '5': case '6': case '7': case '8': case '9': 207e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project compression_level = arg[0] - '0'; 208e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project break; 209e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 210e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project default: 211e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project usage(); 212e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 213e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 214e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 215e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project sprintf(tempfile, "/tmp/ztest.%d", getpid() ); 216e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 217e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project for ( ; argc > 1; argc--, argv++ ) 218e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project { 219e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project /* first, compress the file into a temporary storage */ 220e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project FILE* f = fopen(argv[1], "rb"); 221e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project FILE* out = NULL; 222e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project long fsize; 223e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int ret, rr; 224e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 225e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (f == NULL) { 226e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fprintf(stderr, "could not open '%s': %s\n", argv[1], strerror(errno) ); 227e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project continue; 228e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 229e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 230e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf( "testing %s\n", argv[1] ); 231e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fseek( f, 0, SEEK_END ); 232e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fsize = ftell(f); 233e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fseek( f, 0, SEEK_SET ); 234e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 235e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project out = fopen( tempfile, "wb" ); 236e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (out == NULL) { 237e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fprintf(stderr, "could not create '%s': %s\n", tempfile, strerror(errno)); 238e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fclose(f); 239e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project continue; 240e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 241e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 242e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project usec0 = get_time_usec(); 243e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 244e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project ret = def( f, out, compression_level ); 245e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 246e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project usec1 = get_time_usec() - usec0; 247e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf( "compression took: %10.3f ms (%.2f KB/s)\n", usec1/1e3, fsize*(1e6/1024)/usec1 ); 248e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 249e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fclose( out ); 250e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fclose(f); 251e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 252e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project usec0 = get_time_usec(); 253e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project f = fopen( tempfile, "rb" ); 254e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 255e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project for ( rr = repeat_count; rr > 0; rr -- ) 256e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project { 257e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fseek( f, 0, SEEK_SET ); 258e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project inf(f); 259e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 260e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fclose( f ); 261e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project usec1 = get_time_usec() - usec0; 262e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf( "decompression took: %10.3f ms (%.2f KB/s, %d passes)\n", usec1/1e3, fsize*(1e6/1024)*repeat_count/usec1, repeat_count ); 263e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 264e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 265e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project unlink(tempfile); 266e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project return 0; 267e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 268