1cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
2cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*-----------------------------------------------------------*/
3cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*--- A block-sorting, lossless compressor        bzip2.c ---*/
4cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*-----------------------------------------------------------*/
5cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
6cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/* ------------------------------------------------------------------
7cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   This file is part of bzip2/libbzip2, a program and library for
8cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   lossless, block-sorting data compression.
9cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
10172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich   bzip2/libbzip2 version 1.0.6 of 6 September 2010
11172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich   Copyright (C) 1996-2010 Julian Seward <jseward@bzip.org>
12cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
13cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   Please read the WARNING, DISCLAIMER and PATENTS sections in the
14cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   README file.
15cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
16cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   This program is released under the terms of the license contained
17cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   in the file LICENSE.
18cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   ------------------------------------------------------------------ */
19cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
20cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
21cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/* Place a 1 beside your platform, and 0 elsewhere.
22cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   Generic 32-bit Unix.
23cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   Also works on 64-bit Unix boxes.
24cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   This is the default.
25cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project*/
26cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#define BZ_UNIX      1
27cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
28cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*--
29cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project  Win32, as seen by Jacob Navia's excellent
30cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project  port of (Chris Fraser & David Hanson)'s excellent
31cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project  lcc compiler.  Or with MS Visual C.
32cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project  This is selected automatically if compiled by a compiler which
33cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project  defines _WIN32, not including the Cygwin GCC.
34cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project--*/
35cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#define BZ_LCCWIN32  0
36cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
37cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#if defined(_WIN32) && !defined(__CYGWIN__)
38cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#undef  BZ_LCCWIN32
39cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#define BZ_LCCWIN32 1
40cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#undef  BZ_UNIX
41cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#define BZ_UNIX 0
42cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#endif
43cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
44cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
45cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*---------------------------------------------*/
46cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*--
47cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project  Some stuff for all platforms.
48cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project--*/
49cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
50cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#include <stdio.h>
51cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#include <stdlib.h>
52cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#include <string.h>
53cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#include <signal.h>
54cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#include <math.h>
55cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#include <errno.h>
56cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#include <ctype.h>
57cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#include "bzlib.h"
58cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
59cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#define ERROR_IF_EOF(i)       { if ((i) == EOF)  ioError(); }
60cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#define ERROR_IF_NOT_ZERO(i)  { if ((i) != 0)    ioError(); }
61cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#define ERROR_IF_MINUS_ONE(i) { if ((i) == (-1)) ioError(); }
62cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
63cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
64cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*---------------------------------------------*/
65cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*--
66cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   Platform-specific stuff.
67cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project--*/
68cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
69cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#if BZ_UNIX
70cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#   include <fcntl.h>
71cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#   include <sys/types.h>
72cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#   include <utime.h>
73cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#   include <unistd.h>
74cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#   include <sys/stat.h>
75cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#   include <sys/times.h>
76cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
77cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#   define PATH_SEP    '/'
78cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#   define MY_LSTAT    lstat
79cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#   define MY_STAT     stat
80cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#   define MY_S_ISREG  S_ISREG
81cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#   define MY_S_ISDIR  S_ISDIR
82cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
83cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#   define APPEND_FILESPEC(root, name) \
84cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      root=snocString((root), (name))
85cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
86cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#   define APPEND_FLAG(root, name) \
87cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      root=snocString((root), (name))
88cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
89cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#   define SET_BINARY_MODE(fd) /**/
90cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
91cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#   ifdef __GNUC__
92cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#      define NORETURN __attribute__ ((noreturn))
93cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#   else
94cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#      define NORETURN /**/
95cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#   endif
96cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
97cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#   ifdef __DJGPP__
98cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#     include <io.h>
99cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#     include <fcntl.h>
100cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#     undef MY_LSTAT
101cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#     undef MY_STAT
102cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#     define MY_LSTAT stat
103cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#     define MY_STAT stat
104cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#     undef SET_BINARY_MODE
105cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#     define SET_BINARY_MODE(fd)                        \
106cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project        do {                                            \
107cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project           int retVal = setmode ( fileno ( fd ),        \
108cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                                  O_BINARY );           \
109cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project           ERROR_IF_MINUS_ONE ( retVal );               \
110cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project        } while ( 0 )
111cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#   endif
112cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
113cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#   ifdef __CYGWIN__
114cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#     include <io.h>
115cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#     include <fcntl.h>
116cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#     undef SET_BINARY_MODE
117cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#     define SET_BINARY_MODE(fd)                        \
118cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project        do {                                            \
119cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project           int retVal = setmode ( fileno ( fd ),        \
120cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                                  O_BINARY );           \
121cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project           ERROR_IF_MINUS_ONE ( retVal );               \
122cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project        } while ( 0 )
123cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#   endif
124cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#endif /* BZ_UNIX */
125cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
126cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
127cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
128cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#if BZ_LCCWIN32
129cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#   include <io.h>
130cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#   include <fcntl.h>
131cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#   include <sys\stat.h>
132cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
133cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#   define NORETURN       /**/
134cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#   define PATH_SEP       '\\'
135cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#   define MY_LSTAT       _stat
136cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#   define MY_STAT        _stat
137cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#   define MY_S_ISREG(x)  ((x) & _S_IFREG)
138cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#   define MY_S_ISDIR(x)  ((x) & _S_IFDIR)
139cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
140cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#   define APPEND_FLAG(root, name) \
141cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      root=snocString((root), (name))
142cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
143cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#   define APPEND_FILESPEC(root, name)                \
144cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      root = snocString ((root), (name))
145cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
146cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#   define SET_BINARY_MODE(fd)                        \
147cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      do {                                            \
148cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         int retVal = setmode ( fileno ( fd ),        \
149cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                                O_BINARY );           \
150cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         ERROR_IF_MINUS_ONE ( retVal );               \
151cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      } while ( 0 )
152cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
153cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#endif /* BZ_LCCWIN32 */
154cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
155cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
156cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*---------------------------------------------*/
157cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*--
158cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project  Some more stuff for all platforms :-)
159cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project--*/
160cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
161cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projecttypedef char            Char;
162cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projecttypedef unsigned char   Bool;
163cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projecttypedef unsigned char   UChar;
164cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projecttypedef int             Int32;
165cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projecttypedef unsigned int    UInt32;
166cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projecttypedef short           Int16;
167cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projecttypedef unsigned short  UInt16;
168cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
169cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#define True  ((Bool)1)
170cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#define False ((Bool)0)
171cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
172cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*--
173cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project  IntNative is your platform's `native' int size.
174cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project  Only here to avoid probs with 64-bit platforms.
175cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project--*/
176cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projecttypedef int IntNative;
177cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
178cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
179cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*---------------------------------------------------*/
180cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*--- Misc (file handling) data decls             ---*/
181cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*---------------------------------------------------*/
182cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
183cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source ProjectInt32   verbosity;
184cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source ProjectBool    keepInputFiles, smallMode, deleteOutputOnInterrupt;
185cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source ProjectBool    forceOverwrite, testFailsExist, unzFailsExist, noisy;
186cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source ProjectInt32   numFileNames, numFilesProcessed, blockSize100k;
187cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source ProjectInt32   exitValue;
188cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
189cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*-- source modes; F==file, I==stdin, O==stdout --*/
190cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#define SM_I2O           1
191cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#define SM_F2O           2
192cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#define SM_F2F           3
193cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
194cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*-- operation modes --*/
195cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#define OM_Z             1
196cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#define OM_UNZ           2
197cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#define OM_TEST          3
198cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
199cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source ProjectInt32   opMode;
200cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source ProjectInt32   srcMode;
201cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
202cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#define FILE_NAME_LEN 1034
203cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
204cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source ProjectInt32   longestFileName;
205cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source ProjectChar    inName [FILE_NAME_LEN];
206cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source ProjectChar    outName[FILE_NAME_LEN];
207cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source ProjectChar    tmpName[FILE_NAME_LEN];
208cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source ProjectChar    *progName;
209cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source ProjectChar    progNameReally[FILE_NAME_LEN];
210cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source ProjectFILE    *outputHandleJustInCase;
211cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source ProjectInt32   workFactor;
212cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
213cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectstatic void    panic                 ( const Char* ) NORETURN;
214cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectstatic void    ioError               ( void )        NORETURN;
215cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectstatic void    outOfMemory           ( void )        NORETURN;
216cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectstatic void    configError           ( void )        NORETURN;
217cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectstatic void    crcError              ( void )        NORETURN;
218cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectstatic void    cleanUpAndFail        ( Int32 )       NORETURN;
219cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectstatic void    compressedStreamEOF   ( void )        NORETURN;
220cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
221cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectstatic void    copyFileName ( Char*, Char* );
222cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectstatic void*   myMalloc     ( Int32 );
223cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectstatic void    applySavedFileAttrToOutputFile ( IntNative fd );
224cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
225cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
226cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
227cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*---------------------------------------------------*/
228cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*--- An implementation of 64-bit ints.  Sigh.    ---*/
229cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*--- Roll on widespread deployment of ANSI C9X ! ---*/
230cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*---------------------------------------------------*/
231cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
232cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projecttypedef
233cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   struct { UChar b[8]; }
234cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   UInt64;
235cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
236cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
237cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectstatic
238cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectvoid uInt64_from_UInt32s ( UInt64* n, UInt32 lo32, UInt32 hi32 )
239cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project{
240cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   n->b[7] = (UChar)((hi32 >> 24) & 0xFF);
241cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   n->b[6] = (UChar)((hi32 >> 16) & 0xFF);
242cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   n->b[5] = (UChar)((hi32 >> 8)  & 0xFF);
243cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   n->b[4] = (UChar) (hi32        & 0xFF);
244cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   n->b[3] = (UChar)((lo32 >> 24) & 0xFF);
245cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   n->b[2] = (UChar)((lo32 >> 16) & 0xFF);
246cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   n->b[1] = (UChar)((lo32 >> 8)  & 0xFF);
247cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   n->b[0] = (UChar) (lo32        & 0xFF);
248cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project}
249cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
250cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
251cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectstatic
252cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectdouble uInt64_to_double ( UInt64* n )
253cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project{
254cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   Int32  i;
255cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   double base = 1.0;
256cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   double sum  = 0.0;
257cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   for (i = 0; i < 8; i++) {
258cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      sum  += base * (double)(n->b[i]);
259cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      base *= 256.0;
260cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
261cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   return sum;
262cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project}
263cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
264cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
265cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectstatic
266cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source ProjectBool uInt64_isZero ( UInt64* n )
267cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project{
268cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   Int32 i;
269cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   for (i = 0; i < 8; i++)
270cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (n->b[i] != 0) return 0;
271cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   return 1;
272cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project}
273cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
274cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
275cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/* Divide *n by 10, and return the remainder.  */
276cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectstatic
277cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source ProjectInt32 uInt64_qrm10 ( UInt64* n )
278cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project{
279cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   UInt32 rem, tmp;
280cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   Int32  i;
281cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   rem = 0;
282cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   for (i = 7; i >= 0; i--) {
283cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      tmp = rem * 256 + n->b[i];
284cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      n->b[i] = tmp / 10;
285cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      rem = tmp % 10;
286cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
287cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   return rem;
288cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project}
289cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
290cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
291cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/* ... and the Whole Entire Point of all this UInt64 stuff is
292cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   so that we can supply the following function.
293cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project*/
294cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectstatic
295cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectvoid uInt64_toAscii ( char* outbuf, UInt64* n )
296cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project{
297cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   Int32  i, q;
298cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   UChar  buf[32];
299cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   Int32  nBuf   = 0;
300cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   UInt64 n_copy = *n;
301cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   do {
302cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      q = uInt64_qrm10 ( &n_copy );
303cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      buf[nBuf] = q + '0';
304cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      nBuf++;
305cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   } while (!uInt64_isZero(&n_copy));
306cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   outbuf[nBuf] = 0;
307cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   for (i = 0; i < nBuf; i++)
308cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      outbuf[i] = buf[nBuf-i-1];
309cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project}
310cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
311cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
312cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*---------------------------------------------------*/
313cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*--- Processing of complete files and streams    ---*/
314cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*---------------------------------------------------*/
315cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
316cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*---------------------------------------------*/
317cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectstatic
318cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source ProjectBool myfeof ( FILE* f )
319cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project{
320cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   Int32 c = fgetc ( f );
321cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (c == EOF) return True;
322cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   ungetc ( c, f );
323cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   return False;
324cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project}
325cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
326cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
327cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*---------------------------------------------*/
328cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectstatic
329cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectvoid compressStream ( FILE *stream, FILE *zStream )
330cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project{
331cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   BZFILE* bzf = NULL;
332cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   UChar   ibuf[5000];
333cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   Int32   nIbuf;
334cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   UInt32  nbytes_in_lo32, nbytes_in_hi32;
335cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   UInt32  nbytes_out_lo32, nbytes_out_hi32;
336cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   Int32   bzerr, bzerr_dummy, ret;
337cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
338cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   SET_BINARY_MODE(stream);
339cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   SET_BINARY_MODE(zStream);
340cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
341cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (ferror(stream)) goto errhandler_io;
342cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (ferror(zStream)) goto errhandler_io;
343cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
344cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   bzf = BZ2_bzWriteOpen ( &bzerr, zStream,
345cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                           blockSize100k, verbosity, workFactor );
346cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (bzerr != BZ_OK) goto errhandler;
347cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
348cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (verbosity >= 2) fprintf ( stderr, "\n" );
349cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
350cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   while (True) {
351cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
352cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (myfeof(stream)) break;
353cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      nIbuf = fread ( ibuf, sizeof(UChar), 5000, stream );
354cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (ferror(stream)) goto errhandler_io;
355cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (nIbuf > 0) BZ2_bzWrite ( &bzerr, bzf, (void*)ibuf, nIbuf );
356cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (bzerr != BZ_OK) goto errhandler;
357cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
358cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
359cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
360cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   BZ2_bzWriteClose64 ( &bzerr, bzf, 0,
361cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                        &nbytes_in_lo32, &nbytes_in_hi32,
362cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                        &nbytes_out_lo32, &nbytes_out_hi32 );
363cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (bzerr != BZ_OK) goto errhandler;
364cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
365cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (ferror(zStream)) goto errhandler_io;
366cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   ret = fflush ( zStream );
367cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (ret == EOF) goto errhandler_io;
368cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (zStream != stdout) {
369cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      Int32 fd = fileno ( zStream );
370cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (fd < 0) goto errhandler_io;
371cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      applySavedFileAttrToOutputFile ( fd );
372cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      ret = fclose ( zStream );
373cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      outputHandleJustInCase = NULL;
374cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (ret == EOF) goto errhandler_io;
375cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
376cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   outputHandleJustInCase = NULL;
377cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (ferror(stream)) goto errhandler_io;
378cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   ret = fclose ( stream );
379cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (ret == EOF) goto errhandler_io;
380cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
381cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (verbosity >= 1) {
382cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (nbytes_in_lo32 == 0 && nbytes_in_hi32 == 0) {
383cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project	 fprintf ( stderr, " no data compressed.\n");
384cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      } else {
385cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project	 Char   buf_nin[32], buf_nout[32];
386cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project	 UInt64 nbytes_in,   nbytes_out;
387cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project	 double nbytes_in_d, nbytes_out_d;
388cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project	 uInt64_from_UInt32s ( &nbytes_in,
389cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project			       nbytes_in_lo32, nbytes_in_hi32 );
390cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project	 uInt64_from_UInt32s ( &nbytes_out,
391cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project			       nbytes_out_lo32, nbytes_out_hi32 );
392cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project	 nbytes_in_d  = uInt64_to_double ( &nbytes_in );
393cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project	 nbytes_out_d = uInt64_to_double ( &nbytes_out );
394cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project	 uInt64_toAscii ( buf_nin, &nbytes_in );
395cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project	 uInt64_toAscii ( buf_nout, &nbytes_out );
396cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project	 fprintf ( stderr, "%6.3f:1, %6.3f bits/byte, "
397cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project		   "%5.2f%% saved, %s in, %s out.\n",
398cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project		   nbytes_in_d / nbytes_out_d,
399cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project		   (8.0 * nbytes_out_d) / nbytes_in_d,
400cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project		   100.0 * (1.0 - nbytes_out_d / nbytes_in_d),
401cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project		   buf_nin,
402cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project		   buf_nout
403cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project		 );
404cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      }
405cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
406cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
407cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   return;
408cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
409cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   errhandler:
410cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   BZ2_bzWriteClose64 ( &bzerr_dummy, bzf, 1,
411cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                        &nbytes_in_lo32, &nbytes_in_hi32,
412cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                        &nbytes_out_lo32, &nbytes_out_hi32 );
413cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   switch (bzerr) {
414cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      case BZ_CONFIG_ERROR:
415cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         configError(); break;
416cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      case BZ_MEM_ERROR:
417cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         outOfMemory (); break;
418cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      case BZ_IO_ERROR:
419cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         errhandler_io:
420cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         ioError(); break;
421cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      default:
422cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         panic ( "compress:unexpected error" );
423cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
424cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
425cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   panic ( "compress:end" );
426cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   /*notreached*/
427cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project}
428cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
429cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
430cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
431cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*---------------------------------------------*/
432cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectstatic
433cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source ProjectBool uncompressStream ( FILE *zStream, FILE *stream )
434cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project{
435cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   BZFILE* bzf = NULL;
436cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   Int32   bzerr, bzerr_dummy, ret, nread, streamNo, i;
437cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   UChar   obuf[5000];
438cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   UChar   unused[BZ_MAX_UNUSED];
439cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   Int32   nUnused;
440cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   void*   unusedTmpV;
441cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   UChar*  unusedTmp;
442cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
443cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   nUnused = 0;
444cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   streamNo = 0;
445cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
446cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   SET_BINARY_MODE(stream);
447cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   SET_BINARY_MODE(zStream);
448cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
449cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (ferror(stream)) goto errhandler_io;
450cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (ferror(zStream)) goto errhandler_io;
451cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
452cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   while (True) {
453cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
454cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      bzf = BZ2_bzReadOpen (
455cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project               &bzerr, zStream, verbosity,
456cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project               (int)smallMode, unused, nUnused
457cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            );
458cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (bzf == NULL || bzerr != BZ_OK) goto errhandler;
459cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      streamNo++;
460cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
461cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      while (bzerr == BZ_OK) {
462cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         nread = BZ2_bzRead ( &bzerr, bzf, obuf, 5000 );
463cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         if (bzerr == BZ_DATA_ERROR_MAGIC) goto trycat;
464cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         if ((bzerr == BZ_OK || bzerr == BZ_STREAM_END) && nread > 0)
465cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            fwrite ( obuf, sizeof(UChar), nread, stream );
466cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         if (ferror(stream)) goto errhandler_io;
467cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      }
468cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (bzerr != BZ_STREAM_END) goto errhandler;
469cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
470cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      BZ2_bzReadGetUnused ( &bzerr, bzf, &unusedTmpV, &nUnused );
471cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (bzerr != BZ_OK) panic ( "decompress:bzReadGetUnused" );
472cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
473cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      unusedTmp = (UChar*)unusedTmpV;
474cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      for (i = 0; i < nUnused; i++) unused[i] = unusedTmp[i];
475cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
476cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      BZ2_bzReadClose ( &bzerr, bzf );
477cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (bzerr != BZ_OK) panic ( "decompress:bzReadGetUnused" );
478cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
479cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (nUnused == 0 && myfeof(zStream)) break;
480cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
481cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
482cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   closeok:
483cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (ferror(zStream)) goto errhandler_io;
484cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (stream != stdout) {
485cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      Int32 fd = fileno ( stream );
486cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (fd < 0) goto errhandler_io;
487cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      applySavedFileAttrToOutputFile ( fd );
488cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
489cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   ret = fclose ( zStream );
490cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (ret == EOF) goto errhandler_io;
491cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
492cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (ferror(stream)) goto errhandler_io;
493cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   ret = fflush ( stream );
494cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (ret != 0) goto errhandler_io;
495cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (stream != stdout) {
496cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      ret = fclose ( stream );
497cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      outputHandleJustInCase = NULL;
498cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (ret == EOF) goto errhandler_io;
499cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
500cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   outputHandleJustInCase = NULL;
501cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (verbosity >= 2) fprintf ( stderr, "\n    " );
502cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   return True;
503cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
504cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   trycat:
505cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (forceOverwrite) {
506cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      rewind(zStream);
507cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      while (True) {
508cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      	 if (myfeof(zStream)) break;
509cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      	 nread = fread ( obuf, sizeof(UChar), 5000, zStream );
510cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      	 if (ferror(zStream)) goto errhandler_io;
511cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      	 if (nread > 0) fwrite ( obuf, sizeof(UChar), nread, stream );
512cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      	 if (ferror(stream)) goto errhandler_io;
513cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      }
514cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      goto closeok;
515cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
516cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
517cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   errhandler:
518cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   BZ2_bzReadClose ( &bzerr_dummy, bzf );
519cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   switch (bzerr) {
520cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      case BZ_CONFIG_ERROR:
521cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         configError(); break;
522cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      case BZ_IO_ERROR:
523cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         errhandler_io:
524cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         ioError(); break;
525cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      case BZ_DATA_ERROR:
526cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         crcError();
527cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      case BZ_MEM_ERROR:
528cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         outOfMemory();
529cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      case BZ_UNEXPECTED_EOF:
530cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         compressedStreamEOF();
531cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      case BZ_DATA_ERROR_MAGIC:
532cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         if (zStream != stdin) fclose(zStream);
533cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         if (stream != stdout) fclose(stream);
534cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         if (streamNo == 1) {
535cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            return False;
536cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         } else {
537cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            if (noisy)
538cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            fprintf ( stderr,
539cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                      "\n%s: %s: trailing garbage after EOF ignored\n",
540cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                      progName, inName );
541cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            return True;
542cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         }
543cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      default:
544cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         panic ( "decompress:unexpected error" );
545cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
546cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
547cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   panic ( "decompress:end" );
548cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   return True; /*notreached*/
549cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project}
550cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
551cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
552cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*---------------------------------------------*/
553cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectstatic
554cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source ProjectBool testStream ( FILE *zStream )
555cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project{
556cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   BZFILE* bzf = NULL;
557cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   Int32   bzerr, bzerr_dummy, ret, nread, streamNo, i;
558cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   UChar   obuf[5000];
559cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   UChar   unused[BZ_MAX_UNUSED];
560cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   Int32   nUnused;
561cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   void*   unusedTmpV;
562cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   UChar*  unusedTmp;
563cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
564cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   nUnused = 0;
565cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   streamNo = 0;
566cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
567cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   SET_BINARY_MODE(zStream);
568cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (ferror(zStream)) goto errhandler_io;
569cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
570cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   while (True) {
571cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
572cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      bzf = BZ2_bzReadOpen (
573cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project               &bzerr, zStream, verbosity,
574cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project               (int)smallMode, unused, nUnused
575cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            );
576cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (bzf == NULL || bzerr != BZ_OK) goto errhandler;
577cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      streamNo++;
578cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
579cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      while (bzerr == BZ_OK) {
580cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         nread = BZ2_bzRead ( &bzerr, bzf, obuf, 5000 );
581cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         if (bzerr == BZ_DATA_ERROR_MAGIC) goto errhandler;
582cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      }
583cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (bzerr != BZ_STREAM_END) goto errhandler;
584cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
585cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      BZ2_bzReadGetUnused ( &bzerr, bzf, &unusedTmpV, &nUnused );
586cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (bzerr != BZ_OK) panic ( "test:bzReadGetUnused" );
587cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
588cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      unusedTmp = (UChar*)unusedTmpV;
589cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      for (i = 0; i < nUnused; i++) unused[i] = unusedTmp[i];
590cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
591cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      BZ2_bzReadClose ( &bzerr, bzf );
592cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (bzerr != BZ_OK) panic ( "test:bzReadGetUnused" );
593cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (nUnused == 0 && myfeof(zStream)) break;
594cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
595cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
596cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
597cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (ferror(zStream)) goto errhandler_io;
598cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   ret = fclose ( zStream );
599cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (ret == EOF) goto errhandler_io;
600cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
601cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (verbosity >= 2) fprintf ( stderr, "\n    " );
602cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   return True;
603cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
604cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   errhandler:
605cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   BZ2_bzReadClose ( &bzerr_dummy, bzf );
606cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (verbosity == 0)
607cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      fprintf ( stderr, "%s: %s: ", progName, inName );
608cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   switch (bzerr) {
609cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      case BZ_CONFIG_ERROR:
610cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         configError(); break;
611cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      case BZ_IO_ERROR:
612cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         errhandler_io:
613cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         ioError(); break;
614cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      case BZ_DATA_ERROR:
615cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         fprintf ( stderr,
616cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                   "data integrity (CRC) error in data\n" );
617cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         return False;
618cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      case BZ_MEM_ERROR:
619cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         outOfMemory();
620cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      case BZ_UNEXPECTED_EOF:
621cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         fprintf ( stderr,
622cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                   "file ends unexpectedly\n" );
623cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         return False;
624cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      case BZ_DATA_ERROR_MAGIC:
625cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         if (zStream != stdin) fclose(zStream);
626cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         if (streamNo == 1) {
627cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project          fprintf ( stderr,
628cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                    "bad magic number (file not created by bzip2)\n" );
629cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            return False;
630cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         } else {
631cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            if (noisy)
632cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            fprintf ( stderr,
633cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                      "trailing garbage after EOF ignored\n" );
634cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            return True;
635cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         }
636cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      default:
637cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         panic ( "test:unexpected error" );
638cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
639cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
640cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   panic ( "test:end" );
641cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   return True; /*notreached*/
642cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project}
643cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
644cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
645cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*---------------------------------------------------*/
646cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*--- Error [non-] handling grunge                ---*/
647cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*---------------------------------------------------*/
648cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
649cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*---------------------------------------------*/
650cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectstatic
651cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectvoid setExit ( Int32 v )
652cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project{
653cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (v > exitValue) exitValue = v;
654cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project}
655cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
656cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
657cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*---------------------------------------------*/
658cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectstatic
659cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectvoid cadvise ( void )
660cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project{
661cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (noisy)
662cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   fprintf (
663cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      stderr,
664cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "\nIt is possible that the compressed file(s) have become corrupted.\n"
665cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project        "You can use the -tvv option to test integrity of such files.\n\n"
666cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project        "You can use the `bzip2recover' program to attempt to recover\n"
667cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project        "data from undamaged sections of corrupted files.\n\n"
668cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project    );
669cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project}
670cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
671cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
672cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*---------------------------------------------*/
673cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectstatic
674cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectvoid showFileNames ( void )
675cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project{
676cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (noisy)
677cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   fprintf (
678cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      stderr,
679cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "\tInput file = %s, output file = %s\n",
680cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      inName, outName
681cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   );
682cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project}
683cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
684cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
685cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*---------------------------------------------*/
686cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectstatic
687cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectvoid cleanUpAndFail ( Int32 ec )
688cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project{
689cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   IntNative      retVal;
690cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   struct MY_STAT statBuf;
691cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
692cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if ( srcMode == SM_F2F
693cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project        && opMode != OM_TEST
694cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project        && deleteOutputOnInterrupt ) {
695cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
696cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      /* Check whether input file still exists.  Delete output file
697cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         only if input exists to avoid loss of data.  Joerg Prante, 5
698cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         January 2002.  (JRS 06-Jan-2002: other changes in 1.0.2 mean
699cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         this is less likely to happen.  But to be ultra-paranoid, we
700cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         do the check anyway.)  */
701cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      retVal = MY_STAT ( inName, &statBuf );
702cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (retVal == 0) {
703cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         if (noisy)
704cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            fprintf ( stderr,
705cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                      "%s: Deleting output file %s, if it exists.\n",
706cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                      progName, outName );
707cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         if (outputHandleJustInCase != NULL)
708cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            fclose ( outputHandleJustInCase );
709cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         retVal = remove ( outName );
710cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         if (retVal != 0)
711cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            fprintf ( stderr,
712cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                      "%s: WARNING: deletion of output file "
713cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                      "(apparently) failed.\n",
714cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                      progName );
715cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      } else {
716cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         fprintf ( stderr,
717cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                   "%s: WARNING: deletion of output file suppressed\n",
718cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                    progName );
719cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         fprintf ( stderr,
720cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                   "%s:    since input file no longer exists.  Output file\n",
721cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                   progName );
722cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         fprintf ( stderr,
723cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                   "%s:    `%s' may be incomplete.\n",
724cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                   progName, outName );
725cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         fprintf ( stderr,
726cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                   "%s:    I suggest doing an integrity test (bzip2 -tv)"
727cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                   " of it.\n",
728cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                   progName );
729cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      }
730cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
731cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
732cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (noisy && numFileNames > 0 && numFilesProcessed < numFileNames) {
733cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      fprintf ( stderr,
734cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                "%s: WARNING: some files have not been processed:\n"
735cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                "%s:    %d specified on command line, %d not processed yet.\n\n",
736cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                progName, progName,
737cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                numFileNames, numFileNames - numFilesProcessed );
738cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
739cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   setExit(ec);
740cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   exit(exitValue);
741cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project}
742cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
743cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
744cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*---------------------------------------------*/
745cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectstatic
746cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectvoid panic ( const Char* s )
747cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project{
748cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   fprintf ( stderr,
749cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project             "\n%s: PANIC -- internal consistency error:\n"
750cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project             "\t%s\n"
751cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project             "\tThis is a BUG.  Please report it to me at:\n"
752cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project             "\tjseward@bzip.org\n",
753cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project             progName, s );
754cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   showFileNames();
755cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   cleanUpAndFail( 3 );
756cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project}
757cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
758cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
759cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*---------------------------------------------*/
760cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectstatic
761cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectvoid crcError ( void )
762cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project{
763cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   fprintf ( stderr,
764cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project             "\n%s: Data integrity error when decompressing.\n",
765cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project             progName );
766cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   showFileNames();
767cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   cadvise();
768cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   cleanUpAndFail( 2 );
769cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project}
770cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
771cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
772cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*---------------------------------------------*/
773cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectstatic
774cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectvoid compressedStreamEOF ( void )
775cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project{
776cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project  if (noisy) {
777cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project    fprintf ( stderr,
778cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project	      "\n%s: Compressed file ends unexpectedly;\n\t"
779cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project	      "perhaps it is corrupted?  *Possible* reason follows.\n",
780cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project	      progName );
781cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project    perror ( progName );
782cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project    showFileNames();
783cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project    cadvise();
784cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project  }
785cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project  cleanUpAndFail( 2 );
786cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project}
787cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
788cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
789cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*---------------------------------------------*/
790cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectstatic
791cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectvoid ioError ( void )
792cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project{
793cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   fprintf ( stderr,
794cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project             "\n%s: I/O or other error, bailing out.  "
795cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project             "Possible reason follows.\n",
796cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project             progName );
797cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   perror ( progName );
798cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   showFileNames();
799cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   cleanUpAndFail( 1 );
800cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project}
801cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
802cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
803cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*---------------------------------------------*/
804cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectstatic
805cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectvoid mySignalCatcher ( IntNative n )
806cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project{
807cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   fprintf ( stderr,
808cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project             "\n%s: Control-C or similar caught, quitting.\n",
809cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project             progName );
810cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   cleanUpAndFail(1);
811cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project}
812cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
813cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
814cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*---------------------------------------------*/
815cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectstatic
816cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectvoid mySIGSEGVorSIGBUScatcher ( IntNative n )
817cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project{
818cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (opMode == OM_Z)
819cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      fprintf (
820cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      stderr,
821cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "\n%s: Caught a SIGSEGV or SIGBUS whilst compressing.\n"
822cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "\n"
823cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "   Possible causes are (most likely first):\n"
824cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "   (1) This computer has unreliable memory or cache hardware\n"
825cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "       (a surprisingly common problem; try a different machine.)\n"
826cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "   (2) A bug in the compiler used to create this executable\n"
827cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "       (unlikely, if you didn't compile bzip2 yourself.)\n"
828cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "   (3) A real bug in bzip2 -- I hope this should never be the case.\n"
829cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "   The user's manual, Section 4.3, has more info on (1) and (2).\n"
830cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "   \n"
831cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "   If you suspect this is a bug in bzip2, or are unsure about (1)\n"
832cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "   or (2), feel free to report it to me at: jseward@bzip.org.\n"
833cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "   Section 4.3 of the user's manual describes the info a useful\n"
834cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "   bug report should have.  If the manual is available on your\n"
835cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "   system, please try and read it before mailing me.  If you don't\n"
836cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "   have the manual or can't be bothered to read it, mail me anyway.\n"
837cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "\n",
838cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      progName );
839cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      else
840cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      fprintf (
841cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      stderr,
842cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "\n%s: Caught a SIGSEGV or SIGBUS whilst decompressing.\n"
843cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "\n"
844cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "   Possible causes are (most likely first):\n"
845cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "   (1) The compressed data is corrupted, and bzip2's usual checks\n"
846cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "       failed to detect this.  Try bzip2 -tvv my_file.bz2.\n"
847cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "   (2) This computer has unreliable memory or cache hardware\n"
848cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "       (a surprisingly common problem; try a different machine.)\n"
849cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "   (3) A bug in the compiler used to create this executable\n"
850cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "       (unlikely, if you didn't compile bzip2 yourself.)\n"
851cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "   (4) A real bug in bzip2 -- I hope this should never be the case.\n"
852cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "   The user's manual, Section 4.3, has more info on (2) and (3).\n"
853cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "   \n"
854cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "   If you suspect this is a bug in bzip2, or are unsure about (2)\n"
855cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "   or (3), feel free to report it to me at: jseward@bzip.org.\n"
856cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "   Section 4.3 of the user's manual describes the info a useful\n"
857cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "   bug report should have.  If the manual is available on your\n"
858cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "   system, please try and read it before mailing me.  If you don't\n"
859cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "   have the manual or can't be bothered to read it, mail me anyway.\n"
860cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "\n",
861cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      progName );
862cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
863cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   showFileNames();
864cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (opMode == OM_Z)
865cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      cleanUpAndFail( 3 ); else
866cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      { cadvise(); cleanUpAndFail( 2 ); }
867cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project}
868cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
869cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
870cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*---------------------------------------------*/
871cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectstatic
872cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectvoid outOfMemory ( void )
873cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project{
874cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   fprintf ( stderr,
875cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project             "\n%s: couldn't allocate enough memory\n",
876cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project             progName );
877cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   showFileNames();
878cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   cleanUpAndFail(1);
879cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project}
880cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
881cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
882cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*---------------------------------------------*/
883cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectstatic
884cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectvoid configError ( void )
885cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project{
886cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   fprintf ( stderr,
887cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project             "bzip2: I'm not configured correctly for this platform!\n"
888cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project             "\tI require Int32, Int16 and Char to have sizes\n"
889cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project             "\tof 4, 2 and 1 bytes to run properly, and they don't.\n"
890cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project             "\tProbably you can fix this by defining them correctly,\n"
891cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project             "\tand recompiling.  Bye!\n" );
892cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   setExit(3);
893cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   exit(exitValue);
894cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project}
895cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
896cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
897cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*---------------------------------------------------*/
898cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*--- The main driver machinery                   ---*/
899cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*---------------------------------------------------*/
900cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
901cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/* All rather crufty.  The main problem is that input files
902cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   are stat()d multiple times before use.  This should be
903cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   cleaned up.
904cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project*/
905cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
906cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*---------------------------------------------*/
907cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectstatic
908cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectvoid pad ( Char *s )
909cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project{
910cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   Int32 i;
911cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if ( (Int32)strlen(s) >= longestFileName ) return;
912cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   for (i = 1; i <= longestFileName - (Int32)strlen(s); i++)
913cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      fprintf ( stderr, " " );
914cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project}
915cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
916cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
917cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*---------------------------------------------*/
918cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectstatic
919cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectvoid copyFileName ( Char* to, Char* from )
920cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project{
921cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if ( strlen(from) > FILE_NAME_LEN-10 )  {
922cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      fprintf (
923cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         stderr,
924cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         "bzip2: file name\n`%s'\n"
925cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         "is suspiciously (more than %d chars) long.\n"
926cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         "Try using a reasonable file name instead.  Sorry! :-)\n",
927cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         from, FILE_NAME_LEN-10
928cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      );
929cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      setExit(1);
930cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      exit(exitValue);
931cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
932cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
933cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project  strncpy(to,from,FILE_NAME_LEN-10);
934cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project  to[FILE_NAME_LEN-10]='\0';
935cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project}
936cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
937cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
938cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*---------------------------------------------*/
939cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectstatic
940cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source ProjectBool fileExists ( Char* name )
941cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project{
942cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   FILE *tmp   = fopen ( name, "rb" );
943cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   Bool exists = (tmp != NULL);
944cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (tmp != NULL) fclose ( tmp );
945cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   return exists;
946cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project}
947cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
948cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
949cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*---------------------------------------------*/
950cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/* Open an output file safely with O_EXCL and good permissions.
951cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   This avoids a race condition in versions < 1.0.2, in which
952cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   the file was first opened and then had its interim permissions
953cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   set safely.  We instead use open() to create the file with
954cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   the interim permissions required. (--- --- rw-).
955cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
956cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   For non-Unix platforms, if we are not worrying about
957cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   security issues, simple this simply behaves like fopen.
958cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project*/
959cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectstatic
960cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source ProjectFILE* fopen_output_safely ( Char* name, const char* mode )
961cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project{
962cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#  if BZ_UNIX
963cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   FILE*     fp;
964cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   IntNative fh;
965cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   fh = open(name, O_WRONLY|O_CREAT|O_EXCL, S_IWUSR|S_IRUSR);
966cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (fh == -1) return NULL;
967cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   fp = fdopen(fh, mode);
968cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (fp == NULL) close(fh);
969cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   return fp;
970cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#  else
971cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   return fopen(name, mode);
972cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#  endif
973cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project}
974cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
975cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
976cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*---------------------------------------------*/
977cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*--
978cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project  if in doubt, return True
979cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project--*/
980cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectstatic
981cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source ProjectBool notAStandardFile ( Char* name )
982cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project{
983cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   IntNative      i;
984cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   struct MY_STAT statBuf;
985cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
986cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   i = MY_LSTAT ( name, &statBuf );
987cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (i != 0) return True;
988cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (MY_S_ISREG(statBuf.st_mode)) return False;
989cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   return True;
990cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project}
991cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
992cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
993cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*---------------------------------------------*/
994cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*--
995cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project  rac 11/21/98 see if file has hard links to it
996cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project--*/
997cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectstatic
998cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source ProjectInt32 countHardLinks ( Char* name )
999cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project{
1000cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   IntNative      i;
1001cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   struct MY_STAT statBuf;
1002cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1003cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   i = MY_LSTAT ( name, &statBuf );
1004cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (i != 0) return 0;
1005cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   return (statBuf.st_nlink - 1);
1006cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project}
1007cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1008cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1009cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*---------------------------------------------*/
1010cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/* Copy modification date, access date, permissions and owner from the
1011cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   source to destination file.  We have to copy this meta-info off
1012cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   into fileMetaInfo before starting to compress / decompress it,
1013cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   because doing it afterwards means we get the wrong access time.
1014cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1015cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   To complicate matters, in compress() and decompress() below, the
1016cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   sequence of tests preceding the call to saveInputFileMetaInfo()
1017cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   involves calling fileExists(), which in turn establishes its result
1018cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   by attempting to fopen() the file, and if successful, immediately
1019cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   fclose()ing it again.  So we have to assume that the fopen() call
1020cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   does not cause the access time field to be updated.
1021cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1022cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   Reading of the man page for stat() (man 2 stat) on RedHat 7.2 seems
1023cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   to imply that merely doing open() will not affect the access time.
1024cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   Therefore we merely need to hope that the C library only does
1025cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   open() as a result of fopen(), and not any kind of read()-ahead
1026cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   cleverness.
1027cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1028cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   It sounds pretty fragile to me.  Whether this carries across
1029cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   robustly to arbitrary Unix-like platforms (or even works robustly
1030cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   on this one, RedHat 7.2) is unknown to me.  Nevertheless ...
1031cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project*/
1032cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#if BZ_UNIX
1033cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectstatic
1034cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectstruct MY_STAT fileMetaInfo;
1035cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#endif
1036cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1037cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectstatic
1038cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectvoid saveInputFileMetaInfo ( Char *srcName )
1039cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project{
1040cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#  if BZ_UNIX
1041cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   IntNative retVal;
1042cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   /* Note use of stat here, not lstat. */
1043cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   retVal = MY_STAT( srcName, &fileMetaInfo );
1044cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   ERROR_IF_NOT_ZERO ( retVal );
1045cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#  endif
1046cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project}
1047cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1048cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1049cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectstatic
1050cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectvoid applySavedTimeInfoToOutputFile ( Char *dstName )
1051cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project{
1052cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#  if BZ_UNIX
1053cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   IntNative      retVal;
1054cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   struct utimbuf uTimBuf;
1055cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1056cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   uTimBuf.actime = fileMetaInfo.st_atime;
1057cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   uTimBuf.modtime = fileMetaInfo.st_mtime;
1058cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1059cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   retVal = utime ( dstName, &uTimBuf );
1060cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   ERROR_IF_NOT_ZERO ( retVal );
1061cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#  endif
1062cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project}
1063cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1064cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectstatic
1065cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectvoid applySavedFileAttrToOutputFile ( IntNative fd )
1066cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project{
1067cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#  if BZ_UNIX
1068cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   IntNative retVal;
1069cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1070cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   retVal = fchmod ( fd, fileMetaInfo.st_mode );
1071cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   ERROR_IF_NOT_ZERO ( retVal );
1072cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1073cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   (void) fchown ( fd, fileMetaInfo.st_uid, fileMetaInfo.st_gid );
1074cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   /* chown() will in many cases return with EPERM, which can
1075cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      be safely ignored.
1076cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   */
1077cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#  endif
1078cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project}
1079cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1080cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1081cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*---------------------------------------------*/
1082cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectstatic
1083cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source ProjectBool containsDubiousChars ( Char* name )
1084cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project{
1085cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#  if BZ_UNIX
1086cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   /* On unix, files can contain any characters and the file expansion
1087cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project    * is performed by the shell.
1088cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project    */
1089cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   return False;
1090cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#  else /* ! BZ_UNIX */
1091cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   /* On non-unix (Win* platforms), wildcard characters are not allowed in
1092cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project    * filenames.
1093cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project    */
1094cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   for (; *name != '\0'; name++)
1095cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (*name == '?' || *name == '*') return True;
1096cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   return False;
1097cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#  endif /* BZ_UNIX */
1098cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project}
1099cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1100cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1101cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*---------------------------------------------*/
1102cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#define BZ_N_SUFFIX_PAIRS 4
1103cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1104cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectconst Char* zSuffix[BZ_N_SUFFIX_PAIRS]
1105cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   = { ".bz2", ".bz", ".tbz2", ".tbz" };
1106cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectconst Char* unzSuffix[BZ_N_SUFFIX_PAIRS]
1107cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   = { "", "", ".tar", ".tar" };
1108cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1109cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectstatic
1110cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source ProjectBool hasSuffix ( Char* s, const Char* suffix )
1111cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project{
1112cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   Int32 ns = strlen(s);
1113cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   Int32 nx = strlen(suffix);
1114cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (ns < nx) return False;
1115cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (strcmp(s + ns - nx, suffix) == 0) return True;
1116cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   return False;
1117cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project}
1118cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1119cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectstatic
1120cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source ProjectBool mapSuffix ( Char* name,
1121cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                 const Char* oldSuffix,
1122cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                 const Char* newSuffix )
1123cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project{
1124cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (!hasSuffix(name,oldSuffix)) return False;
1125cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   name[strlen(name)-strlen(oldSuffix)] = 0;
1126cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   strcat ( name, newSuffix );
1127cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   return True;
1128cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project}
1129cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1130cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1131cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*---------------------------------------------*/
1132cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectstatic
1133cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectvoid compress ( Char *name )
1134cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project{
1135cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   FILE  *inStr;
1136cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   FILE  *outStr;
1137cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   Int32 n, i;
1138cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   struct MY_STAT statBuf;
1139cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1140cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   deleteOutputOnInterrupt = False;
1141cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1142cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (name == NULL && srcMode != SM_I2O)
1143cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      panic ( "compress: bad modes\n" );
1144cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1145cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   switch (srcMode) {
1146cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      case SM_I2O:
1147cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         copyFileName ( inName, (Char*)"(stdin)" );
1148cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         copyFileName ( outName, (Char*)"(stdout)" );
1149cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         break;
1150cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      case SM_F2F:
1151cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         copyFileName ( inName, name );
1152cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         copyFileName ( outName, name );
1153cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         strcat ( outName, ".bz2" );
1154cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         break;
1155cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      case SM_F2O:
1156cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         copyFileName ( inName, name );
1157cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         copyFileName ( outName, (Char*)"(stdout)" );
1158cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         break;
1159cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
1160cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1161cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if ( srcMode != SM_I2O && containsDubiousChars ( inName ) ) {
1162cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (noisy)
1163cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      fprintf ( stderr, "%s: There are no files matching `%s'.\n",
1164cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                progName, inName );
1165cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      setExit(1);
1166cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      return;
1167cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
1168cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if ( srcMode != SM_I2O && !fileExists ( inName ) ) {
1169cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      fprintf ( stderr, "%s: Can't open input file %s: %s.\n",
1170cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                progName, inName, strerror(errno) );
1171cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      setExit(1);
1172cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      return;
1173cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
1174cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   for (i = 0; i < BZ_N_SUFFIX_PAIRS; i++) {
1175cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (hasSuffix(inName, zSuffix[i])) {
1176cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         if (noisy)
1177cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         fprintf ( stderr,
1178cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                   "%s: Input file %s already has %s suffix.\n",
1179cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                   progName, inName, zSuffix[i] );
1180cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         setExit(1);
1181cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         return;
1182cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      }
1183cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
1184cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if ( srcMode == SM_F2F || srcMode == SM_F2O ) {
1185cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      MY_STAT(inName, &statBuf);
1186cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if ( MY_S_ISDIR(statBuf.st_mode) ) {
1187cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         fprintf( stderr,
1188cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                  "%s: Input file %s is a directory.\n",
1189cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                  progName,inName);
1190cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         setExit(1);
1191cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         return;
1192cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      }
1193cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
1194cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if ( srcMode == SM_F2F && !forceOverwrite && notAStandardFile ( inName )) {
1195cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (noisy)
1196cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      fprintf ( stderr, "%s: Input file %s is not a normal file.\n",
1197cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                progName, inName );
1198cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      setExit(1);
1199cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      return;
1200cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
1201cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if ( srcMode == SM_F2F && fileExists ( outName ) ) {
1202cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (forceOverwrite) {
1203cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project	 remove(outName);
1204cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      } else {
1205cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project	 fprintf ( stderr, "%s: Output file %s already exists.\n",
1206cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project		   progName, outName );
1207cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project	 setExit(1);
1208cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project	 return;
1209cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      }
1210cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
1211cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if ( srcMode == SM_F2F && !forceOverwrite &&
1212cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project        (n=countHardLinks ( inName )) > 0) {
1213cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      fprintf ( stderr, "%s: Input file %s has %d other link%s.\n",
1214cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                progName, inName, n, n > 1 ? "s" : "" );
1215cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      setExit(1);
1216cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      return;
1217cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
1218cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1219cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if ( srcMode == SM_F2F ) {
1220cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      /* Save the file's meta-info before we open it.  Doing it later
1221cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         means we mess up the access times. */
1222cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      saveInputFileMetaInfo ( inName );
1223cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
1224cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1225cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   switch ( srcMode ) {
1226cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1227cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      case SM_I2O:
1228cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         inStr = stdin;
1229cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         outStr = stdout;
1230cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         if ( isatty ( fileno ( stdout ) ) ) {
1231cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            fprintf ( stderr,
1232cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                      "%s: I won't write compressed data to a terminal.\n",
1233cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                      progName );
1234cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            fprintf ( stderr, "%s: For help, type: `%s --help'.\n",
1235cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                              progName, progName );
1236cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            setExit(1);
1237cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            return;
1238cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         };
1239cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         break;
1240cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1241cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      case SM_F2O:
1242cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         inStr = fopen ( inName, "rb" );
1243cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         outStr = stdout;
1244cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         if ( isatty ( fileno ( stdout ) ) ) {
1245cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            fprintf ( stderr,
1246cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                      "%s: I won't write compressed data to a terminal.\n",
1247cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                      progName );
1248cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            fprintf ( stderr, "%s: For help, type: `%s --help'.\n",
1249cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                              progName, progName );
1250cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            if ( inStr != NULL ) fclose ( inStr );
1251cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            setExit(1);
1252cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            return;
1253cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         };
1254cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         if ( inStr == NULL ) {
1255cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            fprintf ( stderr, "%s: Can't open input file %s: %s.\n",
1256cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                      progName, inName, strerror(errno) );
1257cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            setExit(1);
1258cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            return;
1259cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         };
1260cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         break;
1261cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1262cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      case SM_F2F:
1263cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         inStr = fopen ( inName, "rb" );
1264cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         outStr = fopen_output_safely ( outName, "wb" );
1265cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         if ( outStr == NULL) {
1266cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            fprintf ( stderr, "%s: Can't create output file %s: %s.\n",
1267cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                      progName, outName, strerror(errno) );
1268cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            if ( inStr != NULL ) fclose ( inStr );
1269cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            setExit(1);
1270cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            return;
1271cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         }
1272cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         if ( inStr == NULL ) {
1273cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            fprintf ( stderr, "%s: Can't open input file %s: %s.\n",
1274cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                      progName, inName, strerror(errno) );
1275cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            if ( outStr != NULL ) fclose ( outStr );
1276cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            setExit(1);
1277cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            return;
1278cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         };
1279cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         break;
1280cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1281cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      default:
1282cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         panic ( "compress: bad srcMode" );
1283cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         break;
1284cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
1285cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1286cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (verbosity >= 1) {
1287cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      fprintf ( stderr,  "  %s: ", inName );
1288cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      pad ( inName );
1289cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      fflush ( stderr );
1290cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
1291cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1292cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   /*--- Now the input and output handles are sane.  Do the Biz. ---*/
1293cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   outputHandleJustInCase = outStr;
1294cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   deleteOutputOnInterrupt = True;
1295cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   compressStream ( inStr, outStr );
1296cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   outputHandleJustInCase = NULL;
1297cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1298cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   /*--- If there was an I/O error, we won't get here. ---*/
1299cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if ( srcMode == SM_F2F ) {
1300cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      applySavedTimeInfoToOutputFile ( outName );
1301cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      deleteOutputOnInterrupt = False;
1302cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if ( !keepInputFiles ) {
1303cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         IntNative retVal = remove ( inName );
1304cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         ERROR_IF_NOT_ZERO ( retVal );
1305cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      }
1306cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
1307cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1308cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   deleteOutputOnInterrupt = False;
1309cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project}
1310cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1311cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1312cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*---------------------------------------------*/
1313cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectstatic
1314cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectvoid uncompress ( Char *name )
1315cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project{
1316cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   FILE  *inStr;
1317cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   FILE  *outStr;
1318cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   Int32 n, i;
1319cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   Bool  magicNumberOK;
1320cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   Bool  cantGuess;
1321cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   struct MY_STAT statBuf;
1322cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1323cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   deleteOutputOnInterrupt = False;
1324cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1325cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (name == NULL && srcMode != SM_I2O)
1326cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      panic ( "uncompress: bad modes\n" );
1327cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1328cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   cantGuess = False;
1329cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   switch (srcMode) {
1330cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      case SM_I2O:
1331cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         copyFileName ( inName, (Char*)"(stdin)" );
1332cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         copyFileName ( outName, (Char*)"(stdout)" );
1333cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         break;
1334cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      case SM_F2F:
1335cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         copyFileName ( inName, name );
1336cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         copyFileName ( outName, name );
1337cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         for (i = 0; i < BZ_N_SUFFIX_PAIRS; i++)
1338cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            if (mapSuffix(outName,zSuffix[i],unzSuffix[i]))
1339cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project               goto zzz;
1340cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         cantGuess = True;
1341cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         strcat ( outName, ".out" );
1342cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         break;
1343cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      case SM_F2O:
1344cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         copyFileName ( inName, name );
1345cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         copyFileName ( outName, (Char*)"(stdout)" );
1346cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         break;
1347cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
1348cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1349cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   zzz:
1350cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if ( srcMode != SM_I2O && containsDubiousChars ( inName ) ) {
1351cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (noisy)
1352cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      fprintf ( stderr, "%s: There are no files matching `%s'.\n",
1353cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                progName, inName );
1354cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      setExit(1);
1355cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      return;
1356cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
1357cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if ( srcMode != SM_I2O && !fileExists ( inName ) ) {
1358cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      fprintf ( stderr, "%s: Can't open input file %s: %s.\n",
1359cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                progName, inName, strerror(errno) );
1360cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      setExit(1);
1361cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      return;
1362cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
1363cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if ( srcMode == SM_F2F || srcMode == SM_F2O ) {
1364cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      MY_STAT(inName, &statBuf);
1365cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if ( MY_S_ISDIR(statBuf.st_mode) ) {
1366cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         fprintf( stderr,
1367cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                  "%s: Input file %s is a directory.\n",
1368cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                  progName,inName);
1369cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         setExit(1);
1370cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         return;
1371cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      }
1372cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
1373cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if ( srcMode == SM_F2F && !forceOverwrite && notAStandardFile ( inName )) {
1374cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (noisy)
1375cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      fprintf ( stderr, "%s: Input file %s is not a normal file.\n",
1376cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                progName, inName );
1377cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      setExit(1);
1378cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      return;
1379cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
1380cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if ( /* srcMode == SM_F2F implied && */ cantGuess ) {
1381cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (noisy)
1382cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      fprintf ( stderr,
1383cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                "%s: Can't guess original name for %s -- using %s\n",
1384cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                progName, inName, outName );
1385cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      /* just a warning, no return */
1386cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
1387cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if ( srcMode == SM_F2F && fileExists ( outName ) ) {
1388cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (forceOverwrite) {
1389cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project	remove(outName);
1390cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      } else {
1391cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project        fprintf ( stderr, "%s: Output file %s already exists.\n",
1392cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                  progName, outName );
1393cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project        setExit(1);
1394cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project        return;
1395cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      }
1396cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
1397cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if ( srcMode == SM_F2F && !forceOverwrite &&
1398cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project        (n=countHardLinks ( inName ) ) > 0) {
1399cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      fprintf ( stderr, "%s: Input file %s has %d other link%s.\n",
1400cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                progName, inName, n, n > 1 ? "s" : "" );
1401cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      setExit(1);
1402cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      return;
1403cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
1404cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1405cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if ( srcMode == SM_F2F ) {
1406cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      /* Save the file's meta-info before we open it.  Doing it later
1407cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         means we mess up the access times. */
1408cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      saveInputFileMetaInfo ( inName );
1409cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
1410cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1411cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   switch ( srcMode ) {
1412cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1413cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      case SM_I2O:
1414cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         inStr = stdin;
1415cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         outStr = stdout;
1416cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         if ( isatty ( fileno ( stdin ) ) ) {
1417cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            fprintf ( stderr,
1418cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                      "%s: I won't read compressed data from a terminal.\n",
1419cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                      progName );
1420cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            fprintf ( stderr, "%s: For help, type: `%s --help'.\n",
1421cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                              progName, progName );
1422cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            setExit(1);
1423cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            return;
1424cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         };
1425cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         break;
1426cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1427cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      case SM_F2O:
1428cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         inStr = fopen ( inName, "rb" );
1429cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         outStr = stdout;
1430cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         if ( inStr == NULL ) {
1431cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            fprintf ( stderr, "%s: Can't open input file %s:%s.\n",
1432cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                      progName, inName, strerror(errno) );
1433cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            if ( inStr != NULL ) fclose ( inStr );
1434cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            setExit(1);
1435cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            return;
1436cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         };
1437cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         break;
1438cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1439cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      case SM_F2F:
1440cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         inStr = fopen ( inName, "rb" );
1441cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         outStr = fopen_output_safely ( outName, "wb" );
1442cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         if ( outStr == NULL) {
1443cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            fprintf ( stderr, "%s: Can't create output file %s: %s.\n",
1444cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                      progName, outName, strerror(errno) );
1445cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            if ( inStr != NULL ) fclose ( inStr );
1446cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            setExit(1);
1447cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            return;
1448cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         }
1449cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         if ( inStr == NULL ) {
1450cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            fprintf ( stderr, "%s: Can't open input file %s: %s.\n",
1451cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                      progName, inName, strerror(errno) );
1452cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            if ( outStr != NULL ) fclose ( outStr );
1453cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            setExit(1);
1454cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            return;
1455cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         };
1456cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         break;
1457cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1458cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      default:
1459cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         panic ( "uncompress: bad srcMode" );
1460cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         break;
1461cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
1462cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1463cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (verbosity >= 1) {
1464cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      fprintf ( stderr, "  %s: ", inName );
1465cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      pad ( inName );
1466cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      fflush ( stderr );
1467cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
1468cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1469cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   /*--- Now the input and output handles are sane.  Do the Biz. ---*/
1470cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   outputHandleJustInCase = outStr;
1471cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   deleteOutputOnInterrupt = True;
1472cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   magicNumberOK = uncompressStream ( inStr, outStr );
1473cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   outputHandleJustInCase = NULL;
1474cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1475cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   /*--- If there was an I/O error, we won't get here. ---*/
1476cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if ( magicNumberOK ) {
1477cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if ( srcMode == SM_F2F ) {
1478cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         applySavedTimeInfoToOutputFile ( outName );
1479cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         deleteOutputOnInterrupt = False;
1480cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         if ( !keepInputFiles ) {
1481cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            IntNative retVal = remove ( inName );
1482cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            ERROR_IF_NOT_ZERO ( retVal );
1483cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         }
1484cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      }
1485cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   } else {
1486cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      unzFailsExist = True;
1487cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      deleteOutputOnInterrupt = False;
1488cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if ( srcMode == SM_F2F ) {
1489cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         IntNative retVal = remove ( outName );
1490cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         ERROR_IF_NOT_ZERO ( retVal );
1491cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      }
1492cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
1493cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   deleteOutputOnInterrupt = False;
1494cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1495cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if ( magicNumberOK ) {
1496cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (verbosity >= 1)
1497cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         fprintf ( stderr, "done\n" );
1498cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   } else {
1499cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      setExit(2);
1500cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (verbosity >= 1)
1501cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         fprintf ( stderr, "not a bzip2 file.\n" ); else
1502cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         fprintf ( stderr,
1503cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                   "%s: %s is not a bzip2 file.\n",
1504cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                   progName, inName );
1505cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
1506cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1507cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project}
1508cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1509cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1510cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*---------------------------------------------*/
1511cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectstatic
1512cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectvoid testf ( Char *name )
1513cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project{
1514cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   FILE *inStr;
1515cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   Bool allOK;
1516cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   struct MY_STAT statBuf;
1517cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1518cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   deleteOutputOnInterrupt = False;
1519cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1520cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (name == NULL && srcMode != SM_I2O)
1521cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      panic ( "testf: bad modes\n" );
1522cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1523cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   copyFileName ( outName, (Char*)"(none)" );
1524cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   switch (srcMode) {
1525cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      case SM_I2O: copyFileName ( inName, (Char*)"(stdin)" ); break;
1526cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      case SM_F2F: copyFileName ( inName, name ); break;
1527cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      case SM_F2O: copyFileName ( inName, name ); break;
1528cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
1529cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1530cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if ( srcMode != SM_I2O && containsDubiousChars ( inName ) ) {
1531cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (noisy)
1532cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      fprintf ( stderr, "%s: There are no files matching `%s'.\n",
1533cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                progName, inName );
1534cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      setExit(1);
1535cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      return;
1536cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
1537cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if ( srcMode != SM_I2O && !fileExists ( inName ) ) {
1538cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      fprintf ( stderr, "%s: Can't open input %s: %s.\n",
1539cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                progName, inName, strerror(errno) );
1540cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      setExit(1);
1541cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      return;
1542cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
1543cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if ( srcMode != SM_I2O ) {
1544cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      MY_STAT(inName, &statBuf);
1545cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if ( MY_S_ISDIR(statBuf.st_mode) ) {
1546cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         fprintf( stderr,
1547cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                  "%s: Input file %s is a directory.\n",
1548cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                  progName,inName);
1549cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         setExit(1);
1550cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         return;
1551cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      }
1552cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
1553cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1554cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   switch ( srcMode ) {
1555cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1556cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      case SM_I2O:
1557cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         if ( isatty ( fileno ( stdin ) ) ) {
1558cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            fprintf ( stderr,
1559cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                      "%s: I won't read compressed data from a terminal.\n",
1560cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                      progName );
1561cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            fprintf ( stderr, "%s: For help, type: `%s --help'.\n",
1562cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                              progName, progName );
1563cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            setExit(1);
1564cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            return;
1565cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         };
1566cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         inStr = stdin;
1567cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         break;
1568cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1569cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      case SM_F2O: case SM_F2F:
1570cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         inStr = fopen ( inName, "rb" );
1571cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         if ( inStr == NULL ) {
1572cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            fprintf ( stderr, "%s: Can't open input file %s:%s.\n",
1573cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                      progName, inName, strerror(errno) );
1574cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            setExit(1);
1575cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            return;
1576cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         };
1577cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         break;
1578cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1579cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      default:
1580cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         panic ( "testf: bad srcMode" );
1581cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         break;
1582cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
1583cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1584cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (verbosity >= 1) {
1585cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      fprintf ( stderr, "  %s: ", inName );
1586cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      pad ( inName );
1587cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      fflush ( stderr );
1588cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
1589cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1590cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   /*--- Now the input handle is sane.  Do the Biz. ---*/
1591cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   outputHandleJustInCase = NULL;
1592cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   allOK = testStream ( inStr );
1593cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1594cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (allOK && verbosity >= 1) fprintf ( stderr, "ok\n" );
1595cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (!allOK) testFailsExist = True;
1596cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project}
1597cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1598cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1599cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*---------------------------------------------*/
1600cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectstatic
1601cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectvoid license ( void )
1602cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project{
1603cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   fprintf ( stderr,
1604cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1605cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project    "bzip2, a block-sorting file compressor.  "
1606cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project    "Version %s.\n"
1607cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project    "   \n"
1608172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich    "   Copyright (C) 1996-2010 by Julian Seward.\n"
1609cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project    "   \n"
1610cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project    "   This program is free software; you can redistribute it and/or modify\n"
1611cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project    "   it under the terms set out in the LICENSE file, which is included\n"
1612172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich    "   in the bzip2-1.0.6 source distribution.\n"
1613cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project    "   \n"
1614cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project    "   This program is distributed in the hope that it will be useful,\n"
1615cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project    "   but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
1616cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project    "   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
1617cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project    "   LICENSE file for more details.\n"
1618cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project    "   \n",
1619cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project    BZ2_bzlibVersion()
1620cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   );
1621cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project}
1622cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1623cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1624cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*---------------------------------------------*/
1625cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectstatic
1626cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectvoid usage ( Char *fullProgName )
1627cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project{
1628cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   fprintf (
1629cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      stderr,
1630cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "bzip2, a block-sorting file compressor.  "
1631cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "Version %s.\n"
1632cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "\n   usage: %s [flags and input files in any order]\n"
1633cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "\n"
1634cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "   -h --help           print this message\n"
1635cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "   -d --decompress     force decompression\n"
1636cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "   -z --compress       force compression\n"
1637cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "   -k --keep           keep (don't delete) input files\n"
1638cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "   -f --force          overwrite existing output files\n"
1639cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "   -t --test           test compressed file integrity\n"
1640cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "   -c --stdout         output to standard out\n"
1641cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "   -q --quiet          suppress noncritical error messages\n"
1642cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "   -v --verbose        be verbose (a 2nd -v gives more)\n"
1643cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "   -L --license        display software version & license\n"
1644cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "   -V --version        display software version & license\n"
1645cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "   -s --small          use less memory (at most 2500k)\n"
1646cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "   -1 .. -9            set block size to 100k .. 900k\n"
1647cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "   --fast              alias for -1\n"
1648cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "   --best              alias for -9\n"
1649cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "\n"
1650cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "   If invoked as `bzip2', default action is to compress.\n"
1651cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "              as `bunzip2',  default action is to decompress.\n"
1652cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "              as `bzcat', default action is to decompress to stdout.\n"
1653cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "\n"
1654cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "   If no file names are given, bzip2 compresses or decompresses\n"
1655cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "   from standard input to standard output.  You can combine\n"
1656cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "   short flags, so `-v -4' means the same as -v4 or -4v, &c.\n"
1657cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#     if BZ_UNIX
1658cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "\n"
1659cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#     endif
1660cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      ,
1661cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1662cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      BZ2_bzlibVersion(),
1663cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      fullProgName
1664cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   );
1665cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project}
1666cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1667cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1668cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*---------------------------------------------*/
1669cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectstatic
1670cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectvoid redundant ( Char* flag )
1671cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project{
1672cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   fprintf (
1673cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      stderr,
1674cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      "%s: %s is redundant in versions 0.9.5 and above\n",
1675cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      progName, flag );
1676cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project}
1677cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1678cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1679cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*---------------------------------------------*/
1680cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*--
1681cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project  All the garbage from here to main() is purely to
1682cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project  implement a linked list of command-line arguments,
1683cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project  into which main() copies argv[1 .. argc-1].
1684cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1685cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project  The purpose of this exercise is to facilitate
1686cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project  the expansion of wildcard characters * and ? in
1687cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project  filenames for OSs which don't know how to do it
1688cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project  themselves, like MSDOS, Windows 95 and NT.
1689cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1690cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project  The actual Dirty Work is done by the platform-
1691cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project  specific macro APPEND_FILESPEC.
1692cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project--*/
1693cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1694cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projecttypedef
1695cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   struct zzzz {
1696cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      Char        *name;
1697cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      struct zzzz *link;
1698cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
1699cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   Cell;
1700cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1701cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1702cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*---------------------------------------------*/
1703cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectstatic
1704cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectvoid *myMalloc ( Int32 n )
1705cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project{
1706cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   void* p;
1707cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1708cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   p = malloc ( (size_t)n );
1709cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (p == NULL) outOfMemory ();
1710cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   return p;
1711cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project}
1712cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1713cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1714cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*---------------------------------------------*/
1715cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectstatic
1716cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source ProjectCell *mkCell ( void )
1717cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project{
1718cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   Cell *c;
1719cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1720cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   c = (Cell*) myMalloc ( sizeof ( Cell ) );
1721cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   c->name = NULL;
1722cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   c->link = NULL;
1723cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   return c;
1724cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project}
1725cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1726cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1727cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*---------------------------------------------*/
1728cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectstatic
1729cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source ProjectCell *snocString ( Cell *root, Char *name )
1730cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project{
1731cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (root == NULL) {
1732cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      Cell *tmp = mkCell();
1733cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      tmp->name = (Char*) myMalloc ( 5 + strlen(name) );
1734cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      strcpy ( tmp->name, name );
1735cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      return tmp;
1736cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   } else {
1737cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      Cell *tmp = root;
1738cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      while (tmp->link != NULL) tmp = tmp->link;
1739cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      tmp->link = snocString ( tmp->link, name );
1740cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      return root;
1741cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
1742cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project}
1743cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1744cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1745cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*---------------------------------------------*/
1746cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectstatic
1747cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectvoid addFlagsFromEnvVar ( Cell** argList, Char* varName )
1748cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project{
1749cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   Int32 i, j, k;
1750cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   Char *envbase, *p;
1751cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1752cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   envbase = getenv(varName);
1753cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (envbase != NULL) {
1754cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      p = envbase;
1755cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      i = 0;
1756cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      while (True) {
1757cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         if (p[i] == 0) break;
1758cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         p += i;
1759cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         i = 0;
1760cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         while (isspace((Int32)(p[0]))) p++;
1761cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         while (p[i] != 0 && !isspace((Int32)(p[i]))) i++;
1762cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         if (i > 0) {
1763cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            k = i; if (k > FILE_NAME_LEN-10) k = FILE_NAME_LEN-10;
1764cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            for (j = 0; j < k; j++) tmpName[j] = p[j];
1765cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            tmpName[k] = 0;
1766cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            APPEND_FLAG(*argList, tmpName);
1767cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         }
1768cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      }
1769cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
1770cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project}
1771cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1772cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1773cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*---------------------------------------------*/
1774cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#define ISFLAG(s) (strcmp(aa->name, (s))==0)
1775cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1776cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source ProjectIntNative main ( IntNative argc, Char *argv[] )
1777cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project{
1778cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   Int32  i, j;
1779cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   Char   *tmp;
1780cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   Cell   *argList;
1781cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   Cell   *aa;
1782cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   Bool   decode;
1783cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1784cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   /*-- Be really really really paranoid :-) --*/
1785cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (sizeof(Int32) != 4 || sizeof(UInt32) != 4  ||
1786cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project       sizeof(Int16) != 2 || sizeof(UInt16) != 2  ||
1787cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project       sizeof(Char)  != 1 || sizeof(UChar)  != 1)
1788cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      configError();
1789cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1790cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   /*-- Initialise --*/
1791cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   outputHandleJustInCase  = NULL;
1792cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   smallMode               = False;
1793cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   keepInputFiles          = False;
1794cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   forceOverwrite          = False;
1795cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   noisy                   = True;
1796cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   verbosity               = 0;
1797cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   blockSize100k           = 9;
1798cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   testFailsExist          = False;
1799cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   unzFailsExist           = False;
1800cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   numFileNames            = 0;
1801cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   numFilesProcessed       = 0;
1802cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   workFactor              = 30;
1803cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   deleteOutputOnInterrupt = False;
1804cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   exitValue               = 0;
1805cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   i = j = 0; /* avoid bogus warning from egcs-1.1.X */
1806cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1807cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   /*-- Set up signal handlers for mem access errors --*/
1808cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   signal (SIGSEGV, mySIGSEGVorSIGBUScatcher);
1809cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#  if BZ_UNIX
1810cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#  ifndef __DJGPP__
1811cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   signal (SIGBUS,  mySIGSEGVorSIGBUScatcher);
1812cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#  endif
1813cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#  endif
1814cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1815cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   copyFileName ( inName,  (Char*)"(none)" );
1816cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   copyFileName ( outName, (Char*)"(none)" );
1817cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1818cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   copyFileName ( progNameReally, argv[0] );
1819cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   progName = &progNameReally[0];
1820cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   for (tmp = &progNameReally[0]; *tmp != '\0'; tmp++)
1821cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (*tmp == PATH_SEP) progName = tmp + 1;
1822cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1823cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1824cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   /*-- Copy flags from env var BZIP2, and
1825cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project        expand filename wildcards in arg list.
1826cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   --*/
1827cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   argList = NULL;
1828cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   addFlagsFromEnvVar ( &argList,  (Char*)"BZIP2" );
1829cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   addFlagsFromEnvVar ( &argList,  (Char*)"BZIP" );
1830cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   for (i = 1; i <= argc-1; i++)
1831cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      APPEND_FILESPEC(argList, argv[i]);
1832cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1833cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1834cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   /*-- Find the length of the longest filename --*/
1835cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   longestFileName = 7;
1836cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   numFileNames    = 0;
1837cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   decode          = True;
1838cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   for (aa = argList; aa != NULL; aa = aa->link) {
1839cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (ISFLAG("--")) { decode = False; continue; }
1840cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (aa->name[0] == '-' && decode) continue;
1841cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      numFileNames++;
1842cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (longestFileName < (Int32)strlen(aa->name) )
1843cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         longestFileName = (Int32)strlen(aa->name);
1844cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
1845cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1846cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1847cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   /*-- Determine source modes; flag handling may change this too. --*/
1848cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (numFileNames == 0)
1849cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      srcMode = SM_I2O; else srcMode = SM_F2F;
1850cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1851cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1852cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   /*-- Determine what to do (compress/uncompress/test/cat). --*/
1853cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   /*-- Note that subsequent flag handling may change this. --*/
1854cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   opMode = OM_Z;
1855cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1856cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if ( (strstr ( progName, "unzip" ) != 0) ||
1857cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project        (strstr ( progName, "UNZIP" ) != 0) )
1858cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      opMode = OM_UNZ;
1859cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1860cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if ( (strstr ( progName, "z2cat" ) != 0) ||
1861cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project        (strstr ( progName, "Z2CAT" ) != 0) ||
1862cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project        (strstr ( progName, "zcat" ) != 0)  ||
1863cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project        (strstr ( progName, "ZCAT" ) != 0) )  {
1864cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      opMode = OM_UNZ;
1865cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      srcMode = (numFileNames == 0) ? SM_I2O : SM_F2O;
1866cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
1867cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1868cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1869cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   /*-- Look at the flags. --*/
1870cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   for (aa = argList; aa != NULL; aa = aa->link) {
1871cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (ISFLAG("--")) break;
1872cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (aa->name[0] == '-' && aa->name[1] != '-') {
1873cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         for (j = 1; aa->name[j] != '\0'; j++) {
1874cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            switch (aa->name[j]) {
1875cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project               case 'c': srcMode          = SM_F2O; break;
1876cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project               case 'd': opMode           = OM_UNZ; break;
1877cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project               case 'z': opMode           = OM_Z; break;
1878cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project               case 'f': forceOverwrite   = True; break;
1879cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project               case 't': opMode           = OM_TEST; break;
1880cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project               case 'k': keepInputFiles   = True; break;
1881cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project               case 's': smallMode        = True; break;
1882cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project               case 'q': noisy            = False; break;
1883cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project               case '1': blockSize100k    = 1; break;
1884cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project               case '2': blockSize100k    = 2; break;
1885cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project               case '3': blockSize100k    = 3; break;
1886cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project               case '4': blockSize100k    = 4; break;
1887cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project               case '5': blockSize100k    = 5; break;
1888cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project               case '6': blockSize100k    = 6; break;
1889cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project               case '7': blockSize100k    = 7; break;
1890cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project               case '8': blockSize100k    = 8; break;
1891cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project               case '9': blockSize100k    = 9; break;
1892cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project               case 'V':
1893cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project               case 'L': license();            break;
1894cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project               case 'v': verbosity++; break;
1895cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project               case 'h': usage ( progName );
1896cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                         exit ( 0 );
1897cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                         break;
1898cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project               default:  fprintf ( stderr, "%s: Bad flag `%s'\n",
1899cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                                   progName, aa->name );
1900cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                         usage ( progName );
1901cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                         exit ( 1 );
1902cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                         break;
1903cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            }
1904cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         }
1905cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      }
1906cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
1907cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1908cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   /*-- And again ... --*/
1909cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   for (aa = argList; aa != NULL; aa = aa->link) {
1910cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (ISFLAG("--")) break;
1911cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (ISFLAG("--stdout"))            srcMode          = SM_F2O;  else
1912cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (ISFLAG("--decompress"))        opMode           = OM_UNZ;  else
1913cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (ISFLAG("--compress"))          opMode           = OM_Z;    else
1914cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (ISFLAG("--force"))             forceOverwrite   = True;    else
1915cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (ISFLAG("--test"))              opMode           = OM_TEST; else
1916cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (ISFLAG("--keep"))              keepInputFiles   = True;    else
1917cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (ISFLAG("--small"))             smallMode        = True;    else
1918cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (ISFLAG("--quiet"))             noisy            = False;   else
1919cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (ISFLAG("--version"))           license();                  else
1920cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (ISFLAG("--license"))           license();                  else
1921cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (ISFLAG("--exponential"))       workFactor = 1;             else
1922cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (ISFLAG("--repetitive-best"))   redundant(aa->name);        else
1923cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (ISFLAG("--repetitive-fast"))   redundant(aa->name);        else
1924cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (ISFLAG("--fast"))              blockSize100k = 1;          else
1925cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (ISFLAG("--best"))              blockSize100k = 9;          else
1926cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (ISFLAG("--verbose"))           verbosity++;                else
1927cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (ISFLAG("--help"))              { usage ( progName ); exit ( 0 ); }
1928cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         else
1929cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         if (strncmp ( aa->name, "--", 2) == 0) {
1930cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            fprintf ( stderr, "%s: Bad flag `%s'\n", progName, aa->name );
1931cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            usage ( progName );
1932cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            exit ( 1 );
1933cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         }
1934cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
1935cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1936cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (verbosity > 4) verbosity = 4;
1937cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (opMode == OM_Z && smallMode && blockSize100k > 2)
1938cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      blockSize100k = 2;
1939cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1940cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (opMode == OM_TEST && srcMode == SM_F2O) {
1941cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      fprintf ( stderr, "%s: -c and -t cannot be used together.\n",
1942cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                progName );
1943cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      exit ( 1 );
1944cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
1945cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1946cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (srcMode == SM_F2O && numFileNames == 0)
1947cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      srcMode = SM_I2O;
1948cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1949cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (opMode != OM_Z) blockSize100k = 0;
1950cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1951cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (srcMode == SM_F2F) {
1952cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      signal (SIGINT,  mySignalCatcher);
1953cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      signal (SIGTERM, mySignalCatcher);
1954cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#     if BZ_UNIX
1955cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      signal (SIGHUP,  mySignalCatcher);
1956cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#     endif
1957cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
1958cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1959cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (opMode == OM_Z) {
1960cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project     if (srcMode == SM_I2O) {
1961cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project        compress ( NULL );
1962cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project     } else {
1963cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project        decode = True;
1964cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project        for (aa = argList; aa != NULL; aa = aa->link) {
1965cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project           if (ISFLAG("--")) { decode = False; continue; }
1966cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project           if (aa->name[0] == '-' && decode) continue;
1967cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project           numFilesProcessed++;
1968cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project           compress ( aa->name );
1969cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project        }
1970cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project     }
1971cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
1972cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   else
1973cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1974cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   if (opMode == OM_UNZ) {
1975cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      unzFailsExist = False;
1976cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (srcMode == SM_I2O) {
1977cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         uncompress ( NULL );
1978cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      } else {
1979cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         decode = True;
1980cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         for (aa = argList; aa != NULL; aa = aa->link) {
1981cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            if (ISFLAG("--")) { decode = False; continue; }
1982cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            if (aa->name[0] == '-' && decode) continue;
1983cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            numFilesProcessed++;
1984cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            uncompress ( aa->name );
1985cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         }
1986cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      }
1987cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (unzFailsExist) {
1988cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         setExit(2);
1989cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         exit(exitValue);
1990cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      }
1991cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
1992cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
1993cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   else {
1994cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      testFailsExist = False;
1995cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (srcMode == SM_I2O) {
1996cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         testf ( NULL );
1997cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      } else {
1998cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         decode = True;
1999cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         for (aa = argList; aa != NULL; aa = aa->link) {
2000cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project	    if (ISFLAG("--")) { decode = False; continue; }
2001cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            if (aa->name[0] == '-' && decode) continue;
2002cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            numFilesProcessed++;
2003cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project            testf ( aa->name );
2004cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project	 }
2005cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      }
2006cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (testFailsExist && noisy) {
2007cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         fprintf ( stderr,
2008cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project           "\n"
2009cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project           "You can use the `bzip2recover' program to attempt to recover\n"
2010cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project           "data from undamaged sections of corrupted files.\n\n"
2011cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         );
2012cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         setExit(2);
2013cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project         exit(exitValue);
2014cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      }
2015cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
2016cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
2017cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   /* Free the argument list memory to mollify leak detectors
2018cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      (eg) Purify, Checker.  Serves no other useful purpose.
2019cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   */
2020cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   aa = argList;
2021cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   while (aa != NULL) {
2022cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      Cell* aa2 = aa->link;
2023cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      if (aa->name != NULL) free(aa->name);
2024cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      free(aa);
2025cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      aa = aa2;
2026cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   }
2027cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
2028cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project   return exitValue;
2029cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project}
2030cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
2031cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
2032cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*-----------------------------------------------------------*/
2033cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*--- end                                         bzip2.c ---*/
2034cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project/*-----------------------------------------------------------*/
2035