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