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