From 4863f116079c7bb6b92d3ca7001ce520b2c574a3 Mon Sep 17 00:00:00 2001 From: Daniel Gibson Date: Tue, 18 Dec 2012 22:49:22 +0100 Subject: [PATCH 01/57] Fix bug in vidMode_t constructor it caused the default/static video mode list to contain only garbage --- neo/renderer/tr_local.h | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/neo/renderer/tr_local.h b/neo/renderer/tr_local.h index 1e742303..131bb85e 100644 --- a/neo/renderer/tr_local.h +++ b/neo/renderer/tr_local.h @@ -1037,12 +1037,8 @@ struct vidMode_t displayHz = 60; } - vidMode_t( int widht, int height, int displayHz ) - { - this->width = width; - this->height = height; - this->displayHz = displayHz; - } + vidMode_t( int width, int height, int displayHz ) : + width(width), height(height), displayHz(displayHz) {} // RB end bool operator==( const vidMode_t& a ) From b1dabf3efd920f6e776587e0f813b0d3d493def6 Mon Sep 17 00:00:00 2001 From: Daniel Gibson Date: Tue, 18 Dec 2012 22:50:59 +0100 Subject: [PATCH 02/57] Improve R_GetModeListForDisplay() * Fixed small bug when only one display mode was found by SDL2 * removed some redundant and dead code * improved warnings --- neo/sys/sdl/sdl_glimp.cpp | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/neo/sys/sdl/sdl_glimp.cpp b/neo/sys/sdl/sdl_glimp.cpp index 1c6635a2..5c9b267c 100644 --- a/neo/sys/sdl/sdl_glimp.cpp +++ b/neo/sys/sdl/sdl_glimp.cpp @@ -457,9 +457,9 @@ bool R_GetModeListForDisplay( const int requestedDisplayNum, idList& // requested invalid displaynum return false; } - + int numModes = SDL_GetNumDisplayModes( requestedDisplayNum ); - if( numModes > 1 ) + if( numModes > 0 ) { for( int i = 0; i < numModes; i++ ) { @@ -480,24 +480,21 @@ bool R_GetModeListForDisplay( const int requestedDisplayNum, idList& if( modeList.Num() < 1 ) { - common->Warning( "Couldn't get information for a single video mode, using default ones..!\n" ); + common->Warning( "Couldn't get a single video mode for display %i, using default ones..!\n", requestedDisplayNum ); FillStaticVidModes( modeList ); } // sort with lowest resolution first modeList.SortWithTemplate( idSort_VidMode() ); - - return true; } else { - common->Warning( "Can't get Video Info!\n" ); + common->Warning( "Can't get Video Info, using default modes...\n" ); if( numModes < 0 ) { common->Warning( "Reason was: %s\n", SDL_GetError() ); } FillStaticVidModes( modeList ); - return true; } return true; @@ -513,13 +510,11 @@ bool R_GetModeListForDisplay( const int requestedDisplayNum, idList& } // DG end - bool verbose = false; - const SDL_VideoInfo* videoInfo = SDL_GetVideoInfo(); if( videoInfo == NULL ) { // DG: yes, this can actually fail, e.g. if SDL_Init( SDL_INIT_VIDEO ) wasn't called - common->Warning( "Can't get Video Info!\n" ); + common->Warning( "Can't get Video Info, using default modes...\n" ); FillStaticVidModes( modeList ); return true; } @@ -528,7 +523,7 @@ bool R_GetModeListForDisplay( const int requestedDisplayNum, idList& if( !modes ) { - common->Warning( "Can't get list of available modes\n" ); + common->Warning( "Can't get list of available modes, using default ones...\n" ); FillStaticVidModes( modeList ); return true; } From f57d92a1ab8f1a6c5bd11f4eabf364e4f0e10237 Mon Sep 17 00:00:00 2001 From: Robert Beckebans Date: Wed, 19 Dec 2012 15:23:57 +0100 Subject: [PATCH 03/57] Renamed RBDoom3 to RBDoom3BFG --- neo/CMakeLists.txt | 18 +++++++++--------- neo/renderer/tr_local.h | 2 +- neo/sys/linux/linux_main.cpp | 7 ++----- neo/sys/sdl/sdl_glimp.cpp | 2 +- 4 files changed, 13 insertions(+), 16 deletions(-) diff --git a/neo/CMakeLists.txt b/neo/CMakeLists.txt index 935ce253..83f18124 100644 --- a/neo/CMakeLists.txt +++ b/neo/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 2.8) set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake) -project(RBDoom3) +project(RBDoom3BFG) option(USE_MFC_TOOLS "Compile the built-in MFC based tools" OFF) @@ -1011,16 +1011,16 @@ if(MSVC) list(REMOVE_DUPLICATES RBDOOM3_SOURCES) - add_executable(RBDoom3 WIN32 ${RBDOOM3_SOURCES}) + add_executable(RBDoom3BFG WIN32 ${RBDOOM3_SOURCES}) - #add_custom_command(TARGET RBDoom3 + #add_custom_command(TARGET RBDoom3BFG # PRE_BUILD # COMMAND nmake ARGS /f Makefile.vc6 CFG=release # WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/libs/curl/lib # COMMENT "Compiling libcURL") - add_dependencies(RBDoom3 idlib) - target_link_libraries(RBDoom3 + add_dependencies(RBDoom3BFG idlib) + target_link_libraries(RBDoom3BFG idlib ${DirectX_LIBRARIES} #libcurl @@ -1071,9 +1071,9 @@ else() list(REMOVE_DUPLICATES RBDOOM3_SOURCES) - add_executable(RBDoom3 WIN32 ${RBDOOM3_SOURCES}) + add_executable(RBDoom3BFG WIN32 ${RBDOOM3_SOURCES}) - add_dependencies(RBDoom3 idlib) + add_dependencies(RBDoom3BFG idlib) if(MINGW) include_directories(libs/sdl2/include) @@ -1083,7 +1083,7 @@ else() if(WIN32) - target_link_libraries(RBDoom3 + target_link_libraries(RBDoom3BFG idlib ${DirectX_LIBRARIES} #libcurl @@ -1101,7 +1101,7 @@ else() endif() if(UNIX) - target_link_libraries(RBDoom3 + target_link_libraries(RBDoom3BFG idlib GL pthread diff --git a/neo/renderer/tr_local.h b/neo/renderer/tr_local.h index 131bb85e..d9f866d5 100644 --- a/neo/renderer/tr_local.h +++ b/neo/renderer/tr_local.h @@ -1038,7 +1038,7 @@ struct vidMode_t } vidMode_t( int width, int height, int displayHz ) : - width(width), height(height), displayHz(displayHz) {} + width( width ), height( height ), displayHz( displayHz ) {} // RB end bool operator==( const vidMode_t& a ) diff --git a/neo/sys/linux/linux_main.cpp b/neo/sys/linux/linux_main.cpp index 70001d7b..4132b537 100644 --- a/neo/sys/linux/linux_main.cpp +++ b/neo/sys/linux/linux_main.cpp @@ -54,11 +54,8 @@ static idStr savepath; */ const char* Sys_DefaultSavePath() { -#if defined( ID_DEMO_BUILD ) - sprintf( savepath, "%s/.rbdoom3-demo", getenv( "HOME" ) ); -#else - sprintf( savepath, "%s/.rbdoom3", getenv( "HOME" ) ); -#endif + sprintf( savepath, "%s/.rbdoom3bfg", getenv( "HOME" ) ); + return savepath.c_str(); } /* diff --git a/neo/sys/sdl/sdl_glimp.cpp b/neo/sys/sdl/sdl_glimp.cpp index 5c9b267c..556112c0 100644 --- a/neo/sys/sdl/sdl_glimp.cpp +++ b/neo/sys/sdl/sdl_glimp.cpp @@ -457,7 +457,7 @@ bool R_GetModeListForDisplay( const int requestedDisplayNum, idList& // requested invalid displaynum return false; } - + int numModes = SDL_GetNumDisplayModes( requestedDisplayNum ); if( numModes > 0 ) { From bf7f892d5dde865c86cfc1ef8ea6c875172c11ce Mon Sep 17 00:00:00 2001 From: Robert Beckebans Date: Wed, 19 Dec 2012 16:18:18 +0100 Subject: [PATCH 04/57] Updated README.txt with compile instructions for Linux --- README.txt | 238 +++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 204 insertions(+), 34 deletions(-) diff --git a/README.txt b/README.txt index ab595e7a..a047ee08 100644 --- a/README.txt +++ b/README.txt @@ -1,18 +1,86 @@ -Doom 3 BFG Edition GPL Source Code -================================== + +____________________________ _____________________________________ +\______ \______ \______ \ ____ ____ _____ \_____ \______ \_ _____/ _____/ + | _/| | _/| | \ / _ \ / _ \ / \ _(__ <| | _/| __)/ \ ___ + | | \| | \| ` ( <_> | <_> ) Y Y \/ \ | \| \ \ \_\ \ + |____|_ /|______ /_______ /\____/ \____/|__|_| /______ /______ /\___ / \______ / + \/ \/ \/ \/ \/ \/ \/ +_________________________________________ + + +RBDoom3BFG Readme - https://github.com/RobertBeckebans/RBDOOM-3-BFG + +Thank you for downloading RBDoom3BFG. + + + +_______________________________________ + +CONTENTS +_______________________________ + + This file contains the following sections: -GENERAL NOTES -LICENSE + 1) SYSTEM REQUIREMENT -GENERAL NOTES -============= + 2) GENERAL NOTES + + 3) LICENSE + + 4) GETTING THE SOURCE CODE -Game data and patching: ------------------------ + 5) COMPILING ON WIN32 WITH VISUAL C++ 2010 EXPRESS EDITION -This source release does not contain any game data, the game data is still + 6) COMPILING ON GNU/LINUX + + 7) CHANGES + + 8) FEATURES + + 9) CONSOLE VARIABLES + + 10) KNOWN ISSUES + + 11) BUG REPORTS + + 12) FUTURE PLAN + + 13) CONTRIBUTIONS + + 14) DONATIONS + + + +___________________________________ + +1) SYSTEM REQUIREMENTS +__________________________ + + + +Minimum system requirements: + + CPU: 2 GHz Intel compatible + System Memory: 512MB + Graphics card: Any graphics card that supports Direct3D 10 and OpenGL >= 3.2 + +Recommended system requirements: + + CPU: 3 GHz + Intel compatible + System Memory: 1024MB+ + Graphics card: Geforce 9600 GT, ATI HD 5650 or higher. + + + + +_______________________________ + +2) GENERAL NOTES +______________________ + +This release does not contain any game data, the game data is still covered by the original EULA and must be obeyed as usual. You must patch the game to the latest version. @@ -21,17 +89,6 @@ Note that Doom 3 BFG Edition is available from the Steam store at http://store.steampowered.com/app/208200/ -Compiling on win32: -------------------- - -A project file for Microsoft Visual Studio 2010 is provided in neo\doom3.sln -We expect the solution file is compatible with the Express releases - -You will need the Microsoft DirectX SDK installed as well. -If it does not reside in "C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)" -you will need to update the project files accordingly. - - Steam: ------ The Doom 3 BFG Edition GPL Source Code release does not include functionality for integrating with @@ -41,7 +98,6 @@ any other Steam features. Bink: ----- - The Doom 3 BFG Edition GPL Source Code release does not include functionality for rendering Bink Videos. @@ -52,28 +108,140 @@ The Doom 3 BFG Edition GPL Source Code release does not include functionality en of stencil shadows via the "depth fail" method, a functionality commonly known as "Carmack's Reverse". -Other platforms, updated source code, security issues: ------------------------------------------------------- -If you have obtained this source code several weeks after the time of release, -it is likely that you can find modified and improved versions of the engine in -various open source projects across the internet. +_______________________________ -Depending what is your interest with the source code, those may be a better starting point. +3) LICENSE +______________________ -LICENSE -======= - See COPYING.txt for the GNU GENERAL PUBLIC LICENSE ADDITIONAL TERMS: The Doom 3 BFG Edition GPL Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU GPL which accompanied the Doom 3 BFG Edition GPL Source Code. If not, please request a copy in writing from id Software at id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA. -EXCLUDED CODE: The code described below and contained in the Doom 3 BFG Edition GPL Source Code release is not part of the Program covered by the GPL and is expressly excluded from its terms. You are solely responsible for obtaining from the copyright holder a license for such code and complying with the applicable license terms. + +____________________________________________ + +4) GETTING THE SOURCE CODE +___________________________________ + +This project's GitHub.net Git repository can be checked out through Git with the following instruction set: + + > git clone https://github.com/RobertBeckebans/RBDOOM-3-BFG.git + + + +___________________________________________________________________ + +5) COMPILING ON WIN32 WITH VISUAL C++ 2010 EXPRESS EDITION +__________________________________________________________ + +1. Download and install the Visual C++ 2010 Express Edition. + +2. Generate the VC10 projects using CMake by doubleclicking a matching configuration .bat file in the neo/ folder. + +3. Use the VC10 solution to compile what you need: + RBDOOM-3-BFG/build/RBDoom3BFG.sln + + +__________________________________ + +6) COMPILING ON GNU/LINUX +_________________________ + + +1. You need the following dependencies in order to compile RBDoom3BFG with all features: + + On Debian or Ubuntu: + + > apt-get install libsdl1.2-dev cmake + + On Fedora + + > yum install SDL-devel cmake + + +3. Generate the Makefiles using Premake: + + > cd neo/ + > ./cmake-eclipse-linux-profile.sh + +4. Compile RBDoom3BFG targets with + + > cd ../build + > make + + +___________________________________________________ + +7) CHANGES +__________________________________________ + +// TODO +See CHANGELOG.txt for full list of all changes. + + +___________________________________________________ + +9) CONSOLE VARIABLES +__________________________________________ + +// TODO + + +___________________________________________________ + +10) KNOWN ISSUES +__________________________________________ + + * Sound engine does not work on Linux + * There are some issues with the binary format loaders/writers on 64 bit platforms + + +___________________________________________________ + +11) BUG REPORTS +__________________________________________ + +RBDoom3BFG is not perfect, it is not bug free as every other software. +For fixing as much problems as possible we need as much bug reports as possible. +We cannot fix anything if we do not know about the problems. + +The best way for telling us about a bug is by submitting a bug report at our GitHub bug tracker page: + + https://github.com/RobertBeckebans/RBDOOM-3-BFG/issues?state=open + +The most important fact about this tracker is that we cannot simply forget to fix the bugs which are posted there. +It is also a great way to keep track of fixed stuff. + +If you want to report an issue with the game, you should make sure that your report includes all information useful to characterize and reproduce the bug. + + * Search on Google + * Include the computer's hardware and software description ( CPU, RAM, 3D Card, distribution, kernel etc. ) + * If appropriate, send a console log, a screenshot, an strace .. + * If you are sending a console log, make sure to enable developer output: + + RBDoom3BFG.exe +set developer 1 +set logfile 2 + +NOTE: We cannot help you with OS-specific issues like configuring OpenGL correctly, configuring ALSA or configuring the network. + + + + +____________________________________________________________________________________ + +12) Code License Exceptions - The parts that are not covered by the GPL: +_______________________________________________________________________ + + +EXCLUDED CODE: The code described below and contained in the Doom 3 BFG Edition GPL Source Code release +is not part of the Program covered by the GPL and is expressly excluded from its terms. +You are solely responsible for obtaining from the copyright holder a license for such code and complying with the applicable license terms. + JPEG library ----------------------------------------------------------------------------- -neo/renderer/jpeg-6/* +neo/libs/jpeg-6/* Copyright (C) 1991-1995, Thomas G. Lane @@ -103,7 +271,7 @@ better release of the library. zlib library --------------------------------------------------------------------------- -neo/framework/zlib/* +neo/libs/zlib/* Copyright (C) 1995-2005 Jean-loup Gailly and Mark Adler @@ -245,7 +413,7 @@ MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. Timidity --------------------------------------------------------------------------- -doomclassic/timidity/* +neo/libs/timidity/* Copyright (c) 1995 Tuukka Toivonen @@ -255,3 +423,5 @@ If you'd like to continue hacking on TiMidity, feel free. I'm hereby extending the TiMidity license agreement: you can now select the most convenient license for your needs from (1) the GNU GPL, (2) the GNU LGPL, or (3) the Perl Artistic License. + + From a95f5811b6d8554d84da88a27aea6111ae0a17bf Mon Sep 17 00:00:00 2001 From: Robert Beckebans Date: Wed, 19 Dec 2012 16:19:42 +0100 Subject: [PATCH 05/57] Updated README.txt --- README.txt | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/README.txt b/README.txt index a047ee08..2044193a 100644 --- a/README.txt +++ b/README.txt @@ -45,11 +45,7 @@ This file contains the following sections: 11) BUG REPORTS - 12) FUTURE PLAN - - 13) CONTRIBUTIONS - - 14) DONATIONS + 12) CODE LICENSE EXCEPTIONS @@ -230,7 +226,7 @@ NOTE: We cannot help you with OS-specific issues like configuring OpenGL correct ____________________________________________________________________________________ -12) Code License Exceptions - The parts that are not covered by the GPL: +12) CODE LICENSE EXCEPTIONS - The parts that are not covered by the GPL: _______________________________________________________________________ From 6b918aef869b14c3cc4cf5ca6244c7ef6c2df0d6 Mon Sep 17 00:00:00 2001 From: Robert Beckebans Date: Wed, 19 Dec 2012 23:56:20 +0100 Subject: [PATCH 06/57] Disabled broken savegame and profile storage checks for the PC --- README.txt | 19 ++++++++++--------- neo/framework/Common.cpp | 6 +++++- neo/sys/sys_localuser.cpp | 8 ++++++-- neo/sys/sys_localuser.h | 5 ++++- neo/sys/win32/win_savegame.cpp | 6 +++++- 5 files changed, 30 insertions(+), 14 deletions(-) diff --git a/README.txt b/README.txt index 2044193a..555482bd 100644 --- a/README.txt +++ b/README.txt @@ -1,10 +1,9 @@ -____________________________ _____________________________________ -\______ \______ \______ \ ____ ____ _____ \_____ \______ \_ _____/ _____/ - | _/| | _/| | \ / _ \ / _ \ / \ _(__ <| | _/| __)/ \ ___ - | | \| | \| ` ( <_> | <_> ) Y Y \/ \ | \| \ \ \_\ \ - |____|_ /|______ /_______ /\____/ \____/|__|_| /______ /______ /\___ / \______ / - \/ \/ \/ \/ \/ \/ \/ + ____ ____ ____ _____ ____ ______ ______ + / __ \ / __ ) / __ \ ____ ____ ____ ___ |__ / / __ ) / ____// ____/ + / /_/ // __ |/ / / // __ \ / __ \ / __ `__ \ /_ < / __ |/ /_ / / __ + / _, _// /_/ // /_/ // /_/ // /_/ // / / / / /___/ // /_/ // __/ / /_/ / +/_/ |_|/_____//_____/ \____/ \____//_/ /_/ /_//____//_____//_/ \____/ _________________________________________ @@ -150,14 +149,14 @@ _________________________ On Debian or Ubuntu: - > apt-get install libsdl1.2-dev cmake + > apt-get install cmake libsdl1.2-dev On Fedora - > yum install SDL-devel cmake + > yum install cmake SDL-devel -3. Generate the Makefiles using Premake: +3. Generate the Makefiles using CMake: > cd neo/ > ./cmake-eclipse-linux-profile.sh @@ -191,7 +190,9 @@ ___________________________________________________ __________________________________________ * Sound engine does not work on Linux + * Doomclassic is not supported on Linux (yet) * There are some issues with the binary format loaders/writers on 64 bit platforms + * The intel open source drivers to not support OpenGL 3.2 yet ___________________________________________________ diff --git a/neo/framework/Common.cpp b/neo/framework/Common.cpp index e426b70b..cdcab498 100644 --- a/neo/framework/Common.cpp +++ b/neo/framework/Common.cpp @@ -634,7 +634,10 @@ idCommonLocal::CheckStartupStorageRequirements */ void idCommonLocal::CheckStartupStorageRequirements() { + // RB: disabled savegame and profile storage checks, because it fails sometimes without any clear reason +#if 0 int64 availableSpace = 0; + // ------------------------------------------------------------------------ // Savegame and Profile required storage // ------------------------------------------------------------------------ @@ -711,7 +714,8 @@ void idCommonLocal::CheckStartupStorageRequirements() common->Dialog().AddDynamicDialog( GDM_INSUFFICENT_STORAGE_SPACE, callbacks, optionText, true, msg ); } - +#endif + // RB end session->GetAchievementSystem().Start(); } diff --git a/neo/sys/sys_localuser.cpp b/neo/sys/sys_localuser.cpp index 1ece3b20..a23807ee 100644 --- a/neo/sys/sys_localuser.cpp +++ b/neo/sys/sys_localuser.cpp @@ -89,18 +89,22 @@ void idLocalUser::ResetStorageDevice() idLocalUser::StorageSizeAvailable ======================== */ +// RB: disabled savegame and profile storage checks, because it fails sometimes without any clear reason +/* bool idLocalUser::StorageSizeAvailable( uint64 minSizeInBytes, int64& neededBytes ) { int64 size = Sys_GetDriveFreeSpaceInBytes( fs_savepath.GetString() ); - + neededBytes = minSizeInBytes - size; if( neededBytes < 0 ) { neededBytes = 0; } - + return neededBytes == 0; } +*/ +// RB end /* ======================== diff --git a/neo/sys/sys_localuser.h b/neo/sys/sys_localuser.h index 9cad24c6..7c3dd679 100644 --- a/neo/sys/sys_localuser.h +++ b/neo/sys/sys_localuser.h @@ -125,7 +125,10 @@ public: // Storage related virtual bool IsStorageDeviceAvailable() const; // Only false if the player has chosen to play without a storage device, only possible on 360, if available, everything needs to check for available space virtual void ResetStorageDevice(); - virtual bool StorageSizeAvailable( uint64 minSizeInBytes, int64& neededBytes ); + + // RB: disabled savegame and profile storage checks, because it fails sometimes without any clear reason + //virtual bool StorageSizeAvailable( uint64 minSizeInBytes, int64& neededBytes ); + // RB end // These set stats within the profile as a enum/value pair virtual void SetStatInt( int stat, int value ); diff --git a/neo/sys/win32/win_savegame.cpp b/neo/sys/win32/win_savegame.cpp index 5187a8d4..a6a1f24e 100644 --- a/neo/sys/win32/win_savegame.cpp +++ b/neo/sys/win32/win_savegame.cpp @@ -132,6 +132,8 @@ int idSaveGameThread::Save() } } + // RB: disabled savegame and profile storage checks, because it fails sometimes without any clear reason + /* // Inform user about size required if necessary if( requiredSizeBytes > 0 && !callback->cancelled ) { @@ -143,7 +145,7 @@ int idSaveGameThread::Save() directory += "\\"; // so it doesn't think the last part is a file and ignores in the directory creation fileSystem->CreateOSPath( directory ); // we can't actually check FileExists in production builds, so just try to create it user->StorageSizeAvailable( requiredSizeBytes, callback->requiredSpaceInBytes ); - + if( callback->requiredSpaceInBytes > 0 ) { callback->errorCode = SAVEGAME_E_INSUFFICIENT_ROOM; @@ -152,6 +154,8 @@ int idSaveGameThread::Save() } } } + */ + // RB end // Delete all previous files if needed // ALL THE FILES RIGHT NOW---- could use pattern later... From 731428164f2e33cc905406587473267745a19aed Mon Sep 17 00:00:00 2001 From: Robert Beckebans Date: Thu, 20 Dec 2012 02:38:01 +0100 Subject: [PATCH 07/57] Fixed error: class idLocalUserWin has no member named StorageSizeAvailable --- neo/sys/posix/posix_savegame.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/neo/sys/posix/posix_savegame.cpp b/neo/sys/posix/posix_savegame.cpp index 1caf51ae..2e34eeec 100644 --- a/neo/sys/posix/posix_savegame.cpp +++ b/neo/sys/posix/posix_savegame.cpp @@ -136,6 +136,8 @@ int idSaveGameThread::Save() } } + // RB: disabled savegame and profile storage checks, because it fails sometimes without any clear reason + /* // Inform user about size required if necessary if( requiredSizeBytes > 0 && !callback->cancelled ) { @@ -147,7 +149,7 @@ int idSaveGameThread::Save() directory += "\\"; // so it doesn't think the last part is a file and ignores in the directory creation fileSystem->CreateOSPath( directory ); // we can't actually check FileExists in production builds, so just try to create it user->StorageSizeAvailable( requiredSizeBytes, callback->requiredSpaceInBytes ); - + if( callback->requiredSpaceInBytes > 0 ) { callback->errorCode = SAVEGAME_E_INSUFFICIENT_ROOM; @@ -156,6 +158,8 @@ int idSaveGameThread::Save() } } } + */ + // RB end // Delete all previous files if needed // ALL THE FILES RIGHT NOW---- could use pattern later... From ab86006668a5228ed118598cb52c3f261626b850 Mon Sep 17 00:00:00 2001 From: Daniel Gibson Date: Fri, 21 Dec 2012 04:52:56 +0100 Subject: [PATCH 08/57] Improve console behavior * Pressing up and down again in the console will result in an empty line, not the stay at the last line from history * Pressing up will really show the last command, not the last-but-one --- neo/framework/Console.cpp | 7 ++++++- neo/framework/ConsoleHistory.cpp | 3 +++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/neo/framework/Console.cpp b/neo/framework/Console.cpp index 4a86fe3e..33d3175a 100644 --- a/neo/framework/Console.cpp +++ b/neo/framework/Console.cpp @@ -642,6 +642,11 @@ void idConsoleLocal::KeyDownEvent( int key ) { consoleField.SetBuffer( hist ); } + else // DG: if no more lines are in the history, show a blank line again + { + consoleField.Clear(); + } // DG end + return; } @@ -1413,4 +1418,4 @@ void idConsoleLocal::DrawDebugGraphs() { debugGraphs[i]->Render( renderSystem ); } -} \ No newline at end of file +} diff --git a/neo/framework/ConsoleHistory.cpp b/neo/framework/ConsoleHistory.cpp index f5d33b50..8fa4b703 100644 --- a/neo/framework/ConsoleHistory.cpp +++ b/neo/framework/ConsoleHistory.cpp @@ -131,6 +131,9 @@ idStr idConsoleHistory::RetrieveFromHistory( bool backward ) { if( downPoint >= numHistory ) { + // DG: without this you'll get the last-but-one command when pressing UP + upPoint = downPoint - 1; + // DG end return idStr( "" ); } returnLine = downPoint; From 0be69a31620ce478331c038e78bf40653271db91 Mon Sep 17 00:00:00 2001 From: Daniel Gibson Date: Fri, 21 Dec 2012 04:53:23 +0100 Subject: [PATCH 09/57] Fix console on Linux * Add support for Console-Key independently of KB Layout (with scancode) * add support for TAB key * Add hack so console is empty after opening it (SDL-only) --- neo/sys/sdl/sdl_events.cpp | 48 ++++++++++++++++++++++++-------------- 1 file changed, 31 insertions(+), 17 deletions(-) diff --git a/neo/sys/sdl/sdl_events.cpp b/neo/sys/sdl/sdl_events.cpp index 7fc5eabc..448f844e 100644 --- a/neo/sys/sdl/sdl_events.cpp +++ b/neo/sys/sdl/sdl_events.cpp @@ -269,6 +269,11 @@ static int SDL_KeyToDoom3Key( SDL_Keycode key, bool& isChar ) case SDLK_PAUSE: return K_PAUSE; + // DG: add tab key support + case SDLK_TAB: + return K_TAB; + // DG end + //case SDLK_APPLICATION: // return K_COMMAND; case SDLK_CAPSLOCK: @@ -737,26 +742,35 @@ sysEvent_t Sys_GetEvent() { bool isChar; - key = SDL_KeyToDoom3Key( ev.key.keysym.sym, isChar ); - - if( key == 0 ) + // DG: special case for SDL_SCANCODE_GRAVE - the console key under Esc + if( ev.key.keysym.scancode == SDL_SCANCODE_GRAVE ) { - unsigned char c; + key = K_GRAVE; + c = K_BACKSPACE; // bad hack to get empty console inputline.. + } // DG end, the original code is in the else case + else + { + key = SDL_KeyToDoom3Key( ev.key.keysym.sym, isChar ); - // check if its an unmapped console key - if( ev.key.keysym.unicode == ( c = Sys_GetConsoleKey( false ) ) ) + if( key == 0 ) { - key = c; - } - else if( ev.key.keysym.unicode == ( c = Sys_GetConsoleKey( true ) ) ) - { - key = c; - } - else - { - if( ev.type == SDL_KEYDOWN ) - common->Warning( "unmapped SDL key %d (0x%x)", ev.key.keysym.sym, ev.key.keysym.unicode ); - return res_none; + unsigned char c; + + // check if its an unmapped console key + if( ev.key.keysym.unicode == ( c = Sys_GetConsoleKey( false ) ) ) + { + key = c; + } + else if( ev.key.keysym.unicode == ( c = Sys_GetConsoleKey( true ) ) ) + { + key = c; + } + else + { + if( ev.type == SDL_KEYDOWN ) + common->Warning( "unmapped SDL key %d (0x%x)", ev.key.keysym.sym, ev.key.keysym.unicode ); + return res_none; + } } } From 26d3ef7e54f401321f02dc14a00db94a6d0ac4b6 Mon Sep 17 00:00:00 2001 From: Robert Beckebans Date: Fri, 21 Dec 2012 16:02:42 +0100 Subject: [PATCH 10/57] Changed SAVE_PATH on Windows so we don't break the savegames of the original game. --- neo/framework/Licensee.h | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/neo/framework/Licensee.h b/neo/framework/Licensee.h index 502ab3c1..faecacbe 100644 --- a/neo/framework/Licensee.h +++ b/neo/framework/Licensee.h @@ -36,9 +36,12 @@ If you have questions concerning this license or the applicable additional terms */ #define GAME_NAME "DOOM 3: BFG Edition" // appears on window titles and errors -#define SAVE_PATH "\\id Software\\DOOM 3 BFG" + +// RB: changed home folder so we don't break the savegame of the original game +#define SAVE_PATH "\\id Software\\RBDOOM 3 BFG" #define ENGINE_VERSION "RBD3BFG 1" // printed in console +// RB end #define BASE_GAMEDIR "base" @@ -60,11 +63,7 @@ If you have questions concerning this license or the applicable additional terms // RB begin // Linux info -#ifdef ID_DEMO_BUILD -#define LINUX_DEFAULT_PATH "/usr/local/games/rbdoom3-bfg-demo" -#else #define LINUX_DEFAULT_PATH "/usr/local/games/rbdoom3-bfg" -#endif // RB end From f0dfe7e4996bfa3a1951e6e9c8f13bfa260a3cc9 Mon Sep 17 00:00:00 2001 From: Daniel Gibson Date: Sat, 22 Dec 2012 02:54:31 +0100 Subject: [PATCH 11/57] restore SDL1-support in sdl_events.cpp * add define for SDL_SCANCODE_GRAVE - seems like only SDL2 has names for the values * add some missing keys to SDL_KeyToDoom3Key * add scancode to unmapped-key warning * backspace needs to be handled the same for SDL1 as in SDL2 (i.e. a new event must be created for it) to work in console --- neo/sys/sdl/sdl_events.cpp | 37 +++++++++++++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/neo/sys/sdl/sdl_events.cpp b/neo/sys/sdl/sdl_events.cpp index 448f844e..a24ce6d5 100644 --- a/neo/sys/sdl/sdl_events.cpp +++ b/neo/sys/sdl/sdl_events.cpp @@ -53,6 +53,9 @@ If you have questions concerning this license or the applicable additional terms #define SDLK_KP_9 SDLK_KP9 #define SDLK_NUMLOCKCLEAR SDLK_NUMLOCK #define SDLK_PRINTSCREEN SDLK_PRINT +// DG: SDL1 doesn't seem to have defines for scancodes.. add the (only) one we need +#define SDL_SCANCODE_GRAVE 49 // in SDL2 this is 53.. but according to two different systems and keyboards this works for SDL1 +// DG end #endif const char* kbdNames[] = @@ -161,6 +164,33 @@ static int SDL_KeyToDoom3Key( SDL_Keycode key, bool& isChar ) case SDLK_9: return K_9; + + // DG: add some missing keys.. + case SDLK_UNDERSCORE: + return K_UNDERLINE; + + case SDLK_MINUS: + return K_MINUS; + + case SDLK_COMMA: + return K_COMMA; + + case SDLK_COLON: + return K_COLON; + + case SDLK_SEMICOLON: + return K_SEMICOLON; + + case SDLK_PERIOD: + return K_PERIOD; + + case SDLK_AT: + return K_AT; + + case SDLK_EQUALS: + return K_EQUALS; + // DG end + /* SDLK_COLON = 58, SDLK_SEMICOLON = 59, @@ -768,7 +798,7 @@ sysEvent_t Sys_GetEvent() else { if( ev.type == SDL_KEYDOWN ) - common->Warning( "unmapped SDL key %d (0x%x)", ev.key.keysym.sym, ev.key.keysym.unicode ); + common->Warning( "unmapped SDL key %d (0x%x) scancode %d", ev.key.keysym.sym, ev.key.keysym.unicode, ev.key.keysym.scancode ); return res_none; } } @@ -780,16 +810,15 @@ sysEvent_t Sys_GetEvent() kbd_polls.Append( kbd_poll_t( key, ev.key.state == SDL_PRESSED ) ); -#if SDL_VERSION_ATLEAST(2, 0, 0) if( key == K_BACKSPACE && ev.key.state == SDL_PRESSED ) c = key; -#else +#if ! SDL_VERSION_ATLEAST(2, 0, 0) if( ev.key.state == SDL_PRESSED && isChar && ( ev.key.keysym.unicode & 0xff00 ) == 0 ) { c = ev.key.keysym.unicode & 0xff; } #endif - + return res; } From 742ef7da8398bd9136c194665282d143f70bed89 Mon Sep 17 00:00:00 2001 From: Daniel Gibson Date: Sat, 22 Dec 2012 03:23:13 +0100 Subject: [PATCH 12/57] Fix scrolling in Menus for SDL2 scrolling didn't stop, e.g. in the resolution selection menu --- neo/sys/sdl/sdl_events.cpp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/neo/sys/sdl/sdl_events.cpp b/neo/sys/sdl/sdl_events.cpp index a24ce6d5..a6769ea6 100644 --- a/neo/sys/sdl/sdl_events.cpp +++ b/neo/sys/sdl/sdl_events.cpp @@ -687,6 +687,19 @@ sysEvent_t Sys_GetEvent() return res; } + + // DG: fake a "mousewheel not pressed anymore" event for SDL2 + // so scrolling in menus stops after one step + static int mwheelRel = 0; + if( mwheelRel ) + { + res.evType = SE_KEY; + res.evValue = mwheelRel; + res.evValue2 = 0; // "not pressed anymore" + mwheelRel = 0; + return res; + } + // DG end #endif static byte c = 0; @@ -872,6 +885,10 @@ sysEvent_t Sys_GetEvent() mouse_polls.Append( mouse_poll_t( M_DELTAZ, -1 ) ); } + // DG: remember mousewheel direction to issue a "not pressed anymore" event + mwheelRel = res.evValue; + // DG end + res.evValue2 = 1; return res; From 865ee792c0afcf219df05d67953c4187c260bbde Mon Sep 17 00:00:00 2001 From: Robert Beckebans Date: Sat, 22 Dec 2012 13:15:47 +0100 Subject: [PATCH 13/57] Disabled usage of pthread_{get,set}_name because it does not work on all Linux systems. --- neo/idlib/sys/posix/posix_thread.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/neo/idlib/sys/posix/posix_thread.cpp b/neo/idlib/sys/posix/posix_thread.cpp index 7e5fcfbc..392fd6b2 100644 --- a/neo/idlib/sys/posix/posix_thread.cpp +++ b/neo/idlib/sys/posix/posix_thread.cpp @@ -30,7 +30,7 @@ If you have questions concerning this license or the applicable additional terms #include "../../precompiled.h" -//#include +//#define DEBUG_THREADS typedef void* ( *pthread_function_t )( void* ); @@ -61,9 +61,7 @@ uintptr_t Sys_CreateThread( xthread_t function, void* parms, xthreadPriority pri pthread_attr_destroy( &attr ); // RB: TODO pthread_setname_np is different on Linux, MacOSX and other systems -#if 1 - pthread_setname_np( handle, name ); -#else +#if defined(DEBUG_THREADS) if( pthread_setname_np( handle, name ) != 0 ) { idLib::common->FatalError( "ERROR: pthread_setname_np %s failed\n", name ); @@ -122,7 +120,10 @@ void Sys_DestroyThread( uintptr_t threadHandle ) char name[128]; name[0] = '\0'; + +#if defined(DEBUG_THREADS) pthread_getname_np( threadHandle, name, sizeof( name ) ); +#endif #if 0 //!defined(__ANDROID__) if( pthread_cancel( ( pthread_t )threadHandle ) != 0 ) From dd9b8a8710dd7f8c1376eb245ee31fc740eae6eb Mon Sep 17 00:00:00 2001 From: Robert Beckebans Date: Sat, 22 Dec 2012 16:18:19 +0100 Subject: [PATCH 14/57] Added support for precompiled headers for MSVC which reduced the compiled time from 4 minutes to 67 seconds. --- doomclassic/doom/d_main.cpp | 2 +- neo/CMakeLists.txt | 137 ++++++++++++++---- neo/aas/AASFile.cpp | 2 +- neo/aas/AASFileManager.cpp | 2 +- neo/aas/AASFile_optimize.cpp | 2 +- neo/aas/AASFile_sample.cpp | 2 +- neo/cm/CollisionModel_contacts.cpp | 2 +- neo/cm/CollisionModel_contents.cpp | 2 +- neo/cm/CollisionModel_debug.cpp | 2 +- neo/cm/CollisionModel_files.cpp | 2 +- neo/cm/CollisionModel_load.cpp | 2 +- neo/cm/CollisionModel_rotate.cpp | 2 +- neo/cm/CollisionModel_trace.cpp | 2 +- neo/cm/CollisionModel_translate.cpp | 2 +- neo/d3xp/AF.cpp | 2 +- neo/d3xp/AFEntity.cpp | 2 +- neo/d3xp/Achievements.cpp | 2 +- neo/d3xp/Actor.cpp | 2 +- neo/d3xp/AimAssist.cpp | 2 +- neo/d3xp/BrittleFracture.cpp | 2 +- neo/d3xp/Camera.cpp | 2 +- neo/d3xp/Entity.cpp | 2 +- neo/d3xp/Fx.cpp | 2 +- neo/d3xp/GameEdit.cpp | 2 +- neo/d3xp/Game_local.cpp | 2 +- neo/d3xp/Game_network.cpp | 2 +- neo/d3xp/Grabber.cpp | 2 +- neo/d3xp/IK.cpp | 2 +- neo/d3xp/Item.cpp | 2 +- neo/d3xp/Leaderboards.cpp | 2 +- neo/d3xp/Light.cpp | 2 +- neo/d3xp/Misc.cpp | 2 +- neo/d3xp/Moveable.cpp | 2 +- neo/d3xp/Mover.cpp | 2 +- neo/d3xp/MultiplayerGame.cpp | 2 +- neo/d3xp/Player.cpp | 2 +- neo/d3xp/PlayerIcon.cpp | 2 +- neo/d3xp/PlayerView.cpp | 2 +- neo/d3xp/Projectile.cpp | 2 +- neo/d3xp/Pvs.cpp | 2 +- neo/d3xp/SecurityCamera.cpp | 2 +- neo/d3xp/SmokeParticles.cpp | 2 +- neo/d3xp/Sound.cpp | 2 +- neo/d3xp/Target.cpp | 2 +- neo/d3xp/Trigger.cpp | 2 +- neo/d3xp/Weapon.cpp | 2 +- neo/d3xp/WorldSpawn.cpp | 2 +- neo/d3xp/ai/AAS.cpp | 2 +- neo/d3xp/ai/AAS_debug.cpp | 2 +- neo/d3xp/ai/AAS_pathing.cpp | 2 +- neo/d3xp/ai/AAS_routing.cpp | 2 +- neo/d3xp/ai/AI.cpp | 2 +- neo/d3xp/ai/AI_Vagary.cpp | 2 +- neo/d3xp/ai/AI_events.cpp | 2 +- neo/d3xp/ai/AI_pathing.cpp | 2 +- neo/d3xp/anim/Anim.cpp | 2 +- neo/d3xp/anim/Anim_Blend.cpp | 2 +- neo/d3xp/anim/Anim_Testmodel.cpp | 2 +- neo/d3xp/gamesys/Class.cpp | 2 +- neo/d3xp/gamesys/Event.cpp | 2 +- neo/d3xp/gamesys/SaveGame.cpp | 2 +- neo/d3xp/gamesys/SysCmds.cpp | 2 +- neo/d3xp/gamesys/SysCvar.cpp | 2 +- neo/d3xp/menus/MenuHandler.cpp | 2 +- neo/d3xp/menus/MenuHandler_HUD.cpp | 2 +- neo/d3xp/menus/MenuHandler_PDA.cpp | 2 +- neo/d3xp/menus/MenuHandler_Scoreboard.cpp | 2 +- neo/d3xp/menus/MenuHandler_Shell.cpp | 2 +- neo/d3xp/menus/MenuScreen.cpp | 2 +- neo/d3xp/menus/MenuScreen_HUD.cpp | 2 +- neo/d3xp/menus/MenuScreen_PDA_Inventory.cpp | 2 +- neo/d3xp/menus/MenuScreen_PDA_UserData.cpp | 2 +- neo/d3xp/menus/MenuScreen_PDA_UserEmails.cpp | 2 +- neo/d3xp/menus/MenuScreen_PDA_VideoDisks.cpp | 2 +- neo/d3xp/menus/MenuScreen_Scoreboard.cpp | 2 +- neo/d3xp/menus/MenuScreen_Shell_Bindings.cpp | 2 +- neo/d3xp/menus/MenuScreen_Shell_Browser.cpp | 2 +- .../MenuScreen_Shell_ControllerLayout.cpp | 2 +- neo/d3xp/menus/MenuScreen_Shell_Controls.cpp | 2 +- neo/d3xp/menus/MenuScreen_Shell_Credits.cpp | 2 +- neo/d3xp/menus/MenuScreen_Shell_Dev.cpp | 2 +- .../menus/MenuScreen_Shell_Difficulty.cpp | 2 +- neo/d3xp/menus/MenuScreen_Shell_GameLobby.cpp | 2 +- .../menus/MenuScreen_Shell_GameOptions.cpp | 2 +- neo/d3xp/menus/MenuScreen_Shell_Gamepad.cpp | 2 +- .../menus/MenuScreen_Shell_Leaderboards.cpp | 2 +- neo/d3xp/menus/MenuScreen_Shell_Load.cpp | 2 +- .../menus/MenuScreen_Shell_MatchSettings.cpp | 2 +- .../menus/MenuScreen_Shell_ModeSelect.cpp | 2 +- neo/d3xp/menus/MenuScreen_Shell_NewGame.cpp | 2 +- .../menus/MenuScreen_Shell_PartyLobby.cpp | 2 +- neo/d3xp/menus/MenuScreen_Shell_Pause.cpp | 2 +- .../menus/MenuScreen_Shell_Playstation.cpp | 2 +- .../menus/MenuScreen_Shell_PressStart.cpp | 2 +- .../menus/MenuScreen_Shell_Resolution.cpp | 2 +- neo/d3xp/menus/MenuScreen_Shell_Root.cpp | 2 +- neo/d3xp/menus/MenuScreen_Shell_Save.cpp | 2 +- neo/d3xp/menus/MenuScreen_Shell_Settings.cpp | 2 +- .../menus/MenuScreen_Shell_Singleplayer.cpp | 2 +- .../menus/MenuScreen_Shell_Stereoscopics.cpp | 2 +- .../menus/MenuScreen_Shell_SystemOptions.cpp | 2 +- neo/d3xp/menus/MenuWidget.cpp | 2 +- neo/d3xp/menus/MenuWidget_Button.cpp | 2 +- neo/d3xp/menus/MenuWidget_Carousel.cpp | 2 +- neo/d3xp/menus/MenuWidget_CommandBar.cpp | 2 +- neo/d3xp/menus/MenuWidget_DynamicList.cpp | 2 +- neo/d3xp/menus/MenuWidget_Help.cpp | 2 +- neo/d3xp/menus/MenuWidget_InfoBox.cpp | 2 +- neo/d3xp/menus/MenuWidget_ItemAssignment.cpp | 2 +- neo/d3xp/menus/MenuWidget_List.cpp | 2 +- neo/d3xp/menus/MenuWidget_LobbyList.cpp | 2 +- neo/d3xp/menus/MenuWidget_MenuBar.cpp | 2 +- neo/d3xp/menus/MenuWidget_NavBar.cpp | 2 +- neo/d3xp/menus/MenuWidget_NavButton.cpp | 2 +- neo/d3xp/menus/MenuWidget_PDA_AudioFiles.cpp | 2 +- neo/d3xp/menus/MenuWidget_PDA_EmailInbox.cpp | 2 +- neo/d3xp/menus/MenuWidget_PDA_Objective.cpp | 2 +- neo/d3xp/menus/MenuWidget_PDA_UserData.cpp | 2 +- neo/d3xp/menus/MenuWidget_PDA_VideoInfo.cpp | 2 +- neo/d3xp/menus/MenuWidget_Scrollbar.cpp | 2 +- neo/d3xp/menus/MenuWidget_Shell_SaveInfo.cpp | 2 +- neo/d3xp/physics/Clip.cpp | 2 +- neo/d3xp/physics/Force.cpp | 2 +- neo/d3xp/physics/Force_Constant.cpp | 2 +- neo/d3xp/physics/Force_Drag.cpp | 2 +- neo/d3xp/physics/Force_Field.cpp | 2 +- neo/d3xp/physics/Force_Grab.cpp | 2 +- neo/d3xp/physics/Force_Spring.cpp | 2 +- neo/d3xp/physics/Physics.cpp | 2 +- neo/d3xp/physics/Physics_AF.cpp | 2 +- neo/d3xp/physics/Physics_Actor.cpp | 2 +- neo/d3xp/physics/Physics_Base.cpp | 2 +- neo/d3xp/physics/Physics_Monster.cpp | 2 +- neo/d3xp/physics/Physics_Parametric.cpp | 2 +- neo/d3xp/physics/Physics_Player.cpp | 2 +- neo/d3xp/physics/Physics_RigidBody.cpp | 2 +- neo/d3xp/physics/Physics_Static.cpp | 2 +- neo/d3xp/physics/Physics_StaticMulti.cpp | 2 +- neo/d3xp/physics/Push.cpp | 2 +- neo/d3xp/precompiled.cpp | 2 +- neo/d3xp/script/Script_Compiler.cpp | 2 +- neo/d3xp/script/Script_Interpreter.cpp | 2 +- neo/d3xp/script/Script_Program.cpp | 2 +- neo/d3xp/script/Script_Thread.cpp | 2 +- neo/framework/CVarSystem.cpp | 2 +- neo/framework/CmdSystem.cpp | 2 +- neo/framework/Common.cpp | 2 +- neo/framework/Common_demos.cpp | 2 +- neo/framework/Common_dialog.cpp | 2 +- neo/framework/Common_load.cpp | 2 +- neo/framework/Common_localize.cpp | 2 +- neo/framework/Common_menu.cpp | 2 +- neo/framework/Common_network.cpp | 2 +- neo/framework/Common_printf.cpp | 2 +- neo/framework/Compressor.cpp | 2 +- neo/framework/Console.cpp | 2 +- neo/framework/ConsoleHistory.cpp | 2 +- neo/framework/DebugGraph.cpp | 2 +- neo/framework/DeclAF.cpp | 2 +- neo/framework/DeclEntityDef.cpp | 2 +- neo/framework/DeclFX.cpp | 2 +- neo/framework/DeclManager.cpp | 2 +- neo/framework/DeclPDA.cpp | 2 +- neo/framework/DeclParticle.cpp | 2 +- neo/framework/DeclSkin.cpp | 2 +- neo/framework/DeclTable.cpp | 2 +- neo/framework/DemoFile.cpp | 2 +- neo/framework/EditField.cpp | 2 +- neo/framework/EventLoop.cpp | 2 +- neo/framework/File.cpp | 2 +- neo/framework/FileSystem.cpp | 2 +- neo/framework/File_Manifest.cpp | 2 +- neo/framework/File_Resource.cpp | 2 +- neo/framework/File_SaveGame.cpp | 2 +- neo/framework/KeyInput.cpp | 2 +- neo/framework/PlayerProfile.cpp | 2 +- neo/framework/TokenParser.cpp | 2 +- neo/framework/Unzip.cpp | 2 +- neo/framework/UsercmdGen.cpp | 2 +- neo/framework/Zip.cpp | 2 +- neo/framework/common_frame.cpp | 2 +- neo/framework/precompiled.cpp | 2 +- neo/idlib/CMakeLists.txt | 34 ++++- neo/idlib/Heap.cpp | 2 +- neo/idlib/bv/Bounds.cpp | 2 +- neo/idlib/bv/Box.cpp | 2 +- neo/idlib/bv/Sphere.cpp | 2 +- neo/idlib/containers/HashIndex.cpp | 2 +- neo/idlib/geometry/DrawVert.cpp | 2 +- neo/idlib/geometry/JointTransform.cpp | 2 +- neo/idlib/geometry/Surface.cpp | 2 +- neo/idlib/geometry/Surface_Patch.cpp | 2 +- neo/idlib/geometry/Surface_Polytope.cpp | 2 +- neo/idlib/geometry/Surface_SweptSpline.cpp | 2 +- neo/idlib/geometry/TraceModel.cpp | 2 +- neo/idlib/geometry/Winding.cpp | 2 +- neo/idlib/geometry/Winding2D.cpp | 2 +- neo/idlib/hashing/CRC32.cpp | 2 +- neo/idlib/hashing/MD4.cpp | 2 +- neo/idlib/hashing/MD5.cpp | 2 +- neo/idlib/math/Angles.cpp | 2 +- neo/idlib/math/Complex.cpp | 2 +- neo/idlib/math/Lcp.cpp | 2 +- neo/idlib/math/MatX.cpp | 2 +- neo/idlib/math/Math.cpp | 2 +- neo/idlib/math/Matrix.cpp | 2 +- neo/idlib/math/Ode.cpp | 2 +- neo/idlib/math/Plane.cpp | 2 +- neo/idlib/math/Pluecker.cpp | 2 +- neo/idlib/math/Polynomial.cpp | 2 +- neo/idlib/math/Quat.cpp | 2 +- neo/idlib/math/Rotation.cpp | 2 +- neo/idlib/math/Simd.cpp | 2 +- neo/idlib/math/Simd_Generic.cpp | 2 +- neo/idlib/math/Simd_SSE.cpp | 2 +- neo/idlib/math/VecX.cpp | 2 +- neo/idlib/math/Vector.cpp | 2 +- neo/idlib/sys/sys_assert.cpp | 2 +- neo/idlib/sys/win32/win_thread.cpp | 2 +- neo/libs/timidity/common.cpp | 2 +- neo/libs/timidity/instrum.cpp | 2 +- neo/libs/timidity/readmidi.cpp | 2 +- neo/libs/timidity/sdl_c.cpp | 2 +- neo/libs/timidity/timidity.cpp | 2 +- neo/renderer/AutoRender.cpp | 2 +- neo/renderer/AutoRenderBink.cpp | 2 +- neo/renderer/BinaryImage.cpp | 2 +- neo/renderer/BoundsTrack.cpp | 2 +- neo/renderer/BufferObject.cpp | 2 +- neo/renderer/Cinematic.cpp | 2 +- neo/renderer/Color/ColorSpace.cpp | 2 +- neo/renderer/DXT/DXTCodec_local.h | 2 +- neo/renderer/Font.cpp | 2 +- neo/renderer/GLMatrix.cpp | 2 +- neo/renderer/GuiModel.cpp | 2 +- neo/renderer/ImageManager.cpp | 2 +- neo/renderer/Image_files.cpp | 2 +- neo/renderer/Image_intrinsic.cpp | 2 +- neo/renderer/Image_load.cpp | 2 +- neo/renderer/Image_process.cpp | 2 +- neo/renderer/Image_program.cpp | 2 +- neo/renderer/Interaction.cpp | 2 +- neo/renderer/Material.cpp | 2 +- neo/renderer/Model.cpp | 2 +- neo/renderer/ModelDecal.cpp | 2 +- neo/renderer/ModelManager.cpp | 2 +- neo/renderer/ModelOverlay.cpp | 2 +- neo/renderer/Model_ase.cpp | 2 +- neo/renderer/Model_beam.cpp | 2 +- neo/renderer/Model_liquid.cpp | 2 +- neo/renderer/Model_lwo.cpp | 2 +- neo/renderer/Model_ma.cpp | 2 +- neo/renderer/Model_md3.cpp | 2 +- neo/renderer/Model_md5.cpp | 2 +- neo/renderer/Model_prt.cpp | 2 +- neo/renderer/Model_sprite.cpp | 2 +- neo/renderer/OpenGL/gl_GraphicsAPIWrapper.cpp | 2 +- neo/renderer/OpenGL/gl_Image.cpp | 2 +- neo/renderer/OpenGL/gl_backend.cpp | 2 +- neo/renderer/RenderEntity.cpp | 2 +- neo/renderer/RenderProgs.cpp | 2 +- neo/renderer/RenderProgs_GLSL.cpp | 2 +- neo/renderer/RenderSystem.cpp | 2 +- neo/renderer/RenderSystem_init.cpp | 2 +- neo/renderer/RenderWorld.cpp | 2 +- neo/renderer/RenderWorld_defs.cpp | 2 +- neo/renderer/RenderWorld_demo.cpp | 2 +- neo/renderer/RenderWorld_load.cpp | 2 +- neo/renderer/RenderWorld_portals.cpp | 2 +- neo/renderer/ResolutionScale.cpp | 2 +- neo/renderer/ScreenRect.cpp | 2 +- neo/renderer/VertexCache.cpp | 2 +- neo/renderer/tr_backend_draw.cpp | 2 +- neo/renderer/tr_backend_rendertools.cpp | 2 +- neo/renderer/tr_frontend_addlights.cpp | 2 +- neo/renderer/tr_frontend_addmodels.cpp | 2 +- neo/renderer/tr_frontend_deform.cpp | 2 +- neo/renderer/tr_frontend_guisurf.cpp | 2 +- neo/renderer/tr_frontend_main.cpp | 2 +- neo/renderer/tr_frontend_subview.cpp | 2 +- neo/renderer/tr_local.h | 2 +- neo/renderer/tr_trace.cpp | 2 +- neo/renderer/tr_trisurf.cpp | 2 +- neo/sound/SoundVoice.cpp | 2 +- neo/sound/WaveFile.cpp | 2 +- neo/sound/XAudio2/XA2_SoundHardware.cpp | 2 +- neo/sound/XAudio2/XA2_SoundSample.cpp | 2 +- neo/sound/XAudio2/XA2_SoundVoice.cpp | 2 +- neo/sound/snd_emitter.cpp | 2 +- neo/sound/snd_shader.cpp | 2 +- neo/sound/snd_system.cpp | 2 +- neo/sound/snd_world.cpp | 2 +- neo/swf/SWF_Bitstream.cpp | 2 +- neo/swf/SWF_Dictionary.cpp | 2 +- neo/swf/SWF_Events.cpp | 2 +- neo/swf/SWF_Image.cpp | 2 +- neo/swf/SWF_Load.cpp | 2 +- neo/swf/SWF_Main.cpp | 2 +- neo/swf/SWF_Names.cpp | 2 +- neo/swf/SWF_ParmList.cpp | 2 +- neo/swf/SWF_PlaceObject.cpp | 2 +- neo/swf/SWF_Render.cpp | 2 +- neo/swf/SWF_ScriptFunction.cpp | 2 +- neo/swf/SWF_ScriptObject.cpp | 2 +- neo/swf/SWF_ScriptVar.cpp | 2 +- neo/swf/SWF_ShapeParser.cpp | 2 +- neo/swf/SWF_Shapes.cpp | 2 +- neo/swf/SWF_Sounds.cpp | 2 +- neo/swf/SWF_SpriteInstance.cpp | 2 +- neo/swf/SWF_Sprites.cpp | 2 +- neo/swf/SWF_Text.cpp | 2 +- neo/swf/SWF_TextInstance.cpp | 2 +- neo/swf/SWF_Zlib.cpp | 2 +- neo/sys/LightweightCompression.cpp | 2 +- neo/sys/PacketProcessor.cpp | 2 +- neo/sys/Snapshot.cpp | 2 +- neo/sys/SnapshotProcessor.cpp | 2 +- neo/sys/Snapshot_Jobs.cpp | 2 +- neo/sys/sys_achievements.cpp | 2 +- neo/sys/sys_dedicated_server_search.cpp | 2 +- neo/sys/sys_lobby.cpp | 2 +- neo/sys/sys_lobby_backend_direct.cpp | 2 +- neo/sys/sys_lobby_migrate.cpp | 2 +- neo/sys/sys_lobby_snapshot.cpp | 2 +- neo/sys/sys_lobby_users.cpp | 2 +- neo/sys/sys_local.cpp | 2 +- neo/sys/sys_localuser.cpp | 2 +- neo/sys/sys_profile.cpp | 2 +- neo/sys/sys_savegame.cpp | 2 +- neo/sys/sys_session_callbacks.cpp | 2 +- neo/sys/sys_session_local.cpp | 2 +- neo/sys/sys_session_savegames.cpp | 2 +- neo/sys/sys_signin.cpp | 2 +- neo/sys/sys_voicechat.cpp | 2 +- neo/sys/win32/win_achievements.cpp | 2 +- neo/sys/win32/win_cpu.cpp | 2 +- neo/sys/win32/win_glimp.cpp | 2 +- neo/sys/win32/win_input.cpp | 2 +- neo/sys/win32/win_input.h | 2 +- neo/sys/win32/win_localuser.cpp | 2 +- neo/sys/win32/win_main.cpp | 2 +- neo/sys/win32/win_net.cpp | 2 +- neo/sys/win32/win_qgl.cpp | 2 +- neo/sys/win32/win_savegame.cpp | 2 +- neo/sys/win32/win_session_local.cpp | 2 +- neo/sys/win32/win_shared.cpp | 2 +- neo/sys/win32/win_signin.cpp | 2 +- neo/sys/win32/win_snd.cpp | 2 +- neo/sys/win32/win_syscon.cpp | 2 +- neo/sys/win32/win_taskkeyhook.cpp | 2 +- neo/sys/win32/win_wndproc.cpp | 2 +- neo/ui/BindWindow.cpp | 2 +- neo/ui/ChoiceWindow.cpp | 2 +- neo/ui/DeviceContext.cpp | 2 +- neo/ui/EditWindow.cpp | 2 +- neo/ui/FieldWindow.cpp | 2 +- neo/ui/GameBearShootWindow.cpp | 2 +- neo/ui/GameBustOutWindow.cpp | 2 +- neo/ui/GameSSDWindow.cpp | 2 +- neo/ui/GuiScript.cpp | 2 +- neo/ui/ListGUI.cpp | 2 +- neo/ui/ListWindow.cpp | 2 +- neo/ui/RegExp.cpp | 2 +- neo/ui/RenderWindow.cpp | 2 +- neo/ui/SimpleWindow.cpp | 2 +- neo/ui/SliderWindow.cpp | 2 +- neo/ui/UserInterface.cpp | 2 +- neo/ui/Window.cpp | 2 +- neo/ui/Winvar.cpp | 2 +- 369 files changed, 508 insertions(+), 397 deletions(-) diff --git a/doomclassic/doom/d_main.cpp b/doomclassic/doom/d_main.cpp index d208d5fa..d4c4c9bc 100644 --- a/doomclassic/doom/d_main.cpp +++ b/doomclassic/doom/d_main.cpp @@ -73,7 +73,7 @@ If you have questions concerning this license or the applicable additional terms #include "d_main.h" -//#include "../idlib/precompiled.h" +//#include "precompiled.h" //#include "../Main/PlayerProfile.h" //#include "../Main/PSN/PS3_Session.h" #include "d3xp/Game_local.h" diff --git a/neo/CMakeLists.txt b/neo/CMakeLists.txt index 83f18124..28c90ad7 100644 --- a/neo/CMakeLists.txt +++ b/neo/CMakeLists.txt @@ -896,22 +896,22 @@ source_group("tools\\sound" FILES ${EDITOR_SOUND_INCLUDES}) source_group("tools\\sound" FILES ${EDITOR_SOUND_SOURCES}) -set(RBDOOM3_SOURCES - ${AAS_INCLUDES} ${AAS_SOURCES} - ${CM_INCLUDES} ${CM_SOURCES} - ${FRAMEWORK_INCLUDES} ${FRAMEWORK_SOURCES} - ${FRAMEWORK_ASYNC_INCLUDES} ${FRAMEWORK_ASYNC_SOURCES} - ${RENDERER_INCLUDES} ${RENDERER_SOURCES} - #${IRRXML_INCLUDES} ${IRRXML_SOURCES} - ${JPEG_INCLUDES} ${JPEG_SOURCES} - #${PNG_INCLUDES} ${PNG_SOURCES} - ${ZLIB_INCLUDES} ${ZLIB_SOURCES} - #${GLEW_INCLUDES} ${GLEW_SOURCES} +set(RBDOOM3_INCLUDES + ${AAS_INCLUDES} + ${CM_INCLUDES} + ${FRAMEWORK_INCLUDES} + ${FRAMEWORK_ASYNC_INCLUDES} + ${RENDERER_INCLUDES} + #${IRRXML_INCLUDES} + ${JPEG_INCLUDES} + #${PNG_INCLUDES} + ${ZLIB_INCLUDES} + #${GLEW_INCLUDES} #${FREETYPE_SOURCES} - ${SOUND_INCLUDES} ${SOUND_SOURCES} - #${OGGVORBIS_INCLUDES} ${OGGVORBIS_SOURCES} - ${UI_INCLUDES} ${UI_SOURCES} - ${SWF_INCLUDES} ${SWF_SOURCES} + ${SOUND_INCLUDES} + #${OGGVORBIS_INCLUDES} + ${UI_INCLUDES} + ${SWF_INCLUDES} #${COMPILER_INCLUDES} #${COMPILER_AAS_INCLUDES} ${COMPILER_AAS_SOURCES} @@ -919,6 +919,29 @@ set(RBDOOM3_SOURCES #${COMPILER_RENDERBUMP_INCLUDES} ${COMPILER_RENDERBUMP_SOURCES} #${COMPILER_ROQVQ_INCLUDES} ${COMPILER_ROQVQ_SOURCES} ) + +set(RBDOOM3_SOURCES + ${AAS_SOURCES} + ${CM_SOURCES} + ${FRAMEWORK_SOURCES} + ${FRAMEWORK_ASYNC_SOURCES} + ${RENDERER_SOURCES} + #${IRRXML_SOURCES} + ${JPEG_SOURCES} + #${PNG_SOURCES} + ${ZLIB_SOURCES} + #${GLEW_SOURCES} + #${FREETYPE_SOURCES} + ${SOUND_SOURCES} + #${OGGVORBIS_INCLUDES} ${OGGVORBIS_SOURCES} + ${UI_SOURCES} + ${SWF_SOURCES} + + #${COMPILER_AAS_SOURCES} + #${COMPILER_DMAP_SOURCES} + #${COMPILER_RENDERBUMP_SOURCES} + #${COMPILER_ROQVQ_SOURCES} + ) add_definitions(-D__DOOM__ #-DGLEW_STATIC @@ -927,20 +950,30 @@ add_definitions(-D__DOOM__ ) if(MONOLITH) + list(APPEND RBDOOM3_INCLUDES + ${GAMED3XP_INCLUDES} + ${GAMED3XP_AI_INCLUDES} + ${GAMED3XP_ANIM_INCLUDES} + ${GAMED3XP_GAMESYS_INCLUDES} + ${GAMED3XP_MENUS_INCLUDES} + ${GAMED3XP_PHYSICS_INCLUDES} + ${GAMED3XP_SCRIPT_INCLUDES}) + list(APPEND RBDOOM3_SOURCES - ${GAMED3XP_INCLUDES} ${GAMED3XP_SOURCES} - ${GAMED3XP_AI_INCLUDES} ${GAMED3XP_AI_SOURCES} - ${GAMED3XP_ANIM_INCLUDES} ${GAMED3XP_ANIM_SOURCES} - ${GAMED3XP_GAMESYS_INCLUDES} ${GAMED3XP_GAMESYS_SOURCES} - ${GAMED3XP_MENUS_INCLUDES} ${GAMED3XP_MENUS_SOURCES} - ${GAMED3XP_PHYSICS_INCLUDES} ${GAMED3XP_PHYSICS_SOURCES} - ${GAMED3XP_SCRIPT_INCLUDES} ${GAMED3XP_SCRIPT_SOURCES}) + ${GAMED3XP_SOURCES} + ${GAMED3XP_AI_SOURCES} + ${GAMED3XP_ANIM_SOURCES} + ${GAMED3XP_GAMESYS_SOURCES} + ${GAMED3XP_MENUS_SOURCES} + ${GAMED3XP_PHYSICS_SOURCES} + ${GAMED3XP_SCRIPT_SOURCES}) else() add_definitions(-D__DOOM_DLL__) endif() include_directories( . + idlib #libs/curl/include #libs/openal/include #libs/glew/include @@ -1000,18 +1033,54 @@ if(MSVC) ${EDITOR_SOUND_INCLUDES} ${EDITOR_SOUND_SOURCES}) endif() + list(APPEND RBDOOM3_INLCUDES + ${DOOMCLASSIC_INCLUDES} + ${TIMIDITY_INCLUDES} + + ${SYS_INCLUDES} + ${XAUDIO2_INCLUDES} + ${WIN32_INCLUDES}) + list(APPEND RBDOOM3_SOURCES - ${DOOMCLASSIC_INCLUDES} ${DOOMCLASSIC_SOURCES} - ${TIMIDITY_INCLUDES} ${TIMIDITY_SOURCES} - - ${SYS_INCLUDES} ${SYS_SOURCES} - ${XAUDIO2_INCLUDES} ${XAUDIO2_SOURCES} - ${WIN32_INCLUDES} ${WIN32_SOURCES} ${WIN32_RESOURCES}) + ${DOOMCLASSIC_SOURCES} + ${TIMIDITY_SOURCES} + ${SYS_SOURCES} + ${XAUDIO2_SOURCES} + ${WIN32_SOURCES}) list(REMOVE_DUPLICATES RBDOOM3_SOURCES) - add_executable(RBDoom3BFG WIN32 ${RBDOOM3_SOURCES}) + set(RBDOOM3_PRECOMPILED_SOURCES ${RBDOOM3_SOURCES}) + list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${TIMIDITY_SOURCES} ${JPEG_SOURCES} ${ZLIB_SOURCES}) + list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/renderer/DXT/DXTDecoder.cpp) + list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/renderer/DXT/DXTEncoder.cpp) + list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/renderer/DXT/DXTEncoder_SSE2.cpp) + list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/renderer/jobs/dynamicshadowvolume/DynamicShadowVolume.cpp) + list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/renderer/jobs/prelightshadowvolume/PreLightShadowVolume.cpp) + list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/renderer/jobs/staticshadowvolume/StaticShadowVolume.cpp) + list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/renderer/jobs/ShadowShared.cpp) + list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/renderer/RenderLog.cpp) + list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/../doomclassic/doom/i_sound_stub.cpp) + list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/../doomclassic/doom/i_sound_win32.cpp) + + foreach( src_file ${RBDOOM3_PRECOMPILED_SOURCES} ) + message(STATUS "/Yuprecompiled.h for ${src_file}") + set_source_files_properties( + ${src_file} + PROPERTIES + COMPILE_FLAGS "/Yuprecompiled.h" + ) + endforeach() + + set_source_files_properties(framework/precompiled.cpp + PROPERTIES + COMPILE_FLAGS "/Ycprecompiled.h" + ) + + list(APPEND RBDOOM3_SOURCES ${WIN32_RESOURCES}) + + add_executable(RBDoom3BFG WIN32 ${RBDOOM3_INCLUDES} ${RBDOOM3_SOURCES}) #add_custom_command(TARGET RBDoom3BFG # PRE_BUILD @@ -1033,6 +1102,16 @@ if(MSVC) winmm wsock32.lib ) + + #CMAKE_BINARY_DIR + # if(CMAKE_CL_64) + # install(TARGETS RBDoom3BFG + # RUNTIME DESTINATION ../bin/win64) + # else() + # install(TARGETS RBDoom3BFG + # RUNTIME DESTINATION ../bin/win32) + # endif() + else() list(APPEND RBDOOM3_SOURCES diff --git a/neo/aas/AASFile.cpp b/neo/aas/AASFile.cpp index 7b2990f9..ef2159ef 100644 --- a/neo/aas/AASFile.cpp +++ b/neo/aas/AASFile.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "AASFile.h" diff --git a/neo/aas/AASFileManager.cpp b/neo/aas/AASFileManager.cpp index 489aa2d3..eac1a7e1 100644 --- a/neo/aas/AASFileManager.cpp +++ b/neo/aas/AASFileManager.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "AASFile.h" diff --git a/neo/aas/AASFile_optimize.cpp b/neo/aas/AASFile_optimize.cpp index ed2bc179..41b47f5b 100644 --- a/neo/aas/AASFile_optimize.cpp +++ b/neo/aas/AASFile_optimize.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "AASFile.h" diff --git a/neo/aas/AASFile_sample.cpp b/neo/aas/AASFile_sample.cpp index c65c4468..38db6926 100644 --- a/neo/aas/AASFile_sample.cpp +++ b/neo/aas/AASFile_sample.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "AASFile.h" diff --git a/neo/cm/CollisionModel_contacts.cpp b/neo/cm/CollisionModel_contacts.cpp index 7cc03ad8..2018ea06 100644 --- a/neo/cm/CollisionModel_contacts.cpp +++ b/neo/cm/CollisionModel_contacts.cpp @@ -35,7 +35,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "CollisionModel_local.h" diff --git a/neo/cm/CollisionModel_contents.cpp b/neo/cm/CollisionModel_contents.cpp index ed361045..84e3f9b4 100644 --- a/neo/cm/CollisionModel_contents.cpp +++ b/neo/cm/CollisionModel_contents.cpp @@ -35,7 +35,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "CollisionModel_local.h" diff --git a/neo/cm/CollisionModel_debug.cpp b/neo/cm/CollisionModel_debug.cpp index c1957aec..f3b3a5bb 100644 --- a/neo/cm/CollisionModel_debug.cpp +++ b/neo/cm/CollisionModel_debug.cpp @@ -35,7 +35,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "CollisionModel_local.h" diff --git a/neo/cm/CollisionModel_files.cpp b/neo/cm/CollisionModel_files.cpp index 8e121302..7fa12c2a 100644 --- a/neo/cm/CollisionModel_files.cpp +++ b/neo/cm/CollisionModel_files.cpp @@ -35,7 +35,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "CollisionModel_local.h" diff --git a/neo/cm/CollisionModel_load.cpp b/neo/cm/CollisionModel_load.cpp index 3bf0371f..a0070ffd 100644 --- a/neo/cm/CollisionModel_load.cpp +++ b/neo/cm/CollisionModel_load.cpp @@ -46,7 +46,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "CollisionModel_local.h" diff --git a/neo/cm/CollisionModel_rotate.cpp b/neo/cm/CollisionModel_rotate.cpp index 91302992..a2a993e0 100644 --- a/neo/cm/CollisionModel_rotate.cpp +++ b/neo/cm/CollisionModel_rotate.cpp @@ -35,7 +35,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "CollisionModel_local.h" diff --git a/neo/cm/CollisionModel_trace.cpp b/neo/cm/CollisionModel_trace.cpp index 044ec282..b964a3ce 100644 --- a/neo/cm/CollisionModel_trace.cpp +++ b/neo/cm/CollisionModel_trace.cpp @@ -35,7 +35,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "CollisionModel_local.h" diff --git a/neo/cm/CollisionModel_translate.cpp b/neo/cm/CollisionModel_translate.cpp index 423e9d67..c7e29c4b 100644 --- a/neo/cm/CollisionModel_translate.cpp +++ b/neo/cm/CollisionModel_translate.cpp @@ -35,7 +35,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "CollisionModel_local.h" diff --git a/neo/d3xp/AF.cpp b/neo/d3xp/AF.cpp index 9aa191b4..6078e361 100644 --- a/neo/d3xp/AF.cpp +++ b/neo/d3xp/AF.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop #include "Game_local.h" diff --git a/neo/d3xp/AFEntity.cpp b/neo/d3xp/AFEntity.cpp index 255f2b2d..af7b65e2 100644 --- a/neo/d3xp/AFEntity.cpp +++ b/neo/d3xp/AFEntity.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop #include "Game_local.h" diff --git a/neo/d3xp/Achievements.cpp b/neo/d3xp/Achievements.cpp index 1034dd97..505fa0ea 100644 --- a/neo/d3xp/Achievements.cpp +++ b/neo/d3xp/Achievements.cpp @@ -25,7 +25,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop #include "Game_local.h" diff --git a/neo/d3xp/Actor.cpp b/neo/d3xp/Actor.cpp index bd8e594e..b60bdcb2 100644 --- a/neo/d3xp/Actor.cpp +++ b/neo/d3xp/Actor.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop #include "Game_local.h" diff --git a/neo/d3xp/AimAssist.cpp b/neo/d3xp/AimAssist.cpp index 9e262cac..87b9ecb1 100644 --- a/neo/d3xp/AimAssist.cpp +++ b/neo/d3xp/AimAssist.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop #include "Game_local.h" diff --git a/neo/d3xp/BrittleFracture.cpp b/neo/d3xp/BrittleFracture.cpp index 8f9d13f7..9feac69c 100644 --- a/neo/d3xp/BrittleFracture.cpp +++ b/neo/d3xp/BrittleFracture.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop #include "Game_local.h" diff --git a/neo/d3xp/Camera.cpp b/neo/d3xp/Camera.cpp index b0eabcf6..f93cf2b7 100644 --- a/neo/d3xp/Camera.cpp +++ b/neo/d3xp/Camera.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop #include "Game_local.h" diff --git a/neo/d3xp/Entity.cpp b/neo/d3xp/Entity.cpp index e2a2d3e9..b350826e 100644 --- a/neo/d3xp/Entity.cpp +++ b/neo/d3xp/Entity.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop #include "Game_local.h" diff --git a/neo/d3xp/Fx.cpp b/neo/d3xp/Fx.cpp index 4ad08e86..3d568b45 100644 --- a/neo/d3xp/Fx.cpp +++ b/neo/d3xp/Fx.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop #include "Game_local.h" diff --git a/neo/d3xp/GameEdit.cpp b/neo/d3xp/GameEdit.cpp index 9a3167fc..ca2c625f 100644 --- a/neo/d3xp/GameEdit.cpp +++ b/neo/d3xp/GameEdit.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop #include "Game_local.h" diff --git a/neo/d3xp/Game_local.cpp b/neo/d3xp/Game_local.cpp index 1e89d212..eb6c2583 100644 --- a/neo/d3xp/Game_local.cpp +++ b/neo/d3xp/Game_local.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop #include "Game_local.h" diff --git a/neo/d3xp/Game_network.cpp b/neo/d3xp/Game_network.cpp index e89f8ed7..fcb1592a 100644 --- a/neo/d3xp/Game_network.cpp +++ b/neo/d3xp/Game_network.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop #include "Game_local.h" diff --git a/neo/d3xp/Grabber.cpp b/neo/d3xp/Grabber.cpp index 2e5e1dd5..da3be331 100644 --- a/neo/d3xp/Grabber.cpp +++ b/neo/d3xp/Grabber.cpp @@ -25,7 +25,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop diff --git a/neo/d3xp/IK.cpp b/neo/d3xp/IK.cpp index 175bbf35..dfaec182 100644 --- a/neo/d3xp/IK.cpp +++ b/neo/d3xp/IK.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop #include "Game_local.h" diff --git a/neo/d3xp/Item.cpp b/neo/d3xp/Item.cpp index 90477c60..72babee2 100644 --- a/neo/d3xp/Item.cpp +++ b/neo/d3xp/Item.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop #include "Game_local.h" diff --git a/neo/d3xp/Leaderboards.cpp b/neo/d3xp/Leaderboards.cpp index e6b51769..9dde755d 100644 --- a/neo/d3xp/Leaderboards.cpp +++ b/neo/d3xp/Leaderboards.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop #include "Game_local.h" diff --git a/neo/d3xp/Light.cpp b/neo/d3xp/Light.cpp index 0c7c6ef8..6814901f 100644 --- a/neo/d3xp/Light.cpp +++ b/neo/d3xp/Light.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop #include "Game_local.h" diff --git a/neo/d3xp/Misc.cpp b/neo/d3xp/Misc.cpp index ae3d48e6..6f700da5 100644 --- a/neo/d3xp/Misc.cpp +++ b/neo/d3xp/Misc.cpp @@ -31,7 +31,7 @@ Various utility objects and functions. */ -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop #include "Game_local.h" diff --git a/neo/d3xp/Moveable.cpp b/neo/d3xp/Moveable.cpp index 9c4484ec..752854fb 100644 --- a/neo/d3xp/Moveable.cpp +++ b/neo/d3xp/Moveable.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop #include "Game_local.h" diff --git a/neo/d3xp/Mover.cpp b/neo/d3xp/Mover.cpp index eaf10371..c9dd88a9 100644 --- a/neo/d3xp/Mover.cpp +++ b/neo/d3xp/Mover.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop #include "Game_local.h" diff --git a/neo/d3xp/MultiplayerGame.cpp b/neo/d3xp/MultiplayerGame.cpp index d4df8fcd..a14c6dac 100644 --- a/neo/d3xp/MultiplayerGame.cpp +++ b/neo/d3xp/MultiplayerGame.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop #include "Game_local.h" diff --git a/neo/d3xp/Player.cpp b/neo/d3xp/Player.cpp index 9a55fd34..d350bbe1 100644 --- a/neo/d3xp/Player.cpp +++ b/neo/d3xp/Player.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop #include "Game_local.h" diff --git a/neo/d3xp/PlayerIcon.cpp b/neo/d3xp/PlayerIcon.cpp index dc2cb846..252f4365 100644 --- a/neo/d3xp/PlayerIcon.cpp +++ b/neo/d3xp/PlayerIcon.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop #include "Game_local.h" diff --git a/neo/d3xp/PlayerView.cpp b/neo/d3xp/PlayerView.cpp index 31605689..b1f1d82e 100644 --- a/neo/d3xp/PlayerView.cpp +++ b/neo/d3xp/PlayerView.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop #include "Game_local.h" diff --git a/neo/d3xp/Projectile.cpp b/neo/d3xp/Projectile.cpp index 9758b0d2..385a75d0 100644 --- a/neo/d3xp/Projectile.cpp +++ b/neo/d3xp/Projectile.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop #include "Game_local.h" diff --git a/neo/d3xp/Pvs.cpp b/neo/d3xp/Pvs.cpp index 8e4cefec..5ea43df6 100644 --- a/neo/d3xp/Pvs.cpp +++ b/neo/d3xp/Pvs.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop #include "Game_local.h" diff --git a/neo/d3xp/SecurityCamera.cpp b/neo/d3xp/SecurityCamera.cpp index 65e90e30..4bc98455 100644 --- a/neo/d3xp/SecurityCamera.cpp +++ b/neo/d3xp/SecurityCamera.cpp @@ -33,7 +33,7 @@ If you have questions concerning this license or the applicable additional terms */ -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop #include "Game_local.h" diff --git a/neo/d3xp/SmokeParticles.cpp b/neo/d3xp/SmokeParticles.cpp index 30cd2d2e..b62b3a4d 100644 --- a/neo/d3xp/SmokeParticles.cpp +++ b/neo/d3xp/SmokeParticles.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop #include "Game_local.h" diff --git a/neo/d3xp/Sound.cpp b/neo/d3xp/Sound.cpp index a72aa1bb..92be369a 100644 --- a/neo/d3xp/Sound.cpp +++ b/neo/d3xp/Sound.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop #include "Game_local.h" diff --git a/neo/d3xp/Target.cpp b/neo/d3xp/Target.cpp index 491fa924..5b45bcbd 100644 --- a/neo/d3xp/Target.cpp +++ b/neo/d3xp/Target.cpp @@ -31,7 +31,7 @@ Invisible entities that affect other entities or the world when activated. */ -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop #include "Game_local.h" diff --git a/neo/d3xp/Trigger.cpp b/neo/d3xp/Trigger.cpp index 87562bc1..b8616f4b 100644 --- a/neo/d3xp/Trigger.cpp +++ b/neo/d3xp/Trigger.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop #include "Game_local.h" diff --git a/neo/d3xp/Weapon.cpp b/neo/d3xp/Weapon.cpp index 01d25f83..1afd7caf 100644 --- a/neo/d3xp/Weapon.cpp +++ b/neo/d3xp/Weapon.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop #include "Game_local.h" diff --git a/neo/d3xp/WorldSpawn.cpp b/neo/d3xp/WorldSpawn.cpp index b3e50ea8..b077b692 100644 --- a/neo/d3xp/WorldSpawn.cpp +++ b/neo/d3xp/WorldSpawn.cpp @@ -32,7 +32,7 @@ Worldspawn class. Each map has one worldspawn which handles global spawnargs. */ -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop #include "Game_local.h" diff --git a/neo/d3xp/ai/AAS.cpp b/neo/d3xp/ai/AAS.cpp index 9f07035e..af606b88 100644 --- a/neo/d3xp/ai/AAS.cpp +++ b/neo/d3xp/ai/AAS.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "AAS_local.h" diff --git a/neo/d3xp/ai/AAS_debug.cpp b/neo/d3xp/ai/AAS_debug.cpp index c24bcb71..ab6d03d2 100644 --- a/neo/d3xp/ai/AAS_debug.cpp +++ b/neo/d3xp/ai/AAS_debug.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "AAS_local.h" #include "../Game_local.h" // for cvars and debug drawing diff --git a/neo/d3xp/ai/AAS_pathing.cpp b/neo/d3xp/ai/AAS_pathing.cpp index 740b3e8b..499e2f7a 100644 --- a/neo/d3xp/ai/AAS_pathing.cpp +++ b/neo/d3xp/ai/AAS_pathing.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "AAS_local.h" diff --git a/neo/d3xp/ai/AAS_routing.cpp b/neo/d3xp/ai/AAS_routing.cpp index 32a5f4d7..aa9bd1c3 100644 --- a/neo/d3xp/ai/AAS_routing.cpp +++ b/neo/d3xp/ai/AAS_routing.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "AAS_local.h" diff --git a/neo/d3xp/ai/AI.cpp b/neo/d3xp/ai/AI.cpp index e40353ec..2c8509d0 100644 --- a/neo/d3xp/ai/AI.cpp +++ b/neo/d3xp/ai/AI.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" diff --git a/neo/d3xp/ai/AI_Vagary.cpp b/neo/d3xp/ai/AI_Vagary.cpp index 3e850fb2..279287e3 100644 --- a/neo/d3xp/ai/AI_Vagary.cpp +++ b/neo/d3xp/ai/AI_Vagary.cpp @@ -34,7 +34,7 @@ Vagary specific AI code ***********************************************************************/ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" diff --git a/neo/d3xp/ai/AI_events.cpp b/neo/d3xp/ai/AI_events.cpp index f69200a6..9acad090 100644 --- a/neo/d3xp/ai/AI_events.cpp +++ b/neo/d3xp/ai/AI_events.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" diff --git a/neo/d3xp/ai/AI_pathing.cpp b/neo/d3xp/ai/AI_pathing.cpp index 756e1ba1..22a09529 100644 --- a/neo/d3xp/ai/AI_pathing.cpp +++ b/neo/d3xp/ai/AI_pathing.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" diff --git a/neo/d3xp/anim/Anim.cpp b/neo/d3xp/anim/Anim.cpp index c39d3f5d..2b675667 100644 --- a/neo/d3xp/anim/Anim.cpp +++ b/neo/d3xp/anim/Anim.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" diff --git a/neo/d3xp/anim/Anim_Blend.cpp b/neo/d3xp/anim/Anim_Blend.cpp index a850ad53..cacf5f16 100644 --- a/neo/d3xp/anim/Anim_Blend.cpp +++ b/neo/d3xp/anim/Anim_Blend.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" diff --git a/neo/d3xp/anim/Anim_Testmodel.cpp b/neo/d3xp/anim/Anim_Testmodel.cpp index 42e37d27..10538196 100644 --- a/neo/d3xp/anim/Anim_Testmodel.cpp +++ b/neo/d3xp/anim/Anim_Testmodel.cpp @@ -49,7 +49,7 @@ move around it to view it from different angles. */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" diff --git a/neo/d3xp/gamesys/Class.cpp b/neo/d3xp/gamesys/Class.cpp index e2ea595d..a25b2932 100644 --- a/neo/d3xp/gamesys/Class.cpp +++ b/neo/d3xp/gamesys/Class.cpp @@ -34,7 +34,7 @@ instancing of objects. */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" diff --git a/neo/d3xp/gamesys/Event.cpp b/neo/d3xp/gamesys/Event.cpp index 84ace22a..72665775 100644 --- a/neo/d3xp/gamesys/Event.cpp +++ b/neo/d3xp/gamesys/Event.cpp @@ -34,7 +34,7 @@ Event are used for scheduling tasks and for linking script commands. */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" diff --git a/neo/d3xp/gamesys/SaveGame.cpp b/neo/d3xp/gamesys/SaveGame.cpp index 2bd40670..a2519110 100644 --- a/neo/d3xp/gamesys/SaveGame.cpp +++ b/neo/d3xp/gamesys/SaveGame.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" diff --git a/neo/d3xp/gamesys/SysCmds.cpp b/neo/d3xp/gamesys/SysCmds.cpp index e48e5d94..a127455c 100644 --- a/neo/d3xp/gamesys/SysCmds.cpp +++ b/neo/d3xp/gamesys/SysCmds.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" diff --git a/neo/d3xp/gamesys/SysCvar.cpp b/neo/d3xp/gamesys/SysCvar.cpp index 1694713a..061c614b 100644 --- a/neo/d3xp/gamesys/SysCvar.cpp +++ b/neo/d3xp/gamesys/SysCvar.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" diff --git a/neo/d3xp/menus/MenuHandler.cpp b/neo/d3xp/menus/MenuHandler.cpp index ba8133d3..7bd316f3 100644 --- a/neo/d3xp/menus/MenuHandler.cpp +++ b/neo/d3xp/menus/MenuHandler.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" extern idCVar in_useJoystick; diff --git a/neo/d3xp/menus/MenuHandler_HUD.cpp b/neo/d3xp/menus/MenuHandler_HUD.cpp index 469ba316..8b4ff69e 100644 --- a/neo/d3xp/menus/MenuHandler_HUD.cpp +++ b/neo/d3xp/menus/MenuHandler_HUD.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" static const int TIP_DISPLAY_TIME = 5000; diff --git a/neo/d3xp/menus/MenuHandler_PDA.cpp b/neo/d3xp/menus/MenuHandler_PDA.cpp index 875295a5..b112f4bb 100644 --- a/neo/d3xp/menus/MenuHandler_PDA.cpp +++ b/neo/d3xp/menus/MenuHandler_PDA.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" static const int MAX_PDA_ITEMS = 15; diff --git a/neo/d3xp/menus/MenuHandler_Scoreboard.cpp b/neo/d3xp/menus/MenuHandler_Scoreboard.cpp index f952d1be..74005056 100644 --- a/neo/d3xp/menus/MenuHandler_Scoreboard.cpp +++ b/neo/d3xp/menus/MenuHandler_Scoreboard.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" /* diff --git a/neo/d3xp/menus/MenuHandler_Shell.cpp b/neo/d3xp/menus/MenuHandler_Shell.cpp index fe49108b..44aa7b73 100644 --- a/neo/d3xp/menus/MenuHandler_Shell.cpp +++ b/neo/d3xp/menus/MenuHandler_Shell.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" diff --git a/neo/d3xp/menus/MenuScreen.cpp b/neo/d3xp/menus/MenuScreen.cpp index 8012a478..df1785d0 100644 --- a/neo/d3xp/menus/MenuScreen.cpp +++ b/neo/d3xp/menus/MenuScreen.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" idMenuScreen::idMenuScreen() diff --git a/neo/d3xp/menus/MenuScreen_HUD.cpp b/neo/d3xp/menus/MenuScreen_HUD.cpp index c85db895..9e2af61d 100644 --- a/neo/d3xp/menus/MenuScreen_HUD.cpp +++ b/neo/d3xp/menus/MenuScreen_HUD.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" extern idCVar pm_stamina; diff --git a/neo/d3xp/menus/MenuScreen_PDA_Inventory.cpp b/neo/d3xp/menus/MenuScreen_PDA_Inventory.cpp index 8cebe634..3340487b 100644 --- a/neo/d3xp/menus/MenuScreen_PDA_Inventory.cpp +++ b/neo/d3xp/menus/MenuScreen_PDA_Inventory.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" static const int NUM_INVENTORY_ITEMS_VISIBLE = 9; diff --git a/neo/d3xp/menus/MenuScreen_PDA_UserData.cpp b/neo/d3xp/menus/MenuScreen_PDA_UserData.cpp index 91ed81e8..79ad1444 100644 --- a/neo/d3xp/menus/MenuScreen_PDA_UserData.cpp +++ b/neo/d3xp/menus/MenuScreen_PDA_UserData.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" diff --git a/neo/d3xp/menus/MenuScreen_PDA_UserEmails.cpp b/neo/d3xp/menus/MenuScreen_PDA_UserEmails.cpp index 3d34fcb1..7137ba71 100644 --- a/neo/d3xp/menus/MenuScreen_PDA_UserEmails.cpp +++ b/neo/d3xp/menus/MenuScreen_PDA_UserEmails.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" /* diff --git a/neo/d3xp/menus/MenuScreen_PDA_VideoDisks.cpp b/neo/d3xp/menus/MenuScreen_PDA_VideoDisks.cpp index 0471c923..cf16b638 100644 --- a/neo/d3xp/menus/MenuScreen_PDA_VideoDisks.cpp +++ b/neo/d3xp/menus/MenuScreen_PDA_VideoDisks.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" static const int MAX_VIDEO_ITEMS = 5; diff --git a/neo/d3xp/menus/MenuScreen_Scoreboard.cpp b/neo/d3xp/menus/MenuScreen_Scoreboard.cpp index a1a5975b..bedcc790 100644 --- a/neo/d3xp/menus/MenuScreen_Scoreboard.cpp +++ b/neo/d3xp/menus/MenuScreen_Scoreboard.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" //*************************************************************** diff --git a/neo/d3xp/menus/MenuScreen_Shell_Bindings.cpp b/neo/d3xp/menus/MenuScreen_Shell_Bindings.cpp index bf7937e9..48c4a2fb 100644 --- a/neo/d3xp/menus/MenuScreen_Shell_Bindings.cpp +++ b/neo/d3xp/menus/MenuScreen_Shell_Bindings.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" typedef struct diff --git a/neo/d3xp/menus/MenuScreen_Shell_Browser.cpp b/neo/d3xp/menus/MenuScreen_Shell_Browser.cpp index c288c60e..03525d63 100644 --- a/neo/d3xp/menus/MenuScreen_Shell_Browser.cpp +++ b/neo/d3xp/menus/MenuScreen_Shell_Browser.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" enum browserCommand_t diff --git a/neo/d3xp/menus/MenuScreen_Shell_ControllerLayout.cpp b/neo/d3xp/menus/MenuScreen_Shell_ControllerLayout.cpp index 0b831f0f..45e8c861 100644 --- a/neo/d3xp/menus/MenuScreen_Shell_ControllerLayout.cpp +++ b/neo/d3xp/menus/MenuScreen_Shell_ControllerLayout.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" const static int NUM_LAYOUT_OPTIONS = 1; diff --git a/neo/d3xp/menus/MenuScreen_Shell_Controls.cpp b/neo/d3xp/menus/MenuScreen_Shell_Controls.cpp index c2e0875b..6ab42514 100644 --- a/neo/d3xp/menus/MenuScreen_Shell_Controls.cpp +++ b/neo/d3xp/menus/MenuScreen_Shell_Controls.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" const static int NUM_CONTROLS_OPTIONS = 8; diff --git a/neo/d3xp/menus/MenuScreen_Shell_Credits.cpp b/neo/d3xp/menus/MenuScreen_Shell_Credits.cpp index 3a4ceada..27dd694c 100644 --- a/neo/d3xp/menus/MenuScreen_Shell_Credits.cpp +++ b/neo/d3xp/menus/MenuScreen_Shell_Credits.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" static const int NUM_CREDIT_LINES = 16; diff --git a/neo/d3xp/menus/MenuScreen_Shell_Dev.cpp b/neo/d3xp/menus/MenuScreen_Shell_Dev.cpp index 54d1bb97..155e2df4 100644 --- a/neo/d3xp/menus/MenuScreen_Shell_Dev.cpp +++ b/neo/d3xp/menus/MenuScreen_Shell_Dev.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" const static int NUM_DEV_OPTIONS = 8; diff --git a/neo/d3xp/menus/MenuScreen_Shell_Difficulty.cpp b/neo/d3xp/menus/MenuScreen_Shell_Difficulty.cpp index 9f0745a8..db0fdc28 100644 --- a/neo/d3xp/menus/MenuScreen_Shell_Difficulty.cpp +++ b/neo/d3xp/menus/MenuScreen_Shell_Difficulty.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" const static int NUM_SETTING_OPTIONS = 8; diff --git a/neo/d3xp/menus/MenuScreen_Shell_GameLobby.cpp b/neo/d3xp/menus/MenuScreen_Shell_GameLobby.cpp index be741e51..44183664 100644 --- a/neo/d3xp/menus/MenuScreen_Shell_GameLobby.cpp +++ b/neo/d3xp/menus/MenuScreen_Shell_GameLobby.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" const static int NUM_LOBBY_OPTIONS = 8; diff --git a/neo/d3xp/menus/MenuScreen_Shell_GameOptions.cpp b/neo/d3xp/menus/MenuScreen_Shell_GameOptions.cpp index 6a6218c7..d7f0aca1 100644 --- a/neo/d3xp/menus/MenuScreen_Shell_GameOptions.cpp +++ b/neo/d3xp/menus/MenuScreen_Shell_GameOptions.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" const static int NUM_GAME_OPTIONS_OPTIONS = 8; diff --git a/neo/d3xp/menus/MenuScreen_Shell_Gamepad.cpp b/neo/d3xp/menus/MenuScreen_Shell_Gamepad.cpp index 14878497..79baad42 100644 --- a/neo/d3xp/menus/MenuScreen_Shell_Gamepad.cpp +++ b/neo/d3xp/menus/MenuScreen_Shell_Gamepad.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" const static int NUM_CONTROLS_OPTIONS = 8; diff --git a/neo/d3xp/menus/MenuScreen_Shell_Leaderboards.cpp b/neo/d3xp/menus/MenuScreen_Shell_Leaderboards.cpp index a04bedda..f411dec4 100644 --- a/neo/d3xp/menus/MenuScreen_Shell_Leaderboards.cpp +++ b/neo/d3xp/menus/MenuScreen_Shell_Leaderboards.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" const static int NUM_LEADERBOARD_ITEMS = 16; diff --git a/neo/d3xp/menus/MenuScreen_Shell_Load.cpp b/neo/d3xp/menus/MenuScreen_Shell_Load.cpp index 9b01b12a..2974f5b9 100644 --- a/neo/d3xp/menus/MenuScreen_Shell_Load.cpp +++ b/neo/d3xp/menus/MenuScreen_Shell_Load.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" diff --git a/neo/d3xp/menus/MenuScreen_Shell_MatchSettings.cpp b/neo/d3xp/menus/MenuScreen_Shell_MatchSettings.cpp index 71d5d4bc..8d4ebe9e 100644 --- a/neo/d3xp/menus/MenuScreen_Shell_MatchSettings.cpp +++ b/neo/d3xp/menus/MenuScreen_Shell_MatchSettings.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" const static int NUM_GAME_OPTIONS_OPTIONS = 8; diff --git a/neo/d3xp/menus/MenuScreen_Shell_ModeSelect.cpp b/neo/d3xp/menus/MenuScreen_Shell_ModeSelect.cpp index 0d78d280..967ddb9c 100644 --- a/neo/d3xp/menus/MenuScreen_Shell_ModeSelect.cpp +++ b/neo/d3xp/menus/MenuScreen_Shell_ModeSelect.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" const static int NUM_SETTING_OPTIONS = 8; diff --git a/neo/d3xp/menus/MenuScreen_Shell_NewGame.cpp b/neo/d3xp/menus/MenuScreen_Shell_NewGame.cpp index 152f708d..32d10956 100644 --- a/neo/d3xp/menus/MenuScreen_Shell_NewGame.cpp +++ b/neo/d3xp/menus/MenuScreen_Shell_NewGame.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" const static int NUM_NEW_GAME_OPTIONS = 8; diff --git a/neo/d3xp/menus/MenuScreen_Shell_PartyLobby.cpp b/neo/d3xp/menus/MenuScreen_Shell_PartyLobby.cpp index 20f44f66..2fc5806f 100644 --- a/neo/d3xp/menus/MenuScreen_Shell_PartyLobby.cpp +++ b/neo/d3xp/menus/MenuScreen_Shell_PartyLobby.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" const static int NUM_LOBBY_OPTIONS = 8; diff --git a/neo/d3xp/menus/MenuScreen_Shell_Pause.cpp b/neo/d3xp/menus/MenuScreen_Shell_Pause.cpp index 071124cd..3dae09f5 100644 --- a/neo/d3xp/menus/MenuScreen_Shell_Pause.cpp +++ b/neo/d3xp/menus/MenuScreen_Shell_Pause.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" extern idCVar g_demoMode; diff --git a/neo/d3xp/menus/MenuScreen_Shell_Playstation.cpp b/neo/d3xp/menus/MenuScreen_Shell_Playstation.cpp index 1609ee10..92b64a04 100644 --- a/neo/d3xp/menus/MenuScreen_Shell_Playstation.cpp +++ b/neo/d3xp/menus/MenuScreen_Shell_Playstation.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" const static int NUM_SETTING_OPTIONS = 8; diff --git a/neo/d3xp/menus/MenuScreen_Shell_PressStart.cpp b/neo/d3xp/menus/MenuScreen_Shell_PressStart.cpp index 6452b766..0c7c16f4 100644 --- a/neo/d3xp/menus/MenuScreen_Shell_PressStart.cpp +++ b/neo/d3xp/menus/MenuScreen_Shell_PressStart.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" #include "../../framework/Common_local.h" diff --git a/neo/d3xp/menus/MenuScreen_Shell_Resolution.cpp b/neo/d3xp/menus/MenuScreen_Shell_Resolution.cpp index a234338f..a0389795 100644 --- a/neo/d3xp/menus/MenuScreen_Shell_Resolution.cpp +++ b/neo/d3xp/menus/MenuScreen_Shell_Resolution.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" #include "../../renderer/tr_local.h" diff --git a/neo/d3xp/menus/MenuScreen_Shell_Root.cpp b/neo/d3xp/menus/MenuScreen_Shell_Root.cpp index c93fecc3..025d84de 100644 --- a/neo/d3xp/menus/MenuScreen_Shell_Root.cpp +++ b/neo/d3xp/menus/MenuScreen_Shell_Root.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" extern idCVar g_demoMode; diff --git a/neo/d3xp/menus/MenuScreen_Shell_Save.cpp b/neo/d3xp/menus/MenuScreen_Shell_Save.cpp index d83b568b..ee0addc1 100644 --- a/neo/d3xp/menus/MenuScreen_Shell_Save.cpp +++ b/neo/d3xp/menus/MenuScreen_Shell_Save.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" diff --git a/neo/d3xp/menus/MenuScreen_Shell_Settings.cpp b/neo/d3xp/menus/MenuScreen_Shell_Settings.cpp index 274e5c86..80e428b9 100644 --- a/neo/d3xp/menus/MenuScreen_Shell_Settings.cpp +++ b/neo/d3xp/menus/MenuScreen_Shell_Settings.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" const static int NUM_SETTING_OPTIONS = 8; diff --git a/neo/d3xp/menus/MenuScreen_Shell_Singleplayer.cpp b/neo/d3xp/menus/MenuScreen_Shell_Singleplayer.cpp index 3db41207..2cef5ac9 100644 --- a/neo/d3xp/menus/MenuScreen_Shell_Singleplayer.cpp +++ b/neo/d3xp/menus/MenuScreen_Shell_Singleplayer.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" const static int NUM_SINGLEPLAYER_OPTIONS = 8; diff --git a/neo/d3xp/menus/MenuScreen_Shell_Stereoscopics.cpp b/neo/d3xp/menus/MenuScreen_Shell_Stereoscopics.cpp index 97d77267..52d39c10 100644 --- a/neo/d3xp/menus/MenuScreen_Shell_Stereoscopics.cpp +++ b/neo/d3xp/menus/MenuScreen_Shell_Stereoscopics.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" const static int NUM_SYSTEM_OPTIONS_OPTIONS = 4; diff --git a/neo/d3xp/menus/MenuScreen_Shell_SystemOptions.cpp b/neo/d3xp/menus/MenuScreen_Shell_SystemOptions.cpp index c020b14e..b11ca75e 100644 --- a/neo/d3xp/menus/MenuScreen_Shell_SystemOptions.cpp +++ b/neo/d3xp/menus/MenuScreen_Shell_SystemOptions.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" const static int NUM_SYSTEM_OPTIONS_OPTIONS = 8; diff --git a/neo/d3xp/menus/MenuWidget.cpp b/neo/d3xp/menus/MenuWidget.cpp index 14352e11..bf996470 100644 --- a/neo/d3xp/menus/MenuWidget.cpp +++ b/neo/d3xp/menus/MenuWidget.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" /* diff --git a/neo/d3xp/menus/MenuWidget_Button.cpp b/neo/d3xp/menus/MenuWidget_Button.cpp index 74ef2485..ca57e9a7 100644 --- a/neo/d3xp/menus/MenuWidget_Button.cpp +++ b/neo/d3xp/menus/MenuWidget_Button.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" /* diff --git a/neo/d3xp/menus/MenuWidget_Carousel.cpp b/neo/d3xp/menus/MenuWidget_Carousel.cpp index c7e7b0bf..32be6190 100644 --- a/neo/d3xp/menus/MenuWidget_Carousel.cpp +++ b/neo/d3xp/menus/MenuWidget_Carousel.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" void idMenuWidget_Carousel::Initialize( idMenuHandler* data ) diff --git a/neo/d3xp/menus/MenuWidget_CommandBar.cpp b/neo/d3xp/menus/MenuWidget_CommandBar.cpp index 327537a1..7f484584 100644 --- a/neo/d3xp/menus/MenuWidget_CommandBar.cpp +++ b/neo/d3xp/menus/MenuWidget_CommandBar.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" /* diff --git a/neo/d3xp/menus/MenuWidget_DynamicList.cpp b/neo/d3xp/menus/MenuWidget_DynamicList.cpp index a09d8b70..f941465e 100644 --- a/neo/d3xp/menus/MenuWidget_DynamicList.cpp +++ b/neo/d3xp/menus/MenuWidget_DynamicList.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" /* diff --git a/neo/d3xp/menus/MenuWidget_Help.cpp b/neo/d3xp/menus/MenuWidget_Help.cpp index 8b84417a..242ee47a 100644 --- a/neo/d3xp/menus/MenuWidget_Help.cpp +++ b/neo/d3xp/menus/MenuWidget_Help.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" /* diff --git a/neo/d3xp/menus/MenuWidget_InfoBox.cpp b/neo/d3xp/menus/MenuWidget_InfoBox.cpp index 1ec2b8cb..55b93455 100644 --- a/neo/d3xp/menus/MenuWidget_InfoBox.cpp +++ b/neo/d3xp/menus/MenuWidget_InfoBox.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" /* diff --git a/neo/d3xp/menus/MenuWidget_ItemAssignment.cpp b/neo/d3xp/menus/MenuWidget_ItemAssignment.cpp index 522d1f4b..397ffa4e 100644 --- a/neo/d3xp/menus/MenuWidget_ItemAssignment.cpp +++ b/neo/d3xp/menus/MenuWidget_ItemAssignment.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" void idMenuWidget_ItemAssignment::SetIcon( int index, const idMaterial* icon ) diff --git a/neo/d3xp/menus/MenuWidget_List.cpp b/neo/d3xp/menus/MenuWidget_List.cpp index 3800ae99..557203c7 100644 --- a/neo/d3xp/menus/MenuWidget_List.cpp +++ b/neo/d3xp/menus/MenuWidget_List.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" /* diff --git a/neo/d3xp/menus/MenuWidget_LobbyList.cpp b/neo/d3xp/menus/MenuWidget_LobbyList.cpp index 21be0411..6f9099f3 100644 --- a/neo/d3xp/menus/MenuWidget_LobbyList.cpp +++ b/neo/d3xp/menus/MenuWidget_LobbyList.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" /* diff --git a/neo/d3xp/menus/MenuWidget_MenuBar.cpp b/neo/d3xp/menus/MenuWidget_MenuBar.cpp index 9fe252b6..206d5614 100644 --- a/neo/d3xp/menus/MenuWidget_MenuBar.cpp +++ b/neo/d3xp/menus/MenuWidget_MenuBar.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" /* diff --git a/neo/d3xp/menus/MenuWidget_NavBar.cpp b/neo/d3xp/menus/MenuWidget_NavBar.cpp index dfba6740..fed59f1f 100644 --- a/neo/d3xp/menus/MenuWidget_NavBar.cpp +++ b/neo/d3xp/menus/MenuWidget_NavBar.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" /* diff --git a/neo/d3xp/menus/MenuWidget_NavButton.cpp b/neo/d3xp/menus/MenuWidget_NavButton.cpp index 4168c08a..26a648c1 100644 --- a/neo/d3xp/menus/MenuWidget_NavButton.cpp +++ b/neo/d3xp/menus/MenuWidget_NavButton.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" /* diff --git a/neo/d3xp/menus/MenuWidget_PDA_AudioFiles.cpp b/neo/d3xp/menus/MenuWidget_PDA_AudioFiles.cpp index 73882998..86842050 100644 --- a/neo/d3xp/menus/MenuWidget_PDA_AudioFiles.cpp +++ b/neo/d3xp/menus/MenuWidget_PDA_AudioFiles.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" static const int MAX_AUDIO_ITEMS = 3; diff --git a/neo/d3xp/menus/MenuWidget_PDA_EmailInbox.cpp b/neo/d3xp/menus/MenuWidget_PDA_EmailInbox.cpp index 2cc3debe..89e4d64d 100644 --- a/neo/d3xp/menus/MenuWidget_PDA_EmailInbox.cpp +++ b/neo/d3xp/menus/MenuWidget_PDA_EmailInbox.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" static const int MAX_EMAIL_ITEMS = 7; diff --git a/neo/d3xp/menus/MenuWidget_PDA_Objective.cpp b/neo/d3xp/menus/MenuWidget_PDA_Objective.cpp index 6fd352e0..47ac2a93 100644 --- a/neo/d3xp/menus/MenuWidget_PDA_Objective.cpp +++ b/neo/d3xp/menus/MenuWidget_PDA_Objective.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" /* diff --git a/neo/d3xp/menus/MenuWidget_PDA_UserData.cpp b/neo/d3xp/menus/MenuWidget_PDA_UserData.cpp index 8e646bb7..013aec3b 100644 --- a/neo/d3xp/menus/MenuWidget_PDA_UserData.cpp +++ b/neo/d3xp/menus/MenuWidget_PDA_UserData.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" /* diff --git a/neo/d3xp/menus/MenuWidget_PDA_VideoInfo.cpp b/neo/d3xp/menus/MenuWidget_PDA_VideoInfo.cpp index 6165c2f6..5575d2a7 100644 --- a/neo/d3xp/menus/MenuWidget_PDA_VideoInfo.cpp +++ b/neo/d3xp/menus/MenuWidget_PDA_VideoInfo.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" void idMenuWidget_PDA_VideoInfo::Update() diff --git a/neo/d3xp/menus/MenuWidget_Scrollbar.cpp b/neo/d3xp/menus/MenuWidget_Scrollbar.cpp index 346e3314..595396c7 100644 --- a/neo/d3xp/menus/MenuWidget_Scrollbar.cpp +++ b/neo/d3xp/menus/MenuWidget_Scrollbar.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" void idMenuWidget_ScrollBar::Initialize( idMenuHandler* data ) diff --git a/neo/d3xp/menus/MenuWidget_Shell_SaveInfo.cpp b/neo/d3xp/menus/MenuWidget_Shell_SaveInfo.cpp index f16394af..556450e1 100644 --- a/neo/d3xp/menus/MenuWidget_Shell_SaveInfo.cpp +++ b/neo/d3xp/menus/MenuWidget_Shell_SaveInfo.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" /* diff --git a/neo/d3xp/physics/Clip.cpp b/neo/d3xp/physics/Clip.cpp index 3e0a643a..b33acc1d 100644 --- a/neo/d3xp/physics/Clip.cpp +++ b/neo/d3xp/physics/Clip.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" diff --git a/neo/d3xp/physics/Force.cpp b/neo/d3xp/physics/Force.cpp index c625bb1c..a448a6e4 100644 --- a/neo/d3xp/physics/Force.cpp +++ b/neo/d3xp/physics/Force.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" diff --git a/neo/d3xp/physics/Force_Constant.cpp b/neo/d3xp/physics/Force_Constant.cpp index 0a42836e..026f054b 100644 --- a/neo/d3xp/physics/Force_Constant.cpp +++ b/neo/d3xp/physics/Force_Constant.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" diff --git a/neo/d3xp/physics/Force_Drag.cpp b/neo/d3xp/physics/Force_Drag.cpp index 853130f0..d5cccf99 100644 --- a/neo/d3xp/physics/Force_Drag.cpp +++ b/neo/d3xp/physics/Force_Drag.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" diff --git a/neo/d3xp/physics/Force_Field.cpp b/neo/d3xp/physics/Force_Field.cpp index 6db9ec23..5c132fe4 100644 --- a/neo/d3xp/physics/Force_Field.cpp +++ b/neo/d3xp/physics/Force_Field.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" diff --git a/neo/d3xp/physics/Force_Grab.cpp b/neo/d3xp/physics/Force_Grab.cpp index 17172c8d..ec48d96e 100644 --- a/neo/d3xp/physics/Force_Grab.cpp +++ b/neo/d3xp/physics/Force_Grab.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" diff --git a/neo/d3xp/physics/Force_Spring.cpp b/neo/d3xp/physics/Force_Spring.cpp index 8aef58c7..b88bf32f 100644 --- a/neo/d3xp/physics/Force_Spring.cpp +++ b/neo/d3xp/physics/Force_Spring.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" diff --git a/neo/d3xp/physics/Physics.cpp b/neo/d3xp/physics/Physics.cpp index 3ee3f3a5..873ee4d6 100644 --- a/neo/d3xp/physics/Physics.cpp +++ b/neo/d3xp/physics/Physics.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" diff --git a/neo/d3xp/physics/Physics_AF.cpp b/neo/d3xp/physics/Physics_AF.cpp index 96334f08..dc85fee8 100644 --- a/neo/d3xp/physics/Physics_AF.cpp +++ b/neo/d3xp/physics/Physics_AF.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" diff --git a/neo/d3xp/physics/Physics_Actor.cpp b/neo/d3xp/physics/Physics_Actor.cpp index b812b5db..c835656f 100644 --- a/neo/d3xp/physics/Physics_Actor.cpp +++ b/neo/d3xp/physics/Physics_Actor.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" diff --git a/neo/d3xp/physics/Physics_Base.cpp b/neo/d3xp/physics/Physics_Base.cpp index bcf7ff6b..041788bc 100644 --- a/neo/d3xp/physics/Physics_Base.cpp +++ b/neo/d3xp/physics/Physics_Base.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" diff --git a/neo/d3xp/physics/Physics_Monster.cpp b/neo/d3xp/physics/Physics_Monster.cpp index c4ff0b08..78a59e70 100644 --- a/neo/d3xp/physics/Physics_Monster.cpp +++ b/neo/d3xp/physics/Physics_Monster.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" diff --git a/neo/d3xp/physics/Physics_Parametric.cpp b/neo/d3xp/physics/Physics_Parametric.cpp index 0cdaf577..a4047143 100644 --- a/neo/d3xp/physics/Physics_Parametric.cpp +++ b/neo/d3xp/physics/Physics_Parametric.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" diff --git a/neo/d3xp/physics/Physics_Player.cpp b/neo/d3xp/physics/Physics_Player.cpp index 6aed0046..0f5b41d9 100644 --- a/neo/d3xp/physics/Physics_Player.cpp +++ b/neo/d3xp/physics/Physics_Player.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" diff --git a/neo/d3xp/physics/Physics_RigidBody.cpp b/neo/d3xp/physics/Physics_RigidBody.cpp index e01ba4aa..97023e88 100644 --- a/neo/d3xp/physics/Physics_RigidBody.cpp +++ b/neo/d3xp/physics/Physics_RigidBody.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" diff --git a/neo/d3xp/physics/Physics_Static.cpp b/neo/d3xp/physics/Physics_Static.cpp index 1ae13cb3..9f2e85ea 100644 --- a/neo/d3xp/physics/Physics_Static.cpp +++ b/neo/d3xp/physics/Physics_Static.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" diff --git a/neo/d3xp/physics/Physics_StaticMulti.cpp b/neo/d3xp/physics/Physics_StaticMulti.cpp index dedfaecc..d3f5313c 100644 --- a/neo/d3xp/physics/Physics_StaticMulti.cpp +++ b/neo/d3xp/physics/Physics_StaticMulti.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" diff --git a/neo/d3xp/physics/Push.cpp b/neo/d3xp/physics/Push.cpp index dd9eeece..28da3833 100644 --- a/neo/d3xp/physics/Push.cpp +++ b/neo/d3xp/physics/Push.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" diff --git a/neo/d3xp/precompiled.cpp b/neo/d3xp/precompiled.cpp index 605995e9..e669d27b 100644 --- a/neo/d3xp/precompiled.cpp +++ b/neo/d3xp/precompiled.cpp @@ -26,4 +26,4 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ -#include "../idlib/precompiled.h" +#include "precompiled.h" diff --git a/neo/d3xp/script/Script_Compiler.cpp b/neo/d3xp/script/Script_Compiler.cpp index 5652fc51..3d3f287d 100644 --- a/neo/d3xp/script/Script_Compiler.cpp +++ b/neo/d3xp/script/Script_Compiler.cpp @@ -28,7 +28,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" diff --git a/neo/d3xp/script/Script_Interpreter.cpp b/neo/d3xp/script/Script_Interpreter.cpp index c342dda7..8f3f906c 100644 --- a/neo/d3xp/script/Script_Interpreter.cpp +++ b/neo/d3xp/script/Script_Interpreter.cpp @@ -28,7 +28,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" diff --git a/neo/d3xp/script/Script_Program.cpp b/neo/d3xp/script/Script_Program.cpp index ac1629cb..856e883f 100644 --- a/neo/d3xp/script/Script_Program.cpp +++ b/neo/d3xp/script/Script_Program.cpp @@ -28,7 +28,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" diff --git a/neo/d3xp/script/Script_Thread.cpp b/neo/d3xp/script/Script_Thread.cpp index 9f9ee12d..b1424c18 100644 --- a/neo/d3xp/script/Script_Thread.cpp +++ b/neo/d3xp/script/Script_Thread.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../Game_local.h" diff --git a/neo/framework/CVarSystem.cpp b/neo/framework/CVarSystem.cpp index 46855a2f..f1fb77c7 100644 --- a/neo/framework/CVarSystem.cpp +++ b/neo/framework/CVarSystem.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop idCVar* idCVar::staticVars = NULL; diff --git a/neo/framework/CmdSystem.cpp b/neo/framework/CmdSystem.cpp index cbcb4cfd..dc84f934 100644 --- a/neo/framework/CmdSystem.cpp +++ b/neo/framework/CmdSystem.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop #ifdef ID_RETAIL diff --git a/neo/framework/Common.cpp b/neo/framework/Common.cpp index cdcab498..163da51a 100644 --- a/neo/framework/Common.cpp +++ b/neo/framework/Common.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop #include "Common_local.h" diff --git a/neo/framework/Common_demos.cpp b/neo/framework/Common_demos.cpp index 5821ca08..26c08813 100644 --- a/neo/framework/Common_demos.cpp +++ b/neo/framework/Common_demos.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop #include "Common_local.h" diff --git a/neo/framework/Common_dialog.cpp b/neo/framework/Common_dialog.cpp index 519bf15d..e3ac99b0 100644 --- a/neo/framework/Common_dialog.cpp +++ b/neo/framework/Common_dialog.cpp @@ -25,7 +25,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop #include "Common_dialog.h" diff --git a/neo/framework/Common_load.cpp b/neo/framework/Common_load.cpp index e9264df2..17388d30 100644 --- a/neo/framework/Common_load.cpp +++ b/neo/framework/Common_load.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop #include "Common_local.h" diff --git a/neo/framework/Common_localize.cpp b/neo/framework/Common_localize.cpp index 2c77d647..eac6bbee 100644 --- a/neo/framework/Common_localize.cpp +++ b/neo/framework/Common_localize.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop #include "Common_local.h" diff --git a/neo/framework/Common_menu.cpp b/neo/framework/Common_menu.cpp index 7e3aecdb..c76e4565 100644 --- a/neo/framework/Common_menu.cpp +++ b/neo/framework/Common_menu.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop #include "Common_local.h" diff --git a/neo/framework/Common_network.cpp b/neo/framework/Common_network.cpp index b21eddd0..38ccea52 100644 --- a/neo/framework/Common_network.cpp +++ b/neo/framework/Common_network.cpp @@ -25,7 +25,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop #include "Common_local.h" diff --git a/neo/framework/Common_printf.cpp b/neo/framework/Common_printf.cpp index 7ae3468b..363fb8ab 100644 --- a/neo/framework/Common_printf.cpp +++ b/neo/framework/Common_printf.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop #include "Common_local.h" diff --git a/neo/framework/Compressor.cpp b/neo/framework/Compressor.cpp index e386eb36..7c0aeb80 100644 --- a/neo/framework/Compressor.cpp +++ b/neo/framework/Compressor.cpp @@ -25,7 +25,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop diff --git a/neo/framework/Console.cpp b/neo/framework/Console.cpp index 33d3175a..2cec293a 100644 --- a/neo/framework/Console.cpp +++ b/neo/framework/Console.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "ConsoleHistory.h" #include "../renderer/ResolutionScale.h" #include "Common_local.h" diff --git a/neo/framework/ConsoleHistory.cpp b/neo/framework/ConsoleHistory.cpp index 8fa4b703..bdfa835b 100644 --- a/neo/framework/ConsoleHistory.cpp +++ b/neo/framework/ConsoleHistory.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "ConsoleHistory.h" idConsoleHistory consoleHistory; diff --git a/neo/framework/DebugGraph.cpp b/neo/framework/DebugGraph.cpp index 44ccd5aa..33e93b1a 100644 --- a/neo/framework/DebugGraph.cpp +++ b/neo/framework/DebugGraph.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" /* ================================================================================================ diff --git a/neo/framework/DeclAF.cpp b/neo/framework/DeclAF.cpp index 5dd6b515..d799e652 100644 --- a/neo/framework/DeclAF.cpp +++ b/neo/framework/DeclAF.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop /* diff --git a/neo/framework/DeclEntityDef.cpp b/neo/framework/DeclEntityDef.cpp index 92f6366f..90f3581a 100644 --- a/neo/framework/DeclEntityDef.cpp +++ b/neo/framework/DeclEntityDef.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop diff --git a/neo/framework/DeclFX.cpp b/neo/framework/DeclFX.cpp index e3ed3341..a61693ce 100644 --- a/neo/framework/DeclFX.cpp +++ b/neo/framework/DeclFX.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop diff --git a/neo/framework/DeclManager.cpp b/neo/framework/DeclManager.cpp index 83072a50..0750eb2d 100644 --- a/neo/framework/DeclManager.cpp +++ b/neo/framework/DeclManager.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop /* diff --git a/neo/framework/DeclPDA.cpp b/neo/framework/DeclPDA.cpp index 81468f07..688a39cb 100644 --- a/neo/framework/DeclPDA.cpp +++ b/neo/framework/DeclPDA.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop idCVar g_useOldPDAStrings( "g_useOldPDAStrings", "0", CVAR_BOOL, "Read strings from the .pda files rather than from the .lang file" ); diff --git a/neo/framework/DeclParticle.cpp b/neo/framework/DeclParticle.cpp index 331bd3a2..4a913fa5 100644 --- a/neo/framework/DeclParticle.cpp +++ b/neo/framework/DeclParticle.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop idCVar binaryLoadParticles( "binaryLoadParticles", "1", 0, "enable binary load/write of particle decls" ); diff --git a/neo/framework/DeclSkin.cpp b/neo/framework/DeclSkin.cpp index 3293f794..39e94298 100644 --- a/neo/framework/DeclSkin.cpp +++ b/neo/framework/DeclSkin.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop diff --git a/neo/framework/DeclTable.cpp b/neo/framework/DeclTable.cpp index 4c86b4ac..c4e69057 100644 --- a/neo/framework/DeclTable.cpp +++ b/neo/framework/DeclTable.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop diff --git a/neo/framework/DemoFile.cpp b/neo/framework/DemoFile.cpp index c55045dc..612e1ce1 100644 --- a/neo/framework/DemoFile.cpp +++ b/neo/framework/DemoFile.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop idCVar idDemoFile::com_logDemos( "com_logDemos", "0", CVAR_SYSTEM | CVAR_BOOL, "Write demo.log with debug information in it" ); diff --git a/neo/framework/EditField.cpp b/neo/framework/EditField.cpp index 5895a27b..7932ea81 100644 --- a/neo/framework/EditField.cpp +++ b/neo/framework/EditField.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop static autoComplete_t globalAutoComplete; diff --git a/neo/framework/EventLoop.cpp b/neo/framework/EventLoop.cpp index 38d693a4..f8ac7621 100644 --- a/neo/framework/EventLoop.cpp +++ b/neo/framework/EventLoop.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop idCVar idEventLoop::com_journal( "com_journal", "0", CVAR_INIT | CVAR_SYSTEM, "1 = record journal, 2 = play back journal", 0, 2, idCmdSystem::ArgCompletion_Integer<0, 2> ); diff --git a/neo/framework/File.cpp b/neo/framework/File.cpp index 426999d2..b3736a01 100644 --- a/neo/framework/File.cpp +++ b/neo/framework/File.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop #include "Unzip.h" diff --git a/neo/framework/FileSystem.cpp b/neo/framework/FileSystem.cpp index ae6d4f2c..59cd719a 100644 --- a/neo/framework/FileSystem.cpp +++ b/neo/framework/FileSystem.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop #include "Unzip.h" diff --git a/neo/framework/File_Manifest.cpp b/neo/framework/File_Manifest.cpp index 44ac50b9..8650cc2e 100644 --- a/neo/framework/File_Manifest.cpp +++ b/neo/framework/File_Manifest.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop diff --git a/neo/framework/File_Resource.cpp b/neo/framework/File_Resource.cpp index 8f8a995b..a929c96b 100644 --- a/neo/framework/File_Resource.cpp +++ b/neo/framework/File_Resource.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop /* diff --git a/neo/framework/File_SaveGame.cpp b/neo/framework/File_SaveGame.cpp index 4a5edc71..83ed54ea 100644 --- a/neo/framework/File_SaveGame.cpp +++ b/neo/framework/File_SaveGame.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "File_SaveGame.h" diff --git a/neo/framework/KeyInput.cpp b/neo/framework/KeyInput.cpp index 6adf36d7..4bc9a0ef 100644 --- a/neo/framework/KeyInput.cpp +++ b/neo/framework/KeyInput.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop typedef struct diff --git a/neo/framework/PlayerProfile.cpp b/neo/framework/PlayerProfile.cpp index d7df8a9a..953c8149 100644 --- a/neo/framework/PlayerProfile.cpp +++ b/neo/framework/PlayerProfile.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop #include "PlayerProfile.h" diff --git a/neo/framework/TokenParser.cpp b/neo/framework/TokenParser.cpp index 99ee5302..0797cd64 100644 --- a/neo/framework/TokenParser.cpp +++ b/neo/framework/TokenParser.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop void idTokenParser::LoadFromParser( idParser& parser, const char* guiName ) diff --git a/neo/framework/Unzip.cpp b/neo/framework/Unzip.cpp index aacc8e17..63f06354 100644 --- a/neo/framework/Unzip.cpp +++ b/neo/framework/Unzip.cpp @@ -1,4 +1,4 @@ -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop #include "Unzip.h" diff --git a/neo/framework/UsercmdGen.cpp b/neo/framework/UsercmdGen.cpp index 2f0d9e57..f3c0e2dd 100644 --- a/neo/framework/UsercmdGen.cpp +++ b/neo/framework/UsercmdGen.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop idCVar joy_mergedThreshold( "joy_mergedThreshold", "1", CVAR_BOOL | CVAR_ARCHIVE, "If the thresholds aren't merged, you drift more off center" ); diff --git a/neo/framework/Zip.cpp b/neo/framework/Zip.cpp index df9a089d..87b8ddf8 100644 --- a/neo/framework/Zip.cpp +++ b/neo/framework/Zip.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop /* diff --git a/neo/framework/common_frame.cpp b/neo/framework/common_frame.cpp index d8d843e9..4d053fee 100644 --- a/neo/framework/common_frame.cpp +++ b/neo/framework/common_frame.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma hdrstop #include "Common_local.h" diff --git a/neo/framework/precompiled.cpp b/neo/framework/precompiled.cpp index 605995e9..e669d27b 100644 --- a/neo/framework/precompiled.cpp +++ b/neo/framework/precompiled.cpp @@ -26,4 +26,4 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ -#include "../idlib/precompiled.h" +#include "precompiled.h" diff --git a/neo/idlib/CMakeLists.txt b/neo/idlib/CMakeLists.txt index e9ac39e1..2772810d 100644 --- a/neo/idlib/CMakeLists.txt +++ b/neo/idlib/CMakeLists.txt @@ -5,7 +5,7 @@ file(GLOB_RECURSE ID_INCLUDES *.h) file(GLOB_RECURSE ID_SOURCES *.cpp) if(MSVC) - list(REMOVE_ITEM ID_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/sys/posix/posix_thread.cpp) + list(REMOVE_ITEM ID_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/sys/posix/posix_thread.cpp) else() list(REMOVE_ITEM ID_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/sys/win32/win_thread.cpp) endif() @@ -13,5 +13,37 @@ endif() #if(STANDALONE) # add_definitions(-DSTANDALONE) #endif() + +if(MSVC) + + #set_target_properties(idlib PROPERTIES COMPILE_FLAGS "/Yuprecompiled.h") + + set(ID_PRECOMPILED_SOURCES ${ID_SOURCES}) + list(REMOVE_ITEM ID_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/geometry/RenderMatrix.cpp) + list(REMOVE_ITEM ID_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/SoftwareCache.cpp) + + foreach( src_file ${ID_PRECOMPILED_SOURCES} ) + #message(STATUS "/Yuprecompiled.h for ${src_file}") + set_source_files_properties( + ${src_file} + PROPERTIES + COMPILE_FLAGS "/Yuprecompiled.h" + ) + endforeach() + + set_source_files_properties(precompiled.cpp + PROPERTIES + COMPILE_FLAGS "/Ycprecompiled.h" + ) +endif() add_library(idlib ${ID_SOURCES} ${ID_INCLUDES}) + +# if(MSVC) + # # set_source_files_properties(precompiled.cpp + # # PROPERTIES + # # COMPILE_FLAGS "/Ycprecompiled.h" + # # ) + + # #set_target_properties(idlib PROPERTIES COMPILE_FLAGS "/Yuprecompiled.h") +# endif() diff --git a/neo/idlib/Heap.cpp b/neo/idlib/Heap.cpp index 6db9d9be..e4ea9cad 100644 --- a/neo/idlib/Heap.cpp +++ b/neo/idlib/Heap.cpp @@ -29,7 +29,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" //=============================================================== // diff --git a/neo/idlib/bv/Bounds.cpp b/neo/idlib/bv/Bounds.cpp index 490e79b5..68026871 100644 --- a/neo/idlib/bv/Bounds.cpp +++ b/neo/idlib/bv/Bounds.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../precompiled.h" +#include "precompiled.h" idBounds bounds_zero( vec3_zero, vec3_zero ); idBounds bounds_zeroOneCube( idVec3( 0.0f ), idVec3( 1.0f ) ); diff --git a/neo/idlib/bv/Box.cpp b/neo/idlib/bv/Box.cpp index 3d037835..7929a6f7 100644 --- a/neo/idlib/bv/Box.cpp +++ b/neo/idlib/bv/Box.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../precompiled.h" +#include "precompiled.h" idBox box_zero( vec3_zero, vec3_zero, mat3_identity ); diff --git a/neo/idlib/bv/Sphere.cpp b/neo/idlib/bv/Sphere.cpp index df1cbae7..30f64bd4 100644 --- a/neo/idlib/bv/Sphere.cpp +++ b/neo/idlib/bv/Sphere.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../precompiled.h" +#include "precompiled.h" idSphere sphere_zero( vec3_zero, 0.0f ); diff --git a/neo/idlib/containers/HashIndex.cpp b/neo/idlib/containers/HashIndex.cpp index 922edb0b..eb131fcf 100644 --- a/neo/idlib/containers/HashIndex.cpp +++ b/neo/idlib/containers/HashIndex.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../precompiled.h" +#include "precompiled.h" int idHashIndex::INVALID_INDEX[1] = { -1 }; diff --git a/neo/idlib/geometry/DrawVert.cpp b/neo/idlib/geometry/DrawVert.cpp index cdc63a45..da3397b3 100644 --- a/neo/idlib/geometry/DrawVert.cpp +++ b/neo/idlib/geometry/DrawVert.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../precompiled.h" +#include "precompiled.h" /* ============ diff --git a/neo/idlib/geometry/JointTransform.cpp b/neo/idlib/geometry/JointTransform.cpp index c197aef0..62cd6607 100644 --- a/neo/idlib/geometry/JointTransform.cpp +++ b/neo/idlib/geometry/JointTransform.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../precompiled.h" +#include "precompiled.h" /* ============= diff --git a/neo/idlib/geometry/Surface.cpp b/neo/idlib/geometry/Surface.cpp index e4e49675..cd6ca5fb 100644 --- a/neo/idlib/geometry/Surface.cpp +++ b/neo/idlib/geometry/Surface.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../precompiled.h" +#include "precompiled.h" /* ================= diff --git a/neo/idlib/geometry/Surface_Patch.cpp b/neo/idlib/geometry/Surface_Patch.cpp index b5c6daea..84d1977b 100644 --- a/neo/idlib/geometry/Surface_Patch.cpp +++ b/neo/idlib/geometry/Surface_Patch.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../precompiled.h" +#include "precompiled.h" /* ================= diff --git a/neo/idlib/geometry/Surface_Polytope.cpp b/neo/idlib/geometry/Surface_Polytope.cpp index d804af9a..acc58c40 100644 --- a/neo/idlib/geometry/Surface_Polytope.cpp +++ b/neo/idlib/geometry/Surface_Polytope.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../precompiled.h" +#include "precompiled.h" #define POLYTOPE_VERTEX_EPSILON 0.1f diff --git a/neo/idlib/geometry/Surface_SweptSpline.cpp b/neo/idlib/geometry/Surface_SweptSpline.cpp index 087b9683..de35acc1 100644 --- a/neo/idlib/geometry/Surface_SweptSpline.cpp +++ b/neo/idlib/geometry/Surface_SweptSpline.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../precompiled.h" +#include "precompiled.h" /* ==================== diff --git a/neo/idlib/geometry/TraceModel.cpp b/neo/idlib/geometry/TraceModel.cpp index fb73d7fe..57fda89a 100644 --- a/neo/idlib/geometry/TraceModel.cpp +++ b/neo/idlib/geometry/TraceModel.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "TraceModel.h" /* diff --git a/neo/idlib/geometry/Winding.cpp b/neo/idlib/geometry/Winding.cpp index e2988818..0a95197a 100644 --- a/neo/idlib/geometry/Winding.cpp +++ b/neo/idlib/geometry/Winding.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../precompiled.h" +#include "precompiled.h" //=============================================================== // diff --git a/neo/idlib/geometry/Winding2D.cpp b/neo/idlib/geometry/Winding2D.cpp index 9da9f608..c07c6fd3 100644 --- a/neo/idlib/geometry/Winding2D.cpp +++ b/neo/idlib/geometry/Winding2D.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../precompiled.h" +#include "precompiled.h" #include "Winding2D.h" /* diff --git a/neo/idlib/hashing/CRC32.cpp b/neo/idlib/hashing/CRC32.cpp index 78a42c33..e2590104 100644 --- a/neo/idlib/hashing/CRC32.cpp +++ b/neo/idlib/hashing/CRC32.cpp @@ -1,6 +1,6 @@ #pragma hdrstop -#include "../precompiled.h" +#include "precompiled.h" /* CRC-32 diff --git a/neo/idlib/hashing/MD4.cpp b/neo/idlib/hashing/MD4.cpp index e0ea4272..157039c0 100644 --- a/neo/idlib/hashing/MD4.cpp +++ b/neo/idlib/hashing/MD4.cpp @@ -1,6 +1,6 @@ #pragma hdrstop -#include "../precompiled.h" +#include "precompiled.h" /* RSA Data Security, Inc., MD4 message-digest algorithm. (RFC1320) diff --git a/neo/idlib/hashing/MD5.cpp b/neo/idlib/hashing/MD5.cpp index 27990f9a..ddc3e134 100644 --- a/neo/idlib/hashing/MD5.cpp +++ b/neo/idlib/hashing/MD5.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../precompiled.h" +#include "precompiled.h" /* ================================================================================================ diff --git a/neo/idlib/math/Angles.cpp b/neo/idlib/math/Angles.cpp index af17c3b4..e12feee8 100644 --- a/neo/idlib/math/Angles.cpp +++ b/neo/idlib/math/Angles.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../precompiled.h" +#include "precompiled.h" #include diff --git a/neo/idlib/math/Complex.cpp b/neo/idlib/math/Complex.cpp index 31c407f2..dfcfefac 100644 --- a/neo/idlib/math/Complex.cpp +++ b/neo/idlib/math/Complex.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../precompiled.h" +#include "precompiled.h" idComplex complex_origin( 0.0f, 0.0f ); diff --git a/neo/idlib/math/Lcp.cpp b/neo/idlib/math/Lcp.cpp index 1391b48a..8f80c926 100644 --- a/neo/idlib/math/Lcp.cpp +++ b/neo/idlib/math/Lcp.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../precompiled.h" +#include "precompiled.h" // this file is full of intentional case fall throughs //lint -e616 diff --git a/neo/idlib/math/MatX.cpp b/neo/idlib/math/MatX.cpp index 495dcdbb..0f936246 100644 --- a/neo/idlib/math/MatX.cpp +++ b/neo/idlib/math/MatX.cpp @@ -28,7 +28,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../precompiled.h" +#include "precompiled.h" //=============================================================== // diff --git a/neo/idlib/math/Math.cpp b/neo/idlib/math/Math.cpp index b9374402..3b8e4b3b 100644 --- a/neo/idlib/math/Math.cpp +++ b/neo/idlib/math/Math.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../precompiled.h" +#include "precompiled.h" const int SMALLEST_NON_DENORMAL = 1 << IEEE_FLT_MANTISSA_BITS; const int NAN_VALUE = 0x7f800000; diff --git a/neo/idlib/math/Matrix.cpp b/neo/idlib/math/Matrix.cpp index 7fb85a68..c7286109 100644 --- a/neo/idlib/math/Matrix.cpp +++ b/neo/idlib/math/Matrix.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../precompiled.h" +#include "precompiled.h" //=============================================================== // diff --git a/neo/idlib/math/Ode.cpp b/neo/idlib/math/Ode.cpp index 777f421f..3e275575 100644 --- a/neo/idlib/math/Ode.cpp +++ b/neo/idlib/math/Ode.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../precompiled.h" +#include "precompiled.h" //=============================================================== // diff --git a/neo/idlib/math/Plane.cpp b/neo/idlib/math/Plane.cpp index 1b84ffb8..bd4ea3b3 100644 --- a/neo/idlib/math/Plane.cpp +++ b/neo/idlib/math/Plane.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../precompiled.h" +#include "precompiled.h" idPlane plane_origin( 0.0f, 0.0f, 0.0f, 0.0f ); diff --git a/neo/idlib/math/Pluecker.cpp b/neo/idlib/math/Pluecker.cpp index 7fff8116..0721b863 100644 --- a/neo/idlib/math/Pluecker.cpp +++ b/neo/idlib/math/Pluecker.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../precompiled.h" +#include "precompiled.h" idPluecker pluecker_origin( 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f ); diff --git a/neo/idlib/math/Polynomial.cpp b/neo/idlib/math/Polynomial.cpp index 5117f799..71ede197 100644 --- a/neo/idlib/math/Polynomial.cpp +++ b/neo/idlib/math/Polynomial.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../precompiled.h" +#include "precompiled.h" const float EPSILON = 1e-6f; diff --git a/neo/idlib/math/Quat.cpp b/neo/idlib/math/Quat.cpp index f4526b6e..1bf6800a 100644 --- a/neo/idlib/math/Quat.cpp +++ b/neo/idlib/math/Quat.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../precompiled.h" +#include "precompiled.h" /* ===================== diff --git a/neo/idlib/math/Rotation.cpp b/neo/idlib/math/Rotation.cpp index 88d3b64f..7c18d546 100644 --- a/neo/idlib/math/Rotation.cpp +++ b/neo/idlib/math/Rotation.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../precompiled.h" +#include "precompiled.h" /* ============ diff --git a/neo/idlib/math/Simd.cpp b/neo/idlib/math/Simd.cpp index e29c6651..49deedfd 100644 --- a/neo/idlib/math/Simd.cpp +++ b/neo/idlib/math/Simd.cpp @@ -28,7 +28,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../precompiled.h" +#include "precompiled.h" #include "Simd_Generic.h" #include "Simd_SSE.h" diff --git a/neo/idlib/math/Simd_Generic.cpp b/neo/idlib/math/Simd_Generic.cpp index c50d330a..21a7a191 100644 --- a/neo/idlib/math/Simd_Generic.cpp +++ b/neo/idlib/math/Simd_Generic.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../precompiled.h" +#include "precompiled.h" #include "Simd_Generic.h" //=============================================================== diff --git a/neo/idlib/math/Simd_SSE.cpp b/neo/idlib/math/Simd_SSE.cpp index 93c4a742..ed333479 100644 --- a/neo/idlib/math/Simd_SSE.cpp +++ b/neo/idlib/math/Simd_SSE.cpp @@ -28,7 +28,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../precompiled.h" +#include "precompiled.h" #include "Simd_Generic.h" #include "Simd_SSE.h" diff --git a/neo/idlib/math/VecX.cpp b/neo/idlib/math/VecX.cpp index c6f0bbd6..0f7a537d 100644 --- a/neo/idlib/math/VecX.cpp +++ b/neo/idlib/math/VecX.cpp @@ -28,7 +28,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../precompiled.h" +#include "precompiled.h" //=============================================================== // diff --git a/neo/idlib/math/Vector.cpp b/neo/idlib/math/Vector.cpp index 109ac867..01ad355c 100644 --- a/neo/idlib/math/Vector.cpp +++ b/neo/idlib/math/Vector.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../precompiled.h" +#include "precompiled.h" idVec2 vec2_origin( 0.0f, 0.0f ); idVec3 vec3_origin( 0.0f, 0.0f, 0.0f ); diff --git a/neo/idlib/sys/sys_assert.cpp b/neo/idlib/sys/sys_assert.cpp index 5f1df4cc..0045b288 100644 --- a/neo/idlib/sys/sys_assert.cpp +++ b/neo/idlib/sys/sys_assert.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../precompiled.h" +#include "precompiled.h" /* ================================================================================================ diff --git a/neo/idlib/sys/win32/win_thread.cpp b/neo/idlib/sys/win32/win_thread.cpp index 33d9636e..058b3b3e 100644 --- a/neo/idlib/sys/win32/win_thread.cpp +++ b/neo/idlib/sys/win32/win_thread.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../precompiled.h" +#include "precompiled.h" /* ================================================================================================ diff --git a/neo/libs/timidity/common.cpp b/neo/libs/timidity/common.cpp index fe22de18..ab95c77b 100644 --- a/neo/libs/timidity/common.cpp +++ b/neo/libs/timidity/common.cpp @@ -21,7 +21,7 @@ common.c */ -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include #include diff --git a/neo/libs/timidity/instrum.cpp b/neo/libs/timidity/instrum.cpp index 81e4f428..25eb5b7f 100644 --- a/neo/libs/timidity/instrum.cpp +++ b/neo/libs/timidity/instrum.cpp @@ -23,7 +23,7 @@ Code to load and unload GUS-compatible instrument patches. */ -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include #include diff --git a/neo/libs/timidity/readmidi.cpp b/neo/libs/timidity/readmidi.cpp index 7298f917..37b244b6 100644 --- a/neo/libs/timidity/readmidi.cpp +++ b/neo/libs/timidity/readmidi.cpp @@ -19,7 +19,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include #include diff --git a/neo/libs/timidity/sdl_c.cpp b/neo/libs/timidity/sdl_c.cpp index ecc10de1..39741368 100644 --- a/neo/libs/timidity/sdl_c.cpp +++ b/neo/libs/timidity/sdl_c.cpp @@ -21,7 +21,7 @@ sdl_c.c Minimal control mode -- no interaction, just stores messages. */ -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include #include diff --git a/neo/libs/timidity/timidity.cpp b/neo/libs/timidity/timidity.cpp index 89a79501..10591bc0 100644 --- a/neo/libs/timidity/timidity.cpp +++ b/neo/libs/timidity/timidity.cpp @@ -19,7 +19,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include #include diff --git a/neo/renderer/AutoRender.cpp b/neo/renderer/AutoRender.cpp index 9d90b60e..439195f6 100644 --- a/neo/renderer/AutoRender.cpp +++ b/neo/renderer/AutoRender.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "tr_local.h" const int AUTO_RENDER_STACK_SIZE = 256 * 1024; diff --git a/neo/renderer/AutoRenderBink.cpp b/neo/renderer/AutoRenderBink.cpp index 048fa8ff..18a0d8e7 100644 --- a/neo/renderer/AutoRenderBink.cpp +++ b/neo/renderer/AutoRenderBink.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "tr_local.h" #include "../sound/snd_local.h" diff --git a/neo/renderer/BinaryImage.cpp b/neo/renderer/BinaryImage.cpp index 4808656f..10796f2f 100644 --- a/neo/renderer/BinaryImage.cpp +++ b/neo/renderer/BinaryImage.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" /* ================================================================================================ diff --git a/neo/renderer/BoundsTrack.cpp b/neo/renderer/BoundsTrack.cpp index 78306769..52f028ea 100644 --- a/neo/renderer/BoundsTrack.cpp +++ b/neo/renderer/BoundsTrack.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #undef min // windef.h macros diff --git a/neo/renderer/BufferObject.cpp b/neo/renderer/BufferObject.cpp index 1bb0744a..a6f9986a 100644 --- a/neo/renderer/BufferObject.cpp +++ b/neo/renderer/BufferObject.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "tr_local.h" idCVar r_showBuffers( "r_showBuffers", "0", CVAR_INTEGER, "" ); diff --git a/neo/renderer/Cinematic.cpp b/neo/renderer/Cinematic.cpp index a09cc2d9..c3fadfc7 100644 --- a/neo/renderer/Cinematic.cpp +++ b/neo/renderer/Cinematic.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" extern idCVar s_noSound; diff --git a/neo/renderer/Color/ColorSpace.cpp b/neo/renderer/Color/ColorSpace.cpp index 73ff11a2..15f2ca16 100644 --- a/neo/renderer/Color/ColorSpace.cpp +++ b/neo/renderer/Color/ColorSpace.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" /* ================================================================================================ diff --git a/neo/renderer/DXT/DXTCodec_local.h b/neo/renderer/DXT/DXTCodec_local.h index d9cfb16f..07e54f39 100644 --- a/neo/renderer/DXT/DXTCodec_local.h +++ b/neo/renderer/DXT/DXTCodec_local.h @@ -33,6 +33,6 @@ If you have questions concerning this license or the applicable additional terms Contains the DxtEncoder and DxtDecoder declarations. ================================================================================================ */ -#include "../../idlib/precompiled.h" +#include "precompiled.h" #endif // !__DXTCODEC_LOCAL_H__ diff --git a/neo/renderer/Font.cpp b/neo/renderer/Font.cpp index e4645dbe..8fb3c4e5 100644 --- a/neo/renderer/Font.cpp +++ b/neo/renderer/Font.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "Font.h" const char* DEFAULT_FONT = "Arial_Narrow"; diff --git a/neo/renderer/GLMatrix.cpp b/neo/renderer/GLMatrix.cpp index e0a69836..152be6de 100644 --- a/neo/renderer/GLMatrix.cpp +++ b/neo/renderer/GLMatrix.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "tr_local.h" diff --git a/neo/renderer/GuiModel.cpp b/neo/renderer/GuiModel.cpp index d8aa0f1d..2dfaee9a 100644 --- a/neo/renderer/GuiModel.cpp +++ b/neo/renderer/GuiModel.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "tr_local.h" diff --git a/neo/renderer/ImageManager.cpp b/neo/renderer/ImageManager.cpp index 8123186b..01b5d7b9 100644 --- a/neo/renderer/ImageManager.cpp +++ b/neo/renderer/ImageManager.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "tr_local.h" diff --git a/neo/renderer/Image_files.cpp b/neo/renderer/Image_files.cpp index 6f32b1bf..4c1c6629 100644 --- a/neo/renderer/Image_files.cpp +++ b/neo/renderer/Image_files.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "tr_local.h" diff --git a/neo/renderer/Image_intrinsic.cpp b/neo/renderer/Image_intrinsic.cpp index e73e61b7..7fc78470 100644 --- a/neo/renderer/Image_intrinsic.cpp +++ b/neo/renderer/Image_intrinsic.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "tr_local.h" diff --git a/neo/renderer/Image_load.cpp b/neo/renderer/Image_load.cpp index d686ea88..ba0428a9 100644 --- a/neo/renderer/Image_load.cpp +++ b/neo/renderer/Image_load.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "tr_local.h" diff --git a/neo/renderer/Image_process.cpp b/neo/renderer/Image_process.cpp index 61a5c575..cee19af1 100644 --- a/neo/renderer/Image_process.cpp +++ b/neo/renderer/Image_process.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "tr_local.h" diff --git a/neo/renderer/Image_program.cpp b/neo/renderer/Image_program.cpp index 1597e2c5..bb311d55 100644 --- a/neo/renderer/Image_program.cpp +++ b/neo/renderer/Image_program.cpp @@ -51,7 +51,7 @@ Manager */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" // tr_imageprogram.c diff --git a/neo/renderer/Interaction.cpp b/neo/renderer/Interaction.cpp index 4cabeb06..7a8f70b0 100644 --- a/neo/renderer/Interaction.cpp +++ b/neo/renderer/Interaction.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "tr_local.h" diff --git a/neo/renderer/Material.cpp b/neo/renderer/Material.cpp index bce1bbe9..1b354229 100644 --- a/neo/renderer/Material.cpp +++ b/neo/renderer/Material.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "tr_local.h" diff --git a/neo/renderer/Model.cpp b/neo/renderer/Model.cpp index 173cffa3..8b6f50b3 100644 --- a/neo/renderer/Model.cpp +++ b/neo/renderer/Model.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "tr_local.h" diff --git a/neo/renderer/ModelDecal.cpp b/neo/renderer/ModelDecal.cpp index 57ef3ba9..c635a593 100644 --- a/neo/renderer/ModelDecal.cpp +++ b/neo/renderer/ModelDecal.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "tr_local.h" #include "Model_local.h" diff --git a/neo/renderer/ModelManager.cpp b/neo/renderer/ModelManager.cpp index 1aede092..802d4770 100644 --- a/neo/renderer/ModelManager.cpp +++ b/neo/renderer/ModelManager.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "Model_local.h" #include "tr_local.h" // just for R_FreeWorldInteractions and R_CreateWorldInteractions diff --git a/neo/renderer/ModelOverlay.cpp b/neo/renderer/ModelOverlay.cpp index a5f261c7..c7610850 100644 --- a/neo/renderer/ModelOverlay.cpp +++ b/neo/renderer/ModelOverlay.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "tr_local.h" #include "Model_local.h" diff --git a/neo/renderer/Model_ase.cpp b/neo/renderer/Model_ase.cpp index ce6d5c61..298eb231 100644 --- a/neo/renderer/Model_ase.cpp +++ b/neo/renderer/Model_ase.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "Model_ase.h" diff --git a/neo/renderer/Model_beam.cpp b/neo/renderer/Model_beam.cpp index 2fc2ae9d..0c5a3556 100644 --- a/neo/renderer/Model_beam.cpp +++ b/neo/renderer/Model_beam.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "tr_local.h" diff --git a/neo/renderer/Model_liquid.cpp b/neo/renderer/Model_liquid.cpp index 8f9728e7..0b2f00eb 100644 --- a/neo/renderer/Model_liquid.cpp +++ b/neo/renderer/Model_liquid.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "tr_local.h" diff --git a/neo/renderer/Model_lwo.cpp b/neo/renderer/Model_lwo.cpp index 402bbb1c..b0427672 100644 --- a/neo/renderer/Model_lwo.cpp +++ b/neo/renderer/Model_lwo.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "Model_lwo.h" diff --git a/neo/renderer/Model_ma.cpp b/neo/renderer/Model_ma.cpp index ca60fca5..d43f317e 100644 --- a/neo/renderer/Model_ma.cpp +++ b/neo/renderer/Model_ma.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "Model_ma.h" diff --git a/neo/renderer/Model_md3.cpp b/neo/renderer/Model_md3.cpp index 61a4927a..02514e9c 100644 --- a/neo/renderer/Model_md3.cpp +++ b/neo/renderer/Model_md3.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "tr_local.h" #include "Model_local.h" diff --git a/neo/renderer/Model_md5.cpp b/neo/renderer/Model_md5.cpp index 47fbfa3f..8621b7ac 100644 --- a/neo/renderer/Model_md5.cpp +++ b/neo/renderer/Model_md5.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "tr_local.h" #include "Model_local.h" diff --git a/neo/renderer/Model_prt.cpp b/neo/renderer/Model_prt.cpp index eb444cd0..237a1d8f 100644 --- a/neo/renderer/Model_prt.cpp +++ b/neo/renderer/Model_prt.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "tr_local.h" #include "Model_local.h" diff --git a/neo/renderer/Model_sprite.cpp b/neo/renderer/Model_sprite.cpp index 91b8d233..a965d386 100644 --- a/neo/renderer/Model_sprite.cpp +++ b/neo/renderer/Model_sprite.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "tr_local.h" #include "Model_local.h" diff --git a/neo/renderer/OpenGL/gl_GraphicsAPIWrapper.cpp b/neo/renderer/OpenGL/gl_GraphicsAPIWrapper.cpp index 3dcb700a..d38d0a51 100644 --- a/neo/renderer/OpenGL/gl_GraphicsAPIWrapper.cpp +++ b/neo/renderer/OpenGL/gl_GraphicsAPIWrapper.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../tr_local.h" diff --git a/neo/renderer/OpenGL/gl_Image.cpp b/neo/renderer/OpenGL/gl_Image.cpp index 31a8fb10..09907084 100644 --- a/neo/renderer/OpenGL/gl_Image.cpp +++ b/neo/renderer/OpenGL/gl_Image.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" /* ================================================================================================ diff --git a/neo/renderer/OpenGL/gl_backend.cpp b/neo/renderer/OpenGL/gl_backend.cpp index 6e73c27c..e1c59108 100644 --- a/neo/renderer/OpenGL/gl_backend.cpp +++ b/neo/renderer/OpenGL/gl_backend.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../tr_local.h" #include "../../framework/Common_local.h" diff --git a/neo/renderer/RenderEntity.cpp b/neo/renderer/RenderEntity.cpp index d3631f15..62cca6a0 100644 --- a/neo/renderer/RenderEntity.cpp +++ b/neo/renderer/RenderEntity.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "tr_local.h" diff --git a/neo/renderer/RenderProgs.cpp b/neo/renderer/RenderProgs.cpp index 4ee42849..b59579e5 100644 --- a/neo/renderer/RenderProgs.cpp +++ b/neo/renderer/RenderProgs.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "tr_local.h" diff --git a/neo/renderer/RenderProgs_GLSL.cpp b/neo/renderer/RenderProgs_GLSL.cpp index 88104d73..4222af8c 100644 --- a/neo/renderer/RenderProgs_GLSL.cpp +++ b/neo/renderer/RenderProgs_GLSL.cpp @@ -28,7 +28,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "tr_local.h" diff --git a/neo/renderer/RenderSystem.cpp b/neo/renderer/RenderSystem.cpp index 756c252a..30a49155 100644 --- a/neo/renderer/RenderSystem.cpp +++ b/neo/renderer/RenderSystem.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "tr_local.h" diff --git a/neo/renderer/RenderSystem_init.cpp b/neo/renderer/RenderSystem_init.cpp index d6b356f0..b5de4e09 100644 --- a/neo/renderer/RenderSystem_init.cpp +++ b/neo/renderer/RenderSystem_init.cpp @@ -28,7 +28,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "tr_local.h" diff --git a/neo/renderer/RenderWorld.cpp b/neo/renderer/RenderWorld.cpp index 3f20e5e9..9a7bc2ae 100644 --- a/neo/renderer/RenderWorld.cpp +++ b/neo/renderer/RenderWorld.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "tr_local.h" diff --git a/neo/renderer/RenderWorld_defs.cpp b/neo/renderer/RenderWorld_defs.cpp index ad28e2c6..2b7671ef 100644 --- a/neo/renderer/RenderWorld_defs.cpp +++ b/neo/renderer/RenderWorld_defs.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "tr_local.h" diff --git a/neo/renderer/RenderWorld_demo.cpp b/neo/renderer/RenderWorld_demo.cpp index e1416008..ec8361a3 100644 --- a/neo/renderer/RenderWorld_demo.cpp +++ b/neo/renderer/RenderWorld_demo.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "tr_local.h" diff --git a/neo/renderer/RenderWorld_load.cpp b/neo/renderer/RenderWorld_load.cpp index 75afeff7..34d9dc94 100644 --- a/neo/renderer/RenderWorld_load.cpp +++ b/neo/renderer/RenderWorld_load.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "tr_local.h" diff --git a/neo/renderer/RenderWorld_portals.cpp b/neo/renderer/RenderWorld_portals.cpp index 9eff5990..81a51542 100644 --- a/neo/renderer/RenderWorld_portals.cpp +++ b/neo/renderer/RenderWorld_portals.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "tr_local.h" diff --git a/neo/renderer/ResolutionScale.cpp b/neo/renderer/ResolutionScale.cpp index 368c2b2f..7d591894 100644 --- a/neo/renderer/ResolutionScale.cpp +++ b/neo/renderer/ResolutionScale.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "tr_local.h" #include "ResolutionScale.h" diff --git a/neo/renderer/ScreenRect.cpp b/neo/renderer/ScreenRect.cpp index e5fff97f..157a49e5 100644 --- a/neo/renderer/ScreenRect.cpp +++ b/neo/renderer/ScreenRect.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "tr_local.h" diff --git a/neo/renderer/VertexCache.cpp b/neo/renderer/VertexCache.cpp index de81f538..cd4c54c6 100644 --- a/neo/renderer/VertexCache.cpp +++ b/neo/renderer/VertexCache.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "tr_local.h" diff --git a/neo/renderer/tr_backend_draw.cpp b/neo/renderer/tr_backend_draw.cpp index dac0079f..11157a08 100644 --- a/neo/renderer/tr_backend_draw.cpp +++ b/neo/renderer/tr_backend_draw.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "tr_local.h" diff --git a/neo/renderer/tr_backend_rendertools.cpp b/neo/renderer/tr_backend_rendertools.cpp index 059dce0b..79d652c8 100644 --- a/neo/renderer/tr_backend_rendertools.cpp +++ b/neo/renderer/tr_backend_rendertools.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "tr_local.h" #include "simplex.h" // line font definition diff --git a/neo/renderer/tr_frontend_addlights.cpp b/neo/renderer/tr_frontend_addlights.cpp index 53808ac9..b4173cd3 100644 --- a/neo/renderer/tr_frontend_addlights.cpp +++ b/neo/renderer/tr_frontend_addlights.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "tr_local.h" diff --git a/neo/renderer/tr_frontend_addmodels.cpp b/neo/renderer/tr_frontend_addmodels.cpp index 9cbebe9c..507f3612 100644 --- a/neo/renderer/tr_frontend_addmodels.cpp +++ b/neo/renderer/tr_frontend_addmodels.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "tr_local.h" #include "Model_local.h" diff --git a/neo/renderer/tr_frontend_deform.cpp b/neo/renderer/tr_frontend_deform.cpp index 30c4133e..f3da30a1 100644 --- a/neo/renderer/tr_frontend_deform.cpp +++ b/neo/renderer/tr_frontend_deform.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "tr_local.h" #include "Model_local.h" diff --git a/neo/renderer/tr_frontend_guisurf.cpp b/neo/renderer/tr_frontend_guisurf.cpp index c7c5d219..cb619ca6 100644 --- a/neo/renderer/tr_frontend_guisurf.cpp +++ b/neo/renderer/tr_frontend_guisurf.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "tr_local.h" #include "Model_local.h" diff --git a/neo/renderer/tr_frontend_main.cpp b/neo/renderer/tr_frontend_main.cpp index 9fc30da0..06ab5f4e 100644 --- a/neo/renderer/tr_frontend_main.cpp +++ b/neo/renderer/tr_frontend_main.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "tr_local.h" diff --git a/neo/renderer/tr_frontend_subview.cpp b/neo/renderer/tr_frontend_subview.cpp index d8dd03d0..e0665f88 100644 --- a/neo/renderer/tr_frontend_subview.cpp +++ b/neo/renderer/tr_frontend_subview.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "tr_local.h" #include "Model_local.h" diff --git a/neo/renderer/tr_local.h b/neo/renderer/tr_local.h index d9f866d5..3d670f67 100644 --- a/neo/renderer/tr_local.h +++ b/neo/renderer/tr_local.h @@ -30,7 +30,7 @@ If you have questions concerning this license or the applicable additional terms #ifndef __TR_LOCAL_H__ #define __TR_LOCAL_H__ -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "GLState.h" #include "ScreenRect.h" diff --git a/neo/renderer/tr_trace.cpp b/neo/renderer/tr_trace.cpp index 3191c4d2..ce886462 100644 --- a/neo/renderer/tr_trace.cpp +++ b/neo/renderer/tr_trace.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "tr_local.h" #include "Model_local.h" diff --git a/neo/renderer/tr_trisurf.cpp b/neo/renderer/tr_trisurf.cpp index 0f3a9ca8..97a2533b 100644 --- a/neo/renderer/tr_trisurf.cpp +++ b/neo/renderer/tr_trisurf.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "tr_local.h" diff --git a/neo/sound/SoundVoice.cpp b/neo/sound/SoundVoice.cpp index 825d0f6a..8d8ec541 100644 --- a/neo/sound/SoundVoice.cpp +++ b/neo/sound/SoundVoice.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "snd_local.h" diff --git a/neo/sound/WaveFile.cpp b/neo/sound/WaveFile.cpp index 7b13952d..1088b6ca 100644 --- a/neo/sound/WaveFile.cpp +++ b/neo/sound/WaveFile.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" /* ================================================================================================ diff --git a/neo/sound/XAudio2/XA2_SoundHardware.cpp b/neo/sound/XAudio2/XA2_SoundHardware.cpp index 5d150949..ef569d13 100644 --- a/neo/sound/XAudio2/XA2_SoundHardware.cpp +++ b/neo/sound/XAudio2/XA2_SoundHardware.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../snd_local.h" #include "../../../doomclassic/doom/i_sound.h" diff --git a/neo/sound/XAudio2/XA2_SoundSample.cpp b/neo/sound/XAudio2/XA2_SoundSample.cpp index 08fc1f66..c6c1a166 100644 --- a/neo/sound/XAudio2/XA2_SoundSample.cpp +++ b/neo/sound/XAudio2/XA2_SoundSample.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../snd_local.h" extern idCVar s_useCompression; diff --git a/neo/sound/XAudio2/XA2_SoundVoice.cpp b/neo/sound/XAudio2/XA2_SoundVoice.cpp index a854acd4..da9193ce 100644 --- a/neo/sound/XAudio2/XA2_SoundVoice.cpp +++ b/neo/sound/XAudio2/XA2_SoundVoice.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../snd_local.h" idCVar s_skipHardwareSets( "s_skipHardwareSets", "0", CVAR_BOOL, "Do all calculation, but skip XA2 calls" ); diff --git a/neo/sound/snd_emitter.cpp b/neo/sound/snd_emitter.cpp index 24641574..65c04a35 100644 --- a/neo/sound/snd_emitter.cpp +++ b/neo/sound/snd_emitter.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "snd_local.h" diff --git a/neo/sound/snd_shader.cpp b/neo/sound/snd_shader.cpp index 2a12cbc3..cfe00663 100644 --- a/neo/sound/snd_shader.cpp +++ b/neo/sound/snd_shader.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "snd_local.h" diff --git a/neo/sound/snd_system.cpp b/neo/sound/snd_system.cpp index 998c2a6c..21b8b211 100644 --- a/neo/sound/snd_system.cpp +++ b/neo/sound/snd_system.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "snd_local.h" diff --git a/neo/sound/snd_world.cpp b/neo/sound/snd_world.cpp index 8276bcda..c7d87dfe 100644 --- a/neo/sound/snd_world.cpp +++ b/neo/sound/snd_world.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "snd_local.h" diff --git a/neo/swf/SWF_Bitstream.cpp b/neo/swf/SWF_Bitstream.cpp index 5ea5dcd0..1bf51576 100644 --- a/neo/swf/SWF_Bitstream.cpp +++ b/neo/swf/SWF_Bitstream.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #define NBM( x ) (int32)( ( 1LL << x ) - 1 ) int maskForNumBits[33] = { NBM( 0x00 ), NBM( 0x01 ), NBM( 0x02 ), NBM( 0x03 ), diff --git a/neo/swf/SWF_Dictionary.cpp b/neo/swf/SWF_Dictionary.cpp index e106af48..e820af78 100644 --- a/neo/swf/SWF_Dictionary.cpp +++ b/neo/swf/SWF_Dictionary.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" /* ======================== diff --git a/neo/swf/SWF_Events.cpp b/neo/swf/SWF_Events.cpp index c75d0fc4..16298584 100644 --- a/neo/swf/SWF_Events.cpp +++ b/neo/swf/SWF_Events.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" /* =================== diff --git a/neo/swf/SWF_Image.cpp b/neo/swf/SWF_Image.cpp index 561d5eb1..1ad593ca 100644 --- a/neo/swf/SWF_Image.cpp +++ b/neo/swf/SWF_Image.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "../renderer/Image.h" //#include "../../renderer/ImageTools/ImageProcess.h" #include "../libs/jpeg-6/jpeglib.h" diff --git a/neo/swf/SWF_Load.cpp b/neo/swf/SWF_Load.cpp index f496e1d4..51d3feeb 100644 --- a/neo/swf/SWF_Load.cpp +++ b/neo/swf/SWF_Load.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "../renderer/Font.h" #pragma warning(disable: 4355) // 'this' : used in base member initializer list diff --git a/neo/swf/SWF_Main.cpp b/neo/swf/SWF_Main.cpp index 2c871824..e56be060 100644 --- a/neo/swf/SWF_Main.cpp +++ b/neo/swf/SWF_Main.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "../renderer/Image.h" #pragma warning(disable: 4355) // 'this' : used in base member initializer list diff --git a/neo/swf/SWF_Names.cpp b/neo/swf/SWF_Names.cpp index e29674f9..39f26301 100644 --- a/neo/swf/SWF_Names.cpp +++ b/neo/swf/SWF_Names.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" /* ======================== diff --git a/neo/swf/SWF_ParmList.cpp b/neo/swf/SWF_ParmList.cpp index 0ac65ed0..10fd5dec 100644 --- a/neo/swf/SWF_ParmList.cpp +++ b/neo/swf/SWF_ParmList.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" void idSWFParmList::Append( const idSWFScriptVar& other ) { diff --git a/neo/swf/SWF_PlaceObject.cpp b/neo/swf/SWF_PlaceObject.cpp index 3121f647..063b2dfe 100644 --- a/neo/swf/SWF_PlaceObject.cpp +++ b/neo/swf/SWF_PlaceObject.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" int c_PlaceObject2; int c_PlaceObject3; diff --git a/neo/swf/SWF_Render.cpp b/neo/swf/SWF_Render.cpp index 812f7cd8..ed7174a5 100644 --- a/neo/swf/SWF_Render.cpp +++ b/neo/swf/SWF_Render.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "../renderer/tr_local.h" idCVar swf_timescale( "swf_timescale", "1", CVAR_FLOAT, "timescale for swf files" ); diff --git a/neo/swf/SWF_ScriptFunction.cpp b/neo/swf/SWF_ScriptFunction.cpp index 2a44fe01..5afeb765 100644 --- a/neo/swf/SWF_ScriptFunction.cpp +++ b/neo/swf/SWF_ScriptFunction.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" idCVar swf_debug( "swf_debug", "0", CVAR_INTEGER | CVAR_ARCHIVE, "debug swf scripts. 1 shows traces/errors. 2 also shows warnings. 3 also shows disassembly. 4 shows parameters in the disassembly." ); idCVar swf_debugInvoke( "swf_debugInvoke", "0", CVAR_INTEGER, "debug swf functions being called from game." ); diff --git a/neo/swf/SWF_ScriptObject.cpp b/neo/swf/SWF_ScriptObject.cpp index 84451c46..4cfd34fb 100644 --- a/neo/swf/SWF_ScriptObject.cpp +++ b/neo/swf/SWF_ScriptObject.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" idCVar swf_debugShowAddress( "swf_debugShowAddress", "0", CVAR_BOOL, "shows addresses along with object types when they are serialized" ); diff --git a/neo/swf/SWF_ScriptVar.cpp b/neo/swf/SWF_ScriptVar.cpp index b048812a..6450bfc6 100644 --- a/neo/swf/SWF_ScriptVar.cpp +++ b/neo/swf/SWF_ScriptVar.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" extern idCVar swf_debugShowAddress; diff --git a/neo/swf/SWF_ShapeParser.cpp b/neo/swf/SWF_ShapeParser.cpp index 126a0687..76bab393 100644 --- a/neo/swf/SWF_ShapeParser.cpp +++ b/neo/swf/SWF_ShapeParser.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "float.h" #pragma warning( disable: 4189 ) // local variable is initialized but not referenced diff --git a/neo/swf/SWF_Shapes.cpp b/neo/swf/SWF_Shapes.cpp index ab4c72b6..3032ba72 100644 --- a/neo/swf/SWF_Shapes.cpp +++ b/neo/swf/SWF_Shapes.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" /* ======================== diff --git a/neo/swf/SWF_Sounds.cpp b/neo/swf/SWF_Sounds.cpp index 679a76b9..ec7add62 100644 --- a/neo/swf/SWF_Sounds.cpp +++ b/neo/swf/SWF_Sounds.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" /* ======================== diff --git a/neo/swf/SWF_SpriteInstance.cpp b/neo/swf/SWF_SpriteInstance.cpp index 6149c00f..45aad4d6 100644 --- a/neo/swf/SWF_SpriteInstance.cpp +++ b/neo/swf/SWF_SpriteInstance.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" idSWFScriptObject_SpriteInstancePrototype spriteInstanceScriptObjectPrototype; diff --git a/neo/swf/SWF_Sprites.cpp b/neo/swf/SWF_Sprites.cpp index 9b2af62b..fe356248 100644 --- a/neo/swf/SWF_Sprites.cpp +++ b/neo/swf/SWF_Sprites.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" /* ======================== diff --git a/neo/swf/SWF_Text.cpp b/neo/swf/SWF_Text.cpp index 433ab0f6..e1f88798 100644 --- a/neo/swf/SWF_Text.cpp +++ b/neo/swf/SWF_Text.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #pragma warning( disable: 4189 ) // local variable is initialized but not referenced diff --git a/neo/swf/SWF_TextInstance.cpp b/neo/swf/SWF_TextInstance.cpp index ab1f30aa..29a8dcd9 100644 --- a/neo/swf/SWF_TextInstance.cpp +++ b/neo/swf/SWF_TextInstance.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "../renderer/Font.h" idSWFScriptObject_TextInstancePrototype textInstanceScriptObjectPrototype; diff --git a/neo/swf/SWF_Zlib.cpp b/neo/swf/SWF_Zlib.cpp index 1bbe39c6..4dd86484 100644 --- a/neo/swf/SWF_Zlib.cpp +++ b/neo/swf/SWF_Zlib.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "../libs/zlib/zlib.h" /* diff --git a/neo/sys/LightweightCompression.cpp b/neo/sys/LightweightCompression.cpp index b799b5cd..49355bfd 100644 --- a/neo/sys/LightweightCompression.cpp +++ b/neo/sys/LightweightCompression.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "LightweightCompression.h" /* diff --git a/neo/sys/PacketProcessor.cpp b/neo/sys/PacketProcessor.cpp index 63e6fe60..160ac3c0 100644 --- a/neo/sys/PacketProcessor.cpp +++ b/neo/sys/PacketProcessor.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "PacketProcessor.h" // DG: workaround for GCC bug diff --git a/neo/sys/Snapshot.cpp b/neo/sys/Snapshot.cpp index f9aeb2cd..5f5b6265 100644 --- a/neo/sys/Snapshot.cpp +++ b/neo/sys/Snapshot.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" idCVar net_verboseSnapshot( "net_verboseSnapshot", "0", CVAR_INTEGER | CVAR_NOCHEAT, "Verbose snapshot code to help debug snapshot problems. Greater the number greater the spam" ); idCVar net_verboseSnapshotCompression( "net_verboseSnapshotCompression", "0", CVAR_INTEGER | CVAR_NOCHEAT, "Verbose snapshot code to help debug snapshot problems. Greater the number greater the spam" ); diff --git a/neo/sys/SnapshotProcessor.cpp b/neo/sys/SnapshotProcessor.cpp index cde749db..b2003ec5 100644 --- a/neo/sys/SnapshotProcessor.cpp +++ b/neo/sys/SnapshotProcessor.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" idCVar net_optimalSnapDeltaSize( "net_optimalSnapDeltaSize", "1000", CVAR_INTEGER, "Optimal size of snapshot delta msgs." ); idCVar net_debugBaseStates( "net_debugBaseStates", "0", CVAR_BOOL, "Log out base state information" ); diff --git a/neo/sys/Snapshot_Jobs.cpp b/neo/sys/Snapshot_Jobs.cpp index ce366ce9..faf04189 100644 --- a/neo/sys/Snapshot_Jobs.cpp +++ b/neo/sys/Snapshot_Jobs.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "Snapshot_Jobs.h" diff --git a/neo/sys/sys_achievements.cpp b/neo/sys/sys_achievements.cpp index a92cfa9d..7d044904 100644 --- a/neo/sys/sys_achievements.cpp +++ b/neo/sys/sys_achievements.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" /* ======================== diff --git a/neo/sys/sys_dedicated_server_search.cpp b/neo/sys/sys_dedicated_server_search.cpp index 0cbcf451..84c61016 100644 --- a/neo/sys/sys_dedicated_server_search.cpp +++ b/neo/sys/sys_dedicated_server_search.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "sys_lobby_backend.h" #include "sys_dedicated_server_search.h" diff --git a/neo/sys/sys_lobby.cpp b/neo/sys/sys_lobby.cpp index a2a03f3a..710471f0 100644 --- a/neo/sys/sys_lobby.cpp +++ b/neo/sys/sys_lobby.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "sys_lobby.h" extern idCVar net_connectTimeoutInSeconds; diff --git a/neo/sys/sys_lobby_backend_direct.cpp b/neo/sys/sys_lobby_backend_direct.cpp index a633a1bf..2f2fab4b 100644 --- a/neo/sys/sys_lobby_backend_direct.cpp +++ b/neo/sys/sys_lobby_backend_direct.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "sys_lobby_backend.h" #include "sys_lobby_backend_direct.h" diff --git a/neo/sys/sys_lobby_migrate.cpp b/neo/sys/sys_lobby_migrate.cpp index c7162709..942cc298 100644 --- a/neo/sys/sys_lobby_migrate.cpp +++ b/neo/sys/sys_lobby_migrate.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "sys_lobby.h" idCVar net_migration_debug( "net_migration_debug", "0", CVAR_BOOL, "debug" ); diff --git a/neo/sys/sys_lobby_snapshot.cpp b/neo/sys/sys_lobby_snapshot.cpp index 54f1d14f..c7a8d279 100644 --- a/neo/sys/sys_lobby_snapshot.cpp +++ b/neo/sys/sys_lobby_snapshot.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "sys_lobby.h" idCVar net_snapshot_send_warntime( "net_snapshot_send_warntime", "500", CVAR_INTEGER, "Print warning messages if we take longer than this to send a client a snapshot." ); diff --git a/neo/sys/sys_lobby_users.cpp b/neo/sys/sys_lobby_users.cpp index 40c6a766..2a7cdcc4 100644 --- a/neo/sys/sys_lobby_users.cpp +++ b/neo/sys/sys_lobby_users.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "sys_lobby.h" #include "sys_voicechat.h" diff --git a/neo/sys/sys_local.cpp b/neo/sys/sys_local.cpp index 98f18de9..e5af9d6e 100644 --- a/neo/sys/sys_local.cpp +++ b/neo/sys/sys_local.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "sys_local.h" const char* sysLanguageNames[] = diff --git a/neo/sys/sys_localuser.cpp b/neo/sys/sys_localuser.cpp index a23807ee..7487c466 100644 --- a/neo/sys/sys_localuser.cpp +++ b/neo/sys/sys_localuser.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" extern idCVar fs_savepath; diff --git a/neo/sys/sys_profile.cpp b/neo/sys/sys_profile.cpp index 4c9a5e52..94e4c8d4 100644 --- a/neo/sys/sys_profile.cpp +++ b/neo/sys/sys_profile.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #define SAVEGAME_PROFILE_FILENAME "profile.bin" diff --git a/neo/sys/sys_savegame.cpp b/neo/sys/sys_savegame.cpp index ff700232..665198f6 100644 --- a/neo/sys/sys_savegame.cpp +++ b/neo/sys/sys_savegame.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "sys_session_local.h" diff --git a/neo/sys/sys_session_callbacks.cpp b/neo/sys/sys_session_callbacks.cpp index 49faa9e7..a595f0fe 100644 --- a/neo/sys/sys_session_callbacks.cpp +++ b/neo/sys/sys_session_callbacks.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "../framework/Common_local.h" #include "sys_session_local.h" diff --git a/neo/sys/sys_session_local.cpp b/neo/sys/sys_session_local.cpp index 3cca6fa5..370d50bf 100644 --- a/neo/sys/sys_session_local.cpp +++ b/neo/sys/sys_session_local.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "sys_session_local.h" #include "sys_voicechat.h" #include "sys_dedicated_server_search.h" diff --git a/neo/sys/sys_session_savegames.cpp b/neo/sys/sys_session_savegames.cpp index ae21847e..a2d1733c 100644 --- a/neo/sys/sys_session_savegames.cpp +++ b/neo/sys/sys_session_savegames.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "sys_savegame.h" #include "sys_session_local.h" #include "sys_session_savegames.h" diff --git a/neo/sys/sys_signin.cpp b/neo/sys/sys_signin.cpp index a29e6832..4e7331f3 100644 --- a/neo/sys/sys_signin.cpp +++ b/neo/sys/sys_signin.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" idCVar com_requireNonProductionSignIn( "com_requireNonProductionSignIn", "1", CVAR_BOOL | CVAR_ARCHIVE, "If true, will require sign in, even on non production builds." ); extern idCVar fs_savepath; diff --git a/neo/sys/sys_voicechat.cpp b/neo/sys/sys_voicechat.cpp index ed0b1bf1..132a7eb2 100644 --- a/neo/sys/sys_voicechat.cpp +++ b/neo/sys/sys_voicechat.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "sys_voicechat.h" /* diff --git a/neo/sys/win32/win_achievements.cpp b/neo/sys/win32/win_achievements.cpp index add5c5c1..dcff8ad0 100644 --- a/neo/sys/win32/win_achievements.cpp +++ b/neo/sys/win32/win_achievements.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "win_achievements.h" #include "../sys_session_local.h" diff --git a/neo/sys/win32/win_cpu.cpp b/neo/sys/win32/win_cpu.cpp index 0e8182d5..e38a3ad2 100644 --- a/neo/sys/win32/win_cpu.cpp +++ b/neo/sys/win32/win_cpu.cpp @@ -28,7 +28,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "win_local.h" diff --git a/neo/sys/win32/win_glimp.cpp b/neo/sys/win32/win_glimp.cpp index 8feef073..eb2d51ac 100644 --- a/neo/sys/win32/win_glimp.cpp +++ b/neo/sys/win32/win_glimp.cpp @@ -41,7 +41,7 @@ If you have questions concerning this license or the applicable additional terms ** related functions that are relevant ONLY to win_glimp.c */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "win_local.h" #include "rc/doom_resource.h" diff --git a/neo/sys/win32/win_input.cpp b/neo/sys/win32/win_input.cpp index 1e6a8c9f..fd53c8d9 100644 --- a/neo/sys/win32/win_input.cpp +++ b/neo/sys/win32/win_input.cpp @@ -28,7 +28,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../sys_session_local.h" #include "win_local.h" diff --git a/neo/sys/win32/win_input.h b/neo/sys/win32/win_input.h index 299f4c2a..32c1d2bd 100644 --- a/neo/sys/win32/win_input.h +++ b/neo/sys/win32/win_input.h @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #ifdef _MSC_VER // DG: dx SDK's xinput.h is incompatible with MinGW.. #include diff --git a/neo/sys/win32/win_localuser.cpp b/neo/sys/win32/win_localuser.cpp index 991a8485..87fb4ea8 100644 --- a/neo/sys/win32/win_localuser.cpp +++ b/neo/sys/win32/win_localuser.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "win_localuser.h" extern idCVar win_userPersistent; diff --git a/neo/sys/win32/win_main.cpp b/neo/sys/win32/win_main.cpp index 4be68718..c14d60de 100644 --- a/neo/sys/win32/win_main.cpp +++ b/neo/sys/win32/win_main.cpp @@ -28,7 +28,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include #include diff --git a/neo/sys/win32/win_net.cpp b/neo/sys/win32/win_net.cpp index b5813f35..7ab1fa34 100644 --- a/neo/sys/win32/win_net.cpp +++ b/neo/sys/win32/win_net.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" /* ================================================================================================ diff --git a/neo/sys/win32/win_qgl.cpp b/neo/sys/win32/win_qgl.cpp index c1f472bd..bf0942a0 100644 --- a/neo/sys/win32/win_qgl.cpp +++ b/neo/sys/win32/win_qgl.cpp @@ -36,7 +36,7 @@ If you have questions concerning this license or the applicable additional terms ** QGL_Shutdown() - unloads libraries, NULLs function pointers */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include #include "win_local.h" diff --git a/neo/sys/win32/win_savegame.cpp b/neo/sys/win32/win_savegame.cpp index a6a1f24e..0af0989b 100644 --- a/neo/sys/win32/win_savegame.cpp +++ b/neo/sys/win32/win_savegame.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../sys_session_local.h" #include "../sys_savegame.h" diff --git a/neo/sys/win32/win_session_local.cpp b/neo/sys/win32/win_session_local.cpp index ba50f7ed..3b175eb7 100644 --- a/neo/sys/win32/win_session_local.cpp +++ b/neo/sys/win32/win_session_local.cpp @@ -14,7 +14,7 @@ Contains the windows implementation of the network session */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../../framework/Common_local.h" #include "../sys_session_local.h" #include "../sys_stats.h" diff --git a/neo/sys/win32/win_shared.cpp b/neo/sys/win32/win_shared.cpp index 76f90a48..bae1b630 100644 --- a/neo/sys/win32/win_shared.cpp +++ b/neo/sys/win32/win_shared.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "win_local.h" #include diff --git a/neo/sys/win32/win_signin.cpp b/neo/sys/win32/win_signin.cpp index 73b2f1d0..247347e2 100644 --- a/neo/sys/win32/win_signin.cpp +++ b/neo/sys/win32/win_signin.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "../../framework/PlayerProfile.h" #include "../sys_session_local.h" #include "win_signin.h" diff --git a/neo/sys/win32/win_snd.cpp b/neo/sys/win32/win_snd.cpp index 22c76350..0c57cad1 100644 --- a/neo/sys/win32/win_snd.cpp +++ b/neo/sys/win32/win_snd.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" // RB: not available on Windows 8 SDK #if defined(__MINGW32__) diff --git a/neo/sys/win32/win_syscon.cpp b/neo/sys/win32/win_syscon.cpp index 67cc5ed8..108890f8 100644 --- a/neo/sys/win32/win_syscon.cpp +++ b/neo/sys/win32/win_syscon.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include #include diff --git a/neo/sys/win32/win_taskkeyhook.cpp b/neo/sys/win32/win_taskkeyhook.cpp index 6664c7e9..da54c404 100644 --- a/neo/sys/win32/win_taskkeyhook.cpp +++ b/neo/sys/win32/win_taskkeyhook.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" // // This file implements the low-level keyboard hook that traps the task keys. diff --git a/neo/sys/win32/win_wndproc.cpp b/neo/sys/win32/win_wndproc.cpp index 3b748e59..680b467e 100644 --- a/neo/sys/win32/win_wndproc.cpp +++ b/neo/sys/win32/win_wndproc.cpp @@ -28,7 +28,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../../idlib/precompiled.h" +#include "precompiled.h" #include "win_local.h" #include "../../renderer/tr_local.h" diff --git a/neo/ui/BindWindow.cpp b/neo/ui/BindWindow.cpp index 5adf9655..2431323a 100644 --- a/neo/ui/BindWindow.cpp +++ b/neo/ui/BindWindow.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "DeviceContext.h" #include "Window.h" diff --git a/neo/ui/ChoiceWindow.cpp b/neo/ui/ChoiceWindow.cpp index c76c151a..a0286bd5 100644 --- a/neo/ui/ChoiceWindow.cpp +++ b/neo/ui/ChoiceWindow.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "DeviceContext.h" #include "Window.h" diff --git a/neo/ui/DeviceContext.cpp b/neo/ui/DeviceContext.cpp index f3703fc6..0d4aaf9b 100644 --- a/neo/ui/DeviceContext.cpp +++ b/neo/ui/DeviceContext.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "DeviceContext.h" #include "../renderer/GuiModel.h" diff --git a/neo/ui/EditWindow.cpp b/neo/ui/EditWindow.cpp index e13a4f6c..514b5bce 100644 --- a/neo/ui/EditWindow.cpp +++ b/neo/ui/EditWindow.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "DeviceContext.h" #include "Window.h" diff --git a/neo/ui/FieldWindow.cpp b/neo/ui/FieldWindow.cpp index 789c05f3..d1fc9c71 100644 --- a/neo/ui/FieldWindow.cpp +++ b/neo/ui/FieldWindow.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "DeviceContext.h" #include "Window.h" diff --git a/neo/ui/GameBearShootWindow.cpp b/neo/ui/GameBearShootWindow.cpp index 767cc3df..da41e476 100644 --- a/neo/ui/GameBearShootWindow.cpp +++ b/neo/ui/GameBearShootWindow.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "DeviceContext.h" #include "Window.h" diff --git a/neo/ui/GameBustOutWindow.cpp b/neo/ui/GameBustOutWindow.cpp index 29d41e07..10c02145 100644 --- a/neo/ui/GameBustOutWindow.cpp +++ b/neo/ui/GameBustOutWindow.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "../renderer/Image.h" diff --git a/neo/ui/GameSSDWindow.cpp b/neo/ui/GameSSDWindow.cpp index 78498220..307996cd 100644 --- a/neo/ui/GameSSDWindow.cpp +++ b/neo/ui/GameSSDWindow.cpp @@ -26,7 +26,7 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "DeviceContext.h" #include "Window.h" diff --git a/neo/ui/GuiScript.cpp b/neo/ui/GuiScript.cpp index d50fe593..3d34fb12 100644 --- a/neo/ui/GuiScript.cpp +++ b/neo/ui/GuiScript.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "Window.h" #include "Winvar.h" diff --git a/neo/ui/ListGUI.cpp b/neo/ui/ListGUI.cpp index 304810c2..173476ee 100644 --- a/neo/ui/ListGUI.cpp +++ b/neo/ui/ListGUI.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "ListGUILocal.h" diff --git a/neo/ui/ListWindow.cpp b/neo/ui/ListWindow.cpp index ebf9357c..197d7533 100644 --- a/neo/ui/ListWindow.cpp +++ b/neo/ui/ListWindow.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "DeviceContext.h" #include "Window.h" diff --git a/neo/ui/RegExp.cpp b/neo/ui/RegExp.cpp index fef39edf..df8e1c19 100644 --- a/neo/ui/RegExp.cpp +++ b/neo/ui/RegExp.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "RegExp.h" #include "DeviceContext.h" diff --git a/neo/ui/RenderWindow.cpp b/neo/ui/RenderWindow.cpp index d29e7564..de769ead 100644 --- a/neo/ui/RenderWindow.cpp +++ b/neo/ui/RenderWindow.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "DeviceContext.h" #include "Window.h" diff --git a/neo/ui/SimpleWindow.cpp b/neo/ui/SimpleWindow.cpp index f0eddeec..8bafe65e 100644 --- a/neo/ui/SimpleWindow.cpp +++ b/neo/ui/SimpleWindow.cpp @@ -28,7 +28,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "DeviceContext.h" #include "Window.h" diff --git a/neo/ui/SliderWindow.cpp b/neo/ui/SliderWindow.cpp index e4b38c5c..2c1456a8 100644 --- a/neo/ui/SliderWindow.cpp +++ b/neo/ui/SliderWindow.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "DeviceContext.h" #include "Window.h" diff --git a/neo/ui/UserInterface.cpp b/neo/ui/UserInterface.cpp index a52b5bb7..192769cc 100644 --- a/neo/ui/UserInterface.cpp +++ b/neo/ui/UserInterface.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "ListGUILocal.h" #include "DeviceContext.h" diff --git a/neo/ui/Window.cpp b/neo/ui/Window.cpp index 5ff072c0..d6f22a09 100644 --- a/neo/ui/Window.cpp +++ b/neo/ui/Window.cpp @@ -28,7 +28,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "DeviceContext.h" #include "Window.h" diff --git a/neo/ui/Winvar.cpp b/neo/ui/Winvar.cpp index 256eb68a..1a91a0b7 100644 --- a/neo/ui/Winvar.cpp +++ b/neo/ui/Winvar.cpp @@ -27,7 +27,7 @@ If you have questions concerning this license or the applicable additional terms */ #pragma hdrstop -#include "../idlib/precompiled.h" +#include "precompiled.h" #include "Window.h" #include "Winvar.h" From 9280732913a30168d3388b024db55f2281854e3f Mon Sep 17 00:00:00 2001 From: Robert Beckebans Date: Sat, 22 Dec 2012 16:34:02 +0100 Subject: [PATCH 15/57] Fixed Linux build. --- neo/idlib/CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/neo/idlib/CMakeLists.txt b/neo/idlib/CMakeLists.txt index 2772810d..31f521fb 100644 --- a/neo/idlib/CMakeLists.txt +++ b/neo/idlib/CMakeLists.txt @@ -35,6 +35,8 @@ if(MSVC) PROPERTIES COMPILE_FLAGS "/Ycprecompiled.h" ) +else() + include_directories(.) endif() add_library(idlib ${ID_SOURCES} ${ID_INCLUDES}) From ba126dde3a5fe848944b547b15741ef35a94522d Mon Sep 17 00:00:00 2001 From: Daniel Gibson Date: Sat, 22 Dec 2012 06:15:50 +0100 Subject: [PATCH 16/57] Fixed various warnings from clang --- neo/d3xp/Game_local.h | 3 ++- neo/d3xp/PlayerView.cpp | 2 +- neo/d3xp/ai/AI_events.cpp | 3 ++- neo/framework/Common.cpp | 5 ++++- neo/framework/FileSystem.cpp | 7 +++++-- neo/framework/Unzip.cpp | 2 +- neo/framework/Zip.cpp | 4 ++-- neo/idlib/Heap.h | 12 ++++++------ neo/idlib/geometry/RenderMatrix.cpp | 4 ++-- neo/idlib/math/Lcp.cpp | 5 ++++- neo/renderer/DXT/DXTEncoder.cpp | 4 +++- neo/renderer/GuiModel.cpp | 6 +++++- neo/sys/Snapshot_Jobs.cpp | 6 ++++++ neo/sys/sdl/sdl_events.cpp | 2 ++ neo/sys/sys_session_local.cpp | 2 -- neo/ui/EditWindow.cpp | 2 +- neo/ui/Window.cpp | 4 +++- 17 files changed, 49 insertions(+), 24 deletions(-) diff --git a/neo/d3xp/Game_local.h b/neo/d3xp/Game_local.h index e1b3c904..1e551d29 100644 --- a/neo/d3xp/Game_local.h +++ b/neo/d3xp/Game_local.h @@ -794,7 +794,8 @@ template< class type > ID_INLINE type* idEntityPtr::GetEntity() const { int entityNum = spawnId & ( ( 1 << GENTITYNUM_BITS ) - 1 ); - if( ( gameLocal.spawnIds[ entityNum ] == ( spawnId >> GENTITYNUM_BITS ) ) ) + // DG: removed extraneous parenthesis to shut up clang + if( gameLocal.spawnIds[ entityNum ] == ( spawnId >> GENTITYNUM_BITS ) ) { return static_cast( gameLocal.entities[ entityNum ] ); } diff --git a/neo/d3xp/PlayerView.cpp b/neo/d3xp/PlayerView.cpp index b1f1d82e..55a85bf5 100644 --- a/neo/d3xp/PlayerView.cpp +++ b/neo/d3xp/PlayerView.cpp @@ -1513,7 +1513,7 @@ void FullscreenFX_DoubleVision::HighQuality() color.z = 0.0f; } - if( !common->IsMultiplayer() && gameLocal.fast.time < player->inventory.powerupEndTime[ HELLTIME ] || gameLocal.fast.time < player->inventory.powerupEndTime[ INVULNERABILITY ] ) + if( ( !common->IsMultiplayer() && gameLocal.fast.time < player->inventory.powerupEndTime[ HELLTIME ] ) || gameLocal.fast.time < player->inventory.powerupEndTime[ INVULNERABILITY ] ) { color.y = 0.0f; color.z = 0.0f; diff --git a/neo/d3xp/ai/AI_events.cpp b/neo/d3xp/ai/AI_events.cpp index 9acad090..54a51c81 100644 --- a/neo/d3xp/ai/AI_events.cpp +++ b/neo/d3xp/ai/AI_events.cpp @@ -952,7 +952,8 @@ void idAI::Event_CanBecomeSolid() continue; } - if( spawnClearMoveables && hit->IsType( idMoveable::Type ) || hit->IsType( idBarrel::Type ) || hit->IsType( idExplodingBarrel::Type ) ) + // DG: add parenthesis to make precedence obvious and to appease compiler + if( ( spawnClearMoveables && hit->IsType( idMoveable::Type ) ) || hit->IsType( idBarrel::Type ) || hit->IsType( idExplodingBarrel::Type ) ) { idVec3 push; push = hit->GetPhysics()->GetOrigin() - GetPhysics()->GetOrigin(); diff --git a/neo/framework/Common.cpp b/neo/framework/Common.cpp index 163da51a..62bfabb4 100644 --- a/neo/framework/Common.cpp +++ b/neo/framework/Common.cpp @@ -586,8 +586,11 @@ CONSOLE_COMMAND( crash, "causes a crash", NULL ) commonLocal.Printf( "crash may only be used in developer mode\n" ); return; } - +#ifdef __GNUC__ + __builtin_trap(); +#else * ( int* ) 0 = 0x12345678; +#endif } /* diff --git a/neo/framework/FileSystem.cpp b/neo/framework/FileSystem.cpp index 59cd719a..c51bd745 100644 --- a/neo/framework/FileSystem.cpp +++ b/neo/framework/FileSystem.cpp @@ -3215,7 +3215,9 @@ bool idFileSystemLocal::GetResourceCacheEntry( const char* fileName, idResourceC { // os path, convert to relative? scripts can pass in an OS path //idLib::Printf( "RESOURCE: os path passed %s\n", fileName ); - return NULL; + // DG: this should return a bool, i.e. false, not NULL + return false; + // DG end } else { @@ -3269,7 +3271,8 @@ idFile* idFileSystemLocal::GetResourceFile( const char* fileName, bool memFile ) idLib::Printf( "RES: loading file %s\n", rc.filename.c_str() ); } idFile_InnerResource* file = new idFile_InnerResource( rc.filename, resourceFiles[ rc.containerIndex ]->resourceFile, rc.offset, rc.length ); - if( file != NULL && ( memFile || rc.length <= resourceBufferAvailable ) || rc.length < 8 * 1024 * 1024 ) + // DG: add parenthesis to make sure this block is only entered when file != NULL - bug found by clang. + if( file != NULL && ( ( memFile || rc.length <= resourceBufferAvailable ) || rc.length < 8 * 1024 * 1024 ) ) { byte* buf = NULL; if( rc.length < resourceBufferAvailable ) diff --git a/neo/framework/Unzip.cpp b/neo/framework/Unzip.cpp index 63f06354..6494b1da 100644 --- a/neo/framework/Unzip.cpp +++ b/neo/framework/Unzip.cpp @@ -968,7 +968,7 @@ extern int unzReadCurrentFile( unzFile file, void* buf, unsigned len ) return UNZ_PARAMERROR; - if( ( pfile_in_zip_read_info->read_buffer == NULL ) ) + if( pfile_in_zip_read_info->read_buffer == NULL ) // DG: remove unnecessary parenthesis return UNZ_END_OF_LIST_OF_FILE; if( len == 0 ) return 0; diff --git a/neo/framework/Zip.cpp b/neo/framework/Zip.cpp index 87b8ddf8..afcc28a8 100644 --- a/neo/framework/Zip.cpp +++ b/neo/framework/Zip.cpp @@ -819,11 +819,11 @@ int zipOpenNewFileInZip3( zipFile file, const char* filename, const zip_fileinfo { zi->ci.flag |= 2; } - if( ( level == 2 ) ) + if( level == 2 ) // DG: remove unnecessary parenthesis { zi->ci.flag |= 4; } - if( ( level == 1 ) ) + if( level == 1 ) // DG: remove unnecessary parenthesis { zi->ci.flag |= 6; } diff --git a/neo/idlib/Heap.h b/neo/idlib/Heap.h index 004cf0d8..635dad49 100644 --- a/neo/idlib/Heap.h +++ b/neo/idlib/Heap.h @@ -66,19 +66,19 @@ void* Mem_ClearedAlloc( const size_t size, const memTag_t tag ); char* Mem_CopyString( const char* in ); // RB end -ID_INLINE void* operator new( size_t s ) +ID_INLINE void* operator new( size_t s ) throw( std::bad_alloc ) // DG: standard signature seems to include throw(..) { return Mem_Alloc( s, TAG_NEW ); } -ID_INLINE void operator delete( void* p ) +ID_INLINE void operator delete( void* p ) throw() // DG: delete musn't throw { Mem_Free( p ); } -ID_INLINE void* operator new[]( size_t s ) +ID_INLINE void* operator new[]( size_t s ) throw( std::bad_alloc ) // DG: standard signature seems to include throw(..) { return Mem_Alloc( s, TAG_NEW ); } -ID_INLINE void operator delete[]( void* p ) +ID_INLINE void operator delete[]( void* p ) throw() // DG: delete musn't throw { Mem_Free( p ); } @@ -86,7 +86,7 @@ ID_INLINE void* operator new( size_t s, memTag_t tag ) { return Mem_Alloc( s, tag ); } -ID_INLINE void operator delete( void* p, memTag_t tag ) +ID_INLINE void operator delete( void* p, memTag_t tag ) throw() // DG: delete musn't throw { Mem_Free( p ); } @@ -94,7 +94,7 @@ ID_INLINE void* operator new[]( size_t s, memTag_t tag ) { return Mem_Alloc( s, tag ); } -ID_INLINE void operator delete[]( void* p, memTag_t tag ) +ID_INLINE void operator delete[]( void* p, memTag_t tag ) throw() // DG: delete musn't throw { Mem_Free( p ); } diff --git a/neo/idlib/geometry/RenderMatrix.cpp b/neo/idlib/geometry/RenderMatrix.cpp index 951ad59f..83dcef06 100644 --- a/neo/idlib/geometry/RenderMatrix.cpp +++ b/neo/idlib/geometry/RenderMatrix.cpp @@ -103,7 +103,7 @@ static const __m128 vector_float_mask3 = __m128c( _mm_set1_epi32( 1 << 3 ) static const __m128 vector_float_mask4 = __m128c( _mm_set1_epi32( 1 << 4 ) ); static const __m128 vector_float_mask5 = __m128c( _mm_set1_epi32( 1 << 5 ) ); static const __m128 vector_float_sign_bit = __m128c( _mm_set1_epi32( IEEE_FLT_SIGN_MASK ) ); -static const __m128 vector_float_abs_mask = __m128c( _mm_set1_epi32( ~IEEE_FLT_SIGN_MASK ) ); +static const __m128 vector_float_abs_mask = __m128c( _mm_set1_epi32( ~( int )IEEE_FLT_SIGN_MASK ) ); static const __m128 vector_float_keep_last = __m128c( _mm_set_epi32( -1, 0, 0, 0 ) ); static const __m128 vector_float_inverse_epsilon = { RENDER_MATRIX_INVERSE_EPSILON, RENDER_MATRIX_INVERSE_EPSILON, RENDER_MATRIX_INVERSE_EPSILON, RENDER_MATRIX_INVERSE_EPSILON }; static const __m128 vector_float_smallest_non_denorm = { 1.1754944e-038f, 1.1754944e-038f, 1.1754944e-038f, 1.1754944e-038f }; @@ -916,7 +916,7 @@ idRenderMatrix::Inverse inverse( M ) = ( 1 / determinant( M ) ) * transpose( cofactor( M ) ) -This code is based on the code written by Cédric Lallain, published on "Cell Performance" +This code is based on the code written by C�dric Lallain, published on "Cell Performance" (by Mike Acton) and released under the BSD 3-Clause ("BSD New" or "BSD Simplified") license. https://code.google.com/p/cellperformance-snippets/ diff --git a/neo/idlib/math/Lcp.cpp b/neo/idlib/math/Lcp.cpp index 8f80c926..09976247 100644 --- a/neo/idlib/math/Lcp.cpp +++ b/neo/idlib/math/Lcp.cpp @@ -56,7 +56,10 @@ ALIGN16( const __m128 SIMD_SP_LCP_DELTA_FORCE_EPSILON ) = { LCP_DELTA_FORCE_EP ALIGN16( const __m128 SIMD_SP_LCP_BOUND_EPSILON ) = { LCP_BOUND_EPSILON, LCP_BOUND_EPSILON, LCP_BOUND_EPSILON, LCP_BOUND_EPSILON }; ALIGN16( const __m128 SIMD_SP_neg_LCP_BOUND_EPSILON ) = { -LCP_BOUND_EPSILON, -LCP_BOUND_EPSILON, -LCP_BOUND_EPSILON, -LCP_BOUND_EPSILON }; ALIGN16( const unsigned int SIMD_SP_signBit[4] ) = { IEEE_FLT_SIGN_MASK, IEEE_FLT_SIGN_MASK, IEEE_FLT_SIGN_MASK, IEEE_FLT_SIGN_MASK }; -ALIGN16( const unsigned int SIMD_SP_absMask[4] ) = { ~IEEE_FLT_SIGN_MASK, ~IEEE_FLT_SIGN_MASK, ~IEEE_FLT_SIGN_MASK, ~IEEE_FLT_SIGN_MASK }; +// DG: cast IEEE_FLT_SIGN_MASK to uint before interting it, as uint and not long values are expected here +#define INV_IEEE_FLT_SIGN_MASK (~((unsigned int)IEEE_FLT_SIGN_MASK)) +ALIGN16( const unsigned int SIMD_SP_absMask[4] ) = { INV_IEEE_FLT_SIGN_MASK, INV_IEEE_FLT_SIGN_MASK, INV_IEEE_FLT_SIGN_MASK, INV_IEEE_FLT_SIGN_MASK }; +// DG end ALIGN16( const unsigned int SIMD_SP_indexedStartMask[4][4] ) = { { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF }, { 0, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF }, { 0, 0, 0xFFFFFFFF, 0xFFFFFFFF }, { 0, 0, 0, 0xFFFFFFFF } }; ALIGN16( const unsigned int SIMD_SP_indexedEndMask[4][4] ) = { { 0, 0, 0, 0 }, { 0xFFFFFFFF, 0, 0, 0 }, { 0xFFFFFFFF, 0xFFFFFFFF, 0, 0 }, { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0 } }; ALIGN16( const unsigned int SIMD_SP_clearLast1[4] ) = { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0 }; diff --git a/neo/renderer/DXT/DXTEncoder.cpp b/neo/renderer/DXT/DXTEncoder.cpp index 275bff1a..f9ec8fd6 100644 --- a/neo/renderer/DXT/DXTEncoder.cpp +++ b/neo/renderer/DXT/DXTEncoder.cpp @@ -3735,7 +3735,9 @@ void idDxtEncoder::EmitColorAlphaIndices( const byte* colorBlock, const byte* mi unsigned int b2 = d1 > d0; unsigned int b3 = c3 < 128; - result |= ( ( ( b0 & b1 | b3 ) << 1 ) | ( b2 ^ b1 | b3 ) ) << ( i << 1 ); + // DG: add some parenthesis to appease (often rightly) warning compiler + result |= ( ( ( ( b0 & b1 ) | b3 ) << 1 ) | ( ( b2 ^ b1 ) | b3 ) ) << ( i << 1 ); + // DG end } EmitUInt( result ); diff --git a/neo/renderer/GuiModel.cpp b/neo/renderer/GuiModel.cpp index 2dfaee9a..a3cb8158 100644 --- a/neo/renderer/GuiModel.cpp +++ b/neo/renderer/GuiModel.cpp @@ -218,6 +218,11 @@ void idGuiModel::EmitToCurrentView( float modelMatrix[16], bool depthHack ) EmitSurfaces( modelMatrix, modelViewMatrix, depthHack, false /* stereoDepthSort */, true /* link as entity */ ); } +// DG: move function declaration here (=> out of EmitFullScreen() method) because it confused clang +// (and possibly other compilers that just didn't complain and silently made it a float variable +// initialized to something, probably 0.0f) +float GetScreenSeparationForGuis(); +// DG end /* ================ @@ -243,7 +248,6 @@ void idGuiModel::EmitFullScreen() bool stereoEnabled = ( renderSystem->GetStereo3DMode() != STEREO3D_OFF ); if( stereoEnabled ) { - float GetScreenSeparationForGuis(); const float screenSeparation = GetScreenSeparationForGuis(); // this will be negated on the alternate eyes, both rendered each frame diff --git a/neo/sys/Snapshot_Jobs.cpp b/neo/sys/Snapshot_Jobs.cpp index faf04189..b0b086eb 100644 --- a/neo/sys/Snapshot_Jobs.cpp +++ b/neo/sys/Snapshot_Jobs.cpp @@ -332,7 +332,13 @@ void LZWJobInternal( lzwParm_t* parm, unsigned int dmaTag ) dmaTag = dmaTag; +#ifdef __GNUC__ + // DG: remove ALIGN16 for GCC/clang, as they can't use it here and clang gets an error + idLZWCompressor lzwCompressor( parm->ioData->lzwData ); + // DG end +#else ALIGN16( idLZWCompressor lzwCompressor( parm->ioData->lzwData ) ); +#endif if( parm->fragmented ) { diff --git a/neo/sys/sdl/sdl_events.cpp b/neo/sys/sdl/sdl_events.cpp index a6769ea6..7fd4c890 100644 --- a/neo/sys/sdl/sdl_events.cpp +++ b/neo/sys/sdl/sdl_events.cpp @@ -741,6 +741,8 @@ sysEvent_t Sys_GetEvent() case SDL_WINDOWEVENT_FOCUS_LOST: GLimp_GrabInput( 0 ); break; + + // TODO: SDL_WINDOWEVENT_RESIZED } return res_none; diff --git a/neo/sys/sys_session_local.cpp b/neo/sys/sys_session_local.cpp index 370d50bf..c4d7d70f 100644 --- a/neo/sys/sys_session_local.cpp +++ b/neo/sys/sys_session_local.cpp @@ -2592,8 +2592,6 @@ idPlayerProfile* idSessionLocal::GetProfileFromMasterLocalUser() return profile; } -/* -======================== /* ======================== idSessionLocal::MoveToPressStart diff --git a/neo/ui/EditWindow.cpp b/neo/ui/EditWindow.cpp index 514b5bce..3a4cc57d 100644 --- a/neo/ui/EditWindow.cpp +++ b/neo/ui/EditWindow.cpp @@ -117,7 +117,7 @@ void idEditWindow::CommonInit() sizeBias = 0; lastTextLength = 0; forceScroll = false; - password = NULL; + password = false; // DG: this is a bool, so use false, not NULL cvar = NULL; liveUpdate = true; readonly = false; diff --git a/neo/ui/Window.cpp b/neo/ui/Window.cpp index d6f22a09..e55aa2d2 100644 --- a/neo/ui/Window.cpp +++ b/neo/ui/Window.cpp @@ -2464,7 +2464,9 @@ bool idWindow::ParseRegEntry( const char* name, idTokenParser* src ) work = name; work.ToLower(); - idWinVar* var = GetWinVarByName( work, NULL ); + // DG: second argument is a bool, so use false, not NULL + idWinVar* var = GetWinVarByName( work, false ); + // DG end if( var ) { for( int i = 0; i < NumRegisterVars; i++ ) From cca3053069e457c672e664f927a91c83d2bd18fe Mon Sep 17 00:00:00 2001 From: Daniel Gibson Date: Sun, 23 Dec 2012 05:14:48 +0100 Subject: [PATCH 17/57] Prevent segfault on shutdown This should also happen on Windows, I'm really surprised this hasn't been noticed there --- neo/idlib/containers/StrPool.h | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/neo/idlib/containers/StrPool.h b/neo/idlib/containers/StrPool.h index 5971a7e8..65ab7fa6 100644 --- a/neo/idlib/containers/StrPool.h +++ b/neo/idlib/containers/StrPool.h @@ -168,7 +168,23 @@ ID_INLINE void idStrPool::FreeString( const idPoolStr* poolStr ) { int i, hash; - assert( poolStr->numUsers >= 1 ); + /* + * DG: numUsers can actually be 0 when shutting down the game, because then + * first idCommonLocal::Quit() -> idCommonLocal::Shutdown() -> idLib::Shutdown() + * -> idDict::Shutdown() -> idDict::globalKeys.Clear() and idDict::globalVars.Clear() + * is called and then, from destructors, + * ~idSessionLocal() => destroy idDict titleStorageVars -> ~idDict() -> idDict::Clear() + * -> idDict::globalVars.FreeString() and idDict::globalKeys.FreeString() (this function) + * is called, leading here. + * So just return if poolStr->numUsers < 1, instead of segfaulting/asserting below + * when i == -1 because nothing was found here. As there is no nice way to find out if + * we're shutting down (at this point) just get rid of the following assertion: + * assert( poolStr->numUsers >= 1 ); + */ + if( poolStr->numUsers < 1 ) + return; + // DG end + assert( poolStr->pool == this ); poolStr->numUsers--; From 7cfe7dd69a875d6d46caf73a7294ee7522bbc809 Mon Sep 17 00:00:00 2001 From: Daniel Gibson Date: Sun, 23 Dec 2012 06:01:06 +0100 Subject: [PATCH 18/57] Improve CMakeLists.txt * manage warning flags in a variable, they're reused for each profile anyway (but this way profile-specific flags can still be added before or after the generic ones) * added some disable-warning flags specifically for clang --- neo/CMakeLists.txt | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/neo/CMakeLists.txt b/neo/CMakeLists.txt index 28c90ad7..3c9e5585 100644 --- a/neo/CMakeLists.txt +++ b/neo/CMakeLists.txt @@ -35,12 +35,21 @@ if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_C_COMPILER_ID STREQUAL "Clang") add_definitions(-DUSE_EXCEPTIONS) #endif() - set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -D_DEBUG -O0 -ggdb -Wno-pragmas -fno-strict-aliasing -Wno-unused-variable -Wno-unused-but-set-variable -Wno-switch") - #set(CMAKE_C_FLAGS_DEBUGALL "${CMAKE_C_FLAGS_DEBUGALL} -g -ggdb -D_DEBUG -Wno-pragmas -fno-strict-aliasing -Wno-unused-variable -Wno-unused-but-set-variable -Wno-switch") - #set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_PROFILE} -g -ggdb -D_DEBUG -O1 -fno-omit-frame-pointer -Wunknown-pragmas -fno-strict-aliasing -Wno-unused-variable -Wno-unused-but-set-variable -Wno-switch") - set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -O3 -ffast-math -fno-unsafe-math-optimizations -fomit-frame-pointer -Wno-pragmas -fno-strict-aliasing -Wno-unused-variable -Wno-unused-but-set-variable -Wno-switch") - set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -g -O3 -ffast-math -fno-unsafe-math-optimizations -fomit-frame-pointer -Wno-pragmas -fno-strict-aliasing -Wno-unused-variable -Wno-unused-but-set-variable -Wno-switch") - set(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} -Os -ffast-math -fno-unsafe-math-optimizations -fomit-frame-pointer -Wno-pragmas -fno-strict-aliasing -Wno-unused-variable -Wno-unused-but-set-variable -Wno-switch") + # the warnings are used for every profile anyway, so put them in a variable + set(my_warn_flags "-Wno-pragmas -fno-strict-aliasing -Wno-unused-variable -Wno-unused-but-set-variable -Wno-switch -Wno-unused-value") + + if(CMAKE_C_COMPILER_ID STREQUAL "Clang") + # append clang-specific settings for warnings (the second one make sure clang doesn't complain + # about unknown -W flags, like -Wno-unused-but-set-variable) + set(my_warn_flags "${my_warn_flags} -Wno-local-type-template-args -Wno-unknown-warning-option") + endif() + + set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -D_DEBUG -O0 -ggdb -fno-strict-aliasing ${my_warn_flags}") + #set(CMAKE_C_FLAGS_DEBUGALL "${CMAKE_C_FLAGS_DEBUGALL} -g -ggdb -D_DEBUG -fno-strict-aliasing ${my_warn_flags}") + #set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_PROFILE} -g -ggdb -D_DEBUG -O1 -fno-omit-frame-pointer -fno-strict-aliasing ${my_warn_flags}") + set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -O3 -ffast-math -fno-unsafe-math-optimizations -fomit-frame-pointer -fno-strict-aliasing ${my_warn_flags}") + set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -g -O3 -ffast-math -fno-unsafe-math-optimizations -fomit-frame-pointer -fno-strict-aliasing ${my_warn_flags}") + set(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} -Os -ffast-math -fno-unsafe-math-optimizations -fomit-frame-pointer -fno-strict-aliasing ${my_warn_flags}") set(CMAKE_CXX_FLAGS_DEBUG ${CMAKE_C_FLAGS_DEBUG}) #set(CMAKE_CXX_FLAGS_DEBUGALL ${CMAKE_C_FLAGS_DEBUGALL}) From 876aa9663710f56a7031e69bbd4b2f56d1fc2ce2 Mon Sep 17 00:00:00 2001 From: Daniel Gibson Date: Sun, 23 Dec 2012 06:21:01 +0100 Subject: [PATCH 19/57] Fix messed up view angle after taking screenshots Pretty much like https://github.com/dhewm/dhewm3/issues/18 but here it took some more changes --- neo/framework/Common.h | 4 +++- neo/framework/Common_local.h | 4 +++- neo/framework/common_frame.cpp | 7 +++++-- neo/renderer/RenderSystem_init.cpp | 2 +- 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/neo/framework/Common.h b/neo/framework/Common.h index 1f75164e..2eedf254 100644 --- a/neo/framework/Common.h +++ b/neo/framework/Common.h @@ -214,9 +214,11 @@ public: // Called repeatedly as the foreground thread for rendering and game logic. virtual void Frame() = 0; + // DG: added possibility to *not* release mouse in UpdateScreen(), it fucks up the view angle for screenshots // Redraws the screen, handling games, guis, console, etc // in a modal manner outside the normal frame loop - virtual void UpdateScreen( bool captureToImage ) = 0; + virtual void UpdateScreen( bool captureToImage, bool releaseMouse = true ) = 0; + // DG end virtual void UpdateLevelLoadPacifier() = 0; diff --git a/neo/framework/Common_local.h b/neo/framework/Common_local.h index cd34a0f3..590f3e9b 100644 --- a/neo/framework/Common_local.h +++ b/neo/framework/Common_local.h @@ -148,7 +148,9 @@ public: virtual void Quit(); virtual bool IsInitialized() const; virtual void Frame(); - virtual void UpdateScreen( bool captureToImage ); + // DG: added possibility to *not* release mouse in UpdateScreen(), it fucks up the view angle for screenshots + virtual void UpdateScreen( bool captureToImage, bool releaseMouse = true ); + // DG end virtual void UpdateLevelLoadPacifier(); virtual void StartupVariable( const char* match ); virtual void WriteConfigToFile( const char* filename ); diff --git a/neo/framework/common_frame.cpp b/neo/framework/common_frame.cpp index 4d053fee..a1968f50 100644 --- a/neo/framework/common_frame.cpp +++ b/neo/framework/common_frame.cpp @@ -349,7 +349,8 @@ idCommonLocal::UpdateScreen This is an out-of-sequence screen update, not the normal game rendering =============== */ -void idCommonLocal::UpdateScreen( bool captureToImage ) +// DG: added possibility to *not* release mouse in UpdateScreen(), it fucks up the view angle for screenshots +void idCommonLocal::UpdateScreen( bool captureToImage, bool releaseMouse ) { if( insideUpdateScreen ) { @@ -361,7 +362,9 @@ void idCommonLocal::UpdateScreen( bool captureToImage ) gameThread.WaitForThread(); // release the mouse capture back to the desktop - Sys_GrabMouseCursor( false ); + if( releaseMouse ) + Sys_GrabMouseCursor( false ); + // DG end // build all the draw commands without running a new game tic Draw(); diff --git a/neo/renderer/RenderSystem_init.cpp b/neo/renderer/RenderSystem_init.cpp index b5de4e09..c10b83e1 100644 --- a/neo/renderer/RenderSystem_init.cpp +++ b/neo/renderer/RenderSystem_init.cpp @@ -1298,7 +1298,7 @@ void R_ReadTiledPixels( int width, int height, byte* buffer, renderView_t* ref = else { const bool captureToImage = false; - common->UpdateScreen( captureToImage ); + common->UpdateScreen( captureToImage, false ); } int w = sysWidth; From e3584014b95ae5c0f75f383e611310673820d69d Mon Sep 17 00:00:00 2001 From: Robert Beckebans Date: Mon, 24 Dec 2012 12:34:18 +0100 Subject: [PATCH 20/57] Fixed MSVC C++ exception warnings --- neo/idlib/Heap.h | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/neo/idlib/Heap.h b/neo/idlib/Heap.h index 635dad49..f93a6273 100644 --- a/neo/idlib/Heap.h +++ b/neo/idlib/Heap.h @@ -57,6 +57,7 @@ ID_INLINE void* Mem_Alloc( const size_t size, const memTag_t tag ) { return Mem_Alloc16( size, tag ); } + ID_INLINE void Mem_Free( void* ptr ) { Mem_Free16( ptr ); @@ -66,34 +67,55 @@ void* Mem_ClearedAlloc( const size_t size, const memTag_t tag ); char* Mem_CopyString( const char* in ); // RB end -ID_INLINE void* operator new( size_t s ) throw( std::bad_alloc ) // DG: standard signature seems to include throw(..) +ID_INLINE void* operator new( size_t s ) +#if !defined(_MSC_VER) +throw( std::bad_alloc ) // DG: standard signature seems to include throw(..) +#endif { return Mem_Alloc( s, TAG_NEW ); } -ID_INLINE void operator delete( void* p ) throw() // DG: delete musn't throw + +ID_INLINE void operator delete( void* p ) +#if !defined(_MSC_VER) +throw() // DG: delete musn't throw +#endif { Mem_Free( p ); } -ID_INLINE void* operator new[]( size_t s ) throw( std::bad_alloc ) // DG: standard signature seems to include throw(..) +ID_INLINE void* operator new[]( size_t s ) +#if !defined(_MSC_VER) +throw( std::bad_alloc ) // DG: standard signature seems to include throw(..) +#endif { return Mem_Alloc( s, TAG_NEW ); } -ID_INLINE void operator delete[]( void* p ) throw() // DG: delete musn't throw + +ID_INLINE void operator delete[]( void* p ) +#if !defined(_MSC_VER) +throw() // DG: delete musn't throw +#endif { Mem_Free( p ); } + ID_INLINE void* operator new( size_t s, memTag_t tag ) { return Mem_Alloc( s, tag ); } -ID_INLINE void operator delete( void* p, memTag_t tag ) throw() // DG: delete musn't throw + +ID_INLINE void operator delete( void* p, memTag_t tag ) +#if !defined(_MSC_VER) +throw() // DG: delete musn't throw +#endif { Mem_Free( p ); } + ID_INLINE void* operator new[]( size_t s, memTag_t tag ) { return Mem_Alloc( s, tag ); } + ID_INLINE void operator delete[]( void* p, memTag_t tag ) throw() // DG: delete musn't throw { Mem_Free( p ); From f77ca851d545f9b37e4203fbef238b80320dab42 Mon Sep 17 00:00:00 2001 From: Daniel Gibson Date: Sat, 29 Dec 2012 04:27:01 +0100 Subject: [PATCH 21/57] Small fix in Mem_Alloc16(): int->size_t --- neo/idlib/Heap.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/neo/idlib/Heap.cpp b/neo/idlib/Heap.cpp index e4ea9cad..332a45f9 100644 --- a/neo/idlib/Heap.cpp +++ b/neo/idlib/Heap.cpp @@ -52,7 +52,7 @@ void* Mem_Alloc16( const size_t size, const memTag_t tag ) { return NULL; } - const int paddedSize = ( size + 15 ) & ~15; + const size_t paddedSize = ( size + 15 ) & ~15; #ifdef _WIN32 // this should work with MSVC and mingw, as long as __MSVCRT_VERSION__ >= 0x0700 return _aligned_malloc( paddedSize, 16 ); From 1e3bc3429bded775d451999a1127473d888f5bd9 Mon Sep 17 00:00:00 2001 From: Daniel Gibson Date: Sat, 29 Dec 2012 05:23:06 +0100 Subject: [PATCH 22/57] Fix Sys_ListFiles() on POSIX as needed for savegames In Sys_ListFiles() the extension was abused to match whole filenames (of savegames), not just their extensions - that didn't work with the POSIX backend, now it does. Sys_ListFiles() now also supports "*" as a wildcard that matches all files - needed for deleting savegames. However, things like "bl*" or "*ub" don't work. While at it, I replaced readdir() with the thread-safe readdir_r() --- neo/sys/posix/posix_main.cpp | 44 ++++++++++++++++++++++++++++-------- 1 file changed, 35 insertions(+), 9 deletions(-) diff --git a/neo/sys/posix/posix_main.cpp b/neo/sys/posix/posix_main.cpp index 362b64d2..1c45d29e 100644 --- a/neo/sys/posix/posix_main.cpp +++ b/neo/sys/posix/posix_main.cpp @@ -359,9 +359,12 @@ int Sys_ListFiles( const char* directory, const char* extension, idStrList& list debug = cvarSystem->GetCVarBool( "fs_debug" ); - if( !extension ) + // DG: handle "*" as special case that matches everything + // FIXME: handle * properly as a wildcase somewhere in the string? + if( !extension || ( extension[0] == '*' && extension[1] == '\0' ) ) extension = ""; - + // DG end + // passing a slash as extension will find directories if( extension[0] == '/' && extension[1] == 0 ) { @@ -380,20 +383,42 @@ int Sys_ListFiles( const char* directory, const char* extension, idStrList& list return -1; } - while( ( d = readdir( fdir ) ) != NULL ) + // DG: use readdir_r instead of readdir for thread safety + // the following lines are from the readdir_r manpage.. fscking ugly. + int nameMax = pathconf( directory, _PC_NAME_MAX ); + if( nameMax == -1 ) + nameMax = 255; + int direntLen = offsetof( struct dirent, d_name ) + nameMax + 1; + + struct dirent* entry = ( struct dirent* )Mem_Alloc( direntLen, TAG_CRAP ); + + if( entry == NULL ) { + common->Warning( "Sys_ListFiles: Mem_Alloc for entry failed!" ); + closedir( fdir ); + return 0; + } + + int extLen = idStr::Length( extension ); + + while( readdir_r( fdir, entry, &d ) == 0 && d != NULL ) + { + // DG end idStr::snPrintf( search, sizeof( search ), "%s/%s", directory, d->d_name ); if( stat( search, &st ) == -1 ) continue; if( !dironly ) { - idStr look( search ); - idStr ext; - look.ExtractFileExtension( ext ); - if( extension[0] != '\0' && ext.Icmp( &extension[1] ) != 0 ) - { + // DG: the original code didn't work because d3 bfg abuses the extension + // to match whole filenames in the savegame-code, not just file extensions... + // the extension must be the last chars of the filename + // so start matching at startPos = strlen(d->d_name) - strlen(extension) + int startPos = idStr::Length( d->d_name ) - extLen; + // of course the extension can't match if it's longer than the filename, i.e. startPos < 0 + if( startPos < 0 || idStr::FindText( d->d_name, extension, true, startPos ) < 0 ) continue; - } + + // DG end } if( ( dironly && !( st.st_mode & S_IFDIR ) ) || ( !dironly && ( st.st_mode & S_IFDIR ) ) ) @@ -403,6 +428,7 @@ int Sys_ListFiles( const char* directory, const char* extension, idStrList& list } closedir( fdir ); + Mem_Free( entry ); if( debug ) { From edb4856abdf712b7a452dc18d95dcbf16fdc82c5 Mon Sep 17 00:00:00 2001 From: Daniel Gibson Date: Sat, 29 Dec 2012 05:23:58 +0100 Subject: [PATCH 23/57] Set timestamp for savegames on POSIX So they can be sorted correctly etc --- neo/sys/posix/posix_savegame.cpp | 40 ++++---------------------------- 1 file changed, 4 insertions(+), 36 deletions(-) diff --git a/neo/sys/posix/posix_savegame.cpp b/neo/sys/posix/posix_savegame.cpp index 2e34eeec..c58bae95 100644 --- a/neo/sys/posix/posix_savegame.cpp +++ b/neo/sys/posix/posix_savegame.cpp @@ -478,42 +478,10 @@ int idSaveGameThread::Enumerate() } } - // RB: FIXME ? - - // use current time - time_t aclock; - time( &aclock ); - - /* - // Use the date from the directory - WIN32_FILE_ATTRIBUTE_DATA attrData; - BOOL attrRet = GetFileAttributesEx( file->GetFullPath(), GetFileExInfoStandard, &attrData ); - delete file; - if( attrRet == TRUE ) - { - FILETIME lastWriteTime = attrData.ftLastWriteTime; - const ULONGLONG second = 10000000L; // One second = 10,000,000 * 100 nsec - SYSTEMTIME base_st = { 1970, 1, 0, 1, 0, 0, 0, 0 }; - ULARGE_INTEGER itime; - FILETIME base_ft; - BOOL success = SystemTimeToFileTime( &base_st, &base_ft ); - - itime.QuadPart = ( ( ULARGE_INTEGER* )&lastWriteTime )->QuadPart; - if( success ) - { - itime.QuadPart -= ( ( ULARGE_INTEGER* )&base_ft )->QuadPart; - } - else - { - // Hard coded number of 100-nanosecond units from 1/1/1601 to 1/1/1970 - itime.QuadPart -= 116444736000000000LL; - } - itime.QuadPart /= second; - details->date = itime.QuadPart; - } - */ - - // RB end + // DG: just use the idFile object's timestamp - the windows code gets file attributes and + // other complicated stuff like that.. I'm wonderin what that was good for.. this seems to work. + details->date = file->Timestamp(); + // DG end } else { From 478d7e4f6e319ecf6b657b8ffe79e2f44c62028c Mon Sep 17 00:00:00 2001 From: Daniel Gibson Date: Sun, 30 Dec 2012 16:24:12 +0100 Subject: [PATCH 24/57] Workaround for erebus1 crash in debug mode on Linux --- neo/renderer/tr_backend_draw.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/neo/renderer/tr_backend_draw.cpp b/neo/renderer/tr_backend_draw.cpp index 11157a08..4979ef46 100644 --- a/neo/renderer/tr_backend_draw.cpp +++ b/neo/renderer/tr_backend_draw.cpp @@ -178,7 +178,13 @@ void RB_DrawElementsWithCounters( const drawSurf_t* surf ) if( surf->jointCache ) { - if( !verify( renderProgManager.ShaderUsesJoints() ) ) + // DG: this happens all the time in the erebus1 map with blendlight.vfp, + // so don't call assert (through verify) here until it's fixed (if fixable) + // else the game crashes on linux when using debug builds + // FIXME: fix this properly if possible? + //if( !verify( renderProgManager.ShaderUsesJoints() ) ) + if( ! renderProgManager.ShaderUsesJoints() ) + // DG end { return; } From a102d9d46941306dde3afd0f2a59e69701cbb4ab Mon Sep 17 00:00:00 2001 From: Daniel Gibson Date: Sun, 30 Dec 2012 16:26:24 +0100 Subject: [PATCH 25/57] also do Sys_Sleep for less then 20ms Sys_Sleep(10) is used quite often throughout the code. --- neo/sys/posix/posix_main.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/neo/sys/posix/posix_main.cpp b/neo/sys/posix/posix_main.cpp index 1c45d29e..ea460114 100644 --- a/neo/sys/posix/posix_main.cpp +++ b/neo/sys/posix/posix_main.cpp @@ -656,6 +656,8 @@ ID_TIME_T Sys_FileTimeStamp( idFileHandle fp ) void Sys_Sleep( int msec ) { +#if 0 // DG: I don't really care, this spams the console (and on windows this case isn't handled either) + // Furthermore, there are several Sys_Sleep( 10 ) calls throughout the code if( msec < 20 ) { static int last = 0; @@ -668,7 +670,7 @@ void Sys_Sleep( int msec ) // ignore that sleep call, keep going return; } - +#endif // DG end // use nanosleep? keep sleeping if signal interrupt? // RB begin From 634f7ea630902e0d9e0869ca0dbfeca0cb6d7315 Mon Sep 17 00:00:00 2001 From: Daniel Gibson Date: Sun, 30 Dec 2012 17:28:23 +0100 Subject: [PATCH 26/57] Update zlib to version 1.2.7 --- README.txt | 2 +- neo/libs/zlib/ChangeLog | 556 ++++++++- neo/libs/zlib/FAQ | 267 +++-- neo/libs/zlib/INDEX | 41 +- neo/libs/zlib/Makefile | 157 +-- neo/libs/zlib/Makefile.in | 260 ++++- neo/libs/zlib/README | 94 +- neo/libs/zlib/adler32.c | 102 +- neo/libs/zlib/compress.c | 5 +- neo/libs/zlib/configure | 725 +++++++++--- neo/libs/zlib/crc32.c | 112 +- neo/libs/zlib/crc32.h | 2 +- neo/libs/zlib/deflate.c | 513 ++++++--- neo/libs/zlib/deflate.h | 43 +- neo/libs/zlib/gzclose.c | 25 + neo/libs/zlib/gzguts.h | 193 ++++ neo/libs/zlib/gzio.c | 1026 ----------------- neo/libs/zlib/gzlib.c | 620 ++++++++++ neo/libs/zlib/gzread.c | 589 ++++++++++ neo/libs/zlib/gzwrite.c | 565 +++++++++ neo/libs/zlib/infback.c | 103 +- neo/libs/zlib/inffast.c | 80 +- neo/libs/zlib/inffast.h | 4 +- neo/libs/zlib/inffixed.h | 6 +- neo/libs/zlib/inflate.c | 420 ++++--- neo/libs/zlib/inflate.h | 31 +- neo/libs/zlib/inftrees.c | 93 +- neo/libs/zlib/inftrees.h | 27 +- neo/libs/zlib/trees.c | 133 +-- neo/libs/zlib/trees.h | 4 +- neo/libs/zlib/uncompr.c | 4 +- neo/libs/zlib/zconf.h | 290 ++++- neo/libs/zlib/{zconf.in.h => zconf.h.in} | 290 ++++- neo/libs/zlib/zconf.h.included | 506 ++++++++ neo/libs/zlib/zlib.h | 1331 ++++++++++++++-------- neo/libs/zlib/zutil.c | 54 +- neo/libs/zlib/zutil.h | 137 +-- 37 files changed, 6489 insertions(+), 2921 deletions(-) mode change 100644 => 100755 neo/libs/zlib/configure create mode 100644 neo/libs/zlib/gzclose.c create mode 100644 neo/libs/zlib/gzguts.h delete mode 100644 neo/libs/zlib/gzio.c create mode 100644 neo/libs/zlib/gzlib.c create mode 100644 neo/libs/zlib/gzread.c create mode 100644 neo/libs/zlib/gzwrite.c rename neo/libs/zlib/{zconf.in.h => zconf.h.in} (55%) create mode 100644 neo/libs/zlib/zconf.h.included diff --git a/README.txt b/README.txt index 555482bd..6c0dbc48 100644 --- a/README.txt +++ b/README.txt @@ -270,7 +270,7 @@ zlib library --------------------------------------------------------------------------- neo/libs/zlib/* -Copyright (C) 1995-2005 Jean-loup Gailly and Mark Adler +Copyright (C) 1995-2012 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/neo/libs/zlib/ChangeLog b/neo/libs/zlib/ChangeLog index 7f6869d3..c2c643a1 100644 --- a/neo/libs/zlib/ChangeLog +++ b/neo/libs/zlib/ChangeLog @@ -1,6 +1,560 @@ ChangeLog file for zlib +Changes in 1.2.7 (2 May 2012) +- Replace use of memmove() with a simple copy for portability +- Test for existence of strerror +- Restore gzgetc_ for backward compatibility with 1.2.6 +- Fix build with non-GNU make on Solaris +- Require gcc 4.0 or later on Mac OS X to use the hidden attribute +- Include unistd.h for Watcom C +- Use __WATCOMC__ instead of __WATCOM__ +- Do not use the visibility attribute if NO_VIZ defined +- Improve the detection of no hidden visibility attribute +- Avoid using __int64 for gcc or solo compilation +- Cast to char * in gzprintf to avoid warnings [Zinser] +- Fix make_vms.com for VAX [Zinser] +- Don't use library or built-in byte swaps +- Simplify test and use of gcc hidden attribute +- Fix bug in gzclose_w() when gzwrite() fails to allocate memory +- Add "x" (O_EXCL) and "e" (O_CLOEXEC) modes support to gzopen() +- Fix bug in test/minigzip.c for configure --solo +- Fix contrib/vstudio project link errors [Mohanathas] +- Add ability to choose the builder in make_vms.com [Schweda] +- Add DESTDIR support to mingw32 win32/Makefile.gcc +- Fix comments in win32/Makefile.gcc for proper usage +- Allow overriding the default install locations for cmake +- Generate and install the pkg-config file with cmake +- Build both a static and a shared version of zlib with cmake +- Include version symbols for cmake builds +- If using cmake with MSVC, add the source directory to the includes +- Remove unneeded EXTRA_CFLAGS from win32/Makefile.gcc [Truta] +- Move obsolete emx makefile to old [Truta] +- Allow the use of -Wundef when compiling or using zlib +- Avoid the use of the -u option with mktemp +- Improve inflate() documentation on the use of Z_FINISH +- Recognize clang as gcc +- Add gzopen_w() in Windows for wide character path names +- Rename zconf.h in CMakeLists.txt to move it out of the way +- Add source directory in CMakeLists.txt for building examples +- Look in build directory for zlib.pc in CMakeLists.txt +- Remove gzflags from zlibvc.def in vc9 and vc10 +- Fix contrib/minizip compilation in the MinGW environment +- Update ./configure for Solaris, support --64 [Mooney] +- Remove -R. from Solaris shared build (possible security issue) +- Avoid race condition for parallel make (-j) running example +- Fix type mismatch between get_crc_table() and crc_table +- Fix parsing of version with "-" in CMakeLists.txt [Snider, Ziegler] +- Fix the path to zlib.map in CMakeLists.txt +- Force the native libtool in Mac OS X to avoid GNU libtool [Beebe] +- Add instructions to win32/Makefile.gcc for shared install [Torri] + +Changes in 1.2.6.1 (12 Feb 2012) +- Avoid the use of the Objective-C reserved name "id" +- Include io.h in gzguts.h for Microsoft compilers +- Fix problem with ./configure --prefix and gzgetc macro +- Include gz_header definition when compiling zlib solo +- Put gzflags() functionality back in zutil.c +- Avoid library header include in crc32.c for Z_SOLO +- Use name in GCC_CLASSIC as C compiler for coverage testing, if set +- Minor cleanup in contrib/minizip/zip.c [Vollant] +- Update make_vms.com [Zinser] +- Remove unnecessary gzgetc_ function +- Use optimized byte swap operations for Microsoft and GNU [Snyder] +- Fix minor typo in zlib.h comments [Rzesniowiecki] + +Changes in 1.2.6 (29 Jan 2012) +- Update the Pascal interface in contrib/pascal +- Fix function numbers for gzgetc_ in zlibvc.def files +- Fix configure.ac for contrib/minizip [Schiffer] +- Fix large-entry detection in minizip on 64-bit systems [Schiffer] +- Have ./configure use the compiler return code for error indication +- Fix CMakeLists.txt for cross compilation [McClure] +- Fix contrib/minizip/zip.c for 64-bit architectures [Dalsnes] +- Fix compilation of contrib/minizip on FreeBSD [Marquez] +- Correct suggested usages in win32/Makefile.msc [Shachar, Horvath] +- Include io.h for Turbo C / Borland C on all platforms [Truta] +- Make version explicit in contrib/minizip/configure.ac [Bosmans] +- Avoid warning for no encryption in contrib/minizip/zip.c [Vollant] +- Minor cleanup up contrib/minizip/unzip.c [Vollant] +- Fix bug when compiling minizip with C++ [Vollant] +- Protect for long name and extra fields in contrib/minizip [Vollant] +- Avoid some warnings in contrib/minizip [Vollant] +- Add -I../.. -L../.. to CFLAGS for minizip and miniunzip +- Add missing libs to minizip linker command +- Add support for VPATH builds in contrib/minizip +- Add an --enable-demos option to contrib/minizip/configure +- Add the generation of configure.log by ./configure +- Exit when required parameters not provided to win32/Makefile.gcc +- Have gzputc return the character written instead of the argument +- Use the -m option on ldconfig for BSD systems [Tobias] +- Correct in zlib.map when deflateResetKeep was added + +Changes in 1.2.5.3 (15 Jan 2012) +- Restore gzgetc function for binary compatibility +- Do not use _lseeki64 under Borland C++ [Truta] +- Update win32/Makefile.msc to build test/*.c [Truta] +- Remove old/visualc6 given CMakefile and other alternatives +- Update AS400 build files and documentation [Monnerat] +- Update win32/Makefile.gcc to build test/*.c [Truta] +- Permit stronger flushes after Z_BLOCK flushes +- Avoid extraneous empty blocks when doing empty flushes +- Permit Z_NULL arguments to deflatePending +- Allow deflatePrime() to insert bits in the middle of a stream +- Remove second empty static block for Z_PARTIAL_FLUSH +- Write out all of the available bits when using Z_BLOCK +- Insert the first two strings in the hash table after a flush + +Changes in 1.2.5.2 (17 Dec 2011) +- fix ld error: unable to find version dependency 'ZLIB_1.2.5' +- use relative symlinks for shared libs +- Avoid searching past window for Z_RLE strategy +- Assure that high-water mark initialization is always applied in deflate +- Add assertions to fill_window() in deflate.c to match comments +- Update python link in README +- Correct spelling error in gzread.c +- Fix bug in gzgets() for a concatenated empty gzip stream +- Correct error in comment for gz_make() +- Change gzread() and related to ignore junk after gzip streams +- Allow gzread() and related to continue after gzclearerr() +- Allow gzrewind() and gzseek() after a premature end-of-file +- Simplify gzseek() now that raw after gzip is ignored +- Change gzgetc() to a macro for speed (~40% speedup in testing) +- Fix gzclose() to return the actual error last encountered +- Always add large file support for windows +- Include zconf.h for windows large file support +- Include zconf.h.cmakein for windows large file support +- Update zconf.h.cmakein on make distclean +- Merge vestigial vsnprintf determination from zutil.h to gzguts.h +- Clarify how gzopen() appends in zlib.h comments +- Correct documentation of gzdirect() since junk at end now ignored +- Add a transparent write mode to gzopen() when 'T' is in the mode +- Update python link in zlib man page +- Get inffixed.h and MAKEFIXED result to match +- Add a ./config --solo option to make zlib subset with no libary use +- Add undocumented inflateResetKeep() function for CAB file decoding +- Add --cover option to ./configure for gcc coverage testing +- Add #define ZLIB_CONST option to use const in the z_stream interface +- Add comment to gzdopen() in zlib.h to use dup() when using fileno() +- Note behavior of uncompress() to provide as much data as it can +- Add files in contrib/minizip to aid in building libminizip +- Split off AR options in Makefile.in and configure +- Change ON macro to Z_ARG to avoid application conflicts +- Facilitate compilation with Borland C++ for pragmas and vsnprintf +- Include io.h for Turbo C / Borland C++ +- Move example.c and minigzip.c to test/ +- Simplify incomplete code table filling in inflate_table() +- Remove code from inflate.c and infback.c that is impossible to execute +- Test the inflate code with full coverage +- Allow deflateSetDictionary, inflateSetDictionary at any time (in raw) +- Add deflateResetKeep and fix inflateResetKeep to retain dictionary +- Fix gzwrite.c to accommodate reduced memory zlib compilation +- Have inflate() with Z_FINISH avoid the allocation of a window +- Do not set strm->adler when doing raw inflate +- Fix gzeof() to behave just like feof() when read is not past end of file +- Fix bug in gzread.c when end-of-file is reached +- Avoid use of Z_BUF_ERROR in gz* functions except for premature EOF +- Document gzread() capability to read concurrently written files +- Remove hard-coding of resource compiler in CMakeLists.txt [Blammo] + +Changes in 1.2.5.1 (10 Sep 2011) +- Update FAQ entry on shared builds (#13) +- Avoid symbolic argument to chmod in Makefile.in +- Fix bug and add consts in contrib/puff [Oberhumer] +- Update contrib/puff/zeros.raw test file to have all block types +- Add full coverage test for puff in contrib/puff/Makefile +- Fix static-only-build install in Makefile.in +- Fix bug in unzGetCurrentFileInfo() in contrib/minizip [Kuno] +- Add libz.a dependency to shared in Makefile.in for parallel builds +- Spell out "number" (instead of "nb") in zlib.h for total_in, total_out +- Replace $(...) with `...` in configure for non-bash sh [Bowler] +- Add darwin* to Darwin* and solaris* to SunOS\ 5* in configure [Groffen] +- Add solaris* to Linux* in configure to allow gcc use [Groffen] +- Add *bsd* to Linux* case in configure [Bar-Lev] +- Add inffast.obj to dependencies in win32/Makefile.msc +- Correct spelling error in deflate.h [Kohler] +- Change libzdll.a again to libz.dll.a (!) in win32/Makefile.gcc +- Add test to configure for GNU C looking for gcc in output of $cc -v +- Add zlib.pc generation to win32/Makefile.gcc [Weigelt] +- Fix bug in zlib.h for _FILE_OFFSET_BITS set and _LARGEFILE64_SOURCE not +- Add comment in zlib.h that adler32_combine with len2 < 0 makes no sense +- Make NO_DIVIDE option in adler32.c much faster (thanks to John Reiser) +- Make stronger test in zconf.h to include unistd.h for LFS +- Apply Darwin patches for 64-bit file offsets to contrib/minizip [Slack] +- Fix zlib.h LFS support when Z_PREFIX used +- Add updated as400 support (removed from old) [Monnerat] +- Avoid deflate sensitivity to volatile input data +- Avoid division in adler32_combine for NO_DIVIDE +- Clarify the use of Z_FINISH with deflateBound() amount of space +- Set binary for output file in puff.c +- Use u4 type for crc_table to avoid conversion warnings +- Apply casts in zlib.h to avoid conversion warnings +- Add OF to prototypes for adler32_combine_ and crc32_combine_ [Miller] +- Improve inflateSync() documentation to note indeterminancy +- Add deflatePending() function to return the amount of pending output +- Correct the spelling of "specification" in FAQ [Randers-Pehrson] +- Add a check in configure for stdarg.h, use for gzprintf() +- Check that pointers fit in ints when gzprint() compiled old style +- Add dummy name before $(SHAREDLIBV) in Makefile [Bar-Lev, Bowler] +- Delete line in configure that adds -L. libz.a to LDFLAGS [Weigelt] +- Add debug records in assmebler code [Londer] +- Update RFC references to use http://tools.ietf.org/html/... [Li] +- Add --archs option, use of libtool to configure for Mac OS X [Borstel] + +Changes in 1.2.5 (19 Apr 2010) +- Disable visibility attribute in win32/Makefile.gcc [Bar-Lev] +- Default to libdir as sharedlibdir in configure [Nieder] +- Update copyright dates on modified source files +- Update trees.c to be able to generate modified trees.h +- Exit configure for MinGW, suggesting win32/Makefile.gcc +- Check for NULL path in gz_open [Homurlu] + +Changes in 1.2.4.5 (18 Apr 2010) +- Set sharedlibdir in configure [Torok] +- Set LDFLAGS in Makefile.in [Bar-Lev] +- Avoid mkdir objs race condition in Makefile.in [Bowler] +- Add ZLIB_INTERNAL in front of internal inter-module functions and arrays +- Define ZLIB_INTERNAL to hide internal functions and arrays for GNU C +- Don't use hidden attribute when it is a warning generator (e.g. Solaris) + +Changes in 1.2.4.4 (18 Apr 2010) +- Fix CROSS_PREFIX executable testing, CHOST extract, mingw* [Torok] +- Undefine _LARGEFILE64_SOURCE in zconf.h if it is zero, but not if empty +- Try to use bash or ksh regardless of functionality of /bin/sh +- Fix configure incompatibility with NetBSD sh +- Remove attempt to run under bash or ksh since have better NetBSD fix +- Fix win32/Makefile.gcc for MinGW [Bar-Lev] +- Add diagnostic messages when using CROSS_PREFIX in configure +- Added --sharedlibdir option to configure [Weigelt] +- Use hidden visibility attribute when available [Frysinger] + +Changes in 1.2.4.3 (10 Apr 2010) +- Only use CROSS_PREFIX in configure for ar and ranlib if they exist +- Use CROSS_PREFIX for nm [Bar-Lev] +- Assume _LARGEFILE64_SOURCE defined is equivalent to true +- Avoid use of undefined symbols in #if with && and || +- Make *64 prototypes in gzguts.h consistent with functions +- Add -shared load option for MinGW in configure [Bowler] +- Move z_off64_t to public interface, use instead of off64_t +- Remove ! from shell test in configure (not portable to Solaris) +- Change +0 macro tests to -0 for possibly increased portability + +Changes in 1.2.4.2 (9 Apr 2010) +- Add consistent carriage returns to readme.txt's in masmx86 and masmx64 +- Really provide prototypes for *64 functions when building without LFS +- Only define unlink() in minigzip.c if unistd.h not included +- Update README to point to contrib/vstudio project files +- Move projects/vc6 to old/ and remove projects/ +- Include stdlib.h in minigzip.c for setmode() definition under WinCE +- Clean up assembler builds in win32/Makefile.msc [Rowe] +- Include sys/types.h for Microsoft for off_t definition +- Fix memory leak on error in gz_open() +- Symbolize nm as $NM in configure [Weigelt] +- Use TEST_LDSHARED instead of LDSHARED to link test programs [Weigelt] +- Add +0 to _FILE_OFFSET_BITS and _LFS64_LARGEFILE in case not defined +- Fix bug in gzeof() to take into account unused input data +- Avoid initialization of structures with variables in puff.c +- Updated win32/README-WIN32.txt [Rowe] + +Changes in 1.2.4.1 (28 Mar 2010) +- Remove the use of [a-z] constructs for sed in configure [gentoo 310225] +- Remove $(SHAREDLIB) from LIBS in Makefile.in [Creech] +- Restore "for debugging" comment on sprintf() in gzlib.c +- Remove fdopen for MVS from gzguts.h +- Put new README-WIN32.txt in win32 [Rowe] +- Add check for shell to configure and invoke another shell if needed +- Fix big fat stinking bug in gzseek() on uncompressed files +- Remove vestigial F_OPEN64 define in zutil.h +- Set and check the value of _LARGEFILE_SOURCE and _LARGEFILE64_SOURCE +- Avoid errors on non-LFS systems when applications define LFS macros +- Set EXE to ".exe" in configure for MINGW [Kahle] +- Match crc32() in crc32.c exactly to the prototype in zlib.h [Sherrill] +- Add prefix for cross-compilation in win32/makefile.gcc [Bar-Lev] +- Add DLL install in win32/makefile.gcc [Bar-Lev] +- Allow Linux* or linux* from uname in configure [Bar-Lev] +- Allow ldconfig to be redefined in configure and Makefile.in [Bar-Lev] +- Add cross-compilation prefixes to configure [Bar-Lev] +- Match type exactly in gz_load() invocation in gzread.c +- Match type exactly of zcalloc() in zutil.c to zlib.h alloc_func +- Provide prototypes for *64 functions when building zlib without LFS +- Don't use -lc when linking shared library on MinGW +- Remove errno.h check in configure and vestigial errno code in zutil.h + +Changes in 1.2.4 (14 Mar 2010) +- Fix VER3 extraction in configure for no fourth subversion +- Update zlib.3, add docs to Makefile.in to make .pdf out of it +- Add zlib.3.pdf to distribution +- Don't set error code in gzerror() if passed pointer is NULL +- Apply destination directory fixes to CMakeLists.txt [Lowman] +- Move #cmakedefine's to a new zconf.in.cmakein +- Restore zconf.h for builds that don't use configure or cmake +- Add distclean to dummy Makefile for convenience +- Update and improve INDEX, README, and FAQ +- Update CMakeLists.txt for the return of zconf.h [Lowman] +- Update contrib/vstudio/vc9 and vc10 [Vollant] +- Change libz.dll.a back to libzdll.a in win32/Makefile.gcc +- Apply license and readme changes to contrib/asm686 [Raiter] +- Check file name lengths and add -c option in minigzip.c [Li] +- Update contrib/amd64 and contrib/masmx86/ [Vollant] +- Avoid use of "eof" parameter in trees.c to not shadow library variable +- Update make_vms.com for removal of zlibdefs.h [Zinser] +- Update assembler code and vstudio projects in contrib [Vollant] +- Remove outdated assembler code contrib/masm686 and contrib/asm586 +- Remove old vc7 and vc8 from contrib/vstudio +- Update win32/Makefile.msc, add ZLIB_VER_SUBREVISION [Rowe] +- Fix memory leaks in gzclose_r() and gzclose_w(), file leak in gz_open() +- Add contrib/gcc_gvmat64 for longest_match and inflate_fast [Vollant] +- Remove *64 functions from win32/zlib.def (they're not 64-bit yet) +- Fix bug in void-returning vsprintf() case in gzwrite.c +- Fix name change from inflate.h in contrib/inflate86/inffas86.c +- Check if temporary file exists before removing in make_vms.com [Zinser] +- Fix make install and uninstall for --static option +- Fix usage of _MSC_VER in gzguts.h and zutil.h [Truta] +- Update readme.txt in contrib/masmx64 and masmx86 to assemble + +Changes in 1.2.3.9 (21 Feb 2010) +- Expunge gzio.c +- Move as400 build information to old +- Fix updates in contrib/minizip and contrib/vstudio +- Add const to vsnprintf test in configure to avoid warnings [Weigelt] +- Delete zconf.h (made by configure) [Weigelt] +- Change zconf.in.h to zconf.h.in per convention [Weigelt] +- Check for NULL buf in gzgets() +- Return empty string for gzgets() with len == 1 (like fgets()) +- Fix description of gzgets() in zlib.h for end-of-file, NULL return +- Update minizip to 1.1 [Vollant] +- Avoid MSVC loss of data warnings in gzread.c, gzwrite.c +- Note in zlib.h that gzerror() should be used to distinguish from EOF +- Remove use of snprintf() from gzlib.c +- Fix bug in gzseek() +- Update contrib/vstudio, adding vc9 and vc10 [Kuno, Vollant] +- Fix zconf.h generation in CMakeLists.txt [Lowman] +- Improve comments in zconf.h where modified by configure + +Changes in 1.2.3.8 (13 Feb 2010) +- Clean up text files (tabs, trailing whitespace, etc.) [Oberhumer] +- Use z_off64_t in gz_zero() and gz_skip() to match state->skip +- Avoid comparison problem when sizeof(int) == sizeof(z_off64_t) +- Revert to Makefile.in from 1.2.3.6 (live with the clutter) +- Fix missing error return in gzflush(), add zlib.h note +- Add *64 functions to zlib.map [Levin] +- Fix signed/unsigned comparison in gz_comp() +- Use SFLAGS when testing shared linking in configure +- Add --64 option to ./configure to use -m64 with gcc +- Fix ./configure --help to correctly name options +- Have make fail if a test fails [Levin] +- Avoid buffer overrun in contrib/masmx64/gvmat64.asm [Simpson] +- Remove assembler object files from contrib + +Changes in 1.2.3.7 (24 Jan 2010) +- Always gzopen() with O_LARGEFILE if available +- Fix gzdirect() to work immediately after gzopen() or gzdopen() +- Make gzdirect() more precise when the state changes while reading +- Improve zlib.h documentation in many places +- Catch memory allocation failure in gz_open() +- Complete close operation if seek forward in gzclose_w() fails +- Return Z_ERRNO from gzclose_r() if close() fails +- Return Z_STREAM_ERROR instead of EOF for gzclose() being passed NULL +- Return zero for gzwrite() errors to match zlib.h description +- Return -1 on gzputs() error to match zlib.h description +- Add zconf.in.h to allow recovery from configure modification [Weigelt] +- Fix static library permissions in Makefile.in [Weigelt] +- Avoid warnings in configure tests that hide functionality [Weigelt] +- Add *BSD and DragonFly to Linux case in configure [gentoo 123571] +- Change libzdll.a to libz.dll.a in win32/Makefile.gcc [gentoo 288212] +- Avoid access of uninitialized data for first inflateReset2 call [Gomes] +- Keep object files in subdirectories to reduce the clutter somewhat +- Remove default Makefile and zlibdefs.h, add dummy Makefile +- Add new external functions to Z_PREFIX, remove duplicates, z_z_ -> z_ +- Remove zlibdefs.h completely -- modify zconf.h instead + +Changes in 1.2.3.6 (17 Jan 2010) +- Avoid void * arithmetic in gzread.c and gzwrite.c +- Make compilers happier with const char * for gz_error message +- Avoid unused parameter warning in inflate.c +- Avoid signed-unsigned comparison warning in inflate.c +- Indent #pragma's for traditional C +- Fix usage of strwinerror() in glib.c, change to gz_strwinerror() +- Correct email address in configure for system options +- Update make_vms.com and add make_vms.com to contrib/minizip [Zinser] +- Update zlib.map [Brown] +- Fix Makefile.in for Solaris 10 make of example64 and minizip64 [Torok] +- Apply various fixes to CMakeLists.txt [Lowman] +- Add checks on len in gzread() and gzwrite() +- Add error message for no more room for gzungetc() +- Remove zlib version check in gzwrite() +- Defer compression of gzprintf() result until need to +- Use snprintf() in gzdopen() if available +- Remove USE_MMAP configuration determination (only used by minigzip) +- Remove examples/pigz.c (available separately) +- Update examples/gun.c to 1.6 + +Changes in 1.2.3.5 (8 Jan 2010) +- Add space after #if in zutil.h for some compilers +- Fix relatively harmless bug in deflate_fast() [Exarevsky] +- Fix same problem in deflate_slow() +- Add $(SHAREDLIBV) to LIBS in Makefile.in [Brown] +- Add deflate_rle() for faster Z_RLE strategy run-length encoding +- Add deflate_huff() for faster Z_HUFFMAN_ONLY encoding +- Change name of "write" variable in inffast.c to avoid library collisions +- Fix premature EOF from gzread() in gzio.c [Brown] +- Use zlib header window size if windowBits is 0 in inflateInit2() +- Remove compressBound() call in deflate.c to avoid linking compress.o +- Replace use of errno in gz* with functions, support WinCE [Alves] +- Provide alternative to perror() in minigzip.c for WinCE [Alves] +- Don't use _vsnprintf on later versions of MSVC [Lowman] +- Add CMake build script and input file [Lowman] +- Update contrib/minizip to 1.1 [Svensson, Vollant] +- Moved nintendods directory from contrib to . +- Replace gzio.c with a new set of routines with the same functionality +- Add gzbuffer(), gzoffset(), gzclose_r(), gzclose_w() as part of above +- Update contrib/minizip to 1.1b +- Change gzeof() to return 0 on error instead of -1 to agree with zlib.h + +Changes in 1.2.3.4 (21 Dec 2009) +- Use old school .SUFFIXES in Makefile.in for FreeBSD compatibility +- Update comments in configure and Makefile.in for default --shared +- Fix test -z's in configure [Marquess] +- Build examplesh and minigzipsh when not testing +- Change NULL's to Z_NULL's in deflate.c and in comments in zlib.h +- Import LDFLAGS from the environment in configure +- Fix configure to populate SFLAGS with discovered CFLAGS options +- Adapt make_vms.com to the new Makefile.in [Zinser] +- Add zlib2ansi script for C++ compilation [Marquess] +- Add _FILE_OFFSET_BITS=64 test to make test (when applicable) +- Add AMD64 assembler code for longest match to contrib [Teterin] +- Include options from $SFLAGS when doing $LDSHARED +- Simplify 64-bit file support by introducing z_off64_t type +- Make shared object files in objs directory to work around old Sun cc +- Use only three-part version number for Darwin shared compiles +- Add rc option to ar in Makefile.in for when ./configure not run +- Add -WI,-rpath,. to LDFLAGS for OSF 1 V4* +- Set LD_LIBRARYN32_PATH for SGI IRIX shared compile +- Protect against _FILE_OFFSET_BITS being defined when compiling zlib +- Rename Makefile.in targets allstatic to static and allshared to shared +- Fix static and shared Makefile.in targets to be independent +- Correct error return bug in gz_open() by setting state [Brown] +- Put spaces before ;;'s in configure for better sh compatibility +- Add pigz.c (parallel implementation of gzip) to examples/ +- Correct constant in crc32.c to UL [Leventhal] +- Reject negative lengths in crc32_combine() +- Add inflateReset2() function to work like inflateEnd()/inflateInit2() +- Include sys/types.h for _LARGEFILE64_SOURCE [Brown] +- Correct typo in doc/algorithm.txt [Janik] +- Fix bug in adler32_combine() [Zhu] +- Catch missing-end-of-block-code error in all inflates and in puff + Assures that random input to inflate eventually results in an error +- Added enough.c (calculation of ENOUGH for inftrees.h) to examples/ +- Update ENOUGH and its usage to reflect discovered bounds +- Fix gzerror() error report on empty input file [Brown] +- Add ush casts in trees.c to avoid pedantic runtime errors +- Fix typo in zlib.h uncompress() description [Reiss] +- Correct inflate() comments with regard to automatic header detection +- Remove deprecation comment on Z_PARTIAL_FLUSH (it stays) +- Put new version of gzlog (2.0) in examples with interruption recovery +- Add puff compile option to permit invalid distance-too-far streams +- Add puff TEST command options, ability to read piped input +- Prototype the *64 functions in zlib.h when _FILE_OFFSET_BITS == 64, but + _LARGEFILE64_SOURCE not defined +- Fix Z_FULL_FLUSH to truly erase the past by resetting s->strstart +- Fix deflateSetDictionary() to use all 32K for output consistency +- Remove extraneous #define MIN_LOOKAHEAD in deflate.c (in deflate.h) +- Clear bytes after deflate lookahead to avoid use of uninitialized data +- Change a limit in inftrees.c to be more transparent to Coverity Prevent +- Update win32/zlib.def with exported symbols from zlib.h +- Correct spelling errors in zlib.h [Willem, Sobrado] +- Allow Z_BLOCK for deflate() to force a new block +- Allow negative bits in inflatePrime() to delete existing bit buffer +- Add Z_TREES flush option to inflate() to return at end of trees +- Add inflateMark() to return current state information for random access +- Add Makefile for NintendoDS to contrib [Costa] +- Add -w in configure compile tests to avoid spurious warnings [Beucler] +- Fix typos in zlib.h comments for deflateSetDictionary() +- Fix EOF detection in transparent gzread() [Maier] + +Changes in 1.2.3.3 (2 October 2006) +- Make --shared the default for configure, add a --static option +- Add compile option to permit invalid distance-too-far streams +- Add inflateUndermine() function which is required to enable above +- Remove use of "this" variable name for C++ compatibility [Marquess] +- Add testing of shared library in make test, if shared library built +- Use ftello() and fseeko() if available instead of ftell() and fseek() +- Provide two versions of all functions that use the z_off_t type for + binary compatibility -- a normal version and a 64-bit offset version, + per the Large File Support Extension when _LARGEFILE64_SOURCE is + defined; use the 64-bit versions by default when _FILE_OFFSET_BITS + is defined to be 64 +- Add a --uname= option to configure to perhaps help with cross-compiling + +Changes in 1.2.3.2 (3 September 2006) +- Turn off silly Borland warnings [Hay] +- Use off64_t and define _LARGEFILE64_SOURCE when present +- Fix missing dependency on inffixed.h in Makefile.in +- Rig configure --shared to build both shared and static [Teredesai, Truta] +- Remove zconf.in.h and instead create a new zlibdefs.h file +- Fix contrib/minizip/unzip.c non-encrypted after encrypted [Vollant] +- Add treebuild.xml (see http://treebuild.metux.de/) [Weigelt] + +Changes in 1.2.3.1 (16 August 2006) +- Add watcom directory with OpenWatcom make files [Daniel] +- Remove #undef of FAR in zconf.in.h for MVS [Fedtke] +- Update make_vms.com [Zinser] +- Use -fPIC for shared build in configure [Teredesai, Nicholson] +- Use only major version number for libz.so on IRIX and OSF1 [Reinholdtsen] +- Use fdopen() (not _fdopen()) for Interix in zutil.h [BŠck] +- Add some FAQ entries about the contrib directory +- Update the MVS question in the FAQ +- Avoid extraneous reads after EOF in gzio.c [Brown] +- Correct spelling of "successfully" in gzio.c [Randers-Pehrson] +- Add comments to zlib.h about gzerror() usage [Brown] +- Set extra flags in gzip header in gzopen() like deflate() does +- Make configure options more compatible with double-dash conventions + [Weigelt] +- Clean up compilation under Solaris SunStudio cc [Rowe, Reinholdtsen] +- Fix uninstall target in Makefile.in [Truta] +- Add pkgconfig support [Weigelt] +- Use $(DESTDIR) macro in Makefile.in [Reinholdtsen, Weigelt] +- Replace set_data_type() with a more accurate detect_data_type() in + trees.c, according to the txtvsbin.txt document [Truta] +- Swap the order of #include and #include "zlib.h" in + gzio.c, example.c and minigzip.c [Truta] +- Shut up annoying VS2005 warnings about standard C deprecation [Rowe, + Truta] (where?) +- Fix target "clean" from win32/Makefile.bor [Truta] +- Create .pdb and .manifest files in win32/makefile.msc [Ziegler, Rowe] +- Update zlib www home address in win32/DLL_FAQ.txt [Truta] +- Update contrib/masmx86/inffas32.asm for VS2005 [Vollant, Van Wassenhove] +- Enable browse info in the "Debug" and "ASM Debug" configurations in + the Visual C++ 6 project, and set (non-ASM) "Debug" as default [Truta] +- Add pkgconfig support [Weigelt] +- Add ZLIB_VER_MAJOR, ZLIB_VER_MINOR and ZLIB_VER_REVISION in zlib.h, + for use in win32/zlib1.rc [Polushin, Rowe, Truta] +- Add a document that explains the new text detection scheme to + doc/txtvsbin.txt [Truta] +- Add rfc1950.txt, rfc1951.txt and rfc1952.txt to doc/ [Truta] +- Move algorithm.txt into doc/ [Truta] +- Synchronize FAQ with website +- Fix compressBound(), was low for some pathological cases [Fearnley] +- Take into account wrapper variations in deflateBound() +- Set examples/zpipe.c input and output to binary mode for Windows +- Update examples/zlib_how.html with new zpipe.c (also web site) +- Fix some warnings in examples/gzlog.c and examples/zran.c (it seems + that gcc became pickier in 4.0) +- Add zlib.map for Linux: "All symbols from zlib-1.1.4 remain + un-versioned, the patch adds versioning only for symbols introduced in + zlib-1.2.0 or later. It also declares as local those symbols which are + not designed to be exported." [Levin] +- Update Z_PREFIX list in zconf.in.h, add --zprefix option to configure +- Do not initialize global static by default in trees.c, add a response + NO_INIT_GLOBAL_POINTERS to initialize them if needed [Marquess] +- Don't use strerror() in gzio.c under WinCE [Yakimov] +- Don't use errno.h in zutil.h under WinCE [Yakimov] +- Move arguments for AR to its usage to allow replacing ar [Marot] +- Add HAVE_VISIBILITY_PRAGMA in zconf.in.h for Mozilla [Randers-Pehrson] +- Improve inflateInit() and inflateInit2() documentation +- Fix structure size comment in inflate.h +- Change configure help option from --h* to --help [Santos] + Changes in 1.2.3 (18 July 2005) - Apply security vulnerability fixes to contrib/infback9 as well - Clean up some text files (carriage returns, trailing space) @@ -13,7 +567,7 @@ Changes in 1.2.2.4 (11 July 2005) compile - Fix some spelling errors in comments [Betts] - Correct inflateInit2() error return documentation in zlib.h -- Added zran.c example of compressed data random access to examples +- Add zran.c example of compressed data random access to examples directory, shows use of inflatePrime() - Fix cast for assignments to strm->state in inflate.c and infback.c - Fix zlibCompileFlags() in zutil.c to use 1L for long shifts [Oberhumer] diff --git a/neo/libs/zlib/FAQ b/neo/libs/zlib/FAQ index 441d910d..99b7cf92 100644 --- a/neo/libs/zlib/FAQ +++ b/neo/libs/zlib/FAQ @@ -3,8 +3,8 @@ If your question is not there, please check the zlib home page -http://www.zlib.org which may have more recent information. -The lastest zlib FAQ is at http://www.gzip.org/zlib/zlib_faq.html +http://zlib.net/ which may have more recent information. +The lastest zlib FAQ is at http://zlib.net/zlib_faq.html 1. Is zlib Y2K-compliant? @@ -13,54 +13,51 @@ The lastest zlib FAQ is at http://www.gzip.org/zlib/zlib_faq.html 2. Where can I get a Windows DLL version? - The zlib sources can be compiled without change to produce a DLL. - See the file win32/DLL_FAQ.txt in the zlib distribution. - Pointers to the precompiled DLL are found in the zlib web site at - http://www.zlib.org. + The zlib sources can be compiled without change to produce a DLL. See the + file win32/DLL_FAQ.txt in the zlib distribution. Pointers to the + precompiled DLL are found in the zlib web site at http://zlib.net/ . 3. Where can I get a Visual Basic interface to zlib? See - * http://www.dogma.net/markn/articles/zlibtool/zlibtool.htm - * contrib/visual-basic.txt in the zlib distribution + * http://marknelson.us/1997/01/01/zlib-engine/ * win32/DLL_FAQ.txt in the zlib distribution 4. compress() returns Z_BUF_ERROR. - Make sure that before the call of compress, the length of the compressed - buffer is equal to the total size of the compressed buffer and not - zero. For Visual Basic, check that this parameter is passed by reference + Make sure that before the call of compress(), the length of the compressed + buffer is equal to the available size of the compressed buffer and not + zero. For Visual Basic, check that this parameter is passed by reference ("as any"), not by value ("as long"). 5. deflate() or inflate() returns Z_BUF_ERROR. - Before making the call, make sure that avail_in and avail_out are not - zero. When setting the parameter flush equal to Z_FINISH, also make sure - that avail_out is big enough to allow processing all pending input. - Note that a Z_BUF_ERROR is not fatal--another call to deflate() or - inflate() can be made with more input or output space. A Z_BUF_ERROR - may in fact be unavoidable depending on how the functions are used, since - it is not possible to tell whether or not there is more output pending - when strm.avail_out returns with zero. + Before making the call, make sure that avail_in and avail_out are not zero. + When setting the parameter flush equal to Z_FINISH, also make sure that + avail_out is big enough to allow processing all pending input. Note that a + Z_BUF_ERROR is not fatal--another call to deflate() or inflate() can be + made with more input or output space. A Z_BUF_ERROR may in fact be + unavoidable depending on how the functions are used, since it is not + possible to tell whether or not there is more output pending when + strm.avail_out returns with zero. See http://zlib.net/zlib_how.html for a + heavily annotated example. 6. Where's the zlib documentation (man pages, etc.)? - It's in zlib.h for the moment, and Francis S. Lin has converted it to a - web page zlib.html. Volunteers to transform this to Unix-style man pages, - please contact us (zlib@gzip.org). Examples of zlib usage are in the files - example.c and minigzip.c. + It's in zlib.h . Examples of zlib usage are in the files test/example.c + and test/minigzip.c, with more in examples/ . 7. Why don't you use GNU autoconf or libtool or ...? - Because we would like to keep zlib as a very small and simple - package. zlib is rather portable and doesn't need much configuration. + Because we would like to keep zlib as a very small and simple package. + zlib is rather portable and doesn't need much configuration. 8. I found a bug in zlib. - Most of the time, such problems are due to an incorrect usage of - zlib. Please try to reproduce the problem with a small program and send - the corresponding source to us at zlib@gzip.org . Do not send - multi-megabyte data files without prior agreement. + Most of the time, such problems are due to an incorrect usage of zlib. + Please try to reproduce the problem with a small program and send the + corresponding source to us at zlib@gzip.org . Do not send multi-megabyte + data files without prior agreement. 9. Why do I get "undefined reference to gzputc"? @@ -82,13 +79,15 @@ The lastest zlib FAQ is at http://www.gzip.org/zlib/zlib_faq.html 12. Can zlib handle .Z files? - No, sorry. You have to spawn an uncompress or gunzip subprocess, or adapt + No, sorry. You have to spawn an uncompress or gunzip subprocess, or adapt the code of uncompress on your own. 13. How can I make a Unix shared library? - make clean - ./configure -s + By default a shared (and a static) library is built for Unix. So: + + make distclean + ./configure make 14. How do I install a shared zlib library on Unix? @@ -99,8 +98,10 @@ The lastest zlib FAQ is at http://www.gzip.org/zlib/zlib_faq.html However, many flavors of Unix come with a shared zlib already installed. Before going to the trouble of compiling a shared version of zlib and - trying to install it, you may want to check if it's already there! If you - can #include , it's there. The -lz option will probably link to it. + trying to install it, you may want to check if it's already there! If you + can #include , it's there. The -lz option will probably link to + it. You can check the version at the top of zlib.h or with the + ZLIB_VERSION symbol defined in zlib.h . 15. I have a question about OttoPDF. @@ -109,8 +110,8 @@ The lastest zlib FAQ is at http://www.gzip.org/zlib/zlib_faq.html 16. Can zlib decode Flate data in an Adobe PDF file? - Yes. See http://www.fastio.com/ (ClibPDF), or http://www.pdflib.com/ . - To modify PDF forms, see http://sourceforge.net/projects/acroformtool/ . + Yes. See http://www.pdflib.com/ . To modify PDF forms, see + http://sourceforge.net/projects/acroformtool/ . 17. Why am I getting this "register_frame_info not found" error on Solaris? @@ -121,67 +122,67 @@ The lastest zlib FAQ is at http://www.gzip.org/zlib/zlib_faq.html symbol __register_frame_info: referenced symbol not found The symbol __register_frame_info is not part of zlib, it is generated by - the C compiler (cc or gcc). You must recompile applications using zlib - which have this problem. This problem is specific to Solaris. See + the C compiler (cc or gcc). You must recompile applications using zlib + which have this problem. This problem is specific to Solaris. See http://www.sunfreeware.com for Solaris versions of zlib and applications using zlib. 18. Why does gzip give an error on a file I make with compress/deflate? The compress and deflate functions produce data in the zlib format, which - is different and incompatible with the gzip format. The gz* functions in - zlib on the other hand use the gzip format. Both the zlib and gzip - formats use the same compressed data format internally, but have different - headers and trailers around the compressed data. + is different and incompatible with the gzip format. The gz* functions in + zlib on the other hand use the gzip format. Both the zlib and gzip formats + use the same compressed data format internally, but have different headers + and trailers around the compressed data. 19. Ok, so why are there two different formats? - The gzip format was designed to retain the directory information about - a single file, such as the name and last modification date. The zlib - format on the other hand was designed for in-memory and communication - channel applications, and has a much more compact header and trailer and - uses a faster integrity check than gzip. + The gzip format was designed to retain the directory information about a + single file, such as the name and last modification date. The zlib format + on the other hand was designed for in-memory and communication channel + applications, and has a much more compact header and trailer and uses a + faster integrity check than gzip. 20. Well that's nice, but how do I make a gzip file in memory? You can request that deflate write the gzip format instead of the zlib - format using deflateInit2(). You can also request that inflate decode - the gzip format using inflateInit2(). Read zlib.h for more details. + format using deflateInit2(). You can also request that inflate decode the + gzip format using inflateInit2(). Read zlib.h for more details. 21. Is zlib thread-safe? - Yes. However any library routines that zlib uses and any application- - provided memory allocation routines must also be thread-safe. zlib's gz* + Yes. However any library routines that zlib uses and any application- + provided memory allocation routines must also be thread-safe. zlib's gz* functions use stdio library routines, and most of zlib's functions use the - library memory allocation routines by default. zlib's Init functions allow - for the application to provide custom memory allocation routines. + library memory allocation routines by default. zlib's *Init* functions + allow for the application to provide custom memory allocation routines. Of course, you should only operate on any given zlib or gzip stream from a single thread at a time. 22. Can I use zlib in my commercial application? - Yes. Please read the license in zlib.h. + Yes. Please read the license in zlib.h. 23. Is zlib under the GNU license? - No. Please read the license in zlib.h. + No. Please read the license in zlib.h. 24. The license says that altered source versions must be "plainly marked". So what exactly do I need to do to meet that requirement? - You need to change the ZLIB_VERSION and ZLIB_VERNUM #defines in zlib.h. In + You need to change the ZLIB_VERSION and ZLIB_VERNUM #defines in zlib.h. In particular, the final version number needs to be changed to "f", and an - identification string should be appended to ZLIB_VERSION. Version numbers + identification string should be appended to ZLIB_VERSION. Version numbers x.x.x.f are reserved for modifications to zlib by others than the zlib - maintainers. For example, if the version of the base zlib you are altering + maintainers. For example, if the version of the base zlib you are altering is "1.2.3.4", then in zlib.h you should change ZLIB_VERNUM to 0x123f, and - ZLIB_VERSION to something like "1.2.3.f-zachary-mods-v3". You can also + ZLIB_VERSION to something like "1.2.3.f-zachary-mods-v3". You can also update the version strings in deflate.c and inftrees.c. For altered source distributions, you should also note the origin and nature of the changes in zlib.h, as well as in ChangeLog and README, along - with the dates of the alterations. The origin should include at least your + with the dates of the alterations. The origin should include at least your name (or your company's name), and an email address to contact for help or issues with the library. @@ -197,105 +198,112 @@ The lastest zlib FAQ is at http://www.gzip.org/zlib/zlib_faq.html 26. Will zlib work on a 64-bit machine? - It should. It has been tested on 64-bit machines, and has no dependence - on any data types being limited to 32-bits in length. If you have any + Yes. It has been tested on 64-bit machines, and has no dependence on any + data types being limited to 32-bits in length. If you have any difficulties, please provide a complete problem report to zlib@gzip.org 27. Will zlib decompress data from the PKWare Data Compression Library? - No. The PKWare DCL uses a completely different compressed data format - than does PKZIP and zlib. However, you can look in zlib's contrib/blast + No. The PKWare DCL uses a completely different compressed data format than + does PKZIP and zlib. However, you can look in zlib's contrib/blast directory for a possible solution to your problem. 28. Can I access data randomly in a compressed stream? - No, not without some preparation. If when compressing you periodically - use Z_FULL_FLUSH, carefully write all the pending data at those points, - and keep an index of those locations, then you can start decompression - at those points. You have to be careful to not use Z_FULL_FLUSH too - often, since it can significantly degrade compression. + No, not without some preparation. If when compressing you periodically use + Z_FULL_FLUSH, carefully write all the pending data at those points, and + keep an index of those locations, then you can start decompression at those + points. You have to be careful to not use Z_FULL_FLUSH too often, since it + can significantly degrade compression. Alternatively, you can scan a + deflate stream once to generate an index, and then use that index for + random access. See examples/zran.c . 29. Does zlib work on MVS, OS/390, CICS, etc.? - We don't know for sure. We have heard occasional reports of success on - these systems. If you do use it on one of these, please provide us with - a report, instructions, and patches that we can reference when we get - these questions. Thanks. + It has in the past, but we have not heard of any recent evidence. There + were working ports of zlib 1.1.4 to MVS, but those links no longer work. + If you know of recent, successful applications of zlib on these operating + systems, please let us know. Thanks. -30. Is there some simpler, easier to read version of inflate I can look at - to understand the deflate format? +30. Is there some simpler, easier to read version of inflate I can look at to + understand the deflate format? - First off, you should read RFC 1951. Second, yes. Look in zlib's + First off, you should read RFC 1951. Second, yes. Look in zlib's contrib/puff directory. 31. Does zlib infringe on any patents? - As far as we know, no. In fact, that was originally the whole point behind - zlib. Look here for some more information: + As far as we know, no. In fact, that was originally the whole point behind + zlib. Look here for some more information: http://www.gzip.org/#faq11 32. Can zlib work with greater than 4 GB of data? - Yes. inflate() and deflate() will process any amount of data correctly. + Yes. inflate() and deflate() will process any amount of data correctly. Each call of inflate() or deflate() is limited to input and output chunks of the maximum value that can be stored in the compiler's "unsigned int" - type, but there is no limit to the number of chunks. Note however that the - strm.total_in and strm_total_out counters may be limited to 4 GB. These + type, but there is no limit to the number of chunks. Note however that the + strm.total_in and strm_total_out counters may be limited to 4 GB. These counters are provided as a convenience and are not used internally by - inflate() or deflate(). The application can easily set up its own counters + inflate() or deflate(). The application can easily set up its own counters updated after each call of inflate() or deflate() to count beyond 4 GB. compress() and uncompress() may be limited to 4 GB, since they operate in a - single call. gzseek() and gztell() may be limited to 4 GB depending on how - zlib is compiled. See the zlibCompileFlags() function in zlib.h. + single call. gzseek() and gztell() may be limited to 4 GB depending on how + zlib is compiled. See the zlibCompileFlags() function in zlib.h. - The word "may" appears several times above since there is a 4 GB limit - only if the compiler's "long" type is 32 bits. If the compiler's "long" - type is 64 bits, then the limit is 16 exabytes. + The word "may" appears several times above since there is a 4 GB limit only + if the compiler's "long" type is 32 bits. If the compiler's "long" type is + 64 bits, then the limit is 16 exabytes. 33. Does zlib have any security vulnerabilities? - The only one that we are aware of is potentially in gzprintf(). If zlib - is compiled to use sprintf() or vsprintf(), then there is no protection - against a buffer overflow of a 4K string space, other than the caller of - gzprintf() assuring that the output will not exceed 4K. On the other - hand, if zlib is compiled to use snprintf() or vsnprintf(), which should - normally be the case, then there is no vulnerability. The ./configure - script will display warnings if an insecure variation of sprintf() will - be used by gzprintf(). Also the zlibCompileFlags() function will return - information on what variant of sprintf() is used by gzprintf(). + The only one that we are aware of is potentially in gzprintf(). If zlib is + compiled to use sprintf() or vsprintf(), then there is no protection + against a buffer overflow of an 8K string space (or other value as set by + gzbuffer()), other than the caller of gzprintf() assuring that the output + will not exceed 8K. On the other hand, if zlib is compiled to use + snprintf() or vsnprintf(), which should normally be the case, then there is + no vulnerability. The ./configure script will display warnings if an + insecure variation of sprintf() will be used by gzprintf(). Also the + zlibCompileFlags() function will return information on what variant of + sprintf() is used by gzprintf(). If you don't have snprintf() or vsnprintf() and would like one, you can find a portable implementation here: http://www.ijs.si/software/snprintf/ - Note that you should be using the most recent version of zlib. Versions - 1.1.3 and before were subject to a double-free vulnerability. + Note that you should be using the most recent version of zlib. Versions + 1.1.3 and before were subject to a double-free vulnerability, and versions + 1.2.1 and 1.2.2 were subject to an access exception when decompressing + invalid compressed data. 34. Is there a Java version of zlib? Probably what you want is to use zlib in Java. zlib is already included as part of the Java SDK in the java.util.zip package. If you really want a version of zlib written in the Java language, look on the zlib home - page for links: http://www.zlib.org/ + page for links: http://zlib.net/ . 35. I get this or that compiler or source-code scanner warning when I crank it up to maximally-pedantic. Can't you guys write proper code? Many years ago, we gave up attempting to avoid warnings on every compiler - in the universe. It just got to be a waste of time, and some compilers - were downright silly. So now, we simply make sure that the code always - works. + in the universe. It just got to be a waste of time, and some compilers + were downright silly as well as contradicted each other. So now, we simply + make sure that the code always works. 36. Valgrind (or some similar memory access checker) says that deflate is performing a conditional jump that depends on an uninitialized value. Isn't that a bug? - No. That is intentional for performance reasons, and the output of - deflate is not affected. This only started showing up recently since - zlib 1.2.x uses malloc() by default for allocations, whereas earlier - versions used calloc(), which zeros out the allocated memory. + No. That is intentional for performance reasons, and the output of deflate + is not affected. This only started showing up recently since zlib 1.2.x + uses malloc() by default for allocations, whereas earlier versions used + calloc(), which zeros out the allocated memory. Even though the code was + correct, versions 1.2.4 and later was changed to not stimulate these + checkers. 37. Will zlib read the (insert any ancient or arcane format here) compressed data format? @@ -305,20 +313,21 @@ The lastest zlib FAQ is at http://www.gzip.org/zlib/zlib_faq.html 38. How can I encrypt/decrypt zip files with zlib? - zlib doesn't support encryption. The original PKZIP encryption is very weak - and can be broken with freely available programs. To get strong encryption, - use GnuPG, http://www.gnupg.org/ , which already includes zlib compression. - For PKZIP compatible "encryption", look at http://www.info-zip.org/ + zlib doesn't support encryption. The original PKZIP encryption is very + weak and can be broken with freely available programs. To get strong + encryption, use GnuPG, http://www.gnupg.org/ , which already includes zlib + compression. For PKZIP compatible "encryption", look at + http://www.info-zip.org/ 39. What's the difference between the "gzip" and "deflate" HTTP 1.1 encodings? - "gzip" is the gzip format, and "deflate" is the zlib format. They should - probably have called the second one "zlib" instead to avoid confusion - with the raw deflate compressed data format. While the HTTP 1.1 RFC 2616 + "gzip" is the gzip format, and "deflate" is the zlib format. They should + probably have called the second one "zlib" instead to avoid confusion with + the raw deflate compressed data format. While the HTTP 1.1 RFC 2616 correctly points to the zlib specification in RFC 1950 for the "deflate" transfer encoding, there have been reports of servers and browsers that incorrectly produce or expect raw deflate data per the deflate - specficiation in RFC 1951, most notably Microsoft. So even though the + specification in RFC 1951, most notably Microsoft. So even though the "deflate" transfer encoding using the zlib format would be the more efficient approach (and in fact exactly what the zlib format was designed for), using the "gzip" transfer encoding is probably more reliable due to @@ -328,12 +337,32 @@ The lastest zlib FAQ is at http://www.gzip.org/zlib/zlib_faq.html 40. Does zlib support the new "Deflate64" format introduced by PKWare? - No. PKWare has apparently decided to keep that format proprietary, since - they have not documented it as they have previous compression formats. - In any case, the compression improvements are so modest compared to other - more modern approaches, that it's not worth the effort to implement. + No. PKWare has apparently decided to keep that format proprietary, since + they have not documented it as they have previous compression formats. In + any case, the compression improvements are so modest compared to other more + modern approaches, that it's not worth the effort to implement. -41. Can you please sign these lengthy legal documents and fax them back to us +41. I'm having a problem with the zip functions in zlib, can you help? + + There are no zip functions in zlib. You are probably using minizip by + Giles Vollant, which is found in the contrib directory of zlib. It is not + part of zlib. In fact none of the stuff in contrib is part of zlib. The + files in there are not supported by the zlib authors. You need to contact + the authors of the respective contribution for help. + +42. The match.asm code in contrib is under the GNU General Public License. + Since it's part of zlib, doesn't that mean that all of zlib falls under the + GNU GPL? + + No. The files in contrib are not part of zlib. They were contributed by + other authors and are provided as a convenience to the user within the zlib + distribution. Each item in contrib has its own license. + +43. Is zlib subject to export controls? What is its ECCN? + + zlib is not subject to export controls, and so is classified as EAR99. + +44. Can you please sign these lengthy legal documents and fax them back to us so that we can use your software in our product? No. Go away. Shoo. diff --git a/neo/libs/zlib/INDEX b/neo/libs/zlib/INDEX index 0587e590..2ba06412 100644 --- a/neo/libs/zlib/INDEX +++ b/neo/libs/zlib/INDEX @@ -1,23 +1,37 @@ +CMakeLists.txt cmake build file ChangeLog history of changes FAQ Frequently Asked Questions about zlib INDEX this file -Makefile makefile for Unix (generated by configure) -Makefile.in makefile for Unix (template for configure) +Makefile dummy Makefile that tells you to ./configure +Makefile.in template for Unix Makefile README guess what -algorithm.txt description of the (de)compression algorithm configure configure script for Unix -zconf.in.h template for zconf.h (used by configure) +make_vms.com makefile for VMS +test/example.c zlib usages examples for build testing +test/minigzip.c minimal gzip-like functionality for build testing +test/infcover.c inf*.c code coverage for build coverage testing +treebuild.xml XML description of source file dependencies +zconf.h.cmakein zconf.h template for cmake +zconf.h.in zconf.h template for configure +zlib.3 Man page for zlib +zlib.3.pdf Man page in PDF format +zlib.map Linux symbol information +zlib.pc.in Template for pkg-config descriptor +zlib.pc.cmakein zlib.pc template for cmake +zlib2ansi perl script to convert source files for C++ compilation amiga/ makefiles for Amiga SAS C -as400/ makefiles for IBM AS/400 +as400/ makefiles for AS/400 +doc/ documentation for formats and algorithms msdos/ makefiles for MSDOS +nintendods/ makefile for Nintendo DS old/ makefiles for various architectures and zlib documentation files that have not yet been updated for zlib 1.2.x -projects/ projects for various Integrated Development Environments qnx/ makefiles for QNX +watcom/ makefiles for OpenWatcom win32/ makefiles for Windows - zlib public header files (must be kept): + zlib public header files (required for library use): zconf.h zlib.h @@ -28,7 +42,11 @@ crc32.c crc32.h deflate.c deflate.h -gzio.c +gzclose.c +gzguts.h +gzlib.c +gzread.c +gzwrite.c infback.c inffast.c inffast.h @@ -43,9 +61,8 @@ uncompr.c zutil.c zutil.h - source files for sample programs: -example.c -minigzip.c + source files for sample programs +See examples/README.examples - unsupported contribution by third parties + unsupported contributions by third parties See contrib/README.contrib diff --git a/neo/libs/zlib/Makefile b/neo/libs/zlib/Makefile index 2fd6e45c..6bba86c7 100644 --- a/neo/libs/zlib/Makefile +++ b/neo/libs/zlib/Makefile @@ -1,154 +1,5 @@ -# Makefile for zlib -# Copyright (C) 1995-2005 Jean-loup Gailly. -# For conditions of distribution and use, see copyright notice in zlib.h +all: + -@echo "Please use ./configure first. Thank you." -# To compile and test, type: -# ./configure; make test -# The call of configure is optional if you don't have special requirements -# If you wish to build zlib as a shared library, use: ./configure -s - -# To use the asm code, type: -# cp contrib/asm?86/match.S ./match.S -# make LOC=-DASMV OBJA=match.o - -# To install /usr/local/lib/libz.* and /usr/local/include/zlib.h, type: -# make install -# To install in $HOME instead of /usr/local, use: -# make install prefix=$HOME - -CC=cc - -CFLAGS=-O -#CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7 -#CFLAGS=-g -DDEBUG -#CFLAGS=-O3 -Wall -Wwrite-strings -Wpointer-arith -Wconversion \ -# -Wstrict-prototypes -Wmissing-prototypes - -LDFLAGS=libz.a -LDSHARED=$(CC) -CPP=$(CC) -E - -LIBS=libz.a -SHAREDLIB=libz.so -SHAREDLIBV=libz.so.1.2.3 -SHAREDLIBM=libz.so.1 - -AR=ar rc -RANLIB=ranlib -TAR=tar -SHELL=/bin/sh -EXE= - -prefix = /usr/local -exec_prefix = ${prefix} -libdir = ${exec_prefix}/lib -includedir = ${prefix}/include -mandir = ${prefix}/share/man -man3dir = ${mandir}/man3 - -OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \ - zutil.o inflate.o infback.o inftrees.o inffast.o - -OBJA = -# to use the asm code: make OBJA=match.o - -TEST_OBJS = example.o minigzip.o - -all: example$(EXE) minigzip$(EXE) - -check: test -test: all - @LD_LIBRARY_PATH=.:$(LD_LIBRARY_PATH) ; export LD_LIBRARY_PATH; \ - echo hello world | ./minigzip | ./minigzip -d || \ - echo ' *** minigzip test FAILED ***' ; \ - if ./example; then \ - echo ' *** zlib test OK ***'; \ - else \ - echo ' *** zlib test FAILED ***'; \ - fi - -libz.a: $(OBJS) $(OBJA) - $(AR) $@ $(OBJS) $(OBJA) - -@ ($(RANLIB) $@ || true) >/dev/null 2>&1 - -match.o: match.S - $(CPP) match.S > _match.s - $(CC) -c _match.s - mv _match.o match.o - rm -f _match.s - -$(SHAREDLIBV): $(OBJS) - $(LDSHARED) -o $@ $(OBJS) - rm -f $(SHAREDLIB) $(SHAREDLIBM) - ln -s $@ $(SHAREDLIB) - ln -s $@ $(SHAREDLIBM) - -example$(EXE): example.o $(LIBS) - $(CC) $(CFLAGS) -o $@ example.o $(LDFLAGS) - -minigzip$(EXE): minigzip.o $(LIBS) - $(CC) $(CFLAGS) -o $@ minigzip.o $(LDFLAGS) - -install: $(LIBS) - -@if [ ! -d $(exec_prefix) ]; then mkdir -p $(exec_prefix); fi - -@if [ ! -d $(includedir) ]; then mkdir -p $(includedir); fi - -@if [ ! -d $(libdir) ]; then mkdir -p $(libdir); fi - -@if [ ! -d $(man3dir) ]; then mkdir -p $(man3dir); fi - cp zlib.h zconf.h $(includedir) - chmod 644 $(includedir)/zlib.h $(includedir)/zconf.h - cp $(LIBS) $(libdir) - cd $(libdir); chmod 755 $(LIBS) - -@(cd $(libdir); $(RANLIB) libz.a || true) >/dev/null 2>&1 - cd $(libdir); if test -f $(SHAREDLIBV); then \ - rm -f $(SHAREDLIB) $(SHAREDLIBM); \ - ln -s $(SHAREDLIBV) $(SHAREDLIB); \ - ln -s $(SHAREDLIBV) $(SHAREDLIBM); \ - (ldconfig || true) >/dev/null 2>&1; \ - fi - cp zlib.3 $(man3dir) - chmod 644 $(man3dir)/zlib.3 -# The ranlib in install is needed on NeXTSTEP which checks file times -# ldconfig is for Linux - -uninstall: - cd $(includedir); \ - cd $(libdir); rm -f libz.a; \ - if test -f $(SHAREDLIBV); then \ - rm -f $(SHAREDLIBV) $(SHAREDLIB) $(SHAREDLIBM); \ - fi - cd $(man3dir); rm -f zlib.3 - -mostlyclean: clean -clean: - rm -f *.o *~ example$(EXE) minigzip$(EXE) \ - libz.* foo.gz so_locations \ - _match.s maketree contrib/infback9/*.o - -maintainer-clean: distclean -distclean: clean - cp -p Makefile.in Makefile - cp -p zconf.in.h zconf.h - rm -f .DS_Store - -tags: - etags *.[ch] - -depend: - makedepend -- $(CFLAGS) -- *.[ch] - -# DO NOT DELETE THIS LINE -- make depend depends on it. - -adler32.o: zlib.h zconf.h -compress.o: zlib.h zconf.h -crc32.o: crc32.h zlib.h zconf.h -deflate.o: deflate.h zutil.h zlib.h zconf.h -example.o: zlib.h zconf.h -gzio.o: zutil.h zlib.h zconf.h -inffast.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h -inflate.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h -infback.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h -inftrees.o: zutil.h zlib.h zconf.h inftrees.h -minigzip.o: zlib.h zconf.h -trees.o: deflate.h zutil.h zlib.h zconf.h trees.h -uncompr.o: zlib.h zconf.h -zutil.o: zutil.h zlib.h zconf.h +distclean: + make -f Makefile.in distclean diff --git a/neo/libs/zlib/Makefile.in b/neo/libs/zlib/Makefile.in index 2fd6e45c..241deed8 100644 --- a/neo/libs/zlib/Makefile.in +++ b/neo/libs/zlib/Makefile.in @@ -1,11 +1,11 @@ # Makefile for zlib -# Copyright (C) 1995-2005 Jean-loup Gailly. +# Copyright (C) 1995-2011 Jean-loup Gailly. # For conditions of distribution and use, see copyright notice in zlib.h # To compile and test, type: # ./configure; make test -# The call of configure is optional if you don't have special requirements -# If you wish to build zlib as a shared library, use: ./configure -s +# Normally configure builds both a static and a shared library. +# If you want to build just a static library, use: ./configure --static # To use the asm code, type: # cp contrib/asm?86/match.S ./match.S @@ -24,17 +24,23 @@ CFLAGS=-O #CFLAGS=-O3 -Wall -Wwrite-strings -Wpointer-arith -Wconversion \ # -Wstrict-prototypes -Wmissing-prototypes -LDFLAGS=libz.a +SFLAGS=-O +LDFLAGS= +TEST_LDFLAGS=-L. libz.a LDSHARED=$(CC) CPP=$(CC) -E -LIBS=libz.a +STATICLIB=libz.a SHAREDLIB=libz.so -SHAREDLIBV=libz.so.1.2.3 +SHAREDLIBV=libz.so.1.2.7 SHAREDLIBM=libz.so.1 +LIBS=$(STATICLIB) $(SHAREDLIBV) -AR=ar rc +AR=ar +ARFLAGS=rc RANLIB=ranlib +LDCONFIG=ldconfig +LDSHAREDLIBC=-lc TAR=tar SHELL=/bin/sh EXE= @@ -42,33 +48,84 @@ EXE= prefix = /usr/local exec_prefix = ${prefix} libdir = ${exec_prefix}/lib +sharedlibdir = ${libdir} includedir = ${prefix}/include mandir = ${prefix}/share/man man3dir = ${mandir}/man3 +pkgconfigdir = ${libdir}/pkgconfig -OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \ - zutil.o inflate.o infback.o inftrees.o inffast.o +OBJZ = adler32.o crc32.o deflate.o infback.o inffast.o inflate.o inftrees.o trees.o zutil.o +OBJG = compress.o uncompr.o gzclose.o gzlib.o gzread.o gzwrite.o +OBJC = $(OBJZ) $(OBJG) +PIC_OBJZ = adler32.lo crc32.lo deflate.lo infback.lo inffast.lo inflate.lo inftrees.lo trees.lo zutil.lo +PIC_OBJG = compress.lo uncompr.lo gzclose.lo gzlib.lo gzread.lo gzwrite.lo +PIC_OBJC = $(PIC_OBJZ) $(PIC_OBJG) + +# to use the asm code: make OBJA=match.o, PIC_OBJA=match.lo OBJA = -# to use the asm code: make OBJA=match.o +PIC_OBJA = -TEST_OBJS = example.o minigzip.o +OBJS = $(OBJC) $(OBJA) -all: example$(EXE) minigzip$(EXE) +PIC_OBJS = $(PIC_OBJC) $(PIC_OBJA) + +all: static shared + +static: example$(EXE) minigzip$(EXE) + +shared: examplesh$(EXE) minigzipsh$(EXE) + +all64: example64$(EXE) minigzip64$(EXE) check: test -test: all - @LD_LIBRARY_PATH=.:$(LD_LIBRARY_PATH) ; export LD_LIBRARY_PATH; \ - echo hello world | ./minigzip | ./minigzip -d || \ - echo ' *** minigzip test FAILED ***' ; \ - if ./example; then \ + +test: all teststatic testshared + +teststatic: static + @TMPST=`mktemp fooXXXXXX`; \ + if echo hello world | ./minigzip | ./minigzip -d && ./example $$TMPST ; then \ echo ' *** zlib test OK ***'; \ else \ - echo ' *** zlib test FAILED ***'; \ - fi + echo ' *** zlib test FAILED ***'; false; \ + fi; \ + rm -f $$TMPST -libz.a: $(OBJS) $(OBJA) - $(AR) $@ $(OBJS) $(OBJA) +testshared: shared + @LD_LIBRARY_PATH=`pwd`:$(LD_LIBRARY_PATH) ; export LD_LIBRARY_PATH; \ + LD_LIBRARYN32_PATH=`pwd`:$(LD_LIBRARYN32_PATH) ; export LD_LIBRARYN32_PATH; \ + DYLD_LIBRARY_PATH=`pwd`:$(DYLD_LIBRARY_PATH) ; export DYLD_LIBRARY_PATH; \ + SHLIB_PATH=`pwd`:$(SHLIB_PATH) ; export SHLIB_PATH; \ + TMPSH=`mktemp fooXXXXXX`; \ + if echo hello world | ./minigzipsh | ./minigzipsh -d && ./examplesh $$TMPSH; then \ + echo ' *** zlib shared test OK ***'; \ + else \ + echo ' *** zlib shared test FAILED ***'; false; \ + fi; \ + rm -f $$TMPSH + +test64: all64 + @TMP64=`mktemp fooXXXXXX`; \ + if echo hello world | ./minigzip64 | ./minigzip64 -d && ./example64 $$TMP64; then \ + echo ' *** zlib 64-bit test OK ***'; \ + else \ + echo ' *** zlib 64-bit test FAILED ***'; false; \ + fi; \ + rm -f $$TMP64 + +infcover.o: test/infcover.c zlib.h zconf.h + $(CC) $(CFLAGS) -I. -c -o $@ test/infcover.c + +infcover: infcover.o libz.a + $(CC) $(CFLAGS) -o $@ infcover.o libz.a + +cover: infcover + rm -f *.gcda + ./infcover + gcov inf*.c + +libz.a: $(OBJS) + $(AR) $(ARFLAGS) $@ $(OBJS) -@ ($(RANLIB) $@ || true) >/dev/null 2>&1 match.o: match.S @@ -77,58 +134,130 @@ match.o: match.S mv _match.o match.o rm -f _match.s -$(SHAREDLIBV): $(OBJS) - $(LDSHARED) -o $@ $(OBJS) +match.lo: match.S + $(CPP) match.S > _match.s + $(CC) -c -fPIC _match.s + mv _match.o match.lo + rm -f _match.s + +example.o: test/example.c zlib.h zconf.h + $(CC) $(CFLAGS) -I. -c -o $@ test/example.c + +minigzip.o: test/minigzip.c zlib.h zconf.h + $(CC) $(CFLAGS) -I. -c -o $@ test/minigzip.c + +example64.o: test/example.c zlib.h zconf.h + $(CC) $(CFLAGS) -I. -D_FILE_OFFSET_BITS=64 -c -o $@ test/example.c + +minigzip64.o: test/minigzip.c zlib.h zconf.h + $(CC) $(CFLAGS) -I. -D_FILE_OFFSET_BITS=64 -c -o $@ test/minigzip.c + +.SUFFIXES: .lo + +.c.lo: + -@mkdir objs 2>/dev/null || test -d objs + $(CC) $(SFLAGS) -DPIC -c -o objs/$*.o $< + -@mv objs/$*.o $@ + +placebo $(SHAREDLIBV): $(PIC_OBJS) libz.a + $(LDSHARED) $(SFLAGS) -o $@ $(PIC_OBJS) $(LDSHAREDLIBC) $(LDFLAGS) rm -f $(SHAREDLIB) $(SHAREDLIBM) ln -s $@ $(SHAREDLIB) ln -s $@ $(SHAREDLIBM) + -@rmdir objs -example$(EXE): example.o $(LIBS) - $(CC) $(CFLAGS) -o $@ example.o $(LDFLAGS) +example$(EXE): example.o $(STATICLIB) + $(CC) $(CFLAGS) -o $@ example.o $(TEST_LDFLAGS) -minigzip$(EXE): minigzip.o $(LIBS) - $(CC) $(CFLAGS) -o $@ minigzip.o $(LDFLAGS) +minigzip$(EXE): minigzip.o $(STATICLIB) + $(CC) $(CFLAGS) -o $@ minigzip.o $(TEST_LDFLAGS) -install: $(LIBS) - -@if [ ! -d $(exec_prefix) ]; then mkdir -p $(exec_prefix); fi - -@if [ ! -d $(includedir) ]; then mkdir -p $(includedir); fi - -@if [ ! -d $(libdir) ]; then mkdir -p $(libdir); fi - -@if [ ! -d $(man3dir) ]; then mkdir -p $(man3dir); fi - cp zlib.h zconf.h $(includedir) - chmod 644 $(includedir)/zlib.h $(includedir)/zconf.h - cp $(LIBS) $(libdir) - cd $(libdir); chmod 755 $(LIBS) - -@(cd $(libdir); $(RANLIB) libz.a || true) >/dev/null 2>&1 - cd $(libdir); if test -f $(SHAREDLIBV); then \ - rm -f $(SHAREDLIB) $(SHAREDLIBM); \ - ln -s $(SHAREDLIBV) $(SHAREDLIB); \ - ln -s $(SHAREDLIBV) $(SHAREDLIBM); \ - (ldconfig || true) >/dev/null 2>&1; \ +examplesh$(EXE): example.o $(SHAREDLIBV) + $(CC) $(CFLAGS) -o $@ example.o -L. $(SHAREDLIBV) + +minigzipsh$(EXE): minigzip.o $(SHAREDLIBV) + $(CC) $(CFLAGS) -o $@ minigzip.o -L. $(SHAREDLIBV) + +example64$(EXE): example64.o $(STATICLIB) + $(CC) $(CFLAGS) -o $@ example64.o $(TEST_LDFLAGS) + +minigzip64$(EXE): minigzip64.o $(STATICLIB) + $(CC) $(CFLAGS) -o $@ minigzip64.o $(TEST_LDFLAGS) + +install-libs: $(LIBS) + -@if [ ! -d $(DESTDIR)$(exec_prefix) ]; then mkdir -p $(DESTDIR)$(exec_prefix); fi + -@if [ ! -d $(DESTDIR)$(libdir) ]; then mkdir -p $(DESTDIR)$(libdir); fi + -@if [ ! -d $(DESTDIR)$(sharedlibdir) ]; then mkdir -p $(DESTDIR)$(sharedlibdir); fi + -@if [ ! -d $(DESTDIR)$(man3dir) ]; then mkdir -p $(DESTDIR)$(man3dir); fi + -@if [ ! -d $(DESTDIR)$(pkgconfigdir) ]; then mkdir -p $(DESTDIR)$(pkgconfigdir); fi + cp $(STATICLIB) $(DESTDIR)$(libdir) + chmod 644 $(DESTDIR)$(libdir)/$(STATICLIB) + -@($(RANLIB) $(DESTDIR)$(libdir)/libz.a || true) >/dev/null 2>&1 + -@if test -n "$(SHAREDLIBV)"; then \ + cp $(SHAREDLIBV) $(DESTDIR)$(sharedlibdir); \ + echo "cp $(SHAREDLIBV) $(DESTDIR)$(sharedlibdir)"; \ + chmod 755 $(DESTDIR)$(sharedlibdir)/$(SHAREDLIBV); \ + echo "chmod 755 $(DESTDIR)$(sharedlibdir)/$(SHAREDLIBV)"; \ + rm -f $(DESTDIR)$(sharedlibdir)/$(SHAREDLIB) $(DESTDIR)$(sharedlibdir)/$(SHAREDLIBM); \ + ln -s $(SHAREDLIBV) $(DESTDIR)$(sharedlibdir)/$(SHAREDLIB); \ + ln -s $(SHAREDLIBV) $(DESTDIR)$(sharedlibdir)/$(SHAREDLIBM); \ + ($(LDCONFIG) || true) >/dev/null 2>&1; \ fi - cp zlib.3 $(man3dir) - chmod 644 $(man3dir)/zlib.3 + cp zlib.3 $(DESTDIR)$(man3dir) + chmod 644 $(DESTDIR)$(man3dir)/zlib.3 + cp zlib.pc $(DESTDIR)$(pkgconfigdir) + chmod 644 $(DESTDIR)$(pkgconfigdir)/zlib.pc # The ranlib in install is needed on NeXTSTEP which checks file times # ldconfig is for Linux +install: install-libs + -@if [ ! -d $(DESTDIR)$(includedir) ]; then mkdir -p $(DESTDIR)$(includedir); fi + cp zlib.h zconf.h $(DESTDIR)$(includedir) + chmod 644 $(DESTDIR)$(includedir)/zlib.h $(DESTDIR)$(includedir)/zconf.h + uninstall: - cd $(includedir); \ - cd $(libdir); rm -f libz.a; \ - if test -f $(SHAREDLIBV); then \ + cd $(DESTDIR)$(includedir); rm -f zlib.h zconf.h + cd $(DESTDIR)$(libdir); rm -f libz.a; \ + if test -n "$(SHAREDLIBV)" -a -f $(SHAREDLIBV); then \ rm -f $(SHAREDLIBV) $(SHAREDLIB) $(SHAREDLIBM); \ fi - cd $(man3dir); rm -f zlib.3 + cd $(DESTDIR)$(man3dir); rm -f zlib.3 + cd $(DESTDIR)$(pkgconfigdir); rm -f zlib.pc + +docs: zlib.3.pdf + +zlib.3.pdf: zlib.3 + groff -mandoc -f H -T ps zlib.3 | ps2pdf - zlib.3.pdf + +zconf.h.cmakein: zconf.h.in + -@ TEMPFILE=`mktemp __XXXXXX`; \ + echo "/#define ZCONF_H/ a\\\\\n#cmakedefine Z_PREFIX\\\\\n#cmakedefine Z_HAVE_UNISTD_H\n" >> $$TEMPFILE &&\ + sed -f $$TEMPFILE zconf.h.in > zconf.h.cmakein &&\ + touch -r zconf.h.in zconf.h.cmakein &&\ + rm $$TEMPFILE + +zconf: zconf.h.in + cp -p zconf.h.in zconf.h mostlyclean: clean clean: - rm -f *.o *~ example$(EXE) minigzip$(EXE) \ + rm -f *.o *.lo *~ \ + example$(EXE) minigzip$(EXE) examplesh$(EXE) minigzipsh$(EXE) \ + example64$(EXE) minigzip64$(EXE) \ + infcover \ libz.* foo.gz so_locations \ _match.s maketree contrib/infback9/*.o + rm -rf objs + rm -f *.gcda *.gcno *.gcov + rm -f contrib/infback9/*.gcda contrib/infback9/*.gcno contrib/infback9/*.gcov maintainer-clean: distclean -distclean: clean - cp -p Makefile.in Makefile - cp -p zconf.in.h zconf.h - rm -f .DS_Store +distclean: clean zconf zconf.h.cmakein docs + rm -f Makefile zlib.pc configure.log + -@rm -f .DS_Store + -@printf 'all:\n\t-@echo "Please use ./configure first. Thank you."\n' > Makefile + -@printf '\ndistclean:\n\tmake -f Makefile.in distclean\n' >> Makefile + -@touch -r Makefile.in Makefile tags: etags *.[ch] @@ -138,17 +267,22 @@ depend: # DO NOT DELETE THIS LINE -- make depend depends on it. -adler32.o: zlib.h zconf.h -compress.o: zlib.h zconf.h -crc32.o: crc32.h zlib.h zconf.h +adler32.o zutil.o: zutil.h zlib.h zconf.h +gzclose.o gzlib.o gzread.o gzwrite.o: zlib.h zconf.h gzguts.h +compress.o example.o minigzip.o uncompr.o: zlib.h zconf.h +crc32.o: zutil.h zlib.h zconf.h crc32.h deflate.o: deflate.h zutil.h zlib.h zconf.h -example.o: zlib.h zconf.h -gzio.o: zutil.h zlib.h zconf.h +infback.o inflate.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h inffixed.h inffast.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h -inflate.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h -infback.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h inftrees.o: zutil.h zlib.h zconf.h inftrees.h -minigzip.o: zlib.h zconf.h trees.o: deflate.h zutil.h zlib.h zconf.h trees.h -uncompr.o: zlib.h zconf.h -zutil.o: zutil.h zlib.h zconf.h + +adler32.lo zutil.lo: zutil.h zlib.h zconf.h +gzclose.lo gzlib.lo gzread.lo gzwrite.lo: zlib.h zconf.h gzguts.h +compress.lo example.lo minigzip.lo uncompr.lo: zlib.h zconf.h +crc32.lo: zutil.h zlib.h zconf.h crc32.h +deflate.lo: deflate.h zutil.h zlib.h zconf.h +infback.lo inflate.lo: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h inffixed.h +inffast.lo: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h +inftrees.lo: zutil.h zlib.h zconf.h inftrees.h +trees.lo: deflate.h zutil.h zlib.h zconf.h trees.h diff --git a/neo/libs/zlib/README b/neo/libs/zlib/README index 758cc500..6f1255ff 100644 --- a/neo/libs/zlib/README +++ b/neo/libs/zlib/README @@ -1,56 +1,52 @@ ZLIB DATA COMPRESSION LIBRARY -zlib 1.2.3 is a general purpose data compression library. All the code is +zlib 1.2.7 is a general purpose data compression library. All the code is thread safe. The data format used by the zlib library is described by RFCs (Request for Comments) 1950 to 1952 in the files -http://www.ietf.org/rfc/rfc1950.txt (zlib format), rfc1951.txt (deflate format) -and rfc1952.txt (gzip format). These documents are also available in other -formats from ftp://ftp.uu.net/graphics/png/documents/zlib/zdoc-index.html +http://tools.ietf.org/html/rfc1950 (zlib format), rfc1951 (deflate format) and +rfc1952 (gzip format). All functions of the compression library are documented in the file zlib.h -(volunteer to write man pages welcome, contact zlib@gzip.org). A usage example -of the library is given in the file example.c which also tests that the library -is working correctly. Another example is given in the file minigzip.c. The -compression library itself is composed of all source files except example.c and -minigzip.c. +(volunteer to write man pages welcome, contact zlib@gzip.org). A usage example +of the library is given in the file test/example.c which also tests that +the library is working correctly. Another example is given in the file +test/minigzip.c. The compression library itself is composed of all source +files in the root directory. To compile all files and run the test program, follow the instructions given at -the top of Makefile. In short "make test; make install" should work for most -machines. For Unix: "./configure; make test; make install". For MSDOS, use one -of the special makefiles such as Makefile.msc. For VMS, use make_vms.com. +the top of Makefile.in. In short "./configure; make test", and if that goes +well, "make install" should work for most flavors of Unix. For Windows, use +one of the special makefiles in win32/ or contrib/vstudio/ . For VMS, use +make_vms.com. Questions about zlib should be sent to , or to Gilles Vollant - for the Windows DLL version. The zlib home page is -http://www.zlib.org or http://www.gzip.org/zlib/ Before reporting a problem, -please check this site to verify that you have the latest version of zlib; -otherwise get the latest version and check whether the problem still exists or -not. + for the Windows DLL version. The zlib home page is +http://zlib.net/ . Before reporting a problem, please check this site to +verify that you have the latest version of zlib; otherwise get the latest +version and check whether the problem still exists or not. -PLEASE read the zlib FAQ http://www.gzip.org/zlib/zlib_faq.html before asking -for help. +PLEASE read the zlib FAQ http://zlib.net/zlib_faq.html before asking for help. -Mark Nelson wrote an article about zlib for the Jan. 1997 -issue of Dr. Dobb's Journal; a copy of the article is available in -http://dogma.net/markn/articles/zlibtool/zlibtool.htm +Mark Nelson wrote an article about zlib for the Jan. 1997 +issue of Dr. Dobb's Journal; a copy of the article is available at +http://marknelson.us/1997/01/01/zlib-engine/ . -The changes made in version 1.2.3 are documented in the file ChangeLog. +The changes made in version 1.2.7 are documented in the file ChangeLog. -Unsupported third party contributions are provided in directory "contrib". +Unsupported third party contributions are provided in directory contrib/ . -A Java implementation of zlib is available in the Java Development Kit -http://java.sun.com/j2se/1.4.2/docs/api/java/util/zip/package-summary.html -See the zlib home page http://www.zlib.org for details. +zlib is available in Java using the java.util.zip package, documented at +http://java.sun.com/developer/technicalArticles/Programming/compression/ . -A Perl interface to zlib written by Paul Marquess is in the -CPAN (Comprehensive Perl Archive Network) sites -http://www.cpan.org/modules/by-module/Compress/ +A Perl interface to zlib written by Paul Marquess is available +at CPAN (Comprehensive Perl Archive Network) sites, including +http://search.cpan.org/~pmqs/IO-Compress-Zlib/ . A Python interface to zlib written by A.M. Kuchling is available in Python 1.5 and later versions, see -http://www.python.org/doc/lib/module-zlib.html +http://docs.python.org/library/zlib.html . -A zlib binding for TCL written by Andreas Kupries is -availlable at http://www.oche.de/~akupries/soft/trf/trf_zip.html +zlib is built into tcl: http://wiki.tcl.tk/4610 . An experimental package to read and write files in .zip format, written on top of zlib by Gilles Vollant , is available in the @@ -74,25 +70,21 @@ Notes for some targets: - zlib doesn't work on HP-UX 9.05 with some versions of /bin/cc. It works with other compilers. Use "make test" to check your compiler. -- gzdopen is not supported on RISCOS, BEOS and by some Mac compilers. +- gzdopen is not supported on RISCOS or BEOS. - For PalmOs, see http://palmzlib.sourceforge.net/ -- When building a shared, i.e. dynamic library on Mac OS X, the library must be - installed before testing (do "make install" before "make test"), since the - library location is specified in the library. - Acknowledgments: - The deflate format used by zlib was defined by Phil Katz. The deflate - and zlib specifications were written by L. Peter Deutsch. Thanks to all the - people who reported problems and suggested various improvements in zlib; - they are too numerous to cite here. + The deflate format used by zlib was defined by Phil Katz. The deflate and + zlib specifications were written by L. Peter Deutsch. Thanks to all the + people who reported problems and suggested various improvements in zlib; they + are too numerous to cite here. Copyright notice: - (C) 1995-2004 Jean-loup Gailly and Mark Adler + (C) 1995-2012 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -113,13 +105,11 @@ Copyright notice: Jean-loup Gailly Mark Adler jloup@gzip.org madler@alumni.caltech.edu -If you use the zlib library in a product, we would appreciate *not* -receiving lengthy legal documents to sign. The sources are provided -for free but without warranty of any kind. The library has been -entirely written by Jean-loup Gailly and Mark Adler; it does not -include third-party code. +If you use the zlib library in a product, we would appreciate *not* receiving +lengthy legal documents to sign. The sources are provided for free but without +warranty of any kind. The library has been entirely written by Jean-loup +Gailly and Mark Adler; it does not include third-party code. -If you redistribute modified sources, we would appreciate that you include -in the file ChangeLog history information documenting your changes. Please -read the FAQ for more information on the distribution of modified source -versions. +If you redistribute modified sources, we would appreciate that you include in +the file ChangeLog history information documenting your changes. Please read +the FAQ for more information on the distribution of modified source versions. diff --git a/neo/libs/zlib/adler32.c b/neo/libs/zlib/adler32.c index 007ba262..a868f073 100644 --- a/neo/libs/zlib/adler32.c +++ b/neo/libs/zlib/adler32.c @@ -1,14 +1,17 @@ /* adler32.c -- compute the Adler-32 checksum of a data stream - * Copyright (C) 1995-2004 Mark Adler + * Copyright (C) 1995-2011 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ /* @(#) $Id$ */ -#define ZLIB_INTERNAL -#include "zlib.h" +#include "zutil.h" -#define BASE 65521UL /* largest prime smaller than 65536 */ +#define local static + +local uLong adler32_combine_ OF((uLong adler1, uLong adler2, z_off64_t len2)); + +#define BASE 65521 /* largest prime smaller than 65536 */ #define NMAX 5552 /* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ @@ -18,39 +21,44 @@ #define DO8(buf,i) DO4(buf,i); DO4(buf,i+4); #define DO16(buf) DO8(buf,0); DO8(buf,8); -/* use NO_DIVIDE if your processor does not do division in hardware */ +/* use NO_DIVIDE if your processor does not do division in hardware -- + try it both ways to see which is faster */ #ifdef NO_DIVIDE -# define MOD(a) \ +/* note that this assumes BASE is 65521, where 65536 % 65521 == 15 + (thank you to John Reiser for pointing this out) */ +# define CHOP(a) \ do { \ - if (a >= (BASE << 16)) a -= (BASE << 16); \ - if (a >= (BASE << 15)) a -= (BASE << 15); \ - if (a >= (BASE << 14)) a -= (BASE << 14); \ - if (a >= (BASE << 13)) a -= (BASE << 13); \ - if (a >= (BASE << 12)) a -= (BASE << 12); \ - if (a >= (BASE << 11)) a -= (BASE << 11); \ - if (a >= (BASE << 10)) a -= (BASE << 10); \ - if (a >= (BASE << 9)) a -= (BASE << 9); \ - if (a >= (BASE << 8)) a -= (BASE << 8); \ - if (a >= (BASE << 7)) a -= (BASE << 7); \ - if (a >= (BASE << 6)) a -= (BASE << 6); \ - if (a >= (BASE << 5)) a -= (BASE << 5); \ - if (a >= (BASE << 4)) a -= (BASE << 4); \ - if (a >= (BASE << 3)) a -= (BASE << 3); \ - if (a >= (BASE << 2)) a -= (BASE << 2); \ - if (a >= (BASE << 1)) a -= (BASE << 1); \ + unsigned long tmp = a >> 16; \ + a &= 0xffffUL; \ + a += (tmp << 4) - tmp; \ + } while (0) +# define MOD28(a) \ + do { \ + CHOP(a); \ if (a >= BASE) a -= BASE; \ } while (0) -# define MOD4(a) \ +# define MOD(a) \ do { \ - if (a >= (BASE << 4)) a -= (BASE << 4); \ - if (a >= (BASE << 3)) a -= (BASE << 3); \ - if (a >= (BASE << 2)) a -= (BASE << 2); \ - if (a >= (BASE << 1)) a -= (BASE << 1); \ + CHOP(a); \ + MOD28(a); \ + } while (0) +# define MOD63(a) \ + do { /* this assumes a is not negative */ \ + z_off64_t tmp = a >> 32; \ + a &= 0xffffffffL; \ + a += (tmp << 8) - (tmp << 5) + tmp; \ + tmp = a >> 16; \ + a &= 0xffffL; \ + a += (tmp << 4) - tmp; \ + tmp = a >> 16; \ + a &= 0xffffL; \ + a += (tmp << 4) - tmp; \ if (a >= BASE) a -= BASE; \ } while (0) #else # define MOD(a) a %= BASE -# define MOD4(a) a %= BASE +# define MOD28(a) a %= BASE +# define MOD63(a) a %= BASE #endif /* ========================================================================= */ @@ -89,7 +97,7 @@ uLong ZEXPORT adler32(adler, buf, len) } if (adler >= BASE) adler -= BASE; - MOD4(sum2); /* only added so many BASE's */ + MOD28(sum2); /* only added so many BASE's */ return adler | (sum2 << 16); } @@ -125,25 +133,47 @@ uLong ZEXPORT adler32(adler, buf, len) } /* ========================================================================= */ -uLong ZEXPORT adler32_combine(adler1, adler2, len2) +local uLong adler32_combine_(adler1, adler2, len2) uLong adler1; uLong adler2; - z_off_t len2; + z_off64_t len2; { unsigned long sum1; unsigned long sum2; unsigned rem; + /* for negative len, return invalid adler32 as a clue for debugging */ + if (len2 < 0) + return 0xffffffffUL; + /* the derivation of this formula is left as an exercise for the reader */ - rem = (unsigned)(len2 % BASE); + MOD63(len2); /* assumes len2 >= 0 */ + rem = (unsigned)len2; sum1 = adler1 & 0xffff; sum2 = rem * sum1; MOD(sum2); sum1 += (adler2 & 0xffff) + BASE - 1; sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem; - if (sum1 > BASE) sum1 -= BASE; - if (sum1 > BASE) sum1 -= BASE; - if (sum2 > (BASE << 1)) sum2 -= (BASE << 1); - if (sum2 > BASE) sum2 -= BASE; + if (sum1 >= BASE) sum1 -= BASE; + if (sum1 >= BASE) sum1 -= BASE; + if (sum2 >= (BASE << 1)) sum2 -= (BASE << 1); + if (sum2 >= BASE) sum2 -= BASE; return sum1 | (sum2 << 16); } + +/* ========================================================================= */ +uLong ZEXPORT adler32_combine(adler1, adler2, len2) + uLong adler1; + uLong adler2; + z_off_t len2; +{ + return adler32_combine_(adler1, adler2, len2); +} + +uLong ZEXPORT adler32_combine64(adler1, adler2, len2) + uLong adler1; + uLong adler2; + z_off64_t len2; +{ + return adler32_combine_(adler1, adler2, len2); +} diff --git a/neo/libs/zlib/compress.c b/neo/libs/zlib/compress.c index df04f014..ea4dfbe9 100644 --- a/neo/libs/zlib/compress.c +++ b/neo/libs/zlib/compress.c @@ -1,5 +1,5 @@ /* compress.c -- compress a memory buffer - * Copyright (C) 1995-2003 Jean-loup Gailly. + * Copyright (C) 1995-2005 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -75,5 +75,6 @@ int ZEXPORT compress (dest, destLen, source, sourceLen) uLong ZEXPORT compressBound (sourceLen) uLong sourceLen; { - return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + 11; + return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + + (sourceLen >> 25) + 13; } diff --git a/neo/libs/zlib/configure b/neo/libs/zlib/configure old mode 100644 new mode 100755 index d7ffdc34..36c7d8ec --- a/neo/libs/zlib/configure +++ b/neo/libs/zlib/configure @@ -1,108 +1,249 @@ #!/bin/sh -# configure script for zlib. This script is needed only if -# you wish to build a shared library and your system supports them, -# of if you need special compiler, flags or install directory. -# Otherwise, you can just use directly "make test; make install" +# configure script for zlib. # -# To create a shared library, use "configure --shared"; by default a static -# library is created. If the primitive shared library support provided here -# does not work, use ftp://prep.ai.mit.edu/pub/gnu/libtool-*.tar.gz +# Normally configure builds both a static and a shared library. +# If you want to build just a static library, use: ./configure --static # # To impose specific compiler or flags or install directory, use for example: # prefix=$HOME CC=cc CFLAGS="-O4" ./configure # or for csh/tcsh users: # (setenv prefix $HOME; setenv CC cc; setenv CFLAGS "-O4"; ./configure) -# LDSHARED is the command to be used to create a shared library # Incorrect settings of CC or CFLAGS may prevent creating a shared library. # If you have problems, try without defining CC and CFLAGS before reporting # an error. -LIBS=libz.a -LDFLAGS="-L. ${LIBS}" +# start off configure.log +echo -------------------- >> configure.log +echo $0 $* >> configure.log +date >> configure.log + +# set command prefix for cross-compilation +if [ -n "${CHOST}" ]; then + uname="`echo "${CHOST}" | sed -e 's/^[^-]*-\([^-]*\)$/\1/' -e 's/^[^-]*-[^-]*-\([^-]*\)$/\1/' -e 's/^[^-]*-[^-]*-\([^-]*\)-.*$/\1/'`" + CROSS_PREFIX="${CHOST}-" +fi + +# destination name for static library +STATICLIB=libz.a + +# extract zlib version numbers from zlib.h VER=`sed -n -e '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h` +VER3=`sed -n -e '/VERSION "/s/.*"\([0-9]*\\.[0-9]*\\.[0-9]*\).*/\1/p' < zlib.h` VER2=`sed -n -e '/VERSION "/s/.*"\([0-9]*\\.[0-9]*\)\\..*/\1/p' < zlib.h` VER1=`sed -n -e '/VERSION "/s/.*"\([0-9]*\)\\..*/\1/p' < zlib.h` -AR=${AR-"ar rc"} -RANLIB=${RANLIB-"ranlib"} + +# establish commands for library building +if "${CROSS_PREFIX}ar" --version >/dev/null 2>/dev/null || test $? -lt 126; then + AR=${AR-"${CROSS_PREFIX}ar"} + test -n "${CROSS_PREFIX}" && echo Using ${AR} | tee -a configure.log +else + AR=${AR-"ar"} + test -n "${CROSS_PREFIX}" && echo Using ${AR} | tee -a configure.log +fi +ARFLAGS=${ARFLAGS-"rc"} +if "${CROSS_PREFIX}ranlib" --version >/dev/null 2>/dev/null || test $? -lt 126; then + RANLIB=${RANLIB-"${CROSS_PREFIX}ranlib"} + test -n "${CROSS_PREFIX}" && echo Using ${RANLIB} | tee -a configure.log +else + RANLIB=${RANLIB-"ranlib"} +fi +if "${CROSS_PREFIX}nm" --version >/dev/null 2>/dev/null || test $? -lt 126; then + NM=${NM-"${CROSS_PREFIX}nm"} + test -n "${CROSS_PREFIX}" && echo Using ${NM} | tee -a configure.log +else + NM=${NM-"nm"} +fi + +# set defaults before processing command line options +LDCONFIG=${LDCONFIG-"ldconfig"} +LDSHAREDLIBC="${LDSHAREDLIBC--lc}" +ARCHS= prefix=${prefix-/usr/local} exec_prefix=${exec_prefix-'${prefix}'} libdir=${libdir-'${exec_prefix}/lib'} +sharedlibdir=${sharedlibdir-'${libdir}'} includedir=${includedir-'${prefix}/include'} mandir=${mandir-'${prefix}/share/man'} shared_ext='.so' -shared=0 +shared=1 +solo=0 +cover=0 +zprefix=0 +build64=0 gcc=0 old_cc="$CC" old_cflags="$CFLAGS" +OBJC='$(OBJZ) $(OBJG)' +PIC_OBJC='$(PIC_OBJZ) $(PIC_OBJG)' +# process command line options while test $# -ge 1 do case "$1" in - -h* | --h*) - echo 'usage:' - echo ' configure [--shared] [--prefix=PREFIX] [--exec_prefix=EXPREFIX]' - echo ' [--libdir=LIBDIR] [--includedir=INCLUDEDIR]' - exit 0;; - -p*=* | --p*=*) prefix=`echo $1 | sed 's/[-a-z_]*=//'`; shift;; - -e*=* | --e*=*) exec_prefix=`echo $1 | sed 's/[-a-z_]*=//'`; shift;; - -l*=* | --libdir=*) libdir=`echo $1 | sed 's/[-a-z_]*=//'`; shift;; - -i*=* | --includedir=*) includedir=`echo $1 | sed 's/[-a-z_]*=//'`;shift;; - -p* | --p*) prefix="$2"; shift; shift;; - -e* | --e*) exec_prefix="$2"; shift; shift;; - -l* | --l*) libdir="$2"; shift; shift;; - -i* | --i*) includedir="$2"; shift; shift;; - -s* | --s*) shared=1; shift;; - *) echo "unknown option: $1"; echo "$0 --help for help"; exit 1;; + -h* | --help) + echo 'usage:' | tee -a configure.log + echo ' configure [--zprefix] [--prefix=PREFIX] [--eprefix=EXPREFIX]' | tee -a configure.log + echo ' [--static] [--64] [--libdir=LIBDIR] [--sharedlibdir=LIBDIR]' | tee -a configure.log + echo ' [--includedir=INCLUDEDIR] [--archs="-arch i386 -arch x86_64"]' | tee -a configure.log + exit 0 ;; + -p*=* | --prefix=*) prefix=`echo $1 | sed 's/.*=//'`; shift ;; + -e*=* | --eprefix=*) exec_prefix=`echo $1 | sed 's/.*=//'`; shift ;; + -l*=* | --libdir=*) libdir=`echo $1 | sed 's/.*=//'`; shift ;; + --sharedlibdir=*) sharedlibdir=`echo $1 | sed 's/.*=//'`; shift ;; + -i*=* | --includedir=*) includedir=`echo $1 | sed 's/.*=//'`;shift ;; + -u*=* | --uname=*) uname=`echo $1 | sed 's/.*=//'`;shift ;; + -p* | --prefix) prefix="$2"; shift; shift ;; + -e* | --eprefix) exec_prefix="$2"; shift; shift ;; + -l* | --libdir) libdir="$2"; shift; shift ;; + -i* | --includedir) includedir="$2"; shift; shift ;; + -s* | --shared | --enable-shared) shared=1; shift ;; + -t | --static) shared=0; shift ;; + --solo) solo=1; shift ;; + --cover) cover=1; shift ;; + -z* | --zprefix) zprefix=1; shift ;; + -6* | --64) build64=1; shift ;; + -a*=* | --archs=*) ARCHS=`echo $1 | sed 's/.*=//'`; shift ;; + --sysconfdir=*) echo "ignored option: --sysconfdir" | tee -a configure.log; shift ;; + --localstatedir=*) echo "ignored option: --localstatedir" | tee -a configure.log; shift ;; + *) echo "unknown option: $1"; echo "$0 --help for help" | tee -a configure.log; exit 1 ;; esac done +# define functions for testing compiler and library characteristics and logging the results test=ztest$$ + +show() +{ + case "$*" in + *$test.c*) + echo === $test.c === >> configure.log + cat $test.c >> configure.log + echo === >> configure.log;; + esac + echo $* >> configure.log +} + +cat > $test.c </dev/null; then + try() + { + show $* + test "`( $* ) 2>&1 | tee -a configure.log`" = "" + } + echo - using any output from compiler to indicate an error >> configure.log +else + try() + { + show $* + ( $* ) >> configure.log 2>&1 + ret=$? + if test $ret -ne 0; then + echo "(exit code "$ret")" >> configure.log + fi + return $ret + } +fi + +tryboth() +{ + show $* + got=`( $* ) 2>&1` + ret=$? + printf %s "$got" >> configure.log + if test $ret -ne 0; then + return $ret + fi + test "$got" = "" +} + +echo >> configure.log + +# check for gcc vs. cc and set compile and link flags based on the system identified by uname cat > $test.c <&1` in + *gcc*) gcc=1 ;; esac -if test "$gcc" -eq 1 && ($cc -c $cflags $test.c) 2>/dev/null; then +show $cc -c $cflags $test.c +if test "$gcc" -eq 1 && ($cc -c $cflags $test.c) >> configure.log 2>&1; then + echo ... using gcc >> configure.log CC="$cc" - SFLAGS=${CFLAGS-"-fPIC -O3"} - CFLAGS="$cflags" - case `(uname -s || echo unknown) 2>/dev/null` in - Linux | linux | GNU | GNU/*) LDSHARED=${LDSHARED-"$cc -shared -Wl,-soname,libz.so.1"};; - CYGWIN* | Cygwin* | cygwin* | OS/2* ) - EXE='.exe';; + CFLAGS="${CFLAGS--O3} ${ARCHS}" + SFLAGS="${CFLAGS--O3} -fPIC" + LDFLAGS="${LDFLAGS} ${ARCHS}" + if test $build64 -eq 1; then + CFLAGS="${CFLAGS} -m64" + SFLAGS="${SFLAGS} -m64" + fi + if test "${ZLIBGCCWARN}" = "YES"; then + CFLAGS="${CFLAGS} -Wall -Wextra -pedantic" + fi + if test -z "$uname"; then + uname=`(uname -s || echo unknown) 2>/dev/null` + fi + case "$uname" in + Linux* | linux* | GNU | GNU/* | solaris*) + LDSHARED=${LDSHARED-"$cc -shared -Wl,-soname,libz.so.1,--version-script,zlib.map"} ;; + *BSD | *bsd* | DragonFly) + LDSHARED=${LDSHARED-"$cc -shared -Wl,-soname,libz.so.1,--version-script,zlib.map"} + LDCONFIG="ldconfig -m" ;; + CYGWIN* | Cygwin* | cygwin* | OS/2*) + EXE='.exe' ;; + MINGW* | mingw*) +# temporary bypass + rm -f $test.[co] $test $test$shared_ext + echo "Please use win32/Makefile.gcc instead." | tee -a configure.log + exit 1 + LDSHARED=${LDSHARED-"$cc -shared"} + LDSHAREDLIBC="" + EXE='.exe' ;; QNX*) # This is for QNX6. I suppose that the QNX rule below is for QNX2,QNX4 # (alain.bonnefoy@icbt.com) - LDSHARED=${LDSHARED-"$cc -shared -Wl,-hlibz.so.1"};; + LDSHARED=${LDSHARED-"$cc -shared -Wl,-hlibz.so.1"} ;; HP-UX*) LDSHARED=${LDSHARED-"$cc -shared $SFLAGS"} case `(uname -m || echo unknown) 2>/dev/null` in ia64) shared_ext='.so' - SHAREDLIB='libz.so';; + SHAREDLIB='libz.so' ;; *) shared_ext='.sl' - SHAREDLIB='libz.sl';; - esac;; - Darwin*) shared_ext='.dylib' + SHAREDLIB='libz.sl' ;; + esac ;; + Darwin* | darwin*) + shared_ext='.dylib' SHAREDLIB=libz$shared_ext SHAREDLIBV=libz.$VER$shared_ext SHAREDLIBM=libz.$VER1$shared_ext - LDSHARED=${LDSHARED-"$cc -dynamiclib -install_name $libdir/$SHAREDLIBM -compatibility_version $VER1 -current_version $VER"};; - *) LDSHARED=${LDSHARED-"$cc -shared"};; + LDSHARED=${LDSHARED-"$cc -dynamiclib -install_name $libdir/$SHAREDLIBM -compatibility_version $VER1 -current_version $VER3"} + AR="/usr/bin/libtool" + ARFLAGS="-o" ;; + *) LDSHARED=${LDSHARED-"$cc -shared"} ;; esac else # find system name and corresponding cc options CC=${CC-cc} - case `(uname -sr || echo unknown) 2>/dev/null` in + gcc=0 + echo ... using $CC >> configure.log + if test -z "$uname"; then + uname=`(uname -sr || echo unknown) 2>/dev/null` + fi + case "$uname" in HP-UX*) SFLAGS=${CFLAGS-"-O +z"} CFLAGS=${CFLAGS-"-O"} # LDSHARED=${LDSHARED-"ld -b +vnocompatwarnings"} @@ -110,350 +251,568 @@ else case `(uname -m || echo unknown) 2>/dev/null` in ia64) shared_ext='.so' - SHAREDLIB='libz.so';; + SHAREDLIB='libz.so' ;; *) shared_ext='.sl' - SHAREDLIB='libz.sl';; - esac;; + SHAREDLIB='libz.sl' ;; + esac ;; IRIX*) SFLAGS=${CFLAGS-"-ansi -O2 -rpath ."} CFLAGS=${CFLAGS-"-ansi -O2"} - LDSHARED=${LDSHARED-"cc -shared"};; + LDSHARED=${LDSHARED-"cc -shared -Wl,-soname,libz.so.1"} ;; OSF1\ V4*) SFLAGS=${CFLAGS-"-O -std1"} CFLAGS=${CFLAGS-"-O -std1"} - LDSHARED=${LDSHARED-"cc -shared -Wl,-soname,libz.so -Wl,-msym -Wl,-rpath,$(libdir) -Wl,-set_version,${VER}:1.0"};; + LDFLAGS="${LDFLAGS} -Wl,-rpath,." + LDSHARED=${LDSHARED-"cc -shared -Wl,-soname,libz.so -Wl,-msym -Wl,-rpath,$(libdir) -Wl,-set_version,${VER}:1.0"} ;; OSF1*) SFLAGS=${CFLAGS-"-O -std1"} CFLAGS=${CFLAGS-"-O -std1"} - LDSHARED=${LDSHARED-"cc -shared"};; + LDSHARED=${LDSHARED-"cc -shared -Wl,-soname,libz.so.1"} ;; QNX*) SFLAGS=${CFLAGS-"-4 -O"} CFLAGS=${CFLAGS-"-4 -O"} LDSHARED=${LDSHARED-"cc"} RANLIB=${RANLIB-"true"} - AR="cc -A";; + AR="cc" + ARFLAGS="-A" ;; SCO_SV\ 3.2*) SFLAGS=${CFLAGS-"-O3 -dy -KPIC "} CFLAGS=${CFLAGS-"-O3"} - LDSHARED=${LDSHARED-"cc -dy -KPIC -G"};; - SunOS\ 5*) SFLAGS=${CFLAGS-"-fast -xcg89 -KPIC -R."} - CFLAGS=${CFLAGS-"-fast -xcg89"} - LDSHARED=${LDSHARED-"cc -G"};; + LDSHARED=${LDSHARED-"cc -dy -KPIC -G"} ;; + SunOS\ 5* | solaris*) + LDSHARED=${LDSHARED-"cc -G -h libz$shared_ext.$VER1"} + SFLAGS=${CFLAGS-"-fast -KPIC"} + CFLAGS=${CFLAGS-"-fast"} + if test $build64 -eq 1; then + # old versions of SunPRO/Workshop/Studio don't support -m64, + # but newer ones do. Check for it. + flag64=`$CC -flags | egrep -- '^-m64'` + if test x"$flag64" != x"" ; then + CFLAGS="${CFLAGS} -m64" + SFLAGS="${SFLAGS} -m64" + else + case `(uname -m || echo unknown) 2>/dev/null` in + i86*) + SFLAGS="$SFLAGS -xarch=amd64" + CFLAGS="$CFLAGS -xarch=amd64" ;; + *) + SFLAGS="$SFLAGS -xarch=v9" + CFLAGS="$CFLAGS -xarch=v9" ;; + esac + fi + fi + ;; SunOS\ 4*) SFLAGS=${CFLAGS-"-O2 -PIC"} CFLAGS=${CFLAGS-"-O2"} - LDSHARED=${LDSHARED-"ld"};; - SunStudio\ 9*) SFLAGS=${CFLAGS-"-DUSE_MMAP -fast -xcode=pic32 -xtarget=ultra3 -xarch=v9b"} - CFLAGS=${CFLAGS-"-DUSE_MMAP -fast -xtarget=ultra3 -xarch=v9b"} - LDSHARED=${LDSHARED-"cc -xarch=v9b"};; + LDSHARED=${LDSHARED-"ld"} ;; + SunStudio\ 9*) SFLAGS=${CFLAGS-"-fast -xcode=pic32 -xtarget=ultra3 -xarch=v9b"} + CFLAGS=${CFLAGS-"-fast -xtarget=ultra3 -xarch=v9b"} + LDSHARED=${LDSHARED-"cc -xarch=v9b"} ;; UNIX_System_V\ 4.2.0) SFLAGS=${CFLAGS-"-KPIC -O"} CFLAGS=${CFLAGS-"-O"} - LDSHARED=${LDSHARED-"cc -G"};; + LDSHARED=${LDSHARED-"cc -G"} ;; UNIX_SV\ 4.2MP) SFLAGS=${CFLAGS-"-Kconform_pic -O"} CFLAGS=${CFLAGS-"-O"} - LDSHARED=${LDSHARED-"cc -G"};; + LDSHARED=${LDSHARED-"cc -G"} ;; OpenUNIX\ 5) SFLAGS=${CFLAGS-"-KPIC -O"} CFLAGS=${CFLAGS-"-O"} - LDSHARED=${LDSHARED-"cc -G"};; + LDSHARED=${LDSHARED-"cc -G"} ;; AIX*) # Courtesy of dbakker@arrayasolutions.com SFLAGS=${CFLAGS-"-O -qmaxmem=8192"} CFLAGS=${CFLAGS-"-O -qmaxmem=8192"} - LDSHARED=${LDSHARED-"xlc -G"};; - # send working options for other systems to support@gzip.org + LDSHARED=${LDSHARED-"xlc -G"} ;; + # send working options for other systems to zlib@gzip.org *) SFLAGS=${CFLAGS-"-O"} CFLAGS=${CFLAGS-"-O"} - LDSHARED=${LDSHARED-"cc -shared"};; + LDSHARED=${LDSHARED-"cc -shared"} ;; esac fi +# destination names for shared library if not defined above SHAREDLIB=${SHAREDLIB-"libz$shared_ext"} SHAREDLIBV=${SHAREDLIBV-"libz$shared_ext.$VER"} SHAREDLIBM=${SHAREDLIBM-"libz$shared_ext.$VER1"} +echo >> configure.log + +# see if shared library build supported if test $shared -eq 1; then - echo Checking for shared library support... + echo Checking for shared library support... | tee -a configure.log # we must test in two steps (cc then ld), required at least on SunOS 4.x - if test "`($CC -c $SFLAGS $test.c) 2>&1`" = "" && - test "`($LDSHARED -o $test$shared_ext $test.o) 2>&1`" = ""; then - CFLAGS="$SFLAGS" - LIBS="$SHAREDLIBV" - echo Building shared library $SHAREDLIBV with $CC. + if try $CC -w -c $SFLAGS $test.c && + try $LDSHARED $SFLAGS -o $test$shared_ext $test.o; then + echo Building shared library $SHAREDLIBV with $CC. | tee -a configure.log elif test -z "$old_cc" -a -z "$old_cflags"; then - echo No shared library support. + echo No shared library support. | tee -a configure.log shared=0; else - echo 'No shared library support; try without defining CC and CFLAGS' + echo 'No shared library support; try without defining CC and CFLAGS' | tee -a configure.log shared=0; fi fi if test $shared -eq 0; then LDSHARED="$CC" - echo Building static library $LIBS version $VER with $CC. + ALL="static" + TEST="all teststatic" + SHAREDLIB="" + SHAREDLIBV="" + SHAREDLIBM="" + echo Building static library $STATICLIB version $VER with $CC. | tee -a configure.log else - LDFLAGS="-L. ${SHAREDLIBV}" + ALL="static shared" + TEST="all teststatic testshared" fi +echo >> configure.log + +# check for underscores in external names for use by assembler code +CPP=${CPP-"$CC -E"} +case $CFLAGS in + *ASMV*) + echo >> configure.log + show "$NM $test.o | grep _hello" + if test "`$NM $test.o | grep _hello | tee -a configure.log`" = ""; then + CPP="$CPP -DNO_UNDERLINE" + echo Checking for underline in external names... No. | tee -a configure.log + else + echo Checking for underline in external names... Yes. | tee -a configure.log + fi ;; +esac + +echo >> configure.log + +# check for large file support, and if none, check for fseeko() +cat > $test.c < +off64_t dummy = 0; +EOF +if try $CC -c $CFLAGS -D_LARGEFILE64_SOURCE=1 $test.c; then + CFLAGS="${CFLAGS} -D_LARGEFILE64_SOURCE=1" + SFLAGS="${SFLAGS} -D_LARGEFILE64_SOURCE=1" + ALL="${ALL} all64" + TEST="${TEST} test64" + echo "Checking for off64_t... Yes." | tee -a configure.log + echo "Checking for fseeko... Yes." | tee -a configure.log +else + echo "Checking for off64_t... No." | tee -a configure.log + echo >> configure.log + cat > $test.c < +int main(void) { + fseeko(NULL, 0, 0); + return 0; +} +EOF + if try $CC $CFLAGS -o $test $test.c; then + echo "Checking for fseeko... Yes." | tee -a configure.log + else + CFLAGS="${CFLAGS} -DNO_FSEEKO" + SFLAGS="${SFLAGS} -DNO_FSEEKO" + echo "Checking for fseeko... No." | tee -a configure.log + fi +fi + +echo >> configure.log + +# check for strerror() for use by gz* functions +cat > $test.c < +#include +int main() { return strlen(strerror(errno)); } +EOF +if try $CC $CFLAGS -o $test $test.c; then + echo "Checking for strerror... Yes." | tee -a configure.log +else + CFLAGS="${CFLAGS} -DNO_STRERROR" + SFLAGS="${SFLAGS} -DNO_STRERROR" + echo "Checking for strerror... No." | tee -a configure.log +fi + +# copy clean zconf.h for subsequent edits +cp -p zconf.h.in zconf.h + +echo >> configure.log + +# check for unistd.h and save result in zconf.h cat > $test.c < int main() { return 0; } EOF -if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then - sed < zconf.in.h "/HAVE_UNISTD_H/s%0%1%" > zconf.h - echo "Checking for unistd.h... Yes." +if try $CC -c $CFLAGS $test.c; then + sed < zconf.h "/^#ifdef HAVE_UNISTD_H.* may be/s/def HAVE_UNISTD_H\(.*\) may be/ 1\1 was/" > zconf.temp.h + mv zconf.temp.h zconf.h + echo "Checking for unistd.h... Yes." | tee -a configure.log else - cp -p zconf.in.h zconf.h - echo "Checking for unistd.h... No." + echo "Checking for unistd.h... No." | tee -a configure.log fi +echo >> configure.log + +# check for stdarg.h and save result in zconf.h +cat > $test.c < +int main() { return 0; } +EOF +if try $CC -c $CFLAGS $test.c; then + sed < zconf.h "/^#ifdef HAVE_STDARG_H.* may be/s/def HAVE_STDARG_H\(.*\) may be/ 1\1 was/" > zconf.temp.h + mv zconf.temp.h zconf.h + echo "Checking for stdarg.h... Yes." | tee -a configure.log +else + echo "Checking for stdarg.h... No." | tee -a configure.log +fi + +# if the z_ prefix was requested, save that in zconf.h +if test $zprefix -eq 1; then + sed < zconf.h "/#ifdef Z_PREFIX.* may be/s/def Z_PREFIX\(.*\) may be/ 1\1 was/" > zconf.temp.h + mv zconf.temp.h zconf.h + echo >> configure.log + echo "Using z_ prefix on all symbols." | tee -a configure.log +fi + +# if --solo compilation was requested, save that in zconf.h and remove gz stuff from object lists +if test $solo -eq 1; then + sed '/#define ZCONF_H/a\ +#define Z_SOLO + +' < zconf.h > zconf.temp.h + mv zconf.temp.h zconf.h +OBJC='$(OBJZ)' +PIC_OBJC='$(PIC_OBJZ)' +fi + +# if code coverage testing was requested, use older gcc if defined, e.g. "gcc-4.2" on Mac OS X +if test $cover -eq 1; then + CFLAGS="${CFLAGS} -fprofile-arcs -ftest-coverage" + if test -n "$GCC_CLASSIC"; then + CC=$GCC_CLASSIC + fi +fi + +echo >> configure.log + +# conduct a series of tests to resolve eight possible cases of using "vs" or "s" printf functions +# (using stdarg or not), with or without "n" (proving size of buffer), and with or without a +# return value. The most secure result is vsnprintf() with a return value. snprintf() with a +# return value is secure as well, but then gzprintf() will be limited to 20 arguments. cat > $test.c < #include #include "zconf.h" - int main() { #ifndef STDC choke me #endif - return 0; } EOF +if try $CC -c $CFLAGS $test.c; then + echo "Checking whether to use vs[n]printf() or s[n]printf()... using vs[n]printf()." | tee -a configure.log -if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then - echo "Checking whether to use vs[n]printf() or s[n]printf()... using vs[n]printf()" - + echo >> configure.log cat > $test.c < #include - -int mytest(char *fmt, ...) +int mytest(const char *fmt, ...) { char buf[20]; va_list ap; - va_start(ap, fmt); vsnprintf(buf, sizeof(buf), fmt, ap); va_end(ap); return 0; } - int main() { return (mytest("Hello%d\n", 1)); } EOF + if try $CC $CFLAGS -o $test $test.c; then + echo "Checking for vsnprintf() in stdio.h... Yes." | tee -a configure.log - if test "`($CC $CFLAGS -o $test $test.c) 2>&1`" = ""; then - echo "Checking for vsnprintf() in stdio.h... Yes." - + echo >> configure.log cat >$test.c < #include - -int mytest(char *fmt, ...) +int mytest(const char *fmt, ...) { int n; char buf[20]; va_list ap; - va_start(ap, fmt); n = vsnprintf(buf, sizeof(buf), fmt, ap); va_end(ap); return n; } - int main() { return (mytest("Hello%d\n", 1)); } EOF - if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then - echo "Checking for return value of vsnprintf()... Yes." + if try $CC -c $CFLAGS $test.c; then + echo "Checking for return value of vsnprintf()... Yes." | tee -a configure.log else CFLAGS="$CFLAGS -DHAS_vsnprintf_void" - echo "Checking for return value of vsnprintf()... No." - echo " WARNING: apparently vsnprintf() does not return a value. zlib" - echo " can build but will be open to possible string-format security" - echo " vulnerabilities." + SFLAGS="$SFLAGS -DHAS_vsnprintf_void" + echo "Checking for return value of vsnprintf()... No." | tee -a configure.log + echo " WARNING: apparently vsnprintf() does not return a value. zlib" | tee -a configure.log + echo " can build but will be open to possible string-format security" | tee -a configure.log + echo " vulnerabilities." | tee -a configure.log fi else CFLAGS="$CFLAGS -DNO_vsnprintf" - echo "Checking for vsnprintf() in stdio.h... No." - echo " WARNING: vsnprintf() not found, falling back to vsprintf(). zlib" - echo " can build but will be open to possible buffer-overflow security" - echo " vulnerabilities." + SFLAGS="$SFLAGS -DNO_vsnprintf" + echo "Checking for vsnprintf() in stdio.h... No." | tee -a configure.log + echo " WARNING: vsnprintf() not found, falling back to vsprintf(). zlib" | tee -a configure.log + echo " can build but will be open to possible buffer-overflow security" | tee -a configure.log + echo " vulnerabilities." | tee -a configure.log + echo >> configure.log cat >$test.c < #include - -int mytest(char *fmt, ...) +int mytest(const char *fmt, ...) { int n; char buf[20]; va_list ap; - va_start(ap, fmt); n = vsprintf(buf, fmt, ap); va_end(ap); return n; } - int main() { return (mytest("Hello%d\n", 1)); } EOF - if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then - echo "Checking for return value of vsprintf()... Yes." + if try $CC -c $CFLAGS $test.c; then + echo "Checking for return value of vsprintf()... Yes." | tee -a configure.log else CFLAGS="$CFLAGS -DHAS_vsprintf_void" - echo "Checking for return value of vsprintf()... No." - echo " WARNING: apparently vsprintf() does not return a value. zlib" - echo " can build but will be open to possible string-format security" - echo " vulnerabilities." + SFLAGS="$SFLAGS -DHAS_vsprintf_void" + echo "Checking for return value of vsprintf()... No." | tee -a configure.log + echo " WARNING: apparently vsprintf() does not return a value. zlib" | tee -a configure.log + echo " can build but will be open to possible string-format security" | tee -a configure.log + echo " vulnerabilities." | tee -a configure.log fi fi else - echo "Checking whether to use vs[n]printf() or s[n]printf()... using s[n]printf()" + echo "Checking whether to use vs[n]printf() or s[n]printf()... using s[n]printf()." | tee -a configure.log + echo >> configure.log cat >$test.c < - int mytest() { char buf[20]; - snprintf(buf, sizeof(buf), "%s", "foo"); return 0; } - int main() { return (mytest()); } EOF - if test "`($CC $CFLAGS -o $test $test.c) 2>&1`" = ""; then - echo "Checking for snprintf() in stdio.h... Yes." + if try $CC $CFLAGS -o $test $test.c; then + echo "Checking for snprintf() in stdio.h... Yes." | tee -a configure.log + echo >> configure.log cat >$test.c < - int mytest() { char buf[20]; - return snprintf(buf, sizeof(buf), "%s", "foo"); } - int main() { return (mytest()); } EOF - if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then - echo "Checking for return value of snprintf()... Yes." + if try $CC -c $CFLAGS $test.c; then + echo "Checking for return value of snprintf()... Yes." | tee -a configure.log else CFLAGS="$CFLAGS -DHAS_snprintf_void" - echo "Checking for return value of snprintf()... No." - echo " WARNING: apparently snprintf() does not return a value. zlib" - echo " can build but will be open to possible string-format security" - echo " vulnerabilities." + SFLAGS="$SFLAGS -DHAS_snprintf_void" + echo "Checking for return value of snprintf()... No." | tee -a configure.log + echo " WARNING: apparently snprintf() does not return a value. zlib" | tee -a configure.log + echo " can build but will be open to possible string-format security" | tee -a configure.log + echo " vulnerabilities." | tee -a configure.log fi else CFLAGS="$CFLAGS -DNO_snprintf" - echo "Checking for snprintf() in stdio.h... No." - echo " WARNING: snprintf() not found, falling back to sprintf(). zlib" - echo " can build but will be open to possible buffer-overflow security" - echo " vulnerabilities." + SFLAGS="$SFLAGS -DNO_snprintf" + echo "Checking for snprintf() in stdio.h... No." | tee -a configure.log + echo " WARNING: snprintf() not found, falling back to sprintf(). zlib" | tee -a configure.log + echo " can build but will be open to possible buffer-overflow security" | tee -a configure.log + echo " vulnerabilities." | tee -a configure.log + echo >> configure.log cat >$test.c < - int mytest() { char buf[20]; - return sprintf(buf, "%s", "foo"); } - int main() { return (mytest()); } EOF - if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then - echo "Checking for return value of sprintf()... Yes." + if try $CC -c $CFLAGS $test.c; then + echo "Checking for return value of sprintf()... Yes." | tee -a configure.log else CFLAGS="$CFLAGS -DHAS_sprintf_void" - echo "Checking for return value of sprintf()... No." - echo " WARNING: apparently sprintf() does not return a value. zlib" - echo " can build but will be open to possible string-format security" - echo " vulnerabilities." + SFLAGS="$SFLAGS -DHAS_sprintf_void" + echo "Checking for return value of sprintf()... No." | tee -a configure.log + echo " WARNING: apparently sprintf() does not return a value. zlib" | tee -a configure.log + echo " can build but will be open to possible string-format security" | tee -a configure.log + echo " vulnerabilities." | tee -a configure.log fi fi fi -cat >$test.c < -int main() { return 0; } -EOF -if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then - echo "Checking for errno.h... Yes." -else - echo "Checking for errno.h... No." - CFLAGS="$CFLAGS -DNO_ERRNO_H" -fi - -cat > $test.c < -#include -#include -caddr_t hello() { - return mmap((caddr_t)0, (off_t)0, PROT_READ, MAP_SHARED, 0, (off_t)0); +# see if we can hide zlib internal symbols that are linked between separate source files +if test "$gcc" -eq 1; then + echo >> configure.log + cat > $test.c <&1`" = ""; then - CFLAGS="$CFLAGS -DUSE_MMAP" - echo Checking for mmap support... Yes. -else - echo Checking for mmap support... No. + if tryboth $CC -c $CFLAGS $test.c; then + CFLAGS="$CFLAGS -DHAVE_HIDDEN" + SFLAGS="$SFLAGS -DHAVE_HIDDEN" + echo "Checking for attribute(visibility) support... Yes." | tee -a configure.log + else + echo "Checking for attribute(visibility) support... No." | tee -a configure.log + fi fi -CPP=${CPP-"$CC -E"} -case $CFLAGS in - *ASMV*) - if test "`nm $test.o | grep _hello`" = ""; then - CPP="$CPP -DNO_UNDERLINE" - echo Checking for underline in external names... No. - else - echo Checking for underline in external names... Yes. - fi;; -esac +echo >> configure.log -rm -f $test.[co] $test $test$shared_ext +# find a four-byte unsiged integer type for crc calculations +cat > $test.c < +#define is32(n,t) for(n=1,k=0;n;n<<=1,k++);if(k==32){puts(t);return 0;} +int main() { + int k; + unsigned i; + unsigned long l; + unsigned short s; + is32(i, "unsigned") + is32(l, "unsigned long") + is32(s, "unsigned short") + return 1; +} +EOF +Z_U4="" +if try $CC $CFLAGS $test.c -o $test && Z_U4=`./$test` && test -n "$Z_U4"; then + sed < zconf.h "/#define Z_U4/s/\/\* \.\/configure may/#define Z_U4 $Z_U4 \/* .\/configure put the/" > zconf.temp.h + mv zconf.temp.h zconf.h + echo "Looking for a four-byte integer type... Found." | tee -a configure.log +else + echo "Looking for a four-byte integer type... Not found." | tee -a configure.log +fi -# udpate Makefile +# clean up files produced by running the compiler and linker +rm -f $test.[co] $test $test$shared_ext $test.gcno + +# show the results in the log +echo >> configure.log +echo ALL = $ALL >> configure.log +echo AR = $AR >> configure.log +echo ARFLAGS = $ARFLAGS >> configure.log +echo CC = $CC >> configure.log +echo CFLAGS = $CFLAGS >> configure.log +echo CPP = $CPP >> configure.log +echo EXE = $EXE >> configure.log +echo LDCONFIG = $LDCONFIG >> configure.log +echo LDFLAGS = $LDFLAGS >> configure.log +echo LDSHARED = $LDSHARED >> configure.log +echo LDSHAREDLIBC = $LDSHAREDLIBC >> configure.log +echo OBJC = $OBJC >> configure.log +echo PIC_OBJC = $PIC_OBJC >> configure.log +echo RANLIB = $RANLIB >> configure.log +echo SFLAGS = $SFLAGS >> configure.log +echo SHAREDLIB = $SHAREDLIB >> configure.log +echo SHAREDLIBM = $SHAREDLIBM >> configure.log +echo SHAREDLIBV = $SHAREDLIBV >> configure.log +echo STATICLIB = $STATICLIB >> configure.log +echo TEST = $TEST >> configure.log +echo VER = $VER >> configure.log +echo Z_U4 = $Z_U4 >> configure.log +echo exec_prefix = $exec_prefix >> configure.log +echo includedir = $includedir >> configure.log +echo libdir = $libdir >> configure.log +echo mandir = $mandir >> configure.log +echo prefix = $prefix >> configure.log +echo sharedlibdir = $sharedlibdir >> configure.log +echo uname = $uname >> configure.log +echo -------------------- >> configure.log +echo >> configure.log +echo >> configure.log + +# udpate Makefile with the configure results sed < Makefile.in " /^CC *=/s#=.*#=$CC# /^CFLAGS *=/s#=.*#=$CFLAGS# -/^CPP *=/s#=.*#=$CPP# +/^SFLAGS *=/s#=.*#=$SFLAGS# +/^LDFLAGS *=/s#=.*#=$LDFLAGS# /^LDSHARED *=/s#=.*#=$LDSHARED# -/^LIBS *=/s#=.*#=$LIBS# +/^CPP *=/s#=.*#=$CPP# +/^STATICLIB *=/s#=.*#=$STATICLIB# /^SHAREDLIB *=/s#=.*#=$SHAREDLIB# /^SHAREDLIBV *=/s#=.*#=$SHAREDLIBV# /^SHAREDLIBM *=/s#=.*#=$SHAREDLIBM# /^AR *=/s#=.*#=$AR# +/^ARFLAGS *=/s#=.*#=$ARFLAGS# +/^RANLIB *=/s#=.*#=$RANLIB# +/^LDCONFIG *=/s#=.*#=$LDCONFIG# +/^LDSHAREDLIBC *=/s#=.*#=$LDSHAREDLIBC# +/^EXE *=/s#=.*#=$EXE# +/^prefix *=/s#=.*#=$prefix# +/^exec_prefix *=/s#=.*#=$exec_prefix# +/^libdir *=/s#=.*#=$libdir# +/^sharedlibdir *=/s#=.*#=$sharedlibdir# +/^includedir *=/s#=.*#=$includedir# +/^mandir *=/s#=.*#=$mandir# +/^OBJC *=/s#=.*#= $OBJC# +/^PIC_OBJC *=/s#=.*#= $PIC_OBJC# +/^all: */s#:.*#: $ALL# +/^test: */s#:.*#: $TEST# +" > Makefile + +# create zlib.pc with the configure results +sed < zlib.pc.in " +/^CC *=/s#=.*#=$CC# +/^CFLAGS *=/s#=.*#=$CFLAGS# +/^CPP *=/s#=.*#=$CPP# +/^LDSHARED *=/s#=.*#=$LDSHARED# +/^STATICLIB *=/s#=.*#=$STATICLIB# +/^SHAREDLIB *=/s#=.*#=$SHAREDLIB# +/^SHAREDLIBV *=/s#=.*#=$SHAREDLIBV# +/^SHAREDLIBM *=/s#=.*#=$SHAREDLIBM# +/^AR *=/s#=.*#=$AR# +/^ARFLAGS *=/s#=.*#=$ARFLAGS# /^RANLIB *=/s#=.*#=$RANLIB# /^EXE *=/s#=.*#=$EXE# /^prefix *=/s#=.*#=$prefix# /^exec_prefix *=/s#=.*#=$exec_prefix# /^libdir *=/s#=.*#=$libdir# +/^sharedlibdir *=/s#=.*#=$sharedlibdir# /^includedir *=/s#=.*#=$includedir# /^mandir *=/s#=.*#=$mandir# /^LDFLAGS *=/s#=.*#=$LDFLAGS# -" > Makefile +" | sed -e " +s/\@VERSION\@/$VER/g; +" > zlib.pc diff --git a/neo/libs/zlib/crc32.c b/neo/libs/zlib/crc32.c index f658a9ef..979a7190 100644 --- a/neo/libs/zlib/crc32.c +++ b/neo/libs/zlib/crc32.c @@ -1,5 +1,5 @@ /* crc32.c -- compute the CRC-32 of a data stream - * Copyright (C) 1995-2005 Mark Adler + * Copyright (C) 1995-2006, 2010, 2011, 2012 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h * * Thanks to Rodney Brown for his contribution of faster @@ -17,6 +17,8 @@ of the crc tables. Therefore, if you #define DYNAMIC_CRC_TABLE, you should first call get_crc_table() to initialize the tables before allowing more than one thread to use crc32(). + + DYNAMIC_CRC_TABLE and MAKECRCH can be #defined to write out crc32.h. */ #ifdef MAKECRCH @@ -30,31 +32,11 @@ #define local static -/* Find a four-byte integer type for crc32_little() and crc32_big(). */ -#ifndef NOBYFOUR -# ifdef STDC /* need ANSI C limits.h to determine sizes */ -# include -# define BYFOUR -# if (UINT_MAX == 0xffffffffUL) - typedef unsigned int u4; -# else -# if (ULONG_MAX == 0xffffffffUL) - typedef unsigned long u4; -# else -# if (USHRT_MAX == 0xffffffffUL) - typedef unsigned short u4; -# else -# undef BYFOUR /* can't find a four-byte integer type! */ -# endif -# endif -# endif -# endif /* STDC */ -#endif /* !NOBYFOUR */ - /* Definitions for doing the crc four data bytes at a time. */ +#if !defined(NOBYFOUR) && defined(Z_U4) +# define BYFOUR +#endif #ifdef BYFOUR -# define REV(w) (((w)>>24)+(((w)>>8)&0xff00)+ \ - (((w)&0xff00)<<8)+(((w)&0xff)<<24)) local unsigned long crc32_little OF((unsigned long, const unsigned char FAR *, unsigned)); local unsigned long crc32_big OF((unsigned long, @@ -68,14 +50,16 @@ local unsigned long gf2_matrix_times OF((unsigned long *mat, unsigned long vec)); local void gf2_matrix_square OF((unsigned long *square, unsigned long *mat)); +local uLong crc32_combine_ OF((uLong crc1, uLong crc2, z_off64_t len2)); + #ifdef DYNAMIC_CRC_TABLE local volatile int crc_table_empty = 1; -local unsigned long FAR crc_table[TBLS][256]; +local z_crc_t FAR crc_table[TBLS][256]; local void make_crc_table OF((void)); #ifdef MAKECRCH - local void write_table OF((FILE *, const unsigned long FAR *)); + local void write_table OF((FILE *, const z_crc_t FAR *)); #endif /* MAKECRCH */ /* Generate tables for a byte-wise 32-bit CRC calculation on the polynomial: @@ -105,9 +89,9 @@ local void make_crc_table OF((void)); */ local void make_crc_table() { - unsigned long c; + z_crc_t c; int n, k; - unsigned long poly; /* polynomial exclusive-or pattern */ + z_crc_t poly; /* polynomial exclusive-or pattern */ /* terms of polynomial defining this crc (except x^32): */ static volatile int first = 1; /* flag to limit concurrent making */ static const unsigned char p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26}; @@ -119,13 +103,13 @@ local void make_crc_table() first = 0; /* make exclusive-or pattern from polynomial (0xedb88320UL) */ - poly = 0UL; - for (n = 0; n < sizeof(p)/sizeof(unsigned char); n++) - poly |= 1UL << (31 - p[n]); + poly = 0; + for (n = 0; n < (int)(sizeof(p)/sizeof(unsigned char)); n++) + poly |= (z_crc_t)1 << (31 - p[n]); /* generate a crc for every 8-bit value */ for (n = 0; n < 256; n++) { - c = (unsigned long)n; + c = (z_crc_t)n; for (k = 0; k < 8; k++) c = c & 1 ? poly ^ (c >> 1) : c >> 1; crc_table[0][n] = c; @@ -136,11 +120,11 @@ local void make_crc_table() and then the byte reversal of those as well as the first table */ for (n = 0; n < 256; n++) { c = crc_table[0][n]; - crc_table[4][n] = REV(c); + crc_table[4][n] = ZSWAP32(c); for (k = 1; k < 4; k++) { c = crc_table[0][c & 0xff] ^ (c >> 8); crc_table[k][n] = c; - crc_table[k + 4][n] = REV(c); + crc_table[k + 4][n] = ZSWAP32(c); } } #endif /* BYFOUR */ @@ -162,7 +146,7 @@ local void make_crc_table() if (out == NULL) return; fprintf(out, "/* crc32.h -- tables for rapid CRC calculation\n"); fprintf(out, " * Generated automatically by crc32.c\n */\n\n"); - fprintf(out, "local const unsigned long FAR "); + fprintf(out, "local const z_crc_t FAR "); fprintf(out, "crc_table[TBLS][256] =\n{\n {\n"); write_table(out, crc_table[0]); # ifdef BYFOUR @@ -182,12 +166,13 @@ local void make_crc_table() #ifdef MAKECRCH local void write_table(out, table) FILE *out; - const unsigned long FAR *table; + const z_crc_t FAR *table; { int n; for (n = 0; n < 256; n++) - fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : " ", table[n], + fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : " ", + (unsigned long)(table[n]), n == 255 ? "\n" : (n % 5 == 4 ? ",\n" : ", ")); } #endif /* MAKECRCH */ @@ -202,13 +187,13 @@ local void write_table(out, table) /* ========================================================================= * This function can be used by asm versions of crc32() */ -const unsigned long FAR * ZEXPORT get_crc_table() +const z_crc_t FAR * ZEXPORT get_crc_table() { #ifdef DYNAMIC_CRC_TABLE if (crc_table_empty) make_crc_table(); #endif /* DYNAMIC_CRC_TABLE */ - return (const unsigned long FAR *)crc_table; + return (const z_crc_t FAR *)crc_table; } /* ========================================================================= */ @@ -219,7 +204,7 @@ const unsigned long FAR * ZEXPORT get_crc_table() unsigned long ZEXPORT crc32(crc, buf, len) unsigned long crc; const unsigned char FAR *buf; - unsigned len; + uInt len; { if (buf == Z_NULL) return 0UL; @@ -230,7 +215,7 @@ unsigned long ZEXPORT crc32(crc, buf, len) #ifdef BYFOUR if (sizeof(void *) == sizeof(ptrdiff_t)) { - u4 endian; + z_crc_t endian; endian = 1; if (*((unsigned char *)(&endian))) @@ -264,17 +249,17 @@ local unsigned long crc32_little(crc, buf, len) const unsigned char FAR *buf; unsigned len; { - register u4 c; - register const u4 FAR *buf4; + register z_crc_t c; + register const z_crc_t FAR *buf4; - c = (u4)crc; + c = (z_crc_t)crc; c = ~c; while (len && ((ptrdiff_t)buf & 3)) { c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); len--; } - buf4 = (const u4 FAR *)(const void FAR *)buf; + buf4 = (const z_crc_t FAR *)(const void FAR *)buf; while (len >= 32) { DOLIT32; len -= 32; @@ -304,17 +289,17 @@ local unsigned long crc32_big(crc, buf, len) const unsigned char FAR *buf; unsigned len; { - register u4 c; - register const u4 FAR *buf4; + register z_crc_t c; + register const z_crc_t FAR *buf4; - c = REV((u4)crc); + c = ZSWAP32((z_crc_t)crc); c = ~c; while (len && ((ptrdiff_t)buf & 3)) { c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); len--; } - buf4 = (const u4 FAR *)(const void FAR *)buf; + buf4 = (const z_crc_t FAR *)(const void FAR *)buf; buf4--; while (len >= 32) { DOBIG32; @@ -331,7 +316,7 @@ local unsigned long crc32_big(crc, buf, len) c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); } while (--len); c = ~c; - return (unsigned long)(REV(c)); + return (unsigned long)(ZSWAP32(c)); } #endif /* BYFOUR */ @@ -367,22 +352,22 @@ local void gf2_matrix_square(square, mat) } /* ========================================================================= */ -uLong ZEXPORT crc32_combine(crc1, crc2, len2) +local uLong crc32_combine_(crc1, crc2, len2) uLong crc1; uLong crc2; - z_off_t len2; + z_off64_t len2; { int n; unsigned long row; unsigned long even[GF2_DIM]; /* even-power-of-two zeros operator */ unsigned long odd[GF2_DIM]; /* odd-power-of-two zeros operator */ - /* degenerate case */ - if (len2 == 0) + /* degenerate case (also disallow negative lengths) */ + if (len2 <= 0) return crc1; /* put operator for one zero bit in odd */ - odd[0] = 0xedb88320L; /* CRC-32 polynomial */ + odd[0] = 0xedb88320UL; /* CRC-32 polynomial */ row = 1; for (n = 1; n < GF2_DIM; n++) { odd[n] = row; @@ -421,3 +406,20 @@ uLong ZEXPORT crc32_combine(crc1, crc2, len2) crc1 ^= crc2; return crc1; } + +/* ========================================================================= */ +uLong ZEXPORT crc32_combine(crc1, crc2, len2) + uLong crc1; + uLong crc2; + z_off_t len2; +{ + return crc32_combine_(crc1, crc2, len2); +} + +uLong ZEXPORT crc32_combine64(crc1, crc2, len2) + uLong crc1; + uLong crc2; + z_off64_t len2; +{ + return crc32_combine_(crc1, crc2, len2); +} diff --git a/neo/libs/zlib/crc32.h b/neo/libs/zlib/crc32.h index 8053b611..9e0c7781 100644 --- a/neo/libs/zlib/crc32.h +++ b/neo/libs/zlib/crc32.h @@ -2,7 +2,7 @@ * Generated automatically by crc32.c */ -local const unsigned long FAR crc_table[TBLS][256] = +local const z_crc_t FAR crc_table[TBLS][256] = { { 0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL, diff --git a/neo/libs/zlib/deflate.c b/neo/libs/zlib/deflate.c index 29ce1f64..9e4c2cbc 100644 --- a/neo/libs/zlib/deflate.c +++ b/neo/libs/zlib/deflate.c @@ -1,5 +1,5 @@ /* deflate.c -- compress data using the deflation algorithm - * Copyright (C) 1995-2005 Jean-loup Gailly. + * Copyright (C) 1995-2012 Jean-loup Gailly and Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -37,7 +37,7 @@ * REFERENCES * * Deutsch, L.P.,"DEFLATE Compressed Data Format Specification". - * Available in http://www.ietf.org/rfc/rfc1951.txt + * Available in http://tools.ietf.org/html/rfc1951 * * A description of the Rabin and Karp algorithm is given in the book * "Algorithms" by R. Sedgewick, Addison-Wesley, p252. @@ -52,7 +52,7 @@ #include "deflate.h" const char deflate_copyright[] = - " deflate 1.2.3 Copyright 1995-2005 Jean-loup Gailly "; + " deflate 1.2.7 Copyright 1995-2012 Jean-loup Gailly and Mark Adler "; /* If you use the zlib library in a product, an acknowledgment is welcome in the documentation of your product. If for some reason you cannot @@ -79,19 +79,18 @@ local block_state deflate_fast OF((deflate_state *s, int flush)); #ifndef FASTEST local block_state deflate_slow OF((deflate_state *s, int flush)); #endif +local block_state deflate_rle OF((deflate_state *s, int flush)); +local block_state deflate_huff OF((deflate_state *s, int flush)); local void lm_init OF((deflate_state *s)); local void putShortMSB OF((deflate_state *s, uInt b)); local void flush_pending OF((z_streamp strm)); local int read_buf OF((z_streamp strm, Bytef *buf, unsigned size)); -#ifndef FASTEST #ifdef ASMV void match_init OF((void)); /* asm code initialization */ uInt longest_match OF((deflate_state *s, IPos cur_match)); #else local uInt longest_match OF((deflate_state *s, IPos cur_match)); #endif -#endif -local uInt longest_match_fast OF((deflate_state *s, IPos cur_match)); #ifdef DEBUG local void check_match OF((deflate_state *s, IPos start, IPos match, @@ -110,11 +109,6 @@ local void check_match OF((deflate_state *s, IPos start, IPos match, #endif /* Matches of length 3 are discarded if their distance exceeds TOO_FAR */ -#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) -/* Minimum amount of lookahead, except at the end of the input file. - * See deflate.c for comments about the MIN_MATCH+1. - */ - /* Values for max_lazy_match, good_match and max_chain_length, depending on * the desired pack level (0..9). The values given below have been tuned to * exclude worst case performance for pathological files. Better values may be @@ -161,6 +155,9 @@ local const config configuration_table[10] = { struct static_tree_desc_s {int dummy;}; /* for buggy compilers */ #endif +/* rank Z_BLOCK between Z_NO_FLUSH and Z_PARTIAL_FLUSH */ +#define RANK(f) (((f) << 1) - ((f) > 4 ? 9 : 0)) + /* =========================================================================== * Update a hash value with the given input byte * IN assertion: all calls to to UPDATE_HASH are made with consecutive @@ -241,10 +238,19 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, strm->msg = Z_NULL; if (strm->zalloc == (alloc_func)0) { +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else strm->zalloc = zcalloc; strm->opaque = (voidpf)0; +#endif } - if (strm->zfree == (free_func)0) strm->zfree = zcfree; + if (strm->zfree == (free_func)0) +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zfree = zcfree; +#endif #ifdef FASTEST if (level != 0) level = 1; @@ -288,6 +294,8 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos)); s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos)); + s->high_water = 0; /* nothing written to s->window yet */ + s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2); @@ -318,43 +326,70 @@ int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength) uInt dictLength; { deflate_state *s; - uInt length = dictLength; - uInt n; - IPos hash_head = 0; + uInt str, n; + int wrap; + unsigned avail; + unsigned char *next; - if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL || - strm->state->wrap == 2 || - (strm->state->wrap == 1 && strm->state->status != INIT_STATE)) + if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL) + return Z_STREAM_ERROR; + s = strm->state; + wrap = s->wrap; + if (wrap == 2 || (wrap == 1 && s->status != INIT_STATE) || s->lookahead) return Z_STREAM_ERROR; - s = strm->state; - if (s->wrap) + /* when using zlib wrappers, compute Adler-32 for provided dictionary */ + if (wrap == 1) strm->adler = adler32(strm->adler, dictionary, dictLength); + s->wrap = 0; /* avoid computing Adler-32 in read_buf */ - if (length < MIN_MATCH) return Z_OK; - if (length > MAX_DIST(s)) { - length = MAX_DIST(s); - dictionary += dictLength - length; /* use the tail of the dictionary */ + /* if dictionary would fill window, just replace the history */ + if (dictLength >= s->w_size) { + if (wrap == 0) { /* already empty otherwise */ + CLEAR_HASH(s); + s->strstart = 0; + s->block_start = 0L; + s->insert = 0; + } + dictionary += dictLength - s->w_size; /* use the tail */ + dictLength = s->w_size; } - zmemcpy(s->window, dictionary, length); - s->strstart = length; - s->block_start = (long)length; - /* Insert all strings in the hash table (except for the last two bytes). - * s->lookahead stays null, so s->ins_h will be recomputed at the next - * call of fill_window. - */ - s->ins_h = s->window[0]; - UPDATE_HASH(s, s->ins_h, s->window[1]); - for (n = 0; n <= length - MIN_MATCH; n++) { - INSERT_STRING(s, n, hash_head); + /* insert dictionary into window and hash */ + avail = strm->avail_in; + next = strm->next_in; + strm->avail_in = dictLength; + strm->next_in = (Bytef *)dictionary; + fill_window(s); + while (s->lookahead >= MIN_MATCH) { + str = s->strstart; + n = s->lookahead - (MIN_MATCH-1); + do { + UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); +#ifndef FASTEST + s->prev[str & s->w_mask] = s->head[s->ins_h]; +#endif + s->head[s->ins_h] = (Pos)str; + str++; + } while (--n); + s->strstart = str; + s->lookahead = MIN_MATCH-1; + fill_window(s); } - if (hash_head) hash_head = 0; /* to make compiler happy */ + s->strstart += s->lookahead; + s->block_start = (long)s->strstart; + s->insert = s->lookahead; + s->lookahead = 0; + s->match_length = s->prev_length = MIN_MATCH-1; + s->match_available = 0; + strm->next_in = next; + strm->avail_in = avail; + s->wrap = wrap; return Z_OK; } /* ========================================================================= */ -int ZEXPORT deflateReset (strm) +int ZEXPORT deflateResetKeep (strm) z_streamp strm; { deflate_state *s; @@ -384,11 +419,22 @@ int ZEXPORT deflateReset (strm) s->last_flush = Z_NO_FLUSH; _tr_init(s); - lm_init(s); return Z_OK; } +/* ========================================================================= */ +int ZEXPORT deflateReset (strm) + z_streamp strm; +{ + int ret; + + ret = deflateResetKeep(strm); + if (ret == Z_OK) + lm_init(strm->state); + return ret; +} + /* ========================================================================= */ int ZEXPORT deflateSetHeader (strm, head) z_streamp strm; @@ -400,15 +446,43 @@ int ZEXPORT deflateSetHeader (strm, head) return Z_OK; } +/* ========================================================================= */ +int ZEXPORT deflatePending (strm, pending, bits) + unsigned *pending; + int *bits; + z_streamp strm; +{ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + if (pending != Z_NULL) + *pending = strm->state->pending; + if (bits != Z_NULL) + *bits = strm->state->bi_valid; + return Z_OK; +} + /* ========================================================================= */ int ZEXPORT deflatePrime (strm, bits, value) z_streamp strm; int bits; int value; { + deflate_state *s; + int put; + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - strm->state->bi_valid = bits; - strm->state->bi_buf = (ush)(value & ((1 << bits) - 1)); + s = strm->state; + if ((Bytef *)(s->d_buf) < s->pending_out + ((Buf_size + 7) >> 3)) + return Z_BUF_ERROR; + do { + put = Buf_size - s->bi_valid; + if (put > bits) + put = bits; + s->bi_buf |= (ush)((value & ((1 << put) - 1)) << s->bi_valid); + s->bi_valid += put; + _tr_flush_bits(s); + value >>= put; + bits -= put; + } while (bits); return Z_OK; } @@ -435,9 +509,10 @@ int ZEXPORT deflateParams(strm, level, strategy) } func = configuration_table[s->level].func; - if (func != configuration_table[level].func && strm->total_in != 0) { + if ((strategy != s->strategy || func != configuration_table[level].func) && + strm->total_in != 0) { /* Flush the last buffer: */ - err = deflate(strm, Z_PARTIAL_FLUSH); + err = deflate(strm, Z_BLOCK); } if (s->level != level) { s->level = level; @@ -481,33 +556,66 @@ int ZEXPORT deflateTune(strm, good_length, max_lazy, nice_length, max_chain) * resulting from using fixed blocks instead of stored blocks, which deflate * can emit on compressed data for some combinations of the parameters. * - * This function could be more sophisticated to provide closer upper bounds - * for every combination of windowBits and memLevel, as well as wrap. - * But even the conservative upper bound of about 14% expansion does not - * seem onerous for output buffer allocation. + * This function could be more sophisticated to provide closer upper bounds for + * every combination of windowBits and memLevel. But even the conservative + * upper bound of about 14% expansion does not seem onerous for output buffer + * allocation. */ uLong ZEXPORT deflateBound(strm, sourceLen) z_streamp strm; uLong sourceLen; { deflate_state *s; - uLong destLen; + uLong complen, wraplen; + Bytef *str; - /* conservative upper bound */ - destLen = sourceLen + - ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 11; + /* conservative upper bound for compressed data */ + complen = sourceLen + + ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 5; - /* if can't get parameters, return conservative bound */ + /* if can't get parameters, return conservative bound plus zlib wrapper */ if (strm == Z_NULL || strm->state == Z_NULL) - return destLen; + return complen + 6; + + /* compute wrapper length */ + s = strm->state; + switch (s->wrap) { + case 0: /* raw deflate */ + wraplen = 0; + break; + case 1: /* zlib wrapper */ + wraplen = 6 + (s->strstart ? 4 : 0); + break; + case 2: /* gzip wrapper */ + wraplen = 18; + if (s->gzhead != Z_NULL) { /* user-supplied gzip header */ + if (s->gzhead->extra != Z_NULL) + wraplen += 2 + s->gzhead->extra_len; + str = s->gzhead->name; + if (str != Z_NULL) + do { + wraplen++; + } while (*str++); + str = s->gzhead->comment; + if (str != Z_NULL) + do { + wraplen++; + } while (*str++); + if (s->gzhead->hcrc) + wraplen += 2; + } + break; + default: /* for compiler happiness */ + wraplen = 6; + } /* if not default parameters, return conservative bound */ - s = strm->state; if (s->w_bits != 15 || s->hash_bits != 8 + 7) - return destLen; + return complen + wraplen; /* default settings: return tight bound for that case */ - return compressBound(sourceLen); + return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + + (sourceLen >> 25) + 13 - 6 + wraplen; } /* ========================================================================= @@ -532,19 +640,22 @@ local void putShortMSB (s, b) local void flush_pending(strm) z_streamp strm; { - unsigned len = strm->state->pending; + unsigned len; + deflate_state *s = strm->state; + _tr_flush_bits(s); + len = s->pending; if (len > strm->avail_out) len = strm->avail_out; if (len == 0) return; - zmemcpy(strm->next_out, strm->state->pending_out, len); + zmemcpy(strm->next_out, s->pending_out, len); strm->next_out += len; - strm->state->pending_out += len; + s->pending_out += len; strm->total_out += len; strm->avail_out -= len; - strm->state->pending -= len; - if (strm->state->pending == 0) { - strm->state->pending_out = strm->state->pending_buf; + s->pending -= len; + if (s->pending == 0) { + s->pending_out = s->pending_buf; } } @@ -557,7 +668,7 @@ int ZEXPORT deflate (strm, flush) deflate_state *s; if (strm == Z_NULL || strm->state == Z_NULL || - flush > Z_FINISH || flush < 0) { + flush > Z_BLOCK || flush < 0) { return Z_STREAM_ERROR; } s = strm->state; @@ -581,7 +692,7 @@ int ZEXPORT deflate (strm, flush) put_byte(s, 31); put_byte(s, 139); put_byte(s, 8); - if (s->gzhead == NULL) { + if (s->gzhead == Z_NULL) { put_byte(s, 0); put_byte(s, 0); put_byte(s, 0); @@ -608,7 +719,7 @@ int ZEXPORT deflate (strm, flush) (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? 4 : 0)); put_byte(s, s->gzhead->os & 0xff); - if (s->gzhead->extra != NULL) { + if (s->gzhead->extra != Z_NULL) { put_byte(s, s->gzhead->extra_len & 0xff); put_byte(s, (s->gzhead->extra_len >> 8) & 0xff); } @@ -650,7 +761,7 @@ int ZEXPORT deflate (strm, flush) } #ifdef GZIP if (s->status == EXTRA_STATE) { - if (s->gzhead->extra != NULL) { + if (s->gzhead->extra != Z_NULL) { uInt beg = s->pending; /* start of bytes to update crc */ while (s->gzindex < (s->gzhead->extra_len & 0xffff)) { @@ -678,7 +789,7 @@ int ZEXPORT deflate (strm, flush) s->status = NAME_STATE; } if (s->status == NAME_STATE) { - if (s->gzhead->name != NULL) { + if (s->gzhead->name != Z_NULL) { uInt beg = s->pending; /* start of bytes to update crc */ int val; @@ -709,7 +820,7 @@ int ZEXPORT deflate (strm, flush) s->status = COMMENT_STATE; } if (s->status == COMMENT_STATE) { - if (s->gzhead->comment != NULL) { + if (s->gzhead->comment != Z_NULL) { uInt beg = s->pending; /* start of bytes to update crc */ int val; @@ -771,7 +882,7 @@ int ZEXPORT deflate (strm, flush) * flushes. For repeated and useless calls with Z_FINISH, we keep * returning Z_STREAM_END instead of Z_BUF_ERROR. */ - } else if (strm->avail_in == 0 && flush <= old_flush && + } else if (strm->avail_in == 0 && RANK(flush) <= RANK(old_flush) && flush != Z_FINISH) { ERR_RETURN(strm, Z_BUF_ERROR); } @@ -787,7 +898,9 @@ int ZEXPORT deflate (strm, flush) (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) { block_state bstate; - bstate = (*(configuration_table[s->level].func))(s, flush); + bstate = s->strategy == Z_HUFFMAN_ONLY ? deflate_huff(s, flush) : + (s->strategy == Z_RLE ? deflate_rle(s, flush) : + (*(configuration_table[s->level].func))(s, flush)); if (bstate == finish_started || bstate == finish_done) { s->status = FINISH_STATE; @@ -808,13 +921,18 @@ int ZEXPORT deflate (strm, flush) if (bstate == block_done) { if (flush == Z_PARTIAL_FLUSH) { _tr_align(s); - } else { /* FULL_FLUSH or SYNC_FLUSH */ + } else if (flush != Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */ _tr_stored_block(s, (char*)0, 0L, 0); /* For a full flush, this empty block will be recognized * as a special marker by inflate_sync(). */ if (flush == Z_FULL_FLUSH) { CLEAR_HASH(s); /* forget history */ + if (s->lookahead == 0) { + s->strstart = 0; + s->block_start = 0L; + s->insert = 0; + } } } flush_pending(strm); @@ -909,12 +1027,12 @@ int ZEXPORT deflateCopy (dest, source) ss = source->state; - zmemcpy(dest, source, sizeof(z_stream)); + zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream)); ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state)); if (ds == Z_NULL) return Z_MEM_ERROR; dest->state = (struct internal_state FAR *) ds; - zmemcpy(ds, ss, sizeof(deflate_state)); + zmemcpy((voidpf)ds, (voidpf)ss, sizeof(deflate_state)); ds->strm = dest; ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte)); @@ -930,8 +1048,8 @@ int ZEXPORT deflateCopy (dest, source) } /* following zmemcpy do not work for 16-bit MSDOS */ zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte)); - zmemcpy(ds->prev, ss->prev, ds->w_size * sizeof(Pos)); - zmemcpy(ds->head, ss->head, ds->hash_size * sizeof(Pos)); + zmemcpy((voidpf)ds->prev, (voidpf)ss->prev, ds->w_size * sizeof(Pos)); + zmemcpy((voidpf)ds->head, (voidpf)ss->head, ds->hash_size * sizeof(Pos)); zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size); ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf); @@ -965,15 +1083,15 @@ local int read_buf(strm, buf, size) strm->avail_in -= len; + zmemcpy(buf, strm->next_in, len); if (strm->state->wrap == 1) { - strm->adler = adler32(strm->adler, strm->next_in, len); + strm->adler = adler32(strm->adler, buf, len); } #ifdef GZIP else if (strm->state->wrap == 2) { - strm->adler = crc32(strm->adler, strm->next_in, len); + strm->adler = crc32(strm->adler, buf, len); } #endif - zmemcpy(buf, strm->next_in, len); strm->next_in += len; strm->total_in += len; @@ -1000,6 +1118,7 @@ local void lm_init (s) s->strstart = 0; s->block_start = 0L; s->lookahead = 0; + s->insert = 0; s->match_length = s->prev_length = MIN_MATCH-1; s->match_available = 0; s->ins_h = 0; @@ -1167,12 +1286,13 @@ local uInt longest_match(s, cur_match) return s->lookahead; } #endif /* ASMV */ -#endif /* FASTEST */ + +#else /* FASTEST */ /* --------------------------------------------------------------------------- - * Optimized version for level == 1 or strategy == Z_RLE only + * Optimized version for FASTEST only */ -local uInt longest_match_fast(s, cur_match) +local uInt longest_match(s, cur_match) deflate_state *s; IPos cur_match; /* current match */ { @@ -1225,6 +1345,8 @@ local uInt longest_match_fast(s, cur_match) return (uInt)len <= s->lookahead ? (uInt)len : s->lookahead; } +#endif /* FASTEST */ + #ifdef DEBUG /* =========================================================================== * Check that the match at match_start is indeed a match. @@ -1271,6 +1393,8 @@ local void fill_window(s) unsigned more; /* Amount of free space at the end of the window. */ uInt wsize = s->w_size; + Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead"); + do { more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart); @@ -1303,7 +1427,6 @@ local void fill_window(s) later. (Using level 0 permanently is not an optimal usage of zlib, so we don't care about this pathological case.) */ - /* %%% avoid this when Z_RLE */ n = s->hash_size; p = &s->head[n]; do { @@ -1324,7 +1447,7 @@ local void fill_window(s) #endif more += wsize; } - if (s->strm->avail_in == 0) return; + if (s->strm->avail_in == 0) break; /* If there was no sliding: * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && @@ -1343,39 +1466,88 @@ local void fill_window(s) s->lookahead += n; /* Initialize the hash value now that we have some input: */ - if (s->lookahead >= MIN_MATCH) { - s->ins_h = s->window[s->strstart]; - UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); + if (s->lookahead + s->insert >= MIN_MATCH) { + uInt str = s->strstart - s->insert; + s->ins_h = s->window[str]; + UPDATE_HASH(s, s->ins_h, s->window[str + 1]); #if MIN_MATCH != 3 Call UPDATE_HASH() MIN_MATCH-3 more times #endif + while (s->insert) { + UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); +#ifndef FASTEST + s->prev[str & s->w_mask] = s->head[s->ins_h]; +#endif + s->head[s->ins_h] = (Pos)str; + str++; + s->insert--; + if (s->lookahead + s->insert < MIN_MATCH) + break; + } } /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, * but this is not important since only literal bytes will be emitted. */ } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0); + + /* If the WIN_INIT bytes after the end of the current data have never been + * written, then zero those bytes in order to avoid memory check reports of + * the use of uninitialized (or uninitialised as Julian writes) bytes by + * the longest match routines. Update the high water mark for the next + * time through here. WIN_INIT is set to MAX_MATCH since the longest match + * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead. + */ + if (s->high_water < s->window_size) { + ulg curr = s->strstart + (ulg)(s->lookahead); + ulg init; + + if (s->high_water < curr) { + /* Previous high water mark below current data -- zero WIN_INIT + * bytes or up to end of window, whichever is less. + */ + init = s->window_size - curr; + if (init > WIN_INIT) + init = WIN_INIT; + zmemzero(s->window + curr, (unsigned)init); + s->high_water = curr + init; + } + else if (s->high_water < (ulg)curr + WIN_INIT) { + /* High water mark at or above current data, but below current data + * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up + * to end of window, whichever is less. + */ + init = (ulg)curr + WIN_INIT - s->high_water; + if (init > s->window_size - s->high_water) + init = s->window_size - s->high_water; + zmemzero(s->window + s->high_water, (unsigned)init); + s->high_water += init; + } + } + + Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD, + "not enough room for search"); } /* =========================================================================== * Flush the current block, with given end-of-file flag. * IN assertion: strstart is set to the end of the current match. */ -#define FLUSH_BLOCK_ONLY(s, eof) { \ +#define FLUSH_BLOCK_ONLY(s, last) { \ _tr_flush_block(s, (s->block_start >= 0L ? \ (charf *)&s->window[(unsigned)s->block_start] : \ (charf *)Z_NULL), \ (ulg)((long)s->strstart - s->block_start), \ - (eof)); \ + (last)); \ s->block_start = s->strstart; \ flush_pending(s->strm); \ Tracev((stderr,"[FLUSH]")); \ } /* Same but force premature exit if necessary. */ -#define FLUSH_BLOCK(s, eof) { \ - FLUSH_BLOCK_ONLY(s, eof); \ - if (s->strm->avail_out == 0) return (eof) ? finish_started : need_more; \ +#define FLUSH_BLOCK(s, last) { \ + FLUSH_BLOCK_ONLY(s, last); \ + if (s->strm->avail_out == 0) return (last) ? finish_started : need_more; \ } /* =========================================================================== @@ -1434,8 +1606,14 @@ local block_state deflate_stored(s, flush) FLUSH_BLOCK(s, 0); } } - FLUSH_BLOCK(s, flush == Z_FINISH); - return flush == Z_FINISH ? finish_done : block_done; + s->insert = 0; + if (flush == Z_FINISH) { + FLUSH_BLOCK(s, 1); + return finish_done; + } + if ((long)s->strstart > s->block_start) + FLUSH_BLOCK(s, 0); + return block_done; } /* =========================================================================== @@ -1449,7 +1627,7 @@ local block_state deflate_fast(s, flush) deflate_state *s; int flush; { - IPos hash_head = NIL; /* head of the hash chain */ + IPos hash_head; /* head of the hash chain */ int bflush; /* set if current block must be flushed */ for (;;) { @@ -1469,6 +1647,7 @@ local block_state deflate_fast(s, flush) /* Insert the string window[strstart .. strstart+2] in the * dictionary, and set hash_head to the head of the hash chain: */ + hash_head = NIL; if (s->lookahead >= MIN_MATCH) { INSERT_STRING(s, s->strstart, hash_head); } @@ -1481,19 +1660,8 @@ local block_state deflate_fast(s, flush) * of window index 0 (in particular we have to avoid a match * of the string with itself at the start of the input file). */ -#ifdef FASTEST - if ((s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) || - (s->strategy == Z_RLE && s->strstart - hash_head == 1)) { - s->match_length = longest_match_fast (s, hash_head); - } -#else - if (s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) { - s->match_length = longest_match (s, hash_head); - } else if (s->strategy == Z_RLE && s->strstart - hash_head == 1) { - s->match_length = longest_match_fast (s, hash_head); - } -#endif - /* longest_match() or longest_match_fast() sets match_start */ + s->match_length = longest_match (s, hash_head); + /* longest_match() sets match_start */ } if (s->match_length >= MIN_MATCH) { check_match(s, s->strstart, s->match_start, s->match_length); @@ -1541,8 +1709,14 @@ local block_state deflate_fast(s, flush) } if (bflush) FLUSH_BLOCK(s, 0); } - FLUSH_BLOCK(s, flush == Z_FINISH); - return flush == Z_FINISH ? finish_done : block_done; + s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1; + if (flush == Z_FINISH) { + FLUSH_BLOCK(s, 1); + return finish_done; + } + if (s->last_lit) + FLUSH_BLOCK(s, 0); + return block_done; } #ifndef FASTEST @@ -1555,7 +1729,7 @@ local block_state deflate_slow(s, flush) deflate_state *s; int flush; { - IPos hash_head = NIL; /* head of hash chain */ + IPos hash_head; /* head of hash chain */ int bflush; /* set if current block must be flushed */ /* Process the input block. */ @@ -1576,6 +1750,7 @@ local block_state deflate_slow(s, flush) /* Insert the string window[strstart .. strstart+2] in the * dictionary, and set hash_head to the head of the hash chain: */ + hash_head = NIL; if (s->lookahead >= MIN_MATCH) { INSERT_STRING(s, s->strstart, hash_head); } @@ -1591,12 +1766,8 @@ local block_state deflate_slow(s, flush) * of window index 0 (in particular we have to avoid a match * of the string with itself at the start of the input file). */ - if (s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) { - s->match_length = longest_match (s, hash_head); - } else if (s->strategy == Z_RLE && s->strstart - hash_head == 1) { - s->match_length = longest_match_fast (s, hash_head); - } - /* longest_match() or longest_match_fast() sets match_start */ + s->match_length = longest_match (s, hash_head); + /* longest_match() sets match_start */ if (s->match_length <= 5 && (s->strategy == Z_FILTERED #if TOO_FAR <= 32767 @@ -1669,12 +1840,17 @@ local block_state deflate_slow(s, flush) _tr_tally_lit(s, s->window[s->strstart-1], bflush); s->match_available = 0; } - FLUSH_BLOCK(s, flush == Z_FINISH); - return flush == Z_FINISH ? finish_done : block_done; + s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1; + if (flush == Z_FINISH) { + FLUSH_BLOCK(s, 1); + return finish_done; + } + if (s->last_lit) + FLUSH_BLOCK(s, 0); + return block_done; } #endif /* FASTEST */ -#if 0 /* =========================================================================== * For Z_RLE, simply look for runs of bytes, generate matches only of distance * one. Do not maintain a hash table. (It will be regenerated if this run of @@ -1684,43 +1860,52 @@ local block_state deflate_rle(s, flush) deflate_state *s; int flush; { - int bflush; /* set if current block must be flushed */ - uInt run; /* length of run */ - uInt max; /* maximum length of run */ - uInt prev; /* byte at distance one to match */ - Bytef *scan; /* scan for end of run */ + int bflush; /* set if current block must be flushed */ + uInt prev; /* byte at distance one to match */ + Bytef *scan, *strend; /* scan goes up to strend for length of run */ for (;;) { /* Make sure that we always have enough lookahead, except * at the end of the input file. We need MAX_MATCH bytes - * for the longest encodable run. + * for the longest run, plus one for the unrolled loop. */ - if (s->lookahead < MAX_MATCH) { + if (s->lookahead <= MAX_MATCH) { fill_window(s); - if (s->lookahead < MAX_MATCH && flush == Z_NO_FLUSH) { + if (s->lookahead <= MAX_MATCH && flush == Z_NO_FLUSH) { return need_more; } if (s->lookahead == 0) break; /* flush the current block */ } /* See how many times the previous byte repeats */ - run = 0; - if (s->strstart > 0) { /* if there is a previous byte, that is */ - max = s->lookahead < MAX_MATCH ? s->lookahead : MAX_MATCH; + s->match_length = 0; + if (s->lookahead >= MIN_MATCH && s->strstart > 0) { scan = s->window + s->strstart - 1; - prev = *scan++; - do { - if (*scan++ != prev) - break; - } while (++run < max); + prev = *scan; + if (prev == *++scan && prev == *++scan && prev == *++scan) { + strend = s->window + s->strstart + MAX_MATCH; + do { + } while (prev == *++scan && prev == *++scan && + prev == *++scan && prev == *++scan && + prev == *++scan && prev == *++scan && + prev == *++scan && prev == *++scan && + scan < strend); + s->match_length = MAX_MATCH - (int)(strend - scan); + if (s->match_length > s->lookahead) + s->match_length = s->lookahead; + } + Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan"); } /* Emit match if have run of MIN_MATCH or longer, else emit literal */ - if (run >= MIN_MATCH) { - check_match(s, s->strstart, s->strstart - 1, run); - _tr_tally_dist(s, 1, run - MIN_MATCH, bflush); - s->lookahead -= run; - s->strstart += run; + if (s->match_length >= MIN_MATCH) { + check_match(s, s->strstart, s->strstart - 1, s->match_length); + + _tr_tally_dist(s, 1, s->match_length - MIN_MATCH, bflush); + + s->lookahead -= s->match_length; + s->strstart += s->match_length; + s->match_length = 0; } else { /* No match, output a literal byte */ Tracevv((stderr,"%c", s->window[s->strstart])); @@ -1730,7 +1915,51 @@ local block_state deflate_rle(s, flush) } if (bflush) FLUSH_BLOCK(s, 0); } - FLUSH_BLOCK(s, flush == Z_FINISH); - return flush == Z_FINISH ? finish_done : block_done; + s->insert = 0; + if (flush == Z_FINISH) { + FLUSH_BLOCK(s, 1); + return finish_done; + } + if (s->last_lit) + FLUSH_BLOCK(s, 0); + return block_done; +} + +/* =========================================================================== + * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table. + * (It will be regenerated if this run of deflate switches away from Huffman.) + */ +local block_state deflate_huff(s, flush) + deflate_state *s; + int flush; +{ + int bflush; /* set if current block must be flushed */ + + for (;;) { + /* Make sure that we have a literal to write. */ + if (s->lookahead == 0) { + fill_window(s); + if (s->lookahead == 0) { + if (flush == Z_NO_FLUSH) + return need_more; + break; /* flush the current block */ + } + } + + /* Output a literal byte */ + s->match_length = 0; + Tracevv((stderr,"%c", s->window[s->strstart])); + _tr_tally_lit (s, s->window[s->strstart], bflush); + s->lookahead--; + s->strstart++; + if (bflush) FLUSH_BLOCK(s, 0); + } + s->insert = 0; + if (flush == Z_FINISH) { + FLUSH_BLOCK(s, 1); + return finish_done; + } + if (s->last_lit) + FLUSH_BLOCK(s, 0); + return block_done; } -#endif diff --git a/neo/libs/zlib/deflate.h b/neo/libs/zlib/deflate.h index 05a5ab3a..fbac44d9 100644 --- a/neo/libs/zlib/deflate.h +++ b/neo/libs/zlib/deflate.h @@ -1,5 +1,5 @@ /* deflate.h -- internal compression state - * Copyright (C) 1995-2004 Jean-loup Gailly + * Copyright (C) 1995-2012 Jean-loup Gailly * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -48,6 +48,9 @@ #define MAX_BITS 15 /* All codes must not exceed MAX_BITS bits */ +#define Buf_size 16 +/* size of bit buffer in bi_buf */ + #define INIT_STATE 42 #define EXTRA_STATE 69 #define NAME_STATE 73 @@ -188,7 +191,7 @@ typedef struct internal_state { int nice_match; /* Stop searching when current match exceeds this */ /* used by trees.c: */ - /* Didn't use ct_data typedef below to supress compiler warning */ + /* Didn't use ct_data typedef below to suppress compiler warning */ struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */ struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */ struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */ @@ -244,7 +247,7 @@ typedef struct internal_state { ulg opt_len; /* bit length of current block with optimal trees */ ulg static_len; /* bit length of current block with static trees */ uInt matches; /* number of string matches in current block */ - int last_eob_len; /* bit length of EOB code for last block */ + uInt insert; /* bytes at end of window left to insert */ #ifdef DEBUG ulg compressed_len; /* total bit length of compressed file mod 2^32 */ @@ -260,6 +263,13 @@ typedef struct internal_state { * are always zero. */ + ulg high_water; + /* High water mark offset in window for initialized bytes -- bytes above + * this are set to zero in order to avoid memory check warnings when + * longest match routines access bytes past the input. This is then + * updated to the new high water mark. + */ + } FAR deflate_state; /* Output a byte on the stream. @@ -278,14 +288,19 @@ typedef struct internal_state { * distances are limited to MAX_DIST instead of WSIZE. */ +#define WIN_INIT MAX_MATCH +/* Number of bytes after end of data in window to initialize in order to avoid + memory checker errors from longest match routines */ + /* in trees.c */ -void _tr_init OF((deflate_state *s)); -int _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc)); -void _tr_flush_block OF((deflate_state *s, charf *buf, ulg stored_len, - int eof)); -void _tr_align OF((deflate_state *s)); -void _tr_stored_block OF((deflate_state *s, charf *buf, ulg stored_len, - int eof)); +void ZLIB_INTERNAL _tr_init OF((deflate_state *s)); +int ZLIB_INTERNAL _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc)); +void ZLIB_INTERNAL _tr_flush_block OF((deflate_state *s, charf *buf, + ulg stored_len, int last)); +void ZLIB_INTERNAL _tr_flush_bits OF((deflate_state *s)); +void ZLIB_INTERNAL _tr_align OF((deflate_state *s)); +void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf, + ulg stored_len, int last)); #define d_code(dist) \ ((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)]) @@ -298,11 +313,11 @@ void _tr_stored_block OF((deflate_state *s, charf *buf, ulg stored_len, /* Inline versions of _tr_tally for speed: */ #if defined(GEN_TREES_H) || !defined(STDC) - extern uch _length_code[]; - extern uch _dist_code[]; + extern uch ZLIB_INTERNAL _length_code[]; + extern uch ZLIB_INTERNAL _dist_code[]; #else - extern const uch _length_code[]; - extern const uch _dist_code[]; + extern const uch ZLIB_INTERNAL _length_code[]; + extern const uch ZLIB_INTERNAL _dist_code[]; #endif # define _tr_tally_lit(s, c, flush) \ diff --git a/neo/libs/zlib/gzclose.c b/neo/libs/zlib/gzclose.c new file mode 100644 index 00000000..caeb99a3 --- /dev/null +++ b/neo/libs/zlib/gzclose.c @@ -0,0 +1,25 @@ +/* gzclose.c -- zlib gzclose() function + * Copyright (C) 2004, 2010 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "gzguts.h" + +/* gzclose() is in a separate file so that it is linked in only if it is used. + That way the other gzclose functions can be used instead to avoid linking in + unneeded compression or decompression routines. */ +int ZEXPORT gzclose(file) + gzFile file; +{ +#ifndef NO_GZCOMPRESS + gz_statep state; + + if (file == NULL) + return Z_STREAM_ERROR; + state = (gz_statep)file; + + return state->mode == GZ_READ ? gzclose_r(file) : gzclose_w(file); +#else + return gzclose_r(file); +#endif +} diff --git a/neo/libs/zlib/gzguts.h b/neo/libs/zlib/gzguts.h new file mode 100644 index 00000000..ee3f281a --- /dev/null +++ b/neo/libs/zlib/gzguts.h @@ -0,0 +1,193 @@ +/* gzguts.h -- zlib internal header definitions for gz* operations + * Copyright (C) 2004, 2005, 2010, 2011, 2012 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#ifdef _LARGEFILE64_SOURCE +# ifndef _LARGEFILE_SOURCE +# define _LARGEFILE_SOURCE 1 +# endif +# ifdef _FILE_OFFSET_BITS +# undef _FILE_OFFSET_BITS +# endif +#endif + +#ifdef HAVE_HIDDEN +# define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) +#else +# define ZLIB_INTERNAL +#endif + +#include +#include "zlib.h" +#ifdef STDC +# include +# include +# include +#endif +#include + +#ifdef _WIN32 +# include +#endif + +#if defined(__TURBOC__) || defined(_MSC_VER) || defined(_WIN32) +# include +#endif + +#ifdef NO_DEFLATE /* for compatibility with old definition */ +# define NO_GZCOMPRESS +#endif + +#if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif + +#if defined(__CYGWIN__) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif + +#if defined(MSDOS) && defined(__BORLANDC__) && (BORLANDC > 0x410) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif + +#ifndef HAVE_VSNPRINTF +# ifdef MSDOS +/* vsnprintf may exist on some MS-DOS compilers (DJGPP?), + but for now we just assume it doesn't. */ +# define NO_vsnprintf +# endif +# ifdef __TURBOC__ +# define NO_vsnprintf +# endif +# ifdef WIN32 +/* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */ +# if !defined(vsnprintf) && !defined(NO_vsnprintf) +# if !defined(_MSC_VER) || ( defined(_MSC_VER) && _MSC_VER < 1500 ) +# define vsnprintf _vsnprintf +# endif +# endif +# endif +# ifdef __SASC +# define NO_vsnprintf +# endif +# ifdef VMS +# define NO_vsnprintf +# endif +# ifdef __OS400__ +# define NO_vsnprintf +# endif +# ifdef __MVS__ +# define NO_vsnprintf +# endif +#endif + +#ifndef local +# define local static +#endif +/* compile with -Dlocal if your debugger can't find static symbols */ + +/* gz* functions always use library allocation functions */ +#ifndef STDC + extern voidp malloc OF((uInt size)); + extern void free OF((voidpf ptr)); +#endif + +/* get errno and strerror definition */ +#if defined UNDER_CE +# include +# define zstrerror() gz_strwinerror((DWORD)GetLastError()) +#else +# ifndef NO_STRERROR +# include +# define zstrerror() strerror(errno) +# else +# define zstrerror() "stdio error (consult errno)" +# endif +#endif + +/* provide prototypes for these when building zlib without LFS */ +#if !defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0 + ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); + ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); + ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); + ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); +#endif + +/* default memLevel */ +#if MAX_MEM_LEVEL >= 8 +# define DEF_MEM_LEVEL 8 +#else +# define DEF_MEM_LEVEL MAX_MEM_LEVEL +#endif + +/* default i/o buffer size -- double this for output when reading */ +#define GZBUFSIZE 8192 + +/* gzip modes, also provide a little integrity check on the passed structure */ +#define GZ_NONE 0 +#define GZ_READ 7247 +#define GZ_WRITE 31153 +#define GZ_APPEND 1 /* mode set to GZ_WRITE after the file is opened */ + +/* values for gz_state how */ +#define LOOK 0 /* look for a gzip header */ +#define COPY 1 /* copy input directly */ +#define GZIP 2 /* decompress a gzip stream */ + +/* internal gzip file state data structure */ +typedef struct { + /* exposed contents for gzgetc() macro */ + struct gzFile_s x; /* "x" for exposed */ + /* x.have: number of bytes available at x.next */ + /* x.next: next output data to deliver or write */ + /* x.pos: current position in uncompressed data */ + /* used for both reading and writing */ + int mode; /* see gzip modes above */ + int fd; /* file descriptor */ + char *path; /* path or fd for error messages */ + unsigned size; /* buffer size, zero if not allocated yet */ + unsigned want; /* requested buffer size, default is GZBUFSIZE */ + unsigned char *in; /* input buffer */ + unsigned char *out; /* output buffer (double-sized when reading) */ + int direct; /* 0 if processing gzip, 1 if transparent */ + /* just for reading */ + int how; /* 0: get header, 1: copy, 2: decompress */ + z_off64_t start; /* where the gzip data started, for rewinding */ + int eof; /* true if end of input file reached */ + int past; /* true if read requested past end */ + /* just for writing */ + int level; /* compression level */ + int strategy; /* compression strategy */ + /* seek request */ + z_off64_t skip; /* amount to skip (already rewound if backwards) */ + int seek; /* true if seek request pending */ + /* error information */ + int err; /* error code */ + char *msg; /* error message */ + /* zlib inflate or deflate stream */ + z_stream strm; /* stream structure in-place (not a pointer) */ +} gz_state; +typedef gz_state FAR *gz_statep; + +/* shared functions */ +void ZLIB_INTERNAL gz_error OF((gz_statep, int, const char *)); +#if defined UNDER_CE +char ZLIB_INTERNAL *gz_strwinerror OF((DWORD error)); +#endif + +/* GT_OFF(x), where x is an unsigned value, is true if x > maximum z_off64_t + value -- needed when comparing unsigned to z_off64_t, which is signed + (possible z_off64_t types off_t, off64_t, and long are all signed) */ +#ifdef INT_MAX +# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > INT_MAX) +#else +unsigned ZLIB_INTERNAL gz_intmax OF((void)); +# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > gz_intmax()) +#endif diff --git a/neo/libs/zlib/gzio.c b/neo/libs/zlib/gzio.c deleted file mode 100644 index 7e90f492..00000000 --- a/neo/libs/zlib/gzio.c +++ /dev/null @@ -1,1026 +0,0 @@ -/* gzio.c -- IO on .gz files - * Copyright (C) 1995-2005 Jean-loup Gailly. - * For conditions of distribution and use, see copyright notice in zlib.h - * - * Compile this file with -DNO_GZCOMPRESS to avoid the compression code. - */ - -/* @(#) $Id$ */ - -#include - -#include "zutil.h" - -#ifdef NO_DEFLATE /* for compatibility with old definition */ -# define NO_GZCOMPRESS -#endif - -#ifndef NO_DUMMY_DECL -struct internal_state {int dummy;}; /* for buggy compilers */ -#endif - -#ifndef Z_BUFSIZE -# ifdef MAXSEG_64K -# define Z_BUFSIZE 4096 /* minimize memory usage for 16-bit DOS */ -# else -# define Z_BUFSIZE 16384 -# endif -#endif -#ifndef Z_PRINTF_BUFSIZE -# define Z_PRINTF_BUFSIZE 4096 -#endif - -#ifdef __MVS__ -# pragma map (fdopen , "\174\174FDOPEN") - FILE *fdopen(int, const char *); -#endif - -#ifndef STDC -extern voidp malloc OF((uInt size)); -extern void free OF((voidpf ptr)); -#endif - -#define ALLOC(size) malloc(size) -#define TRYFREE(p) {if (p) free(p);} - -static int const gz_magic[2] = {0x1f, 0x8b}; /* gzip magic header */ - -/* gzip flag byte */ -#define ASCII_FLAG 0x01 /* bit 0 set: file probably ascii text */ -#define HEAD_CRC 0x02 /* bit 1 set: header CRC present */ -#define EXTRA_FIELD 0x04 /* bit 2 set: extra field present */ -#define ORIG_NAME 0x08 /* bit 3 set: original file name present */ -#define COMMENT 0x10 /* bit 4 set: file comment present */ -#define RESERVED 0xE0 /* bits 5..7: reserved */ - -typedef struct gz_stream { - z_stream stream; - int z_err; /* error code for last stream operation */ - int z_eof; /* set if end of input file */ - FILE *file; /* .gz file */ - Byte *inbuf; /* input buffer */ - Byte *outbuf; /* output buffer */ - uLong crc; /* crc32 of uncompressed data */ - char *msg; /* error message */ - char *path; /* path name for debugging only */ - int transparent; /* 1 if input file is not a .gz file */ - char mode; /* 'w' or 'r' */ - z_off_t start; /* start of compressed data in file (header skipped) */ - z_off_t in; /* bytes into deflate or inflate */ - z_off_t out; /* bytes out of deflate or inflate */ - int back; /* one character push-back */ - int last; /* true if push-back is last character */ -} gz_stream; - - -local gzFile gz_open OF((const char *path, const char *mode, int fd)); -local int do_flush OF((gzFile file, int flush)); -local int get_byte OF((gz_stream *s)); -local void check_header OF((gz_stream *s)); -local int destroy OF((gz_stream *s)); -local void putLong OF((FILE *file, uLong x)); -local uLong getLong OF((gz_stream *s)); - -/* =========================================================================== - Opens a gzip (.gz) file for reading or writing. The mode parameter - is as in fopen ("rb" or "wb"). The file is given either by file descriptor - or path name (if fd == -1). - gz_open returns NULL if the file could not be opened or if there was - insufficient memory to allocate the (de)compression state; errno - can be checked to distinguish the two cases (if errno is zero, the - zlib error is Z_MEM_ERROR). -*/ -local gzFile gz_open (path, mode, fd) - const char *path; - const char *mode; - int fd; -{ - int err; - int level = Z_DEFAULT_COMPRESSION; /* compression level */ - int strategy = Z_DEFAULT_STRATEGY; /* compression strategy */ - char *p = (char*)mode; - gz_stream *s; - char fmode[80]; /* copy of mode, without the compression level */ - char *m = fmode; - - if (!path || !mode) return Z_NULL; - - s = (gz_stream *)ALLOC(sizeof(gz_stream)); - if (!s) return Z_NULL; - - s->stream.zalloc = (alloc_func)0; - s->stream.zfree = (free_func)0; - s->stream.opaque = (voidpf)0; - s->stream.next_in = s->inbuf = Z_NULL; - s->stream.next_out = s->outbuf = Z_NULL; - s->stream.avail_in = s->stream.avail_out = 0; - s->file = NULL; - s->z_err = Z_OK; - s->z_eof = 0; - s->in = 0; - s->out = 0; - s->back = EOF; - s->crc = crc32(0L, Z_NULL, 0); - s->msg = NULL; - s->transparent = 0; - - s->path = (char*)ALLOC(strlen(path)+1); - if (s->path == NULL) { - return destroy(s), (gzFile)Z_NULL; - } - strcpy(s->path, path); /* do this early for debugging */ - - s->mode = '\0'; - do { - if (*p == 'r') s->mode = 'r'; - if (*p == 'w' || *p == 'a') s->mode = 'w'; - if (*p >= '0' && *p <= '9') { - level = *p - '0'; - } else if (*p == 'f') { - strategy = Z_FILTERED; - } else if (*p == 'h') { - strategy = Z_HUFFMAN_ONLY; - } else if (*p == 'R') { - strategy = Z_RLE; - } else { - *m++ = *p; /* copy the mode */ - } - } while (*p++ && m != fmode + sizeof(fmode)); - if (s->mode == '\0') return destroy(s), (gzFile)Z_NULL; - - if (s->mode == 'w') { -#ifdef NO_GZCOMPRESS - err = Z_STREAM_ERROR; -#else - err = deflateInit2(&(s->stream), level, - Z_DEFLATED, -MAX_WBITS, DEF_MEM_LEVEL, strategy); - /* windowBits is passed < 0 to suppress zlib header */ - - s->stream.next_out = s->outbuf = (Byte*)ALLOC(Z_BUFSIZE); -#endif - if (err != Z_OK || s->outbuf == Z_NULL) { - return destroy(s), (gzFile)Z_NULL; - } - } else { - s->stream.next_in = s->inbuf = (Byte*)ALLOC(Z_BUFSIZE); - - err = inflateInit2(&(s->stream), -MAX_WBITS); - /* windowBits is passed < 0 to tell that there is no zlib header. - * Note that in this case inflate *requires* an extra "dummy" byte - * after the compressed stream in order to complete decompression and - * return Z_STREAM_END. Here the gzip CRC32 ensures that 4 bytes are - * present after the compressed stream. - */ - if (err != Z_OK || s->inbuf == Z_NULL) { - return destroy(s), (gzFile)Z_NULL; - } - } - s->stream.avail_out = Z_BUFSIZE; - - errno = 0; - s->file = fd < 0 ? F_OPEN(path, fmode) : (FILE*)fdopen(fd, fmode); - - if (s->file == NULL) { - return destroy(s), (gzFile)Z_NULL; - } - if (s->mode == 'w') { - /* Write a very simple .gz header: - */ - fprintf(s->file, "%c%c%c%c%c%c%c%c%c%c", gz_magic[0], gz_magic[1], - Z_DEFLATED, 0 /*flags*/, 0,0,0,0 /*time*/, 0 /*xflags*/, OS_CODE); - s->start = 10L; - /* We use 10L instead of ftell(s->file) to because ftell causes an - * fflush on some systems. This version of the library doesn't use - * start anyway in write mode, so this initialization is not - * necessary. - */ - } else { - check_header(s); /* skip the .gz header */ - s->start = ftell(s->file) - s->stream.avail_in; - } - - return (gzFile)s; -} - -/* =========================================================================== - Opens a gzip (.gz) file for reading or writing. -*/ -gzFile ZEXPORT gzopen (path, mode) - const char *path; - const char *mode; -{ - return gz_open (path, mode, -1); -} - -/* =========================================================================== - Associate a gzFile with the file descriptor fd. fd is not dup'ed here - to mimic the behavio(u)r of fdopen. -*/ -gzFile ZEXPORT gzdopen (fd, mode) - int fd; - const char *mode; -{ - char name[46]; /* allow for up to 128-bit integers */ - - if (fd < 0) return (gzFile)Z_NULL; - sprintf(name, "", fd); /* for debugging */ - - return gz_open (name, mode, fd); -} - -/* =========================================================================== - * Update the compression level and strategy - */ -int ZEXPORT gzsetparams (file, level, strategy) - gzFile file; - int level; - int strategy; -{ - gz_stream *s = (gz_stream*)file; - - if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR; - - /* Make room to allow flushing */ - if (s->stream.avail_out == 0) { - - s->stream.next_out = s->outbuf; - if (fwrite(s->outbuf, 1, Z_BUFSIZE, s->file) != Z_BUFSIZE) { - s->z_err = Z_ERRNO; - } - s->stream.avail_out = Z_BUFSIZE; - } - - return deflateParams (&(s->stream), level, strategy); -} - -/* =========================================================================== - Read a byte from a gz_stream; update next_in and avail_in. Return EOF - for end of file. - IN assertion: the stream s has been sucessfully opened for reading. -*/ -local int get_byte(s) - gz_stream *s; -{ - if (s->z_eof) return EOF; - if (s->stream.avail_in == 0) { - errno = 0; - s->stream.avail_in = (uInt)fread(s->inbuf, 1, Z_BUFSIZE, s->file); - if (s->stream.avail_in == 0) { - s->z_eof = 1; - if (ferror(s->file)) s->z_err = Z_ERRNO; - return EOF; - } - s->stream.next_in = s->inbuf; - } - s->stream.avail_in--; - return *(s->stream.next_in)++; -} - -/* =========================================================================== - Check the gzip header of a gz_stream opened for reading. Set the stream - mode to transparent if the gzip magic header is not present; set s->err - to Z_DATA_ERROR if the magic header is present but the rest of the header - is incorrect. - IN assertion: the stream s has already been created sucessfully; - s->stream.avail_in is zero for the first time, but may be non-zero - for concatenated .gz files. -*/ -local void check_header(s) - gz_stream *s; -{ - int method; /* method byte */ - int flags; /* flags byte */ - uInt len; - int c; - - /* Assure two bytes in the buffer so we can peek ahead -- handle case - where first byte of header is at the end of the buffer after the last - gzip segment */ - len = s->stream.avail_in; - if (len < 2) { - if (len) s->inbuf[0] = s->stream.next_in[0]; - errno = 0; - len = (uInt)fread(s->inbuf + len, 1, Z_BUFSIZE >> len, s->file); - if (len == 0 && ferror(s->file)) s->z_err = Z_ERRNO; - s->stream.avail_in += len; - s->stream.next_in = s->inbuf; - if (s->stream.avail_in < 2) { - s->transparent = s->stream.avail_in; - return; - } - } - - /* Peek ahead to check the gzip magic header */ - if (s->stream.next_in[0] != gz_magic[0] || - s->stream.next_in[1] != gz_magic[1]) { - s->transparent = 1; - return; - } - s->stream.avail_in -= 2; - s->stream.next_in += 2; - - /* Check the rest of the gzip header */ - method = get_byte(s); - flags = get_byte(s); - if (method != Z_DEFLATED || (flags & RESERVED) != 0) { - s->z_err = Z_DATA_ERROR; - return; - } - - /* Discard time, xflags and OS code: */ - for (len = 0; len < 6; len++) (void)get_byte(s); - - if ((flags & EXTRA_FIELD) != 0) { /* skip the extra field */ - len = (uInt)get_byte(s); - len += ((uInt)get_byte(s))<<8; - /* len is garbage if EOF but the loop below will quit anyway */ - while (len-- != 0 && get_byte(s) != EOF) ; - } - if ((flags & ORIG_NAME) != 0) { /* skip the original file name */ - while ((c = get_byte(s)) != 0 && c != EOF) ; - } - if ((flags & COMMENT) != 0) { /* skip the .gz file comment */ - while ((c = get_byte(s)) != 0 && c != EOF) ; - } - if ((flags & HEAD_CRC) != 0) { /* skip the header crc */ - for (len = 0; len < 2; len++) (void)get_byte(s); - } - s->z_err = s->z_eof ? Z_DATA_ERROR : Z_OK; -} - - /* =========================================================================== - * Cleanup then free the given gz_stream. Return a zlib error code. - Try freeing in the reverse order of allocations. - */ -local int destroy (s) - gz_stream *s; -{ - int err = Z_OK; - - if (!s) return Z_STREAM_ERROR; - - TRYFREE(s->msg); - - if (s->stream.state != NULL) { - if (s->mode == 'w') { -#ifdef NO_GZCOMPRESS - err = Z_STREAM_ERROR; -#else - err = deflateEnd(&(s->stream)); -#endif - } else if (s->mode == 'r') { - err = inflateEnd(&(s->stream)); - } - } - if (s->file != NULL && fclose(s->file)) { -#ifdef ESPIPE - if (errno != ESPIPE) /* fclose is broken for pipes in HP/UX */ -#endif - err = Z_ERRNO; - } - if (s->z_err < 0) err = s->z_err; - - TRYFREE(s->inbuf); - TRYFREE(s->outbuf); - TRYFREE(s->path); - TRYFREE(s); - return err; -} - -/* =========================================================================== - Reads the given number of uncompressed bytes from the compressed file. - gzread returns the number of bytes actually read (0 for end of file). -*/ -int ZEXPORT gzread (file, buf, len) - gzFile file; - voidp buf; - unsigned len; -{ - gz_stream *s = (gz_stream*)file; - Bytef *start = (Bytef*)buf; /* starting point for crc computation */ - Byte *next_out; /* == stream.next_out but not forced far (for MSDOS) */ - - if (s == NULL || s->mode != 'r') return Z_STREAM_ERROR; - - if (s->z_err == Z_DATA_ERROR || s->z_err == Z_ERRNO) return -1; - if (s->z_err == Z_STREAM_END) return 0; /* EOF */ - - next_out = (Byte*)buf; - s->stream.next_out = (Bytef*)buf; - s->stream.avail_out = len; - - if (s->stream.avail_out && s->back != EOF) { - *next_out++ = s->back; - s->stream.next_out++; - s->stream.avail_out--; - s->back = EOF; - s->out++; - start++; - if (s->last) { - s->z_err = Z_STREAM_END; - return 1; - } - } - - while (s->stream.avail_out != 0) { - - if (s->transparent) { - /* Copy first the lookahead bytes: */ - uInt n = s->stream.avail_in; - if (n > s->stream.avail_out) n = s->stream.avail_out; - if (n > 0) { - zmemcpy(s->stream.next_out, s->stream.next_in, n); - next_out += n; - s->stream.next_out = next_out; - s->stream.next_in += n; - s->stream.avail_out -= n; - s->stream.avail_in -= n; - } - if (s->stream.avail_out > 0) { - s->stream.avail_out -= - (uInt)fread(next_out, 1, s->stream.avail_out, s->file); - } - len -= s->stream.avail_out; - s->in += len; - s->out += len; - if (len == 0) s->z_eof = 1; - return (int)len; - } - if (s->stream.avail_in == 0 && !s->z_eof) { - - errno = 0; - s->stream.avail_in = (uInt)fread(s->inbuf, 1, Z_BUFSIZE, s->file); - if (s->stream.avail_in == 0) { - s->z_eof = 1; - if (ferror(s->file)) { - s->z_err = Z_ERRNO; - break; - } - } - s->stream.next_in = s->inbuf; - } - s->in += s->stream.avail_in; - s->out += s->stream.avail_out; - s->z_err = inflate(&(s->stream), Z_NO_FLUSH); - s->in -= s->stream.avail_in; - s->out -= s->stream.avail_out; - - if (s->z_err == Z_STREAM_END) { - /* Check CRC and original size */ - s->crc = crc32(s->crc, start, (uInt)(s->stream.next_out - start)); - start = s->stream.next_out; - - if (getLong(s) != s->crc) { - s->z_err = Z_DATA_ERROR; - } else { - (void)getLong(s); - /* The uncompressed length returned by above getlong() may be - * different from s->out in case of concatenated .gz files. - * Check for such files: - */ - check_header(s); - if (s->z_err == Z_OK) { - inflateReset(&(s->stream)); - s->crc = crc32(0L, Z_NULL, 0); - } - } - } - if (s->z_err != Z_OK || s->z_eof) break; - } - s->crc = crc32(s->crc, start, (uInt)(s->stream.next_out - start)); - - if (len == s->stream.avail_out && - (s->z_err == Z_DATA_ERROR || s->z_err == Z_ERRNO)) - return -1; - return (int)(len - s->stream.avail_out); -} - - -/* =========================================================================== - Reads one byte from the compressed file. gzgetc returns this byte - or -1 in case of end of file or error. -*/ -int ZEXPORT gzgetc(file) - gzFile file; -{ - unsigned char c; - - return gzread(file, &c, 1) == 1 ? c : -1; -} - - -/* =========================================================================== - Push one byte back onto the stream. -*/ -int ZEXPORT gzungetc(c, file) - int c; - gzFile file; -{ - gz_stream *s = (gz_stream*)file; - - if (s == NULL || s->mode != 'r' || c == EOF || s->back != EOF) return EOF; - s->back = c; - s->out--; - s->last = (s->z_err == Z_STREAM_END); - if (s->last) s->z_err = Z_OK; - s->z_eof = 0; - return c; -} - - -/* =========================================================================== - Reads bytes from the compressed file until len-1 characters are - read, or a newline character is read and transferred to buf, or an - end-of-file condition is encountered. The string is then terminated - with a null character. - gzgets returns buf, or Z_NULL in case of error. - - The current implementation is not optimized at all. -*/ -char * ZEXPORT gzgets(file, buf, len) - gzFile file; - char *buf; - int len; -{ - char *b = buf; - if (buf == Z_NULL || len <= 0) return Z_NULL; - - while (--len > 0 && gzread(file, buf, 1) == 1 && *buf++ != '\n') ; - *buf = '\0'; - return b == buf && len > 0 ? Z_NULL : b; -} - - -#ifndef NO_GZCOMPRESS -/* =========================================================================== - Writes the given number of uncompressed bytes into the compressed file. - gzwrite returns the number of bytes actually written (0 in case of error). -*/ -int ZEXPORT gzwrite (file, buf, len) - gzFile file; - voidpc buf; - unsigned len; -{ - gz_stream *s = (gz_stream*)file; - - if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR; - - s->stream.next_in = (Bytef*)buf; - s->stream.avail_in = len; - - while (s->stream.avail_in != 0) { - - if (s->stream.avail_out == 0) { - - s->stream.next_out = s->outbuf; - if (fwrite(s->outbuf, 1, Z_BUFSIZE, s->file) != Z_BUFSIZE) { - s->z_err = Z_ERRNO; - break; - } - s->stream.avail_out = Z_BUFSIZE; - } - s->in += s->stream.avail_in; - s->out += s->stream.avail_out; - s->z_err = deflate(&(s->stream), Z_NO_FLUSH); - s->in -= s->stream.avail_in; - s->out -= s->stream.avail_out; - if (s->z_err != Z_OK) break; - } - s->crc = crc32(s->crc, (const Bytef *)buf, len); - - return (int)(len - s->stream.avail_in); -} - - -/* =========================================================================== - Converts, formats, and writes the args to the compressed file under - control of the format string, as in fprintf. gzprintf returns the number of - uncompressed bytes actually written (0 in case of error). -*/ -#ifdef STDC -#include - -int ZEXPORTVA gzprintf (gzFile file, const char *format, /* args */ ...) -{ - char buf[Z_PRINTF_BUFSIZE]; - va_list va; - int len; - - buf[sizeof(buf) - 1] = 0; - va_start(va, format); -#ifdef NO_vsnprintf -# ifdef HAS_vsprintf_void - (void)vsprintf(buf, format, va); - va_end(va); - for (len = 0; len < sizeof(buf); len++) - if (buf[len] == 0) break; -# else - len = vsprintf(buf, format, va); - va_end(va); -# endif -#else -# ifdef HAS_vsnprintf_void - (void)vsnprintf(buf, sizeof(buf), format, va); - va_end(va); - len = strlen(buf); -# else - len = vsnprintf(buf, sizeof(buf), format, va); - va_end(va); -# endif -#endif - if (len <= 0 || len >= (int)sizeof(buf) || buf[sizeof(buf) - 1] != 0) - return 0; - return gzwrite(file, buf, (unsigned)len); -} -#else /* not ANSI C */ - -int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, - a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) - gzFile file; - const char *format; - int a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, - a11, a12, a13, a14, a15, a16, a17, a18, a19, a20; -{ - char buf[Z_PRINTF_BUFSIZE]; - int len; - - buf[sizeof(buf) - 1] = 0; -#ifdef NO_snprintf -# ifdef HAS_sprintf_void - sprintf(buf, format, a1, a2, a3, a4, a5, a6, a7, a8, - a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); - for (len = 0; len < sizeof(buf); len++) - if (buf[len] == 0) break; -# else - len = sprintf(buf, format, a1, a2, a3, a4, a5, a6, a7, a8, - a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); -# endif -#else -# ifdef HAS_snprintf_void - snprintf(buf, sizeof(buf), format, a1, a2, a3, a4, a5, a6, a7, a8, - a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); - len = strlen(buf); -# else - len = snprintf(buf, sizeof(buf), format, a1, a2, a3, a4, a5, a6, a7, a8, - a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); -# endif -#endif - if (len <= 0 || len >= sizeof(buf) || buf[sizeof(buf) - 1] != 0) - return 0; - return gzwrite(file, buf, len); -} -#endif - -/* =========================================================================== - Writes c, converted to an unsigned char, into the compressed file. - gzputc returns the value that was written, or -1 in case of error. -*/ -int ZEXPORT gzputc(file, c) - gzFile file; - int c; -{ - unsigned char cc = (unsigned char) c; /* required for big endian systems */ - - return gzwrite(file, &cc, 1) == 1 ? (int)cc : -1; -} - - -/* =========================================================================== - Writes the given null-terminated string to the compressed file, excluding - the terminating null character. - gzputs returns the number of characters written, or -1 in case of error. -*/ -int ZEXPORT gzputs(file, s) - gzFile file; - const char *s; -{ - return gzwrite(file, (char*)s, (unsigned)strlen(s)); -} - - -/* =========================================================================== - Flushes all pending output into the compressed file. The parameter - flush is as in the deflate() function. -*/ -local int do_flush (file, flush) - gzFile file; - int flush; -{ - uInt len; - int done = 0; - gz_stream *s = (gz_stream*)file; - - if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR; - - s->stream.avail_in = 0; /* should be zero already anyway */ - - for (;;) { - len = Z_BUFSIZE - s->stream.avail_out; - - if (len != 0) { - if ((uInt)fwrite(s->outbuf, 1, len, s->file) != len) { - s->z_err = Z_ERRNO; - return Z_ERRNO; - } - s->stream.next_out = s->outbuf; - s->stream.avail_out = Z_BUFSIZE; - } - if (done) break; - s->out += s->stream.avail_out; - s->z_err = deflate(&(s->stream), flush); - s->out -= s->stream.avail_out; - - /* Ignore the second of two consecutive flushes: */ - if (len == 0 && s->z_err == Z_BUF_ERROR) s->z_err = Z_OK; - - /* deflate has finished flushing only when it hasn't used up - * all the available space in the output buffer: - */ - done = (s->stream.avail_out != 0 || s->z_err == Z_STREAM_END); - - if (s->z_err != Z_OK && s->z_err != Z_STREAM_END) break; - } - return s->z_err == Z_STREAM_END ? Z_OK : s->z_err; -} - -int ZEXPORT gzflush (file, flush) - gzFile file; - int flush; -{ - gz_stream *s = (gz_stream*)file; - int err = do_flush (file, flush); - - if (err) return err; - fflush(s->file); - return s->z_err == Z_STREAM_END ? Z_OK : s->z_err; -} -#endif /* NO_GZCOMPRESS */ - -/* =========================================================================== - Sets the starting position for the next gzread or gzwrite on the given - compressed file. The offset represents a number of bytes in the - gzseek returns the resulting offset location as measured in bytes from - the beginning of the uncompressed stream, or -1 in case of error. - SEEK_END is not implemented, returns error. - In this version of the library, gzseek can be extremely slow. -*/ -z_off_t ZEXPORT gzseek (file, offset, whence) - gzFile file; - z_off_t offset; - int whence; -{ - gz_stream *s = (gz_stream*)file; - - if (s == NULL || whence == SEEK_END || - s->z_err == Z_ERRNO || s->z_err == Z_DATA_ERROR) { - return -1L; - } - - if (s->mode == 'w') { -#ifdef NO_GZCOMPRESS - return -1L; -#else - if (whence == SEEK_SET) { - offset -= s->in; - } - if (offset < 0) return -1L; - - /* At this point, offset is the number of zero bytes to write. */ - if (s->inbuf == Z_NULL) { - s->inbuf = (Byte*)ALLOC(Z_BUFSIZE); /* for seeking */ - if (s->inbuf == Z_NULL) return -1L; - zmemzero(s->inbuf, Z_BUFSIZE); - } - while (offset > 0) { - uInt size = Z_BUFSIZE; - if (offset < Z_BUFSIZE) size = (uInt)offset; - - size = gzwrite(file, s->inbuf, size); - if (size == 0) return -1L; - - offset -= size; - } - return s->in; -#endif - } - /* Rest of function is for reading only */ - - /* compute absolute position */ - if (whence == SEEK_CUR) { - offset += s->out; - } - if (offset < 0) return -1L; - - if (s->transparent) { - /* map to fseek */ - s->back = EOF; - s->stream.avail_in = 0; - s->stream.next_in = s->inbuf; - if (fseek(s->file, offset, SEEK_SET) < 0) return -1L; - - s->in = s->out = offset; - return offset; - } - - /* For a negative seek, rewind and use positive seek */ - if (offset >= s->out) { - offset -= s->out; - } else if (gzrewind(file) < 0) { - return -1L; - } - /* offset is now the number of bytes to skip. */ - - if (offset != 0 && s->outbuf == Z_NULL) { - s->outbuf = (Byte*)ALLOC(Z_BUFSIZE); - if (s->outbuf == Z_NULL) return -1L; - } - if (offset && s->back != EOF) { - s->back = EOF; - s->out++; - offset--; - if (s->last) s->z_err = Z_STREAM_END; - } - while (offset > 0) { - int size = Z_BUFSIZE; - if (offset < Z_BUFSIZE) size = (int)offset; - - size = gzread(file, s->outbuf, (uInt)size); - if (size <= 0) return -1L; - offset -= size; - } - return s->out; -} - -/* =========================================================================== - Rewinds input file. -*/ -int ZEXPORT gzrewind (file) - gzFile file; -{ - gz_stream *s = (gz_stream*)file; - - if (s == NULL || s->mode != 'r') return -1; - - s->z_err = Z_OK; - s->z_eof = 0; - s->back = EOF; - s->stream.avail_in = 0; - s->stream.next_in = s->inbuf; - s->crc = crc32(0L, Z_NULL, 0); - if (!s->transparent) (void)inflateReset(&s->stream); - s->in = 0; - s->out = 0; - return fseek(s->file, s->start, SEEK_SET); -} - -/* =========================================================================== - Returns the starting position for the next gzread or gzwrite on the - given compressed file. This position represents a number of bytes in the - uncompressed data stream. -*/ -z_off_t ZEXPORT gztell (file) - gzFile file; -{ - return gzseek(file, 0L, SEEK_CUR); -} - -/* =========================================================================== - Returns 1 when EOF has previously been detected reading the given - input stream, otherwise zero. -*/ -int ZEXPORT gzeof (file) - gzFile file; -{ - gz_stream *s = (gz_stream*)file; - - /* With concatenated compressed files that can have embedded - * crc trailers, z_eof is no longer the only/best indicator of EOF - * on a gz_stream. Handle end-of-stream error explicitly here. - */ - if (s == NULL || s->mode != 'r') return 0; - if (s->z_eof) return 1; - return s->z_err == Z_STREAM_END; -} - -/* =========================================================================== - Returns 1 if reading and doing so transparently, otherwise zero. -*/ -int ZEXPORT gzdirect (file) - gzFile file; -{ - gz_stream *s = (gz_stream*)file; - - if (s == NULL || s->mode != 'r') return 0; - return s->transparent; -} - -/* =========================================================================== - Outputs a long in LSB order to the given file -*/ -local void putLong (file, x) - FILE *file; - uLong x; -{ - int n; - for (n = 0; n < 4; n++) { - fputc((int)(x & 0xff), file); - x >>= 8; - } -} - -/* =========================================================================== - Reads a long in LSB order from the given gz_stream. Sets z_err in case - of error. -*/ -local uLong getLong (s) - gz_stream *s; -{ - uLong x = (uLong)get_byte(s); - int c; - - x += ((uLong)get_byte(s))<<8; - x += ((uLong)get_byte(s))<<16; - c = get_byte(s); - if (c == EOF) s->z_err = Z_DATA_ERROR; - x += ((uLong)c)<<24; - return x; -} - -/* =========================================================================== - Flushes all pending output if necessary, closes the compressed file - and deallocates all the (de)compression state. -*/ -int ZEXPORT gzclose (file) - gzFile file; -{ - gz_stream *s = (gz_stream*)file; - - if (s == NULL) return Z_STREAM_ERROR; - - if (s->mode == 'w') { -#ifdef NO_GZCOMPRESS - return Z_STREAM_ERROR; -#else - if (do_flush (file, Z_FINISH) != Z_OK) - return destroy((gz_stream*)file); - - putLong (s->file, s->crc); - putLong (s->file, (uLong)(s->in & 0xffffffff)); -#endif - } - return destroy((gz_stream*)file); -} - -#ifdef STDC -# define zstrerror(errnum) strerror(errnum) -#else -# define zstrerror(errnum) "" -#endif - -/* =========================================================================== - Returns the error message for the last error which occurred on the - given compressed file. errnum is set to zlib error number. If an - error occurred in the file system and not in the compression library, - errnum is set to Z_ERRNO and the application may consult errno - to get the exact error code. -*/ -const char * ZEXPORT gzerror (file, errnum) - gzFile file; - int *errnum; -{ - char *m; - gz_stream *s = (gz_stream*)file; - - if (s == NULL) { - *errnum = Z_STREAM_ERROR; - return (const char*)ERR_MSG(Z_STREAM_ERROR); - } - *errnum = s->z_err; - if (*errnum == Z_OK) return (const char*)""; - - m = (char*)(*errnum == Z_ERRNO ? zstrerror(errno) : s->stream.msg); - - if (m == NULL || *m == '\0') m = (char*)ERR_MSG(s->z_err); - - TRYFREE(s->msg); - s->msg = (char*)ALLOC(strlen(s->path) + strlen(m) + 3); - if (s->msg == Z_NULL) return (const char*)ERR_MSG(Z_MEM_ERROR); - strcpy(s->msg, s->path); - strcat(s->msg, ": "); - strcat(s->msg, m); - return (const char*)s->msg; -} - -/* =========================================================================== - Clear the error and end-of-file flags, and do the same for the real file. -*/ -void ZEXPORT gzclearerr (file) - gzFile file; -{ - gz_stream *s = (gz_stream*)file; - - if (s == NULL) return; - if (s->z_err != Z_STREAM_END) s->z_err = Z_OK; - s->z_eof = 0; - clearerr(s->file); -} diff --git a/neo/libs/zlib/gzlib.c b/neo/libs/zlib/gzlib.c new file mode 100644 index 00000000..ca55c6ea --- /dev/null +++ b/neo/libs/zlib/gzlib.c @@ -0,0 +1,620 @@ +/* gzlib.c -- zlib functions common to reading and writing gzip files + * Copyright (C) 2004, 2010, 2011, 2012 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "gzguts.h" + +#if defined(_WIN32) && !defined(__BORLANDC__) +# define LSEEK _lseeki64 +#else +#if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0 +# define LSEEK lseek64 +#else +# define LSEEK lseek +#endif +#endif + +/* Local functions */ +local void gz_reset OF((gz_statep)); +local gzFile gz_open OF((const void *, int, const char *)); + +#if defined UNDER_CE + +/* Map the Windows error number in ERROR to a locale-dependent error message + string and return a pointer to it. Typically, the values for ERROR come + from GetLastError. + + The string pointed to shall not be modified by the application, but may be + overwritten by a subsequent call to gz_strwinerror + + The gz_strwinerror function does not change the current setting of + GetLastError. */ +char ZLIB_INTERNAL *gz_strwinerror (error) + DWORD error; +{ + static char buf[1024]; + + wchar_t *msgbuf; + DWORD lasterr = GetLastError(); + DWORD chars = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM + | FORMAT_MESSAGE_ALLOCATE_BUFFER, + NULL, + error, + 0, /* Default language */ + (LPVOID)&msgbuf, + 0, + NULL); + if (chars != 0) { + /* If there is an \r\n appended, zap it. */ + if (chars >= 2 + && msgbuf[chars - 2] == '\r' && msgbuf[chars - 1] == '\n') { + chars -= 2; + msgbuf[chars] = 0; + } + + if (chars > sizeof (buf) - 1) { + chars = sizeof (buf) - 1; + msgbuf[chars] = 0; + } + + wcstombs(buf, msgbuf, chars + 1); + LocalFree(msgbuf); + } + else { + sprintf(buf, "unknown win32 error (%ld)", error); + } + + SetLastError(lasterr); + return buf; +} + +#endif /* UNDER_CE */ + +/* Reset gzip file state */ +local void gz_reset(state) + gz_statep state; +{ + state->x.have = 0; /* no output data available */ + if (state->mode == GZ_READ) { /* for reading ... */ + state->eof = 0; /* not at end of file */ + state->past = 0; /* have not read past end yet */ + state->how = LOOK; /* look for gzip header */ + } + state->seek = 0; /* no seek request pending */ + gz_error(state, Z_OK, NULL); /* clear error */ + state->x.pos = 0; /* no uncompressed data yet */ + state->strm.avail_in = 0; /* no input data yet */ +} + +/* Open a gzip file either by name or file descriptor. */ +local gzFile gz_open(path, fd, mode) + const void *path; + int fd; + const char *mode; +{ + gz_statep state; + size_t len; + int oflag; +#ifdef O_CLOEXEC + int cloexec = 0; +#endif +#ifdef O_EXCL + int exclusive = 0; +#endif + + /* check input */ + if (path == NULL) + return NULL; + + /* allocate gzFile structure to return */ + state = malloc(sizeof(gz_state)); + if (state == NULL) + return NULL; + state->size = 0; /* no buffers allocated yet */ + state->want = GZBUFSIZE; /* requested buffer size */ + state->msg = NULL; /* no error message yet */ + + /* interpret mode */ + state->mode = GZ_NONE; + state->level = Z_DEFAULT_COMPRESSION; + state->strategy = Z_DEFAULT_STRATEGY; + state->direct = 0; + while (*mode) { + if (*mode >= '0' && *mode <= '9') + state->level = *mode - '0'; + else + switch (*mode) { + case 'r': + state->mode = GZ_READ; + break; +#ifndef NO_GZCOMPRESS + case 'w': + state->mode = GZ_WRITE; + break; + case 'a': + state->mode = GZ_APPEND; + break; +#endif + case '+': /* can't read and write at the same time */ + free(state); + return NULL; + case 'b': /* ignore -- will request binary anyway */ + break; +#ifdef O_CLOEXEC + case 'e': + cloexec = 1; + break; +#endif +#ifdef O_EXCL + case 'x': + exclusive = 1; + break; +#endif + case 'f': + state->strategy = Z_FILTERED; + break; + case 'h': + state->strategy = Z_HUFFMAN_ONLY; + break; + case 'R': + state->strategy = Z_RLE; + break; + case 'F': + state->strategy = Z_FIXED; + case 'T': + state->direct = 1; + default: /* could consider as an error, but just ignore */ + ; + } + mode++; + } + + /* must provide an "r", "w", or "a" */ + if (state->mode == GZ_NONE) { + free(state); + return NULL; + } + + /* can't force transparent read */ + if (state->mode == GZ_READ) { + if (state->direct) { + free(state); + return NULL; + } + state->direct = 1; /* for empty file */ + } + + /* save the path name for error messages */ +#ifdef _WIN32 + if (fd == -2) { + len = wcstombs(NULL, path, 0); + if (len == (size_t)-1) + len = 0; + } + else +#endif + len = strlen(path); + state->path = malloc(len + 1); + if (state->path == NULL) { + free(state); + return NULL; + } +#ifdef _WIN32 + if (fd == -2) + if (len) + wcstombs(state->path, path, len + 1); + else + *(state->path) = 0; + else +#endif + strcpy(state->path, path); + + /* compute the flags for open() */ + oflag = +#ifdef O_LARGEFILE + O_LARGEFILE | +#endif +#ifdef O_BINARY + O_BINARY | +#endif +#ifdef O_CLOEXEC + (cloexec ? O_CLOEXEC : 0) | +#endif + (state->mode == GZ_READ ? + O_RDONLY : + (O_WRONLY | O_CREAT | +#ifdef O_EXCL + (exclusive ? O_EXCL : 0) | +#endif + (state->mode == GZ_WRITE ? + O_TRUNC : + O_APPEND))); + + /* open the file with the appropriate flags (or just use fd) */ + state->fd = fd > -1 ? fd : ( +#ifdef _WIN32 + fd == -2 ? _wopen(path, oflag, 0666) : +#endif + open(path, oflag, 0666)); + if (state->fd == -1) { + free(state->path); + free(state); + return NULL; + } + if (state->mode == GZ_APPEND) + state->mode = GZ_WRITE; /* simplify later checks */ + + /* save the current position for rewinding (only if reading) */ + if (state->mode == GZ_READ) { + state->start = LSEEK(state->fd, 0, SEEK_CUR); + if (state->start == -1) state->start = 0; + } + + /* initialize stream */ + gz_reset(state); + + /* return stream */ + return (gzFile)state; +} + +/* -- see zlib.h -- */ +gzFile ZEXPORT gzopen(path, mode) + const char *path; + const char *mode; +{ + return gz_open(path, -1, mode); +} + +/* -- see zlib.h -- */ +gzFile ZEXPORT gzopen64(path, mode) + const char *path; + const char *mode; +{ + return gz_open(path, -1, mode); +} + +/* -- see zlib.h -- */ +gzFile ZEXPORT gzdopen(fd, mode) + int fd; + const char *mode; +{ + char *path; /* identifier for error messages */ + gzFile gz; + + if (fd == -1 || (path = malloc(7 + 3 * sizeof(int))) == NULL) + return NULL; + sprintf(path, "", fd); /* for debugging */ + gz = gz_open(path, fd, mode); + free(path); + return gz; +} + +/* -- see zlib.h -- */ +#ifdef _WIN32 +gzFile ZEXPORT gzopen_w(path, mode) + const wchar_t *path; + const char *mode; +{ + return gz_open(path, -2, mode); +} +#endif + +/* -- see zlib.h -- */ +int ZEXPORT gzbuffer(file, size) + gzFile file; + unsigned size; +{ + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return -1; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return -1; + + /* make sure we haven't already allocated memory */ + if (state->size != 0) + return -1; + + /* check and set requested size */ + if (size < 2) + size = 2; /* need two bytes to check magic header */ + state->want = size; + return 0; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzrewind(file) + gzFile file; +{ + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + + /* check that we're reading and that there's no error */ + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) + return -1; + + /* back up and start over */ + if (LSEEK(state->fd, state->start, SEEK_SET) == -1) + return -1; + gz_reset(state); + return 0; +} + +/* -- see zlib.h -- */ +z_off64_t ZEXPORT gzseek64(file, offset, whence) + gzFile file; + z_off64_t offset; + int whence; +{ + unsigned n; + z_off64_t ret; + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return -1; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return -1; + + /* check that there's no error */ + if (state->err != Z_OK && state->err != Z_BUF_ERROR) + return -1; + + /* can only seek from start or relative to current position */ + if (whence != SEEK_SET && whence != SEEK_CUR) + return -1; + + /* normalize offset to a SEEK_CUR specification */ + if (whence == SEEK_SET) + offset -= state->x.pos; + else if (state->seek) + offset += state->skip; + state->seek = 0; + + /* if within raw area while reading, just go there */ + if (state->mode == GZ_READ && state->how == COPY && + state->x.pos + offset >= 0) { + ret = LSEEK(state->fd, offset - state->x.have, SEEK_CUR); + if (ret == -1) + return -1; + state->x.have = 0; + state->eof = 0; + state->past = 0; + state->seek = 0; + gz_error(state, Z_OK, NULL); + state->strm.avail_in = 0; + state->x.pos += offset; + return state->x.pos; + } + + /* calculate skip amount, rewinding if needed for back seek when reading */ + if (offset < 0) { + if (state->mode != GZ_READ) /* writing -- can't go backwards */ + return -1; + offset += state->x.pos; + if (offset < 0) /* before start of file! */ + return -1; + if (gzrewind(file) == -1) /* rewind, then skip to offset */ + return -1; + } + + /* if reading, skip what's in output buffer (one less gzgetc() check) */ + if (state->mode == GZ_READ) { + n = GT_OFF(state->x.have) || (z_off64_t)state->x.have > offset ? + (unsigned)offset : state->x.have; + state->x.have -= n; + state->x.next += n; + state->x.pos += n; + offset -= n; + } + + /* request skip (if not zero) */ + if (offset) { + state->seek = 1; + state->skip = offset; + } + return state->x.pos + offset; +} + +/* -- see zlib.h -- */ +z_off_t ZEXPORT gzseek(file, offset, whence) + gzFile file; + z_off_t offset; + int whence; +{ + z_off64_t ret; + + ret = gzseek64(file, (z_off64_t)offset, whence); + return ret == (z_off_t)ret ? (z_off_t)ret : -1; +} + +/* -- see zlib.h -- */ +z_off64_t ZEXPORT gztell64(file) + gzFile file; +{ + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return -1; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return -1; + + /* return position */ + return state->x.pos + (state->seek ? state->skip : 0); +} + +/* -- see zlib.h -- */ +z_off_t ZEXPORT gztell(file) + gzFile file; +{ + z_off64_t ret; + + ret = gztell64(file); + return ret == (z_off_t)ret ? (z_off_t)ret : -1; +} + +/* -- see zlib.h -- */ +z_off64_t ZEXPORT gzoffset64(file) + gzFile file; +{ + z_off64_t offset; + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return -1; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return -1; + + /* compute and return effective offset in file */ + offset = LSEEK(state->fd, 0, SEEK_CUR); + if (offset == -1) + return -1; + if (state->mode == GZ_READ) /* reading */ + offset -= state->strm.avail_in; /* don't count buffered input */ + return offset; +} + +/* -- see zlib.h -- */ +z_off_t ZEXPORT gzoffset(file) + gzFile file; +{ + z_off64_t ret; + + ret = gzoffset64(file); + return ret == (z_off_t)ret ? (z_off_t)ret : -1; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzeof(file) + gzFile file; +{ + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return 0; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return 0; + + /* return end-of-file state */ + return state->mode == GZ_READ ? state->past : 0; +} + +/* -- see zlib.h -- */ +const char * ZEXPORT gzerror(file, errnum) + gzFile file; + int *errnum; +{ + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return NULL; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return NULL; + + /* return error information */ + if (errnum != NULL) + *errnum = state->err; + return state->msg == NULL ? "" : state->msg; +} + +/* -- see zlib.h -- */ +void ZEXPORT gzclearerr(file) + gzFile file; +{ + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return; + + /* clear error and end-of-file */ + if (state->mode == GZ_READ) { + state->eof = 0; + state->past = 0; + } + gz_error(state, Z_OK, NULL); +} + +/* Create an error message in allocated memory and set state->err and + state->msg accordingly. Free any previous error message already there. Do + not try to free or allocate space if the error is Z_MEM_ERROR (out of + memory). Simply save the error message as a static string. If there is an + allocation failure constructing the error message, then convert the error to + out of memory. */ +void ZLIB_INTERNAL gz_error(state, err, msg) + gz_statep state; + int err; + const char *msg; +{ + /* free previously allocated message and clear */ + if (state->msg != NULL) { + if (state->err != Z_MEM_ERROR) + free(state->msg); + state->msg = NULL; + } + + /* if fatal, set state->x.have to 0 so that the gzgetc() macro fails */ + if (err != Z_OK && err != Z_BUF_ERROR) + state->x.have = 0; + + /* set error code, and if no message, then done */ + state->err = err; + if (msg == NULL) + return; + + /* for an out of memory error, save as static string */ + if (err == Z_MEM_ERROR) { + state->msg = (char *)msg; + return; + } + + /* construct error message with path */ + if ((state->msg = malloc(strlen(state->path) + strlen(msg) + 3)) == NULL) { + state->err = Z_MEM_ERROR; + state->msg = (char *)"out of memory"; + return; + } + strcpy(state->msg, state->path); + strcat(state->msg, ": "); + strcat(state->msg, msg); + return; +} + +#ifndef INT_MAX +/* portably return maximum value for an int (when limits.h presumed not + available) -- we need to do this to cover cases where 2's complement not + used, since C standard permits 1's complement and sign-bit representations, + otherwise we could just use ((unsigned)-1) >> 1 */ +unsigned ZLIB_INTERNAL gz_intmax() +{ + unsigned p, q; + + p = 1; + do { + q = p; + p <<= 1; + p++; + } while (p > q); + return q >> 1; +} +#endif diff --git a/neo/libs/zlib/gzread.c b/neo/libs/zlib/gzread.c new file mode 100644 index 00000000..3493d34d --- /dev/null +++ b/neo/libs/zlib/gzread.c @@ -0,0 +1,589 @@ +/* gzread.c -- zlib functions for reading gzip files + * Copyright (C) 2004, 2005, 2010, 2011, 2012 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "gzguts.h" + +/* Local functions */ +local int gz_load OF((gz_statep, unsigned char *, unsigned, unsigned *)); +local int gz_avail OF((gz_statep)); +local int gz_look OF((gz_statep)); +local int gz_decomp OF((gz_statep)); +local int gz_fetch OF((gz_statep)); +local int gz_skip OF((gz_statep, z_off64_t)); + +/* Use read() to load a buffer -- return -1 on error, otherwise 0. Read from + state->fd, and update state->eof, state->err, and state->msg as appropriate. + This function needs to loop on read(), since read() is not guaranteed to + read the number of bytes requested, depending on the type of descriptor. */ +local int gz_load(state, buf, len, have) + gz_statep state; + unsigned char *buf; + unsigned len; + unsigned *have; +{ + int ret; + + *have = 0; + do { + ret = read(state->fd, buf + *have, len - *have); + if (ret <= 0) + break; + *have += ret; + } while (*have < len); + if (ret < 0) { + gz_error(state, Z_ERRNO, zstrerror()); + return -1; + } + if (ret == 0) + state->eof = 1; + return 0; +} + +/* Load up input buffer and set eof flag if last data loaded -- return -1 on + error, 0 otherwise. Note that the eof flag is set when the end of the input + file is reached, even though there may be unused data in the buffer. Once + that data has been used, no more attempts will be made to read the file. + If strm->avail_in != 0, then the current data is moved to the beginning of + the input buffer, and then the remainder of the buffer is loaded with the + available data from the input file. */ +local int gz_avail(state) + gz_statep state; +{ + unsigned got; + z_streamp strm = &(state->strm); + + if (state->err != Z_OK && state->err != Z_BUF_ERROR) + return -1; + if (state->eof == 0) { + if (strm->avail_in) { /* copy what's there to the start */ + unsigned char *p = state->in, *q = strm->next_in; + unsigned n = strm->avail_in; + do { + *p++ = *q++; + } while (--n); + } + if (gz_load(state, state->in + strm->avail_in, + state->size - strm->avail_in, &got) == -1) + return -1; + strm->avail_in += got; + strm->next_in = state->in; + } + return 0; +} + +/* Look for gzip header, set up for inflate or copy. state->x.have must be 0. + If this is the first time in, allocate required memory. state->how will be + left unchanged if there is no more input data available, will be set to COPY + if there is no gzip header and direct copying will be performed, or it will + be set to GZIP for decompression. If direct copying, then leftover input + data from the input buffer will be copied to the output buffer. In that + case, all further file reads will be directly to either the output buffer or + a user buffer. If decompressing, the inflate state will be initialized. + gz_look() will return 0 on success or -1 on failure. */ +local int gz_look(state) + gz_statep state; +{ + z_streamp strm = &(state->strm); + + /* allocate read buffers and inflate memory */ + if (state->size == 0) { + /* allocate buffers */ + state->in = malloc(state->want); + state->out = malloc(state->want << 1); + if (state->in == NULL || state->out == NULL) { + if (state->out != NULL) + free(state->out); + if (state->in != NULL) + free(state->in); + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + state->size = state->want; + + /* allocate inflate memory */ + state->strm.zalloc = Z_NULL; + state->strm.zfree = Z_NULL; + state->strm.opaque = Z_NULL; + state->strm.avail_in = 0; + state->strm.next_in = Z_NULL; + if (inflateInit2(&(state->strm), 15 + 16) != Z_OK) { /* gunzip */ + free(state->out); + free(state->in); + state->size = 0; + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + } + + /* get at least the magic bytes in the input buffer */ + if (strm->avail_in < 2) { + if (gz_avail(state) == -1) + return -1; + if (strm->avail_in == 0) + return 0; + } + + /* look for gzip magic bytes -- if there, do gzip decoding (note: there is + a logical dilemma here when considering the case of a partially written + gzip file, to wit, if a single 31 byte is written, then we cannot tell + whether this is a single-byte file, or just a partially written gzip + file -- for here we assume that if a gzip file is being written, then + the header will be written in a single operation, so that reading a + single byte is sufficient indication that it is not a gzip file) */ + if (strm->avail_in > 1 && + strm->next_in[0] == 31 && strm->next_in[1] == 139) { + inflateReset(strm); + state->how = GZIP; + state->direct = 0; + return 0; + } + + /* no gzip header -- if we were decoding gzip before, then this is trailing + garbage. Ignore the trailing garbage and finish. */ + if (state->direct == 0) { + strm->avail_in = 0; + state->eof = 1; + state->x.have = 0; + return 0; + } + + /* doing raw i/o, copy any leftover input to output -- this assumes that + the output buffer is larger than the input buffer, which also assures + space for gzungetc() */ + state->x.next = state->out; + if (strm->avail_in) { + memcpy(state->x.next, strm->next_in, strm->avail_in); + state->x.have = strm->avail_in; + strm->avail_in = 0; + } + state->how = COPY; + state->direct = 1; + return 0; +} + +/* Decompress from input to the provided next_out and avail_out in the state. + On return, state->x.have and state->x.next point to the just decompressed + data. If the gzip stream completes, state->how is reset to LOOK to look for + the next gzip stream or raw data, once state->x.have is depleted. Returns 0 + on success, -1 on failure. */ +local int gz_decomp(state) + gz_statep state; +{ + int ret = Z_OK; + unsigned had; + z_streamp strm = &(state->strm); + + /* fill output buffer up to end of deflate stream */ + had = strm->avail_out; + do { + /* get more input for inflate() */ + if (strm->avail_in == 0 && gz_avail(state) == -1) + return -1; + if (strm->avail_in == 0) { + gz_error(state, Z_BUF_ERROR, "unexpected end of file"); + break; + } + + /* decompress and handle errors */ + ret = inflate(strm, Z_NO_FLUSH); + if (ret == Z_STREAM_ERROR || ret == Z_NEED_DICT) { + gz_error(state, Z_STREAM_ERROR, + "internal error: inflate stream corrupt"); + return -1; + } + if (ret == Z_MEM_ERROR) { + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + if (ret == Z_DATA_ERROR) { /* deflate stream invalid */ + gz_error(state, Z_DATA_ERROR, + strm->msg == NULL ? "compressed data error" : strm->msg); + return -1; + } + } while (strm->avail_out && ret != Z_STREAM_END); + + /* update available output */ + state->x.have = had - strm->avail_out; + state->x.next = strm->next_out - state->x.have; + + /* if the gzip stream completed successfully, look for another */ + if (ret == Z_STREAM_END) + state->how = LOOK; + + /* good decompression */ + return 0; +} + +/* Fetch data and put it in the output buffer. Assumes state->x.have is 0. + Data is either copied from the input file or decompressed from the input + file depending on state->how. If state->how is LOOK, then a gzip header is + looked for to determine whether to copy or decompress. Returns -1 on error, + otherwise 0. gz_fetch() will leave state->how as COPY or GZIP unless the + end of the input file has been reached and all data has been processed. */ +local int gz_fetch(state) + gz_statep state; +{ + z_streamp strm = &(state->strm); + + do { + switch(state->how) { + case LOOK: /* -> LOOK, COPY (only if never GZIP), or GZIP */ + if (gz_look(state) == -1) + return -1; + if (state->how == LOOK) + return 0; + break; + case COPY: /* -> COPY */ + if (gz_load(state, state->out, state->size << 1, &(state->x.have)) + == -1) + return -1; + state->x.next = state->out; + return 0; + case GZIP: /* -> GZIP or LOOK (if end of gzip stream) */ + strm->avail_out = state->size << 1; + strm->next_out = state->out; + if (gz_decomp(state) == -1) + return -1; + } + } while (state->x.have == 0 && (!state->eof || strm->avail_in)); + return 0; +} + +/* Skip len uncompressed bytes of output. Return -1 on error, 0 on success. */ +local int gz_skip(state, len) + gz_statep state; + z_off64_t len; +{ + unsigned n; + + /* skip over len bytes or reach end-of-file, whichever comes first */ + while (len) + /* skip over whatever is in output buffer */ + if (state->x.have) { + n = GT_OFF(state->x.have) || (z_off64_t)state->x.have > len ? + (unsigned)len : state->x.have; + state->x.have -= n; + state->x.next += n; + state->x.pos += n; + len -= n; + } + + /* output buffer empty -- return if we're at the end of the input */ + else if (state->eof && state->strm.avail_in == 0) + break; + + /* need more data to skip -- load up output buffer */ + else { + /* get more output, looking for header if required */ + if (gz_fetch(state) == -1) + return -1; + } + return 0; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzread(file, buf, len) + gzFile file; + voidp buf; + unsigned len; +{ + unsigned got, n; + gz_statep state; + z_streamp strm; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + strm = &(state->strm); + + /* check that we're reading and that there's no (serious) error */ + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) + return -1; + + /* since an int is returned, make sure len fits in one, otherwise return + with an error (this avoids the flaw in the interface) */ + if ((int)len < 0) { + gz_error(state, Z_DATA_ERROR, "requested length does not fit in int"); + return -1; + } + + /* if len is zero, avoid unnecessary operations */ + if (len == 0) + return 0; + + /* process a skip request */ + if (state->seek) { + state->seek = 0; + if (gz_skip(state, state->skip) == -1) + return -1; + } + + /* get len bytes to buf, or less than len if at the end */ + got = 0; + do { + /* first just try copying data from the output buffer */ + if (state->x.have) { + n = state->x.have > len ? len : state->x.have; + memcpy(buf, state->x.next, n); + state->x.next += n; + state->x.have -= n; + } + + /* output buffer empty -- return if we're at the end of the input */ + else if (state->eof && strm->avail_in == 0) { + state->past = 1; /* tried to read past end */ + break; + } + + /* need output data -- for small len or new stream load up our output + buffer */ + else if (state->how == LOOK || len < (state->size << 1)) { + /* get more output, looking for header if required */ + if (gz_fetch(state) == -1) + return -1; + continue; /* no progress yet -- go back to copy above */ + /* the copy above assures that we will leave with space in the + output buffer, allowing at least one gzungetc() to succeed */ + } + + /* large len -- read directly into user buffer */ + else if (state->how == COPY) { /* read directly */ + if (gz_load(state, buf, len, &n) == -1) + return -1; + } + + /* large len -- decompress directly into user buffer */ + else { /* state->how == GZIP */ + strm->avail_out = len; + strm->next_out = buf; + if (gz_decomp(state) == -1) + return -1; + n = state->x.have; + state->x.have = 0; + } + + /* update progress */ + len -= n; + buf = (char *)buf + n; + got += n; + state->x.pos += n; + } while (len); + + /* return number of bytes read into user buffer (will fit in int) */ + return (int)got; +} + +/* -- see zlib.h -- */ +#undef gzgetc +int ZEXPORT gzgetc(file) + gzFile file; +{ + int ret; + unsigned char buf[1]; + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + + /* check that we're reading and that there's no (serious) error */ + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) + return -1; + + /* try output buffer (no need to check for skip request) */ + if (state->x.have) { + state->x.have--; + state->x.pos++; + return *(state->x.next)++; + } + + /* nothing there -- try gzread() */ + ret = gzread(file, buf, 1); + return ret < 1 ? -1 : buf[0]; +} + +int ZEXPORT gzgetc_(file) +gzFile file; +{ + return gzgetc(file); +} + +/* -- see zlib.h -- */ +int ZEXPORT gzungetc(c, file) + int c; + gzFile file; +{ + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + + /* check that we're reading and that there's no (serious) error */ + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) + return -1; + + /* process a skip request */ + if (state->seek) { + state->seek = 0; + if (gz_skip(state, state->skip) == -1) + return -1; + } + + /* can't push EOF */ + if (c < 0) + return -1; + + /* if output buffer empty, put byte at end (allows more pushing) */ + if (state->x.have == 0) { + state->x.have = 1; + state->x.next = state->out + (state->size << 1) - 1; + state->x.next[0] = c; + state->x.pos--; + state->past = 0; + return c; + } + + /* if no room, give up (must have already done a gzungetc()) */ + if (state->x.have == (state->size << 1)) { + gz_error(state, Z_DATA_ERROR, "out of room to push characters"); + return -1; + } + + /* slide output data if needed and insert byte before existing data */ + if (state->x.next == state->out) { + unsigned char *src = state->out + state->x.have; + unsigned char *dest = state->out + (state->size << 1); + while (src > state->out) + *--dest = *--src; + state->x.next = dest; + } + state->x.have++; + state->x.next--; + state->x.next[0] = c; + state->x.pos--; + state->past = 0; + return c; +} + +/* -- see zlib.h -- */ +char * ZEXPORT gzgets(file, buf, len) + gzFile file; + char *buf; + int len; +{ + unsigned left, n; + char *str; + unsigned char *eol; + gz_statep state; + + /* check parameters and get internal structure */ + if (file == NULL || buf == NULL || len < 1) + return NULL; + state = (gz_statep)file; + + /* check that we're reading and that there's no (serious) error */ + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) + return NULL; + + /* process a skip request */ + if (state->seek) { + state->seek = 0; + if (gz_skip(state, state->skip) == -1) + return NULL; + } + + /* copy output bytes up to new line or len - 1, whichever comes first -- + append a terminating zero to the string (we don't check for a zero in + the contents, let the user worry about that) */ + str = buf; + left = (unsigned)len - 1; + if (left) do { + /* assure that something is in the output buffer */ + if (state->x.have == 0 && gz_fetch(state) == -1) + return NULL; /* error */ + if (state->x.have == 0) { /* end of file */ + state->past = 1; /* read past end */ + break; /* return what we have */ + } + + /* look for end-of-line in current output buffer */ + n = state->x.have > left ? left : state->x.have; + eol = memchr(state->x.next, '\n', n); + if (eol != NULL) + n = (unsigned)(eol - state->x.next) + 1; + + /* copy through end-of-line, or remainder if not found */ + memcpy(buf, state->x.next, n); + state->x.have -= n; + state->x.next += n; + state->x.pos += n; + left -= n; + buf += n; + } while (left && eol == NULL); + + /* return terminated string, or if nothing, end of file */ + if (buf == str) + return NULL; + buf[0] = 0; + return str; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzdirect(file) + gzFile file; +{ + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return 0; + state = (gz_statep)file; + + /* if the state is not known, but we can find out, then do so (this is + mainly for right after a gzopen() or gzdopen()) */ + if (state->mode == GZ_READ && state->how == LOOK && state->x.have == 0) + (void)gz_look(state); + + /* return 1 if transparent, 0 if processing a gzip stream */ + return state->direct; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzclose_r(file) + gzFile file; +{ + int ret, err; + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return Z_STREAM_ERROR; + state = (gz_statep)file; + + /* check that we're reading */ + if (state->mode != GZ_READ) + return Z_STREAM_ERROR; + + /* free memory and close file */ + if (state->size) { + inflateEnd(&(state->strm)); + free(state->out); + free(state->in); + } + err = state->err == Z_BUF_ERROR ? Z_BUF_ERROR : Z_OK; + gz_error(state, Z_OK, NULL); + free(state->path); + ret = close(state->fd); + free(state); + return ret ? Z_ERRNO : err; +} diff --git a/neo/libs/zlib/gzwrite.c b/neo/libs/zlib/gzwrite.c new file mode 100644 index 00000000..27cb3428 --- /dev/null +++ b/neo/libs/zlib/gzwrite.c @@ -0,0 +1,565 @@ +/* gzwrite.c -- zlib functions for writing gzip files + * Copyright (C) 2004, 2005, 2010, 2011, 2012 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "gzguts.h" + +/* Local functions */ +local int gz_init OF((gz_statep)); +local int gz_comp OF((gz_statep, int)); +local int gz_zero OF((gz_statep, z_off64_t)); + +/* Initialize state for writing a gzip file. Mark initialization by setting + state->size to non-zero. Return -1 on failure or 0 on success. */ +local int gz_init(state) + gz_statep state; +{ + int ret; + z_streamp strm = &(state->strm); + + /* allocate input buffer */ + state->in = malloc(state->want); + if (state->in == NULL) { + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + + /* only need output buffer and deflate state if compressing */ + if (!state->direct) { + /* allocate output buffer */ + state->out = malloc(state->want); + if (state->out == NULL) { + free(state->in); + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + + /* allocate deflate memory, set up for gzip compression */ + strm->zalloc = Z_NULL; + strm->zfree = Z_NULL; + strm->opaque = Z_NULL; + ret = deflateInit2(strm, state->level, Z_DEFLATED, + MAX_WBITS + 16, DEF_MEM_LEVEL, state->strategy); + if (ret != Z_OK) { + free(state->out); + free(state->in); + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + } + + /* mark state as initialized */ + state->size = state->want; + + /* initialize write buffer if compressing */ + if (!state->direct) { + strm->avail_out = state->size; + strm->next_out = state->out; + state->x.next = strm->next_out; + } + return 0; +} + +/* Compress whatever is at avail_in and next_in and write to the output file. + Return -1 if there is an error writing to the output file, otherwise 0. + flush is assumed to be a valid deflate() flush value. If flush is Z_FINISH, + then the deflate() state is reset to start a new gzip stream. If gz->direct + is true, then simply write to the output file without compressing, and + ignore flush. */ +local int gz_comp(state, flush) + gz_statep state; + int flush; +{ + int ret, got; + unsigned have; + z_streamp strm = &(state->strm); + + /* allocate memory if this is the first time through */ + if (state->size == 0 && gz_init(state) == -1) + return -1; + + /* write directly if requested */ + if (state->direct) { + got = write(state->fd, strm->next_in, strm->avail_in); + if (got < 0 || (unsigned)got != strm->avail_in) { + gz_error(state, Z_ERRNO, zstrerror()); + return -1; + } + strm->avail_in = 0; + return 0; + } + + /* run deflate() on provided input until it produces no more output */ + ret = Z_OK; + do { + /* write out current buffer contents if full, or if flushing, but if + doing Z_FINISH then don't write until we get to Z_STREAM_END */ + if (strm->avail_out == 0 || (flush != Z_NO_FLUSH && + (flush != Z_FINISH || ret == Z_STREAM_END))) { + have = (unsigned)(strm->next_out - state->x.next); + if (have && ((got = write(state->fd, state->x.next, have)) < 0 || + (unsigned)got != have)) { + gz_error(state, Z_ERRNO, zstrerror()); + return -1; + } + if (strm->avail_out == 0) { + strm->avail_out = state->size; + strm->next_out = state->out; + } + state->x.next = strm->next_out; + } + + /* compress */ + have = strm->avail_out; + ret = deflate(strm, flush); + if (ret == Z_STREAM_ERROR) { + gz_error(state, Z_STREAM_ERROR, + "internal error: deflate stream corrupt"); + return -1; + } + have -= strm->avail_out; + } while (have); + + /* if that completed a deflate stream, allow another to start */ + if (flush == Z_FINISH) + deflateReset(strm); + + /* all done, no errors */ + return 0; +} + +/* Compress len zeros to output. Return -1 on error, 0 on success. */ +local int gz_zero(state, len) + gz_statep state; + z_off64_t len; +{ + int first; + unsigned n; + z_streamp strm = &(state->strm); + + /* consume whatever's left in the input buffer */ + if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) + return -1; + + /* compress len zeros (len guaranteed > 0) */ + first = 1; + while (len) { + n = GT_OFF(state->size) || (z_off64_t)state->size > len ? + (unsigned)len : state->size; + if (first) { + memset(state->in, 0, n); + first = 0; + } + strm->avail_in = n; + strm->next_in = state->in; + state->x.pos += n; + if (gz_comp(state, Z_NO_FLUSH) == -1) + return -1; + len -= n; + } + return 0; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzwrite(file, buf, len) + gzFile file; + voidpc buf; + unsigned len; +{ + unsigned put = len; + unsigned n; + gz_statep state; + z_streamp strm; + + /* get internal structure */ + if (file == NULL) + return 0; + state = (gz_statep)file; + strm = &(state->strm); + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return 0; + + /* since an int is returned, make sure len fits in one, otherwise return + with an error (this avoids the flaw in the interface) */ + if ((int)len < 0) { + gz_error(state, Z_DATA_ERROR, "requested length does not fit in int"); + return 0; + } + + /* if len is zero, avoid unnecessary operations */ + if (len == 0) + return 0; + + /* allocate memory if this is the first time through */ + if (state->size == 0 && gz_init(state) == -1) + return 0; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return 0; + } + + /* for small len, copy to input buffer, otherwise compress directly */ + if (len < state->size) { + /* copy to input buffer, compress when full */ + do { + if (strm->avail_in == 0) + strm->next_in = state->in; + n = state->size - strm->avail_in; + if (n > len) + n = len; + memcpy(strm->next_in + strm->avail_in, buf, n); + strm->avail_in += n; + state->x.pos += n; + buf = (char *)buf + n; + len -= n; + if (len && gz_comp(state, Z_NO_FLUSH) == -1) + return 0; + } while (len); + } + else { + /* consume whatever's left in the input buffer */ + if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) + return 0; + + /* directly compress user buffer to file */ + strm->avail_in = len; + strm->next_in = (voidp)buf; + state->x.pos += len; + if (gz_comp(state, Z_NO_FLUSH) == -1) + return 0; + } + + /* input was all buffered or compressed (put will fit in int) */ + return (int)put; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzputc(file, c) + gzFile file; + int c; +{ + unsigned char buf[1]; + gz_statep state; + z_streamp strm; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + strm = &(state->strm); + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return -1; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return -1; + } + + /* try writing to input buffer for speed (state->size == 0 if buffer not + initialized) */ + if (strm->avail_in < state->size) { + if (strm->avail_in == 0) + strm->next_in = state->in; + strm->next_in[strm->avail_in++] = c; + state->x.pos++; + return c & 0xff; + } + + /* no room in buffer or not initialized, use gz_write() */ + buf[0] = c; + if (gzwrite(file, buf, 1) != 1) + return -1; + return c & 0xff; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzputs(file, str) + gzFile file; + const char *str; +{ + int ret; + unsigned len; + + /* write string */ + len = (unsigned)strlen(str); + ret = gzwrite(file, str, len); + return ret == 0 && len != 0 ? -1 : ret; +} + +#if defined(STDC) || defined(Z_HAVE_STDARG_H) +#include + +/* -- see zlib.h -- */ +int ZEXPORTVA gzprintf (gzFile file, const char *format, ...) +{ + int size, len; + gz_statep state; + z_streamp strm; + va_list va; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + strm = &(state->strm); + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return 0; + + /* make sure we have some buffer space */ + if (state->size == 0 && gz_init(state) == -1) + return 0; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return 0; + } + + /* consume whatever's left in the input buffer */ + if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) + return 0; + + /* do the printf() into the input buffer, put length in len */ + size = (int)(state->size); + state->in[size - 1] = 0; + va_start(va, format); +#ifdef NO_vsnprintf +# ifdef HAS_vsprintf_void + (void)vsprintf((char *)(state->in), format, va); + va_end(va); + for (len = 0; len < size; len++) + if (state->in[len] == 0) break; +# else + len = vsprintf((char *)(state->in), format, va); + va_end(va); +# endif +#else +# ifdef HAS_vsnprintf_void + (void)vsnprintf((char *)(state->in), size, format, va); + va_end(va); + len = strlen((char *)(state->in)); +# else + len = vsnprintf((char *)(state->in), size, format, va); + va_end(va); +# endif +#endif + + /* check that printf() results fit in buffer */ + if (len <= 0 || len >= (int)size || state->in[size - 1] != 0) + return 0; + + /* update buffer and position, defer compression until needed */ + strm->avail_in = (unsigned)len; + strm->next_in = state->in; + state->x.pos += len; + return len; +} + +#else /* !STDC && !Z_HAVE_STDARG_H */ + +/* -- see zlib.h -- */ +int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, + a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) + gzFile file; + const char *format; + int a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, + a11, a12, a13, a14, a15, a16, a17, a18, a19, a20; +{ + int size, len; + gz_statep state; + z_streamp strm; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + strm = &(state->strm); + + /* check that can really pass pointer in ints */ + if (sizeof(int) != sizeof(void *)) + return 0; + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return 0; + + /* make sure we have some buffer space */ + if (state->size == 0 && gz_init(state) == -1) + return 0; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return 0; + } + + /* consume whatever's left in the input buffer */ + if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) + return 0; + + /* do the printf() into the input buffer, put length in len */ + size = (int)(state->size); + state->in[size - 1] = 0; +#ifdef NO_snprintf +# ifdef HAS_sprintf_void + sprintf((char *)(state->in), format, a1, a2, a3, a4, a5, a6, a7, a8, + a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); + for (len = 0; len < size; len++) + if (state->in[len] == 0) break; +# else + len = sprintf((char *)(state->in), format, a1, a2, a3, a4, a5, a6, a7, a8, + a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); +# endif +#else +# ifdef HAS_snprintf_void + snprintf((char *)(state->in), size, format, a1, a2, a3, a4, a5, a6, a7, a8, + a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); + len = strlen((char *)(state->in)); +# else + len = snprintf((char *)(state->in), size, format, a1, a2, a3, a4, a5, a6, + a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, + a19, a20); +# endif +#endif + + /* check that printf() results fit in buffer */ + if (len <= 0 || len >= (int)size || state->in[size - 1] != 0) + return 0; + + /* update buffer and position, defer compression until needed */ + strm->avail_in = (unsigned)len; + strm->next_in = state->in; + state->x.pos += len; + return len; +} + +#endif + +/* -- see zlib.h -- */ +int ZEXPORT gzflush(file, flush) + gzFile file; + int flush; +{ + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return Z_STREAM_ERROR; + + /* check flush parameter */ + if (flush < 0 || flush > Z_FINISH) + return Z_STREAM_ERROR; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return -1; + } + + /* compress remaining data with requested flush */ + gz_comp(state, flush); + return state->err; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzsetparams(file, level, strategy) + gzFile file; + int level; + int strategy; +{ + gz_statep state; + z_streamp strm; + + /* get internal structure */ + if (file == NULL) + return Z_STREAM_ERROR; + state = (gz_statep)file; + strm = &(state->strm); + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return Z_STREAM_ERROR; + + /* if no change is requested, then do nothing */ + if (level == state->level && strategy == state->strategy) + return Z_OK; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return -1; + } + + /* change compression parameters for subsequent input */ + if (state->size) { + /* flush previous input with previous parameters before changing */ + if (strm->avail_in && gz_comp(state, Z_PARTIAL_FLUSH) == -1) + return state->err; + deflateParams(strm, level, strategy); + } + state->level = level; + state->strategy = strategy; + return Z_OK; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzclose_w(file) + gzFile file; +{ + int ret = Z_OK; + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return Z_STREAM_ERROR; + state = (gz_statep)file; + + /* check that we're writing */ + if (state->mode != GZ_WRITE) + return Z_STREAM_ERROR; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + ret = state->err; + } + + /* flush, free memory, and close file */ + if (state->size) { + if (gz_comp(state, Z_FINISH) == -1) + ret = state->err; + if (!state->direct) { + (void)deflateEnd(&(state->strm)); + free(state->out); + } + free(state->in); + } + gz_error(state, Z_OK, NULL); + free(state->path); + if (close(state->fd) == -1) + ret = Z_ERRNO; + free(state); + return ret; +} diff --git a/neo/libs/zlib/infback.c b/neo/libs/zlib/infback.c index 455dbc9e..981aff17 100644 --- a/neo/libs/zlib/infback.c +++ b/neo/libs/zlib/infback.c @@ -1,5 +1,5 @@ /* infback.c -- inflate using a call-back interface - * Copyright (C) 1995-2005 Mark Adler + * Copyright (C) 1995-2011 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -42,10 +42,19 @@ int stream_size; return Z_STREAM_ERROR; strm->msg = Z_NULL; /* in case we return an error */ if (strm->zalloc == (alloc_func)0) { +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else strm->zalloc = zcalloc; strm->opaque = (voidpf)0; +#endif } - if (strm->zfree == (free_func)0) strm->zfree = zcfree; + if (strm->zfree == (free_func)0) +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zfree = zcfree; +#endif state = (struct inflate_state FAR *)ZALLOC(strm, 1, sizeof(struct inflate_state)); if (state == Z_NULL) return Z_MEM_ERROR; @@ -55,7 +64,7 @@ int stream_size; state->wbits = windowBits; state->wsize = 1U << windowBits; state->window = window; - state->write = 0; + state->wnext = 0; state->whave = 0; return Z_OK; } @@ -253,7 +262,7 @@ void FAR *out_desc; unsigned bits; /* bits in bit buffer */ unsigned copy; /* number of stored or match bytes to copy */ unsigned char FAR *from; /* where to copy match bytes from */ - code this; /* current decoding table entry */ + code here; /* current decoding table entry */ code last; /* parent table entry */ unsigned len; /* length to copy for repeats, bits to drop */ int ret; /* return code */ @@ -389,19 +398,18 @@ void FAR *out_desc; state->have = 0; while (state->have < state->nlen + state->ndist) { for (;;) { - this = state->lencode[BITS(state->lenbits)]; - if ((unsigned)(this.bits) <= bits) break; + here = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(here.bits) <= bits) break; PULLBYTE(); } - if (this.val < 16) { - NEEDBITS(this.bits); - DROPBITS(this.bits); - state->lens[state->have++] = this.val; + if (here.val < 16) { + DROPBITS(here.bits); + state->lens[state->have++] = here.val; } else { - if (this.val == 16) { - NEEDBITS(this.bits + 2); - DROPBITS(this.bits); + if (here.val == 16) { + NEEDBITS(here.bits + 2); + DROPBITS(here.bits); if (state->have == 0) { strm->msg = (char *)"invalid bit length repeat"; state->mode = BAD; @@ -411,16 +419,16 @@ void FAR *out_desc; copy = 3 + BITS(2); DROPBITS(2); } - else if (this.val == 17) { - NEEDBITS(this.bits + 3); - DROPBITS(this.bits); + else if (here.val == 17) { + NEEDBITS(here.bits + 3); + DROPBITS(here.bits); len = 0; copy = 3 + BITS(3); DROPBITS(3); } else { - NEEDBITS(this.bits + 7); - DROPBITS(this.bits); + NEEDBITS(here.bits + 7); + DROPBITS(here.bits); len = 0; copy = 11 + BITS(7); DROPBITS(7); @@ -438,7 +446,16 @@ void FAR *out_desc; /* handle error breaks in while */ if (state->mode == BAD) break; - /* build code tables */ + /* check for end-of-block code (better have one) */ + if (state->lens[256] == 0) { + strm->msg = (char *)"invalid code -- missing end-of-block"; + state->mode = BAD; + break; + } + + /* build code tables -- note: do not change the lenbits or distbits + values here (9 and 6) without reading the comments in inftrees.h + concerning the ENOUGH constants, which depend on those values */ state->next = state->codes; state->lencode = (code const FAR *)(state->next); state->lenbits = 9; @@ -474,28 +491,28 @@ void FAR *out_desc; /* get a literal, length, or end-of-block code */ for (;;) { - this = state->lencode[BITS(state->lenbits)]; - if ((unsigned)(this.bits) <= bits) break; + here = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(here.bits) <= bits) break; PULLBYTE(); } - if (this.op && (this.op & 0xf0) == 0) { - last = this; + if (here.op && (here.op & 0xf0) == 0) { + last = here; for (;;) { - this = state->lencode[last.val + + here = state->lencode[last.val + (BITS(last.bits + last.op) >> last.bits)]; - if ((unsigned)(last.bits + this.bits) <= bits) break; + if ((unsigned)(last.bits + here.bits) <= bits) break; PULLBYTE(); } DROPBITS(last.bits); } - DROPBITS(this.bits); - state->length = (unsigned)this.val; + DROPBITS(here.bits); + state->length = (unsigned)here.val; /* process literal */ - if (this.op == 0) { - Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ? + if (here.op == 0) { + Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? "inflate: literal '%c'\n" : - "inflate: literal 0x%02x\n", this.val)); + "inflate: literal 0x%02x\n", here.val)); ROOM(); *put++ = (unsigned char)(state->length); left--; @@ -504,21 +521,21 @@ void FAR *out_desc; } /* process end of block */ - if (this.op & 32) { + if (here.op & 32) { Tracevv((stderr, "inflate: end of block\n")); state->mode = TYPE; break; } /* invalid code */ - if (this.op & 64) { + if (here.op & 64) { strm->msg = (char *)"invalid literal/length code"; state->mode = BAD; break; } /* length code -- get extra bits, if any */ - state->extra = (unsigned)(this.op) & 15; + state->extra = (unsigned)(here.op) & 15; if (state->extra != 0) { NEEDBITS(state->extra); state->length += BITS(state->extra); @@ -528,30 +545,30 @@ void FAR *out_desc; /* get distance code */ for (;;) { - this = state->distcode[BITS(state->distbits)]; - if ((unsigned)(this.bits) <= bits) break; + here = state->distcode[BITS(state->distbits)]; + if ((unsigned)(here.bits) <= bits) break; PULLBYTE(); } - if ((this.op & 0xf0) == 0) { - last = this; + if ((here.op & 0xf0) == 0) { + last = here; for (;;) { - this = state->distcode[last.val + + here = state->distcode[last.val + (BITS(last.bits + last.op) >> last.bits)]; - if ((unsigned)(last.bits + this.bits) <= bits) break; + if ((unsigned)(last.bits + here.bits) <= bits) break; PULLBYTE(); } DROPBITS(last.bits); } - DROPBITS(this.bits); - if (this.op & 64) { + DROPBITS(here.bits); + if (here.op & 64) { strm->msg = (char *)"invalid distance code"; state->mode = BAD; break; } - state->offset = (unsigned)this.val; + state->offset = (unsigned)here.val; /* get distance extra bits, if any */ - state->extra = (unsigned)(this.op) & 15; + state->extra = (unsigned)(here.op) & 15; if (state->extra != 0) { NEEDBITS(state->extra); state->offset += BITS(state->extra); diff --git a/neo/libs/zlib/inffast.c b/neo/libs/zlib/inffast.c index bbee92ed..2f1d60b4 100644 --- a/neo/libs/zlib/inffast.c +++ b/neo/libs/zlib/inffast.c @@ -1,5 +1,5 @@ /* inffast.c -- fast decoding - * Copyright (C) 1995-2004 Mark Adler + * Copyright (C) 1995-2008, 2010 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -64,7 +64,7 @@ requires strm->avail_out >= 258 for each loop to avoid checking for output space. */ -void inflate_fast(strm, start) +void ZLIB_INTERNAL inflate_fast(strm, start) z_streamp strm; unsigned start; /* inflate()'s starting value for strm->avail_out */ { @@ -79,7 +79,7 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ #endif unsigned wsize; /* window size or zero if not using window */ unsigned whave; /* valid bytes in the window */ - unsigned write; /* window write index */ + unsigned wnext; /* window write index */ unsigned char FAR *window; /* allocated sliding window, if wsize != 0 */ unsigned long hold; /* local strm->hold */ unsigned bits; /* local strm->bits */ @@ -87,7 +87,7 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ code const FAR *dcode; /* local strm->distcode */ unsigned lmask; /* mask for first level of length codes */ unsigned dmask; /* mask for first level of distance codes */ - code this; /* retrieved table entry */ + code here; /* retrieved table entry */ unsigned op; /* code bits, operation, extra bits, or */ /* window position, window bytes to copy */ unsigned len; /* match length, unused bytes */ @@ -106,7 +106,7 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ #endif wsize = state->wsize; whave = state->whave; - write = state->write; + wnext = state->wnext; window = state->window; hold = state->hold; bits = state->bits; @@ -124,20 +124,20 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ hold += (unsigned long)(PUP(in)) << bits; bits += 8; } - this = lcode[hold & lmask]; + here = lcode[hold & lmask]; dolen: - op = (unsigned)(this.bits); + op = (unsigned)(here.bits); hold >>= op; bits -= op; - op = (unsigned)(this.op); + op = (unsigned)(here.op); if (op == 0) { /* literal */ - Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ? + Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? "inflate: literal '%c'\n" : - "inflate: literal 0x%02x\n", this.val)); - PUP(out) = (unsigned char)(this.val); + "inflate: literal 0x%02x\n", here.val)); + PUP(out) = (unsigned char)(here.val); } else if (op & 16) { /* length base */ - len = (unsigned)(this.val); + len = (unsigned)(here.val); op &= 15; /* number of extra bits */ if (op) { if (bits < op) { @@ -155,14 +155,14 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ hold += (unsigned long)(PUP(in)) << bits; bits += 8; } - this = dcode[hold & dmask]; + here = dcode[hold & dmask]; dodist: - op = (unsigned)(this.bits); + op = (unsigned)(here.bits); hold >>= op; bits -= op; - op = (unsigned)(this.op); + op = (unsigned)(here.op); if (op & 16) { /* distance base */ - dist = (unsigned)(this.val); + dist = (unsigned)(here.val); op &= 15; /* number of extra bits */ if (bits < op) { hold += (unsigned long)(PUP(in)) << bits; @@ -187,12 +187,34 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ if (dist > op) { /* see if copy from window */ op = dist - op; /* distance back in window */ if (op > whave) { - strm->msg = (char *)"invalid distance too far back"; - state->mode = BAD; - break; + if (state->sane) { + strm->msg = + (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR + if (len <= op - whave) { + do { + PUP(out) = 0; + } while (--len); + continue; + } + len -= op - whave; + do { + PUP(out) = 0; + } while (--op > whave); + if (op == 0) { + from = out - dist; + do { + PUP(out) = PUP(from); + } while (--len); + continue; + } +#endif } from = window - OFF; - if (write == 0) { /* very common case */ + if (wnext == 0) { /* very common case */ from += wsize - op; if (op < len) { /* some from window */ len -= op; @@ -202,17 +224,17 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ from = out - dist; /* rest from output */ } } - else if (write < op) { /* wrap around window */ - from += wsize + write - op; - op -= write; + else if (wnext < op) { /* wrap around window */ + from += wsize + wnext - op; + op -= wnext; if (op < len) { /* some from end of window */ len -= op; do { PUP(out) = PUP(from); } while (--op); from = window - OFF; - if (write < len) { /* some from start of window */ - op = write; + if (wnext < len) { /* some from start of window */ + op = wnext; len -= op; do { PUP(out) = PUP(from); @@ -222,7 +244,7 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ } } else { /* contiguous in window */ - from += write - op; + from += wnext - op; if (op < len) { /* some from window */ len -= op; do { @@ -259,7 +281,7 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ } } else if ((op & 64) == 0) { /* 2nd level distance code */ - this = dcode[this.val + (hold & ((1U << op) - 1))]; + here = dcode[here.val + (hold & ((1U << op) - 1))]; goto dodist; } else { @@ -269,7 +291,7 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ } } else if ((op & 64) == 0) { /* 2nd level length code */ - this = lcode[this.val + (hold & ((1U << op) - 1))]; + here = lcode[here.val + (hold & ((1U << op) - 1))]; goto dolen; } else if (op & 32) { /* end-of-block */ @@ -305,7 +327,7 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ inflate_fast() speedups that turned out slower (on a PowerPC G3 750CXe): - Using bit fields for code structure - Different op definition to avoid & for extra bits (do & for table bits) - - Three separate decoding do-loops for direct, window, and write == 0 + - Three separate decoding do-loops for direct, window, and wnext == 0 - Special case for distance > 1 copies to do overlapped load and store copy - Explicit branch predictions (based on measured branch probabilities) - Deferring match copy and interspersed it with decoding subsequent codes diff --git a/neo/libs/zlib/inffast.h b/neo/libs/zlib/inffast.h index 1e88d2d9..e5c1aa4c 100644 --- a/neo/libs/zlib/inffast.h +++ b/neo/libs/zlib/inffast.h @@ -1,5 +1,5 @@ /* inffast.h -- header to use inffast.c - * Copyright (C) 1995-2003 Mark Adler + * Copyright (C) 1995-2003, 2010 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -8,4 +8,4 @@ subject to change. Applications should only use zlib.h. */ -void inflate_fast OF((z_streamp strm, unsigned start)); +void ZLIB_INTERNAL inflate_fast OF((z_streamp strm, unsigned start)); diff --git a/neo/libs/zlib/inffixed.h b/neo/libs/zlib/inffixed.h index 75ed4b59..d6283277 100644 --- a/neo/libs/zlib/inffixed.h +++ b/neo/libs/zlib/inffixed.h @@ -2,9 +2,9 @@ * Generated automatically by makefixed(). */ - /* WARNING: this file should *not* be used by applications. It - is part of the implementation of the compression library and - is subject to change. Applications should only use zlib.h. + /* WARNING: this file should *not* be used by applications. + It is part of the implementation of this library and is + subject to change. Applications should only use zlib.h. */ static const code lenfix[512] = { diff --git a/neo/libs/zlib/inflate.c b/neo/libs/zlib/inflate.c index 792fdee8..47418a1e 100644 --- a/neo/libs/zlib/inflate.c +++ b/neo/libs/zlib/inflate.c @@ -1,5 +1,5 @@ /* inflate.c -- zlib decompression - * Copyright (C) 1995-2005 Mark Adler + * Copyright (C) 1995-2012 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -45,7 +45,7 @@ * - Rearrange window copies in inflate_fast() for speed and simplification * - Unroll last copy for window match in inflate_fast() * - Use local copies of window variables in inflate_fast() for speed - * - Pull out common write == 0 case for speed in inflate_fast() + * - Pull out common wnext == 0 case for speed in inflate_fast() * - Make op and len in inflate_fast() unsigned for consistency * - Add FAR to lcode and dcode declarations in inflate_fast() * - Simplified bad distance check in inflate_fast() @@ -100,7 +100,7 @@ local int updatewindow OF((z_streamp strm, unsigned out)); local unsigned syncsearch OF((unsigned FAR *have, unsigned char FAR *buf, unsigned len)); -int ZEXPORT inflateReset(strm) +int ZEXPORT inflateResetKeep(strm) z_streamp strm; { struct inflate_state FAR *state; @@ -109,22 +109,123 @@ z_streamp strm; state = (struct inflate_state FAR *)strm->state; strm->total_in = strm->total_out = state->total = 0; strm->msg = Z_NULL; - strm->adler = 1; /* to support ill-conceived Java test suite */ + if (state->wrap) /* to support ill-conceived Java test suite */ + strm->adler = state->wrap & 1; state->mode = HEAD; state->last = 0; state->havedict = 0; state->dmax = 32768U; state->head = Z_NULL; - state->wsize = 0; - state->whave = 0; - state->write = 0; state->hold = 0; state->bits = 0; state->lencode = state->distcode = state->next = state->codes; + state->sane = 1; + state->back = -1; Tracev((stderr, "inflate: reset\n")); return Z_OK; } +int ZEXPORT inflateReset(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + state->wsize = 0; + state->whave = 0; + state->wnext = 0; + return inflateResetKeep(strm); +} + +int ZEXPORT inflateReset2(strm, windowBits) +z_streamp strm; +int windowBits; +{ + int wrap; + struct inflate_state FAR *state; + + /* get the state */ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + + /* extract wrap request from windowBits parameter */ + if (windowBits < 0) { + wrap = 0; + windowBits = -windowBits; + } + else { + wrap = (windowBits >> 4) + 1; +#ifdef GUNZIP + if (windowBits < 48) + windowBits &= 15; +#endif + } + + /* set number of window bits, free window if different */ + if (windowBits && (windowBits < 8 || windowBits > 15)) + return Z_STREAM_ERROR; + if (state->window != Z_NULL && state->wbits != (unsigned)windowBits) { + ZFREE(strm, state->window); + state->window = Z_NULL; + } + + /* update state and reset the rest of it */ + state->wrap = wrap; + state->wbits = (unsigned)windowBits; + return inflateReset(strm); +} + +int ZEXPORT inflateInit2_(strm, windowBits, version, stream_size) +z_streamp strm; +int windowBits; +const char *version; +int stream_size; +{ + int ret; + struct inflate_state FAR *state; + + if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || + stream_size != (int)(sizeof(z_stream))) + return Z_VERSION_ERROR; + if (strm == Z_NULL) return Z_STREAM_ERROR; + strm->msg = Z_NULL; /* in case we return an error */ + if (strm->zalloc == (alloc_func)0) { +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zalloc = zcalloc; + strm->opaque = (voidpf)0; +#endif + } + if (strm->zfree == (free_func)0) +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zfree = zcfree; +#endif + state = (struct inflate_state FAR *) + ZALLOC(strm, 1, sizeof(struct inflate_state)); + if (state == Z_NULL) return Z_MEM_ERROR; + Tracev((stderr, "inflate: allocated\n")); + strm->state = (struct internal_state FAR *)state; + state->window = Z_NULL; + ret = inflateReset2(strm, windowBits); + if (ret != Z_OK) { + ZFREE(strm, state); + strm->state = Z_NULL; + } + return ret; +} + +int ZEXPORT inflateInit_(strm, version, stream_size) +z_streamp strm; +const char *version; +int stream_size; +{ + return inflateInit2_(strm, DEF_WBITS, version, stream_size); +} + int ZEXPORT inflatePrime(strm, bits, value) z_streamp strm; int bits; @@ -134,6 +235,11 @@ int value; if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; + if (bits < 0) { + state->hold = 0; + state->bits = 0; + return Z_OK; + } if (bits > 16 || state->bits + bits > 32) return Z_STREAM_ERROR; value &= (1L << bits) - 1; state->hold += value << state->bits; @@ -141,57 +247,6 @@ int value; return Z_OK; } -int ZEXPORT inflateInit2_(strm, windowBits, version, stream_size) -z_streamp strm; -int windowBits; -const char *version; -int stream_size; -{ - struct inflate_state FAR *state; - - if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || - stream_size != (int)(sizeof(z_stream))) - return Z_VERSION_ERROR; - if (strm == Z_NULL) return Z_STREAM_ERROR; - strm->msg = Z_NULL; /* in case we return an error */ - if (strm->zalloc == (alloc_func)0) { - strm->zalloc = zcalloc; - strm->opaque = (voidpf)0; - } - if (strm->zfree == (free_func)0) strm->zfree = zcfree; - state = (struct inflate_state FAR *) - ZALLOC(strm, 1, sizeof(struct inflate_state)); - if (state == Z_NULL) return Z_MEM_ERROR; - Tracev((stderr, "inflate: allocated\n")); - strm->state = (struct internal_state FAR *)state; - if (windowBits < 0) { - state->wrap = 0; - windowBits = -windowBits; - } - else { - state->wrap = (windowBits >> 4) + 1; -#ifdef GUNZIP - if (windowBits < 48) windowBits &= 15; -#endif - } - if (windowBits < 8 || windowBits > 15) { - ZFREE(strm, state); - strm->state = Z_NULL; - return Z_STREAM_ERROR; - } - state->wbits = (unsigned)windowBits; - state->window = Z_NULL; - return inflateReset(strm); -} - -int ZEXPORT inflateInit_(strm, version, stream_size) -z_streamp strm; -const char *version; -int stream_size; -{ - return inflateInit2_(strm, DEF_WBITS, version, stream_size); -} - /* Return state with length and distance decoding tables and index sizes set to fixed code decoding. Normally this returns fixed tables from inffixed.h. @@ -286,8 +341,8 @@ void makefixed() low = 0; for (;;) { if ((low % 7) == 0) printf("\n "); - printf("{%u,%u,%d}", state.lencode[low].op, state.lencode[low].bits, - state.lencode[low].val); + printf("{%u,%u,%d}", (low & 127) == 99 ? 64 : state.lencode[low].op, + state.lencode[low].bits, state.lencode[low].val); if (++low == size) break; putchar(','); } @@ -340,7 +395,7 @@ unsigned out; /* if window not in use yet, initialize */ if (state->wsize == 0) { state->wsize = 1U << state->wbits; - state->write = 0; + state->wnext = 0; state->whave = 0; } @@ -348,22 +403,22 @@ unsigned out; copy = out - strm->avail_out; if (copy >= state->wsize) { zmemcpy(state->window, strm->next_out - state->wsize, state->wsize); - state->write = 0; + state->wnext = 0; state->whave = state->wsize; } else { - dist = state->wsize - state->write; + dist = state->wsize - state->wnext; if (dist > copy) dist = copy; - zmemcpy(state->window + state->write, strm->next_out - copy, dist); + zmemcpy(state->window + state->wnext, strm->next_out - copy, dist); copy -= dist; if (copy) { zmemcpy(state->window, strm->next_out - copy, copy); - state->write = copy; + state->wnext = copy; state->whave = state->wsize; } else { - state->write += dist; - if (state->write == state->wsize) state->write = 0; + state->wnext += dist; + if (state->wnext == state->wsize) state->wnext = 0; if (state->whave < state->wsize) state->whave += dist; } } @@ -464,11 +519,6 @@ unsigned out; bits -= bits & 7; \ } while (0) -/* Reverse the bytes in a 32-bit value */ -#define REVERSE(q) \ - ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \ - (((q) & 0xff00) << 8) + (((q) & 0xff) << 24)) - /* inflate() uses a state machine to process as much input data and generate as much output data as possible before returning. The state machine is @@ -564,7 +614,7 @@ int flush; unsigned in, out; /* save starting available input and output */ unsigned copy; /* number of stored or match bytes to copy */ unsigned char FAR *from; /* where to copy match bytes from */ - code this; /* current decoding table entry */ + code here; /* current decoding table entry */ code last; /* parent table entry */ unsigned len; /* length to copy for repeats, bits to drop */ int ret; /* return code */ @@ -619,7 +669,9 @@ int flush; } DROPBITS(4); len = BITS(4) + 8; - if (len > state->wbits) { + if (state->wbits == 0) + state->wbits = len; + else if (len > state->wbits) { strm->msg = (char *)"invalid window size"; state->mode = BAD; break; @@ -760,7 +812,7 @@ int flush; #endif case DICTID: NEEDBITS(32); - strm->adler = state->check = REVERSE(hold); + strm->adler = state->check = ZSWAP32(hold); INITBITS(); state->mode = DICT; case DICT: @@ -771,7 +823,7 @@ int flush; strm->adler = state->check = adler32(0L, Z_NULL, 0); state->mode = TYPE; case TYPE: - if (flush == Z_BLOCK) goto inf_leave; + if (flush == Z_BLOCK || flush == Z_TREES) goto inf_leave; case TYPEDO: if (state->last) { BYTEBITS(); @@ -791,7 +843,11 @@ int flush; fixedtables(state); Tracev((stderr, "inflate: fixed codes block%s\n", state->last ? " (last)" : "")); - state->mode = LEN; /* decode codes */ + state->mode = LEN_; /* decode codes */ + if (flush == Z_TREES) { + DROPBITS(2); + goto inf_leave; + } break; case 2: /* dynamic block */ Tracev((stderr, "inflate: dynamic codes block%s\n", @@ -816,6 +872,9 @@ int flush; Tracev((stderr, "inflate: stored length %u\n", state->length)); INITBITS(); + state->mode = COPY_; + if (flush == Z_TREES) goto inf_leave; + case COPY_: state->mode = COPY; case COPY: copy = state->length; @@ -876,19 +935,18 @@ int flush; case CODELENS: while (state->have < state->nlen + state->ndist) { for (;;) { - this = state->lencode[BITS(state->lenbits)]; - if ((unsigned)(this.bits) <= bits) break; + here = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(here.bits) <= bits) break; PULLBYTE(); } - if (this.val < 16) { - NEEDBITS(this.bits); - DROPBITS(this.bits); - state->lens[state->have++] = this.val; + if (here.val < 16) { + DROPBITS(here.bits); + state->lens[state->have++] = here.val; } else { - if (this.val == 16) { - NEEDBITS(this.bits + 2); - DROPBITS(this.bits); + if (here.val == 16) { + NEEDBITS(here.bits + 2); + DROPBITS(here.bits); if (state->have == 0) { strm->msg = (char *)"invalid bit length repeat"; state->mode = BAD; @@ -898,16 +956,16 @@ int flush; copy = 3 + BITS(2); DROPBITS(2); } - else if (this.val == 17) { - NEEDBITS(this.bits + 3); - DROPBITS(this.bits); + else if (here.val == 17) { + NEEDBITS(here.bits + 3); + DROPBITS(here.bits); len = 0; copy = 3 + BITS(3); DROPBITS(3); } else { - NEEDBITS(this.bits + 7); - DROPBITS(this.bits); + NEEDBITS(here.bits + 7); + DROPBITS(here.bits); len = 0; copy = 11 + BITS(7); DROPBITS(7); @@ -925,7 +983,16 @@ int flush; /* handle error breaks in while */ if (state->mode == BAD) break; - /* build code tables */ + /* check for end-of-block code (better have one) */ + if (state->lens[256] == 0) { + strm->msg = (char *)"invalid code -- missing end-of-block"; + state->mode = BAD; + break; + } + + /* build code tables -- note: do not change the lenbits or distbits + values here (9 and 6) without reading the comments in inftrees.h + concerning the ENOUGH constants, which depend on those values */ state->next = state->codes; state->lencode = (code const FAR *)(state->next); state->lenbits = 9; @@ -946,88 +1013,102 @@ int flush; break; } Tracev((stderr, "inflate: codes ok\n")); + state->mode = LEN_; + if (flush == Z_TREES) goto inf_leave; + case LEN_: state->mode = LEN; case LEN: if (have >= 6 && left >= 258) { RESTORE(); inflate_fast(strm, out); LOAD(); + if (state->mode == TYPE) + state->back = -1; break; } + state->back = 0; for (;;) { - this = state->lencode[BITS(state->lenbits)]; - if ((unsigned)(this.bits) <= bits) break; + here = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(here.bits) <= bits) break; PULLBYTE(); } - if (this.op && (this.op & 0xf0) == 0) { - last = this; + if (here.op && (here.op & 0xf0) == 0) { + last = here; for (;;) { - this = state->lencode[last.val + + here = state->lencode[last.val + (BITS(last.bits + last.op) >> last.bits)]; - if ((unsigned)(last.bits + this.bits) <= bits) break; + if ((unsigned)(last.bits + here.bits) <= bits) break; PULLBYTE(); } DROPBITS(last.bits); + state->back += last.bits; } - DROPBITS(this.bits); - state->length = (unsigned)this.val; - if ((int)(this.op) == 0) { - Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ? + DROPBITS(here.bits); + state->back += here.bits; + state->length = (unsigned)here.val; + if ((int)(here.op) == 0) { + Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? "inflate: literal '%c'\n" : - "inflate: literal 0x%02x\n", this.val)); + "inflate: literal 0x%02x\n", here.val)); state->mode = LIT; break; } - if (this.op & 32) { + if (here.op & 32) { Tracevv((stderr, "inflate: end of block\n")); + state->back = -1; state->mode = TYPE; break; } - if (this.op & 64) { + if (here.op & 64) { strm->msg = (char *)"invalid literal/length code"; state->mode = BAD; break; } - state->extra = (unsigned)(this.op) & 15; + state->extra = (unsigned)(here.op) & 15; state->mode = LENEXT; case LENEXT: if (state->extra) { NEEDBITS(state->extra); state->length += BITS(state->extra); DROPBITS(state->extra); + state->back += state->extra; } Tracevv((stderr, "inflate: length %u\n", state->length)); + state->was = state->length; state->mode = DIST; case DIST: for (;;) { - this = state->distcode[BITS(state->distbits)]; - if ((unsigned)(this.bits) <= bits) break; + here = state->distcode[BITS(state->distbits)]; + if ((unsigned)(here.bits) <= bits) break; PULLBYTE(); } - if ((this.op & 0xf0) == 0) { - last = this; + if ((here.op & 0xf0) == 0) { + last = here; for (;;) { - this = state->distcode[last.val + + here = state->distcode[last.val + (BITS(last.bits + last.op) >> last.bits)]; - if ((unsigned)(last.bits + this.bits) <= bits) break; + if ((unsigned)(last.bits + here.bits) <= bits) break; PULLBYTE(); } DROPBITS(last.bits); + state->back += last.bits; } - DROPBITS(this.bits); - if (this.op & 64) { + DROPBITS(here.bits); + state->back += here.bits; + if (here.op & 64) { strm->msg = (char *)"invalid distance code"; state->mode = BAD; break; } - state->offset = (unsigned)this.val; - state->extra = (unsigned)(this.op) & 15; + state->offset = (unsigned)here.val; + state->extra = (unsigned)(here.op) & 15; state->mode = DISTEXT; case DISTEXT: if (state->extra) { NEEDBITS(state->extra); state->offset += BITS(state->extra); DROPBITS(state->extra); + state->back += state->extra; } #ifdef INFLATE_STRICT if (state->offset > state->dmax) { @@ -1036,11 +1117,6 @@ int flush; break; } #endif - if (state->offset > state->whave + out - left) { - strm->msg = (char *)"invalid distance too far back"; - state->mode = BAD; - break; - } Tracevv((stderr, "inflate: distance %u\n", state->offset)); state->mode = MATCH; case MATCH: @@ -1048,12 +1124,32 @@ int flush; copy = out - left; if (state->offset > copy) { /* copy from window */ copy = state->offset - copy; - if (copy > state->write) { - copy -= state->write; + if (copy > state->whave) { + if (state->sane) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR + Trace((stderr, "inflate.c too far\n")); + copy -= state->whave; + if (copy > state->length) copy = state->length; + if (copy > left) copy = left; + left -= copy; + state->length -= copy; + do { + *put++ = 0; + } while (--copy); + if (state->length == 0) state->mode = LEN; + break; +#endif + } + if (copy > state->wnext) { + copy -= state->wnext; from = state->window + (state->wsize - copy); } else - from = state->window + (state->write - copy); + from = state->window + (state->wnext - copy); if (copy > state->length) copy = state->length; } else { /* copy from output */ @@ -1088,7 +1184,7 @@ int flush; #ifdef GUNZIP state->flags ? hold : #endif - REVERSE(hold)) != state->check) { + ZSWAP32(hold)) != state->check) { strm->msg = (char *)"incorrect data check"; state->mode = BAD; break; @@ -1132,7 +1228,8 @@ int flush; */ inf_leave: RESTORE(); - if (state->wsize || (state->mode < CHECK && out != strm->avail_out)) + if (state->wsize || (out != strm->avail_out && state->mode < BAD && + (state->mode < CHECK || flush != Z_FINISH))) if (updatewindow(strm, out)) { state->mode = MEM; return Z_MEM_ERROR; @@ -1146,7 +1243,8 @@ int flush; strm->adler = state->check = UPDATE(state->check, strm->next_out - out, out); strm->data_type = state->bits + (state->last ? 64 : 0) + - (state->mode == TYPE ? 128 : 0); + (state->mode == TYPE ? 128 : 0) + + (state->mode == LEN_ || state->mode == COPY_ ? 256 : 0); if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK) ret = Z_BUF_ERROR; return ret; @@ -1172,7 +1270,10 @@ const Bytef *dictionary; uInt dictLength; { struct inflate_state FAR *state; - unsigned long id; + unsigned long dictid; + unsigned char *next; + unsigned avail; + int ret; /* check state */ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; @@ -1180,29 +1281,27 @@ uInt dictLength; if (state->wrap != 0 && state->mode != DICT) return Z_STREAM_ERROR; - /* check for correct dictionary id */ + /* check for correct dictionary identifier */ if (state->mode == DICT) { - id = adler32(0L, Z_NULL, 0); - id = adler32(id, dictionary, dictLength); - if (id != state->check) + dictid = adler32(0L, Z_NULL, 0); + dictid = adler32(dictid, dictionary, dictLength); + if (dictid != state->check) return Z_DATA_ERROR; } - /* copy dictionary to window */ - if (updatewindow(strm, strm->avail_out)) { + /* copy dictionary to window using updatewindow(), which will amend the + existing dictionary if appropriate */ + next = strm->next_out; + avail = strm->avail_out; + strm->next_out = (Bytef *)dictionary + dictLength; + strm->avail_out = 0; + ret = updatewindow(strm, dictLength); + strm->avail_out = avail; + strm->next_out = next; + if (ret) { state->mode = MEM; return Z_MEM_ERROR; } - if (dictLength > state->wsize) { - zmemcpy(state->window, dictionary + dictLength - state->wsize, - state->wsize); - state->whave = state->wsize; - } - else { - zmemcpy(state->window + state->wsize - dictLength, dictionary, - dictLength); - state->whave = dictLength; - } state->havedict = 1; Tracev((stderr, "inflate: dictionary set\n")); return Z_OK; @@ -1350,8 +1449,8 @@ z_streamp source; } /* copy state */ - zmemcpy(dest, source, sizeof(z_stream)); - zmemcpy(copy, state, sizeof(struct inflate_state)); + zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream)); + zmemcpy((voidpf)copy, (voidpf)state, sizeof(struct inflate_state)); if (state->lencode >= state->codes && state->lencode <= state->codes + ENOUGH - 1) { copy->lencode = copy->codes + (state->lencode - state->codes); @@ -1366,3 +1465,32 @@ z_streamp source; dest->state = (struct internal_state FAR *)copy; return Z_OK; } + +int ZEXPORT inflateUndermine(strm, subvert) +z_streamp strm; +int subvert; +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + state->sane = !subvert; +#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR + return Z_OK; +#else + state->sane = 1; + return Z_DATA_ERROR; +#endif +} + +long ZEXPORT inflateMark(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return -1L << 16; + state = (struct inflate_state FAR *)strm->state; + return ((long)(state->back) << 16) + + (state->mode == COPY ? state->length : + (state->mode == MATCH ? state->was - state->length : 0)); +} diff --git a/neo/libs/zlib/inflate.h b/neo/libs/zlib/inflate.h index 07bd3e78..95f4986d 100644 --- a/neo/libs/zlib/inflate.h +++ b/neo/libs/zlib/inflate.h @@ -1,5 +1,5 @@ /* inflate.h -- internal inflate state definition - * Copyright (C) 1995-2004 Mark Adler + * Copyright (C) 1995-2009 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -32,11 +32,13 @@ typedef enum { TYPE, /* i: waiting for type bits, including last-flag bit */ TYPEDO, /* i: same, but skip check to exit inflate on new block */ STORED, /* i: waiting for stored size (length and complement) */ + COPY_, /* i/o: same as COPY below, but only first time in */ COPY, /* i/o: waiting for input or output to copy stored block */ TABLE, /* i: waiting for dynamic block table lengths */ LENLENS, /* i: waiting for code length code lengths */ CODELENS, /* i: waiting for length/lit and distance code lengths */ - LEN, /* i: waiting for length/lit code */ + LEN_, /* i: same as LEN below, but only first time in */ + LEN, /* i: waiting for length/lit/eob code */ LENEXT, /* i: waiting for length extra bits */ DIST, /* i: waiting for distance code */ DISTEXT, /* i: waiting for distance extra bits */ @@ -53,19 +55,21 @@ typedef enum { /* State transitions between above modes - - (most modes can go to the BAD or MEM mode -- not shown for clarity) + (most modes can go to BAD or MEM on error -- not shown for clarity) Process header: - HEAD -> (gzip) or (zlib) - (gzip) -> FLAGS -> TIME -> OS -> EXLEN -> EXTRA -> NAME - NAME -> COMMENT -> HCRC -> TYPE + HEAD -> (gzip) or (zlib) or (raw) + (gzip) -> FLAGS -> TIME -> OS -> EXLEN -> EXTRA -> NAME -> COMMENT -> + HCRC -> TYPE (zlib) -> DICTID or TYPE DICTID -> DICT -> TYPE + (raw) -> TYPEDO Read deflate blocks: - TYPE -> STORED or TABLE or LEN or CHECK - STORED -> COPY -> TYPE - TABLE -> LENLENS -> CODELENS -> LEN - Read deflate codes: + TYPE -> TYPEDO -> STORED or TABLE or LEN_ or CHECK + STORED -> COPY_ -> COPY -> TYPE + TABLE -> LENLENS -> CODELENS -> LEN_ + LEN_ -> LEN + Read deflate codes in fixed or dynamic block: LEN -> LENEXT or LIT or TYPE LENEXT -> DIST -> DISTEXT -> MATCH -> LEN LIT -> LEN @@ -73,7 +77,7 @@ typedef enum { CHECK -> LENGTH -> DONE */ -/* state maintained between inflate() calls. Approximately 7K bytes. */ +/* state maintained between inflate() calls. Approximately 10K bytes. */ struct inflate_state { inflate_mode mode; /* current inflate mode */ int last; /* true if processing last block */ @@ -88,7 +92,7 @@ struct inflate_state { unsigned wbits; /* log base 2 of requested window size */ unsigned wsize; /* window size or zero if not using window */ unsigned whave; /* valid bytes in the window */ - unsigned write; /* window write index */ + unsigned wnext; /* window write index */ unsigned char FAR *window; /* allocated sliding window, if needed */ /* bit accumulator */ unsigned long hold; /* input bit accumulator */ @@ -112,4 +116,7 @@ struct inflate_state { unsigned short lens[320]; /* temporary storage for code lengths */ unsigned short work[288]; /* work area for code table building */ code codes[ENOUGH]; /* space for code tables */ + int sane; /* if false, allow invalid distance too far */ + int back; /* bits back of last unprocessed length/lit */ + unsigned was; /* initial length of match */ }; diff --git a/neo/libs/zlib/inftrees.c b/neo/libs/zlib/inftrees.c index 8a9c13ff..abcd7c45 100644 --- a/neo/libs/zlib/inftrees.c +++ b/neo/libs/zlib/inftrees.c @@ -1,5 +1,5 @@ /* inftrees.c -- generate Huffman trees for efficient decoding - * Copyright (C) 1995-2005 Mark Adler + * Copyright (C) 1995-2012 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -9,7 +9,7 @@ #define MAXBITS 15 const char inflate_copyright[] = - " inflate 1.2.3 Copyright 1995-2005 Mark Adler "; + " inflate 1.2.7 Copyright 1995-2012 Mark Adler "; /* If you use the zlib library in a product, an acknowledgment is welcome in the documentation of your product. If for some reason you cannot @@ -29,7 +29,7 @@ const char inflate_copyright[] = table index bits. It will differ if the request is greater than the longest code or if it is less than the shortest code. */ -int inflate_table(type, lens, codes, table, bits, work) +int ZLIB_INTERNAL inflate_table(type, lens, codes, table, bits, work) codetype type; unsigned short FAR *lens; unsigned codes; @@ -50,7 +50,7 @@ unsigned short FAR *work; unsigned fill; /* index for replicating entries */ unsigned low; /* low bits for current root entry */ unsigned mask; /* mask for low root bits */ - code this; /* table entry for duplication */ + code here; /* table entry for duplication */ code FAR *next; /* next available space in table */ const unsigned short FAR *base; /* base value table to use */ const unsigned short FAR *extra; /* extra bits table to use */ @@ -62,7 +62,7 @@ unsigned short FAR *work; 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; static const unsigned short lext[31] = { /* Length codes 257..285 extra */ 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, - 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 201, 196}; + 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 78, 68}; static const unsigned short dbase[32] = { /* Distance codes 0..29 base */ 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, @@ -115,15 +115,15 @@ unsigned short FAR *work; if (count[max] != 0) break; if (root > max) root = max; if (max == 0) { /* no symbols to code at all */ - this.op = (unsigned char)64; /* invalid code marker */ - this.bits = (unsigned char)1; - this.val = (unsigned short)0; - *(*table)++ = this; /* make a table to force an error */ - *(*table)++ = this; + here.op = (unsigned char)64; /* invalid code marker */ + here.bits = (unsigned char)1; + here.val = (unsigned short)0; + *(*table)++ = here; /* make a table to force an error */ + *(*table)++ = here; *bits = 1; return 0; /* no symbols, but wait for decoding to report error */ } - for (min = 1; min <= MAXBITS; min++) + for (min = 1; min < max; min++) if (count[min] != 0) break; if (root < min) root = min; @@ -166,11 +166,10 @@ unsigned short FAR *work; entered in the tables. used keeps track of how many table entries have been allocated from the - provided *table space. It is checked when a LENS table is being made - against the space in *table, ENOUGH, minus the maximum space needed by - the worst case distance code, MAXD. This should never happen, but the - sufficiency of ENOUGH has not been proven exhaustively, hence the check. - This assumes that when type == LENS, bits == 9. + provided *table space. It is checked for LENS and DIST tables against + the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in + the initial root table size constants. See the comments in inftrees.h + for more information. sym increments through all symbols, and the loop terminates when all codes of length max, i.e. all codes, have been processed. This @@ -209,24 +208,25 @@ unsigned short FAR *work; mask = used - 1; /* mask for comparing low */ /* check available table space */ - if (type == LENS && used >= ENOUGH - MAXD) + if ((type == LENS && used >= ENOUGH_LENS) || + (type == DISTS && used >= ENOUGH_DISTS)) return 1; /* process all codes and make table entries */ for (;;) { /* create table entry */ - this.bits = (unsigned char)(len - drop); + here.bits = (unsigned char)(len - drop); if ((int)(work[sym]) < end) { - this.op = (unsigned char)0; - this.val = work[sym]; + here.op = (unsigned char)0; + here.val = work[sym]; } else if ((int)(work[sym]) > end) { - this.op = (unsigned char)(extra[work[sym]]); - this.val = base[work[sym]]; + here.op = (unsigned char)(extra[work[sym]]); + here.val = base[work[sym]]; } else { - this.op = (unsigned char)(32 + 64); /* end of block */ - this.val = 0; + here.op = (unsigned char)(32 + 64); /* end of block */ + here.val = 0; } /* replicate for those indices with low len bits equal to huff */ @@ -235,7 +235,7 @@ unsigned short FAR *work; min = fill; /* save offset to next table */ do { fill -= incr; - next[(huff >> drop) + fill] = this; + next[(huff >> drop) + fill] = here; } while (fill != 0); /* backwards increment the len-bit code huff */ @@ -277,7 +277,8 @@ unsigned short FAR *work; /* check for enough space */ used += 1U << curr; - if (type == LENS && used >= ENOUGH - MAXD) + if ((type == LENS && used >= ENOUGH_LENS) || + (type == DISTS && used >= ENOUGH_DISTS)) return 1; /* point entry in root table to sub-table */ @@ -288,38 +289,14 @@ unsigned short FAR *work; } } - /* - Fill in rest of table for incomplete codes. This loop is similar to the - loop above in incrementing huff for table indices. It is assumed that - len is equal to curr + drop, so there is no loop needed to increment - through high index bits. When the current sub-table is filled, the loop - drops back to the root table to fill in any remaining entries there. - */ - this.op = (unsigned char)64; /* invalid code marker */ - this.bits = (unsigned char)(len - drop); - this.val = (unsigned short)0; - while (huff != 0) { - /* when done with sub-table, drop back to root table */ - if (drop != 0 && (huff & mask) != low) { - drop = 0; - len = root; - next = *table; - this.bits = (unsigned char)len; - } - - /* put invalid code marker in table */ - next[huff >> drop] = this; - - /* backwards increment the len-bit code huff */ - incr = 1U << (len - 1); - while (huff & incr) - incr >>= 1; - if (incr != 0) { - huff &= incr - 1; - huff += incr; - } - else - huff = 0; + /* fill in remaining table entry if code is incomplete (guaranteed to have + at most one remaining entry, since if the code is incomplete, the + maximum code length that was allowed to get this far is one bit) */ + if (huff != 0) { + here.op = (unsigned char)64; /* invalid code marker */ + here.bits = (unsigned char)(len - drop); + here.val = (unsigned short)0; + next[huff] = here; } /* set return parameters */ diff --git a/neo/libs/zlib/inftrees.h b/neo/libs/zlib/inftrees.h index b1104c87..baa53a0b 100644 --- a/neo/libs/zlib/inftrees.h +++ b/neo/libs/zlib/inftrees.h @@ -1,5 +1,5 @@ /* inftrees.h -- header to use inftrees.c - * Copyright (C) 1995-2005 Mark Adler + * Copyright (C) 1995-2005, 2010 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -35,21 +35,28 @@ typedef struct { 01000000 - invalid code */ -/* Maximum size of dynamic tree. The maximum found in a long but non- - exhaustive search was 1444 code structures (852 for length/literals - and 592 for distances, the latter actually the result of an - exhaustive search). The true maximum is not known, but the value - below is more than safe. */ -#define ENOUGH 2048 -#define MAXD 592 +/* Maximum size of the dynamic table. The maximum number of code structures is + 1444, which is the sum of 852 for literal/length codes and 592 for distance + codes. These values were found by exhaustive searches using the program + examples/enough.c found in the zlib distribtution. The arguments to that + program are the number of symbols, the initial root table size, and the + maximum bit length of a code. "enough 286 9 15" for literal/length codes + returns returns 852, and "enough 30 6 15" for distance codes returns 592. + The initial root table size (9 or 6) is found in the fifth argument of the + inflate_table() calls in inflate.c and infback.c. If the root table size is + changed, then these maximum sizes would be need to be recalculated and + updated. */ +#define ENOUGH_LENS 852 +#define ENOUGH_DISTS 592 +#define ENOUGH (ENOUGH_LENS+ENOUGH_DISTS) -/* Type of code to build for inftable() */ +/* Type of code to build for inflate_table() */ typedef enum { CODES, LENS, DISTS } codetype; -extern int inflate_table OF((codetype type, unsigned short FAR *lens, +int ZLIB_INTERNAL inflate_table OF((codetype type, unsigned short FAR *lens, unsigned codes, code FAR * FAR *table, unsigned FAR *bits, unsigned short FAR *work)); diff --git a/neo/libs/zlib/trees.c b/neo/libs/zlib/trees.c index ce27b5cb..8c32b214 100644 --- a/neo/libs/zlib/trees.c +++ b/neo/libs/zlib/trees.c @@ -1,5 +1,6 @@ /* trees.c -- output deflated data using Huffman coding - * Copyright (C) 1995-2005 Jean-loup Gailly + * Copyright (C) 1995-2012 Jean-loup Gailly + * detect_data_type() function provided freely by Cosmin Truta, 2006 * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -73,11 +74,6 @@ local const uch bl_order[BL_CODES] * probability, to avoid transmitting the lengths for unused bit length codes. */ -#define Buf_size (8 * 2*sizeof(char)) -/* Number of bits used within bi_buf. (bi_buf might be implemented on - * more than 16 bits on some systems.) - */ - /* =========================================================================== * Local data. These are initialized only once. */ @@ -152,7 +148,7 @@ local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes, int blcodes)); local void compress_block OF((deflate_state *s, ct_data *ltree, ct_data *dtree)); -local void set_data_type OF((deflate_state *s)); +local int detect_data_type OF((deflate_state *s)); local unsigned bi_reverse OF((unsigned value, int length)); local void bi_windup OF((deflate_state *s)); local void bi_flush OF((deflate_state *s)); @@ -203,12 +199,12 @@ local void send_bits(s, value, length) * unused bits in value. */ if (s->bi_valid > (int)Buf_size - length) { - s->bi_buf |= (value << s->bi_valid); + s->bi_buf |= (ush)value << s->bi_valid; put_short(s, s->bi_buf); s->bi_buf = (ush)value >> (Buf_size - s->bi_valid); s->bi_valid += length - Buf_size; } else { - s->bi_buf |= value << s->bi_valid; + s->bi_buf |= (ush)value << s->bi_valid; s->bi_valid += length; } } @@ -218,12 +214,12 @@ local void send_bits(s, value, length) { int len = length;\ if (s->bi_valid > (int)Buf_size - len) {\ int val = value;\ - s->bi_buf |= (val << s->bi_valid);\ + s->bi_buf |= (ush)val << s->bi_valid;\ put_short(s, s->bi_buf);\ - s->bi_buf = (ush)val >> ((int)Buf_size - s->bi_valid);\ + s->bi_buf = (ush)val >> (Buf_size - s->bi_valid);\ s->bi_valid += len - Buf_size;\ } else {\ - s->bi_buf |= (value) << s->bi_valid;\ + s->bi_buf |= (ush)(value) << s->bi_valid;\ s->bi_valid += len;\ }\ } @@ -250,11 +246,13 @@ local void tr_static_init() if (static_init_done) return; /* For some embedded targets, global variables are not initialized: */ +#ifdef NO_INIT_GLOBAL_POINTERS static_l_desc.static_tree = static_ltree; static_l_desc.extra_bits = extra_lbits; static_d_desc.static_tree = static_dtree; static_d_desc.extra_bits = extra_dbits; static_bl_desc.extra_bits = extra_blbits; +#endif /* Initialize the mapping length (0..255) -> length code (0..28) */ length = 0; @@ -348,13 +346,14 @@ void gen_trees_header() static_dtree[i].Len, SEPARATOR(i, D_CODES-1, 5)); } - fprintf(header, "const uch _dist_code[DIST_CODE_LEN] = {\n"); + fprintf(header, "const uch ZLIB_INTERNAL _dist_code[DIST_CODE_LEN] = {\n"); for (i = 0; i < DIST_CODE_LEN; i++) { fprintf(header, "%2u%s", _dist_code[i], SEPARATOR(i, DIST_CODE_LEN-1, 20)); } - fprintf(header, "const uch _length_code[MAX_MATCH-MIN_MATCH+1]= {\n"); + fprintf(header, + "const uch ZLIB_INTERNAL _length_code[MAX_MATCH-MIN_MATCH+1]= {\n"); for (i = 0; i < MAX_MATCH-MIN_MATCH+1; i++) { fprintf(header, "%2u%s", _length_code[i], SEPARATOR(i, MAX_MATCH-MIN_MATCH, 20)); @@ -379,7 +378,7 @@ void gen_trees_header() /* =========================================================================== * Initialize the tree data structures for a new zlib stream. */ -void _tr_init(s) +void ZLIB_INTERNAL _tr_init(s) deflate_state *s; { tr_static_init(); @@ -395,7 +394,6 @@ void _tr_init(s) s->bi_buf = 0; s->bi_valid = 0; - s->last_eob_len = 8; /* enough lookahead for inflate */ #ifdef DEBUG s->compressed_len = 0L; s->bits_sent = 0L; @@ -864,13 +862,13 @@ local void send_all_trees(s, lcodes, dcodes, blcodes) /* =========================================================================== * Send a stored block */ -void _tr_stored_block(s, buf, stored_len, eof) +void ZLIB_INTERNAL _tr_stored_block(s, buf, stored_len, last) deflate_state *s; charf *buf; /* input block */ ulg stored_len; /* length of input block */ - int eof; /* true if this is the last block for a file */ + int last; /* one if this is the last block for a file */ { - send_bits(s, (STORED_BLOCK<<1)+eof, 3); /* send block type */ + send_bits(s, (STORED_BLOCK<<1)+last, 3); /* send block type */ #ifdef DEBUG s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L; s->compressed_len += (stored_len + 4) << 3; @@ -878,18 +876,20 @@ void _tr_stored_block(s, buf, stored_len, eof) copy_block(s, buf, (unsigned)stored_len, 1); /* with header */ } +/* =========================================================================== + * Flush the bits in the bit buffer to pending output (leaves at most 7 bits) + */ +void ZLIB_INTERNAL _tr_flush_bits(s) + deflate_state *s; +{ + bi_flush(s); +} + /* =========================================================================== * Send one empty static block to give enough lookahead for inflate. * This takes 10 bits, of which 7 may remain in the bit buffer. - * The current inflate code requires 9 bits of lookahead. If the - * last two codes for the previous block (real code plus EOB) were coded - * on 5 bits or less, inflate may have only 5+3 bits of lookahead to decode - * the last real code. In this case we send two empty static blocks instead - * of one. (There are no problems if the previous block is stored or fixed.) - * To simplify the code, we assume the worst case of last real code encoded - * on one bit only. */ -void _tr_align(s) +void ZLIB_INTERNAL _tr_align(s) deflate_state *s; { send_bits(s, STATIC_TREES<<1, 3); @@ -898,31 +898,17 @@ void _tr_align(s) s->compressed_len += 10L; /* 3 for block type, 7 for EOB */ #endif bi_flush(s); - /* Of the 10 bits for the empty block, we have already sent - * (10 - bi_valid) bits. The lookahead for the last real code (before - * the EOB of the previous block) was thus at least one plus the length - * of the EOB plus what we have just sent of the empty static block. - */ - if (1 + s->last_eob_len + 10 - s->bi_valid < 9) { - send_bits(s, STATIC_TREES<<1, 3); - send_code(s, END_BLOCK, static_ltree); -#ifdef DEBUG - s->compressed_len += 10L; -#endif - bi_flush(s); - } - s->last_eob_len = 7; } /* =========================================================================== * Determine the best encoding for the current block: dynamic trees, static * trees or store, and output the encoded block to the zip file. */ -void _tr_flush_block(s, buf, stored_len, eof) +void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last) deflate_state *s; charf *buf; /* input block, or NULL if too old */ ulg stored_len; /* length of input block */ - int eof; /* true if this is the last block for a file */ + int last; /* one if this is the last block for a file */ { ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */ int max_blindex = 0; /* index of last bit length code of non zero freq */ @@ -931,8 +917,8 @@ void _tr_flush_block(s, buf, stored_len, eof) if (s->level > 0) { /* Check if the file is binary or text */ - if (stored_len > 0 && s->strm->data_type == Z_UNKNOWN) - set_data_type(s); + if (s->strm->data_type == Z_UNKNOWN) + s->strm->data_type = detect_data_type(s); /* Construct the literal and distance trees */ build_tree(s, (tree_desc *)(&(s->l_desc))); @@ -978,20 +964,20 @@ void _tr_flush_block(s, buf, stored_len, eof) * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to * transform a block into a stored block. */ - _tr_stored_block(s, buf, stored_len, eof); + _tr_stored_block(s, buf, stored_len, last); #ifdef FORCE_STATIC } else if (static_lenb >= 0) { /* force static trees */ #else } else if (s->strategy == Z_FIXED || static_lenb == opt_lenb) { #endif - send_bits(s, (STATIC_TREES<<1)+eof, 3); + send_bits(s, (STATIC_TREES<<1)+last, 3); compress_block(s, (ct_data *)static_ltree, (ct_data *)static_dtree); #ifdef DEBUG s->compressed_len += 3 + s->static_len; #endif } else { - send_bits(s, (DYN_TREES<<1)+eof, 3); + send_bits(s, (DYN_TREES<<1)+last, 3); send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1, max_blindex+1); compress_block(s, (ct_data *)s->dyn_ltree, (ct_data *)s->dyn_dtree); @@ -1005,21 +991,21 @@ void _tr_flush_block(s, buf, stored_len, eof) */ init_block(s); - if (eof) { + if (last) { bi_windup(s); #ifdef DEBUG s->compressed_len += 7; /* align on byte boundary */ #endif } Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, - s->compressed_len-7*eof)); + s->compressed_len-7*last)); } /* =========================================================================== * Save the match info and tally the frequency counts. Return true if * the current block must be flushed. */ -int _tr_tally (s, dist, lc) +int ZLIB_INTERNAL _tr_tally (s, dist, lc) deflate_state *s; unsigned dist; /* distance of matched string */ unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ @@ -1114,28 +1100,48 @@ local void compress_block(s, ltree, dtree) } while (lx < s->last_lit); send_code(s, END_BLOCK, ltree); - s->last_eob_len = ltree[END_BLOCK].Len; } /* =========================================================================== - * Set the data type to BINARY or TEXT, using a crude approximation: - * set it to Z_TEXT if all symbols are either printable characters (33 to 255) - * or white spaces (9 to 13, or 32); or set it to Z_BINARY otherwise. + * Check if the data type is TEXT or BINARY, using the following algorithm: + * - TEXT if the two conditions below are satisfied: + * a) There are no non-portable control characters belonging to the + * "black list" (0..6, 14..25, 28..31). + * b) There is at least one printable character belonging to the + * "white list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255). + * - BINARY otherwise. + * - The following partially-portable control characters form a + * "gray list" that is ignored in this detection algorithm: + * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}). * IN assertion: the fields Freq of dyn_ltree are set. */ -local void set_data_type(s) +local int detect_data_type(s) deflate_state *s; { + /* black_mask is the bit mask of black-listed bytes + * set bits 0..6, 14..25, and 28..31 + * 0xf3ffc07f = binary 11110011111111111100000001111111 + */ + unsigned long black_mask = 0xf3ffc07fUL; int n; - for (n = 0; n < 9; n++) + /* Check for non-textual ("black-listed") bytes. */ + for (n = 0; n <= 31; n++, black_mask >>= 1) + if ((black_mask & 1) && (s->dyn_ltree[n].Freq != 0)) + return Z_BINARY; + + /* Check for textual ("white-listed") bytes. */ + if (s->dyn_ltree[9].Freq != 0 || s->dyn_ltree[10].Freq != 0 + || s->dyn_ltree[13].Freq != 0) + return Z_TEXT; + for (n = 32; n < LITERALS; n++) if (s->dyn_ltree[n].Freq != 0) - break; - if (n == 9) - for (n = 14; n < 32; n++) - if (s->dyn_ltree[n].Freq != 0) - break; - s->strm->data_type = (n == 32) ? Z_TEXT : Z_BINARY; + return Z_TEXT; + + /* There are no "black-listed" or "white-listed" bytes: + * this stream either is empty or has tolerated ("gray-listed") bytes only. + */ + return Z_BINARY; } /* =========================================================================== @@ -1201,7 +1207,6 @@ local void copy_block(s, buf, len, header) int header; /* true if block header must be written */ { bi_windup(s); /* align on byte boundary */ - s->last_eob_len = 8; /* enough lookahead for inflate */ if (header) { put_short(s, (ush)len); diff --git a/neo/libs/zlib/trees.h b/neo/libs/zlib/trees.h index 72facf90..d35639d8 100644 --- a/neo/libs/zlib/trees.h +++ b/neo/libs/zlib/trees.h @@ -70,7 +70,7 @@ local const ct_data static_dtree[D_CODES] = { {{19},{ 5}}, {{11},{ 5}}, {{27},{ 5}}, {{ 7},{ 5}}, {{23},{ 5}} }; -const uch _dist_code[DIST_CODE_LEN] = { +const uch ZLIB_INTERNAL _dist_code[DIST_CODE_LEN] = { 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, @@ -99,7 +99,7 @@ const uch _dist_code[DIST_CODE_LEN] = { 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29 }; -const uch _length_code[MAX_MATCH-MIN_MATCH+1]= { +const uch ZLIB_INTERNAL _length_code[MAX_MATCH-MIN_MATCH+1]= { 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, diff --git a/neo/libs/zlib/uncompr.c b/neo/libs/zlib/uncompr.c index b59e3d0d..ad98be3a 100644 --- a/neo/libs/zlib/uncompr.c +++ b/neo/libs/zlib/uncompr.c @@ -1,5 +1,5 @@ /* uncompr.c -- decompress a memory buffer - * Copyright (C) 1995-2003 Jean-loup Gailly. + * Copyright (C) 1995-2003, 2010 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -16,8 +16,6 @@ been saved previously by the compressor and transmitted to the decompressor by some mechanism outside the scope of this compression library.) Upon exit, destLen is the actual size of the compressed buffer. - This function can be used to decompress a whole file at once if the - input file is mmap'ed. uncompress returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if there was not enough room in the output diff --git a/neo/libs/zlib/zconf.h b/neo/libs/zlib/zconf.h index 03a9431c..8a46a58b 100644 --- a/neo/libs/zlib/zconf.h +++ b/neo/libs/zlib/zconf.h @@ -1,5 +1,5 @@ /* zconf.h -- configuration of the zlib compression library - * Copyright (C) 1995-2005 Jean-loup Gailly. + * Copyright (C) 1995-2012 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -11,52 +11,142 @@ /* * If you *really* need a unique prefix for all types and library functions, * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. + * Even better than compiling with -DZ_PREFIX would be to use configure to set + * this permanently in zconf.h using "./configure --zprefix". */ -#ifdef Z_PREFIX -# define deflateInit_ z_deflateInit_ +#ifdef Z_PREFIX /* may be set to #if 1 by ./configure */ +# define Z_PREFIX_SET + +/* all linked symbols */ +# define _dist_code z__dist_code +# define _length_code z__length_code +# define _tr_align z__tr_align +# define _tr_flush_block z__tr_flush_block +# define _tr_init z__tr_init +# define _tr_stored_block z__tr_stored_block +# define _tr_tally z__tr_tally +# define adler32 z_adler32 +# define adler32_combine z_adler32_combine +# define adler32_combine64 z_adler32_combine64 +# ifndef Z_SOLO +# define compress z_compress +# define compress2 z_compress2 +# define compressBound z_compressBound +# endif +# define crc32 z_crc32 +# define crc32_combine z_crc32_combine +# define crc32_combine64 z_crc32_combine64 # define deflate z_deflate -# define deflateEnd z_deflateEnd -# define inflateInit_ z_inflateInit_ -# define inflate z_inflate -# define inflateEnd z_inflateEnd -# define deflateInit2_ z_deflateInit2_ -# define deflateSetDictionary z_deflateSetDictionary -# define deflateCopy z_deflateCopy -# define deflateReset z_deflateReset -# define deflateParams z_deflateParams # define deflateBound z_deflateBound +# define deflateCopy z_deflateCopy +# define deflateEnd z_deflateEnd +# define deflateInit2_ z_deflateInit2_ +# define deflateInit_ z_deflateInit_ +# define deflateParams z_deflateParams +# define deflatePending z_deflatePending # define deflatePrime z_deflatePrime +# define deflateReset z_deflateReset +# define deflateResetKeep z_deflateResetKeep +# define deflateSetDictionary z_deflateSetDictionary +# define deflateSetHeader z_deflateSetHeader +# define deflateTune z_deflateTune +# define deflate_copyright z_deflate_copyright +# define get_crc_table z_get_crc_table +# ifndef Z_SOLO +# define gz_error z_gz_error +# define gz_intmax z_gz_intmax +# define gz_strwinerror z_gz_strwinerror +# define gzbuffer z_gzbuffer +# define gzclearerr z_gzclearerr +# define gzclose z_gzclose +# define gzclose_r z_gzclose_r +# define gzclose_w z_gzclose_w +# define gzdirect z_gzdirect +# define gzdopen z_gzdopen +# define gzeof z_gzeof +# define gzerror z_gzerror +# define gzflush z_gzflush +# define gzgetc z_gzgetc +# define gzgetc_ z_gzgetc_ +# define gzgets z_gzgets +# define gzoffset z_gzoffset +# define gzoffset64 z_gzoffset64 +# define gzopen z_gzopen +# define gzopen64 z_gzopen64 +# ifdef _WIN32 +# define gzopen_w z_gzopen_w +# endif +# define gzprintf z_gzprintf +# define gzputc z_gzputc +# define gzputs z_gzputs +# define gzread z_gzread +# define gzrewind z_gzrewind +# define gzseek z_gzseek +# define gzseek64 z_gzseek64 +# define gzsetparams z_gzsetparams +# define gztell z_gztell +# define gztell64 z_gztell64 +# define gzungetc z_gzungetc +# define gzwrite z_gzwrite +# endif +# define inflate z_inflate +# define inflateBack z_inflateBack +# define inflateBackEnd z_inflateBackEnd +# define inflateBackInit_ z_inflateBackInit_ +# define inflateCopy z_inflateCopy +# define inflateEnd z_inflateEnd +# define inflateGetHeader z_inflateGetHeader # define inflateInit2_ z_inflateInit2_ +# define inflateInit_ z_inflateInit_ +# define inflateMark z_inflateMark +# define inflatePrime z_inflatePrime +# define inflateReset z_inflateReset +# define inflateReset2 z_inflateReset2 # define inflateSetDictionary z_inflateSetDictionary # define inflateSync z_inflateSync # define inflateSyncPoint z_inflateSyncPoint -# define inflateCopy z_inflateCopy -# define inflateReset z_inflateReset -# define inflateBack z_inflateBack -# define inflateBackEnd z_inflateBackEnd -# define compress z_compress -# define compress2 z_compress2 -# define compressBound z_compressBound -# define uncompress z_uncompress -# define adler32 z_adler32 -# define crc32 z_crc32 -# define get_crc_table z_get_crc_table +# define inflateUndermine z_inflateUndermine +# define inflateResetKeep z_inflateResetKeep +# define inflate_copyright z_inflate_copyright +# define inflate_fast z_inflate_fast +# define inflate_table z_inflate_table +# ifndef Z_SOLO +# define uncompress z_uncompress +# endif # define zError z_zError +# ifndef Z_SOLO +# define zcalloc z_zcalloc +# define zcfree z_zcfree +# endif +# define zlibCompileFlags z_zlibCompileFlags +# define zlibVersion z_zlibVersion -# define alloc_func z_alloc_func -# define free_func z_free_func -# define in_func z_in_func -# define out_func z_out_func +/* all zlib typedefs in zlib.h and zconf.h */ # define Byte z_Byte -# define uInt z_uInt -# define uLong z_uLong # define Bytef z_Bytef +# define alloc_func z_alloc_func # define charf z_charf +# define free_func z_free_func +# ifndef Z_SOLO +# define gzFile z_gzFile +# endif +# define gz_header z_gz_header +# define gz_headerp z_gz_headerp +# define in_func z_in_func # define intf z_intf +# define out_func z_out_func +# define uInt z_uInt # define uIntf z_uIntf +# define uLong z_uLong # define uLongf z_uLongf -# define voidpf z_voidpf # define voidp z_voidp +# define voidpc z_voidpc +# define voidpf z_voidpf + +/* all zlib structs in zlib.h and zconf.h */ +# define gz_header_s z_gz_header_s +# define internal_state z_internal_state + #endif #if defined(__MSDOS__) && !defined(MSDOS) @@ -125,6 +215,12 @@ # endif #endif +#if defined(ZLIB_CONST) && !defined(z_const) +# define z_const const +#else +# define z_const +#endif + /* Some Mac compilers merge all .h files incorrectly: */ #if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__) # define NO_DUMMY_DECL @@ -171,6 +267,14 @@ # endif #endif +#ifndef Z_ARG /* function prototypes for stdarg */ +# if defined(STDC) || defined(Z_HAVE_STDARG_H) +# define Z_ARG(args) args +# else +# define Z_ARG(args) () +# endif +#endif + /* The following definitions for FAR are needed only for MSDOS mixed * model programming (small or medium model with some far allocations). * This was tested only with MSC; for other MSDOS compilers you may have @@ -284,49 +388,119 @@ typedef uLong FAR uLongf; typedef Byte *voidp; #endif -#if 0 /* HAVE_UNISTD_H -- this line is updated by ./configure */ -# include /* for off_t */ -# include /* for SEEK_* and off_t */ -# ifdef VMS -# include /* for off_t */ +/* ./configure may #define Z_U4 here */ + +#if !defined(Z_U4) && !defined(Z_SOLO) && defined(STDC) +# include +# if (UINT_MAX == 0xffffffffUL) +# define Z_U4 unsigned +# else +# if (ULONG_MAX == 0xffffffffUL) +# define Z_U4 unsigned long +# else +# if (USHRT_MAX == 0xffffffffUL) +# define Z_U4 unsigned short +# endif +# endif # endif -# define z_off_t off_t #endif -#ifndef SEEK_SET + +#ifdef Z_U4 + typedef Z_U4 z_crc_t; +#else + typedef unsigned long z_crc_t; +#endif + +#ifdef HAVE_UNISTD_H /* may be set to #if 1 by ./configure */ +# define Z_HAVE_UNISTD_H +#endif + +#ifdef HAVE_STDARG_H /* may be set to #if 1 by ./configure */ +# define Z_HAVE_STDARG_H +#endif + +#ifdef STDC +# ifndef Z_SOLO +# include /* for off_t */ +# endif +#endif + +#ifdef _WIN32 +# include /* for wchar_t */ +#endif + +/* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and + * "#define _LARGEFILE64_SOURCE 1" as requesting 64-bit operations, (even + * though the former does not conform to the LFS document), but considering + * both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as + * equivalently requesting no 64-bit operations + */ +#if defined(LARGEFILE64_SOURCE) && -_LARGEFILE64_SOURCE - -1 == 1 +# undef _LARGEFILE64_SOURCE +#endif + +#if defined(__WATCOMC__) && !defined(Z_HAVE_UNISTD_H) +# define Z_HAVE_UNISTD_H +#endif +#ifndef Z_SOLO +# if defined(Z_HAVE_UNISTD_H) || defined(LARGEFILE64_SOURCE) +# include /* for SEEK_*, off_t, and _LFS64_LARGEFILE */ +# ifdef VMS +# include /* for off_t */ +# endif +# ifndef z_off_t +# define z_off_t off_t +# endif +# endif +#endif + +#if defined(_LFS64_LARGEFILE) && _LFS64_LARGEFILE-0 +# define Z_LFS64 +#endif + +#if defined(_LARGEFILE64_SOURCE) && defined(Z_LFS64) +# define Z_LARGE64 +#endif + +#if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS-0 == 64 && defined(Z_LFS64) +# define Z_WANT64 +#endif + +#if !defined(SEEK_SET) && !defined(Z_SOLO) # define SEEK_SET 0 /* Seek from beginning of file. */ # define SEEK_CUR 1 /* Seek from current position. */ # define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ #endif + #ifndef z_off_t # define z_off_t long #endif -#if defined(__OS400__) -# define NO_vsnprintf -#endif - -#if defined(__MVS__) -# define NO_vsnprintf -# ifdef FAR -# undef FAR +#if !defined(_WIN32) && defined(Z_LARGE64) +# define z_off64_t off64_t +#else +# if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO) +# define z_off64_t __int64 +# else +# define z_off64_t z_off_t # endif #endif /* MVS linker does not support external names larger than 8 bytes */ #if defined(__MVS__) -# pragma map(deflateInit_,"DEIN") -# pragma map(deflateInit2_,"DEIN2") -# pragma map(deflateEnd,"DEEND") -# pragma map(deflateBound,"DEBND") -# pragma map(inflateInit_,"ININ") -# pragma map(inflateInit2_,"ININ2") -# pragma map(inflateEnd,"INEND") -# pragma map(inflateSync,"INSY") -# pragma map(inflateSetDictionary,"INSEDI") -# pragma map(compressBound,"CMBND") -# pragma map(inflate_table,"INTABL") -# pragma map(inflate_fast,"INFA") -# pragma map(inflate_copyright,"INCOPY") + #pragma map(deflateInit_,"DEIN") + #pragma map(deflateInit2_,"DEIN2") + #pragma map(deflateEnd,"DEEND") + #pragma map(deflateBound,"DEBND") + #pragma map(inflateInit_,"ININ") + #pragma map(inflateInit2_,"ININ2") + #pragma map(inflateEnd,"INEND") + #pragma map(inflateSync,"INSY") + #pragma map(inflateSetDictionary,"INSEDI") + #pragma map(compressBound,"CMBND") + #pragma map(inflate_table,"INTABL") + #pragma map(inflate_fast,"INFA") + #pragma map(inflate_copyright,"INCOPY") #endif #endif /* ZCONF_H */ diff --git a/neo/libs/zlib/zconf.in.h b/neo/libs/zlib/zconf.h.in similarity index 55% rename from neo/libs/zlib/zconf.in.h rename to neo/libs/zlib/zconf.h.in index 03a9431c..8a46a58b 100644 --- a/neo/libs/zlib/zconf.in.h +++ b/neo/libs/zlib/zconf.h.in @@ -1,5 +1,5 @@ /* zconf.h -- configuration of the zlib compression library - * Copyright (C) 1995-2005 Jean-loup Gailly. + * Copyright (C) 1995-2012 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -11,52 +11,142 @@ /* * If you *really* need a unique prefix for all types and library functions, * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. + * Even better than compiling with -DZ_PREFIX would be to use configure to set + * this permanently in zconf.h using "./configure --zprefix". */ -#ifdef Z_PREFIX -# define deflateInit_ z_deflateInit_ +#ifdef Z_PREFIX /* may be set to #if 1 by ./configure */ +# define Z_PREFIX_SET + +/* all linked symbols */ +# define _dist_code z__dist_code +# define _length_code z__length_code +# define _tr_align z__tr_align +# define _tr_flush_block z__tr_flush_block +# define _tr_init z__tr_init +# define _tr_stored_block z__tr_stored_block +# define _tr_tally z__tr_tally +# define adler32 z_adler32 +# define adler32_combine z_adler32_combine +# define adler32_combine64 z_adler32_combine64 +# ifndef Z_SOLO +# define compress z_compress +# define compress2 z_compress2 +# define compressBound z_compressBound +# endif +# define crc32 z_crc32 +# define crc32_combine z_crc32_combine +# define crc32_combine64 z_crc32_combine64 # define deflate z_deflate -# define deflateEnd z_deflateEnd -# define inflateInit_ z_inflateInit_ -# define inflate z_inflate -# define inflateEnd z_inflateEnd -# define deflateInit2_ z_deflateInit2_ -# define deflateSetDictionary z_deflateSetDictionary -# define deflateCopy z_deflateCopy -# define deflateReset z_deflateReset -# define deflateParams z_deflateParams # define deflateBound z_deflateBound +# define deflateCopy z_deflateCopy +# define deflateEnd z_deflateEnd +# define deflateInit2_ z_deflateInit2_ +# define deflateInit_ z_deflateInit_ +# define deflateParams z_deflateParams +# define deflatePending z_deflatePending # define deflatePrime z_deflatePrime +# define deflateReset z_deflateReset +# define deflateResetKeep z_deflateResetKeep +# define deflateSetDictionary z_deflateSetDictionary +# define deflateSetHeader z_deflateSetHeader +# define deflateTune z_deflateTune +# define deflate_copyright z_deflate_copyright +# define get_crc_table z_get_crc_table +# ifndef Z_SOLO +# define gz_error z_gz_error +# define gz_intmax z_gz_intmax +# define gz_strwinerror z_gz_strwinerror +# define gzbuffer z_gzbuffer +# define gzclearerr z_gzclearerr +# define gzclose z_gzclose +# define gzclose_r z_gzclose_r +# define gzclose_w z_gzclose_w +# define gzdirect z_gzdirect +# define gzdopen z_gzdopen +# define gzeof z_gzeof +# define gzerror z_gzerror +# define gzflush z_gzflush +# define gzgetc z_gzgetc +# define gzgetc_ z_gzgetc_ +# define gzgets z_gzgets +# define gzoffset z_gzoffset +# define gzoffset64 z_gzoffset64 +# define gzopen z_gzopen +# define gzopen64 z_gzopen64 +# ifdef _WIN32 +# define gzopen_w z_gzopen_w +# endif +# define gzprintf z_gzprintf +# define gzputc z_gzputc +# define gzputs z_gzputs +# define gzread z_gzread +# define gzrewind z_gzrewind +# define gzseek z_gzseek +# define gzseek64 z_gzseek64 +# define gzsetparams z_gzsetparams +# define gztell z_gztell +# define gztell64 z_gztell64 +# define gzungetc z_gzungetc +# define gzwrite z_gzwrite +# endif +# define inflate z_inflate +# define inflateBack z_inflateBack +# define inflateBackEnd z_inflateBackEnd +# define inflateBackInit_ z_inflateBackInit_ +# define inflateCopy z_inflateCopy +# define inflateEnd z_inflateEnd +# define inflateGetHeader z_inflateGetHeader # define inflateInit2_ z_inflateInit2_ +# define inflateInit_ z_inflateInit_ +# define inflateMark z_inflateMark +# define inflatePrime z_inflatePrime +# define inflateReset z_inflateReset +# define inflateReset2 z_inflateReset2 # define inflateSetDictionary z_inflateSetDictionary # define inflateSync z_inflateSync # define inflateSyncPoint z_inflateSyncPoint -# define inflateCopy z_inflateCopy -# define inflateReset z_inflateReset -# define inflateBack z_inflateBack -# define inflateBackEnd z_inflateBackEnd -# define compress z_compress -# define compress2 z_compress2 -# define compressBound z_compressBound -# define uncompress z_uncompress -# define adler32 z_adler32 -# define crc32 z_crc32 -# define get_crc_table z_get_crc_table +# define inflateUndermine z_inflateUndermine +# define inflateResetKeep z_inflateResetKeep +# define inflate_copyright z_inflate_copyright +# define inflate_fast z_inflate_fast +# define inflate_table z_inflate_table +# ifndef Z_SOLO +# define uncompress z_uncompress +# endif # define zError z_zError +# ifndef Z_SOLO +# define zcalloc z_zcalloc +# define zcfree z_zcfree +# endif +# define zlibCompileFlags z_zlibCompileFlags +# define zlibVersion z_zlibVersion -# define alloc_func z_alloc_func -# define free_func z_free_func -# define in_func z_in_func -# define out_func z_out_func +/* all zlib typedefs in zlib.h and zconf.h */ # define Byte z_Byte -# define uInt z_uInt -# define uLong z_uLong # define Bytef z_Bytef +# define alloc_func z_alloc_func # define charf z_charf +# define free_func z_free_func +# ifndef Z_SOLO +# define gzFile z_gzFile +# endif +# define gz_header z_gz_header +# define gz_headerp z_gz_headerp +# define in_func z_in_func # define intf z_intf +# define out_func z_out_func +# define uInt z_uInt # define uIntf z_uIntf +# define uLong z_uLong # define uLongf z_uLongf -# define voidpf z_voidpf # define voidp z_voidp +# define voidpc z_voidpc +# define voidpf z_voidpf + +/* all zlib structs in zlib.h and zconf.h */ +# define gz_header_s z_gz_header_s +# define internal_state z_internal_state + #endif #if defined(__MSDOS__) && !defined(MSDOS) @@ -125,6 +215,12 @@ # endif #endif +#if defined(ZLIB_CONST) && !defined(z_const) +# define z_const const +#else +# define z_const +#endif + /* Some Mac compilers merge all .h files incorrectly: */ #if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__) # define NO_DUMMY_DECL @@ -171,6 +267,14 @@ # endif #endif +#ifndef Z_ARG /* function prototypes for stdarg */ +# if defined(STDC) || defined(Z_HAVE_STDARG_H) +# define Z_ARG(args) args +# else +# define Z_ARG(args) () +# endif +#endif + /* The following definitions for FAR are needed only for MSDOS mixed * model programming (small or medium model with some far allocations). * This was tested only with MSC; for other MSDOS compilers you may have @@ -284,49 +388,119 @@ typedef uLong FAR uLongf; typedef Byte *voidp; #endif -#if 0 /* HAVE_UNISTD_H -- this line is updated by ./configure */ -# include /* for off_t */ -# include /* for SEEK_* and off_t */ -# ifdef VMS -# include /* for off_t */ +/* ./configure may #define Z_U4 here */ + +#if !defined(Z_U4) && !defined(Z_SOLO) && defined(STDC) +# include +# if (UINT_MAX == 0xffffffffUL) +# define Z_U4 unsigned +# else +# if (ULONG_MAX == 0xffffffffUL) +# define Z_U4 unsigned long +# else +# if (USHRT_MAX == 0xffffffffUL) +# define Z_U4 unsigned short +# endif +# endif # endif -# define z_off_t off_t #endif -#ifndef SEEK_SET + +#ifdef Z_U4 + typedef Z_U4 z_crc_t; +#else + typedef unsigned long z_crc_t; +#endif + +#ifdef HAVE_UNISTD_H /* may be set to #if 1 by ./configure */ +# define Z_HAVE_UNISTD_H +#endif + +#ifdef HAVE_STDARG_H /* may be set to #if 1 by ./configure */ +# define Z_HAVE_STDARG_H +#endif + +#ifdef STDC +# ifndef Z_SOLO +# include /* for off_t */ +# endif +#endif + +#ifdef _WIN32 +# include /* for wchar_t */ +#endif + +/* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and + * "#define _LARGEFILE64_SOURCE 1" as requesting 64-bit operations, (even + * though the former does not conform to the LFS document), but considering + * both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as + * equivalently requesting no 64-bit operations + */ +#if defined(LARGEFILE64_SOURCE) && -_LARGEFILE64_SOURCE - -1 == 1 +# undef _LARGEFILE64_SOURCE +#endif + +#if defined(__WATCOMC__) && !defined(Z_HAVE_UNISTD_H) +# define Z_HAVE_UNISTD_H +#endif +#ifndef Z_SOLO +# if defined(Z_HAVE_UNISTD_H) || defined(LARGEFILE64_SOURCE) +# include /* for SEEK_*, off_t, and _LFS64_LARGEFILE */ +# ifdef VMS +# include /* for off_t */ +# endif +# ifndef z_off_t +# define z_off_t off_t +# endif +# endif +#endif + +#if defined(_LFS64_LARGEFILE) && _LFS64_LARGEFILE-0 +# define Z_LFS64 +#endif + +#if defined(_LARGEFILE64_SOURCE) && defined(Z_LFS64) +# define Z_LARGE64 +#endif + +#if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS-0 == 64 && defined(Z_LFS64) +# define Z_WANT64 +#endif + +#if !defined(SEEK_SET) && !defined(Z_SOLO) # define SEEK_SET 0 /* Seek from beginning of file. */ # define SEEK_CUR 1 /* Seek from current position. */ # define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ #endif + #ifndef z_off_t # define z_off_t long #endif -#if defined(__OS400__) -# define NO_vsnprintf -#endif - -#if defined(__MVS__) -# define NO_vsnprintf -# ifdef FAR -# undef FAR +#if !defined(_WIN32) && defined(Z_LARGE64) +# define z_off64_t off64_t +#else +# if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO) +# define z_off64_t __int64 +# else +# define z_off64_t z_off_t # endif #endif /* MVS linker does not support external names larger than 8 bytes */ #if defined(__MVS__) -# pragma map(deflateInit_,"DEIN") -# pragma map(deflateInit2_,"DEIN2") -# pragma map(deflateEnd,"DEEND") -# pragma map(deflateBound,"DEBND") -# pragma map(inflateInit_,"ININ") -# pragma map(inflateInit2_,"ININ2") -# pragma map(inflateEnd,"INEND") -# pragma map(inflateSync,"INSY") -# pragma map(inflateSetDictionary,"INSEDI") -# pragma map(compressBound,"CMBND") -# pragma map(inflate_table,"INTABL") -# pragma map(inflate_fast,"INFA") -# pragma map(inflate_copyright,"INCOPY") + #pragma map(deflateInit_,"DEIN") + #pragma map(deflateInit2_,"DEIN2") + #pragma map(deflateEnd,"DEEND") + #pragma map(deflateBound,"DEBND") + #pragma map(inflateInit_,"ININ") + #pragma map(inflateInit2_,"ININ2") + #pragma map(inflateEnd,"INEND") + #pragma map(inflateSync,"INSY") + #pragma map(inflateSetDictionary,"INSEDI") + #pragma map(compressBound,"CMBND") + #pragma map(inflate_table,"INTABL") + #pragma map(inflate_fast,"INFA") + #pragma map(inflate_copyright,"INCOPY") #endif #endif /* ZCONF_H */ diff --git a/neo/libs/zlib/zconf.h.included b/neo/libs/zlib/zconf.h.included new file mode 100644 index 00000000..8a46a58b --- /dev/null +++ b/neo/libs/zlib/zconf.h.included @@ -0,0 +1,506 @@ +/* zconf.h -- configuration of the zlib compression library + * Copyright (C) 1995-2012 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#ifndef ZCONF_H +#define ZCONF_H + +/* + * If you *really* need a unique prefix for all types and library functions, + * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. + * Even better than compiling with -DZ_PREFIX would be to use configure to set + * this permanently in zconf.h using "./configure --zprefix". + */ +#ifdef Z_PREFIX /* may be set to #if 1 by ./configure */ +# define Z_PREFIX_SET + +/* all linked symbols */ +# define _dist_code z__dist_code +# define _length_code z__length_code +# define _tr_align z__tr_align +# define _tr_flush_block z__tr_flush_block +# define _tr_init z__tr_init +# define _tr_stored_block z__tr_stored_block +# define _tr_tally z__tr_tally +# define adler32 z_adler32 +# define adler32_combine z_adler32_combine +# define adler32_combine64 z_adler32_combine64 +# ifndef Z_SOLO +# define compress z_compress +# define compress2 z_compress2 +# define compressBound z_compressBound +# endif +# define crc32 z_crc32 +# define crc32_combine z_crc32_combine +# define crc32_combine64 z_crc32_combine64 +# define deflate z_deflate +# define deflateBound z_deflateBound +# define deflateCopy z_deflateCopy +# define deflateEnd z_deflateEnd +# define deflateInit2_ z_deflateInit2_ +# define deflateInit_ z_deflateInit_ +# define deflateParams z_deflateParams +# define deflatePending z_deflatePending +# define deflatePrime z_deflatePrime +# define deflateReset z_deflateReset +# define deflateResetKeep z_deflateResetKeep +# define deflateSetDictionary z_deflateSetDictionary +# define deflateSetHeader z_deflateSetHeader +# define deflateTune z_deflateTune +# define deflate_copyright z_deflate_copyright +# define get_crc_table z_get_crc_table +# ifndef Z_SOLO +# define gz_error z_gz_error +# define gz_intmax z_gz_intmax +# define gz_strwinerror z_gz_strwinerror +# define gzbuffer z_gzbuffer +# define gzclearerr z_gzclearerr +# define gzclose z_gzclose +# define gzclose_r z_gzclose_r +# define gzclose_w z_gzclose_w +# define gzdirect z_gzdirect +# define gzdopen z_gzdopen +# define gzeof z_gzeof +# define gzerror z_gzerror +# define gzflush z_gzflush +# define gzgetc z_gzgetc +# define gzgetc_ z_gzgetc_ +# define gzgets z_gzgets +# define gzoffset z_gzoffset +# define gzoffset64 z_gzoffset64 +# define gzopen z_gzopen +# define gzopen64 z_gzopen64 +# ifdef _WIN32 +# define gzopen_w z_gzopen_w +# endif +# define gzprintf z_gzprintf +# define gzputc z_gzputc +# define gzputs z_gzputs +# define gzread z_gzread +# define gzrewind z_gzrewind +# define gzseek z_gzseek +# define gzseek64 z_gzseek64 +# define gzsetparams z_gzsetparams +# define gztell z_gztell +# define gztell64 z_gztell64 +# define gzungetc z_gzungetc +# define gzwrite z_gzwrite +# endif +# define inflate z_inflate +# define inflateBack z_inflateBack +# define inflateBackEnd z_inflateBackEnd +# define inflateBackInit_ z_inflateBackInit_ +# define inflateCopy z_inflateCopy +# define inflateEnd z_inflateEnd +# define inflateGetHeader z_inflateGetHeader +# define inflateInit2_ z_inflateInit2_ +# define inflateInit_ z_inflateInit_ +# define inflateMark z_inflateMark +# define inflatePrime z_inflatePrime +# define inflateReset z_inflateReset +# define inflateReset2 z_inflateReset2 +# define inflateSetDictionary z_inflateSetDictionary +# define inflateSync z_inflateSync +# define inflateSyncPoint z_inflateSyncPoint +# define inflateUndermine z_inflateUndermine +# define inflateResetKeep z_inflateResetKeep +# define inflate_copyright z_inflate_copyright +# define inflate_fast z_inflate_fast +# define inflate_table z_inflate_table +# ifndef Z_SOLO +# define uncompress z_uncompress +# endif +# define zError z_zError +# ifndef Z_SOLO +# define zcalloc z_zcalloc +# define zcfree z_zcfree +# endif +# define zlibCompileFlags z_zlibCompileFlags +# define zlibVersion z_zlibVersion + +/* all zlib typedefs in zlib.h and zconf.h */ +# define Byte z_Byte +# define Bytef z_Bytef +# define alloc_func z_alloc_func +# define charf z_charf +# define free_func z_free_func +# ifndef Z_SOLO +# define gzFile z_gzFile +# endif +# define gz_header z_gz_header +# define gz_headerp z_gz_headerp +# define in_func z_in_func +# define intf z_intf +# define out_func z_out_func +# define uInt z_uInt +# define uIntf z_uIntf +# define uLong z_uLong +# define uLongf z_uLongf +# define voidp z_voidp +# define voidpc z_voidpc +# define voidpf z_voidpf + +/* all zlib structs in zlib.h and zconf.h */ +# define gz_header_s z_gz_header_s +# define internal_state z_internal_state + +#endif + +#if defined(__MSDOS__) && !defined(MSDOS) +# define MSDOS +#endif +#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) +# define OS2 +#endif +#if defined(_WINDOWS) && !defined(WINDOWS) +# define WINDOWS +#endif +#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__) +# ifndef WIN32 +# define WIN32 +# endif +#endif +#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) +# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) +# ifndef SYS16BIT +# define SYS16BIT +# endif +# endif +#endif + +/* + * Compile with -DMAXSEG_64K if the alloc function cannot allocate more + * than 64k bytes at a time (needed on systems with 16-bit int). + */ +#ifdef SYS16BIT +# define MAXSEG_64K +#endif +#ifdef MSDOS +# define UNALIGNED_OK +#endif + +#ifdef __STDC_VERSION__ +# ifndef STDC +# define STDC +# endif +# if __STDC_VERSION__ >= 199901L +# ifndef STDC99 +# define STDC99 +# endif +# endif +#endif +#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) +# define STDC +#endif +#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) +# define STDC +#endif +#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) +# define STDC +#endif +#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) +# define STDC +#endif + +#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ +# define STDC +#endif + +#ifndef STDC +# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ +# define const /* note: need a more gentle solution here */ +# endif +#endif + +#if defined(ZLIB_CONST) && !defined(z_const) +# define z_const const +#else +# define z_const +#endif + +/* Some Mac compilers merge all .h files incorrectly: */ +#if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__) +# define NO_DUMMY_DECL +#endif + +/* Maximum value for memLevel in deflateInit2 */ +#ifndef MAX_MEM_LEVEL +# ifdef MAXSEG_64K +# define MAX_MEM_LEVEL 8 +# else +# define MAX_MEM_LEVEL 9 +# endif +#endif + +/* Maximum value for windowBits in deflateInit2 and inflateInit2. + * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files + * created by gzip. (Files created by minigzip can still be extracted by + * gzip.) + */ +#ifndef MAX_WBITS +# define MAX_WBITS 15 /* 32K LZ77 window */ +#endif + +/* The memory requirements for deflate are (in bytes): + (1 << (windowBits+2)) + (1 << (memLevel+9)) + that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) + plus a few kilobytes for small objects. For example, if you want to reduce + the default memory requirements from 256K to 128K, compile with + make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" + Of course this will generally degrade compression (there's no free lunch). + + The memory requirements for inflate are (in bytes) 1 << windowBits + that is, 32K for windowBits=15 (default value) plus a few kilobytes + for small objects. +*/ + + /* Type declarations */ + +#ifndef OF /* function prototypes */ +# ifdef STDC +# define OF(args) args +# else +# define OF(args) () +# endif +#endif + +#ifndef Z_ARG /* function prototypes for stdarg */ +# if defined(STDC) || defined(Z_HAVE_STDARG_H) +# define Z_ARG(args) args +# else +# define Z_ARG(args) () +# endif +#endif + +/* The following definitions for FAR are needed only for MSDOS mixed + * model programming (small or medium model with some far allocations). + * This was tested only with MSC; for other MSDOS compilers you may have + * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, + * just define FAR to be empty. + */ +#ifdef SYS16BIT +# if defined(M_I86SM) || defined(M_I86MM) + /* MSC small or medium model */ +# define SMALL_MEDIUM +# ifdef _MSC_VER +# define FAR _far +# else +# define FAR far +# endif +# endif +# if (defined(__SMALL__) || defined(__MEDIUM__)) + /* Turbo C small or medium model */ +# define SMALL_MEDIUM +# ifdef __BORLANDC__ +# define FAR _far +# else +# define FAR far +# endif +# endif +#endif + +#if defined(WINDOWS) || defined(WIN32) + /* If building or using zlib as a DLL, define ZLIB_DLL. + * This is not mandatory, but it offers a little performance increase. + */ +# ifdef ZLIB_DLL +# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) +# ifdef ZLIB_INTERNAL +# define ZEXTERN extern __declspec(dllexport) +# else +# define ZEXTERN extern __declspec(dllimport) +# endif +# endif +# endif /* ZLIB_DLL */ + /* If building or using zlib with the WINAPI/WINAPIV calling convention, + * define ZLIB_WINAPI. + * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. + */ +# ifdef ZLIB_WINAPI +# ifdef FAR +# undef FAR +# endif +# include + /* No need for _export, use ZLIB.DEF instead. */ + /* For complete Windows compatibility, use WINAPI, not __stdcall. */ +# define ZEXPORT WINAPI +# ifdef WIN32 +# define ZEXPORTVA WINAPIV +# else +# define ZEXPORTVA FAR CDECL +# endif +# endif +#endif + +#if defined (__BEOS__) +# ifdef ZLIB_DLL +# ifdef ZLIB_INTERNAL +# define ZEXPORT __declspec(dllexport) +# define ZEXPORTVA __declspec(dllexport) +# else +# define ZEXPORT __declspec(dllimport) +# define ZEXPORTVA __declspec(dllimport) +# endif +# endif +#endif + +#ifndef ZEXTERN +# define ZEXTERN extern +#endif +#ifndef ZEXPORT +# define ZEXPORT +#endif +#ifndef ZEXPORTVA +# define ZEXPORTVA +#endif + +#ifndef FAR +# define FAR +#endif + +#if !defined(__MACTYPES__) +typedef unsigned char Byte; /* 8 bits */ +#endif +typedef unsigned int uInt; /* 16 bits or more */ +typedef unsigned long uLong; /* 32 bits or more */ + +#ifdef SMALL_MEDIUM + /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ +# define Bytef Byte FAR +#else + typedef Byte FAR Bytef; +#endif +typedef char FAR charf; +typedef int FAR intf; +typedef uInt FAR uIntf; +typedef uLong FAR uLongf; + +#ifdef STDC + typedef void const *voidpc; + typedef void FAR *voidpf; + typedef void *voidp; +#else + typedef Byte const *voidpc; + typedef Byte FAR *voidpf; + typedef Byte *voidp; +#endif + +/* ./configure may #define Z_U4 here */ + +#if !defined(Z_U4) && !defined(Z_SOLO) && defined(STDC) +# include +# if (UINT_MAX == 0xffffffffUL) +# define Z_U4 unsigned +# else +# if (ULONG_MAX == 0xffffffffUL) +# define Z_U4 unsigned long +# else +# if (USHRT_MAX == 0xffffffffUL) +# define Z_U4 unsigned short +# endif +# endif +# endif +#endif + +#ifdef Z_U4 + typedef Z_U4 z_crc_t; +#else + typedef unsigned long z_crc_t; +#endif + +#ifdef HAVE_UNISTD_H /* may be set to #if 1 by ./configure */ +# define Z_HAVE_UNISTD_H +#endif + +#ifdef HAVE_STDARG_H /* may be set to #if 1 by ./configure */ +# define Z_HAVE_STDARG_H +#endif + +#ifdef STDC +# ifndef Z_SOLO +# include /* for off_t */ +# endif +#endif + +#ifdef _WIN32 +# include /* for wchar_t */ +#endif + +/* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and + * "#define _LARGEFILE64_SOURCE 1" as requesting 64-bit operations, (even + * though the former does not conform to the LFS document), but considering + * both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as + * equivalently requesting no 64-bit operations + */ +#if defined(LARGEFILE64_SOURCE) && -_LARGEFILE64_SOURCE - -1 == 1 +# undef _LARGEFILE64_SOURCE +#endif + +#if defined(__WATCOMC__) && !defined(Z_HAVE_UNISTD_H) +# define Z_HAVE_UNISTD_H +#endif +#ifndef Z_SOLO +# if defined(Z_HAVE_UNISTD_H) || defined(LARGEFILE64_SOURCE) +# include /* for SEEK_*, off_t, and _LFS64_LARGEFILE */ +# ifdef VMS +# include /* for off_t */ +# endif +# ifndef z_off_t +# define z_off_t off_t +# endif +# endif +#endif + +#if defined(_LFS64_LARGEFILE) && _LFS64_LARGEFILE-0 +# define Z_LFS64 +#endif + +#if defined(_LARGEFILE64_SOURCE) && defined(Z_LFS64) +# define Z_LARGE64 +#endif + +#if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS-0 == 64 && defined(Z_LFS64) +# define Z_WANT64 +#endif + +#if !defined(SEEK_SET) && !defined(Z_SOLO) +# define SEEK_SET 0 /* Seek from beginning of file. */ +# define SEEK_CUR 1 /* Seek from current position. */ +# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ +#endif + +#ifndef z_off_t +# define z_off_t long +#endif + +#if !defined(_WIN32) && defined(Z_LARGE64) +# define z_off64_t off64_t +#else +# if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO) +# define z_off64_t __int64 +# else +# define z_off64_t z_off_t +# endif +#endif + +/* MVS linker does not support external names larger than 8 bytes */ +#if defined(__MVS__) + #pragma map(deflateInit_,"DEIN") + #pragma map(deflateInit2_,"DEIN2") + #pragma map(deflateEnd,"DEEND") + #pragma map(deflateBound,"DEBND") + #pragma map(inflateInit_,"ININ") + #pragma map(inflateInit2_,"ININ2") + #pragma map(inflateEnd,"INEND") + #pragma map(inflateSync,"INSY") + #pragma map(inflateSetDictionary,"INSEDI") + #pragma map(compressBound,"CMBND") + #pragma map(inflate_table,"INTABL") + #pragma map(inflate_fast,"INFA") + #pragma map(inflate_copyright,"INCOPY") +#endif + +#endif /* ZCONF_H */ diff --git a/neo/libs/zlib/zlib.h b/neo/libs/zlib/zlib.h index 02281792..3edf3acd 100644 --- a/neo/libs/zlib/zlib.h +++ b/neo/libs/zlib/zlib.h @@ -1,7 +1,7 @@ /* zlib.h -- interface of the 'zlib' general purpose compression library - version 1.2.3, July 18th, 2005 + version 1.2.7, May 2nd, 2012 - Copyright (C) 1995-2005 Jean-loup Gailly and Mark Adler + Copyright (C) 1995-2012 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -24,8 +24,8 @@ The data format used by the zlib library is described by RFCs (Request for - Comments) 1950 to 1952 in the files http://www.ietf.org/rfc/rfc1950.txt - (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format). + Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950 + (zlib format), rfc1951 (deflate format) and rfc1952 (gzip format). */ #ifndef ZLIB_H @@ -37,41 +37,44 @@ extern "C" { #endif -#define ZLIB_VERSION "1.2.3" -#define ZLIB_VERNUM 0x1230 +#define ZLIB_VERSION "1.2.7" +#define ZLIB_VERNUM 0x1270 +#define ZLIB_VER_MAJOR 1 +#define ZLIB_VER_MINOR 2 +#define ZLIB_VER_REVISION 7 +#define ZLIB_VER_SUBREVISION 0 /* - The 'zlib' compression library provides in-memory compression and - decompression functions, including integrity checks of the uncompressed - data. This version of the library supports only one compression method - (deflation) but other algorithms will be added later and will have the same - stream interface. + The 'zlib' compression library provides in-memory compression and + decompression functions, including integrity checks of the uncompressed data. + This version of the library supports only one compression method (deflation) + but other algorithms will be added later and will have the same stream + interface. - Compression can be done in a single step if the buffers are large - enough (for example if an input file is mmap'ed), or can be done by - repeated calls of the compression function. In the latter case, the - application must provide more input and/or consume the output + Compression can be done in a single step if the buffers are large enough, + or can be done by repeated calls of the compression function. In the latter + case, the application must provide more input and/or consume the output (providing more output space) before each call. - The compressed data format used by default by the in-memory functions is + The compressed data format used by default by the in-memory functions is the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped around a deflate stream, which is itself documented in RFC 1951. - The library also supports reading and writing files in gzip (.gz) format + The library also supports reading and writing files in gzip (.gz) format with an interface similar to that of stdio using the functions that start with "gz". The gzip format is different from the zlib format. gzip is a gzip wrapper, documented in RFC 1952, wrapped around a deflate stream. - This library can optionally read and write gzip streams in memory as well. + This library can optionally read and write gzip streams in memory as well. - The zlib format was designed to be compact and fast for use in memory + The zlib format was designed to be compact and fast for use in memory and on communications channels. The gzip format was designed for single- file compression on file systems, has a larger header than zlib to maintain directory information, and uses a different, slower check method than zlib. - The library does not install any signal handler. The decoder checks - the consistency of the compressed data, so the library should never - crash even in case of corrupted input. + The library does not install any signal handler. The decoder checks + the consistency of the compressed data, so the library should never crash + even in case of corrupted input. */ typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); @@ -80,15 +83,15 @@ typedef void (*free_func) OF((voidpf opaque, voidpf address)); struct internal_state; typedef struct z_stream_s { - Bytef *next_in; /* next input byte */ + z_const Bytef *next_in; /* next input byte */ uInt avail_in; /* number of bytes available at next_in */ - uLong total_in; /* total nb of input bytes read so far */ + uLong total_in; /* total number of input bytes read so far */ Bytef *next_out; /* next output byte should be put there */ uInt avail_out; /* remaining free space at next_out */ - uLong total_out; /* total nb of bytes output so far */ + uLong total_out; /* total number of bytes output so far */ - char *msg; /* last error message, NULL if no error */ + z_const char *msg; /* last error message, NULL if no error */ struct internal_state FAR *state; /* not visible by applications */ alloc_func zalloc; /* used to allocate the internal state */ @@ -126,45 +129,45 @@ typedef struct gz_header_s { typedef gz_header FAR *gz_headerp; /* - The application must update next_in and avail_in when avail_in has - dropped to zero. It must update next_out and avail_out when avail_out - has dropped to zero. The application must initialize zalloc, zfree and - opaque before calling the init function. All other fields are set by the - compression library and must not be updated by the application. + The application must update next_in and avail_in when avail_in has dropped + to zero. It must update next_out and avail_out when avail_out has dropped + to zero. The application must initialize zalloc, zfree and opaque before + calling the init function. All other fields are set by the compression + library and must not be updated by the application. - The opaque value provided by the application will be passed as the first - parameter for calls of zalloc and zfree. This can be useful for custom - memory management. The compression library attaches no meaning to the + The opaque value provided by the application will be passed as the first + parameter for calls of zalloc and zfree. This can be useful for custom + memory management. The compression library attaches no meaning to the opaque value. - zalloc must return Z_NULL if there is not enough memory for the object. + zalloc must return Z_NULL if there is not enough memory for the object. If zlib is used in a multi-threaded application, zalloc and zfree must be thread safe. - On 16-bit systems, the functions zalloc and zfree must be able to allocate - exactly 65536 bytes, but will not be required to allocate more than this - if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, - pointers returned by zalloc for objects of exactly 65536 bytes *must* - have their offset normalized to zero. The default allocation function - provided by this library ensures this (see zutil.c). To reduce memory - requirements and avoid any allocation of 64K objects, at the expense of - compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h). + On 16-bit systems, the functions zalloc and zfree must be able to allocate + exactly 65536 bytes, but will not be required to allocate more than this if + the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, pointers + returned by zalloc for objects of exactly 65536 bytes *must* have their + offset normalized to zero. The default allocation function provided by this + library ensures this (see zutil.c). To reduce memory requirements and avoid + any allocation of 64K objects, at the expense of compression ratio, compile + the library with -DMAX_WBITS=14 (see zconf.h). - The fields total_in and total_out can be used for statistics or - progress reports. After compression, total_in holds the total size of - the uncompressed data and may be saved for use in the decompressor - (particularly if the decompressor wants to decompress everything in - a single step). + The fields total_in and total_out can be used for statistics or progress + reports. After compression, total_in holds the total size of the + uncompressed data and may be saved for use in the decompressor (particularly + if the decompressor wants to decompress everything in a single step). */ /* constants */ #define Z_NO_FLUSH 0 -#define Z_PARTIAL_FLUSH 1 /* will be removed, use Z_SYNC_FLUSH instead */ +#define Z_PARTIAL_FLUSH 1 #define Z_SYNC_FLUSH 2 #define Z_FULL_FLUSH 3 #define Z_FINISH 4 #define Z_BLOCK 5 +#define Z_TREES 6 /* Allowed flush values; see deflate() and inflate() below for details */ #define Z_OK 0 @@ -176,8 +179,8 @@ typedef gz_header FAR *gz_headerp; #define Z_MEM_ERROR (-4) #define Z_BUF_ERROR (-5) #define Z_VERSION_ERROR (-6) -/* Return codes for the compression/decompression functions. Negative - * values are errors, positive values are used for special but normal events. +/* Return codes for the compression/decompression functions. Negative values + * are errors, positive values are used for special but normal events. */ #define Z_NO_COMPRESSION 0 @@ -207,119 +210,141 @@ typedef gz_header FAR *gz_headerp; #define zlib_version zlibVersion() /* for compatibility with versions < 1.0.2 */ + /* basic functions */ ZEXTERN const char * ZEXPORT zlibVersion OF((void)); /* The application can compare zlibVersion and ZLIB_VERSION for consistency. - If the first character differs, the library code actually used is - not compatible with the zlib.h header file used by the application. - This check is automatically made by deflateInit and inflateInit. + If the first character differs, the library code actually used is not + compatible with the zlib.h header file used by the application. This check + is automatically made by deflateInit and inflateInit. */ /* ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); - Initializes the internal stream state for compression. The fields - zalloc, zfree and opaque must be initialized before by the caller. - If zalloc and zfree are set to Z_NULL, deflateInit updates them to - use default allocation functions. + Initializes the internal stream state for compression. The fields + zalloc, zfree and opaque must be initialized before by the caller. If + zalloc and zfree are set to Z_NULL, deflateInit updates them to use default + allocation functions. The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: - 1 gives best speed, 9 gives best compression, 0 gives no compression at - all (the input data is simply copied a block at a time). - Z_DEFAULT_COMPRESSION requests a default compromise between speed and - compression (currently equivalent to level 6). + 1 gives best speed, 9 gives best compression, 0 gives no compression at all + (the input data is simply copied a block at a time). Z_DEFAULT_COMPRESSION + requests a default compromise between speed and compression (currently + equivalent to level 6). - deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_STREAM_ERROR if level is not a valid compression level, + deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if level is not a valid compression level, or Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible - with the version assumed by the caller (ZLIB_VERSION). - msg is set to null if there is no error message. deflateInit does not - perform any compression: this will be done by deflate(). + with the version assumed by the caller (ZLIB_VERSION). msg is set to null + if there is no error message. deflateInit does not perform any compression: + this will be done by deflate(). */ ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); /* deflate compresses as much data as possible, and stops when the input - buffer becomes empty or the output buffer becomes full. It may introduce some - output latency (reading input without producing any output) except when + buffer becomes empty or the output buffer becomes full. It may introduce + some output latency (reading input without producing any output) except when forced to flush. - The detailed semantics are as follows. deflate performs one or both of the + The detailed semantics are as follows. deflate performs one or both of the following actions: - Compress more input starting at next_in and update next_in and avail_in - accordingly. If not all input can be processed (because there is not + accordingly. If not all input can be processed (because there is not enough room in the output buffer), next_in and avail_in are updated and processing will resume at this point for the next call of deflate(). - Provide more output starting at next_out and update next_out and avail_out - accordingly. This action is forced if the parameter flush is non zero. + accordingly. This action is forced if the parameter flush is non zero. Forcing flush frequently degrades the compression ratio, so this parameter - should be set only when necessary (in interactive applications). - Some output may be provided even if flush is not set. + should be set only when necessary (in interactive applications). Some + output may be provided even if flush is not set. - Before the call of deflate(), the application should ensure that at least - one of the actions is possible, by providing more input and/or consuming - more output, and updating avail_in or avail_out accordingly; avail_out - should never be zero before the call. The application can consume the - compressed output when it wants, for example when the output buffer is full - (avail_out == 0), or after each call of deflate(). If deflate returns Z_OK - and with zero avail_out, it must be called again after making room in the - output buffer because there might be more output pending. + Before the call of deflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming more + output, and updating avail_in or avail_out accordingly; avail_out should + never be zero before the call. The application can consume the compressed + output when it wants, for example when the output buffer is full (avail_out + == 0), or after each call of deflate(). If deflate returns Z_OK and with + zero avail_out, it must be called again after making room in the output + buffer because there might be more output pending. Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to - decide how much data to accumualte before producing output, in order to + decide how much data to accumulate before producing output, in order to maximize compression. If the parameter flush is set to Z_SYNC_FLUSH, all pending output is flushed to the output buffer and the output is aligned on a byte boundary, so - that the decompressor can get all input data available so far. (In particular - avail_in is zero after the call if enough output space has been provided - before the call.) Flushing may degrade compression for some compression - algorithms and so it should be used only when necessary. + that the decompressor can get all input data available so far. (In + particular avail_in is zero after the call if enough output space has been + provided before the call.) Flushing may degrade compression for some + compression algorithms and so it should be used only when necessary. This + completes the current deflate block and follows it with an empty stored block + that is three bits plus filler bits to the next byte, followed by four bytes + (00 00 ff ff). + + If flush is set to Z_PARTIAL_FLUSH, all pending output is flushed to the + output buffer, but the output is not aligned to a byte boundary. All of the + input data so far will be available to the decompressor, as for Z_SYNC_FLUSH. + This completes the current deflate block and follows it with an empty fixed + codes block that is 10 bits long. This assures that enough bytes are output + in order for the decompressor to finish the block before the empty fixed code + block. + + If flush is set to Z_BLOCK, a deflate block is completed and emitted, as + for Z_SYNC_FLUSH, but the output is not aligned on a byte boundary, and up to + seven bits of the current block are held to be written as the next byte after + the next deflate block is completed. In this case, the decompressor may not + be provided enough bits at this point in order to complete decompression of + the data provided so far to the compressor. It may need to wait for the next + block to be emitted. This is for advanced applications that need to control + the emission of deflate blocks. If flush is set to Z_FULL_FLUSH, all output is flushed as with Z_SYNC_FLUSH, and the compression state is reset so that decompression can restart from this point if previous compressed data has been damaged or if - random access is desired. Using Z_FULL_FLUSH too often can seriously degrade + random access is desired. Using Z_FULL_FLUSH too often can seriously degrade compression. If deflate returns with avail_out == 0, this function must be called again with the same value of the flush parameter and more output space (updated avail_out), until the flush is complete (deflate returns with non-zero - avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that + avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that avail_out is greater than six to avoid repeated flush markers due to avail_out == 0 on return. If the parameter flush is set to Z_FINISH, pending input is processed, - pending output is flushed and deflate returns with Z_STREAM_END if there - was enough output space; if deflate returns with Z_OK, this function must be + pending output is flushed and deflate returns with Z_STREAM_END if there was + enough output space; if deflate returns with Z_OK, this function must be called again with Z_FINISH and more output space (updated avail_out) but no - more input data, until it returns with Z_STREAM_END or an error. After - deflate has returned Z_STREAM_END, the only possible operations on the - stream are deflateReset or deflateEnd. + more input data, until it returns with Z_STREAM_END or an error. After + deflate has returned Z_STREAM_END, the only possible operations on the stream + are deflateReset or deflateEnd. Z_FINISH can be used immediately after deflateInit if all the compression - is to be done in a single step. In this case, avail_out must be at least - the value returned by deflateBound (see below). If deflate does not return - Z_STREAM_END, then it must be called again as described above. + is to be done in a single step. In this case, avail_out must be at least the + value returned by deflateBound (see below). Then deflate is guaranteed to + return Z_STREAM_END. If not enough output space is provided, deflate will + not return Z_STREAM_END, and it must be called again as described above. deflate() sets strm->adler to the adler32 checksum of all input read so far (that is, total_in bytes). deflate() may update strm->data_type if it can make a good guess about - the input data type (Z_BINARY or Z_TEXT). In doubt, the data is considered - binary. This field is only for information purposes and does not affect - the compression algorithm in any manner. + the input data type (Z_BINARY or Z_TEXT). In doubt, the data is considered + binary. This field is only for information purposes and does not affect the + compression algorithm in any manner. deflate() returns Z_OK if some progress has been made (more input processed or more output produced), Z_STREAM_END if all input has been consumed and all output has been produced (only when flush is set to Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example - if next_in or next_out was NULL), Z_BUF_ERROR if no progress is possible - (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not + if next_in or next_out was Z_NULL), Z_BUF_ERROR if no progress is possible + (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not fatal, and deflate() can be called again with more input and more output space to continue compressing. */ @@ -328,13 +353,13 @@ ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); /* All dynamically allocated data structures for this stream are freed. - This function discards any unprocessed input and does not flush any - pending output. + This function discards any unprocessed input and does not flush any pending + output. deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state was inconsistent, Z_DATA_ERROR if the stream was freed - prematurely (some input or output was discarded). In the error case, - msg may be set but then points to a static string (which must not be + prematurely (some input or output was discarded). In the error case, msg + may be set but then points to a static string (which must not be deallocated). */ @@ -342,10 +367,10 @@ ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); /* ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); - Initializes the internal stream state for decompression. The fields + Initializes the internal stream state for decompression. The fields next_in, avail_in, zalloc, zfree and opaque must be initialized before by - the caller. If next_in is not Z_NULL and avail_in is large enough (the exact - value depends on the compression method), inflateInit determines the + the caller. If next_in is not Z_NULL and avail_in is large enough (the + exact value depends on the compression method), inflateInit determines the compression method from the zlib header and allocates all data structures accordingly; otherwise the allocation will be deferred to the first call of inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to @@ -353,95 +378,116 @@ ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_VERSION_ERROR if the zlib library version is incompatible with the - version assumed by the caller. msg is set to null if there is no error - message. inflateInit does not perform any decompression apart from reading - the zlib header if present: this will be done by inflate(). (So next_in and - avail_in may be modified, but next_out and avail_out are unchanged.) + version assumed by the caller, or Z_STREAM_ERROR if the parameters are + invalid, such as a null pointer to the structure. msg is set to null if + there is no error message. inflateInit does not perform any decompression + apart from possibly reading the zlib header if present: actual decompression + will be done by inflate(). (So next_in and avail_in may be modified, but + next_out and avail_out are unused and unchanged.) The current implementation + of inflateInit() does not process any header information -- that is deferred + until inflate() is called. */ ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); /* inflate decompresses as much data as possible, and stops when the input - buffer becomes empty or the output buffer becomes full. It may introduce + buffer becomes empty or the output buffer becomes full. It may introduce some output latency (reading input without producing any output) except when forced to flush. - The detailed semantics are as follows. inflate performs one or both of the + The detailed semantics are as follows. inflate performs one or both of the following actions: - Decompress more input starting at next_in and update next_in and avail_in - accordingly. If not all input can be processed (because there is not - enough room in the output buffer), next_in is updated and processing - will resume at this point for the next call of inflate(). + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), next_in is updated and processing will + resume at this point for the next call of inflate(). - Provide more output starting at next_out and update next_out and avail_out - accordingly. inflate() provides as much output as possible, until there - is no more input data or no more space in the output buffer (see below - about the flush parameter). + accordingly. inflate() provides as much output as possible, until there is + no more input data or no more space in the output buffer (see below about + the flush parameter). - Before the call of inflate(), the application should ensure that at least - one of the actions is possible, by providing more input and/or consuming - more output, and updating the next_* and avail_* values accordingly. - The application can consume the uncompressed output when it wants, for - example when the output buffer is full (avail_out == 0), or after each - call of inflate(). If inflate returns Z_OK and with zero avail_out, it - must be called again after making room in the output buffer because there - might be more output pending. + Before the call of inflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming more + output, and updating the next_* and avail_* values accordingly. The + application can consume the uncompressed output when it wants, for example + when the output buffer is full (avail_out == 0), or after each call of + inflate(). If inflate returns Z_OK and with zero avail_out, it must be + called again after making room in the output buffer because there might be + more output pending. - The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, - Z_FINISH, or Z_BLOCK. Z_SYNC_FLUSH requests that inflate() flush as much - output as possible to the output buffer. Z_BLOCK requests that inflate() stop - if and when it gets to the next deflate block boundary. When decoding the - zlib or gzip format, this will cause inflate() to return immediately after - the header and before the first block. When doing a raw inflate, inflate() - will go ahead and process the first block, and will return when it gets to - the end of that block, or when it runs out of data. + The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, Z_FINISH, + Z_BLOCK, or Z_TREES. Z_SYNC_FLUSH requests that inflate() flush as much + output as possible to the output buffer. Z_BLOCK requests that inflate() + stop if and when it gets to the next deflate block boundary. When decoding + the zlib or gzip format, this will cause inflate() to return immediately + after the header and before the first block. When doing a raw inflate, + inflate() will go ahead and process the first block, and will return when it + gets to the end of that block, or when it runs out of data. The Z_BLOCK option assists in appending to or combining deflate streams. Also to assist in this, on return inflate() will set strm->data_type to the - number of unused bits in the last byte taken from strm->next_in, plus 64 - if inflate() is currently decoding the last block in the deflate stream, - plus 128 if inflate() returned immediately after decoding an end-of-block - code or decoding the complete header up to just before the first byte of the - deflate stream. The end-of-block will not be indicated until all of the - uncompressed data from that block has been written to strm->next_out. The - number of unused bits may in general be greater than seven, except when - bit 7 of data_type is set, in which case the number of unused bits will be - less than eight. + number of unused bits in the last byte taken from strm->next_in, plus 64 if + inflate() is currently decoding the last block in the deflate stream, plus + 128 if inflate() returned immediately after decoding an end-of-block code or + decoding the complete header up to just before the first byte of the deflate + stream. The end-of-block will not be indicated until all of the uncompressed + data from that block has been written to strm->next_out. The number of + unused bits may in general be greater than seven, except when bit 7 of + data_type is set, in which case the number of unused bits will be less than + eight. data_type is set as noted here every time inflate() returns for all + flush options, and so can be used to determine the amount of currently + consumed input in bits. + + The Z_TREES option behaves as Z_BLOCK does, but it also returns when the + end of each deflate block header is reached, before any actual data in that + block is decoded. This allows the caller to determine the length of the + deflate block header for later use in random access within a deflate block. + 256 is added to the value of strm->data_type when inflate() returns + immediately after reaching the end of the deflate block header. inflate() should normally be called until it returns Z_STREAM_END or an - error. However if all decompression is to be performed in a single step - (a single call of inflate), the parameter flush should be set to - Z_FINISH. In this case all pending input is processed and all pending - output is flushed; avail_out must be large enough to hold all the - uncompressed data. (The size of the uncompressed data may have been saved - by the compressor for this purpose.) The next operation on this stream must - be inflateEnd to deallocate the decompression state. The use of Z_FINISH - is never required, but can be used to inform inflate that a faster approach - may be used for the single inflate() call. + error. However if all decompression is to be performed in a single step (a + single call of inflate), the parameter flush should be set to Z_FINISH. In + this case all pending input is processed and all pending output is flushed; + avail_out must be large enough to hold all of the uncompressed data for the + operation to complete. (The size of the uncompressed data may have been + saved by the compressor for this purpose.) The use of Z_FINISH is not + required to perform an inflation in one step. However it may be used to + inform inflate that a faster approach can be used for the single inflate() + call. Z_FINISH also informs inflate to not maintain a sliding window if the + stream completes, which reduces inflate's memory footprint. If the stream + does not complete, either because not all of the stream is provided or not + enough output space is provided, then a sliding window will be allocated and + inflate() can be called again to continue the operation as if Z_NO_FLUSH had + been used. In this implementation, inflate() always flushes as much output as possible to the output buffer, and always uses the faster approach on the - first call. So the only effect of the flush parameter in this implementation - is on the return value of inflate(), as noted below, or when it returns early - because Z_BLOCK is used. + first call. So the effects of the flush parameter in this implementation are + on the return value of inflate() as noted below, when inflate() returns early + when Z_BLOCK or Z_TREES is used, and when inflate() avoids the allocation of + memory for a sliding window when Z_FINISH is used. If a preset dictionary is needed after this call (see inflateSetDictionary - below), inflate sets strm->adler to the adler32 checksum of the dictionary + below), inflate sets strm->adler to the Adler-32 checksum of the dictionary chosen by the compressor and returns Z_NEED_DICT; otherwise it sets - strm->adler to the adler32 checksum of all output produced so far (that is, + strm->adler to the Adler-32 checksum of all output produced so far (that is, total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described - below. At the end of the stream, inflate() checks that its computed adler32 + below. At the end of the stream, inflate() checks that its computed adler32 checksum is equal to that saved by the compressor and returns Z_STREAM_END only if the checksum is correct. - inflate() will decompress and check either zlib-wrapped or gzip-wrapped - deflate data. The header type is detected automatically. Any information - contained in the gzip header is not retained, so applications that need that - information should instead use raw inflate, see inflateInit2() below, or - inflateBack() and perform their own processing of the gzip header and - trailer. + inflate() can decompress and check either zlib-wrapped or gzip-wrapped + deflate data. The header type is detected automatically, if requested when + initializing with inflateInit2(). Any information contained in the gzip + header is not retained, so applications that need that information should + instead use raw inflate, see inflateInit2() below, or inflateBack() and + perform their own processing of the gzip header and trailer. When processing + gzip-wrapped deflate data, strm->adler32 is set to the CRC-32 of the output + producted so far. The CRC-32 is checked against the gzip trailer. inflate() returns Z_OK if some progress has been made (more input processed or more output produced), Z_STREAM_END if the end of the compressed data has @@ -449,27 +495,28 @@ ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); preset dictionary is needed at this point, Z_DATA_ERROR if the input data was corrupted (input stream not conforming to the zlib format or incorrect check value), Z_STREAM_ERROR if the stream structure was inconsistent (for example - if next_in or next_out was NULL), Z_MEM_ERROR if there was not enough memory, + next_in or next_out was Z_NULL), Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if no progress is possible or if there was not enough room in the - output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and + output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and inflate() can be called again with more input and more output space to - continue decompressing. If Z_DATA_ERROR is returned, the application may then - call inflateSync() to look for a good compression block if a partial recovery - of the data is desired. + continue decompressing. If Z_DATA_ERROR is returned, the application may + then call inflateSync() to look for a good compression block if a partial + recovery of the data is desired. */ ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); /* All dynamically allocated data structures for this stream are freed. - This function discards any unprocessed input and does not flush any - pending output. + This function discards any unprocessed input and does not flush any pending + output. inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state - was inconsistent. In the error case, msg may be set but then points to a + was inconsistent. In the error case, msg may be set but then points to a static string (which must not be deallocated). */ + /* Advanced functions */ /* @@ -484,55 +531,57 @@ ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, int memLevel, int strategy)); - This is another version of deflateInit with more compression options. The - fields next_in, zalloc, zfree and opaque must be initialized before by - the caller. + This is another version of deflateInit with more compression options. The + fields next_in, zalloc, zfree and opaque must be initialized before by the + caller. - The method parameter is the compression method. It must be Z_DEFLATED in + The method parameter is the compression method. It must be Z_DEFLATED in this version of the library. The windowBits parameter is the base two logarithm of the window size - (the size of the history buffer). It should be in the range 8..15 for this - version of the library. Larger values of this parameter result in better - compression at the expense of memory usage. The default value is 15 if + (the size of the history buffer). It should be in the range 8..15 for this + version of the library. Larger values of this parameter result in better + compression at the expense of memory usage. The default value is 15 if deflateInit is used instead. - windowBits can also be -8..-15 for raw deflate. In this case, -windowBits - determines the window size. deflate() will then generate raw deflate data + windowBits can also be -8..-15 for raw deflate. In this case, -windowBits + determines the window size. deflate() will then generate raw deflate data with no zlib header or trailer, and will not compute an adler32 check value. - windowBits can also be greater than 15 for optional gzip encoding. Add + windowBits can also be greater than 15 for optional gzip encoding. Add 16 to windowBits to write a simple gzip header and trailer around the - compressed data instead of a zlib wrapper. The gzip header will have no - file name, no extra data, no comment, no modification time (set to zero), - no header crc, and the operating system will be set to 255 (unknown). If a + compressed data instead of a zlib wrapper. The gzip header will have no + file name, no extra data, no comment, no modification time (set to zero), no + header crc, and the operating system will be set to 255 (unknown). If a gzip stream is being written, strm->adler is a crc32 instead of an adler32. The memLevel parameter specifies how much memory should be allocated - for the internal compression state. memLevel=1 uses minimum memory but - is slow and reduces compression ratio; memLevel=9 uses maximum memory - for optimal speed. The default value is 8. See zconf.h for total memory - usage as a function of windowBits and memLevel. + for the internal compression state. memLevel=1 uses minimum memory but is + slow and reduces compression ratio; memLevel=9 uses maximum memory for + optimal speed. The default value is 8. See zconf.h for total memory usage + as a function of windowBits and memLevel. - The strategy parameter is used to tune the compression algorithm. Use the + The strategy parameter is used to tune the compression algorithm. Use the value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no string match), or Z_RLE to limit match distances to one (run-length - encoding). Filtered data consists mostly of small values with a somewhat - random distribution. In this case, the compression algorithm is tuned to - compress them better. The effect of Z_FILTERED is to force more Huffman + encoding). Filtered data consists mostly of small values with a somewhat + random distribution. In this case, the compression algorithm is tuned to + compress them better. The effect of Z_FILTERED is to force more Huffman coding and less string matching; it is somewhat intermediate between - Z_DEFAULT and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as fast as - Z_HUFFMAN_ONLY, but give better compression for PNG image data. The strategy - parameter only affects the compression ratio but not the correctness of the - compressed output even if it is not set appropriately. Z_FIXED prevents the - use of dynamic Huffman codes, allowing for a simpler decoder for special - applications. + Z_DEFAULT_STRATEGY and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as + fast as Z_HUFFMAN_ONLY, but give better compression for PNG image data. The + strategy parameter only affects the compression ratio but not the + correctness of the compressed output even if it is not set appropriately. + Z_FIXED prevents the use of dynamic Huffman codes, allowing for a simpler + decoder for special applications. - deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_STREAM_ERROR if a parameter is invalid (such as an invalid - method). msg is set to null if there is no error message. deflateInit2 does - not perform any compression: this will be done by deflate(). + deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if any parameter is invalid (such as an invalid + method), or Z_VERSION_ERROR if the zlib library version (zlib_version) is + incompatible with the version assumed by the caller (ZLIB_VERSION). msg is + set to null if there is no error message. deflateInit2 does not perform any + compression: this will be done by deflate(). */ ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, @@ -540,38 +589,43 @@ ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, uInt dictLength)); /* Initializes the compression dictionary from the given byte sequence - without producing any compressed output. This function must be called - immediately after deflateInit, deflateInit2 or deflateReset, before any - call of deflate. The compressor and decompressor must use exactly the same - dictionary (see inflateSetDictionary). + without producing any compressed output. When using the zlib format, this + function must be called immediately after deflateInit, deflateInit2 or + deflateReset, and before any call of deflate. When doing raw deflate, this + function must be called either before any call of deflate, or immediately + after the completion of a deflate block, i.e. after all input has been + consumed and all output has been delivered when using any of the flush + options Z_BLOCK, Z_PARTIAL_FLUSH, Z_SYNC_FLUSH, or Z_FULL_FLUSH. The + compressor and decompressor must use exactly the same dictionary (see + inflateSetDictionary). The dictionary should consist of strings (byte sequences) that are likely to be encountered later in the data to be compressed, with the most commonly - used strings preferably put towards the end of the dictionary. Using a + used strings preferably put towards the end of the dictionary. Using a dictionary is most useful when the data to be compressed is short and can be predicted with good accuracy; the data can then be compressed better than with the default empty dictionary. Depending on the size of the compression data structures selected by deflateInit or deflateInit2, a part of the dictionary may in effect be - discarded, for example if the dictionary is larger than the window size in - deflate or deflate2. Thus the strings most likely to be useful should be - put at the end of the dictionary, not at the front. In addition, the - current implementation of deflate will use at most the window size minus - 262 bytes of the provided dictionary. + discarded, for example if the dictionary is larger than the window size + provided in deflateInit or deflateInit2. Thus the strings most likely to be + useful should be put at the end of the dictionary, not at the front. In + addition, the current implementation of deflate will use at most the window + size minus 262 bytes of the provided dictionary. Upon return of this function, strm->adler is set to the adler32 value of the dictionary; the decompressor may later use this value to determine - which dictionary has been used by the compressor. (The adler32 value + which dictionary has been used by the compressor. (The adler32 value applies to the whole dictionary even if only a subset of the dictionary is actually used by the compressor.) If a raw deflate was requested, then the adler32 value is not computed and strm->adler is not set. deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a - parameter is invalid (such as NULL dictionary) or the stream state is + parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is inconsistent (for example if deflate has already been called for this stream - or if the compression method is bsort). deflateSetDictionary does not - perform any compression: this will be done by deflate(). + or if not at a block boundary for raw deflate). deflateSetDictionary does + not perform any compression: this will be done by deflate(). */ ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, @@ -581,26 +635,26 @@ ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, This function can be useful when several compression strategies will be tried, for example when there are several ways of pre-processing the input - data with a filter. The streams that will be discarded should then be freed + data with a filter. The streams that will be discarded should then be freed by calling deflateEnd. Note that deflateCopy duplicates the internal - compression state which can be quite large, so this strategy is slow and - can consume lots of memory. + compression state which can be quite large, so this strategy is slow and can + consume lots of memory. deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_STREAM_ERROR if the source stream state was inconsistent - (such as zalloc being NULL). msg is left unchanged in both source and + (such as zalloc being Z_NULL). msg is left unchanged in both source and destination. */ ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); /* This function is equivalent to deflateEnd followed by deflateInit, - but does not free and reallocate all the internal compression state. - The stream will keep the same compression level and any other attributes - that may have been set by deflateInit2. + but does not free and reallocate all the internal compression state. The + stream will keep the same compression level and any other attributes that + may have been set by deflateInit2. - deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent (such as zalloc or state being NULL). + deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being Z_NULL). */ ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, @@ -610,18 +664,18 @@ ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, Dynamically update the compression level and compression strategy. The interpretation of level and strategy is as in deflateInit2. This can be used to switch between compression and straight copy of the input data, or - to switch to a different kind of input data requiring a different - strategy. If the compression level is changed, the input available so far - is compressed with the old level (and may be flushed); the new level will - take effect only at the next call of deflate(). + to switch to a different kind of input data requiring a different strategy. + If the compression level is changed, the input available so far is + compressed with the old level (and may be flushed); the new level will take + effect only at the next call of deflate(). Before the call of deflateParams, the stream state must be set as for - a call of deflate(), since the currently available input may have to - be compressed and flushed. In particular, strm->avail_out must be non-zero. + a call of deflate(), since the currently available input may have to be + compressed and flushed. In particular, strm->avail_out must be non-zero. deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source - stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR - if strm->avail_out was zero. + stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR if + strm->avail_out was zero. */ ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm, @@ -645,31 +699,53 @@ ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, uLong sourceLen)); /* deflateBound() returns an upper bound on the compressed size after - deflation of sourceLen bytes. It must be called after deflateInit() - or deflateInit2(). This would be used to allocate an output buffer - for deflation in a single pass, and so would be called before deflate(). + deflation of sourceLen bytes. It must be called after deflateInit() or + deflateInit2(), and after deflateSetHeader(), if used. This would be used + to allocate an output buffer for deflation in a single pass, and so would be + called before deflate(). If that first deflate() call is provided the + sourceLen input bytes, an output buffer allocated to the size returned by + deflateBound(), and the flush value Z_FINISH, then deflate() is guaranteed + to return Z_STREAM_END. Note that it is possible for the compressed size to + be larger than the value returned by deflateBound() if flush options other + than Z_FINISH or Z_NO_FLUSH are used. */ +ZEXTERN int ZEXPORT deflatePending OF((z_streamp strm, + unsigned *pending, + int *bits)); +/* + deflatePending() returns the number of bytes and bits of output that have + been generated, but not yet provided in the available output. The bytes not + provided would be due to the available output space having being consumed. + The number of bits of output not provided are between 0 and 7, where they + await more bits to join them in order to fill out a full byte. If pending + or bits are Z_NULL, then those values are not set. + + deflatePending returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. + */ + ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, int bits, int value)); /* deflatePrime() inserts bits in the deflate output stream. The intent - is that this function is used to start off the deflate output with the - bits leftover from a previous deflate stream when appending to it. As such, - this function can only be used for raw deflate, and must be used before the - first deflate() call after a deflateInit2() or deflateReset(). bits must be - less than or equal to 16, and that many of the least significant bits of - value will be inserted in the output. + is that this function is used to start off the deflate output with the bits + leftover from a previous deflate stream when appending to it. As such, this + function can only be used for raw deflate, and must be used before the first + deflate() call after a deflateInit2() or deflateReset(). bits must be less + than or equal to 16, and that many of the least significant bits of value + will be inserted in the output. - deflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent. + deflatePrime returns Z_OK if success, Z_BUF_ERROR if there was not enough + room in the internal buffer to insert the bits, or Z_STREAM_ERROR if the + source stream state was inconsistent. */ ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, gz_headerp head)); /* - deflateSetHeader() provides gzip header information for when a gzip + deflateSetHeader() provides gzip header information for when a gzip stream is requested by deflateInit2(). deflateSetHeader() may be called after deflateInit2() or deflateReset() and before the first call of deflate(). The text, time, os, extra field, name, and comment information @@ -682,11 +758,11 @@ ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, 1.3.x) do not support header crc's, and will report that it is a "multi-part gzip file" and give up. - If deflateSetHeader is not used, the default gzip header has text false, + If deflateSetHeader is not used, the default gzip header has text false, the time set to zero, and os set to 255, with no extra, name, or comment fields. The gzip header is returned to the default state by deflateReset(). - deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source + deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent. */ @@ -694,43 +770,50 @@ ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, int windowBits)); - This is another version of inflateInit with an extra parameter. The + This is another version of inflateInit with an extra parameter. The fields next_in, avail_in, zalloc, zfree and opaque must be initialized before by the caller. The windowBits parameter is the base two logarithm of the maximum window size (the size of the history buffer). It should be in the range 8..15 for - this version of the library. The default value is 15 if inflateInit is used - instead. windowBits must be greater than or equal to the windowBits value + this version of the library. The default value is 15 if inflateInit is used + instead. windowBits must be greater than or equal to the windowBits value provided to deflateInit2() while compressing, or it must be equal to 15 if - deflateInit2() was not used. If a compressed stream with a larger window + deflateInit2() was not used. If a compressed stream with a larger window size is given as input, inflate() will return with the error code Z_DATA_ERROR instead of trying to allocate a larger window. - windowBits can also be -8..-15 for raw inflate. In this case, -windowBits - determines the window size. inflate() will then process raw deflate data, + windowBits can also be zero to request that inflate use the window size in + the zlib header of the compressed stream. + + windowBits can also be -8..-15 for raw inflate. In this case, -windowBits + determines the window size. inflate() will then process raw deflate data, not looking for a zlib or gzip header, not generating a check value, and not - looking for any check values for comparison at the end of the stream. This + looking for any check values for comparison at the end of the stream. This is for use with other formats that use the deflate compressed data format - such as zip. Those formats provide their own check values. If a custom + such as zip. Those formats provide their own check values. If a custom format is developed using the raw deflate format for compressed data, it is recommended that a check value such as an adler32 or a crc32 be applied to the uncompressed data as is done in the zlib, gzip, and zip formats. For - most applications, the zlib format should be used as is. Note that comments + most applications, the zlib format should be used as is. Note that comments above on the use in deflateInit2() applies to the magnitude of windowBits. - windowBits can also be greater than 15 for optional gzip decoding. Add + windowBits can also be greater than 15 for optional gzip decoding. Add 32 to windowBits to enable zlib and gzip decoding with automatic header detection, or add 16 to decode only the gzip format (the zlib format will - return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is - a crc32 instead of an adler32. + return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is a + crc32 instead of an adler32. inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_STREAM_ERROR if a parameter is invalid (such as a null strm). msg - is set to null if there is no error message. inflateInit2 does not perform - any decompression apart from reading the zlib header if present: this will - be done by inflate(). (So next_in and avail_in may be modified, but next_out - and avail_out are unchanged.) + memory, Z_VERSION_ERROR if the zlib library version is incompatible with the + version assumed by the caller, or Z_STREAM_ERROR if the parameters are + invalid, such as a null pointer to the structure. msg is set to null if + there is no error message. inflateInit2 does not perform any decompression + apart from possibly reading the zlib header if present: actual decompression + will be done by inflate(). (So next_in and avail_in may be modified, but + next_out and avail_out are unused and unchanged.) The current implementation + of inflateInit2() does not process any header information -- that is + deferred until inflate() is called. */ ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, @@ -738,36 +821,41 @@ ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, uInt dictLength)); /* Initializes the decompression dictionary from the given uncompressed byte - sequence. This function must be called immediately after a call of inflate, - if that call returned Z_NEED_DICT. The dictionary chosen by the compressor + sequence. This function must be called immediately after a call of inflate, + if that call returned Z_NEED_DICT. The dictionary chosen by the compressor can be determined from the adler32 value returned by that call of inflate. The compressor and decompressor must use exactly the same dictionary (see - deflateSetDictionary). For raw inflate, this function can be called - immediately after inflateInit2() or inflateReset() and before any call of - inflate() to set the dictionary. The application must insure that the - dictionary that was used for compression is provided. + deflateSetDictionary). For raw inflate, this function can be called at any + time to set the dictionary. If the provided dictionary is smaller than the + window and there is already data in the window, then the provided dictionary + will amend what's there. The application must insure that the dictionary + that was used for compression is provided. inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a - parameter is invalid (such as NULL dictionary) or the stream state is + parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the - expected one (incorrect adler32 value). inflateSetDictionary does not + expected one (incorrect adler32 value). inflateSetDictionary does not perform any decompression: this will be done by subsequent calls of inflate(). */ ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); /* - Skips invalid compressed data until a full flush point (see above the - description of deflate with Z_FULL_FLUSH) can be found, or until all - available input is skipped. No output is provided. + Skips invalid compressed data until a possible full flush point (see above + for the description of deflate with Z_FULL_FLUSH) can be found, or until all + available input is skipped. No output is provided. - inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR - if no more input was provided, Z_DATA_ERROR if no flush point has been found, - or Z_STREAM_ERROR if the stream structure was inconsistent. In the success - case, the application may save the current current value of total_in which - indicates where valid compressed data was found. In the error case, the - application may repeatedly call inflateSync, providing more input each time, - until success or end of the input data. + inflateSync searches for a 00 00 FF FF pattern in the compressed data. + All full flush points have this pattern, but not all occurences of this + pattern are full flush points. + + inflateSync returns Z_OK if a possible full flush point has been found, + Z_BUF_ERROR if no more input was provided, Z_DATA_ERROR if no flush point + has been found, or Z_STREAM_ERROR if the stream structure was inconsistent. + In the success case, the application may save the current current value of + total_in which indicates where valid compressed data was found. In the + error case, the application may repeatedly call inflateSync, providing more + input each time, until success or end of the input data. */ ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, @@ -782,18 +870,30 @@ ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_STREAM_ERROR if the source stream state was inconsistent - (such as zalloc being NULL). msg is left unchanged in both source and + (such as zalloc being Z_NULL). msg is left unchanged in both source and destination. */ ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); /* This function is equivalent to inflateEnd followed by inflateInit, - but does not free and reallocate all the internal decompression state. - The stream will keep attributes that may have been set by inflateInit2. + but does not free and reallocate all the internal decompression state. The + stream will keep attributes that may have been set by inflateInit2. - inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent (such as zalloc or state being NULL). + inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being Z_NULL). +*/ + +ZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm, + int windowBits)); +/* + This function is the same as inflateReset, but it also permits changing + the wrap and window size requests. The windowBits parameter is interpreted + the same as it is for inflateInit2. + + inflateReset2 returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being Z_NULL), or if + the windowBits parameter is invalid. */ ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, @@ -801,54 +901,87 @@ ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, int value)); /* This function inserts bits in the inflate input stream. The intent is - that this function is used to start inflating at a bit position in the - middle of a byte. The provided bits will be used before any bytes are used - from next_in. This function should only be used with raw inflate, and - should be used before the first inflate() call after inflateInit2() or - inflateReset(). bits must be less than or equal to 16, and that many of the - least significant bits of value will be inserted in the input. + that this function is used to start inflating at a bit position in the + middle of a byte. The provided bits will be used before any bytes are used + from next_in. This function should only be used with raw inflate, and + should be used before the first inflate() call after inflateInit2() or + inflateReset(). bits must be less than or equal to 16, and that many of the + least significant bits of value will be inserted in the input. - inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source + If bits is negative, then the input stream bit buffer is emptied. Then + inflatePrime() can be called again to put bits in the buffer. This is used + to clear out bits leftover after feeding inflate a block description prior + to feeding inflate codes. + + inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent. */ +ZEXTERN long ZEXPORT inflateMark OF((z_streamp strm)); +/* + This function returns two values, one in the lower 16 bits of the return + value, and the other in the remaining upper bits, obtained by shifting the + return value down 16 bits. If the upper value is -1 and the lower value is + zero, then inflate() is currently decoding information outside of a block. + If the upper value is -1 and the lower value is non-zero, then inflate is in + the middle of a stored block, with the lower value equaling the number of + bytes from the input remaining to copy. If the upper value is not -1, then + it is the number of bits back from the current bit position in the input of + the code (literal or length/distance pair) currently being processed. In + that case the lower value is the number of bytes already emitted for that + code. + + A code is being processed if inflate is waiting for more input to complete + decoding of the code, or if it has completed decoding but is waiting for + more output space to write the literal or match data. + + inflateMark() is used to mark locations in the input data for random + access, which may be at bit positions, and to note those cases where the + output of a code may span boundaries of random access blocks. The current + location in the input stream can be determined from avail_in and data_type + as noted in the description for the Z_BLOCK flush parameter for inflate. + + inflateMark returns the value noted above or -1 << 16 if the provided + source stream state was inconsistent. +*/ + ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm, gz_headerp head)); /* - inflateGetHeader() requests that gzip header information be stored in the + inflateGetHeader() requests that gzip header information be stored in the provided gz_header structure. inflateGetHeader() may be called after inflateInit2() or inflateReset(), and before the first call of inflate(). As inflate() processes the gzip stream, head->done is zero until the header is completed, at which time head->done is set to one. If a zlib stream is being decoded, then head->done is set to -1 to indicate that there will be - no gzip header information forthcoming. Note that Z_BLOCK can be used to - force inflate() to return immediately after header processing is complete - and before any actual data is decompressed. + no gzip header information forthcoming. Note that Z_BLOCK or Z_TREES can be + used to force inflate() to return immediately after header processing is + complete and before any actual data is decompressed. - The text, time, xflags, and os fields are filled in with the gzip header + The text, time, xflags, and os fields are filled in with the gzip header contents. hcrc is set to true if there is a header CRC. (The header CRC - was valid if done is set to one.) If extra is not Z_NULL, then extra_max + was valid if done is set to one.) If extra is not Z_NULL, then extra_max contains the maximum number of bytes to write to extra. Once done is true, extra_len contains the actual extra field length, and extra contains the extra field, or that field truncated if extra_max is less than extra_len. If name is not Z_NULL, then up to name_max characters are written there, terminated with a zero unless the length is greater than name_max. If comment is not Z_NULL, then up to comm_max characters are written there, - terminated with a zero unless the length is greater than comm_max. When - any of extra, name, or comment are not Z_NULL and the respective field is - not present in the header, then that field is set to Z_NULL to signal its + terminated with a zero unless the length is greater than comm_max. When any + of extra, name, or comment are not Z_NULL and the respective field is not + present in the header, then that field is set to Z_NULL to signal its absence. This allows the use of deflateSetHeader() with the returned structure to duplicate the header. However if those fields are set to allocated memory, then the application will need to save those pointers elsewhere so that they can be eventually freed. - If inflateGetHeader is not used, then the header information is simply + If inflateGetHeader is not used, then the header information is simply discarded. The header is always checked for validity, including the header CRC if present. inflateReset() will reset the process to discard the header information. The application would need to call inflateGetHeader() again to retrieve the header from the next gzip stream. - inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source + inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent. */ @@ -869,9 +1002,9 @@ ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits, See inflateBack() for the usage of these routines. inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of - the paramaters are invalid, Z_MEM_ERROR if the internal state could not - be allocated, or Z_VERSION_ERROR if the version of the library does not - match the version of the header file. + the parameters are invalid, Z_MEM_ERROR if the internal state could not be + allocated, or Z_VERSION_ERROR if the version of the library does not match + the version of the header file. */ typedef unsigned (*in_func) OF((void FAR *, unsigned char FAR * FAR *)); @@ -891,15 +1024,15 @@ ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, inflateBackInit() must be called first to allocate the internal state and to initialize the state with the user-provided window buffer. inflateBack() may then be used multiple times to inflate a complete, raw - deflate stream with each call. inflateBackEnd() is then called to free - the allocated state. + deflate stream with each call. inflateBackEnd() is then called to free the + allocated state. A raw deflate stream is one with no zlib or gzip header or trailer. This routine would normally be used in a utility that reads zip or gzip files and writes out uncompressed files. The utility would decode the - header and process the trailer on its own, hence this routine expects - only the raw deflate stream to decompress. This is different from the - normal behavior of inflate(), which expects either a zlib or gzip header and + header and process the trailer on its own, hence this routine expects only + the raw deflate stream to decompress. This is different from the normal + behavior of inflate(), which expects either a zlib or gzip header and trailer around the deflate stream. inflateBack() uses two subroutines supplied by the caller that are then @@ -925,7 +1058,7 @@ ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in must also be initialized, and then if strm->avail_in is not zero, input will - initially be taken from strm->next_in[0 .. strm->avail_in - 1]. + initially be taken from strm->next_in[0 .. strm->avail_in - 1]. The in_desc and out_desc parameters of inflateBack() is passed as the first parameter of in() and out() respectively when they are called. These @@ -935,15 +1068,15 @@ ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, On return, inflateBack() will set strm->next_in and strm->avail_in to pass back any unused input that was provided by the last in() call. The return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR - if in() or out() returned an error, Z_DATA_ERROR if there was a format - error in the deflate stream (in which case strm->msg is set to indicate the - nature of the error), or Z_STREAM_ERROR if the stream was not properly - initialized. In the case of Z_BUF_ERROR, an input or output error can be - distinguished using strm->next_in which will be Z_NULL only if in() returned - an error. If strm->next is not Z_NULL, then the Z_BUF_ERROR was due to - out() returning non-zero. (in() will always be called before out(), so - strm->next_in is assured to be defined if out() returns non-zero.) Note - that inflateBack() cannot return Z_OK. + if in() or out() returned an error, Z_DATA_ERROR if there was a format error + in the deflate stream (in which case strm->msg is set to indicate the nature + of the error), or Z_STREAM_ERROR if the stream was not properly initialized. + In the case of Z_BUF_ERROR, an input or output error can be distinguished + using strm->next_in which will be Z_NULL only if in() returned an error. If + strm->next_in is not Z_NULL, then the Z_BUF_ERROR was due to out() returning + non-zero. (in() will always be called before out(), so strm->next_in is + assured to be defined if out() returns non-zero.) Note that inflateBack() + cannot return Z_OK. */ ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm)); @@ -995,27 +1128,27 @@ ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); 27-31: 0 (reserved) */ +#ifndef Z_SOLO /* utility functions */ /* - The following utility functions are implemented on top of the - basic stream-oriented functions. To simplify the interface, some - default options are assumed (compression level and memory usage, - standard memory allocation functions). The source code of these - utility functions can easily be modified if you need special options. + The following utility functions are implemented on top of the basic + stream-oriented functions. To simplify the interface, some default options + are assumed (compression level and memory usage, standard memory allocation + functions). The source code of these utility functions can be modified if + you need special options. */ ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen)); /* Compresses the source buffer into the destination buffer. sourceLen is - the byte length of the source buffer. Upon entry, destLen is the total - size of the destination buffer, which must be at least the value returned - by compressBound(sourceLen). Upon exit, destLen is the actual size of the + the byte length of the source buffer. Upon entry, destLen is the total size + of the destination buffer, which must be at least the value returned by + compressBound(sourceLen). Upon exit, destLen is the actual size of the compressed buffer. - This function can be used to compress a whole file at once if the - input file is mmap'ed. + compress returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if there was not enough room in the output buffer. @@ -1025,11 +1158,11 @@ ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen, int level)); /* - Compresses the source buffer into the destination buffer. The level + Compresses the source buffer into the destination buffer. The level parameter has the same meaning as in deflateInit. sourceLen is the byte - length of the source buffer. Upon entry, destLen is the total size of the + length of the source buffer. Upon entry, destLen is the total size of the destination buffer, which must be at least the value returned by - compressBound(sourceLen). Upon exit, destLen is the actual size of the + compressBound(sourceLen). Upon exit, destLen is the actual size of the compressed buffer. compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough @@ -1040,159 +1173,255 @@ ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen)); /* compressBound() returns an upper bound on the compressed size after - compress() or compress2() on sourceLen bytes. It would be used before - a compress() or compress2() call to allocate the destination buffer. + compress() or compress2() on sourceLen bytes. It would be used before a + compress() or compress2() call to allocate the destination buffer. */ ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen)); /* Decompresses the source buffer into the destination buffer. sourceLen is - the byte length of the source buffer. Upon entry, destLen is the total - size of the destination buffer, which must be large enough to hold the - entire uncompressed data. (The size of the uncompressed data must have - been saved previously by the compressor and transmitted to the decompressor - by some mechanism outside the scope of this compression library.) - Upon exit, destLen is the actual size of the compressed buffer. - This function can be used to decompress a whole file at once if the - input file is mmap'ed. + the byte length of the source buffer. Upon entry, destLen is the total size + of the destination buffer, which must be large enough to hold the entire + uncompressed data. (The size of the uncompressed data must have been saved + previously by the compressor and transmitted to the decompressor by some + mechanism outside the scope of this compression library.) Upon exit, destLen + is the actual size of the uncompressed buffer. uncompress returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if there was not enough room in the output - buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. + buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. In + the case where there is not enough room, uncompress() will fill the output + buffer with the uncompressed data up to that point. */ + /* gzip file access functions */ -typedef voidp gzFile; - -ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); /* - Opens a gzip (.gz) file for reading or writing. The mode parameter - is as in fopen ("rb" or "wb") but can also include a compression level - ("wb9") or a strategy: 'f' for filtered data as in "wb6f", 'h' for - Huffman only compression as in "wb1h", or 'R' for run-length encoding - as in "wb1R". (See the description of deflateInit2 for more information - about the strategy parameter.) + This library supports reading and writing files in gzip (.gz) format with + an interface similar to that of stdio, using the functions that start with + "gz". The gzip format is different from the zlib format. gzip is a gzip + wrapper, documented in RFC 1952, wrapped around a deflate stream. +*/ + +typedef struct gzFile_s *gzFile; /* semi-opaque gzip file descriptor */ + +/* +ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); + + Opens a gzip (.gz) file for reading or writing. The mode parameter is as + in fopen ("rb" or "wb") but can also include a compression level ("wb9") or + a strategy: 'f' for filtered data as in "wb6f", 'h' for Huffman-only + compression as in "wb1h", 'R' for run-length encoding as in "wb1R", or 'F' + for fixed code compression as in "wb9F". (See the description of + deflateInit2 for more information about the strategy parameter.) 'T' will + request transparent writing or appending with no compression and not using + the gzip format. + + "a" can be used instead of "w" to request that the gzip stream that will + be written be appended to the file. "+" will result in an error, since + reading and writing to the same gzip file is not supported. The addition of + "x" when writing will create the file exclusively, which fails if the file + already exists. On systems that support it, the addition of "e" when + reading or writing will set the flag to close the file on an execve() call. + + These functions, as well as gzip, will read and decode a sequence of gzip + streams in a file. The append function of gzopen() can be used to create + such a file. (Also see gzflush() for another way to do this.) When + appending, gzopen does not test whether the file begins with a gzip stream, + nor does it look for the end of the gzip streams to begin appending. gzopen + will simply append a gzip stream to the existing file. gzopen can be used to read a file which is not in gzip format; in this - case gzread will directly read from the file without decompression. + case gzread will directly read from the file without decompression. When + reading, this will be detected automatically by looking for the magic two- + byte gzip header. - gzopen returns NULL if the file could not be opened or if there was - insufficient memory to allocate the (de)compression state; errno - can be checked to distinguish the two cases (if errno is zero, the - zlib error is Z_MEM_ERROR). */ + gzopen returns NULL if the file could not be opened, if there was + insufficient memory to allocate the gzFile state, or if an invalid mode was + specified (an 'r', 'w', or 'a' was not provided, or '+' was provided). + errno can be checked to determine if the reason gzopen failed was that the + file could not be opened. +*/ -ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); +ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); /* - gzdopen() associates a gzFile with the file descriptor fd. File - descriptors are obtained from calls like open, dup, creat, pipe or - fileno (in the file has been previously opened with fopen). - The mode parameter is as in gzopen. - The next call of gzclose on the returned gzFile will also close the - file descriptor fd, just like fclose(fdopen(fd), mode) closes the file - descriptor fd. If you want to keep fd open, use gzdopen(dup(fd), mode). - gzdopen returns NULL if there was insufficient memory to allocate - the (de)compression state. + gzdopen associates a gzFile with the file descriptor fd. File descriptors + are obtained from calls like open, dup, creat, pipe or fileno (if the file + has been previously opened with fopen). The mode parameter is as in gzopen. + + The next call of gzclose on the returned gzFile will also close the file + descriptor fd, just like fclose(fdopen(fd, mode)) closes the file descriptor + fd. If you want to keep fd open, use fd = dup(fd_keep); gz = gzdopen(fd, + mode);. The duplicated descriptor should be saved to avoid a leak, since + gzdopen does not close fd if it fails. If you are using fileno() to get the + file descriptor from a FILE *, then you will have to use dup() to avoid + double-close()ing the file descriptor. Both gzclose() and fclose() will + close the associated file descriptor, so they need to have different file + descriptors. + + gzdopen returns NULL if there was insufficient memory to allocate the + gzFile state, if an invalid mode was specified (an 'r', 'w', or 'a' was not + provided, or '+' was provided), or if fd is -1. The file descriptor is not + used until the next gz* read, write, seek, or close operation, so gzdopen + will not detect if fd is invalid (unless fd is -1). +*/ + +ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size)); +/* + Set the internal buffer size used by this library's functions. The + default buffer size is 8192 bytes. This function must be called after + gzopen() or gzdopen(), and before any other calls that read or write the + file. The buffer memory allocation is always deferred to the first read or + write. Two buffers are allocated, either both of the specified size when + writing, or one of the specified size and the other twice that size when + reading. A larger buffer size of, for example, 64K or 128K bytes will + noticeably increase the speed of decompression (reading). + + The new buffer size also affects the maximum length for gzprintf(). + + gzbuffer() returns 0 on success, or -1 on failure, such as being called + too late. */ ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); /* - Dynamically update the compression level or strategy. See the description + Dynamically update the compression level or strategy. See the description of deflateInit2 for the meaning of these parameters. + gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not opened for writing. */ -ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); +ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); /* - Reads the given number of uncompressed bytes from the compressed file. - If the input file was not in gzip format, gzread copies the given number - of bytes into the buffer. - gzread returns the number of uncompressed bytes actually read (0 for - end of file, -1 for error). */ + Reads the given number of uncompressed bytes from the compressed file. If + the input file is not in gzip format, gzread copies the given number of + bytes into the buffer directly from the file. -ZEXTERN int ZEXPORT gzwrite OF((gzFile file, - voidpc buf, unsigned len)); -/* - Writes the given number of uncompressed bytes into the compressed file. - gzwrite returns the number of uncompressed bytes actually written - (0 in case of error). + After reaching the end of a gzip stream in the input, gzread will continue + to read, looking for another gzip stream. Any number of gzip streams may be + concatenated in the input file, and will all be decompressed by gzread(). + If something other than a gzip stream is encountered after a gzip stream, + that remaining trailing garbage is ignored (and no error is returned). + + gzread can be used to read a gzip file that is being concurrently written. + Upon reaching the end of the input, gzread will return with the available + data. If the error code returned by gzerror is Z_OK or Z_BUF_ERROR, then + gzclearerr can be used to clear the end of file indicator in order to permit + gzread to be tried again. Z_OK indicates that a gzip stream was completed + on the last gzread. Z_BUF_ERROR indicates that the input file ended in the + middle of a gzip stream. Note that gzread does not return -1 in the event + of an incomplete gzip stream. This error is deferred until gzclose(), which + will return Z_BUF_ERROR if the last gzread ended in the middle of a gzip + stream. Alternatively, gzerror can be used before gzclose to detect this + case. + + gzread returns the number of uncompressed bytes actually read, less than + len for end of file, or -1 for error. */ -ZEXTERN int ZEXPORTVA gzprintf OF((gzFile file, const char *format, ...)); +ZEXTERN int ZEXPORT gzwrite OF((gzFile file, + voidpc buf, unsigned len)); /* - Converts, formats, and writes the args to the compressed file under - control of the format string, as in fprintf. gzprintf returns the number of - uncompressed bytes actually written (0 in case of error). The number of - uncompressed bytes written is limited to 4095. The caller should assure that - this limit is not exceeded. If it is exceeded, then gzprintf() will return - return an error (0) with nothing written. In this case, there may also be a - buffer overflow with unpredictable consequences, which is possible only if - zlib was compiled with the insecure functions sprintf() or vsprintf() - because the secure snprintf() or vsnprintf() functions were not available. + Writes the given number of uncompressed bytes into the compressed file. + gzwrite returns the number of uncompressed bytes written or 0 in case of + error. +*/ + +ZEXTERN int ZEXPORTVA gzprintf Z_ARG((gzFile file, const char *format, ...)); +/* + Converts, formats, and writes the arguments to the compressed file under + control of the format string, as in fprintf. gzprintf returns the number of + uncompressed bytes actually written, or 0 in case of error. The number of + uncompressed bytes written is limited to 8191, or one less than the buffer + size given to gzbuffer(). The caller should assure that this limit is not + exceeded. If it is exceeded, then gzprintf() will return an error (0) with + nothing written. In this case, there may also be a buffer overflow with + unpredictable consequences, which is possible only if zlib was compiled with + the insecure functions sprintf() or vsprintf() because the secure snprintf() + or vsnprintf() functions were not available. This can be determined using + zlibCompileFlags(). */ ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); /* - Writes the given null-terminated string to the compressed file, excluding + Writes the given null-terminated string to the compressed file, excluding the terminating null character. - gzputs returns the number of characters written, or -1 in case of error. + + gzputs returns the number of characters written, or -1 in case of error. */ ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); /* - Reads bytes from the compressed file until len-1 characters are read, or - a newline character is read and transferred to buf, or an end-of-file - condition is encountered. The string is then terminated with a null - character. - gzgets returns buf, or Z_NULL in case of error. + Reads bytes from the compressed file until len-1 characters are read, or a + newline character is read and transferred to buf, or an end-of-file + condition is encountered. If any characters are read or if len == 1, the + string is terminated with a null character. If no characters are read due + to an end-of-file or len < 1, then the buffer is left untouched. + + gzgets returns buf which is a null-terminated string, or it returns NULL + for end-of-file or in case of error. If there was an error, the contents at + buf are indeterminate. */ -ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); +ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); /* - Writes c, converted to an unsigned char, into the compressed file. - gzputc returns the value that was written, or -1 in case of error. + Writes c, converted to an unsigned char, into the compressed file. gzputc + returns the value that was written, or -1 in case of error. */ -ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); +ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); /* - Reads one byte from the compressed file. gzgetc returns this byte - or -1 in case of end of file or error. + Reads one byte from the compressed file. gzgetc returns this byte or -1 + in case of end of file or error. This is implemented as a macro for speed. + As such, it does not do all of the checking the other functions do. I.e. + it does not check to see if file is NULL, nor whether the structure file + points to has been clobbered or not. */ -ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); +ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); /* - Push one character back onto the stream to be read again later. - Only one character of push-back is allowed. gzungetc() returns the - character pushed, or -1 on failure. gzungetc() will fail if a - character has been pushed but not read yet, or if c is -1. The pushed - character will be discarded if the stream is repositioned with gzseek() - or gzrewind(). + Push one character back onto the stream to be read as the first character + on the next read. At least one character of push-back is allowed. + gzungetc() returns the character pushed, or -1 on failure. gzungetc() will + fail if c is -1, and may fail if a character has been pushed but not read + yet. If gzungetc is used immediately after gzopen or gzdopen, at least the + output buffer size of pushed characters is allowed. (See gzbuffer above.) + The pushed character will be discarded if the stream is repositioned with + gzseek() or gzrewind(). */ -ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); +ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); /* - Flushes all pending output into the compressed file. The parameter - flush is as in the deflate() function. The return value is the zlib - error number (see function gzerror below). gzflush returns Z_OK if - the flush parameter is Z_FINISH and all output could be flushed. - gzflush should be called only when strictly necessary because it can - degrade compression. + Flushes all pending output into the compressed file. The parameter flush + is as in the deflate() function. The return value is the zlib error number + (see function gzerror below). gzflush is only permitted when writing. + + If the flush parameter is Z_FINISH, the remaining data is written and the + gzip stream is completed in the output. If gzwrite() is called again, a new + gzip stream will be started in the output. gzread() is able to read such + concatented gzip streams. + + gzflush should be called only when strictly necessary because it will + degrade compression if called too often. */ -ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, - z_off_t offset, int whence)); /* - Sets the starting position for the next gzread or gzwrite on the - given compressed file. The offset represents a number of bytes in the - uncompressed data stream. The whence parameter is defined as in lseek(2); +ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, + z_off_t offset, int whence)); + + Sets the starting position for the next gzread or gzwrite on the given + compressed file. The offset represents a number of bytes in the + uncompressed data stream. The whence parameter is defined as in lseek(2); the value SEEK_END is not supported. + If the file is opened for reading, this function is emulated but can be - extremely slow. If the file is opened for writing, only forward seeks are + extremely slow. If the file is opened for writing, only forward seeks are supported; gzseek then compresses a sequence of zeroes up to the new starting position. - gzseek returns the resulting offset location as measured in bytes from + gzseek returns the resulting offset location as measured in bytes from the beginning of the uncompressed stream, or -1 in case of error, in particular if the file is opened for writing and the new starting position would be before the current position. @@ -1202,68 +1431,134 @@ ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); /* Rewinds the given file. This function is supported only for reading. - gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) + gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) */ -ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); /* - Returns the starting position for the next gzread or gzwrite on the - given compressed file. This position represents a number of bytes in the - uncompressed data stream. +ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); - gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) + Returns the starting position for the next gzread or gzwrite on the given + compressed file. This position represents a number of bytes in the + uncompressed data stream, and is zero when starting, even if appending or + reading a gzip stream from the middle of a file using gzdopen(). + + gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) +*/ + +/* +ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile file)); + + Returns the current offset in the file being read or written. This offset + includes the count of bytes that precede the gzip stream, for example when + appending or when using gzdopen() for reading. When reading, the offset + does not include as yet unused buffered input. This information can be used + for a progress indicator. On error, gzoffset() returns -1. */ ZEXTERN int ZEXPORT gzeof OF((gzFile file)); /* - Returns 1 when EOF has previously been detected reading the given - input stream, otherwise zero. + Returns true (1) if the end-of-file indicator has been set while reading, + false (0) otherwise. Note that the end-of-file indicator is set only if the + read tried to go past the end of the input, but came up short. Therefore, + just like feof(), gzeof() may return false even if there is no more data to + read, in the event that the last read request was for the exact number of + bytes remaining in the input file. This will happen if the input file size + is an exact multiple of the buffer size. + + If gzeof() returns true, then the read functions will return no more data, + unless the end-of-file indicator is reset by gzclearerr() and the input file + has grown since the previous end of file was detected. */ ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); /* - Returns 1 if file is being read directly without decompression, otherwise - zero. + Returns true (1) if file is being copied directly while reading, or false + (0) if file is a gzip stream being decompressed. + + If the input file is empty, gzdirect() will return true, since the input + does not contain a gzip stream. + + If gzdirect() is used immediately after gzopen() or gzdopen() it will + cause buffers to be allocated to allow reading the file to determine if it + is a gzip file. Therefore if gzbuffer() is used, it should be called before + gzdirect(). + + When writing, gzdirect() returns true (1) if transparent writing was + requested ("wT" for the gzopen() mode), or false (0) otherwise. (Note: + gzdirect() is not needed when writing. Transparent writing must be + explicitly requested, so the application already knows the answer. When + linking statically, using gzdirect() will include all of the zlib code for + gzip file reading and decompression, which may not be desired.) */ ZEXTERN int ZEXPORT gzclose OF((gzFile file)); /* - Flushes all pending output if necessary, closes the compressed file - and deallocates all the (de)compression state. The return value is the zlib - error number (see function gzerror below). + Flushes all pending output if necessary, closes the compressed file and + deallocates the (de)compression state. Note that once file is closed, you + cannot call gzerror with file, since its structures have been deallocated. + gzclose must not be called more than once on the same file, just as free + must not be called more than once on the same allocation. + + gzclose will return Z_STREAM_ERROR if file is not valid, Z_ERRNO on a + file operation error, Z_MEM_ERROR if out of memory, Z_BUF_ERROR if the + last read ended in the middle of a gzip stream, or Z_OK on success. +*/ + +ZEXTERN int ZEXPORT gzclose_r OF((gzFile file)); +ZEXTERN int ZEXPORT gzclose_w OF((gzFile file)); +/* + Same as gzclose(), but gzclose_r() is only for use when reading, and + gzclose_w() is only for use when writing or appending. The advantage to + using these instead of gzclose() is that they avoid linking in zlib + compression or decompression code that is not used when only reading or only + writing respectively. If gzclose() is used, then both compression and + decompression code will be included the application when linking to a static + zlib library. */ ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); /* - Returns the error message for the last error which occurred on the - given compressed file. errnum is set to zlib error number. If an - error occurred in the file system and not in the compression library, - errnum is set to Z_ERRNO and the application may consult errno - to get the exact error code. + Returns the error message for the last error which occurred on the given + compressed file. errnum is set to zlib error number. If an error occurred + in the file system and not in the compression library, errnum is set to + Z_ERRNO and the application may consult errno to get the exact error code. + + The application must not modify the returned string. Future calls to + this function may invalidate the previously returned string. If file is + closed, then the string previously returned by gzerror will no longer be + available. + + gzerror() should be used to distinguish errors from end-of-file for those + functions above that do not distinguish those cases in their return values. */ ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); /* - Clears the error and end-of-file flags for file. This is analogous to the - clearerr() function in stdio. This is useful for continuing to read a gzip + Clears the error and end-of-file flags for file. This is analogous to the + clearerr() function in stdio. This is useful for continuing to read a gzip file that is being written concurrently. */ +#endif /* !Z_SOLO */ + /* checksum functions */ /* These functions are not related to compression but are exported - anyway because they might be useful in applications using the - compression library. + anyway because they might be useful in applications using the compression + library. */ ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); /* Update a running Adler-32 checksum with the bytes buf[0..len-1] and - return the updated checksum. If buf is NULL, this function returns - the required initial value for the checksum. - An Adler-32 checksum is almost as reliable as a CRC32 but can be computed - much faster. Usage example: + return the updated checksum. If buf is Z_NULL, this function returns the + required initial value for the checksum. + + An Adler-32 checksum is almost as reliable as a CRC32 but can be computed + much faster. + + Usage example: uLong adler = adler32(0L, Z_NULL, 0); @@ -1273,21 +1568,25 @@ ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); if (adler != original_adler) error(); */ +/* ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, z_off_t len2)); -/* + Combine two Adler-32 checksums into one. For two sequences of bytes, seq1 and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of - seq1 and seq2 concatenated, requiring only adler1, adler2, and len2. + seq1 and seq2 concatenated, requiring only adler1, adler2, and len2. Note + that the z_off_t type (like off_t) is a signed integer. If len2 is + negative, the result has no meaning or utility. */ ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); /* Update a running CRC-32 with the bytes buf[0..len-1] and return the - updated CRC-32. If buf is NULL, this function returns the required initial - value for the for the crc. Pre- and post-conditioning (one's complement) is + updated CRC-32. If buf is Z_NULL, this function returns the required + initial value for the crc. Pre- and post-conditioning (one's complement) is performed within this function so it shouldn't be done by the application. + Usage example: uLong crc = crc32(0L, Z_NULL, 0); @@ -1298,9 +1597,9 @@ ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); if (crc != original_crc) error(); */ +/* ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2)); -/* Combine two CRC-32 check values into one. For two sequences of bytes, seq1 and seq2 with lengths len1 and len2, CRC-32 check values were calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32 @@ -1329,26 +1628,114 @@ ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, const char *version, int stream_size)); #define deflateInit(strm, level) \ - deflateInit_((strm), (level), ZLIB_VERSION, sizeof(z_stream)) + deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream)) #define inflateInit(strm) \ - inflateInit_((strm), ZLIB_VERSION, sizeof(z_stream)) + inflateInit_((strm), ZLIB_VERSION, (int)sizeof(z_stream)) #define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ - (strategy), ZLIB_VERSION, sizeof(z_stream)) + (strategy), ZLIB_VERSION, (int)sizeof(z_stream)) #define inflateInit2(strm, windowBits) \ - inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream)) + inflateInit2_((strm), (windowBits), ZLIB_VERSION, \ + (int)sizeof(z_stream)) #define inflateBackInit(strm, windowBits, window) \ inflateBackInit_((strm), (windowBits), (window), \ - ZLIB_VERSION, sizeof(z_stream)) + ZLIB_VERSION, (int)sizeof(z_stream)) +#ifndef Z_SOLO -#if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL) - struct internal_state {int dummy;}; /* hack for buggy compilers */ +/* gzgetc() macro and its supporting function and exposed data structure. Note + * that the real internal state is much larger than the exposed structure. + * This abbreviated structure exposes just enough for the gzgetc() macro. The + * user should not mess with these exposed elements, since their names or + * behavior could change in the future, perhaps even capriciously. They can + * only be used by the gzgetc() macro. You have been warned. + */ +struct gzFile_s { + unsigned have; + unsigned char *next; + z_off64_t pos; +}; +ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ +#ifdef Z_PREFIX_SET +# undef z_gzgetc +# define z_gzgetc(g) \ + ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : gzgetc(g)) +#else +# define gzgetc(g) \ + ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : gzgetc(g)) #endif +/* provide 64-bit offset functions if _LARGEFILE64_SOURCE defined, and/or + * change the regular functions to 64 bits if _FILE_OFFSET_BITS is 64 (if + * both are true, the application gets the *64 functions, and the regular + * functions are changed to 64 bits) -- in case these are set on systems + * without large file support, _LFS64_LARGEFILE must also be true + */ +#ifdef Z_LARGE64 + ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); + ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); + ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); + ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); + ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off64_t)); + ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off64_t)); +#endif + +#if !defined(ZLIB_INTERNAL) && defined(Z_WANT64) +# ifdef Z_PREFIX_SET +# define z_gzopen z_gzopen64 +# define z_gzseek z_gzseek64 +# define z_gztell z_gztell64 +# define z_gzoffset z_gzoffset64 +# define z_adler32_combine z_adler32_combine64 +# define z_crc32_combine z_crc32_combine64 +# else +# define gzopen gzopen64 +# define gzseek gzseek64 +# define gztell gztell64 +# define gzoffset gzoffset64 +# define adler32_combine adler32_combine64 +# define crc32_combine crc32_combine64 +# endif +# ifndef Z_LARGE64 + ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); + ZEXTERN z_off_t ZEXPORT gzseek64 OF((gzFile, z_off_t, int)); + ZEXTERN z_off_t ZEXPORT gztell64 OF((gzFile)); + ZEXTERN z_off_t ZEXPORT gzoffset64 OF((gzFile)); + ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); +# endif +#else + ZEXTERN gzFile ZEXPORT gzopen OF((const char *, const char *)); + ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile, z_off_t, int)); + ZEXTERN z_off_t ZEXPORT gztell OF((gzFile)); + ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile)); + ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); +#endif + +#else /* Z_SOLO */ + + ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); + +#endif /* !Z_SOLO */ + +/* hack for buggy compilers */ +#if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL) + struct internal_state {int dummy;}; +#endif + +/* undocumented functions */ ZEXTERN const char * ZEXPORT zError OF((int)); -ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp z)); -ZEXTERN const uLongf * ZEXPORT get_crc_table OF((void)); +ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp)); +ZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table OF((void)); +ZEXTERN int ZEXPORT inflateUndermine OF((z_streamp, int)); +ZEXTERN int ZEXPORT inflateResetKeep OF((z_streamp)); +ZEXTERN int ZEXPORT deflateResetKeep OF((z_streamp)); +#if defined(_WIN32) && !defined(Z_SOLO) +ZEXTERN gzFile ZEXPORT gzopen_w OF((const wchar_t *path, + const char *mode)); +#endif #ifdef __cplusplus } diff --git a/neo/libs/zlib/zutil.c b/neo/libs/zlib/zutil.c index d55f5948..65e0d3b7 100644 --- a/neo/libs/zlib/zutil.c +++ b/neo/libs/zlib/zutil.c @@ -1,11 +1,14 @@ /* zutil.c -- target dependent utility functions for the compression library - * Copyright (C) 1995-2005 Jean-loup Gailly. + * Copyright (C) 1995-2005, 2010, 2011, 2012 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ /* @(#) $Id$ */ #include "zutil.h" +#ifndef Z_SOLO +# include "gzguts.h" +#endif #ifndef NO_DUMMY_DECL struct internal_state {int dummy;}; /* for buggy compilers */ @@ -34,25 +37,25 @@ uLong ZEXPORT zlibCompileFlags() uLong flags; flags = 0; - switch (sizeof(uInt)) { + switch ((int)(sizeof(uInt))) { case 2: break; case 4: flags += 1; break; case 8: flags += 2; break; default: flags += 3; } - switch (sizeof(uLong)) { + switch ((int)(sizeof(uLong))) { case 2: break; case 4: flags += 1 << 2; break; case 8: flags += 2 << 2; break; default: flags += 3 << 2; } - switch (sizeof(voidpf)) { + switch ((int)(sizeof(voidpf))) { case 2: break; case 4: flags += 1 << 4; break; case 8: flags += 2 << 4; break; default: flags += 3 << 4; } - switch (sizeof(z_off_t)) { + switch ((int)(sizeof(z_off_t))) { case 2: break; case 4: flags += 1 << 6; break; case 8: flags += 2 << 6; break; @@ -85,27 +88,27 @@ uLong ZEXPORT zlibCompileFlags() #ifdef FASTEST flags += 1L << 21; #endif -#ifdef STDC +#if defined(STDC) || defined(Z_HAVE_STDARG_H) # ifdef NO_vsnprintf - flags += 1L << 25; + flags += 1L << 25; # ifdef HAS_vsprintf_void - flags += 1L << 26; + flags += 1L << 26; # endif # else # ifdef HAS_vsnprintf_void - flags += 1L << 26; + flags += 1L << 26; # endif # endif #else - flags += 1L << 24; + flags += 1L << 24; # ifdef NO_snprintf - flags += 1L << 25; + flags += 1L << 25; # ifdef HAS_sprintf_void - flags += 1L << 26; + flags += 1L << 26; # endif # else # ifdef HAS_snprintf_void - flags += 1L << 26; + flags += 1L << 26; # endif # endif #endif @@ -117,9 +120,9 @@ uLong ZEXPORT zlibCompileFlags() # ifndef verbose # define verbose 0 # endif -int z_verbose = verbose; +int ZLIB_INTERNAL z_verbose = verbose; -void z_error (m) +void ZLIB_INTERNAL z_error (m) char *m; { fprintf(stderr, "%s\n", m); @@ -146,7 +149,7 @@ const char * ZEXPORT zError(err) #ifndef HAVE_MEMCPY -void zmemcpy(dest, source, len) +void ZLIB_INTERNAL zmemcpy(dest, source, len) Bytef* dest; const Bytef* source; uInt len; @@ -157,7 +160,7 @@ void zmemcpy(dest, source, len) } while (--len != 0); } -int zmemcmp(s1, s2, len) +int ZLIB_INTERNAL zmemcmp(s1, s2, len) const Bytef* s1; const Bytef* s2; uInt len; @@ -170,7 +173,7 @@ int zmemcmp(s1, s2, len) return 0; } -void zmemzero(dest, len) +void ZLIB_INTERNAL zmemzero(dest, len) Bytef* dest; uInt len; { @@ -181,6 +184,7 @@ void zmemzero(dest, len) } #endif +#ifndef Z_SOLO #ifdef SYS16BIT @@ -213,7 +217,7 @@ local ptr_table table[MAX_PTR]; * a protected system like OS/2. Use Microsoft C instead. */ -voidpf zcalloc (voidpf opaque, unsigned items, unsigned size) +voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, unsigned items, unsigned size) { voidpf buf = opaque; /* just to make some compilers happy */ ulg bsize = (ulg)items*size; @@ -237,7 +241,7 @@ voidpf zcalloc (voidpf opaque, unsigned items, unsigned size) return buf; } -void zcfree (voidpf opaque, voidpf ptr) +void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) { int n; if (*(ush*)&ptr != 0) { /* object < 64K */ @@ -272,13 +276,13 @@ void zcfree (voidpf opaque, voidpf ptr) # define _hfree hfree #endif -voidpf zcalloc (voidpf opaque, unsigned items, unsigned size) +voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, uInt items, uInt size) { if (opaque) opaque = 0; /* to make compiler happy */ return _halloc((long)items, size); } -void zcfree (voidpf opaque, voidpf ptr) +void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) { if (opaque) opaque = 0; /* to make compiler happy */ _hfree(ptr); @@ -297,7 +301,7 @@ extern voidp calloc OF((uInt items, uInt size)); extern void free OF((voidpf ptr)); #endif -voidpf zcalloc (opaque, items, size) +voidpf ZLIB_INTERNAL zcalloc (opaque, items, size) voidpf opaque; unsigned items; unsigned size; @@ -307,7 +311,7 @@ voidpf zcalloc (opaque, items, size) (voidpf)calloc(items, size); } -void zcfree (opaque, ptr) +void ZLIB_INTERNAL zcfree (opaque, ptr) voidpf opaque; voidpf ptr; { @@ -316,3 +320,5 @@ void zcfree (opaque, ptr) } #endif /* MY_ZCALLOC */ + +#endif /* !Z_SOLO */ diff --git a/neo/libs/zlib/zutil.h b/neo/libs/zlib/zutil.h index b7d5eff8..4e3dcc6a 100644 --- a/neo/libs/zlib/zutil.h +++ b/neo/libs/zlib/zutil.h @@ -1,5 +1,5 @@ /* zutil.h -- internal interface and configuration of the compression library - * Copyright (C) 1995-2005 Jean-loup Gailly. + * Copyright (C) 1995-2012 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -13,30 +13,24 @@ #ifndef ZUTIL_H #define ZUTIL_H -#define ZLIB_INTERNAL +#ifdef HAVE_HIDDEN +# define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) +#else +# define ZLIB_INTERNAL +#endif + #include "zlib.h" -#ifdef STDC -# ifndef _WIN32_WCE +#if defined(STDC) && !defined(Z_SOLO) +# if !(defined(_WIN32_WCE) && defined(_MSC_VER)) # include # endif # include # include #endif -#ifdef NO_ERRNO_H -# ifdef _WIN32_WCE - /* The Microsoft C Run-Time Library for Windows CE doesn't have - * errno. We define it as a global variable to simplify porting. - * Its value is always 0 and should not be used. We rename it to - * avoid conflict with other libraries that use the same workaround. - */ -# define errno z_errno -# endif - extern int errno; -#else -# ifndef _WIN32_WCE -# include -# endif + +#ifdef Z_SOLO + typedef long ptrdiff_t; /* guess -- will be caught if guess is wrong */ #endif #ifndef local @@ -88,16 +82,18 @@ extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ #if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32)) # define OS_CODE 0x00 -# if defined(__TURBOC__) || defined(__BORLANDC__) -# if(__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__)) - /* Allow compilation with ANSI keywords only enabled */ - void _Cdecl farfree( void *block ); - void *_Cdecl farmalloc( unsigned long nbytes ); -# else -# include +# ifndef Z_SOLO +# if defined(__TURBOC__) || defined(__BORLANDC__) +# if (__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__)) + /* Allow compilation with ANSI keywords only enabled */ + void _Cdecl farfree( void *block ); + void *_Cdecl farmalloc( unsigned long nbytes ); +# else +# include +# endif +# else /* MSC or DJGPP */ +# include # endif -# else /* MSC or DJGPP */ -# include # endif #endif @@ -117,18 +113,20 @@ extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ #ifdef OS2 # define OS_CODE 0x06 -# ifdef M_I86 - #include +# if defined(M_I86) && !defined(Z_SOLO) +# include # endif #endif #if defined(MACOS) || defined(TARGET_OS_MAC) # define OS_CODE 0x07 -# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os -# include /* for fdopen */ -# else -# ifndef fdopen -# define fdopen(fd,mode) NULL /* No fdopen() */ +# ifndef Z_SOLO +# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os +# include /* for fdopen */ +# else +# ifndef fdopen +# define fdopen(fd,mode) NULL /* No fdopen() */ +# endif # endif # endif #endif @@ -151,7 +149,7 @@ extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ # define fdopen(fd,mode) NULL /* No fdopen() */ #endif -#if (defined(_MSC_VER) && (_MSC_VER > 600)) +#if (defined(_MSC_VER) && (_MSC_VER > 600)) && !defined __INTERIX # if defined(_WIN32_WCE) # define fdopen(fd,mode) NULL /* No fdopen() */ # ifndef _PTRDIFF_T_DEFINED @@ -163,6 +161,18 @@ extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ # endif #endif +#if defined(__BORLANDC__) && !defined(MSDOS) + #pragma warn -8004 + #pragma warn -8008 + #pragma warn -8066 +#endif + +/* provide prototypes for these when building zlib without LFS */ +#if !defined(_WIN32) && (!defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0) + ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); +#endif + /* common defaults */ #ifndef OS_CODE @@ -175,40 +185,7 @@ extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ /* functions */ -#if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550) -# ifndef HAVE_VSNPRINTF -# define HAVE_VSNPRINTF -# endif -#endif -#if defined(__CYGWIN__) -# ifndef HAVE_VSNPRINTF -# define HAVE_VSNPRINTF -# endif -#endif -#ifndef HAVE_VSNPRINTF -# ifdef MSDOS - /* vsnprintf may exist on some MS-DOS compilers (DJGPP?), - but for now we just assume it doesn't. */ -# define NO_vsnprintf -# endif -# ifdef __TURBOC__ -# define NO_vsnprintf -# endif -# ifdef WIN32 - /* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */ -# if !defined(vsnprintf) && !defined(NO_vsnprintf) -# define vsnprintf _vsnprintf -# endif -# endif -# ifdef __SASC -# define NO_vsnprintf -# endif -#endif -#ifdef VMS -# define NO_vsnprintf -#endif - -#if defined(pyr) +#if defined(pyr) || defined(Z_SOLO) # define NO_MEMCPY #endif #if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__) @@ -232,16 +209,16 @@ extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ # define zmemzero(dest, len) memset(dest, 0, len) # endif #else - extern void zmemcpy OF((Bytef* dest, const Bytef* source, uInt len)); - extern int zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len)); - extern void zmemzero OF((Bytef* dest, uInt len)); + void ZLIB_INTERNAL zmemcpy OF((Bytef* dest, const Bytef* source, uInt len)); + int ZLIB_INTERNAL zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len)); + void ZLIB_INTERNAL zmemzero OF((Bytef* dest, uInt len)); #endif /* Diagnostic functions */ #ifdef DEBUG # include - extern int z_verbose; - extern void z_error OF((char *m)); + extern int ZLIB_INTERNAL z_verbose; + extern void ZLIB_INTERNAL z_error OF((char *m)); # define Assert(cond,msg) {if(!(cond)) z_error(msg);} # define Trace(x) {if (z_verbose>=0) fprintf x ;} # define Tracev(x) {if (z_verbose>0) fprintf x ;} @@ -257,13 +234,19 @@ extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ # define Tracecv(c,x) #endif - -voidpf zcalloc OF((voidpf opaque, unsigned items, unsigned size)); -void zcfree OF((voidpf opaque, voidpf ptr)); +#ifndef Z_SOLO + voidpf ZLIB_INTERNAL zcalloc OF((voidpf opaque, unsigned items, + unsigned size)); + void ZLIB_INTERNAL zcfree OF((voidpf opaque, voidpf ptr)); +#endif #define ZALLOC(strm, items, size) \ (*((strm)->zalloc))((strm)->opaque, (items), (size)) #define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr)) #define TRY_FREE(s, p) {if (p) ZFREE(s, p);} +/* Reverse the bytes in a 32-bit value */ +#define ZSWAP32(q) ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \ + (((q) & 0xff00) << 8) + (((q) & 0xff) << 24)) + #endif /* ZUTIL_H */ From ca112294b861b4a042497ab264069f3a28221a62 Mon Sep 17 00:00:00 2001 From: Daniel Gibson Date: Wed, 2 Jan 2013 02:04:57 +0100 Subject: [PATCH 27/57] Update unzip code to minizip 1.1 .. from zlib-1.2.7/contrib/minizip/ The original source was minizip 0.15beta from 1998. This update brings zip64 support (untested) and cleaner code. Furthermore, updates to future minizip should be much easier now, as my changes to the original source files from minizip are quite small. To make diffing to upstream minizip-src easier, I added the minizip source as exceptions in the astyle-scripts and left them in their own directory. Two custom functions from idSoftware - unzSetCurrentFileInfoPosition() and unzGetCurrentFileInfoPosition() - aren't needed anymore as minizip 1.1 has functions that do the same. --- neo/CMakeLists.txt | 5 +- neo/astyle-code.bat | 4 +- neo/astyle-code.sh | 4 +- neo/framework/File.cpp | 13 +- neo/framework/File.h | 4 +- neo/framework/Unzip.cpp | 1241 ------------ neo/framework/Unzip.h | 293 +-- neo/framework/minizip/MiniZip64_info.txt | 87 + neo/framework/minizip/ioapi.c | 250 +++ neo/framework/minizip/ioapi.h | 211 ++ neo/framework/minizip/unzip.cpp | 2270 ++++++++++++++++++++++ neo/framework/minizip/unzip.h | 454 +++++ neo/idlib/precompiled.h | 3 + 13 files changed, 3303 insertions(+), 1536 deletions(-) delete mode 100644 neo/framework/Unzip.cpp create mode 100644 neo/framework/minizip/MiniZip64_info.txt create mode 100644 neo/framework/minizip/ioapi.c create mode 100644 neo/framework/minizip/ioapi.h create mode 100644 neo/framework/minizip/unzip.cpp create mode 100644 neo/framework/minizip/unzip.h diff --git a/neo/CMakeLists.txt b/neo/CMakeLists.txt index 3c9e5585..08d2de8f 100644 --- a/neo/CMakeLists.txt +++ b/neo/CMakeLists.txt @@ -123,8 +123,8 @@ file(GLOB AAS_SOURCES aas/*.cpp) file(GLOB_RECURSE CM_INCLUDES cm/*.h) file(GLOB_RECURSE CM_SOURCES cm/*.cpp) -file(GLOB FRAMEWORK_INCLUDES framework/*.h) -file(GLOB FRAMEWORK_SOURCES framework/*.cpp) +file(GLOB FRAMEWORK_INCLUDES framework/*.h framework/minizip/*.h) +file(GLOB FRAMEWORK_SOURCES framework/*.cpp framework/minizip/*.c framework/minizip/*.cpp) file(GLOB FRAMEWORK_ASYNC_INCLUDES framework/async/*.h) file(GLOB FRAMEWORK_ASYNC_SOURCES framework/async/*.cpp) @@ -1062,6 +1062,7 @@ if(MSVC) set(RBDOOM3_PRECOMPILED_SOURCES ${RBDOOM3_SOURCES}) list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${TIMIDITY_SOURCES} ${JPEG_SOURCES} ${ZLIB_SOURCES}) + list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/framework/minizip/ioapi.c) list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/renderer/DXT/DXTDecoder.cpp) list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/renderer/DXT/DXTEncoder.cpp) list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/renderer/DXT/DXTEncoder_SSE2.cpp) diff --git a/neo/astyle-code.bat b/neo/astyle-code.bat index 9a7dc029..9008d5b9 100644 --- a/neo/astyle-code.bat +++ b/neo/astyle-code.bat @@ -1,4 +1,4 @@ -astyle.exe -v --options=astyle-options.ini --exclude="libs" --recursive *.h -astyle.exe -v --options=astyle-options.ini --exclude="libs" --exclude="idlib/math/Simd.cpp" --exclude="d3xp/gamesys/SysCvar.cpp" --exclude="d3xp/gamesys/Callbacks.cpp" --exclude="sys/win32/win_cpu.cpp" --exclude="sys/win32/win_main.cpp" --recursive *.cpp +astyle.exe -v --options=astyle-options.ini --exclude="libs" --exclude="framework/minizip" --recursive *.h +astyle.exe -v --options=astyle-options.ini --exclude="libs" --exclude="framework/minizip" --exclude="idlib/math/Simd.cpp" --exclude="d3xp/gamesys/SysCvar.cpp" --exclude="d3xp/gamesys/Callbacks.cpp" --exclude="sys/win32/win_cpu.cpp" --exclude="sys/win32/win_main.cpp" --recursive *.cpp pause \ No newline at end of file diff --git a/neo/astyle-code.sh b/neo/astyle-code.sh index 6b3919e3..dac400f7 100755 --- a/neo/astyle-code.sh +++ b/neo/astyle-code.sh @@ -1,5 +1,5 @@ #!/bin/sh -./astyle.exe -v --options=astyle-options.ini --exclude="libs" --recursive *.h -./astyle.exe -v --options=astyle-options.ini --exclude="libs" --exclude="idlib/math/Simd.cpp" --exclude="d3xp/gamesys/SysCvar.cpp" --exclude="d3xp/gamesys/Callbacks.cpp" --exclude="sys/win32/win_cpu.cpp" --exclude="sys/win32/win_main.cpp" --recursive *.cpp +./astyle.exe -v --options=astyle-options.ini --exclude="libs" --exclude="framework/minizip" --recursive *.h +./astyle.exe -v --options=astyle-options.ini --exclude="libs" --exclude="framework/minizip" --exclude="idlib/math/Simd.cpp" --exclude="d3xp/gamesys/SysCvar.cpp" --exclude="d3xp/gamesys/Callbacks.cpp" --exclude="sys/win32/win_cpu.cpp" --exclude="sys/win32/win_main.cpp" --recursive *.cpp #pause \ No newline at end of file diff --git a/neo/framework/File.cpp b/neo/framework/File.cpp index b3736a01..ede5da64 100644 --- a/neo/framework/File.cpp +++ b/neo/framework/File.cpp @@ -1775,7 +1775,13 @@ idFile_InZip::Tell */ int idFile_InZip::Tell() const { - return unztell( z ); + // DG: make sure the value fits into an int + // it's a long after all, and there'S also unztell64 that returns ZPOS64_T + // OTOH idFile in general seems to assume file-length <= INT_MAX so it may be ok.. + z_off_t ret = unztell( z ); + assert( ret <= INT_MAX ); + return ret; + // DG end } /* @@ -1818,16 +1824,19 @@ int idFile_InZip::Seek( long offset, fsOrigin_t origin ) { offset = fileSize - offset; } + // FALLTHROUGH case FS_SEEK_SET: { // set the file position in the zip file (also sets the current file info) - unzSetCurrentFileInfoPosition( z, zipFilePos ); + // DG use standard unzip.h function instead of custom one (not needed anymore with minizip 1.1) + unzSetOffset64( z, zipFilePos ); unzOpenCurrentFile( z ); if( offset <= 0 ) { return 0; } } + // FALLTHROUGH case FS_SEEK_CUR: { buf = ( char* ) _alloca16( ZIP_SEEK_BUF_SIZE ); diff --git a/neo/framework/File.h b/neo/framework/File.h index 6ae3a448..0455d771 100644 --- a/neo/framework/File.h +++ b/neo/framework/File.h @@ -358,7 +358,9 @@ public: private: idStr name; // name of the file in the pak idStr fullPath; // full file path including pak file name - int zipFilePos; // zip file info position in pak + // DG: use ZPOS64_T, it's the type minizip uses and should also work with zip64 files > 2GB + ZPOS64_T zipFilePos; // zip file info position in pak + // DG end int fileSize; // size of the file void* z; // unzip info }; diff --git a/neo/framework/Unzip.cpp b/neo/framework/Unzip.cpp deleted file mode 100644 index 6494b1da..00000000 --- a/neo/framework/Unzip.cpp +++ /dev/null @@ -1,1241 +0,0 @@ -#include "precompiled.h" -#pragma hdrstop - -#include "Unzip.h" - -/* unzip.h -- IO for uncompress .zip files using zlib - Version 0.15 beta, Mar 19th, 1998, - - Copyright (C) 1998 Gilles Vollant - - This unzip package allow extract file from .ZIP file, compatible with PKZip 2.04g - WinZip, InfoZip tools and compatible. - Encryption and multi volume ZipFile (span) are not supported. - Old compressions used by old PKZip 1.x are not supported - - THIS IS AN ALPHA VERSION. AT THIS STAGE OF DEVELOPPEMENT, SOMES API OR STRUCTURE - CAN CHANGE IN FUTURE VERSION !! - I WAIT FEEDBACK at mail info@winimage.com - Visit also http://www.winimage.com/zLibDll/unzip.htm for evolution - - Condition of use and distribution are the same than zlib : - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. - - -*/ -/* for more info about .ZIP format, see - ftp://ftp.cdrom.com/pub/infozip/doc/appnote-970311-iz.zip - PkWare has also a specification at : - ftp://ftp.pkware.com/probdesc.zip */ - - -#if !defined(unix) && !defined(CASESENSITIVITYDEFAULT_YES) && \ - !defined(CASESENSITIVITYDEFAULT_NO) -#define CASESENSITIVITYDEFAULT_NO -#endif - - -#ifndef UNZ_BUFSIZE -#define UNZ_BUFSIZE (65536) -#endif - -#ifndef UNZ_MAXFILENAMEINZIP -#define UNZ_MAXFILENAMEINZIP (256) -#endif - -#ifndef ALLOC -# define ALLOC(size) (Mem_Alloc(size, TAG_IDFILE)) -#endif -#ifndef TRYFREE -# define TRYFREE(p) {if (p) Mem_Free(p);} -#endif - -#define SIZECENTRALDIRITEM (0x2e) -#define SIZEZIPLOCALHEADER (0x1e) - - -idCVar zip_numSeeks( "zip_numSeeks", "0", CVAR_INTEGER, "" ); -idCVar zip_skippedSeeks( "zip_skippedSeeks", "0", CVAR_INTEGER, "" ); -idCVar zip_seeksForward( "zip_seeksForward", "0", CVAR_INTEGER, "" ); -idCVar zip_seeksBackward( "zip_seeksBackward", "0", CVAR_INTEGER, "" ); -idCVar zip_avgSeekDistance( "zip_avgSeekDistance", "0", CVAR_INTEGER, "" ); - -/* =========================================================================== - Read a byte from a gz_stream; update next_in and avail_in. Return EOF - for end of file. - IN assertion: the stream s has been sucessfully opened for reading. -*/ - -/* -static int unzlocal_getByte(FILE *fin,int *pi) -{ - unsigned char c; - int err = fread(&c, 1, 1, fin); - if (err==1) - { - *pi = (int)c; - return UNZ_OK; - } - else - { - if (ferror(fin)) - return UNZ_ERRNO; - else - return UNZ_EOF; - } -} -*/ - - -/* =========================================================================== - Reads a long in LSB order from the given gz_stream. Sets -*/ -static int unzlocal_getShort( idFile* fin, uLong* pX ) -{ - byte s[2]; - if( fin->Read( s, 2 ) != 2 ) - { - *pX = 0; - return UNZ_EOF; - } - *pX = ( s[1] << 8 ) | s[0]; - return UNZ_OK; -} - -static int unzlocal_getLong( idFile* fin, uLong* pX ) -{ - byte s[4]; - if( fin->Read( s, 4 ) != 4 ) - { - *pX = 0; - return UNZ_EOF; - } - *pX = ( s[3] << 24 ) | ( s[2] << 16 ) | ( s[1] << 8 ) | s[0]; - return UNZ_OK; -} - - -/* My own strcmpi / strcasecmp */ -static int strcmpcasenosensitive_internal( const char* fileName1, const char* fileName2 ) -{ - for( ;; ) - { - char c1 = *( fileName1++ ); - char c2 = *( fileName2++ ); - if( ( c1 >= 'a' ) && ( c1 <= 'z' ) ) - c1 -= 0x20; - if( ( c2 >= 'a' ) && ( c2 <= 'z' ) ) - c2 -= 0x20; - if( c1 == '\0' ) - return ( ( c2 == '\0' ) ? 0 : -1 ); - if( c2 == '\0' ) - return 1; - if( c1 < c2 ) - return -1; - if( c1 > c2 ) - return 1; - } -} - - -#ifdef CASESENSITIVITYDEFAULT_NO -#define CASESENSITIVITYDEFAULTVALUE 2 -#else -#define CASESENSITIVITYDEFAULTVALUE 1 -#endif - -#ifndef STRCMPCASENOSENTIVEFUNCTION -#define STRCMPCASENOSENTIVEFUNCTION strcmpcasenosensitive_internal -#endif - -/* - Compare two filename (fileName1,fileName2). - If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) - If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi - or strcasecmp) - If iCaseSenisivity = 0, case sensitivity is defaut of your operating system - (like 1 on Unix, 2 on Windows) - -*/ -extern int unzStringFileNameCompare( const char* fileName1, const char* fileName2, int iCaseSensitivity ) -{ - if( iCaseSensitivity == 0 ) - iCaseSensitivity = CASESENSITIVITYDEFAULTVALUE; - - if( iCaseSensitivity == 1 ) - return strcmp( fileName1, fileName2 ); - - return STRCMPCASENOSENTIVEFUNCTION( fileName1, fileName2 ); -} - -#define BUFREADCOMMENT (0x400) - -/* - Locate the Central directory of a zipfile (at the end, just before - the global comment) -*/ -static uLong unzlocal_SearchCentralDir( idFile* fin ) -{ - unsigned char* buf; - uLong uSizeFile; - uLong uBackRead; - uLong uMaxBack = 0xffff; /* maximum size of global comment */ - uLong uPosFound = 0; - - if( fin->Seek( 0, FS_SEEK_END ) != 0 ) - return 0; - - uSizeFile = fin->Tell(); - - if( uMaxBack > uSizeFile ) - uMaxBack = uSizeFile; - - buf = ( unsigned char* )ALLOC( BUFREADCOMMENT + 4 ); - if( buf == NULL ) - return 0; - - uBackRead = 4; - while( uBackRead < uMaxBack ) - { - uLong uReadSize, uReadPos ; - int i; - if( uBackRead + BUFREADCOMMENT > uMaxBack ) - uBackRead = uMaxBack; - else - uBackRead += BUFREADCOMMENT; - uReadPos = uSizeFile - uBackRead ; - - uReadSize = ( ( BUFREADCOMMENT + 4 ) < ( uSizeFile - uReadPos ) ) ? - ( BUFREADCOMMENT + 4 ) : ( uSizeFile - uReadPos ); - - if( fin->Seek( uReadPos, FS_SEEK_SET ) != 0 ) - break; - - if( fin->Read( buf, uReadSize ) != ( int )uReadSize ) - break; - - for( i = ( int )uReadSize - 3; ( i-- ) > 0; ) - if( ( ( *( buf + i ) ) == 0x50 ) && ( ( *( buf + i + 1 ) ) == 0x4b ) && - ( ( *( buf + i + 2 ) ) == 0x05 ) && ( ( *( buf + i + 3 ) ) == 0x06 ) ) - { - uPosFound = uReadPos + i; - break; - } - - if( uPosFound != 0 ) - break; - } - TRYFREE( buf ); - return uPosFound; -} - -extern unzFile unzReOpen( const char* path, unzFile file ) -{ - unz_s* s; - idFile_Cached* fin; - - fin = fileSystem->OpenExplicitPakFile( path ); - if( fin == NULL ) - return NULL; - - s = ( unz_s* )ALLOC( sizeof( unz_s ) ); - memcpy( s, ( unz_s* )file, sizeof( unz_s ) ); - - s->file = fin; - s->pfile_in_zip_read = NULL; - - return ( unzFile )s; -} - -/* - Open a Zip file. path contain the full pathname (by example, - on a Windows NT computer "c:\\test\\zlib109.zip" or on an Unix computer - "zlib/zlib109.zip". - If the zipfile cannot be opened (file don't exist or in not valid), the - return value is NULL. - Else, the return value is a unzFile Handle, usable with other function - of this unzip package. -*/ -extern unzFile unzOpen( const char* path ) -{ - unz_s us; - unz_s* s; - uLong central_pos, uL; - idFile_Cached* fin ; - - uLong number_disk; /* number of the current dist, used for - spaning ZIP, unsupported, always 0*/ - uLong number_disk_with_CD; /* number the the disk with central dir, used - for spaning ZIP, unsupported, always 0*/ - uLong number_entry_CD; /* total number of entries in - the central dir - (same than number_entry on nospan) */ - - int err = UNZ_OK; - - fin = fileSystem->OpenExplicitPakFile( path ); - if( fin == NULL ) - return NULL; - - central_pos = unzlocal_SearchCentralDir( fin ); - if( central_pos == 0 ) - err = UNZ_ERRNO; - - if( fin->Seek( central_pos, FS_SEEK_SET ) != 0 ) - err = UNZ_ERRNO; - - /* the signature, already checked */ - if( unzlocal_getLong( fin, &uL ) != UNZ_OK ) - err = UNZ_ERRNO; - - /* number of this disk */ - if( unzlocal_getShort( fin, &number_disk ) != UNZ_OK ) - err = UNZ_ERRNO; - - /* number of the disk with the start of the central directory */ - if( unzlocal_getShort( fin, &number_disk_with_CD ) != UNZ_OK ) - err = UNZ_ERRNO; - - /* total number of entries in the central dir on this disk */ - if( unzlocal_getShort( fin, &us.gi.number_entry ) != UNZ_OK ) - err = UNZ_ERRNO; - - /* total number of entries in the central dir */ - if( unzlocal_getShort( fin, &number_entry_CD ) != UNZ_OK ) - err = UNZ_ERRNO; - - if( ( number_entry_CD != us.gi.number_entry ) || - ( number_disk_with_CD != 0 ) || - ( number_disk != 0 ) ) - err = UNZ_BADZIPFILE; - - /* size of the central directory */ - if( unzlocal_getLong( fin, &us.size_central_dir ) != UNZ_OK ) - err = UNZ_ERRNO; - - /* offset of start of central directory with respect to the - starting disk number */ - if( unzlocal_getLong( fin, &us.offset_central_dir ) != UNZ_OK ) - err = UNZ_ERRNO; - - /* zipfile comment length */ - if( unzlocal_getShort( fin, &us.gi.size_comment ) != UNZ_OK ) - err = UNZ_ERRNO; - - if( ( central_pos < us.offset_central_dir + us.size_central_dir ) && - ( err == UNZ_OK ) ) - err = UNZ_BADZIPFILE; - - if( err != UNZ_OK ) - { - fileSystem->CloseFile( fin ); - return NULL; - } - - us.file = fin; - us.byte_before_the_zipfile = central_pos - - ( us.offset_central_dir + us.size_central_dir ); - us.central_pos = central_pos; - us.pfile_in_zip_read = NULL; - - us.file->CacheData( us.offset_central_dir, us.size_central_dir ); - - s = ( unz_s* )ALLOC( sizeof( unz_s ) ); - *s = us; - -// unzGoToFirstFile((unzFile)s); - return ( unzFile )s; -} - - -/* - Close a ZipFile opened with unzipOpen. - If there is files inside the .Zip opened with unzipOpenCurrentFile (see later), - these files MUST be closed with unzipCloseCurrentFile before call unzipClose. - return UNZ_OK if there is no problem. */ -extern int unzClose( unzFile file ) -{ - unz_s* s; - if( file == NULL ) - return UNZ_PARAMERROR; - s = ( unz_s* )file; - - if( s->pfile_in_zip_read != NULL ) - unzCloseCurrentFile( file ); - - fileSystem->CloseFile( s->file ); - TRYFREE( s ); - return UNZ_OK; -} - - -/* - Write info about the ZipFile in the *pglobal_info structure. - No preparation of the structure is needed - return UNZ_OK if there is no problem. */ -extern int unzGetGlobalInfo( unzFile file, unz_global_info* pglobal_info ) -{ - unz_s* s; - if( file == NULL ) - return UNZ_PARAMERROR; - s = ( unz_s* )file; - *pglobal_info = s->gi; - return UNZ_OK; -} - - -/* - Translate date/time from Dos format to tm_unz (readable more easilty) -*/ -static void unzlocal_DosDateToTmuDate( uLong ulDosDate, tm_unz* ptm ) -{ - uLong uDate; - uDate = ( uLong )( ulDosDate >> 16 ); - ptm->tm_mday = ( uInt )( uDate & 0x1f ) ; - ptm->tm_mon = ( uInt )( ( ( ( uDate ) & 0x1E0 ) / 0x20 ) - 1 ) ; - ptm->tm_year = ( uInt )( ( ( uDate & 0x0FE00 ) / 0x0200 ) + 1980 ) ; - - ptm->tm_hour = ( uInt )( ( ulDosDate & 0xF800 ) / 0x800 ); - ptm->tm_min = ( uInt )( ( ulDosDate & 0x7E0 ) / 0x20 ) ; - ptm->tm_sec = ( uInt )( 2 * ( ulDosDate & 0x1f ) ) ; -} - - -/* - Get Info about the current file in the zipfile, with internal only info -*/ -static int unzlocal_GetCurrentFileInfoInternal( unzFile file, - unz_file_info* pfile_info, - unz_file_info_internal - *pfile_info_internal, - char* szFileName, - uLong fileNameBufferSize, - void* extraField, - uLong extraFieldBufferSize, - char* szComment, - uLong commentBufferSize ) -{ - unz_s* s; - unz_file_info file_info; - unz_file_info_internal file_info_internal; - int err = UNZ_OK; - uLong uMagic; - long lSeek = 0; - - if( file == NULL ) - return UNZ_PARAMERROR; - s = ( unz_s* )file; - - int tellpos = s->file->Tell() - s->pos_in_central_dir + s->byte_before_the_zipfile; - if( tellpos != 0 ) - { - if( s->file->Seek( s->pos_in_central_dir + s->byte_before_the_zipfile, FS_SEEK_SET ) != 0 ) - { - err = UNZ_ERRNO; - } - if( tellpos < 0 ) - { - zip_seeksForward.SetInteger( zip_seeksForward.GetInteger() + 1 ); - } - else - { - zip_seeksBackward.SetInteger( zip_seeksBackward.GetInteger() + 1 ); - } - - static long zip_totalSeekSize = 0; - if( zip_numSeeks.GetInteger() == 0 ) - { - zip_totalSeekSize = 0; - } - zip_totalSeekSize += abs( tellpos ); - - zip_numSeeks.SetInteger( zip_numSeeks.GetInteger() + 1 ); - zip_avgSeekDistance.SetInteger( zip_totalSeekSize / zip_numSeeks.GetInteger() ); - } - else - { - zip_skippedSeeks.SetInteger( zip_skippedSeeks.GetInteger() + 1 ); - } - - - /* we check the magic */ - if( err == UNZ_OK ) - { - if( unzlocal_getLong( s->file, &uMagic ) != UNZ_OK ) - err = UNZ_ERRNO; - else if( uMagic != 0x02014b50 ) - err = UNZ_BADZIPFILE; - } - - if( unzlocal_getShort( s->file, &file_info.version ) != UNZ_OK ) - err = UNZ_ERRNO; - - if( unzlocal_getShort( s->file, &file_info.version_needed ) != UNZ_OK ) - err = UNZ_ERRNO; - - if( unzlocal_getShort( s->file, &file_info.flag ) != UNZ_OK ) - err = UNZ_ERRNO; - - if( unzlocal_getShort( s->file, &file_info.compression_method ) != UNZ_OK ) - err = UNZ_ERRNO; - - if( unzlocal_getLong( s->file, &file_info.dosDate ) != UNZ_OK ) - err = UNZ_ERRNO; - - unzlocal_DosDateToTmuDate( file_info.dosDate, &file_info.tmu_date ); - - if( unzlocal_getLong( s->file, &file_info.crc ) != UNZ_OK ) - err = UNZ_ERRNO; - - if( unzlocal_getLong( s->file, &file_info.compressed_size ) != UNZ_OK ) - err = UNZ_ERRNO; - - if( unzlocal_getLong( s->file, &file_info.uncompressed_size ) != UNZ_OK ) - err = UNZ_ERRNO; - - if( unzlocal_getShort( s->file, &file_info.size_filename ) != UNZ_OK ) - err = UNZ_ERRNO; - - if( unzlocal_getShort( s->file, &file_info.size_file_extra ) != UNZ_OK ) - err = UNZ_ERRNO; - - if( unzlocal_getShort( s->file, &file_info.size_file_comment ) != UNZ_OK ) - err = UNZ_ERRNO; - - if( unzlocal_getShort( s->file, &file_info.disk_num_start ) != UNZ_OK ) - err = UNZ_ERRNO; - - if( unzlocal_getShort( s->file, &file_info.internal_fa ) != UNZ_OK ) - err = UNZ_ERRNO; - - if( unzlocal_getLong( s->file, &file_info.external_fa ) != UNZ_OK ) - err = UNZ_ERRNO; - - if( unzlocal_getLong( s->file, &file_info_internal.offset_curfile ) != UNZ_OK ) - err = UNZ_ERRNO; - - lSeek += file_info.size_filename; - if( ( err == UNZ_OK ) && ( szFileName != NULL ) ) - { - uLong uSizeRead ; - if( file_info.size_filename < fileNameBufferSize ) - { - *( szFileName + file_info.size_filename ) = '\0'; - uSizeRead = file_info.size_filename; - } - else - uSizeRead = fileNameBufferSize; - - if( ( file_info.size_filename > 0 ) && ( fileNameBufferSize > 0 ) ) - if( s->file->Read( szFileName, uSizeRead ) != ( int )uSizeRead ) - err = UNZ_ERRNO; - lSeek -= uSizeRead; - } - - - if( ( err == UNZ_OK ) && ( extraField != NULL ) ) - { - uLong uSizeRead ; - if( file_info.size_file_extra < extraFieldBufferSize ) - uSizeRead = file_info.size_file_extra; - else - uSizeRead = extraFieldBufferSize; - - if( lSeek != 0 ) - { - if( s->file->Seek( lSeek, FS_SEEK_CUR ) == 0 ) - lSeek = 0; - else - err = UNZ_ERRNO; - } - if( ( file_info.size_file_extra > 0 ) && ( extraFieldBufferSize > 0 ) ) - if( s->file->Read( extraField, uSizeRead ) != ( int )uSizeRead ) - err = UNZ_ERRNO; - lSeek += file_info.size_file_extra - uSizeRead; - } - else - lSeek += file_info.size_file_extra; - - - if( ( err == UNZ_OK ) && ( szComment != NULL ) ) - { - uLong uSizeRead ; - if( file_info.size_file_comment < commentBufferSize ) - { - *( szComment + file_info.size_file_comment ) = '\0'; - uSizeRead = file_info.size_file_comment; - } - else - uSizeRead = commentBufferSize; - - if( lSeek != 0 ) - { - if( s->file->Seek( lSeek, FS_SEEK_CUR ) == 0 ) - lSeek = 0; - else - err = UNZ_ERRNO; - } - if( ( file_info.size_file_comment > 0 ) && ( commentBufferSize > 0 ) ) - if( s->file->Read( szComment, uSizeRead ) != ( int )uSizeRead ) - err = UNZ_ERRNO; - lSeek += file_info.size_file_comment - uSizeRead; - } - else - lSeek += file_info.size_file_comment; - - if( ( err == UNZ_OK ) && ( pfile_info != NULL ) ) - *pfile_info = file_info; - - if( ( err == UNZ_OK ) && ( pfile_info_internal != NULL ) ) - *pfile_info_internal = file_info_internal; - - return err; -} - -/* - Write info about the ZipFile in the *pglobal_info structure. - No preparation of the structure is needed - return UNZ_OK if there is no problem. -*/ -extern int unzGetCurrentFileInfo( unzFile file, unz_file_info* pfile_info, - char* szFileName, uLong fileNameBufferSize, - void* extraField, uLong extraFieldBufferSize, - char* szComment, uLong commentBufferSize ) -{ - return unzlocal_GetCurrentFileInfoInternal( file, pfile_info, NULL, - szFileName, fileNameBufferSize, - extraField, extraFieldBufferSize, - szComment, commentBufferSize ); -} - -/* - Set the current file of the zipfile to the first file. - return UNZ_OK if there is no problem -*/ -extern int unzGoToFirstFile( unzFile file ) -{ - int err = UNZ_OK; - unz_s* s; - if( file == NULL ) - return UNZ_PARAMERROR; - s = ( unz_s* )file; - s->pos_in_central_dir = s->offset_central_dir; - s->num_file = 0; - err = unzlocal_GetCurrentFileInfoInternal( file, &s->cur_file_info, - &s->cur_file_info_internal, - NULL, 0, NULL, 0, NULL, 0 ); - s->current_file_ok = ( err == UNZ_OK ); - return err; -} - -/* - Set the current file of the zipfile to the next file. - return UNZ_OK if there is no problem - return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. -*/ -extern int unzGoToNextFile( unzFile file ) -{ - unz_s* s; - int err; - - if( file == NULL ) - return UNZ_PARAMERROR; - s = ( unz_s* )file; - if( !s->current_file_ok ) - return UNZ_END_OF_LIST_OF_FILE; - if( s->num_file + 1 == s->gi.number_entry ) - return UNZ_END_OF_LIST_OF_FILE; - - s->pos_in_central_dir += SIZECENTRALDIRITEM + s->cur_file_info.size_filename + - s->cur_file_info.size_file_extra + s->cur_file_info.size_file_comment ; - s->num_file++; - err = unzlocal_GetCurrentFileInfoInternal( file, &s->cur_file_info, - &s->cur_file_info_internal, - NULL, 0, NULL, 0, NULL, 0 ); - s->current_file_ok = ( err == UNZ_OK ); - return err; -} - -/* - Get the position of the info of the current file in the zip. - return UNZ_OK if there is no problem -*/ -extern int unzGetCurrentFileInfoPosition( unzFile file, unsigned long* pos ) -{ - unz_s* s; - - if( file == NULL ) - return UNZ_PARAMERROR; - s = ( unz_s* )file; - - *pos = s->pos_in_central_dir; - return UNZ_OK; -} - -/* - Set the position of the info of the current file in the zip. - return UNZ_OK if there is no problem -*/ -extern int unzSetCurrentFileInfoPosition( unzFile file, unsigned long pos ) -{ - unz_s* s; - int err; - - if( file == NULL ) - return UNZ_PARAMERROR; - s = ( unz_s* )file; - - s->pos_in_central_dir = pos; - err = unzlocal_GetCurrentFileInfoInternal( file, &s->cur_file_info, - &s->cur_file_info_internal, - NULL, 0, NULL, 0, NULL, 0 ); - s->current_file_ok = ( err == UNZ_OK ); - return UNZ_OK; -} - -/* - Try locate the file szFileName in the zipfile. - For the iCaseSensitivity signification, see unzipStringFileNameCompare - - return value : - UNZ_OK if the file is found. It becomes the current file. - UNZ_END_OF_LIST_OF_FILE if the file is not found -*/ -extern int unzLocateFile( unzFile file, const char* szFileName, int iCaseSensitivity ) -{ - unz_s* s; - int err; - - - uLong num_fileSaved; - uLong pos_in_central_dirSaved; - - - if( file == NULL ) - return UNZ_PARAMERROR; - - if( strlen( szFileName ) >= UNZ_MAXFILENAMEINZIP ) - return UNZ_PARAMERROR; - - s = ( unz_s* )file; - if( !s->current_file_ok ) - return UNZ_END_OF_LIST_OF_FILE; - - num_fileSaved = s->num_file; - pos_in_central_dirSaved = s->pos_in_central_dir; - - err = unzGoToFirstFile( file ); - - while( err == UNZ_OK ) - { - char szCurrentFileName[UNZ_MAXFILENAMEINZIP + 1]; - unzGetCurrentFileInfo( file, NULL, - szCurrentFileName, sizeof( szCurrentFileName ) - 1, - NULL, 0, NULL, 0 ); - if( unzStringFileNameCompare( szCurrentFileName, - szFileName, iCaseSensitivity ) == 0 ) - return UNZ_OK; - err = unzGoToNextFile( file ); - } - - s->num_file = num_fileSaved ; - s->pos_in_central_dir = pos_in_central_dirSaved ; - return err; -} - - -/* - Read the static header of the current zipfile - Check the coherency of the static header and info in the end of central - directory about this file - store in *piSizeVar the size of extra info in static header - (filename and size of extra field data) -*/ -static int unzlocal_CheckCurrentFileCoherencyHeader( unz_s* s, uInt* piSizeVar, - uLong* poffset_local_extrafield, - uInt* psize_local_extrafield ) -{ - uLong uMagic, uData, uFlags; - uLong size_filename; - uLong size_extra_field; - int err = UNZ_OK; - - *piSizeVar = 0; - *poffset_local_extrafield = 0; - *psize_local_extrafield = 0; - - if( s->file->Seek( s->cur_file_info_internal.offset_curfile + s->byte_before_the_zipfile, FS_SEEK_SET ) != 0 ) - return UNZ_ERRNO; - - - if( err == UNZ_OK ) - { - if( unzlocal_getLong( s->file, &uMagic ) != UNZ_OK ) - err = UNZ_ERRNO; - else if( uMagic != 0x04034b50 ) - err = UNZ_BADZIPFILE; - } - - if( unzlocal_getShort( s->file, &uData ) != UNZ_OK ) - err = UNZ_ERRNO; - /* - else if ((err==UNZ_OK) && (uData!=s->cur_file_info.wVersion)) - err=UNZ_BADZIPFILE; - */ - if( unzlocal_getShort( s->file, &uFlags ) != UNZ_OK ) - err = UNZ_ERRNO; - - if( unzlocal_getShort( s->file, &uData ) != UNZ_OK ) - err = UNZ_ERRNO; - else if( ( err == UNZ_OK ) && ( uData != s->cur_file_info.compression_method ) ) - err = UNZ_BADZIPFILE; - - if( ( err == UNZ_OK ) && ( s->cur_file_info.compression_method != 0 ) && - ( s->cur_file_info.compression_method != Z_DEFLATED ) ) - err = UNZ_BADZIPFILE; - - if( unzlocal_getLong( s->file, &uData ) != UNZ_OK ) /* date/time */ - err = UNZ_ERRNO; - - if( unzlocal_getLong( s->file, &uData ) != UNZ_OK ) /* crc */ - err = UNZ_ERRNO; - else if( ( err == UNZ_OK ) && ( uData != s->cur_file_info.crc ) && - ( ( uFlags & 8 ) == 0 ) ) - err = UNZ_BADZIPFILE; - - if( unzlocal_getLong( s->file, &uData ) != UNZ_OK ) /* size compr */ - err = UNZ_ERRNO; - else if( ( err == UNZ_OK ) && ( uData != s->cur_file_info.compressed_size ) && - ( ( uFlags & 8 ) == 0 ) ) - err = UNZ_BADZIPFILE; - - if( unzlocal_getLong( s->file, &uData ) != UNZ_OK ) /* size uncompr */ - err = UNZ_ERRNO; - else if( ( err == UNZ_OK ) && ( uData != s->cur_file_info.uncompressed_size ) && - ( ( uFlags & 8 ) == 0 ) ) - err = UNZ_BADZIPFILE; - - - if( unzlocal_getShort( s->file, &size_filename ) != UNZ_OK ) - err = UNZ_ERRNO; - else if( ( err == UNZ_OK ) && ( size_filename != s->cur_file_info.size_filename ) ) - err = UNZ_BADZIPFILE; - - *piSizeVar += ( uInt )size_filename; - - if( unzlocal_getShort( s->file, &size_extra_field ) != UNZ_OK ) - err = UNZ_ERRNO; - *poffset_local_extrafield = s->cur_file_info_internal.offset_curfile + - SIZEZIPLOCALHEADER + size_filename; - *psize_local_extrafield = ( uInt )size_extra_field; - - *piSizeVar += ( uInt )size_extra_field; - - return err; -} - -/* - Open for reading data the current file in the zipfile. - If there is no error and the file is opened, the return value is UNZ_OK. -*/ -extern int unzOpenCurrentFile( unzFile file ) -{ - int err = UNZ_OK; - int Store; - uInt iSizeVar; - unz_s* s; - file_in_zip_read_info_s* pfile_in_zip_read_info; - uLong offset_local_extrafield; /* offset of the static extra field */ - uInt size_local_extrafield; /* size of the static extra field */ - - if( file == NULL ) - return UNZ_PARAMERROR; - s = ( unz_s* )file; - if( !s->current_file_ok ) - return UNZ_PARAMERROR; - - if( s->pfile_in_zip_read != NULL ) - unzCloseCurrentFile( file ); - - if( unzlocal_CheckCurrentFileCoherencyHeader( s, &iSizeVar, - &offset_local_extrafield, &size_local_extrafield ) != UNZ_OK ) - return UNZ_BADZIPFILE; - - pfile_in_zip_read_info = ( file_in_zip_read_info_s* ) - ALLOC( sizeof( file_in_zip_read_info_s ) ); - if( pfile_in_zip_read_info == NULL ) - return UNZ_INTERNALERROR; - - pfile_in_zip_read_info->read_buffer = ( char* )ALLOC( UNZ_BUFSIZE ); - pfile_in_zip_read_info->offset_local_extrafield = offset_local_extrafield; - pfile_in_zip_read_info->size_local_extrafield = size_local_extrafield; - pfile_in_zip_read_info->pos_local_extrafield = 0; - - if( pfile_in_zip_read_info->read_buffer == NULL ) - { - TRYFREE( pfile_in_zip_read_info ); - return UNZ_INTERNALERROR; - } - - pfile_in_zip_read_info->stream_initialised = 0; - - if( ( s->cur_file_info.compression_method != 0 ) && - ( s->cur_file_info.compression_method != Z_DEFLATED ) ) - err = UNZ_BADZIPFILE; - Store = s->cur_file_info.compression_method == 0; - - pfile_in_zip_read_info->crc32_wait = s->cur_file_info.crc; - pfile_in_zip_read_info->crc32 = 0; - pfile_in_zip_read_info->compression_method = - s->cur_file_info.compression_method; - pfile_in_zip_read_info->file = s->file; - pfile_in_zip_read_info->byte_before_the_zipfile = s->byte_before_the_zipfile; - - pfile_in_zip_read_info->stream.total_out = 0; - - if( !Store ) - { - pfile_in_zip_read_info->stream.zalloc = ( alloc_func )0; - pfile_in_zip_read_info->stream.zfree = ( free_func )0; - pfile_in_zip_read_info->stream.opaque = ( voidp )0; - - err = inflateInit2( &pfile_in_zip_read_info->stream, -MAX_WBITS ); - if( err == Z_OK ) - pfile_in_zip_read_info->stream_initialised = 1; - /* windowBits is passed < 0 to tell that there is no zlib header. - * Note that in this case inflate *requires* an extra "dummy" byte - * after the compressed stream in order to complete decompression and - * return Z_STREAM_END. - * In unzip, i don't wait absolutely Z_STREAM_END because I known the - * size of both compressed and uncompressed data - */ - } - pfile_in_zip_read_info->rest_read_compressed = - s->cur_file_info.compressed_size ; - pfile_in_zip_read_info->rest_read_uncompressed = - s->cur_file_info.uncompressed_size ; - - - pfile_in_zip_read_info->pos_in_zipfile = - s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER + - iSizeVar; - - pfile_in_zip_read_info->stream.avail_in = ( uInt )0; - - - s->pfile_in_zip_read = pfile_in_zip_read_info; - return UNZ_OK; -} - - -/* - Read bytes from the current file. - buf contain buffer where data must be copied - len the size of buf. - - return the number of byte copied if somes bytes are copied - return 0 if the end of file was reached - return <0 with error code if there is an error - (UNZ_ERRNO for IO error, or zLib error for uncompress error) -*/ -extern int unzReadCurrentFile( unzFile file, void* buf, unsigned len ) -{ - int err = UNZ_OK; - uInt iRead = 0; - unz_s* s; - file_in_zip_read_info_s* pfile_in_zip_read_info; - if( file == NULL ) - return UNZ_PARAMERROR; - s = ( unz_s* )file; - pfile_in_zip_read_info = s->pfile_in_zip_read; - - if( pfile_in_zip_read_info == NULL ) - return UNZ_PARAMERROR; - - - if( pfile_in_zip_read_info->read_buffer == NULL ) // DG: remove unnecessary parenthesis - return UNZ_END_OF_LIST_OF_FILE; - if( len == 0 ) - return 0; - - pfile_in_zip_read_info->stream.next_out = ( Byte* )buf; - - pfile_in_zip_read_info->stream.avail_out = ( uInt )len; - - if( len > pfile_in_zip_read_info->rest_read_uncompressed ) - pfile_in_zip_read_info->stream.avail_out = - ( uInt )pfile_in_zip_read_info->rest_read_uncompressed; - - while( pfile_in_zip_read_info->stream.avail_out > 0 ) - { - if( ( pfile_in_zip_read_info->stream.avail_in == 0 ) && - ( pfile_in_zip_read_info->rest_read_compressed > 0 ) ) - { - uInt uReadThis = UNZ_BUFSIZE; - if( pfile_in_zip_read_info->rest_read_compressed < uReadThis ) - uReadThis = ( uInt )pfile_in_zip_read_info->rest_read_compressed; - if( uReadThis == 0 ) - return UNZ_EOF; - if( s->cur_file_info.compressed_size == pfile_in_zip_read_info->rest_read_compressed ) - if( pfile_in_zip_read_info->file->Seek( pfile_in_zip_read_info->pos_in_zipfile + pfile_in_zip_read_info->byte_before_the_zipfile, FS_SEEK_SET ) != 0 ) - return UNZ_ERRNO; - if( pfile_in_zip_read_info->file->Read( pfile_in_zip_read_info->read_buffer, uReadThis ) != ( int )uReadThis ) - return UNZ_ERRNO; - pfile_in_zip_read_info->pos_in_zipfile += uReadThis; - - pfile_in_zip_read_info->rest_read_compressed -= uReadThis; - - pfile_in_zip_read_info->stream.next_in = - ( Byte* )pfile_in_zip_read_info->read_buffer; - pfile_in_zip_read_info->stream.avail_in = ( uInt )uReadThis; - } - - if( pfile_in_zip_read_info->compression_method == 0 ) - { - uInt uDoCopy, i ; - if( pfile_in_zip_read_info->stream.avail_out < - pfile_in_zip_read_info->stream.avail_in ) - uDoCopy = pfile_in_zip_read_info->stream.avail_out ; - else - uDoCopy = pfile_in_zip_read_info->stream.avail_in ; - - for( i = 0; i < uDoCopy; i++ ) - *( pfile_in_zip_read_info->stream.next_out + i ) = - *( pfile_in_zip_read_info->stream.next_in + i ); - - pfile_in_zip_read_info->crc32 = crc32( pfile_in_zip_read_info->crc32, - pfile_in_zip_read_info->stream.next_out, - uDoCopy ); - pfile_in_zip_read_info->rest_read_uncompressed -= uDoCopy; - pfile_in_zip_read_info->stream.avail_in -= uDoCopy; - pfile_in_zip_read_info->stream.avail_out -= uDoCopy; - pfile_in_zip_read_info->stream.next_out += uDoCopy; - pfile_in_zip_read_info->stream.next_in += uDoCopy; - pfile_in_zip_read_info->stream.total_out += uDoCopy; - iRead += uDoCopy; - } - else - { - uLong uTotalOutBefore, uTotalOutAfter; - const Byte* bufBefore; - uLong uOutThis; - int flush = Z_SYNC_FLUSH; - - uTotalOutBefore = pfile_in_zip_read_info->stream.total_out; - bufBefore = pfile_in_zip_read_info->stream.next_out; - - /* - if ((pfile_in_zip_read_info->rest_read_uncompressed == - pfile_in_zip_read_info->stream.avail_out) && - (pfile_in_zip_read_info->rest_read_compressed == 0)) - flush = Z_FINISH; - */ - err = inflate( &pfile_in_zip_read_info->stream, flush ); - - uTotalOutAfter = pfile_in_zip_read_info->stream.total_out; - uOutThis = uTotalOutAfter - uTotalOutBefore; - - pfile_in_zip_read_info->crc32 = - crc32( pfile_in_zip_read_info->crc32, bufBefore, - ( uInt )( uOutThis ) ); - - pfile_in_zip_read_info->rest_read_uncompressed -= - uOutThis; - - iRead += ( uInt )( uTotalOutAfter - uTotalOutBefore ); - - if( err == Z_STREAM_END ) - return ( iRead == 0 ) ? UNZ_EOF : iRead; - if( err != Z_OK ) - break; - } - } - - if( err == Z_OK ) - return iRead; - return err; -} - - -/* - Give the current position in uncompressed data -*/ -extern long unztell( unzFile file ) -{ - unz_s* s; - file_in_zip_read_info_s* pfile_in_zip_read_info; - if( file == NULL ) - return UNZ_PARAMERROR; - s = ( unz_s* )file; - pfile_in_zip_read_info = s->pfile_in_zip_read; - - if( pfile_in_zip_read_info == NULL ) - return UNZ_PARAMERROR; - - return ( long )pfile_in_zip_read_info->stream.total_out; -} - - -/* - return 1 if the end of file was reached, 0 elsewhere -*/ -extern int unzeof( unzFile file ) -{ - unz_s* s; - file_in_zip_read_info_s* pfile_in_zip_read_info; - if( file == NULL ) - return UNZ_PARAMERROR; - s = ( unz_s* )file; - pfile_in_zip_read_info = s->pfile_in_zip_read; - - if( pfile_in_zip_read_info == NULL ) - return UNZ_PARAMERROR; - - if( pfile_in_zip_read_info->rest_read_uncompressed == 0 ) - return 1; - else - return 0; -} - - - -/* - Read extra field from the current file (opened by unzOpenCurrentFile) - This is the static-header version of the extra field (sometimes, there is - more info in the static-header version than in the central-header) - - if buf==NULL, it return the size of the static extra field that can be read - - if buf!=NULL, len is the size of the buffer, the extra header is copied in - buf. - the return value is the number of bytes copied in buf, or (if <0) - the error code -*/ -extern int unzGetLocalExtrafield( unzFile file, void* buf, unsigned len ) -{ - unz_s* s; - file_in_zip_read_info_s* pfile_in_zip_read_info; - uInt read_now; - uLong size_to_read; - - if( file == NULL ) - return UNZ_PARAMERROR; - s = ( unz_s* )file; - pfile_in_zip_read_info = s->pfile_in_zip_read; - - if( pfile_in_zip_read_info == NULL ) - return UNZ_PARAMERROR; - - size_to_read = ( pfile_in_zip_read_info->size_local_extrafield - - pfile_in_zip_read_info->pos_local_extrafield ); - - if( buf == NULL ) - return ( int )size_to_read; - - if( len > size_to_read ) - read_now = ( uInt )size_to_read; - else - read_now = ( uInt )len ; - - if( read_now == 0 ) - return 0; - - if( pfile_in_zip_read_info->file->Seek( pfile_in_zip_read_info->offset_local_extrafield + pfile_in_zip_read_info->pos_local_extrafield, FS_SEEK_SET ) != 0 ) - return UNZ_ERRNO; - - if( pfile_in_zip_read_info->file->Read( buf, size_to_read ) != ( int )size_to_read ) - return UNZ_ERRNO; - - return ( int )read_now; -} - -/* - Close the file in zip opened with unzipOpenCurrentFile - Return UNZ_CRCERROR if all the file was read but the CRC is not good -*/ -extern int unzCloseCurrentFile( unzFile file ) -{ - int err = UNZ_OK; - - unz_s* s; - file_in_zip_read_info_s* pfile_in_zip_read_info; - if( file == NULL ) - return UNZ_PARAMERROR; - s = ( unz_s* )file; - pfile_in_zip_read_info = s->pfile_in_zip_read; - - if( pfile_in_zip_read_info == NULL ) - return UNZ_PARAMERROR; - - - if( pfile_in_zip_read_info->rest_read_uncompressed == 0 ) - { - if( pfile_in_zip_read_info->crc32 != pfile_in_zip_read_info->crc32_wait ) - err = UNZ_CRCERROR; - } - - - TRYFREE( pfile_in_zip_read_info->read_buffer ); - pfile_in_zip_read_info->read_buffer = NULL; - if( pfile_in_zip_read_info->stream_initialised ) - inflateEnd( &pfile_in_zip_read_info->stream ); - - pfile_in_zip_read_info->stream_initialised = 0; - TRYFREE( pfile_in_zip_read_info ); - - s->pfile_in_zip_read = NULL; - - return err; -} - - -/* - Get the global comment string of the ZipFile, in the szComment buffer. - uSizeBuf is the size of the szComment buffer. - return the number of byte copied or an error code <0 -*/ -extern int unzGetGlobalComment( unzFile file, char* szComment, uLong uSizeBuf ) -{ - unz_s* s; - uLong uReadThis ; - if( file == NULL ) - return UNZ_PARAMERROR; - s = ( unz_s* )file; - - uReadThis = uSizeBuf; - if( uReadThis > s->gi.size_comment ) - uReadThis = s->gi.size_comment; - - if( s->file->Seek( s->central_pos + 22, FS_SEEK_SET ) == 0 ) - return UNZ_ERRNO; - - if( uReadThis > 0 ) - { - if( szComment == NULL ) - { - return ( int )uReadThis; - } - *szComment = '\0'; - if( s->file->Read( szComment, uReadThis ) != ( int )uReadThis ) - return UNZ_ERRNO; - } - - if( ( szComment != NULL ) && ( uSizeBuf > s->gi.size_comment ) ) - *( szComment + s->gi.size_comment ) = '\0'; - return ( int )uReadThis; -} diff --git a/neo/framework/Unzip.h b/neo/framework/Unzip.h index faae8587..8643d42b 100644 --- a/neo/framework/Unzip.h +++ b/neo/framework/Unzip.h @@ -37,293 +37,14 @@ #ifndef __UNZIP_H__ #define __UNZIP_H__ -#include "../libs/zlib/zlib.h" - -#if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP) -/* like the STRICT of WIN32, we define a pointer that cannot be converted - from (void*) without cast */ -typedef struct TagunzFile__ -{ - int unused; -} unzFile__; -typedef unzFile__* unzFile; -#else -typedef void* unzFile; -#endif - -/* tm_unz contain date/time info */ -typedef struct tm_unz_s -{ - unsigned int tm_sec; /* seconds after the minute - [0,59] */ - unsigned int tm_min; /* minutes after the hour - [0,59] */ - unsigned int tm_hour; /* hours since midnight - [0,23] */ - unsigned int tm_mday; /* day of the month - [1,31] */ - unsigned int tm_mon; /* months since January - [0,11] */ - unsigned int tm_year; /* years - [1980..2044] */ -} tm_unz; - -/* unz_global_info structure contain global data about the ZIPfile - These data comes from the end of central dir */ -typedef struct unz_global_info_s -{ - unsigned long number_entry; /* total number of entries in the central dir on this disk */ - unsigned long size_comment; /* size of the global comment of the zipfile */ -} unz_global_info; - - -/* unz_file_info contain information about a file in the zipfile */ -typedef struct unz_file_info_s -{ - unsigned long version; /* version made by 2 unsigned chars */ - unsigned long version_needed; /* version needed to extract 2 unsigned chars */ - unsigned long flag; /* general purpose bit flag 2 unsigned chars */ - unsigned long compression_method; /* compression method 2 unsigned chars */ - unsigned long dosDate; /* last mod file date in Dos fmt 4 unsigned chars */ - unsigned long crc; /* crc-32 4 unsigned chars */ - unsigned long compressed_size; /* compressed size 4 unsigned chars */ - unsigned long uncompressed_size; /* uncompressed size 4 unsigned chars */ - unsigned long size_filename; /* filename length 2 unsigned chars */ - unsigned long size_file_extra; /* extra field length 2 unsigned chars */ - unsigned long size_file_comment; /* file comment length 2 unsigned chars */ - - unsigned long disk_num_start; /* disk number start 2 unsigned chars */ - unsigned long internal_fa; /* internal file attributes 2 unsigned chars */ - unsigned long external_fa; /* external file attributes 4 unsigned chars */ - - tm_unz tmu_date; -} unz_file_info; - -/* unz_file_info_interntal contain internal info about a file in zipfile*/ -typedef struct unz_file_info_internal_s -{ - unsigned long offset_curfile;/* relative offset of static header 4 unsigned chars */ -} unz_file_info_internal; - -/* file_in_zip_read_info_s contain internal information about a file in zipfile, - when reading and decompress it */ -typedef struct -{ - char* read_buffer; /* internal buffer for compressed data */ - z_stream stream; /* zLib stream structure for inflate */ - - unsigned long pos_in_zipfile; /* position in unsigned char on the zipfile, for fseek*/ - unsigned long stream_initialised; /* flag set if stream structure is initialised*/ - - unsigned long offset_local_extrafield;/* offset of the static extra field */ - unsigned int size_local_extrafield;/* size of the static extra field */ - unsigned long pos_local_extrafield; /* position in the static extra field in read*/ - - unsigned long crc32; /* crc32 of all data uncompressed */ - unsigned long crc32_wait; /* crc32 we must obtain after decompress all */ - unsigned long rest_read_compressed; /* number of unsigned char to be decompressed */ - unsigned long rest_read_uncompressed;/*number of unsigned char to be obtained after decomp*/ - idFile* file; /* io structore of the zipfile */ - unsigned long compression_method; /* compression method (0==store) */ - unsigned long byte_before_the_zipfile;/* unsigned char before the zipfile, (>0 for sfx)*/ -} file_in_zip_read_info_s; - - -/* unz_s contain internal information about the zipfile -*/ -typedef struct -{ - idFile_Cached* file; /* io structore of the zipfile */ - unz_global_info gi; /* public global information */ - unsigned long byte_before_the_zipfile;/* unsigned char before the zipfile, (>0 for sfx)*/ - unsigned long num_file; /* number of the current file in the zipfile*/ - unsigned long pos_in_central_dir; /* pos of the current file in the central dir*/ - unsigned long current_file_ok; /* flag about the usability of the current file*/ - unsigned long central_pos; /* position of the beginning of the central dir*/ - - unsigned long size_central_dir; /* size of the central directory */ - unsigned long offset_central_dir; /* offset of start of central directory with - respect to the starting disk number */ - - unz_file_info cur_file_info; /* public info about the current file in zip*/ - unz_file_info_internal cur_file_info_internal; /* private info about it*/ - file_in_zip_read_info_s* pfile_in_zip_read; /* structure about the current - file if we are decompressing it */ -} unz_s; - -#define UNZ_OK (0) -#define UNZ_END_OF_LIST_OF_FILE (-100) -#define UNZ_ERRNO (Z_ERRNO) -#define UNZ_EOF (0) -#define UNZ_PARAMERROR (-102) -#define UNZ_BADZIPFILE (-103) -#define UNZ_INTERNALERROR (-104) -#define UNZ_CRCERROR (-105) - -#define UNZ_CASESENSITIVE 1 -#define UNZ_NOTCASESENSITIVE 2 -#define UNZ_OSDEFAULTCASE 0 - -extern int unzStringFileNameCompare( const char* fileName1, const char* fileName2, int iCaseSensitivity ); +#include "minizip/unzip.h" /* - Compare two filename (fileName1,fileName2). - If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) - If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi - or strcasecmp) - If iCaseSenisivity = 0, case sensitivity is defaut of your operating system - (like 1 on Unix, 2 on Windows) -*/ - -extern unzFile unzOpen( const char* path ); -extern unzFile unzReOpen( const char* path, unzFile file ); - -/* - Open a Zip file. path contain the full pathname (by example, - on a Windows NT computer "c:\\zlib\\zlib111.zip" or on an Unix computer - "zlib/zlib111.zip". - If the zipfile cannot be opened (file don't exist or in not valid), the - return value is NULL. - Else, the return value is a unzFile Handle, usable with other function - of this unzip package. -*/ - -extern int unzClose( unzFile file ); - -/* - Close a ZipFile opened with unzipOpen. - If there is files inside the .Zip opened with unzOpenCurrentFile (see later), - these files MUST be closed with unzipCloseCurrentFile before call unzipClose. - return UNZ_OK if there is no problem. */ - -extern int unzGetGlobalInfo( unzFile file, unz_global_info* pglobal_info ); - -/* - Write info about the ZipFile in the *pglobal_info structure. - No preparation of the structure is needed - return UNZ_OK if there is no problem. */ - - -extern int unzGetGlobalComment( unzFile file, char* szComment, unsigned long uSizeBuf ); - -/* - Get the global comment string of the ZipFile, in the szComment buffer. - uSizeBuf is the size of the szComment buffer. - return the number of unsigned char copied or an error code <0 -*/ - - -/***************************************************************************/ -/* Unzip package allow you browse the directory of the zipfile */ - -extern int unzGoToFirstFile( unzFile file ); - -/* - Set the current file of the zipfile to the first file. - return UNZ_OK if there is no problem -*/ - -extern int unzGoToNextFile( unzFile file ); - -/* - Set the current file of the zipfile to the next file. - return UNZ_OK if there is no problem - return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. -*/ - -extern int unzGetCurrentFileInfoPosition( unzFile file, unsigned long* pos ); - -/* - Get the position of the info of the current file in the zip. - return UNZ_OK if there is no problem -*/ - -extern int unzSetCurrentFileInfoPosition( unzFile file, unsigned long pos ); - -/* - Set the position of the info of the current file in the zip. - return UNZ_OK if there is no problem -*/ - -extern int unzLocateFile( unzFile file, const char* szFileName, int iCaseSensitivity ); - -/* - Try locate the file szFileName in the zipfile. - For the iCaseSensitivity signification, see unzStringFileNameCompare - - return value : - UNZ_OK if the file is found. It becomes the current file. - UNZ_END_OF_LIST_OF_FILE if the file is not found -*/ - - -extern int unzGetCurrentFileInfo( unzFile file, unz_file_info* pfile_info, char* szFileName, unsigned long fileNameBufferSize, void* extraField, unsigned long extraFieldBufferSize, char* szComment, unsigned long commentBufferSize ); - -/* - Get Info about the current file - if pfile_info!=NULL, the *pfile_info structure will contain somes info about - the current file - if szFileName!=NULL, the filemane string will be copied in szFileName - (fileNameBufferSize is the size of the buffer) - if extraField!=NULL, the extra field information will be copied in extraField - (extraFieldBufferSize is the size of the buffer). - This is the Central-header version of the extra field - if szComment!=NULL, the comment string of the file will be copied in szComment - (commentBufferSize is the size of the buffer) -*/ - -/***************************************************************************/ -/* for reading the content of the current zipfile, you can open it, read data - from it, and close it (you can close it before reading all the file) - */ - -extern int unzOpenCurrentFile( unzFile file ); - -/* - Open for reading data the current file in the zipfile. - If there is no error, the return value is UNZ_OK. -*/ - -extern int unzCloseCurrentFile( unzFile file ); - -/* - Close the file in zip opened with unzOpenCurrentFile - Return UNZ_CRCERROR if all the file was read but the CRC is not good -*/ - - -extern int unzReadCurrentFile( unzFile file, void* buf, unsigned len ); - -/* - Read unsigned chars from the current file (opened by unzOpenCurrentFile) - buf contain buffer where data must be copied - len the size of buf. - - return the number of unsigned char copied if somes unsigned chars are copied - return 0 if the end of file was reached - return <0 with error code if there is an error - (UNZ_ERRNO for IO error, or zLib error for uncompress error) -*/ - -extern long unztell( unzFile file ); - -/* - Give the current position in uncompressed data -*/ - -extern int unzeof( unzFile file ); - -/* - return 1 if the end of file was reached, 0 elsewhere -*/ - -extern int unzGetLocalExtrafield( unzFile file, void* buf, unsigned len ); - -/* - Read extra field from the current file (opened by unzOpenCurrentFile) - This is the local-header version of the extra field (sometimes, there is - more info in the local-header version than in the central-header) - - if buf==NULL, it return the size of the local extra field - - if buf!=NULL, len is the size of the buffer, the extra header is copied in - buf. - the return value is the number of unsigned chars copied in buf, or (if <0) - the error code -*/ + * DG: all unzip code has been moved to minizip/ + * when being updated to minizip 1.1 (instead of the previously used minizip 0.15beta from 1998) + * This update brings zip64 support (untested) and much cleaner code. + * Furthermore, updates to future minizip should be much easier now, as my changes to the + * original source files from minizip are quite small. + */ #endif /* __UNZIP_H__ */ diff --git a/neo/framework/minizip/MiniZip64_info.txt b/neo/framework/minizip/MiniZip64_info.txt new file mode 100644 index 00000000..09513213 --- /dev/null +++ b/neo/framework/minizip/MiniZip64_info.txt @@ -0,0 +1,87 @@ +NOTE from Daniel Gibson: + +These are parts of MiniZip (the unzip-parts), taken from zlib-1.2.7/contrib/minizip/ +and adjusted for doom3 by making small adjustments foor doom3 (doom3-specific allocator) +and adding a function (unzReOpen()) from the original Doom3 GPL release by id Software +that used MiniZip 0.15beta. It was adjusted by Daniel Gibson for MiniZip 1.1 + Copyright (C) 1999-2011 id Software LLC, a ZeniMax Media company. + Copyright (C) 2012-2013 Daniel Gibson + + +########### Original Content of this File below ############# + + +MiniZip - Copyright (c) 1998-2010 - by Gilles Vollant - version 1.1 64 bits from Mathias Svensson + +Introduction +--------------------- +MiniZip 1.1 is built from MiniZip 1.0 by Gilles Vollant ( http://www.winimage.com/zLibDll/minizip.html ) + +When adding ZIP64 support into minizip it would result into risk of breaking compatibility with minizip 1.0. +All possible work was done for compatibility. + + +Background +--------------------- +When adding ZIP64 support Mathias Svensson found that Even Rouault have added ZIP64 +support for unzip.c into minizip for a open source project called gdal ( http://www.gdal.org/ ) + +That was used as a starting point. And after that ZIP64 support was added to zip.c +some refactoring and code cleanup was also done. + + +Changed from MiniZip 1.0 to MiniZip 1.1 +--------------------------------------- +* Added ZIP64 support for unzip ( by Even Rouault ) +* Added ZIP64 support for zip ( by Mathias Svensson ) +* Reverted some changed that Even Rouault did. +* Bunch of patches received from Gulles Vollant that he received for MiniZip from various users. +* Added unzip patch for BZIP Compression method (patch create by Daniel Borca) +* Added BZIP Compress method for zip +* Did some refactoring and code cleanup + + +Credits + + Gilles Vollant - Original MiniZip author + Even Rouault - ZIP64 unzip Support + Daniel Borca - BZip Compression method support in unzip + Mathias Svensson - ZIP64 zip support + Mathias Svensson - BZip Compression method support in zip + + Resources + + ZipLayout http://result42.com/projects/ZipFileLayout + Command line tool for Windows that shows the layout and information of the headers in a zip archive. + Used when debugging and validating the creation of zip files using MiniZip64 + + + ZIP App Note http://www.pkware.com/documents/casestudies/APPNOTE.TXT + Zip File specification + + +Notes. + * To be able to use BZip compression method in zip64.c or unzip64.c the BZIP2 lib is needed and HAVE_BZIP2 need to be defined. + +License +---------------------------------------------------------- + Condition of use and distribution are the same than zlib : + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + +---------------------------------------------------------- + diff --git a/neo/framework/minizip/ioapi.c b/neo/framework/minizip/ioapi.c new file mode 100644 index 00000000..5dc99d59 --- /dev/null +++ b/neo/framework/minizip/ioapi.c @@ -0,0 +1,250 @@ +/* + this is from zlib-1.2.7/contrib/minizip/ + + ioapi.h -- IO base function header for compress/uncompress .zip + part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) + + Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) + + Modifications for Zip64 support + Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) + + For more info read MiniZip_info.txt + +*/ + +#if defined(_WIN32) && (!(defined(_CRT_SECURE_NO_WARNINGS))) + #define _CRT_SECURE_NO_WARNINGS +#endif + +#if defined(__APPLE__) || defined(IOAPI_NO_64) +// In darwin and perhaps other BSD variants off_t is a 64 bit value, hence no need for specific 64 bit functions +#define FOPEN_FUNC(filename, mode) fopen(filename, mode) +#define FTELLO_FUNC(stream) ftello(stream) +#define FSEEKO_FUNC(stream, offset, origin) fseeko(stream, offset, origin) +#else +#define FOPEN_FUNC(filename, mode) fopen64(filename, mode) +#define FTELLO_FUNC(stream) ftello64(stream) +#define FSEEKO_FUNC(stream, offset, origin) fseeko64(stream, offset, origin) +#endif + + +#include "ioapi.h" + +voidpf call_zopen64 (const zlib_filefunc64_32_def* pfilefunc,const void*filename,int mode) +{ + if (pfilefunc->zfile_func64.zopen64_file != NULL) + return (*(pfilefunc->zfile_func64.zopen64_file)) (pfilefunc->zfile_func64.opaque,filename,mode); + else + { + return (*(pfilefunc->zopen32_file))(pfilefunc->zfile_func64.opaque,(const char*)filename,mode); + } +} + +long call_zseek64 (const zlib_filefunc64_32_def* pfilefunc,voidpf filestream, ZPOS64_T offset, int origin) +{ + if (pfilefunc->zfile_func64.zseek64_file != NULL) + return (*(pfilefunc->zfile_func64.zseek64_file)) (pfilefunc->zfile_func64.opaque,filestream,offset,origin); + else + { + uLong offsetTruncated = (uLong)offset; + if (offsetTruncated != offset) + return -1; + else + return (*(pfilefunc->zseek32_file))(pfilefunc->zfile_func64.opaque,filestream,offsetTruncated,origin); + } +} + +ZPOS64_T call_ztell64 (const zlib_filefunc64_32_def* pfilefunc,voidpf filestream) +{ + if (pfilefunc->zfile_func64.zseek64_file != NULL) + return (*(pfilefunc->zfile_func64.ztell64_file)) (pfilefunc->zfile_func64.opaque,filestream); + else + { + uLong tell_uLong = (*(pfilefunc->ztell32_file))(pfilefunc->zfile_func64.opaque,filestream); + if ((tell_uLong) == MAXU32) + return (ZPOS64_T)-1; + else + return tell_uLong; + } +} + +void fill_zlib_filefunc64_32_def_from_filefunc32(zlib_filefunc64_32_def* p_filefunc64_32,const zlib_filefunc_def* p_filefunc32) +{ + p_filefunc64_32->zfile_func64.zopen64_file = NULL; + p_filefunc64_32->zopen32_file = p_filefunc32->zopen_file; + p_filefunc64_32->zfile_func64.zerror_file = p_filefunc32->zerror_file; + p_filefunc64_32->zfile_func64.zread_file = p_filefunc32->zread_file; + p_filefunc64_32->zfile_func64.zwrite_file = p_filefunc32->zwrite_file; + p_filefunc64_32->zfile_func64.ztell64_file = NULL; + p_filefunc64_32->zfile_func64.zseek64_file = NULL; + p_filefunc64_32->zfile_func64.zclose_file = p_filefunc32->zclose_file; + p_filefunc64_32->zfile_func64.zerror_file = p_filefunc32->zerror_file; + p_filefunc64_32->zfile_func64.opaque = p_filefunc32->opaque; + p_filefunc64_32->zseek32_file = p_filefunc32->zseek_file; + p_filefunc64_32->ztell32_file = p_filefunc32->ztell_file; +} + + + +static voidpf ZCALLBACK fopen_file_func OF((voidpf opaque, const char* filename, int mode)); +static uLong ZCALLBACK fread_file_func OF((voidpf opaque, voidpf stream, void* buf, uLong size)); +static uLong ZCALLBACK fwrite_file_func OF((voidpf opaque, voidpf stream, const void* buf,uLong size)); +static ZPOS64_T ZCALLBACK ftell64_file_func OF((voidpf opaque, voidpf stream)); +static long ZCALLBACK fseek64_file_func OF((voidpf opaque, voidpf stream, ZPOS64_T offset, int origin)); +static int ZCALLBACK fclose_file_func OF((voidpf opaque, voidpf stream)); +static int ZCALLBACK ferror_file_func OF((voidpf opaque, voidpf stream)); + +static voidpf ZCALLBACK fopen_file_func (voidpf opaque, const char* filename, int mode) +{ + FILE* file = NULL; + const char* mode_fopen = NULL; + if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ) + mode_fopen = "rb"; + else + if (mode & ZLIB_FILEFUNC_MODE_EXISTING) + mode_fopen = "r+b"; + else + if (mode & ZLIB_FILEFUNC_MODE_CREATE) + mode_fopen = "wb"; + + if ((filename!=NULL) && (mode_fopen != NULL)) + file = fopen(filename, mode_fopen); + return file; +} + +static voidpf ZCALLBACK fopen64_file_func (voidpf opaque, const void* filename, int mode) +{ + FILE* file = NULL; + const char* mode_fopen = NULL; + if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ) + mode_fopen = "rb"; + else + if (mode & ZLIB_FILEFUNC_MODE_EXISTING) + mode_fopen = "r+b"; + else + if (mode & ZLIB_FILEFUNC_MODE_CREATE) + mode_fopen = "wb"; + + if ((filename!=NULL) && (mode_fopen != NULL)) + file = FOPEN_FUNC((const char*)filename, mode_fopen); + return file; +} + + +static uLong ZCALLBACK fread_file_func (voidpf opaque, voidpf stream, void* buf, uLong size) +{ + uLong ret; + ret = (uLong)fread(buf, 1, (size_t)size, (FILE *)stream); + return ret; +} + +static uLong ZCALLBACK fwrite_file_func (voidpf opaque, voidpf stream, const void* buf, uLong size) +{ + uLong ret; + ret = (uLong)fwrite(buf, 1, (size_t)size, (FILE *)stream); + return ret; +} + +static long ZCALLBACK ftell_file_func (voidpf opaque, voidpf stream) +{ + long ret; + ret = ftell((FILE *)stream); + return ret; +} + + +static ZPOS64_T ZCALLBACK ftell64_file_func (voidpf opaque, voidpf stream) +{ + ZPOS64_T ret; + ret = FTELLO_FUNC((FILE *)stream); + return ret; +} + +static long ZCALLBACK fseek_file_func (voidpf opaque, voidpf stream, uLong offset, int origin) +{ + int fseek_origin=0; + long ret; + switch (origin) + { + case ZLIB_FILEFUNC_SEEK_CUR : + fseek_origin = SEEK_CUR; + break; + case ZLIB_FILEFUNC_SEEK_END : + fseek_origin = SEEK_END; + break; + case ZLIB_FILEFUNC_SEEK_SET : + fseek_origin = SEEK_SET; + break; + default: return -1; + } + ret = 0; + if (fseek((FILE *)stream, offset, fseek_origin) != 0) + ret = -1; + return ret; +} + +static long ZCALLBACK fseek64_file_func (voidpf opaque, voidpf stream, ZPOS64_T offset, int origin) +{ + int fseek_origin=0; + long ret; + switch (origin) + { + case ZLIB_FILEFUNC_SEEK_CUR : + fseek_origin = SEEK_CUR; + break; + case ZLIB_FILEFUNC_SEEK_END : + fseek_origin = SEEK_END; + break; + case ZLIB_FILEFUNC_SEEK_SET : + fseek_origin = SEEK_SET; + break; + default: return -1; + } + ret = 0; + + if(FSEEKO_FUNC((FILE *)stream, offset, fseek_origin) != 0) + ret = -1; + + return ret; +} + + +static int ZCALLBACK fclose_file_func (voidpf opaque, voidpf stream) +{ + int ret; + ret = fclose((FILE *)stream); + return ret; +} + +static int ZCALLBACK ferror_file_func (voidpf opaque, voidpf stream) +{ + int ret; + ret = ferror((FILE *)stream); + return ret; +} + +void fill_fopen_filefunc (pzlib_filefunc_def) + zlib_filefunc_def* pzlib_filefunc_def; +{ + pzlib_filefunc_def->zopen_file = fopen_file_func; + pzlib_filefunc_def->zread_file = fread_file_func; + pzlib_filefunc_def->zwrite_file = fwrite_file_func; + pzlib_filefunc_def->ztell_file = ftell_file_func; + pzlib_filefunc_def->zseek_file = fseek_file_func; + pzlib_filefunc_def->zclose_file = fclose_file_func; + pzlib_filefunc_def->zerror_file = ferror_file_func; + pzlib_filefunc_def->opaque = NULL; +} + +void fill_fopen64_filefunc (zlib_filefunc64_def* pzlib_filefunc_def) +{ + pzlib_filefunc_def->zopen64_file = fopen64_file_func; + pzlib_filefunc_def->zread_file = fread_file_func; + pzlib_filefunc_def->zwrite_file = fwrite_file_func; + pzlib_filefunc_def->ztell64_file = ftell64_file_func; + pzlib_filefunc_def->zseek64_file = fseek64_file_func; + pzlib_filefunc_def->zclose_file = fclose_file_func; + pzlib_filefunc_def->zerror_file = ferror_file_func; + pzlib_filefunc_def->opaque = NULL; +} diff --git a/neo/framework/minizip/ioapi.h b/neo/framework/minizip/ioapi.h new file mode 100644 index 00000000..896cc437 --- /dev/null +++ b/neo/framework/minizip/ioapi.h @@ -0,0 +1,211 @@ +/* + this is from zlib-1.2.7/contrib/minizip/ + + ioapi.h -- IO base function header for compress/uncompress .zip + part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) + + Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) + + Modifications for Zip64 support + Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) + + For more info read MiniZip_info.txt + + Changes + + Oct-2009 - Defined ZPOS64_T to fpos_t on windows and u_int64_t on linux. (might need to find a better why for this) + Oct-2009 - Change to fseeko64, ftello64 and fopen64 so large files would work on linux. + More if/def section may be needed to support other platforms + Oct-2009 - Defined fxxxx64 calls to normal fopen/ftell/fseek so they would compile on windows. + (but you should use iowin32.c for windows instead) + +*/ + +#ifndef _ZLIBIOAPI64_H +#define _ZLIBIOAPI64_H + +#if (!defined(_WIN32)) && (!defined(WIN32)) && (!defined(__APPLE__)) + + // Linux needs this to support file operation on files larger then 4+GB + // But might need better if/def to select just the platforms that needs them. + + #ifndef __USE_FILE_OFFSET64 + #define __USE_FILE_OFFSET64 + #endif + #ifndef __USE_LARGEFILE64 + #define __USE_LARGEFILE64 + #endif + #ifndef _LARGEFILE64_SOURCE + #define _LARGEFILE64_SOURCE + #endif + #ifndef _FILE_OFFSET_BIT + #define _FILE_OFFSET_BIT 64 + #endif + +#endif + +#include +#include +#include "../../libs/zlib/zlib.h" + +#if defined(USE_FILE32API) +#define fopen64 fopen +#define ftello64 ftell +#define fseeko64 fseek +#else +#ifdef __FreeBSD__ +#define fopen64 fopen +#define ftello64 ftello +#define fseeko64 fseeko +#endif +#ifdef _MSC_VER + #define fopen64 fopen + #if (_MSC_VER >= 1400) && (!(defined(NO_MSCVER_FILE64_FUNC))) + #define ftello64 _ftelli64 + #define fseeko64 _fseeki64 + #else // old MSC + #define ftello64 ftell + #define fseeko64 fseek + #endif +#endif +#endif + +/* +#ifndef ZPOS64_T + #ifdef _WIN32 + #define ZPOS64_T fpos_t + #else + #include + #define ZPOS64_T uint64_t + #endif +#endif +*/ + +#ifdef HAVE_MINIZIP64_CONF_H +#include "mz64conf.h" +#endif + +/* a type choosen by DEFINE */ +#ifdef HAVE_64BIT_INT_CUSTOM +typedef 64BIT_INT_CUSTOM_TYPE ZPOS64_T; +#else +#ifdef HAS_STDINT_H +#include "stdint.h" +typedef uint64_t ZPOS64_T; +#else + +/* Maximum unsigned 32-bit value used as placeholder for zip64 */ +#define MAXU32 0xffffffff + +#if defined(_MSC_VER) || defined(__BORLANDC__) +typedef unsigned __int64 ZPOS64_T; +#else +typedef unsigned long long int ZPOS64_T; +#endif +#endif +#endif + + + +#ifdef __cplusplus +extern "C" { +#endif + + +#define ZLIB_FILEFUNC_SEEK_CUR (1) +#define ZLIB_FILEFUNC_SEEK_END (2) +#define ZLIB_FILEFUNC_SEEK_SET (0) + +#define ZLIB_FILEFUNC_MODE_READ (1) +#define ZLIB_FILEFUNC_MODE_WRITE (2) +#define ZLIB_FILEFUNC_MODE_READWRITEFILTER (3) + +#define ZLIB_FILEFUNC_MODE_EXISTING (4) +#define ZLIB_FILEFUNC_MODE_CREATE (8) + + +#ifndef ZCALLBACK + #if (defined(WIN32) || defined(_WIN32) || defined (WINDOWS) || defined (_WINDOWS)) && defined(CALLBACK) && defined (USEWINDOWS_CALLBACK) + #define ZCALLBACK CALLBACK + #else + #define ZCALLBACK + #endif +#endif + + + + +typedef voidpf (ZCALLBACK *open_file_func) OF((voidpf opaque, const char* filename, int mode)); +typedef uLong (ZCALLBACK *read_file_func) OF((voidpf opaque, voidpf stream, void* buf, uLong size)); +typedef uLong (ZCALLBACK *write_file_func) OF((voidpf opaque, voidpf stream, const void* buf, uLong size)); +typedef int (ZCALLBACK *close_file_func) OF((voidpf opaque, voidpf stream)); +typedef int (ZCALLBACK *testerror_file_func) OF((voidpf opaque, voidpf stream)); + +typedef long (ZCALLBACK *tell_file_func) OF((voidpf opaque, voidpf stream)); +typedef long (ZCALLBACK *seek_file_func) OF((voidpf opaque, voidpf stream, uLong offset, int origin)); + + +/* here is the "old" 32 bits structure structure */ +typedef struct zlib_filefunc_def_s +{ + open_file_func zopen_file; + read_file_func zread_file; + write_file_func zwrite_file; + tell_file_func ztell_file; + seek_file_func zseek_file; + close_file_func zclose_file; + testerror_file_func zerror_file; + voidpf opaque; +} zlib_filefunc_def; + +typedef ZPOS64_T (ZCALLBACK *tell64_file_func) OF((voidpf opaque, voidpf stream)); +typedef long (ZCALLBACK *seek64_file_func) OF((voidpf opaque, voidpf stream, ZPOS64_T offset, int origin)); +typedef voidpf (ZCALLBACK *open64_file_func) OF((voidpf opaque, const void* filename, int mode)); + +typedef struct zlib_filefunc64_def_s +{ + open64_file_func zopen64_file; + read_file_func zread_file; + write_file_func zwrite_file; + tell64_file_func ztell64_file; + seek64_file_func zseek64_file; + close_file_func zclose_file; + testerror_file_func zerror_file; + voidpf opaque; +} zlib_filefunc64_def; + +void fill_fopen64_filefunc OF((zlib_filefunc64_def* pzlib_filefunc_def)); +void fill_fopen_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def)); + +/* now internal definition, only for zip.c and unzip.h */ +typedef struct zlib_filefunc64_32_def_s +{ + zlib_filefunc64_def zfile_func64; + open_file_func zopen32_file; + tell_file_func ztell32_file; + seek_file_func zseek32_file; +} zlib_filefunc64_32_def; + + +#define ZREAD64(filefunc,filestream,buf,size) ((*((filefunc).zfile_func64.zread_file)) ((filefunc).zfile_func64.opaque,filestream,buf,size)) +#define ZWRITE64(filefunc,filestream,buf,size) ((*((filefunc).zfile_func64.zwrite_file)) ((filefunc).zfile_func64.opaque,filestream,buf,size)) +//#define ZTELL64(filefunc,filestream) ((*((filefunc).ztell64_file)) ((filefunc).opaque,filestream)) +//#define ZSEEK64(filefunc,filestream,pos,mode) ((*((filefunc).zseek64_file)) ((filefunc).opaque,filestream,pos,mode)) +#define ZCLOSE64(filefunc,filestream) ((*((filefunc).zfile_func64.zclose_file)) ((filefunc).zfile_func64.opaque,filestream)) +#define ZERROR64(filefunc,filestream) ((*((filefunc).zfile_func64.zerror_file)) ((filefunc).zfile_func64.opaque,filestream)) + +voidpf call_zopen64 OF((const zlib_filefunc64_32_def* pfilefunc,const void*filename,int mode)); +long call_zseek64 OF((const zlib_filefunc64_32_def* pfilefunc,voidpf filestream, ZPOS64_T offset, int origin)); +ZPOS64_T call_ztell64 OF((const zlib_filefunc64_32_def* pfilefunc,voidpf filestream)); + +void fill_zlib_filefunc64_32_def_from_filefunc32(zlib_filefunc64_32_def* p_filefunc64_32,const zlib_filefunc_def* p_filefunc32); + +#define ZOPEN64(filefunc,filename,mode) (call_zopen64((&(filefunc)),(filename),(mode))) +#define ZTELL64(filefunc,filestream) (call_ztell64((&(filefunc)),(filestream))) +#define ZSEEK64(filefunc,filestream,pos,mode) (call_zseek64((&(filefunc)),(filestream),(pos),(mode))) + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/neo/framework/minizip/unzip.cpp b/neo/framework/minizip/unzip.cpp new file mode 100644 index 00000000..54d5dbef --- /dev/null +++ b/neo/framework/minizip/unzip.cpp @@ -0,0 +1,2270 @@ +/* + this is from zlib-1.2.7/contrib/minizip/ + unzip.c -- IO for uncompress .zip files using zlib + Version 1.1, February 14h, 2010 + part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) + + Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) + + Modifications of Unzip for Zip64 + Copyright (C) 2007-2008 Even Rouault + + Modifications for Zip64 support on both zip and unzip + Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) + + For more info read MiniZip_info.txt + + + ------------------------------------------------------------------------------------ + Decryption code comes from crypt.c by Info-ZIP but has been greatly reduced in terms of + compatibility with older software. The following is from the original crypt.c. + Code woven in by Terry Thorsen 1/2003. + + Copyright (c) 1990-2000 Info-ZIP. All rights reserved. + + See the accompanying file LICENSE, version 2000-Apr-09 or later + (the contents of which are also included in zip.h) for terms of use. + If, for some reason, all these files are missing, the Info-ZIP license + also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html + + crypt.c (full version) by Info-ZIP. Last revised: [see crypt.h] + + The encryption/decryption parts of this source code (as opposed to the + non-echoing password parts) were originally written in Europe. The + whole source package can be freely distributed, including from the USA. + (Prior to January 2000, re-export from the US was a violation of US law.) + + This encryption code is a direct transcription of the algorithm from + Roger Schlafly, described by Phil Katz in the file appnote.txt. This + file (appnote.txt) is distributed with the PKZIP program (even in the + version without encryption capabilities). + + ------------------------------------------------------------------------------------ + + Changes in unzip.c + + 2007-2008 - Even Rouault - Addition of cpl_unzGetCurrentFileZStreamPos + 2007-2008 - Even Rouault - Decoration of symbol names unz* -> cpl_unz* + 2007-2008 - Even Rouault - Remove old C style function prototypes + 2007-2008 - Even Rouault - Add unzip support for ZIP64 + + Copyright (C) 2007-2008 Even Rouault + + + Oct-2009 - Mathias Svensson - Removed cpl_* from symbol names (Even Rouault added them but since this is now moved to a new project (minizip64) I renamed them again). + Oct-2009 - Mathias Svensson - Fixed problem if uncompressed size was > 4G and compressed size was <4G + should only read the compressed/uncompressed size from the Zip64 format if + the size from normal header was 0xFFFFFFFF + Oct-2009 - Mathias Svensson - Applied some bug fixes from paches recived from Gilles Vollant + Oct-2009 - Mathias Svensson - Applied support to unzip files with compression mathod BZIP2 (bzip2 lib is required) + Patch created by Daniel Borca + + Jan-2010 - back to unzip and minizip 1.0 name scheme, with compatibility layer + + Copyright (C) 1998 - 2010 Gilles Vollant, Even Rouault, Mathias Svensson + + #################################################################################### + +unzReOpen() was added by id Software (originally in framework/Unzip.cpp) for doom3 +and adjusted for MiniZip 1.1 by Daniel Gibson +The file was renamed from unzip.c to unzip.cpp so we can use C++ functions from doom3 + + Copyright (C) 1999-2011 id Software LLC, a ZeniMax Media company. + Copyright (C) 2012-2013 Daniel Gibson + +*/ + +#include "precompiled.h" +#pragma hdrstop + +#if 0 // DG: these cvars were defined in the original d3 bfg code, probably for some debug purpose? +// they are only used in unz64local_GetCurrentFileInfoInternal() +idCVar zip_numSeeks( "zip_numSeeks", "0", CVAR_INTEGER, "" ); +idCVar zip_skippedSeeks( "zip_skippedSeeks", "0", CVAR_INTEGER, "" ); +idCVar zip_seeksForward( "zip_seeksForward", "0", CVAR_INTEGER, "" ); +idCVar zip_seeksBackward( "zip_seeksBackward", "0", CVAR_INTEGER, "" ); +idCVar zip_avgSeekDistance( "zip_avgSeekDistance", "0", CVAR_INTEGER, "" ); +#endif + +#if 0 // we don't really want system includes here +#include +#include +#include + +#ifndef NOUNCRYPT + #define NOUNCRYPT +#endif + +#include "zlib.h" +#include "unzip.h" + +#ifdef STDC +# include +# include +# include +#endif +#ifdef NO_ERRNO_H + extern int errno; +#else +# include +#endif + +#else // 0 +// doom3 headers are included through precompiled.h at the beginning of the file +/* +#include "sys/platform.h" +#include "idlib/Heap.h" +#include "idlib/Lib.h" +*/ +// we don't need crypt support +#define NOUNCRYPT 1 + +#include "unzip.h" +#endif // 0 + + +#ifndef local +# define local static +#endif +/* compile with -Dlocal if your debugger can't find static symbols */ + + +#ifndef CASESENSITIVITYDEFAULT_NO +# if !defined(unix) && !defined(CASESENSITIVITYDEFAULT_YES) +# define CASESENSITIVITYDEFAULT_NO +# endif +#endif + + +#ifndef UNZ_BUFSIZE +#define UNZ_BUFSIZE (16384) +#endif + +#ifndef UNZ_MAXFILENAMEINZIP +#define UNZ_MAXFILENAMEINZIP (256) +#endif + +#if 0 // don't use system malloc but doom3's allocator +#ifndef ALLOC +# define ALLOC(size) (malloc(size)) +#endif +#ifndef TRYFREE +# define TRYFREE(p) {if (p) free(p);} +#endif +#else // 0 +#define ALLOC(size) (Mem_Alloc(size, TAG_IDFILE)) +#define TRYFREE(p) {Mem_Free(p);} // Mem_Free - as well as free() - check for NULL themselves, no need to do it here +#endif // 0 + +#define SIZECENTRALDIRITEM (0x2e) +#define SIZEZIPLOCALHEADER (0x1e) + + +const char unz_copyright[] = + " unzip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll"; + +/* unz_file_info_interntal contain internal info about a file in zipfile*/ +typedef struct unz_file_info64_internal_s +{ + ZPOS64_T offset_curfile;/* relative offset of local header 8 bytes */ +} unz_file_info64_internal; + + +/* file_in_zip_read_info_s contain internal information about a file in zipfile, + when reading and decompress it */ +typedef struct +{ + char *read_buffer; /* internal buffer for compressed data */ + z_stream stream; /* zLib stream structure for inflate */ + +#ifdef HAVE_BZIP2 + bz_stream bstream; /* bzLib stream structure for bziped */ +#endif + + ZPOS64_T pos_in_zipfile; /* position in byte on the zipfile, for fseek*/ + uLong stream_initialised; /* flag set if stream structure is initialised*/ + + ZPOS64_T offset_local_extrafield;/* offset of the local extra field */ + uInt size_local_extrafield;/* size of the local extra field */ + ZPOS64_T pos_local_extrafield; /* position in the local extra field in read*/ + ZPOS64_T total_out_64; + + uLong crc32; /* crc32 of all data uncompressed */ + uLong crc32_wait; /* crc32 we must obtain after decompress all */ + ZPOS64_T rest_read_compressed; /* number of byte to be decompressed */ + ZPOS64_T rest_read_uncompressed;/*number of byte to be obtained after decomp*/ + zlib_filefunc64_32_def z_filefunc; + voidpf filestream; /* io structore of the zipfile */ + uLong compression_method; /* compression method (0==store) */ + ZPOS64_T byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ + int raw; +} file_in_zip64_read_info_s; + + +/* unz64_s contain internal information about the zipfile +*/ +typedef struct +{ + zlib_filefunc64_32_def z_filefunc; + int is64bitOpenFunction; + voidpf filestream; /* io structore of the zipfile */ + unz_global_info64 gi; /* public global information */ + ZPOS64_T byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ + ZPOS64_T num_file; /* number of the current file in the zipfile*/ + ZPOS64_T pos_in_central_dir; /* pos of the current file in the central dir*/ + ZPOS64_T current_file_ok; /* flag about the usability of the current file*/ + ZPOS64_T central_pos; /* position of the beginning of the central dir*/ + + ZPOS64_T size_central_dir; /* size of the central directory */ + ZPOS64_T offset_central_dir; /* offset of start of central directory with + respect to the starting disk number */ + + unz_file_info64 cur_file_info; /* public info about the current file in zip*/ + unz_file_info64_internal cur_file_info_internal; /* private info about it*/ + file_in_zip64_read_info_s* pfile_in_zip_read; /* structure about the current + file if we are decompressing it */ + int encrypted; + + int isZip64; + +# ifndef NOUNCRYPT + unsigned long keys[3]; /* keys defining the pseudo-random sequence */ + const unsigned long* pcrc_32_tab; +# endif +} unz64_s; + + +#ifndef NOUNCRYPT +#include "crypt.h" +#endif + +/* =========================================================================== + Read a byte from a gz_stream; update next_in and avail_in. Return EOF + for end of file. + IN assertion: the stream s has been sucessfully opened for reading. +*/ + + +local int unz64local_getByte OF(( + const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream, + int *pi)); + +local int unz64local_getByte(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, int *pi) +{ + unsigned char c; + int err = (int)ZREAD64(*pzlib_filefunc_def,filestream,&c,1); + if (err==1) + { + *pi = (int)c; + return UNZ_OK; + } + else + { + if (ZERROR64(*pzlib_filefunc_def,filestream)) + return UNZ_ERRNO; + else + return UNZ_EOF; + } +} + + +/* =========================================================================== + Reads a long in LSB order from the given gz_stream. Sets +*/ +local int unz64local_getShort OF(( + const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream, + uLong *pX)); + +local int unz64local_getShort (const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream, + uLong *pX) +{ + uLong x ; + int i = 0; + int err; + + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x = (uLong)i; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((uLong)i)<<8; + + if (err==UNZ_OK) + *pX = x; + else + *pX = 0; + return err; +} + +local int unz64local_getLong OF(( + const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream, + uLong *pX)); + +local int unz64local_getLong (const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream, + uLong *pX) +{ + uLong x ; + int i = 0; + int err; + + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x = (uLong)i; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((uLong)i)<<8; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((uLong)i)<<16; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((uLong)i)<<24; + + if (err==UNZ_OK) + *pX = x; + else + *pX = 0; + return err; +} + +local int unz64local_getLong64 OF(( + const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream, + ZPOS64_T *pX)); + + +local int unz64local_getLong64 (const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream, + ZPOS64_T *pX) +{ + ZPOS64_T x ; + int i = 0; + int err; + + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x = (ZPOS64_T)i; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((ZPOS64_T)i)<<8; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((ZPOS64_T)i)<<16; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((ZPOS64_T)i)<<24; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((ZPOS64_T)i)<<32; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((ZPOS64_T)i)<<40; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((ZPOS64_T)i)<<48; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((ZPOS64_T)i)<<56; + + if (err==UNZ_OK) + *pX = x; + else + *pX = 0; + return err; +} + +/* My own strcmpi / strcasecmp */ +local int strcmpcasenosensitive_internal (const char* fileName1, const char* fileName2) +{ + for (;;) + { + char c1=*(fileName1++); + char c2=*(fileName2++); + if ((c1>='a') && (c1<='z')) + c1 -= 0x20; + if ((c2>='a') && (c2<='z')) + c2 -= 0x20; + if (c1=='\0') + return ((c2=='\0') ? 0 : -1); + if (c2=='\0') + return 1; + if (c1c2) + return 1; + } +} + + +#ifdef CASESENSITIVITYDEFAULT_NO +#define CASESENSITIVITYDEFAULTVALUE 2 +#else +#define CASESENSITIVITYDEFAULTVALUE 1 +#endif + +#ifndef STRCMPCASENOSENTIVEFUNCTION +#define STRCMPCASENOSENTIVEFUNCTION strcmpcasenosensitive_internal +#endif + +/* + Compare two filename (fileName1,fileName2). + If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) + If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi + or strcasecmp) + If iCaseSenisivity = 0, case sensitivity is defaut of your operating system + (like 1 on Unix, 2 on Windows) + +*/ +extern int ZEXPORT unzStringFileNameCompare (const char* fileName1, + const char* fileName2, + int iCaseSensitivity) + +{ + if (iCaseSensitivity==0) + iCaseSensitivity=CASESENSITIVITYDEFAULTVALUE; + + if (iCaseSensitivity==1) + return strcmp(fileName1,fileName2); + + return STRCMPCASENOSENTIVEFUNCTION(fileName1,fileName2); +} + +#ifndef BUFREADCOMMENT +#define BUFREADCOMMENT (0x400) +#endif + +/* + Locate the Central directory of a zipfile (at the end, just before + the global comment) +*/ +local ZPOS64_T unz64local_SearchCentralDir OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream)); +local ZPOS64_T unz64local_SearchCentralDir(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream) +{ + unsigned char* buf; + ZPOS64_T uSizeFile; + ZPOS64_T uBackRead; + ZPOS64_T uMaxBack=0xffff; /* maximum size of global comment */ + ZPOS64_T uPosFound=0; + + if (ZSEEK64(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0) + return 0; + + + uSizeFile = ZTELL64(*pzlib_filefunc_def,filestream); + + if (uMaxBack>uSizeFile) + uMaxBack = uSizeFile; + + buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4); + if (buf==NULL) + return 0; + + uBackRead = 4; + while (uBackReaduMaxBack) + uBackRead = uMaxBack; + else + uBackRead+=BUFREADCOMMENT; + uReadPos = uSizeFile-uBackRead ; + + uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ? + (BUFREADCOMMENT+4) : (uLong)(uSizeFile-uReadPos); + if (ZSEEK64(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0) + break; + + if (ZREAD64(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize) + break; + + for (i=(int)uReadSize-3; (i--)>0;) + if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && + ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06)) + { + uPosFound = uReadPos+i; + break; + } + + if (uPosFound!=0) + break; + } + TRYFREE(buf); + return uPosFound; +} + + +/* + Locate the Central directory 64 of a zipfile (at the end, just before + the global comment) +*/ +local ZPOS64_T unz64local_SearchCentralDir64 OF(( + const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream)); + +local ZPOS64_T unz64local_SearchCentralDir64(const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream) +{ + unsigned char* buf; + ZPOS64_T uSizeFile; + ZPOS64_T uBackRead; + ZPOS64_T uMaxBack=0xffff; /* maximum size of global comment */ + ZPOS64_T uPosFound=0; + uLong uL; + ZPOS64_T relativeOffset; + + if (ZSEEK64(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0) + return 0; + + + uSizeFile = ZTELL64(*pzlib_filefunc_def,filestream); + + if (uMaxBack>uSizeFile) + uMaxBack = uSizeFile; + + buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4); + if (buf==NULL) + return 0; + + uBackRead = 4; + while (uBackReaduMaxBack) + uBackRead = uMaxBack; + else + uBackRead+=BUFREADCOMMENT; + uReadPos = uSizeFile-uBackRead ; + + uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ? + (BUFREADCOMMENT+4) : (uLong)(uSizeFile-uReadPos); + if (ZSEEK64(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0) + break; + + if (ZREAD64(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize) + break; + + for (i=(int)uReadSize-3; (i--)>0;) + if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && + ((*(buf+i+2))==0x06) && ((*(buf+i+3))==0x07)) + { + uPosFound = uReadPos+i; + break; + } + + if (uPosFound!=0) + break; + } + TRYFREE(buf); + if (uPosFound == 0) + return 0; + + /* Zip64 end of central directory locator */ + if (ZSEEK64(*pzlib_filefunc_def,filestream, uPosFound,ZLIB_FILEFUNC_SEEK_SET)!=0) + return 0; + + /* the signature, already checked */ + if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK) + return 0; + + /* number of the disk with the start of the zip64 end of central directory */ + if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK) + return 0; + if (uL != 0) + return 0; + + /* relative offset of the zip64 end of central directory record */ + if (unz64local_getLong64(pzlib_filefunc_def,filestream,&relativeOffset)!=UNZ_OK) + return 0; + + /* total number of disks */ + if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK) + return 0; + if (uL != 1) + return 0; + + /* Goto end of central directory record */ + if (ZSEEK64(*pzlib_filefunc_def,filestream, relativeOffset,ZLIB_FILEFUNC_SEEK_SET)!=0) + return 0; + + /* the signature */ + if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK) + return 0; + + if (uL != 0x06064b50) + return 0; + + return relativeOffset; +} + +/* + Open a Zip file. path contain the full pathname (by example, + on a Windows NT computer "c:\\test\\zlib114.zip" or on an Unix computer + "zlib/zlib114.zip". + If the zipfile cannot be opened (file doesn't exist or in not valid), the + return value is NULL. + Else, the return value is a unzFile Handle, usable with other function + of this unzip package. +*/ +local unzFile unzOpenInternal (const void *path, + zlib_filefunc64_32_def* pzlib_filefunc64_32_def, + int is64bitOpenFunction) +{ + unz64_s us; + unz64_s *s; + ZPOS64_T central_pos; + uLong uL; + + uLong number_disk; /* number of the current dist, used for + spaning ZIP, unsupported, always 0*/ + uLong number_disk_with_CD; /* number the the disk with central dir, used + for spaning ZIP, unsupported, always 0*/ + ZPOS64_T number_entry_CD; /* total number of entries in + the central dir + (same than number_entry on nospan) */ + + int err=UNZ_OK; + + if (unz_copyright[0]!=' ') + return NULL; + + us.z_filefunc.zseek32_file = NULL; + us.z_filefunc.ztell32_file = NULL; + if (pzlib_filefunc64_32_def==NULL) + fill_fopen64_filefunc(&us.z_filefunc.zfile_func64); + else + us.z_filefunc = *pzlib_filefunc64_32_def; + us.is64bitOpenFunction = is64bitOpenFunction; + + + + us.filestream = ZOPEN64(us.z_filefunc, + path, + ZLIB_FILEFUNC_MODE_READ | + ZLIB_FILEFUNC_MODE_EXISTING); + if (us.filestream==NULL) + return NULL; + + central_pos = unz64local_SearchCentralDir64(&us.z_filefunc,us.filestream); + if (central_pos) + { + uLong uS; + ZPOS64_T uL64; + + us.isZip64 = 1; + + if (ZSEEK64(us.z_filefunc, us.filestream, + central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0) + err=UNZ_ERRNO; + + /* the signature, already checked */ + if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) + err=UNZ_ERRNO; + + /* size of zip64 end of central directory record */ + if (unz64local_getLong64(&us.z_filefunc, us.filestream,&uL64)!=UNZ_OK) + err=UNZ_ERRNO; + + /* version made by */ + if (unz64local_getShort(&us.z_filefunc, us.filestream,&uS)!=UNZ_OK) + err=UNZ_ERRNO; + + /* version needed to extract */ + if (unz64local_getShort(&us.z_filefunc, us.filestream,&uS)!=UNZ_OK) + err=UNZ_ERRNO; + + /* number of this disk */ + if (unz64local_getLong(&us.z_filefunc, us.filestream,&number_disk)!=UNZ_OK) + err=UNZ_ERRNO; + + /* number of the disk with the start of the central directory */ + if (unz64local_getLong(&us.z_filefunc, us.filestream,&number_disk_with_CD)!=UNZ_OK) + err=UNZ_ERRNO; + + /* total number of entries in the central directory on this disk */ + if (unz64local_getLong64(&us.z_filefunc, us.filestream,&us.gi.number_entry)!=UNZ_OK) + err=UNZ_ERRNO; + + /* total number of entries in the central directory */ + if (unz64local_getLong64(&us.z_filefunc, us.filestream,&number_entry_CD)!=UNZ_OK) + err=UNZ_ERRNO; + + if ((number_entry_CD!=us.gi.number_entry) || + (number_disk_with_CD!=0) || + (number_disk!=0)) + err=UNZ_BADZIPFILE; + + /* size of the central directory */ + if (unz64local_getLong64(&us.z_filefunc, us.filestream,&us.size_central_dir)!=UNZ_OK) + err=UNZ_ERRNO; + + /* offset of start of central directory with respect to the + starting disk number */ + if (unz64local_getLong64(&us.z_filefunc, us.filestream,&us.offset_central_dir)!=UNZ_OK) + err=UNZ_ERRNO; + + us.gi.size_comment = 0; + } + else + { + central_pos = unz64local_SearchCentralDir(&us.z_filefunc,us.filestream); + if (central_pos==0) + err=UNZ_ERRNO; + + us.isZip64 = 0; + + if (ZSEEK64(us.z_filefunc, us.filestream, + central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0) + err=UNZ_ERRNO; + + /* the signature, already checked */ + if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) + err=UNZ_ERRNO; + + /* number of this disk */ + if (unz64local_getShort(&us.z_filefunc, us.filestream,&number_disk)!=UNZ_OK) + err=UNZ_ERRNO; + + /* number of the disk with the start of the central directory */ + if (unz64local_getShort(&us.z_filefunc, us.filestream,&number_disk_with_CD)!=UNZ_OK) + err=UNZ_ERRNO; + + /* total number of entries in the central dir on this disk */ + if (unz64local_getShort(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) + err=UNZ_ERRNO; + us.gi.number_entry = uL; + + /* total number of entries in the central dir */ + if (unz64local_getShort(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) + err=UNZ_ERRNO; + number_entry_CD = uL; + + if ((number_entry_CD!=us.gi.number_entry) || + (number_disk_with_CD!=0) || + (number_disk!=0)) + err=UNZ_BADZIPFILE; + + /* size of the central directory */ + if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) + err=UNZ_ERRNO; + us.size_central_dir = uL; + + /* offset of start of central directory with respect to the + starting disk number */ + if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) + err=UNZ_ERRNO; + us.offset_central_dir = uL; + + /* zipfile comment length */ + if (unz64local_getShort(&us.z_filefunc, us.filestream,&us.gi.size_comment)!=UNZ_OK) + err=UNZ_ERRNO; + } + + if ((central_posCacheData( us.offset_central_dir, us.size_central_dir ); + // DG end +#endif + + s=(unz64_s*)ALLOC(sizeof(unz64_s)); + if( s != NULL) + { + *s=us; + unzGoToFirstFile((unzFile)s); + } + return (unzFile)s; +} + + +extern unzFile ZEXPORT unzOpen2 (const char *path, + zlib_filefunc_def* pzlib_filefunc32_def) +{ + if (pzlib_filefunc32_def != NULL) + { + zlib_filefunc64_32_def zlib_filefunc64_32_def_fill; + fill_zlib_filefunc64_32_def_from_filefunc32(&zlib_filefunc64_32_def_fill,pzlib_filefunc32_def); + return unzOpenInternal(path, &zlib_filefunc64_32_def_fill, 0); + } + else + return unzOpenInternal(path, NULL, 0); +} + +extern unzFile ZEXPORT unzOpen2_64 (const void *path, + zlib_filefunc64_def* pzlib_filefunc_def) +{ + if (pzlib_filefunc_def != NULL) + { + zlib_filefunc64_32_def zlib_filefunc64_32_def_fill; + zlib_filefunc64_32_def_fill.zfile_func64 = *pzlib_filefunc_def; + zlib_filefunc64_32_def_fill.ztell32_file = NULL; + zlib_filefunc64_32_def_fill.zseek32_file = NULL; + return unzOpenInternal(path, &zlib_filefunc64_32_def_fill, 1); + } + else + return unzOpenInternal(path, NULL, 1); +} + +extern unzFile ZEXPORT unzOpen (const char *path) +{ + return unzOpenInternal(path, NULL, 0); +} + +extern unzFile ZEXPORT unzOpen64 (const void *path) +{ + return unzOpenInternal(path, NULL, 1); +} + +/* + Close a ZipFile opened with unzipOpen. + If there is files inside the .Zip opened with unzipOpenCurrentFile (see later), + these files MUST be closed with unzipCloseCurrentFile before call unzipClose. + return UNZ_OK if there is no problem. */ +extern int ZEXPORT unzClose (unzFile file) +{ + unz64_s* s; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + + if (s->pfile_in_zip_read!=NULL) + unzCloseCurrentFile(file); + + ZCLOSE64(s->z_filefunc, s->filestream); + TRYFREE(s); + return UNZ_OK; +} + + +/* + Write info about the ZipFile in the *pglobal_info structure. + No preparation of the structure is needed + return UNZ_OK if there is no problem. */ +extern int ZEXPORT unzGetGlobalInfo64 (unzFile file, unz_global_info64* pglobal_info) +{ + unz64_s* s; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + *pglobal_info=s->gi; + return UNZ_OK; +} + +extern int ZEXPORT unzGetGlobalInfo (unzFile file, unz_global_info* pglobal_info32) +{ + unz64_s* s; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + /* to do : check if number_entry is not truncated */ + pglobal_info32->number_entry = (uLong)s->gi.number_entry; + pglobal_info32->size_comment = s->gi.size_comment; + return UNZ_OK; +} +/* + Translate date/time from Dos format to tm_unz (readable more easilty) +*/ +local void unz64local_DosDateToTmuDate (ZPOS64_T ulDosDate, tm_unz* ptm) +{ + ZPOS64_T uDate; + uDate = (ZPOS64_T)(ulDosDate>>16); + ptm->tm_mday = (uInt)(uDate&0x1f) ; + ptm->tm_mon = (uInt)((((uDate)&0x1E0)/0x20)-1) ; + ptm->tm_year = (uInt)(((uDate&0x0FE00)/0x0200)+1980) ; + + ptm->tm_hour = (uInt) ((ulDosDate &0xF800)/0x800); + ptm->tm_min = (uInt) ((ulDosDate&0x7E0)/0x20) ; + ptm->tm_sec = (uInt) (2*(ulDosDate&0x1f)) ; +} + +/* + Get Info about the current file in the zipfile, with internal only info +*/ +local int unz64local_GetCurrentFileInfoInternal OF((unzFile file, + unz_file_info64 *pfile_info, + unz_file_info64_internal + *pfile_info_internal, + char *szFileName, + uLong fileNameBufferSize, + void *extraField, + uLong extraFieldBufferSize, + char *szComment, + uLong commentBufferSize)); + +local int unz64local_GetCurrentFileInfoInternal (unzFile file, + unz_file_info64 *pfile_info, + unz_file_info64_internal + *pfile_info_internal, + char *szFileName, + uLong fileNameBufferSize, + void *extraField, + uLong extraFieldBufferSize, + char *szComment, + uLong commentBufferSize) +{ + unz64_s* s; + unz_file_info64 file_info; + unz_file_info64_internal file_info_internal; + int err=UNZ_OK; + uLong uMagic; + long lSeek=0; + uLong uL; + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + +#if 0 + // DG: this code was in the original d3 bfg source from idsoftware, most probably just for those debug cvars? + // it can't simply be uncommented but would have to be adapted for minizip 1.1 first + int tellpos = s->file->Tell() - s->pos_in_central_dir + s->byte_before_the_zipfile; + if( tellpos != 0 ) + { + if( s->file->Seek( s->pos_in_central_dir + s->byte_before_the_zipfile, FS_SEEK_SET ) != 0 ) + { + err = UNZ_ERRNO; + } + if( tellpos < 0 ) + { + zip_seeksForward.SetInteger( zip_seeksForward.GetInteger() + 1 ); + } + else + { + zip_seeksBackward.SetInteger( zip_seeksBackward.GetInteger() + 1 ); + } + + static long zip_totalSeekSize = 0; + if( zip_numSeeks.GetInteger() == 0 ) + { + zip_totalSeekSize = 0; + } + zip_totalSeekSize += abs( tellpos ); + + zip_numSeeks.SetInteger( zip_numSeeks.GetInteger() + 1 ); + zip_avgSeekDistance.SetInteger( zip_totalSeekSize / zip_numSeeks.GetInteger() ); + } + else + { + zip_skippedSeeks.SetInteger( zip_skippedSeeks.GetInteger() + 1 ); + } + // DG end +#else + if (ZSEEK64(s->z_filefunc, s->filestream, + s->pos_in_central_dir+s->byte_before_the_zipfile, + ZLIB_FILEFUNC_SEEK_SET)!=0) + err=UNZ_ERRNO; +#endif + + /* we check the magic */ + if (err==UNZ_OK) + { + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK) + err=UNZ_ERRNO; + else if (uMagic!=0x02014b50) + err=UNZ_BADZIPFILE; + } + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.version) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.version_needed) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.flag) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.compression_method) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getLong(&s->z_filefunc, s->filestream,&file_info.dosDate) != UNZ_OK) + err=UNZ_ERRNO; + + unz64local_DosDateToTmuDate(file_info.dosDate,&file_info.tmu_date); + + if (unz64local_getLong(&s->z_filefunc, s->filestream,&file_info.crc) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK) + err=UNZ_ERRNO; + file_info.compressed_size = uL; + + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK) + err=UNZ_ERRNO; + file_info.uncompressed_size = uL; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.size_filename) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_extra) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_comment) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.disk_num_start) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.internal_fa) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getLong(&s->z_filefunc, s->filestream,&file_info.external_fa) != UNZ_OK) + err=UNZ_ERRNO; + + // relative offset of local header + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK) + err=UNZ_ERRNO; + file_info_internal.offset_curfile = uL; + + lSeek+=file_info.size_filename; + if ((err==UNZ_OK) && (szFileName!=NULL)) + { + uLong uSizeRead ; + if (file_info.size_filename0) && (fileNameBufferSize>0)) + if (ZREAD64(s->z_filefunc, s->filestream,szFileName,uSizeRead)!=uSizeRead) + err=UNZ_ERRNO; + lSeek -= uSizeRead; + } + + // Read extrafield + if ((err==UNZ_OK) && (extraField!=NULL)) + { + ZPOS64_T uSizeRead ; + if (file_info.size_file_extraz_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0) + lSeek=0; + else + err=UNZ_ERRNO; + } + + if ((file_info.size_file_extra>0) && (extraFieldBufferSize>0)) + if (ZREAD64(s->z_filefunc, s->filestream,extraField,(uLong)uSizeRead)!=uSizeRead) + err=UNZ_ERRNO; + + lSeek += file_info.size_file_extra - (uLong)uSizeRead; + } + else + lSeek += file_info.size_file_extra; + + + if ((err==UNZ_OK) && (file_info.size_file_extra != 0)) + { + uLong acc = 0; + + // since lSeek now points to after the extra field we need to move back + lSeek -= file_info.size_file_extra; + + if (lSeek!=0) + { + if (ZSEEK64(s->z_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0) + lSeek=0; + else + err=UNZ_ERRNO; + } + + while(acc < file_info.size_file_extra) + { + uLong headerId; + uLong dataSize; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&headerId) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&dataSize) != UNZ_OK) + err=UNZ_ERRNO; + + /* ZIP64 extra fields */ + if (headerId == 0x0001) + { + uLong uL; + + if(file_info.uncompressed_size == MAXU32) + { + if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info.uncompressed_size) != UNZ_OK) + err=UNZ_ERRNO; + } + + if(file_info.compressed_size == MAXU32) + { + if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info.compressed_size) != UNZ_OK) + err=UNZ_ERRNO; + } + + if(file_info_internal.offset_curfile == MAXU32) + { + /* Relative Header offset */ + if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info_internal.offset_curfile) != UNZ_OK) + err=UNZ_ERRNO; + } + + if(file_info.disk_num_start == MAXU32) + { + /* Disk Start Number */ + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK) + err=UNZ_ERRNO; + } + + } + else + { + if (ZSEEK64(s->z_filefunc, s->filestream,dataSize,ZLIB_FILEFUNC_SEEK_CUR)!=0) + err=UNZ_ERRNO; + } + + acc += 2 + 2 + dataSize; + } + } + + if ((err==UNZ_OK) && (szComment!=NULL)) + { + uLong uSizeRead ; + if (file_info.size_file_commentz_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0) + lSeek=0; + else + err=UNZ_ERRNO; + } + + if ((file_info.size_file_comment>0) && (commentBufferSize>0)) + if (ZREAD64(s->z_filefunc, s->filestream,szComment,uSizeRead)!=uSizeRead) + err=UNZ_ERRNO; + lSeek+=file_info.size_file_comment - uSizeRead; + } + else + lSeek+=file_info.size_file_comment; + + + if ((err==UNZ_OK) && (pfile_info!=NULL)) + *pfile_info=file_info; + + if ((err==UNZ_OK) && (pfile_info_internal!=NULL)) + *pfile_info_internal=file_info_internal; + + return err; +} + + + +/* + Write info about the ZipFile in the *pglobal_info structure. + No preparation of the structure is needed + return UNZ_OK if there is no problem. +*/ +extern int ZEXPORT unzGetCurrentFileInfo64 (unzFile file, + unz_file_info64 * pfile_info, + char * szFileName, uLong fileNameBufferSize, + void *extraField, uLong extraFieldBufferSize, + char* szComment, uLong commentBufferSize) +{ + return unz64local_GetCurrentFileInfoInternal(file,pfile_info,NULL, + szFileName,fileNameBufferSize, + extraField,extraFieldBufferSize, + szComment,commentBufferSize); +} + +extern int ZEXPORT unzGetCurrentFileInfo (unzFile file, + unz_file_info * pfile_info, + char * szFileName, uLong fileNameBufferSize, + void *extraField, uLong extraFieldBufferSize, + char* szComment, uLong commentBufferSize) +{ + int err; + unz_file_info64 file_info64; + err = unz64local_GetCurrentFileInfoInternal(file,&file_info64,NULL, + szFileName,fileNameBufferSize, + extraField,extraFieldBufferSize, + szComment,commentBufferSize); + if ((err==UNZ_OK) && (pfile_info != NULL)) + { + pfile_info->version = file_info64.version; + pfile_info->version_needed = file_info64.version_needed; + pfile_info->flag = file_info64.flag; + pfile_info->compression_method = file_info64.compression_method; + pfile_info->dosDate = file_info64.dosDate; + pfile_info->crc = file_info64.crc; + + pfile_info->size_filename = file_info64.size_filename; + pfile_info->size_file_extra = file_info64.size_file_extra; + pfile_info->size_file_comment = file_info64.size_file_comment; + + pfile_info->disk_num_start = file_info64.disk_num_start; + pfile_info->internal_fa = file_info64.internal_fa; + pfile_info->external_fa = file_info64.external_fa; + + pfile_info->tmu_date = file_info64.tmu_date, + + + pfile_info->compressed_size = (uLong)file_info64.compressed_size; + pfile_info->uncompressed_size = (uLong)file_info64.uncompressed_size; + + } + return err; +} +/* + Set the current file of the zipfile to the first file. + return UNZ_OK if there is no problem +*/ +extern int ZEXPORT unzGoToFirstFile (unzFile file) +{ + int err=UNZ_OK; + unz64_s* s; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + s->pos_in_central_dir=s->offset_central_dir; + s->num_file=0; + err=unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info, + &s->cur_file_info_internal, + NULL,0,NULL,0,NULL,0); + s->current_file_ok = (err == UNZ_OK); + return err; +} + +/* + Set the current file of the zipfile to the next file. + return UNZ_OK if there is no problem + return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. +*/ +extern int ZEXPORT unzGoToNextFile (unzFile file) +{ + unz64_s* s; + int err; + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + if (!s->current_file_ok) + return UNZ_END_OF_LIST_OF_FILE; + if (s->gi.number_entry != 0xffff) /* 2^16 files overflow hack */ + if (s->num_file+1==s->gi.number_entry) + return UNZ_END_OF_LIST_OF_FILE; + + s->pos_in_central_dir += SIZECENTRALDIRITEM + s->cur_file_info.size_filename + + s->cur_file_info.size_file_extra + s->cur_file_info.size_file_comment ; + s->num_file++; + err = unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info, + &s->cur_file_info_internal, + NULL,0,NULL,0,NULL,0); + s->current_file_ok = (err == UNZ_OK); + return err; +} + + +/* + Try locate the file szFileName in the zipfile. + For the iCaseSensitivity signification, see unzipStringFileNameCompare + + return value : + UNZ_OK if the file is found. It becomes the current file. + UNZ_END_OF_LIST_OF_FILE if the file is not found +*/ +extern int ZEXPORT unzLocateFile (unzFile file, const char *szFileName, int iCaseSensitivity) +{ + unz64_s* s; + int err; + + /* We remember the 'current' position in the file so that we can jump + * back there if we fail. + */ + unz_file_info64 cur_file_infoSaved; + unz_file_info64_internal cur_file_info_internalSaved; + ZPOS64_T num_fileSaved; + ZPOS64_T pos_in_central_dirSaved; + + + if (file==NULL) + return UNZ_PARAMERROR; + + if (strlen(szFileName)>=UNZ_MAXFILENAMEINZIP) + return UNZ_PARAMERROR; + + s=(unz64_s*)file; + if (!s->current_file_ok) + return UNZ_END_OF_LIST_OF_FILE; + + /* Save the current state */ + num_fileSaved = s->num_file; + pos_in_central_dirSaved = s->pos_in_central_dir; + cur_file_infoSaved = s->cur_file_info; + cur_file_info_internalSaved = s->cur_file_info_internal; + + err = unzGoToFirstFile(file); + + while (err == UNZ_OK) + { + char szCurrentFileName[UNZ_MAXFILENAMEINZIP+1]; + err = unzGetCurrentFileInfo64(file,NULL, + szCurrentFileName,sizeof(szCurrentFileName)-1, + NULL,0,NULL,0); + if (err == UNZ_OK) + { + if (unzStringFileNameCompare(szCurrentFileName, + szFileName,iCaseSensitivity)==0) + return UNZ_OK; + err = unzGoToNextFile(file); + } + } + + /* We failed, so restore the state of the 'current file' to where we + * were. + */ + s->num_file = num_fileSaved ; + s->pos_in_central_dir = pos_in_central_dirSaved ; + s->cur_file_info = cur_file_infoSaved; + s->cur_file_info_internal = cur_file_info_internalSaved; + return err; +} + + +/* +/////////////////////////////////////////// +// Contributed by Ryan Haksi (mailto://cryogen@infoserve.net) +// I need random access +// +// Further optimization could be realized by adding an ability +// to cache the directory in memory. The goal being a single +// comprehensive file read to put the file I need in a memory. +*/ + +/* +typedef struct unz_file_pos_s +{ + ZPOS64_T pos_in_zip_directory; // offset in file + ZPOS64_T num_of_file; // # of file +} unz_file_pos; +*/ + +extern int ZEXPORT unzGetFilePos64(unzFile file, unz64_file_pos* file_pos) +{ + unz64_s* s; + + if (file==NULL || file_pos==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + if (!s->current_file_ok) + return UNZ_END_OF_LIST_OF_FILE; + + file_pos->pos_in_zip_directory = s->pos_in_central_dir; + file_pos->num_of_file = s->num_file; + + return UNZ_OK; +} + +extern int ZEXPORT unzGetFilePos( + unzFile file, + unz_file_pos* file_pos) +{ + unz64_file_pos file_pos64; + int err = unzGetFilePos64(file,&file_pos64); + if (err==UNZ_OK) + { + file_pos->pos_in_zip_directory = (uLong)file_pos64.pos_in_zip_directory; + file_pos->num_of_file = (uLong)file_pos64.num_of_file; + } + return err; +} + +extern int ZEXPORT unzGoToFilePos64(unzFile file, const unz64_file_pos* file_pos) +{ + unz64_s* s; + int err; + + if (file==NULL || file_pos==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + + /* jump to the right spot */ + s->pos_in_central_dir = file_pos->pos_in_zip_directory; + s->num_file = file_pos->num_of_file; + + /* set the current file */ + err = unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info, + &s->cur_file_info_internal, + NULL,0,NULL,0,NULL,0); + /* return results */ + s->current_file_ok = (err == UNZ_OK); + return err; +} + +extern int ZEXPORT unzGoToFilePos( + unzFile file, + unz_file_pos* file_pos) +{ + unz64_file_pos file_pos64; + if (file_pos == NULL) + return UNZ_PARAMERROR; + + file_pos64.pos_in_zip_directory = file_pos->pos_in_zip_directory; + file_pos64.num_of_file = file_pos->num_of_file; + return unzGoToFilePos64(file,&file_pos64); +} + +/* +// Unzip Helper Functions - should be here? +/////////////////////////////////////////// +*/ + +/* + Read the local header of the current zipfile + Check the coherency of the local header and info in the end of central + directory about this file + store in *piSizeVar the size of extra info in local header + (filename and size of extra field data) +*/ +local int unz64local_CheckCurrentFileCoherencyHeader (unz64_s* s, uInt* piSizeVar, + ZPOS64_T * poffset_local_extrafield, + uInt * psize_local_extrafield) +{ + uLong uMagic,uData,uFlags; + uLong size_filename; + uLong size_extra_field; + int err=UNZ_OK; + + *piSizeVar = 0; + *poffset_local_extrafield = 0; + *psize_local_extrafield = 0; + + if (ZSEEK64(s->z_filefunc, s->filestream,s->cur_file_info_internal.offset_curfile + + s->byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET)!=0) + return UNZ_ERRNO; + + + if (err==UNZ_OK) + { + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK) + err=UNZ_ERRNO; + else if (uMagic!=0x04034b50) + err=UNZ_BADZIPFILE; + } + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) + err=UNZ_ERRNO; +/* + else if ((err==UNZ_OK) && (uData!=s->cur_file_info.wVersion)) + err=UNZ_BADZIPFILE; +*/ + if (unz64local_getShort(&s->z_filefunc, s->filestream,&uFlags) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) + err=UNZ_ERRNO; + else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compression_method)) + err=UNZ_BADZIPFILE; + + if ((err==UNZ_OK) && (s->cur_file_info.compression_method!=0) && +/* #ifdef HAVE_BZIP2 */ + (s->cur_file_info.compression_method!=Z_BZIP2ED) && +/* #endif */ + (s->cur_file_info.compression_method!=Z_DEFLATED)) + err=UNZ_BADZIPFILE; + + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* date/time */ + err=UNZ_ERRNO; + + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* crc */ + err=UNZ_ERRNO; + else if ((err==UNZ_OK) && (uData!=s->cur_file_info.crc) && ((uFlags & 8)==0)) + err=UNZ_BADZIPFILE; + + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size compr */ + err=UNZ_ERRNO; + else if (uData != 0xFFFFFFFF && (err==UNZ_OK) && (uData!=s->cur_file_info.compressed_size) && ((uFlags & 8)==0)) + err=UNZ_BADZIPFILE; + + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size uncompr */ + err=UNZ_ERRNO; + else if (uData != 0xFFFFFFFF && (err==UNZ_OK) && (uData!=s->cur_file_info.uncompressed_size) && ((uFlags & 8)==0)) + err=UNZ_BADZIPFILE; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&size_filename) != UNZ_OK) + err=UNZ_ERRNO; + else if ((err==UNZ_OK) && (size_filename!=s->cur_file_info.size_filename)) + err=UNZ_BADZIPFILE; + + *piSizeVar += (uInt)size_filename; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&size_extra_field) != UNZ_OK) + err=UNZ_ERRNO; + *poffset_local_extrafield= s->cur_file_info_internal.offset_curfile + + SIZEZIPLOCALHEADER + size_filename; + *psize_local_extrafield = (uInt)size_extra_field; + + *piSizeVar += (uInt)size_extra_field; + + return err; +} + +/* + Open for reading data the current file in the zipfile. + If there is no error and the file is opened, the return value is UNZ_OK. +*/ +extern int ZEXPORT unzOpenCurrentFile3 (unzFile file, int* method, + int* level, int raw, const char* password) +{ + int err=UNZ_OK; + uInt iSizeVar; + unz64_s* s; + file_in_zip64_read_info_s* pfile_in_zip_read_info; + ZPOS64_T offset_local_extrafield; /* offset of the local extra field */ + uInt size_local_extrafield; /* size of the local extra field */ +# ifndef NOUNCRYPT + char source[12]; +# else + if (password != NULL) + return UNZ_PARAMERROR; +# endif + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + if (!s->current_file_ok) + return UNZ_PARAMERROR; + + if (s->pfile_in_zip_read != NULL) + unzCloseCurrentFile(file); + + if (unz64local_CheckCurrentFileCoherencyHeader(s,&iSizeVar, &offset_local_extrafield,&size_local_extrafield)!=UNZ_OK) + return UNZ_BADZIPFILE; + + pfile_in_zip_read_info = (file_in_zip64_read_info_s*)ALLOC(sizeof(file_in_zip64_read_info_s)); + if (pfile_in_zip_read_info==NULL) + return UNZ_INTERNALERROR; + + pfile_in_zip_read_info->read_buffer=(char*)ALLOC(UNZ_BUFSIZE); + pfile_in_zip_read_info->offset_local_extrafield = offset_local_extrafield; + pfile_in_zip_read_info->size_local_extrafield = size_local_extrafield; + pfile_in_zip_read_info->pos_local_extrafield=0; + pfile_in_zip_read_info->raw=raw; + + if (pfile_in_zip_read_info->read_buffer==NULL) + { + TRYFREE(pfile_in_zip_read_info); + return UNZ_INTERNALERROR; + } + + pfile_in_zip_read_info->stream_initialised=0; + + if (method!=NULL) + *method = (int)s->cur_file_info.compression_method; + + if (level!=NULL) + { + *level = 6; + switch (s->cur_file_info.flag & 0x06) + { + case 6 : *level = 1; break; + case 4 : *level = 2; break; + case 2 : *level = 9; break; + } + } + + if ((s->cur_file_info.compression_method!=0) && +/* #ifdef HAVE_BZIP2 */ + (s->cur_file_info.compression_method!=Z_BZIP2ED) && +/* #endif */ + (s->cur_file_info.compression_method!=Z_DEFLATED)) + + err=UNZ_BADZIPFILE; + + pfile_in_zip_read_info->crc32_wait=s->cur_file_info.crc; + pfile_in_zip_read_info->crc32=0; + pfile_in_zip_read_info->total_out_64=0; + pfile_in_zip_read_info->compression_method = s->cur_file_info.compression_method; + pfile_in_zip_read_info->filestream=s->filestream; + pfile_in_zip_read_info->z_filefunc=s->z_filefunc; + pfile_in_zip_read_info->byte_before_the_zipfile=s->byte_before_the_zipfile; + + pfile_in_zip_read_info->stream.total_out = 0; + + if ((s->cur_file_info.compression_method==Z_BZIP2ED) && (!raw)) + { +#ifdef HAVE_BZIP2 + pfile_in_zip_read_info->bstream.bzalloc = (void *(*) (void *, int, int))0; + pfile_in_zip_read_info->bstream.bzfree = (free_func)0; + pfile_in_zip_read_info->bstream.opaque = (voidpf)0; + pfile_in_zip_read_info->bstream.state = (voidpf)0; + + pfile_in_zip_read_info->stream.zalloc = (alloc_func)0; + pfile_in_zip_read_info->stream.zfree = (free_func)0; + pfile_in_zip_read_info->stream.opaque = (voidpf)0; + pfile_in_zip_read_info->stream.next_in = (voidpf)0; + pfile_in_zip_read_info->stream.avail_in = 0; + + err=BZ2_bzDecompressInit(&pfile_in_zip_read_info->bstream, 0, 0); + if (err == Z_OK) + pfile_in_zip_read_info->stream_initialised=Z_BZIP2ED; + else + { + TRYFREE(pfile_in_zip_read_info); + return err; + } +#else + pfile_in_zip_read_info->raw=1; +#endif + } + else if ((s->cur_file_info.compression_method==Z_DEFLATED) && (!raw)) + { + pfile_in_zip_read_info->stream.zalloc = (alloc_func)0; + pfile_in_zip_read_info->stream.zfree = (free_func)0; + pfile_in_zip_read_info->stream.opaque = (voidpf)0; + pfile_in_zip_read_info->stream.next_in = 0; + pfile_in_zip_read_info->stream.avail_in = 0; + + err=inflateInit2(&pfile_in_zip_read_info->stream, -MAX_WBITS); + if (err == Z_OK) + pfile_in_zip_read_info->stream_initialised=Z_DEFLATED; + else + { + TRYFREE(pfile_in_zip_read_info); + return err; + } + /* windowBits is passed < 0 to tell that there is no zlib header. + * Note that in this case inflate *requires* an extra "dummy" byte + * after the compressed stream in order to complete decompression and + * return Z_STREAM_END. + * In unzip, i don't wait absolutely Z_STREAM_END because I known the + * size of both compressed and uncompressed data + */ + } + pfile_in_zip_read_info->rest_read_compressed = + s->cur_file_info.compressed_size ; + pfile_in_zip_read_info->rest_read_uncompressed = + s->cur_file_info.uncompressed_size ; + + + pfile_in_zip_read_info->pos_in_zipfile = + s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER + + iSizeVar; + + pfile_in_zip_read_info->stream.avail_in = (uInt)0; + + s->pfile_in_zip_read = pfile_in_zip_read_info; + s->encrypted = 0; + +# ifndef NOUNCRYPT + if (password != NULL) + { + int i; + s->pcrc_32_tab = get_crc_table(); + init_keys(password,s->keys,s->pcrc_32_tab); + if (ZSEEK64(s->z_filefunc, s->filestream, + s->pfile_in_zip_read->pos_in_zipfile + + s->pfile_in_zip_read->byte_before_the_zipfile, + SEEK_SET)!=0) + return UNZ_INTERNALERROR; + if(ZREAD64(s->z_filefunc, s->filestream,source, 12)<12) + return UNZ_INTERNALERROR; + + for (i = 0; i<12; i++) + zdecode(s->keys,s->pcrc_32_tab,source[i]); + + s->pfile_in_zip_read->pos_in_zipfile+=12; + s->encrypted=1; + } +# endif + + + return UNZ_OK; +} + +extern int ZEXPORT unzOpenCurrentFile (unzFile file) +{ + return unzOpenCurrentFile3(file, NULL, NULL, 0, NULL); +} + +extern int ZEXPORT unzOpenCurrentFilePassword (unzFile file, const char* password) +{ + return unzOpenCurrentFile3(file, NULL, NULL, 0, password); +} + +extern int ZEXPORT unzOpenCurrentFile2 (unzFile file, int* method, int* level, int raw) +{ + return unzOpenCurrentFile3(file, method, level, raw, NULL); +} + +/** Addition for GDAL : START */ + +extern ZPOS64_T ZEXPORT unzGetCurrentFileZStreamPos64( unzFile file) +{ + unz64_s* s; + file_in_zip64_read_info_s* pfile_in_zip_read_info; + s=(unz64_s*)file; + if (file==NULL) + return 0; //UNZ_PARAMERROR; + pfile_in_zip_read_info=s->pfile_in_zip_read; + if (pfile_in_zip_read_info==NULL) + return 0; //UNZ_PARAMERROR; + return pfile_in_zip_read_info->pos_in_zipfile + + pfile_in_zip_read_info->byte_before_the_zipfile; +} + +/** Addition for GDAL : END */ + +/* + Read bytes from the current file. + buf contain buffer where data must be copied + len the size of buf. + + return the number of byte copied if somes bytes are copied + return 0 if the end of file was reached + return <0 with error code if there is an error + (UNZ_ERRNO for IO error, or zLib error for uncompress error) +*/ +extern int ZEXPORT unzReadCurrentFile (unzFile file, voidp buf, unsigned len) +{ + int err=UNZ_OK; + uInt iRead = 0; + unz64_s* s; + file_in_zip64_read_info_s* pfile_in_zip_read_info; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + + if (pfile_in_zip_read_info->read_buffer == NULL) + return UNZ_END_OF_LIST_OF_FILE; + if (len==0) + return 0; + + pfile_in_zip_read_info->stream.next_out = (Bytef*)buf; + + pfile_in_zip_read_info->stream.avail_out = (uInt)len; + + if ((len>pfile_in_zip_read_info->rest_read_uncompressed) && + (!(pfile_in_zip_read_info->raw))) + pfile_in_zip_read_info->stream.avail_out = + (uInt)pfile_in_zip_read_info->rest_read_uncompressed; + + if ((len>pfile_in_zip_read_info->rest_read_compressed+ + pfile_in_zip_read_info->stream.avail_in) && + (pfile_in_zip_read_info->raw)) + pfile_in_zip_read_info->stream.avail_out = + (uInt)pfile_in_zip_read_info->rest_read_compressed+ + pfile_in_zip_read_info->stream.avail_in; + + while (pfile_in_zip_read_info->stream.avail_out>0) + { + if ((pfile_in_zip_read_info->stream.avail_in==0) && + (pfile_in_zip_read_info->rest_read_compressed>0)) + { + uInt uReadThis = UNZ_BUFSIZE; + if (pfile_in_zip_read_info->rest_read_compressedrest_read_compressed; + if (uReadThis == 0) + return UNZ_EOF; + // TODO: the following line was added by id Software to the original src - seems to work without it, + // but if problems occur look here.. + // if(s->cur_file_info.compressed_size == pfile_in_zip_read_info->rest_read_compressed) + if (ZSEEK64(pfile_in_zip_read_info->z_filefunc, + pfile_in_zip_read_info->filestream, + pfile_in_zip_read_info->pos_in_zipfile + + pfile_in_zip_read_info->byte_before_the_zipfile, + ZLIB_FILEFUNC_SEEK_SET)!=0) + return UNZ_ERRNO; + if (ZREAD64(pfile_in_zip_read_info->z_filefunc, + pfile_in_zip_read_info->filestream, + pfile_in_zip_read_info->read_buffer, + uReadThis)!=uReadThis) + return UNZ_ERRNO; + + +# ifndef NOUNCRYPT + if(s->encrypted) + { + uInt i; + for(i=0;iread_buffer[i] = + zdecode(s->keys,s->pcrc_32_tab, + pfile_in_zip_read_info->read_buffer[i]); + } +# endif + + + pfile_in_zip_read_info->pos_in_zipfile += uReadThis; + + pfile_in_zip_read_info->rest_read_compressed-=uReadThis; + + pfile_in_zip_read_info->stream.next_in = + (Bytef*)pfile_in_zip_read_info->read_buffer; + pfile_in_zip_read_info->stream.avail_in = (uInt)uReadThis; + } + + if ((pfile_in_zip_read_info->compression_method==0) || (pfile_in_zip_read_info->raw)) + { + uInt uDoCopy,i ; + + if ((pfile_in_zip_read_info->stream.avail_in == 0) && + (pfile_in_zip_read_info->rest_read_compressed == 0)) + return (iRead==0) ? UNZ_EOF : iRead; + + if (pfile_in_zip_read_info->stream.avail_out < + pfile_in_zip_read_info->stream.avail_in) + uDoCopy = pfile_in_zip_read_info->stream.avail_out ; + else + uDoCopy = pfile_in_zip_read_info->stream.avail_in ; + + for (i=0;istream.next_out+i) = + *(pfile_in_zip_read_info->stream.next_in+i); + + pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total_out_64 + uDoCopy; + + pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32, + pfile_in_zip_read_info->stream.next_out, + uDoCopy); + pfile_in_zip_read_info->rest_read_uncompressed-=uDoCopy; + pfile_in_zip_read_info->stream.avail_in -= uDoCopy; + pfile_in_zip_read_info->stream.avail_out -= uDoCopy; + pfile_in_zip_read_info->stream.next_out += uDoCopy; + pfile_in_zip_read_info->stream.next_in += uDoCopy; + pfile_in_zip_read_info->stream.total_out += uDoCopy; + iRead += uDoCopy; + } + else if (pfile_in_zip_read_info->compression_method==Z_BZIP2ED) + { +#ifdef HAVE_BZIP2 + uLong uTotalOutBefore,uTotalOutAfter; + const Bytef *bufBefore; + uLong uOutThis; + + pfile_in_zip_read_info->bstream.next_in = (char*)pfile_in_zip_read_info->stream.next_in; + pfile_in_zip_read_info->bstream.avail_in = pfile_in_zip_read_info->stream.avail_in; + pfile_in_zip_read_info->bstream.total_in_lo32 = pfile_in_zip_read_info->stream.total_in; + pfile_in_zip_read_info->bstream.total_in_hi32 = 0; + pfile_in_zip_read_info->bstream.next_out = (char*)pfile_in_zip_read_info->stream.next_out; + pfile_in_zip_read_info->bstream.avail_out = pfile_in_zip_read_info->stream.avail_out; + pfile_in_zip_read_info->bstream.total_out_lo32 = pfile_in_zip_read_info->stream.total_out; + pfile_in_zip_read_info->bstream.total_out_hi32 = 0; + + uTotalOutBefore = pfile_in_zip_read_info->bstream.total_out_lo32; + bufBefore = (const Bytef *)pfile_in_zip_read_info->bstream.next_out; + + err=BZ2_bzDecompress(&pfile_in_zip_read_info->bstream); + + uTotalOutAfter = pfile_in_zip_read_info->bstream.total_out_lo32; + uOutThis = uTotalOutAfter-uTotalOutBefore; + + pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total_out_64 + uOutThis; + + pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32,bufBefore, (uInt)(uOutThis)); + pfile_in_zip_read_info->rest_read_uncompressed -= uOutThis; + iRead += (uInt)(uTotalOutAfter - uTotalOutBefore); + + pfile_in_zip_read_info->stream.next_in = (Bytef*)pfile_in_zip_read_info->bstream.next_in; + pfile_in_zip_read_info->stream.avail_in = pfile_in_zip_read_info->bstream.avail_in; + pfile_in_zip_read_info->stream.total_in = pfile_in_zip_read_info->bstream.total_in_lo32; + pfile_in_zip_read_info->stream.next_out = (Bytef*)pfile_in_zip_read_info->bstream.next_out; + pfile_in_zip_read_info->stream.avail_out = pfile_in_zip_read_info->bstream.avail_out; + pfile_in_zip_read_info->stream.total_out = pfile_in_zip_read_info->bstream.total_out_lo32; + + if (err==BZ_STREAM_END) + return (iRead==0) ? UNZ_EOF : iRead; + if (err!=BZ_OK) + break; +#endif + } // end Z_BZIP2ED + else + { + ZPOS64_T uTotalOutBefore,uTotalOutAfter; + const Bytef *bufBefore; + ZPOS64_T uOutThis; + int flush=Z_SYNC_FLUSH; + + uTotalOutBefore = pfile_in_zip_read_info->stream.total_out; + bufBefore = pfile_in_zip_read_info->stream.next_out; + + /* + if ((pfile_in_zip_read_info->rest_read_uncompressed == + pfile_in_zip_read_info->stream.avail_out) && + (pfile_in_zip_read_info->rest_read_compressed == 0)) + flush = Z_FINISH; + */ + err=inflate(&pfile_in_zip_read_info->stream,flush); + + if ((err>=0) && (pfile_in_zip_read_info->stream.msg!=NULL)) + err = Z_DATA_ERROR; + + uTotalOutAfter = pfile_in_zip_read_info->stream.total_out; + uOutThis = uTotalOutAfter-uTotalOutBefore; + + pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total_out_64 + uOutThis; + + pfile_in_zip_read_info->crc32 = + crc32(pfile_in_zip_read_info->crc32,bufBefore, + (uInt)(uOutThis)); + + pfile_in_zip_read_info->rest_read_uncompressed -= + uOutThis; + + iRead += (uInt)(uTotalOutAfter - uTotalOutBefore); + + if (err==Z_STREAM_END) + return (iRead==0) ? UNZ_EOF : iRead; + if (err!=Z_OK) + break; + } + } + + if (err==Z_OK) + return iRead; + return err; +} + + +/* + Give the current position in uncompressed data +*/ +extern z_off_t ZEXPORT unztell (unzFile file) +{ + unz64_s* s; + file_in_zip64_read_info_s* pfile_in_zip_read_info; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + return (z_off_t)pfile_in_zip_read_info->stream.total_out; +} + +extern ZPOS64_T ZEXPORT unztell64 (unzFile file) +{ + + unz64_s* s; + file_in_zip64_read_info_s* pfile_in_zip_read_info; + if (file==NULL) + return (ZPOS64_T)-1; + s=(unz64_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return (ZPOS64_T)-1; + + return pfile_in_zip_read_info->total_out_64; +} + + +/* + return 1 if the end of file was reached, 0 elsewhere +*/ +extern int ZEXPORT unzeof (unzFile file) +{ + unz64_s* s; + file_in_zip64_read_info_s* pfile_in_zip_read_info; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + if (pfile_in_zip_read_info->rest_read_uncompressed == 0) + return 1; + else + return 0; +} + + + +/* +Read extra field from the current file (opened by unzOpenCurrentFile) +This is the local-header version of the extra field (sometimes, there is +more info in the local-header version than in the central-header) + + if buf==NULL, it return the size of the local extra field that can be read + + if buf!=NULL, len is the size of the buffer, the extra header is copied in + buf. + the return value is the number of bytes copied in buf, or (if <0) + the error code +*/ +extern int ZEXPORT unzGetLocalExtrafield (unzFile file, voidp buf, unsigned len) +{ + unz64_s* s; + file_in_zip64_read_info_s* pfile_in_zip_read_info; + uInt read_now; + ZPOS64_T size_to_read; + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + size_to_read = (pfile_in_zip_read_info->size_local_extrafield - + pfile_in_zip_read_info->pos_local_extrafield); + + if (buf==NULL) + return (int)size_to_read; + + if (len>size_to_read) + read_now = (uInt)size_to_read; + else + read_now = (uInt)len ; + + if (read_now==0) + return 0; + + if (ZSEEK64(pfile_in_zip_read_info->z_filefunc, + pfile_in_zip_read_info->filestream, + pfile_in_zip_read_info->offset_local_extrafield + + pfile_in_zip_read_info->pos_local_extrafield, + ZLIB_FILEFUNC_SEEK_SET)!=0) + return UNZ_ERRNO; + + if (ZREAD64(pfile_in_zip_read_info->z_filefunc, + pfile_in_zip_read_info->filestream, + buf,read_now)!=read_now) + return UNZ_ERRNO; + + return (int)read_now; +} + +/* + Close the file in zip opened with unzipOpenCurrentFile + Return UNZ_CRCERROR if all the file was read but the CRC is not good +*/ +extern int ZEXPORT unzCloseCurrentFile (unzFile file) +{ + int err=UNZ_OK; + + unz64_s* s; + file_in_zip64_read_info_s* pfile_in_zip_read_info; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + + if ((pfile_in_zip_read_info->rest_read_uncompressed == 0) && + (!pfile_in_zip_read_info->raw)) + { + if (pfile_in_zip_read_info->crc32 != pfile_in_zip_read_info->crc32_wait) + err=UNZ_CRCERROR; + } + + + TRYFREE(pfile_in_zip_read_info->read_buffer); + pfile_in_zip_read_info->read_buffer = NULL; + if (pfile_in_zip_read_info->stream_initialised == Z_DEFLATED) + inflateEnd(&pfile_in_zip_read_info->stream); +#ifdef HAVE_BZIP2 + else if (pfile_in_zip_read_info->stream_initialised == Z_BZIP2ED) + BZ2_bzDecompressEnd(&pfile_in_zip_read_info->bstream); +#endif + + + pfile_in_zip_read_info->stream_initialised = 0; + TRYFREE(pfile_in_zip_read_info); + + s->pfile_in_zip_read=NULL; + + return err; +} + + +/* + Get the global comment string of the ZipFile, in the szComment buffer. + uSizeBuf is the size of the szComment buffer. + return the number of byte copied or an error code <0 +*/ +extern int ZEXPORT unzGetGlobalComment (unzFile file, char * szComment, uLong uSizeBuf) +{ + unz64_s* s; + uLong uReadThis ; + if (file==NULL) + return (int)UNZ_PARAMERROR; + s=(unz64_s*)file; + + uReadThis = uSizeBuf; + if (uReadThis>s->gi.size_comment) + uReadThis = s->gi.size_comment; + + if (ZSEEK64(s->z_filefunc,s->filestream,s->central_pos+22,ZLIB_FILEFUNC_SEEK_SET)!=0) + return UNZ_ERRNO; + + if (uReadThis>0) + { + *szComment='\0'; + if (ZREAD64(s->z_filefunc,s->filestream,szComment,uReadThis)!=uReadThis) + return UNZ_ERRNO; + } + + if ((szComment != NULL) && (uSizeBuf > s->gi.size_comment)) + *(szComment+s->gi.size_comment)='\0'; + return (int)uReadThis; +} + +/* Additions by RX '2004 */ +extern ZPOS64_T ZEXPORT unzGetOffset64(unzFile file) +{ + unz64_s* s; + + if (file==NULL) + return 0; //UNZ_PARAMERROR; + s=(unz64_s*)file; + if (!s->current_file_ok) + return 0; + if (s->gi.number_entry != 0 && s->gi.number_entry != 0xffff) + if (s->num_file==s->gi.number_entry) + return 0; + return s->pos_in_central_dir; +} + +extern uLong ZEXPORT unzGetOffset (unzFile file) +{ + ZPOS64_T offset64; + + if (file==NULL) + return 0; //UNZ_PARAMERROR; + offset64 = unzGetOffset64(file); + return (uLong)offset64; +} + +extern int ZEXPORT unzSetOffset64(unzFile file, ZPOS64_T pos) +{ + unz64_s* s; + int err; + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + + s->pos_in_central_dir = pos; + s->num_file = s->gi.number_entry; /* hack */ + err = unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info, + &s->cur_file_info_internal, + NULL,0,NULL,0,NULL,0); + s->current_file_ok = (err == UNZ_OK); + return err; +} + +extern int ZEXPORT unzSetOffset (unzFile file, uLong pos) +{ + return unzSetOffset64(file,pos); +} + + +// #################################################################### +// the following function was added for doom3 by id Software and +// adjusted for MiniZip 1.1 by Daniel Gibson + + +extern unzFile unzReOpen (const char* path, unzFile file) +{ + unz64_s* s; + unz64_s* zFile = (unz64_s*)file; + + if(zFile == NULL) + return NULL; + + // create unz64_s* "s" as clone of "file" + s=(unz64_s*)ALLOC(sizeof(unz64_s)); + if(s == NULL) + return NULL; + + memcpy(s, zFile, sizeof(unz64_s)); + + // create new filestream for path + voidp fin = ZOPEN64(s->z_filefunc, + path, + ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_EXISTING); + + if( fin == NULL ) { + TRYFREE(s); + return NULL; + } + + // set that filestream in s + s->filestream = fin; + + unzOpenCurrentFile( s ); + + return (unzFile)s; +} + +/* + * Note from Daniel: + * + * Doom3 BFG had some further changes (probably for performance) that I won't integrate + * right now as they're not needed for functionality: + * + * * uses idFile_Cached instead of FILE + * => in unzOpen and unzReOpen fileSystem->OpenExplicitPakFile( path ); was used + * => fileSystem->CloseFile( fin ); was used to close files + * => fin->Read instead of fread, fin->Tell instead of ftell etc + * ==> all these things can be done with a custom zlib_filefunc_def (or maybe zlib_filefunc64_def) + * + * * at the end of unzOpen: us.file->CacheData( us.offset_central_dir, us.size_central_dir ); + * => this can't be done with a zlib_filefunc_def obviously + * * some CVars (for debugging?) that I put in a #if 0 - block + * * some code in unz64local_GetCurrentFileInfoInternal() that I put into an #if 0 - block + * => aforementioned CVars are only used in this function + */ diff --git a/neo/framework/minizip/unzip.h b/neo/framework/minizip/unzip.h new file mode 100644 index 00000000..728fea62 --- /dev/null +++ b/neo/framework/minizip/unzip.h @@ -0,0 +1,454 @@ +/* + this is from zlib-1.2.7/contrib/minizip/ + + unzip.h -- IO for uncompress .zip files using zlib + Version 1.1, February 14h, 2010 + part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) + + Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) + + Modifications of Unzip for Zip64 + Copyright (C) 2007-2008 Even Rouault + + Modifications for Zip64 support on both zip and unzip + Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) + + For more info read MiniZip_info.txt + + --------------------------------------------------------------------------------- + + Condition of use and distribution are the same than zlib : + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + --------------------------------------------------------------------------------- + + Changes + + See header of unzip64.c + +*/ + +#ifndef _unz64_H +#define _unz64_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef _ZLIB_H +#include "../../libs/zlib/zlib.h" +#endif + +#include "ioapi.h" + +#ifdef HAVE_BZIP2 +#include "bzlib.h" +#endif + +#define Z_BZIP2ED 12 + +#if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP) +/* like the STRICT of WIN32, we define a pointer that cannot be converted + from (void*) without cast */ +typedef struct TagunzFile__ { int unused; } unzFile__; +typedef unzFile__ *unzFile; +#else +typedef voidp unzFile; +#endif + + +#define UNZ_OK (0) +#define UNZ_END_OF_LIST_OF_FILE (-100) +#define UNZ_ERRNO (Z_ERRNO) +#define UNZ_EOF (0) +#define UNZ_PARAMERROR (-102) +#define UNZ_BADZIPFILE (-103) +#define UNZ_INTERNALERROR (-104) +#define UNZ_CRCERROR (-105) + +/* tm_unz contain date/time info */ +typedef struct tm_unz_s +{ + uInt tm_sec; /* seconds after the minute - [0,59] */ + uInt tm_min; /* minutes after the hour - [0,59] */ + uInt tm_hour; /* hours since midnight - [0,23] */ + uInt tm_mday; /* day of the month - [1,31] */ + uInt tm_mon; /* months since January - [0,11] */ + uInt tm_year; /* years - [1980..2044] */ +} tm_unz; + +/* unz_global_info structure contain global data about the ZIPfile + These data comes from the end of central dir */ +typedef struct unz_global_info64_s +{ + ZPOS64_T number_entry; /* total number of entries in + the central dir on this disk */ + uLong size_comment; /* size of the global comment of the zipfile */ +} unz_global_info64; + +typedef struct unz_global_info_s +{ + uLong number_entry; /* total number of entries in + the central dir on this disk */ + uLong size_comment; /* size of the global comment of the zipfile */ +} unz_global_info; + +/* unz_file_info contain information about a file in the zipfile */ +typedef struct unz_file_info64_s +{ + uLong version; /* version made by 2 bytes */ + uLong version_needed; /* version needed to extract 2 bytes */ + uLong flag; /* general purpose bit flag 2 bytes */ + uLong compression_method; /* compression method 2 bytes */ + uLong dosDate; /* last mod file date in Dos fmt 4 bytes */ + uLong crc; /* crc-32 4 bytes */ + ZPOS64_T compressed_size; /* compressed size 8 bytes */ + ZPOS64_T uncompressed_size; /* uncompressed size 8 bytes */ + uLong size_filename; /* filename length 2 bytes */ + uLong size_file_extra; /* extra field length 2 bytes */ + uLong size_file_comment; /* file comment length 2 bytes */ + + uLong disk_num_start; /* disk number start 2 bytes */ + uLong internal_fa; /* internal file attributes 2 bytes */ + uLong external_fa; /* external file attributes 4 bytes */ + + tm_unz tmu_date; +} unz_file_info64; + +typedef struct unz_file_info_s +{ + uLong version; /* version made by 2 bytes */ + uLong version_needed; /* version needed to extract 2 bytes */ + uLong flag; /* general purpose bit flag 2 bytes */ + uLong compression_method; /* compression method 2 bytes */ + uLong dosDate; /* last mod file date in Dos fmt 4 bytes */ + uLong crc; /* crc-32 4 bytes */ + uLong compressed_size; /* compressed size 4 bytes */ + uLong uncompressed_size; /* uncompressed size 4 bytes */ + uLong size_filename; /* filename length 2 bytes */ + uLong size_file_extra; /* extra field length 2 bytes */ + uLong size_file_comment; /* file comment length 2 bytes */ + + uLong disk_num_start; /* disk number start 2 bytes */ + uLong internal_fa; /* internal file attributes 2 bytes */ + uLong external_fa; /* external file attributes 4 bytes */ + + tm_unz tmu_date; +} unz_file_info; + +extern int ZEXPORT unzStringFileNameCompare OF ((const char* fileName1, + const char* fileName2, + int iCaseSensitivity)); +/* + Compare two filename (fileName1,fileName2). + If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) + If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi + or strcasecmp) + If iCaseSenisivity = 0, case sensitivity is defaut of your operating system + (like 1 on Unix, 2 on Windows) +*/ + + +extern unzFile ZEXPORT unzOpen OF((const char *path)); +extern unzFile ZEXPORT unzOpen64 OF((const void *path)); +/* + Open a Zip file. path contain the full pathname (by example, + on a Windows XP computer "c:\\zlib\\zlib113.zip" or on an Unix computer + "zlib/zlib113.zip". + If the zipfile cannot be opened (file don't exist or in not valid), the + return value is NULL. + Else, the return value is a unzFile Handle, usable with other function + of this unzip package. + the "64" function take a const void* pointer, because the path is just the + value passed to the open64_file_func callback. + Under Windows, if UNICODE is defined, using fill_fopen64_filefunc, the path + is a pointer to a wide unicode string (LPCTSTR is LPCWSTR), so const char* + does not describe the reality +*/ + + +extern unzFile ZEXPORT unzOpen2 OF((const char *path, + zlib_filefunc_def* pzlib_filefunc_def)); +/* + Open a Zip file, like unzOpen, but provide a set of file low level API + for read/write the zip file (see ioapi.h) +*/ + +extern unzFile ZEXPORT unzOpen2_64 OF((const void *path, + zlib_filefunc64_def* pzlib_filefunc_def)); +/* + Open a Zip file, like unz64Open, but provide a set of file low level API + for read/write the zip file (see ioapi.h) +*/ + +extern int ZEXPORT unzClose OF((unzFile file)); +/* + Close a ZipFile opened with unzipOpen. + If there is files inside the .Zip opened with unzOpenCurrentFile (see later), + these files MUST be closed with unzipCloseCurrentFile before call unzipClose. + return UNZ_OK if there is no problem. */ + +extern int ZEXPORT unzGetGlobalInfo OF((unzFile file, + unz_global_info *pglobal_info)); + +extern int ZEXPORT unzGetGlobalInfo64 OF((unzFile file, + unz_global_info64 *pglobal_info)); +/* + Write info about the ZipFile in the *pglobal_info structure. + No preparation of the structure is needed + return UNZ_OK if there is no problem. */ + + +extern int ZEXPORT unzGetGlobalComment OF((unzFile file, + char *szComment, + uLong uSizeBuf)); +/* + Get the global comment string of the ZipFile, in the szComment buffer. + uSizeBuf is the size of the szComment buffer. + return the number of byte copied or an error code <0 +*/ + + +/***************************************************************************/ +/* Unzip package allow you browse the directory of the zipfile */ + +extern int ZEXPORT unzGoToFirstFile OF((unzFile file)); +/* + Set the current file of the zipfile to the first file. + return UNZ_OK if there is no problem +*/ + +extern int ZEXPORT unzGoToNextFile OF((unzFile file)); +/* + Set the current file of the zipfile to the next file. + return UNZ_OK if there is no problem + return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. +*/ + +extern int ZEXPORT unzLocateFile OF((unzFile file, + const char *szFileName, + int iCaseSensitivity)); +/* + Try locate the file szFileName in the zipfile. + For the iCaseSensitivity signification, see unzStringFileNameCompare + + return value : + UNZ_OK if the file is found. It becomes the current file. + UNZ_END_OF_LIST_OF_FILE if the file is not found +*/ + + +/* ****************************************** */ +/* Ryan supplied functions */ +/* unz_file_info contain information about a file in the zipfile */ +typedef struct unz_file_pos_s +{ + uLong pos_in_zip_directory; /* offset in zip file directory */ + uLong num_of_file; /* # of file */ +} unz_file_pos; + +extern int ZEXPORT unzGetFilePos( + unzFile file, + unz_file_pos* file_pos); + +extern int ZEXPORT unzGoToFilePos( + unzFile file, + unz_file_pos* file_pos); + +typedef struct unz64_file_pos_s +{ + ZPOS64_T pos_in_zip_directory; /* offset in zip file directory */ + ZPOS64_T num_of_file; /* # of file */ +} unz64_file_pos; + +extern int ZEXPORT unzGetFilePos64( + unzFile file, + unz64_file_pos* file_pos); + +extern int ZEXPORT unzGoToFilePos64( + unzFile file, + const unz64_file_pos* file_pos); + +/* ****************************************** */ + +extern int ZEXPORT unzGetCurrentFileInfo64 OF((unzFile file, + unz_file_info64 *pfile_info, + char *szFileName, + uLong fileNameBufferSize, + void *extraField, + uLong extraFieldBufferSize, + char *szComment, + uLong commentBufferSize)); + +extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file, + unz_file_info *pfile_info, + char *szFileName, + uLong fileNameBufferSize, + void *extraField, + uLong extraFieldBufferSize, + char *szComment, + uLong commentBufferSize)); +/* + Get Info about the current file + if pfile_info!=NULL, the *pfile_info structure will contain somes info about + the current file + if szFileName!=NULL, the filemane string will be copied in szFileName + (fileNameBufferSize is the size of the buffer) + if extraField!=NULL, the extra field information will be copied in extraField + (extraFieldBufferSize is the size of the buffer). + This is the Central-header version of the extra field + if szComment!=NULL, the comment string of the file will be copied in szComment + (commentBufferSize is the size of the buffer) +*/ + + +/** Addition for GDAL : START */ + +extern ZPOS64_T ZEXPORT unzGetCurrentFileZStreamPos64 OF((unzFile file)); + +/** Addition for GDAL : END */ + + +/***************************************************************************/ +/* for reading the content of the current zipfile, you can open it, read data + from it, and close it (you can close it before reading all the file) + */ + +extern int ZEXPORT unzOpenCurrentFile OF((unzFile file)); +/* + Open for reading data the current file in the zipfile. + If there is no error, the return value is UNZ_OK. +*/ + +extern int ZEXPORT unzOpenCurrentFilePassword OF((unzFile file, + const char* password)); +/* + Open for reading data the current file in the zipfile. + password is a crypting password + If there is no error, the return value is UNZ_OK. +*/ + +extern int ZEXPORT unzOpenCurrentFile2 OF((unzFile file, + int* method, + int* level, + int raw)); +/* + Same than unzOpenCurrentFile, but open for read raw the file (not uncompress) + if raw==1 + *method will receive method of compression, *level will receive level of + compression + note : you can set level parameter as NULL (if you did not want known level, + but you CANNOT set method parameter as NULL +*/ + +extern int ZEXPORT unzOpenCurrentFile3 OF((unzFile file, + int* method, + int* level, + int raw, + const char* password)); +/* + Same than unzOpenCurrentFile, but open for read raw the file (not uncompress) + if raw==1 + *method will receive method of compression, *level will receive level of + compression + note : you can set level parameter as NULL (if you did not want known level, + but you CANNOT set method parameter as NULL +*/ + + +extern int ZEXPORT unzCloseCurrentFile OF((unzFile file)); +/* + Close the file in zip opened with unzOpenCurrentFile + Return UNZ_CRCERROR if all the file was read but the CRC is not good +*/ + +extern int ZEXPORT unzReadCurrentFile OF((unzFile file, + voidp buf, + unsigned len)); +/* + Read bytes from the current file (opened by unzOpenCurrentFile) + buf contain buffer where data must be copied + len the size of buf. + + return the number of byte copied if somes bytes are copied + return 0 if the end of file was reached + return <0 with error code if there is an error + (UNZ_ERRNO for IO error, or zLib error for uncompress error) +*/ + +extern z_off_t ZEXPORT unztell OF((unzFile file)); + +extern ZPOS64_T ZEXPORT unztell64 OF((unzFile file)); +/* + Give the current position in uncompressed data +*/ + +extern int ZEXPORT unzeof OF((unzFile file)); +/* + return 1 if the end of file was reached, 0 elsewhere +*/ + +extern int ZEXPORT unzGetLocalExtrafield OF((unzFile file, + voidp buf, + unsigned len)); +/* + Read extra field from the current file (opened by unzOpenCurrentFile) + This is the local-header version of the extra field (sometimes, there is + more info in the local-header version than in the central-header) + + if buf==NULL, it return the size of the local extra field + + if buf!=NULL, len is the size of the buffer, the extra header is copied in + buf. + the return value is the number of bytes copied in buf, or (if <0) + the error code +*/ + +/***************************************************************************/ + +/* Get the current file offset */ +extern ZPOS64_T ZEXPORT unzGetOffset64 (unzFile file); +extern uLong ZEXPORT unzGetOffset (unzFile file); + +/* Set the current file offset */ +extern int ZEXPORT unzSetOffset64 (unzFile file, ZPOS64_T pos); +extern int ZEXPORT unzSetOffset (unzFile file, uLong pos); + + +// #################################################################### + +// the following function was added for doom3 by id Software + +extern unzFile unzReOpen( const char* path, unzFile file ); + +/* + Re-Open a Zip file, i.e. clone an existing one and give it a new file descriptor. + path contain the full pathname (by example, + on a Windows NT computer "c:\\zlib\\zlib111.zip" or on an Unix computer + "zlib/zlib111.zip". + If the zipfile cannot be opened (file don't exist or in not valid), the + return value is NULL. + Else, the return value is a unzFile Handle, usable with other function + of this unzip package. +*/ + +#ifdef __cplusplus +} +#endif + +#endif /* _unz64_H */ diff --git a/neo/idlib/precompiled.h b/neo/idlib/precompiled.h index 1523a9cd..468d6f5a 100644 --- a/neo/idlib/precompiled.h +++ b/neo/idlib/precompiled.h @@ -55,6 +55,9 @@ If you have questions concerning this license or the applicable additional terms #include "../framework/CmdSystem.h" #include "../framework/CVarSystem.h" #include "../framework/Common.h" +// DG: needed for idFile_InZip in File.h +#include "../framework/Unzip.h" +// DG end #include "../framework/File.h" #include "../framework/File_Manifest.h" #include "../framework/File_SaveGame.h" From 66ed216ad8ff2625e3a157aa644aa11b42fbae94 Mon Sep 17 00:00:00 2001 From: Daniel Gibson Date: Wed, 2 Jan 2013 02:56:31 +0100 Subject: [PATCH 28/57] Update zip code to minizip 1.1 .. from zlib-1.2.7/contrib/minizip/ It resides next to the unzip code in framework/minizip/ This updates makes the code a bit cleaner and creating zip64 with the idZipBuilder is now more feasible and update to future minizip versions should be easier as I didn't change the original files from minizip 1.1 very much. --- neo/framework/Zip.cpp | 1355 +------------- neo/framework/Zip.h | 227 +-- neo/framework/minizip/MiniZip64_info.txt | 4 +- neo/framework/minizip/zip.cpp | 2036 ++++++++++++++++++++++ neo/framework/minizip/zip.h | 362 ++++ 5 files changed, 2419 insertions(+), 1565 deletions(-) create mode 100644 neo/framework/minizip/zip.cpp create mode 100644 neo/framework/minizip/zip.h diff --git a/neo/framework/Zip.cpp b/neo/framework/Zip.cpp index afcc28a8..f08c49a0 100644 --- a/neo/framework/Zip.cpp +++ b/neo/framework/Zip.cpp @@ -36,1350 +36,29 @@ Contains external code for building ZipFiles. */ #include "Zip.h" -#include "Unzip.h" -#undef STDC -#include "../libs/zlib/zutil.h" - -/* zip.c -- IO on .zip files using zlib - Version 1.01e, February 12th, 2005 - - 27 Dec 2004 Rolf Kalbermatter - Modification to zipOpen2 to support globalComment retrieval. - - Copyright (C) 1998-2005 Gilles Vollant - - This unzip package allow creates .ZIP file, compatible with PKZip 2.04g - WinZip, InfoZip tools and compatible. - Multi volume ZipFile (span) are not supported. - Encryption compatible with pkzip 2.04g only supported - Old compressions used by old PKZip 1.x are not supported - - For uncompress .zip file, look at unzip.h - - I WAIT FEEDBACK at mail info@winimage.com - Visit also http://www.winimage.com/zLibDll/unzip.html for evolution - - Condition of use and distribution are the same than zlib : - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. - - For more info about .ZIP format, see - http://www.info-zip.org/pub/infozip/doc/appnote-981119-iz.zip - http://www.info-zip.org/pub/infozip/doc/ - PkWare has also a specification at : - ftp://ftp.pkware.com/probdesc.zip - -*/ - -#ifndef Z_MAXFILENAMEINZIP -#define Z_MAXFILENAMEINZIP (256) -#endif - -#ifndef ALLOC -#define ALLOC( size ) ( Mem_Alloc( size, TAG_ZIP ) ) -#endif -#ifndef TRYFREE -#define TRYFREE( p ) { if (p) { Mem_Free(p); } } -#endif - -/* -#define SIZECENTRALDIRITEM (0x2e) -#define SIZEZIPLOCALHEADER (0x1e) -*/ - -const char zip_copyright[] = - " zip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll"; - -#define LOCALHEADERMAGIC (0x04034b50) -#define CENTRALHEADERMAGIC (0x02014b50) -#define ENDHEADERMAGIC (0x06054b50) - -#define FLAG_LOCALHEADER_OFFSET (0x06) -#define CRC_LOCALHEADER_OFFSET (0x0e) - -#define SIZECENTRALHEADER (0x2e) /* 46 */ +// #undef STDC +idCVar zip_verbosity( "zip_verbosity", "0", CVAR_BOOL, "1 = verbose logging when building zip files" ); #define DEFAULT_COMPRESSION_LEVEL (5) /* 1 == Compress faster, 9 == Compress better */ #define DEFAULT_WRITEBUFFERSIZE (16384) -#ifndef NOCRYPT -#define INCLUDECRYPTINGCODE_IFCRYPTALLOWED -#include "crypt.h" -#endif - -idCVar zip_verbosity( "zip_verbosity", "0", CVAR_BOOL, "1 = verbose logging when building zip files" ); - /* -======================== -allocate_new_datablock -======================== -*/ -linkedlist_datablock_internal* allocate_new_datablock() -{ - linkedlist_datablock_internal* ldi = NULL; - ldi = ( linkedlist_datablock_internal* ) ALLOC( sizeof( linkedlist_datablock_internal ) ); - if( ldi != NULL ) - { - ldi->next_datablock = NULL; - ldi->filled_in_this_block = 0; - ldi->avail_in_this_block = SIZEDATA_INDATABLOCK; - } - return ldi; -} - -/* -======================== -free_datablock -======================== -*/ -void free_datablock( linkedlist_datablock_internal* ldi ) -{ - while( ldi != NULL ) - { - linkedlist_datablock_internal* ldinext = ldi->next_datablock; - TRYFREE( ldi ); - ldi = ldinext; - } -} - -/* -======================== -init_linkedlist -======================== -*/ -void init_linkedlist( linkedlist_data* ll ) -{ - ll->first_block = ll->last_block = NULL; -} - -/* -======================== -free_linkedlist -======================== -*/ -void free_linkedlist( linkedlist_data* ll ) -{ - free_datablock( ll->first_block ); - ll->first_block = ll->last_block = NULL; -} - -/* -======================== -add_data_in_datablock -======================== -*/ -int add_data_in_datablock( linkedlist_data* ll, const void* buf, unsigned long len ) -{ - linkedlist_datablock_internal* ldi; - const unsigned char* from_copy; - - if( ll == NULL ) - { - return ZIP_INTERNALERROR; - } - - if( ll->last_block == NULL ) - { - ll->first_block = ll->last_block = allocate_new_datablock(); - if( ll->first_block == NULL ) - { - return ZIP_INTERNALERROR; - } - } - - ldi = ll->last_block; - from_copy = ( unsigned char* )buf; - - while( len > 0 ) - { - unsigned int copy_this; - unsigned char* to_copy; - - if( ldi->avail_in_this_block == 0 ) - { - ldi->next_datablock = allocate_new_datablock(); - if( ldi->next_datablock == NULL ) - { - return ZIP_INTERNALERROR; - } - ldi = ldi->next_datablock; - ll->last_block = ldi; - } - - if( ldi->avail_in_this_block < len ) - { - copy_this = ( unsigned int )ldi->avail_in_this_block; - } - else - { - copy_this = ( unsigned int )len; - } - - to_copy = &( ldi->data[ ldi->filled_in_this_block ] ); - - for( unsigned int i = 0; i < copy_this; i++ ) - { - *( to_copy + i ) = * ( from_copy + i ); - } - - ldi->filled_in_this_block += copy_this; - ldi->avail_in_this_block -= copy_this; - from_copy += copy_this; - len -= copy_this; - } - - return ZIP_OK; -} - -#ifndef NO_ADDFILEINEXISTINGZIP - -/* -======================== -ziplocal_putValue - -Inputs a long in LSB order to the given file -nbByte == 1, 2 or 4 (byte, short or long) -======================== -*/ -int ziplocal_putValue( idFile* filestream, unsigned long x, int nbByte ) -{ - unsigned char buf[4]; - for( int n = 0; n < nbByte; n++ ) - { - buf[n] = ( unsigned char )( x & 0xff ); - x >>= 8; - } - if( x != 0 ) - { - /* data overflow - hack for ZIP64 (X Roche) */ - for( int n = 0; n < nbByte; n++ ) - { - buf[n] = 0xff; - } - } - if( filestream->Write( buf, nbByte ) != nbByte ) - { - return ZIP_ERRNO; - } - else - { - return ZIP_OK; - } -} - -/* -======================== -ziplocal_putValue_inmemory -======================== -*/ -void ziplocal_putValue_inmemory( void* dest, unsigned long x, int nbByte ) -{ - unsigned char* buf = ( unsigned char* )dest; - for( int n = 0; n < nbByte; n++ ) - { - buf[n] = ( unsigned char )( x & 0xff ); - x >>= 8; - } - - if( x != 0 ) - { - /* data overflow - hack for ZIP64 */ - for( int n = 0; n < nbByte; n++ ) - { - buf[n] = 0xff; - } - } -} - -/* -======================== -ziplocal_TmzDateToDosDate -======================== -*/ -unsigned long ziplocal_TmzDateToDosDate( const tm_zip* ptm, unsigned long dosDate ) -{ - unsigned long year = ( unsigned long )ptm->tm_year; - if( year > 1980 ) - { - year -= 1980; - } - else if( year > 80 ) - { - year -= 80; - } - return ( unsigned long )( ( ( ptm->tm_mday ) + ( 32 * ( ptm->tm_mon + 1 ) ) + ( 512 * year ) ) << 16 ) | - ( ( ptm->tm_sec / 2 ) + ( 32 * ptm->tm_min ) + ( 2048 * ( unsigned long )ptm->tm_hour ) ); -} - -/* -======================== -ziplocal_getByte -======================== -*/ -int ziplocal_getByte( idFile* filestream, int* pi ) -{ - unsigned char c; - int err = ( int )filestream->Read( &c, 1 ); - if( err == 1 ) - { - *pi = ( int )c; - return ZIP_OK; - } - else - { - return ZIP_ERRNO; - } - /* - unsigned char c; - int err = (int)ZREAD( filestream, &c, 1 ); - - if ( err == 1 ) { - *pi = (int)c; - return ZIP_OK; - } else { - if ( ZERROR( filestream ) ) { - return ZIP_ERRNO; - } else { - return ZIP_EOF; - } - } - */ -} - -/* -======================== -ziplocal_getShort - -Reads a long in LSB order from the given gz_stream. Sets -======================== -*/ -int ziplocal_getShort( idFile* filestream, unsigned long* pX ) -{ - short v; - if( filestream->Read( &v, sizeof( v ) ) == sizeof( v ) ) - { - idSwap::Little( v ); - *pX = v; - return ZIP_OK; - } - else - { - return ZIP_ERRNO; - } - /* - unsigned long x ; - int i; - int err; - - err = ziplocal_getByte( filestream, &i ); - x = (unsigned long)i; - - if ( err == ZIP_OK ) { - err = ziplocal_getByte( filestream, &i ); - } - x += ( (unsigned long)i ) << 8; - - if ( err == ZIP_OK ) { - *pX = x; - } else { - *pX = 0; - } - return err; - */ -} - -/* -======================== -ziplocal_getLong -======================== -*/ -int ziplocal_getLong( idFile* filestream, unsigned long* pX ) -{ - int v; - if( filestream->Read( &v, sizeof( v ) ) == sizeof( v ) ) - { - idSwap::Little( v ); - *pX = v; - return ZIP_OK; - } - else - { - return ZIP_ERRNO; - } - /* - unsigned long x ; - int i; - int err; - - err = ziplocal_getByte( filestream, &i ); - x = (unsigned long)i; - - if ( err == ZIP_OK ) { - err = ziplocal_getByte( filestream, &i ); - } - x += ( (unsigned long)i ) << 8; - - if ( err == ZIP_OK ) { - err = ziplocal_getByte( filestream, &i ); - } - x += ( (unsigned long)i) << 16; - - if ( err == ZIP_OK ) { - err = ziplocal_getByte( filestream, &i ); - } - x += ( (unsigned long)i ) << 24; - - if ( err == ZIP_OK ) { - *pX = x; - } else { - *pX = 0; - } - return err; - */ -} - -#ifndef BUFREADCOMMENT -#define BUFREADCOMMENT (0x400) -#endif - -/* -======================== -ziplocal_SearchCentralDir - -Locate the Central directory of a zipfile (at the end, just before -the global comment) -======================== -*/ -unsigned long ziplocal_SearchCentralDir( idFile* filestream ) -{ - unsigned char* buf; - unsigned long uSizeFile; - unsigned long uBackRead; - unsigned long uMaxBack = 0xffff; /* maximum size of global comment */ - unsigned long uPosFound = 0; - - if( filestream->Seek( 0, FS_SEEK_END ) != 0 ) - { - return 0; - } - - uSizeFile = ( unsigned long )filestream->Tell(); - - if( uMaxBack > uSizeFile ) - { - uMaxBack = uSizeFile; - } - - buf = ( unsigned char* )ALLOC( BUFREADCOMMENT + 4 ); - if( buf == NULL ) - { - return 0; - } - - uBackRead = 4; - while( uBackRead < uMaxBack ) - { - unsigned long uReadSize, uReadPos; - if( uBackRead + BUFREADCOMMENT > uMaxBack ) - { - uBackRead = uMaxBack; - } - else - { - uBackRead += BUFREADCOMMENT; - } - uReadPos = uSizeFile - uBackRead ; - - uReadSize = ( ( BUFREADCOMMENT + 4 ) < ( uSizeFile - uReadPos ) ) ? ( BUFREADCOMMENT + 4 ) : ( uSizeFile - uReadPos ); - if( filestream->Seek( uReadPos, FS_SEEK_SET ) != 0 ) - { - break; - } - - if( filestream->Read( buf, uReadSize ) != ( int )uReadSize ) - { - break; - } - - for( int i = ( int )uReadSize - 3; ( i -- ) > 0; ) - { - if( ( ( *( buf + i ) ) == 0x50 ) && ( ( *( buf + i + 1 ) ) == 0x4b ) && ( ( *( buf + i + 2 ) ) == 0x05 ) && ( ( *( buf + i + 3 ) ) == 0x06 ) ) - { - uPosFound = uReadPos + i; - break; - } - } - - if( uPosFound != 0 ) - { - break; - } - } - TRYFREE( buf ); - return uPosFound; -} -#endif /* !NO_ADDFILEINEXISTINGZIP*/ - -/* -======================== -zipOpen2 -======================== -*/ -zipFile zipOpen2( const char* pathname, int append, char* globalcomment ) -{ - zip_internal ziinit; - zip_internal* zi; - int err = ZIP_OK; - - ziinit.filestream = fileSystem->OpenExplicitFileWrite( pathname ); - /* - ziinit.filestream = ZOPEN( pathname, ( append == APPEND_STATUS_CREATE ) ? - ( ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_CREATE ) : - ( ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_EXISTING ) ); - */ - if( ziinit.filestream == NULL ) - { - return NULL; - } - ziinit.begin_pos = ( unsigned long )ziinit.filestream->Tell(); - ziinit.in_opened_file_inzip = 0; - ziinit.ci.stream_initialised = 0; - ziinit.number_entry = 0; - ziinit.add_position_when_writting_offset = 0; - init_linkedlist( &( ziinit.central_dir ) ); - - zi = ( zip_internal* )ALLOC( sizeof( zip_internal ) ); - if( zi == NULL ) - { - delete ziinit.filestream; - ziinit.filestream = NULL; - return NULL; - } - - /* now we add file in a zipfile */ -#ifndef NO_ADDFILEINEXISTINGZIP - ziinit.globalcomment = NULL; - if( append == APPEND_STATUS_ADDINZIP ) - { - unsigned long byte_before_the_zipfile; // byte before the zipfile, ( > 0 for sfx ) - unsigned long size_central_dir; // size of the central directory - unsigned long offset_central_dir; // offset of start of central directory - unsigned long central_pos, uL; - unsigned long number_disk; // number of the current dist, used for spaning ZIP, unsupported, always 0 - unsigned long number_disk_with_CD; // number the the disk with central dir, used for spaning ZIP, unsupported, always 0 - unsigned long number_entry; - unsigned long number_entry_CD; // total number of entries in the central dir ( same than number_entry on nospan ) - unsigned long size_comment; - - central_pos = ziplocal_SearchCentralDir( ziinit.filestream ); - if( central_pos == 0 ) - { - err = ZIP_ERRNO; - } - - if( ziinit.filestream->Seek( central_pos, FS_SEEK_SET ) != 0 ) - { - err = ZIP_ERRNO; - } - - /* the signature, already checked */ - if( ziplocal_getLong( ziinit.filestream, &uL ) != ZIP_OK ) - { - err = ZIP_ERRNO; - } - - /* number of this disk */ - if( ziplocal_getShort( ziinit.filestream, &number_disk ) != ZIP_OK ) - { - err = ZIP_ERRNO; - } - - /* number of the disk with the start of the central directory */ - if( ziplocal_getShort( ziinit.filestream, &number_disk_with_CD ) != ZIP_OK ) - { - err = ZIP_ERRNO; - } - - /* total number of entries in the central dir on this disk */ - if( ziplocal_getShort( ziinit.filestream, &number_entry ) != ZIP_OK ) - { - err = ZIP_ERRNO; - } - - /* total number of entries in the central dir */ - if( ziplocal_getShort( ziinit.filestream, &number_entry_CD ) != ZIP_OK ) - { - err = ZIP_ERRNO; - } - - if( ( number_entry_CD != number_entry ) || ( number_disk_with_CD != 0 ) || ( number_disk != 0 ) ) - { - err = ZIP_BADZIPFILE; - } - - /* size of the central directory */ - if( ziplocal_getLong( ziinit.filestream, &size_central_dir ) != ZIP_OK ) - { - err = ZIP_ERRNO; - } - - /* offset of start of central directory with respect to the starting disk number */ - if( ziplocal_getLong( ziinit.filestream, &offset_central_dir ) != ZIP_OK ) - { - err = ZIP_ERRNO; - } - - /* zipfile global comment length */ - if( ziplocal_getShort( ziinit.filestream, &size_comment ) != ZIP_OK ) - { - err = ZIP_ERRNO; - } - - if( ( central_pos < ( offset_central_dir + size_central_dir ) ) && ( err == ZIP_OK ) ) - { - err = ZIP_BADZIPFILE; - } - - if( err != ZIP_OK ) - { - delete ziinit.filestream; - ziinit.filestream = NULL; - return NULL; - } - - if( size_comment > 0 ) - { - ziinit.globalcomment = ( char* )ALLOC( size_comment + 1 ); - if( ziinit.globalcomment ) - { - size_comment = ( unsigned long )ziinit.filestream->Read( ziinit.globalcomment, size_comment ); - ziinit.globalcomment[size_comment] = 0; - } - } - - byte_before_the_zipfile = central_pos - ( offset_central_dir + size_central_dir ); - ziinit.add_position_when_writting_offset = byte_before_the_zipfile; - { - unsigned long size_central_dir_to_read = size_central_dir; - size_t buf_size = SIZEDATA_INDATABLOCK; - void* buf_read = ( void* )ALLOC( buf_size ); - if( ziinit.filestream->Seek( offset_central_dir + byte_before_the_zipfile, FS_SEEK_SET ) != 0 ) - { - err = ZIP_ERRNO; - } - - while( ( size_central_dir_to_read > 0 ) && ( err == ZIP_OK ) ) - { - unsigned long read_this = SIZEDATA_INDATABLOCK; - if( read_this > size_central_dir_to_read ) - { - read_this = size_central_dir_to_read; - } - if( ziinit.filestream->Read( buf_read, read_this ) != ( int )read_this ) - { - err = ZIP_ERRNO; - } - if( err == ZIP_OK ) - { - err = add_data_in_datablock( &ziinit.central_dir, buf_read, ( unsigned long )read_this ); - } - size_central_dir_to_read -= read_this; - } - TRYFREE( buf_read ); - } - ziinit.begin_pos = byte_before_the_zipfile; - ziinit.number_entry = number_entry_CD; - - if( ziinit.filestream->Seek( offset_central_dir + byte_before_the_zipfile, FS_SEEK_SET ) != 0 ) - { - err = ZIP_ERRNO; - } - } - - if( globalcomment ) - { - /// ?? - globalcomment = ziinit.globalcomment; - } -#endif /* !NO_ADDFILEINEXISTINGZIP*/ - - if( err != ZIP_OK ) - { -#ifndef NO_ADDFILEINEXISTINGZIP - TRYFREE( ziinit.globalcomment ); -#endif /* !NO_ADDFILEINEXISTINGZIP*/ - TRYFREE( zi ); - return NULL; - } - else - { - *zi = ziinit; - return ( zipFile )zi; - } -} - -/* -======================== -zipOpen -======================== -*/ -zipFile zipOpen( const char* pathname, int append ) -{ - return zipOpen2( pathname, append, NULL ); -} - -/* -======================== -zipOpenNewFileInZip3 -======================== -*/ -int zipOpenNewFileInZip3( zipFile file, const char* filename, const zip_fileinfo* zipfi, const void* extrafield_local, unsigned int size_extrafield_local, const void* extrafield_global, - unsigned int size_extrafield_global, const char* comment, int method, int level, int raw, int windowBits, int memLevel, int strategy, const char* password, unsigned long crcForCrypting ) -{ - unsigned int size_filename; - unsigned int size_comment; - int err = ZIP_OK; - -#ifdef NOCRYPT - if( password != NULL ) - { - return ZIP_PARAMERROR; - } -#endif - - if( file == NULL ) - { - return ZIP_PARAMERROR; - } - if( ( method != 0 ) && ( method != Z_DEFLATED ) ) - { - return ZIP_PARAMERROR; - } - - zip_internal* zi = ( zip_internal* )file; - - if( zi->in_opened_file_inzip == 1 ) - { - err = zipCloseFileInZip( file ); - if( err != ZIP_OK ) - { - return err; - } - } - - if( filename == NULL ) - { - filename = "-"; - } - - if( comment == NULL ) - { - size_comment = 0; - } - else - { - size_comment = ( unsigned int )idStr::Length( comment ); - } - - size_filename = ( unsigned int )idStr::Length( filename ); - - if( zipfi == NULL ) - { - zi->ci.dosDate = 0; - } - else - { - if( zipfi->dosDate != 0 ) - { - zi->ci.dosDate = zipfi->dosDate; - } - else - { - zi->ci.dosDate = ziplocal_TmzDateToDosDate( &zipfi->tmz_date, zipfi->dosDate ); - } - } - - zi->ci.flag = 0; - if( ( level == 8 ) || ( level == 9 ) ) - { - zi->ci.flag |= 2; - } - if( level == 2 ) // DG: remove unnecessary parenthesis - { - zi->ci.flag |= 4; - } - if( level == 1 ) // DG: remove unnecessary parenthesis - { - zi->ci.flag |= 6; - } - if( password != NULL ) - { - zi->ci.flag |= 1; - } - - zi->ci.crc32 = 0; - zi->ci.method = method; - zi->ci.encrypt = 0; - zi->ci.stream_initialised = 0; - zi->ci.pos_in_buffered_data = 0; - zi->ci.raw = raw; - zi->ci.pos_local_header = ( unsigned long )zi->filestream->Tell(); - zi->ci.size_centralheader = SIZECENTRALHEADER + size_filename + size_extrafield_global + size_comment; - zi->ci.central_header = ( char* )ALLOC( ( unsigned int )zi->ci.size_centralheader ); - - ziplocal_putValue_inmemory( zi->ci.central_header, ( unsigned long )CENTRALHEADERMAGIC, 4 ); - /* version info */ - ziplocal_putValue_inmemory( zi->ci.central_header + 4, ( unsigned long )0, 2 ); - ziplocal_putValue_inmemory( zi->ci.central_header + 6, ( unsigned long )20, 2 ); - ziplocal_putValue_inmemory( zi->ci.central_header + 8, ( unsigned long )zi->ci.flag, 2 ); - ziplocal_putValue_inmemory( zi->ci.central_header + 10, ( unsigned long )zi->ci.method, 2 ); - ziplocal_putValue_inmemory( zi->ci.central_header + 12, ( unsigned long )zi->ci.dosDate, 4 ); - ziplocal_putValue_inmemory( zi->ci.central_header + 16, ( unsigned long )0, 4 ); /*crc*/ - ziplocal_putValue_inmemory( zi->ci.central_header + 20, ( unsigned long )0, 4 ); /*compr size*/ - ziplocal_putValue_inmemory( zi->ci.central_header + 24, ( unsigned long )0, 4 ); /*uncompr size*/ - ziplocal_putValue_inmemory( zi->ci.central_header + 28, ( unsigned long )size_filename, 2 ); - ziplocal_putValue_inmemory( zi->ci.central_header + 30, ( unsigned long )size_extrafield_global, 2 ); - ziplocal_putValue_inmemory( zi->ci.central_header + 32, ( unsigned long )size_comment, 2 ); - ziplocal_putValue_inmemory( zi->ci.central_header + 34, ( unsigned long )0, 2 ); /*disk nm start*/ - - if( zipfi == NULL ) - { - ziplocal_putValue_inmemory( zi->ci.central_header + 36, ( unsigned long )0, 2 ); - } - else - { - ziplocal_putValue_inmemory( zi->ci.central_header + 36, ( unsigned long )zipfi->internal_fa, 2 ); - } - - if( zipfi == NULL ) - { - ziplocal_putValue_inmemory( zi->ci.central_header + 38, ( unsigned long )0, 4 ); - } - else - { - ziplocal_putValue_inmemory( zi->ci.central_header + 38, ( unsigned long )zipfi->external_fa, 4 ); - } - - ziplocal_putValue_inmemory( zi->ci.central_header + 42, ( unsigned long )zi->ci.pos_local_header - zi->add_position_when_writting_offset, 4 ); - - for( unsigned int i = 0; i < size_filename; i++ ) - { - *( zi->ci.central_header + SIZECENTRALHEADER + i ) = *( filename + i ); - } - - for( unsigned int i = 0; i < size_extrafield_global; i++ ) - { - *( zi->ci.central_header + SIZECENTRALHEADER + size_filename + i ) = *( ( ( const char* )extrafield_global ) + i ); - } - - for( unsigned int i = 0; i < size_comment; i++ ) - { - *( zi->ci.central_header + SIZECENTRALHEADER + size_filename + size_extrafield_global + i ) = *( comment + i ); - } - - if( zi->ci.central_header == NULL ) - { - return ZIP_INTERNALERROR; - } - - /* write the local header */ - err = ziplocal_putValue( zi->filestream, ( unsigned long )LOCALHEADERMAGIC, 4 ); - - if( err == ZIP_OK ) - { - err = ziplocal_putValue( zi->filestream, ( unsigned long )20, 2 ); /* version needed to extract */ - } - if( err == ZIP_OK ) - { - err = ziplocal_putValue( zi->filestream, ( unsigned long )zi->ci.flag, 2 ); - } - - if( err == ZIP_OK ) - { - err = ziplocal_putValue( zi->filestream, ( unsigned long )zi->ci.method, 2 ); - } - - if( err == ZIP_OK ) - { - err = ziplocal_putValue( zi->filestream, ( unsigned long )zi->ci.dosDate, 4 ); - } - - if( err == ZIP_OK ) - { - err = ziplocal_putValue( zi->filestream, ( unsigned long )0, 4 ); /* crc 32, unknown */ - } - - if( err == ZIP_OK ) - { - err = ziplocal_putValue( zi->filestream, ( unsigned long )0, 4 ); /* compressed size, unknown */ - } - - if( err == ZIP_OK ) - { - err = ziplocal_putValue( zi->filestream, ( unsigned long )0, 4 ); /* uncompressed size, unknown */ - } - - if( err == ZIP_OK ) - { - err = ziplocal_putValue( zi->filestream, ( unsigned long )size_filename, 2 ); - } - - if( err == ZIP_OK ) - { - err = ziplocal_putValue( zi->filestream, ( unsigned long )size_extrafield_local, 2 ); - } - - if( ( err == ZIP_OK ) && ( size_filename > 0 ) ) - { - if( zi->filestream->Write( filename, size_filename ) != ( int )size_filename ) - { - err = ZIP_ERRNO; - } - } - - if( ( err == ZIP_OK ) && ( size_extrafield_local > 0 ) ) - { - if( zi->filestream->Write( extrafield_local, size_extrafield_local ) != ( int )size_extrafield_local ) - { - err = ZIP_ERRNO; - } - } - - zi->ci.stream.avail_in = ( unsigned int )0; - zi->ci.stream.avail_out = ( unsigned int )Z_BUFSIZE; - zi->ci.stream.next_out = zi->ci.buffered_data; - zi->ci.stream.total_in = 0; - zi->ci.stream.total_out = 0; - - if( ( err == ZIP_OK ) && ( zi->ci.method == Z_DEFLATED ) && ( !zi->ci.raw ) ) - { - zi->ci.stream.zalloc = ( alloc_func )0; - zi->ci.stream.zfree = ( free_func )0; - zi->ci.stream.opaque = ( voidpf )0; - - if( windowBits > 0 ) - { - windowBits = -windowBits; - } - - err = deflateInit2( &zi->ci.stream, level, Z_DEFLATED, windowBits, memLevel, strategy ); - - if( err == Z_OK ) - { - zi->ci.stream_initialised = 1; - } - } -#ifndef NOCRYPT - zi->ci.crypt_header_size = 0; - if( ( err == Z_OK ) && ( password != NULL ) ) - { - unsigned char bufHead[RAND_HEAD_LEN]; - unsigned int sizeHead; - zi->ci.encrypt = 1; - zi->ci.pcrc_32_tab = get_crc_table(); - /*init_keys( password, zi->ci.keys, zi->ci.pcrc_32_tab );*/ - - sizeHead = crypthead( password, bufHead, RAND_HEAD_LEN, zi->ci.keys, zi->ci.pcrc_32_tab, crcForCrypting ); - zi->ci.crypt_header_size = sizeHead; - if( ZWRITE( zi->z_filefunc, zi->filestream, bufHead, sizeHead ) != sizeHead ) - { - err = ZIP_ERRNO; - } - } -#endif - - if( err == Z_OK ) - { - zi->in_opened_file_inzip = 1; - } - return err; -} - -/* -======================== -zipOpenNewFileInZip2 -======================== -*/ -int zipOpenNewFileInZip2( zipFile file, const char* filename, const zip_fileinfo* zipfi, const void* extrafield_local, unsigned int size_extrafield_local, - const void* extrafield_global, unsigned int size_extrafield_global, const char* comment, int method, int level, int raw ) -{ - return zipOpenNewFileInZip3( file, filename, zipfi, extrafield_local, size_extrafield_local, extrafield_global, size_extrafield_global, - comment, method, level, raw, -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, NULL, 0 ); -} - -/* -======================== -zipOpenNewFileInZip -======================== -*/ -int zipOpenNewFileInZip( zipFile file, const char* filename, const zip_fileinfo* zipfi, const void* extrafield_local, unsigned int size_extrafield_local, const void* extrafield_global, - unsigned int size_extrafield_global, const char* comment, int method, int level ) -{ - return zipOpenNewFileInZip2( file, filename, zipfi, extrafield_local, size_extrafield_local, extrafield_global, size_extrafield_global, comment, method, level, 0 ); -} - -/* -======================== -zipFlushWriteBuffer -======================== -*/ -int zipFlushWriteBuffer( zip_internal* zi ) -{ - int err = ZIP_OK; - if( zi->ci.encrypt != 0 ) - { -#ifndef NOCRYPT - int t; - for( int i = 0; i < zi->ci.pos_in_buffered_data; i++ ) - { - zi->ci.buffered_data[i] = zencode( zi->ci.keys, zi->ci.pcrc_32_tab, zi->ci.buffered_data[i], t ); - } -#endif - } - if( zi->filestream->Write( zi->ci.buffered_data, zi->ci.pos_in_buffered_data ) != ( int )zi->ci.pos_in_buffered_data ) - { - err = ZIP_ERRNO; - } - zi->ci.pos_in_buffered_data = 0; - return err; -} - -/* -======================== -zipWriteInFileInZip -======================== -*/ -int zipWriteInFileInZip( zipFile file, const void* buf, unsigned int len ) -{ - zip_internal* zi; - int err = ZIP_OK; - - if( file == NULL ) - { - return ZIP_PARAMERROR; - } - zi = ( zip_internal* )file; - - if( zi->in_opened_file_inzip == 0 ) - { - return ZIP_PARAMERROR; - } - zi->ci.stream.next_in = ( Bytef* )buf; - zi->ci.stream.avail_in = len; - zi->ci.crc32 = crc32( zi->ci.crc32, ( byte* )buf, len ); - - while( ( err == ZIP_OK ) && ( zi->ci.stream.avail_in > 0 ) ) - { - if( zi->ci.stream.avail_out == 0 ) - { - if( zipFlushWriteBuffer( zi ) == ZIP_ERRNO ) - { - err = ZIP_ERRNO; - } - zi->ci.stream.avail_out = ( unsigned int )Z_BUFSIZE; - zi->ci.stream.next_out = zi->ci.buffered_data; - } - - if( err != ZIP_OK ) - { - break; - } - - if( ( zi->ci.method == Z_DEFLATED ) && ( !zi->ci.raw ) ) - { - unsigned long uTotalOutBefore = zi->ci.stream.total_out; - err = deflate( &zi->ci.stream, Z_NO_FLUSH ); - zi->ci.pos_in_buffered_data += ( unsigned int )( zi->ci.stream.total_out - uTotalOutBefore ); - } - else - { - unsigned int copy_this; - if( zi->ci.stream.avail_in < zi->ci.stream.avail_out ) - { - copy_this = zi->ci.stream.avail_in; - } - else - { - copy_this = zi->ci.stream.avail_out; - } - for( unsigned int i = 0; i < copy_this; i++ ) - { - *( ( ( char* )zi->ci.stream.next_out ) + i ) = *( ( ( const char* )zi->ci.stream.next_in ) + i ); - } - - zi->ci.stream.avail_in -= copy_this; - zi->ci.stream.avail_out -= copy_this; - zi->ci.stream.next_in += copy_this; - zi->ci.stream.next_out += copy_this; - zi->ci.stream.total_in += copy_this; - zi->ci.stream.total_out += copy_this; - zi->ci.pos_in_buffered_data += copy_this; - } - } - - return err; -} - -/* -======================== -zipCloseFileInZipRaw -======================== -*/ -int zipCloseFileInZipRaw( zipFile file, unsigned long uncompressed_size, unsigned long crc32 ) -{ - zip_internal* zi; - unsigned long compressed_size; - int err = ZIP_OK; - - if( file == NULL ) - { - return ZIP_PARAMERROR; - } - zi = ( zip_internal* )file; - - if( zi->in_opened_file_inzip == 0 ) - { - return ZIP_PARAMERROR; - } - zi->ci.stream.avail_in = 0; - - if( ( zi->ci.method == Z_DEFLATED ) && !zi->ci.raw ) - { - while( err == ZIP_OK ) - { - unsigned long uTotalOutBefore; - if( zi->ci.stream.avail_out == 0 ) - { - if( zipFlushWriteBuffer( zi ) == ZIP_ERRNO ) - { - err = ZIP_ERRNO; - } - zi->ci.stream.avail_out = ( unsigned int )Z_BUFSIZE; - zi->ci.stream.next_out = zi->ci.buffered_data; - } - uTotalOutBefore = zi->ci.stream.total_out; - err = deflate( &zi->ci.stream, Z_FINISH ); - zi->ci.pos_in_buffered_data += ( unsigned int )( zi->ci.stream.total_out - uTotalOutBefore ); - } - } - - if( err == Z_STREAM_END ) - { - err = ZIP_OK; /* this is normal */ - } - - if( ( zi->ci.pos_in_buffered_data > 0 ) && ( err == ZIP_OK ) ) - { - if( zipFlushWriteBuffer( zi ) == ZIP_ERRNO ) - { - err = ZIP_ERRNO; - } - } - - if( ( zi->ci.method == Z_DEFLATED ) && !zi->ci.raw ) - { - err = deflateEnd( &zi->ci.stream ); - zi->ci.stream_initialised = 0; - } - - if( !zi->ci.raw ) - { - crc32 = ( unsigned long )zi->ci.crc32; - uncompressed_size = ( unsigned long )zi->ci.stream.total_in; - } - compressed_size = ( unsigned long )zi->ci.stream.total_out; -#ifndef NOCRYPT - compressed_size += zi->ci.crypt_header_size; -#endif - - ziplocal_putValue_inmemory( zi->ci.central_header + 16, crc32, 4 ); /*crc*/ - ziplocal_putValue_inmemory( zi->ci.central_header + 20, compressed_size, 4 ); /*compr size*/ - if( zi->ci.stream.data_type == Z_ASCII ) - { - ziplocal_putValue_inmemory( zi->ci.central_header + 36, ( unsigned long )Z_ASCII, 2 ); - } - ziplocal_putValue_inmemory( zi->ci.central_header + 24, uncompressed_size, 4 ); /*uncompr size*/ - - if( err == ZIP_OK ) - { - err = add_data_in_datablock( &zi->central_dir, zi->ci.central_header, ( unsigned long )zi->ci.size_centralheader ); - } - TRYFREE( zi->ci.central_header ); - - if( err == ZIP_OK ) - { - long cur_pos_inzip = ( long )zi->filestream->Tell(); - if( zi->filestream->Seek( zi->ci.pos_local_header + 14, FS_SEEK_SET ) != 0 ) - { - err = ZIP_ERRNO; - } - - if( err == ZIP_OK ) - { - err = ziplocal_putValue( zi->filestream, crc32, 4 ); /* crc 32, unknown */ - } - - if( err == ZIP_OK ) /* compressed size, unknown */ - { - err = ziplocal_putValue( zi->filestream, compressed_size, 4 ); - } - - if( err == ZIP_OK ) /* uncompressed size, unknown */ - { - err = ziplocal_putValue( zi->filestream, uncompressed_size, 4 ); - } - - if( zi->filestream->Seek( cur_pos_inzip, FS_SEEK_SET ) != 0 ) - { - err = ZIP_ERRNO; - } - } - zi->number_entry++; - zi->in_opened_file_inzip = 0; - - return err; -} - -/* -======================== -zipCloseFileInZip -======================== -*/ -int zipCloseFileInZip( zipFile file ) -{ - return zipCloseFileInZipRaw( file, 0, 0 ); -} - -/* -======================== -zipClose -======================== -*/ -int zipClose( zipFile file, const char* global_comment ) -{ - zip_internal* zi; - int err = 0; - unsigned long size_centraldir = 0; - unsigned long centraldir_pos_inzip; - unsigned int size_global_comment; - if( file == NULL ) - { - return ZIP_PARAMERROR; - } - zi = ( zip_internal* )file; - - if( zi->in_opened_file_inzip == 1 ) - { - err = zipCloseFileInZip( file ); - } - -#ifndef NO_ADDFILEINEXISTINGZIP - if( global_comment == NULL ) - { - global_comment = zi->globalcomment; - } -#endif - if( global_comment == NULL ) - { - size_global_comment = 0; - } - else - { - size_global_comment = ( unsigned int )idStr::Length( global_comment ); - } - - centraldir_pos_inzip = ( unsigned long )zi->filestream->Tell(); - if( err == ZIP_OK ) - { - linkedlist_datablock_internal* ldi = zi->central_dir.first_block; - while( ldi != NULL ) - { - if( ( err == ZIP_OK ) && ( ldi->filled_in_this_block > 0 ) ) - { - if( zi->filestream->Write( ldi->data, ldi->filled_in_this_block ) != ( int )ldi->filled_in_this_block ) - { - err = ZIP_ERRNO; - } - } - size_centraldir += ldi->filled_in_this_block; - ldi = ldi->next_datablock; - } - } - free_datablock( zi->central_dir.first_block ); - - if( err == ZIP_OK ) /* Magic End */ - { - err = ziplocal_putValue( zi->filestream, ( unsigned long )ENDHEADERMAGIC, 4 ); - } - - if( err == ZIP_OK ) /* number of this disk */ - { - err = ziplocal_putValue( zi->filestream, ( unsigned long )0, 2 ); - } - - if( err == ZIP_OK ) /* number of the disk with the start of the central directory */ - { - err = ziplocal_putValue( zi->filestream, ( unsigned long )0, 2 ); - } - - if( err == ZIP_OK ) /* total number of entries in the central dir on this disk */ - { - err = ziplocal_putValue( zi->filestream, ( unsigned long )zi->number_entry, 2 ); - } - - if( err == ZIP_OK ) /* total number of entries in the central dir */ - { - err = ziplocal_putValue( zi->filestream, ( unsigned long )zi->number_entry, 2 ); - } - - if( err == ZIP_OK ) /* size of the central directory */ - { - err = ziplocal_putValue( zi->filestream, ( unsigned long )size_centraldir, 4 ); - } - - if( err == ZIP_OK ) /* offset of start of central directory with respect to the starting disk number */ - { - err = ziplocal_putValue( zi->filestream, ( unsigned long )( centraldir_pos_inzip - zi->add_position_when_writting_offset ), 4 ); - } - - if( err == ZIP_OK ) /* zipfile comment length */ - { - err = ziplocal_putValue( zi->filestream, ( unsigned long )size_global_comment, 2 ); - } - - if( ( err == ZIP_OK ) && ( size_global_comment > 0 ) ) - { - if( zi->filestream->Write( global_comment, size_global_comment ) != ( int )size_global_comment ) - { - err = ZIP_ERRNO; - } - } - - delete zi->filestream; - zi->filestream = NULL; - -#ifndef NO_ADDFILEINEXISTINGZIP - TRYFREE( zi->globalcomment ); -#endif - TRYFREE( zi ); - - return err; -} + * DG: all the zip implementation has been updated to minizip 1.1 and is in framework/minizip/zip.cpp + * In the D3 BFG implementation there were some things specific to Doom3: + * * FILE was replaced by idFile, thus + * - fseek(), fread(), fwrite(), ftell() were replaced by idFile functions + * - fopen() was replaced by fileSystem->OpenExplicitFileWrite() + * - fclose() was replaced by fileSystem->CloseFile() + * + * As this isn't important for the code to work I haven't done these changes, but using the + * Doom3 specific functions could be quite easily done by using zipOpen2() with an appropriate + * zlib_filefunc_def. + * + * TODO: Doom3 should already support zip64 for unzipping, maybe it would make sense to use the + * corresponding functions here as well.. but then we can't use idFile, because it only + * supports files up to 2GB (Length() and Tell() return ints) + */ /* ======================== diff --git a/neo/framework/Zip.h b/neo/framework/Zip.h index 2dd1e2c6..2a90f9db 100644 --- a/neo/framework/Zip.h +++ b/neo/framework/Zip.h @@ -30,231 +30,8 @@ If you have questions concerning this license or the applicable additional terms #include "../libs/zlib/zlib.h" -/* -================================================================================================ - -Contains external code for building ZipFiles. - -The Unzip Package allows extraction of a file from .ZIP file, compatible with -PKZip 2.04g, !WinZip, !InfoZip tools and compatibles. Encryption and multi-volume ZipFiles -(span) are not supported. Old compressions used by old PKZip 1.x are not supported. - -================================================================================================ -*/ -#if defined(STRICTZIP) || defined(STRICTZIPUNZIP) -/* like the STRICT of WIN32, we define a pointer that cannot be converted - from (void*) without cast */ -typedef struct TagzipFile__ -{ - int unused; -} zipFile__; -typedef zipFile__* zipFile; -#else -typedef void* zipFile; -#endif - -#define ZIP_OK (0) -#define ZIP_EOF (0) -#define ZIP_ERRNO (Z_ERRNO) -#define ZIP_PARAMERROR (-102) -#define ZIP_BADZIPFILE (-103) -#define ZIP_INTERNALERROR (-104) - -#ifndef Z_BUFSIZE -#define Z_BUFSIZE (16384) -#endif - -/* -======================== -tm_zip -contains date/time info -======================== -*/ -typedef struct tm_zip_s -{ - unsigned int tm_sec; /* seconds after the minute - [0,59] */ - unsigned int tm_min; /* minutes after the hour - [0,59] */ - unsigned int tm_hour; /* hours since midnight - [0,23] */ - unsigned int tm_mday; /* day of the month - [1,31] */ - unsigned int tm_mon; /* months since January - [0,11] */ - unsigned int tm_year; /* years - [1980..2044] */ -} tm_zip; - -/* -======================== -zip_fileinfo -======================== -*/ -typedef struct -{ - tm_zip tmz_date; /* date in understandable format */ - unsigned long dosDate; /* if dos_date == 0, tmu_date is used */ -// unsigned long flag; /* general purpose bit flag 2 bytes */ - - unsigned long internal_fa; /* internal file attributes 2 bytes */ - unsigned long external_fa; /* external file attributes 4 bytes */ -} zip_fileinfo; - -#define NOCRYPT // ignore passwords -#define SIZEDATA_INDATABLOCK (4096-(4*4)) - -/* -======================== -linkedlist_datablock_internal -======================== -*/ -typedef struct linkedlist_datablock_internal_s -{ - struct linkedlist_datablock_internal_s* next_datablock; - unsigned long avail_in_this_block; - unsigned long filled_in_this_block; - unsigned long unused; /* for future use and alignement */ - unsigned char data[SIZEDATA_INDATABLOCK]; -} linkedlist_datablock_internal; - -/* -======================== -linkedlist_data -======================== -*/ -typedef struct linkedlist_data_s -{ - linkedlist_datablock_internal* first_block; - linkedlist_datablock_internal* last_block; -} linkedlist_data; - -/* -======================== -curfile_info -======================== -*/ -typedef struct -{ - z_stream stream; /* zLib stream structure for inflate */ - int stream_initialised; /* 1 is stream is initialised */ - unsigned int pos_in_buffered_data; /* last written byte in buffered_data */ - - unsigned long pos_local_header; /* offset of the local header of the file currenty writing */ - char* central_header; /* central header data for the current file */ - unsigned long size_centralheader; /* size of the central header for cur file */ - unsigned long flag; /* flag of the file currently writing */ - - int method; /* compression method of file currenty wr.*/ - int raw; /* 1 for directly writing raw data */ - byte buffered_data[Z_BUFSIZE];/* buffer contain compressed data to be writ*/ - unsigned long dosDate; - unsigned long crc32; - int encrypt; -#ifndef NOCRYPT - unsigned long keys[3]; /* keys defining the pseudo-random sequence */ - const unsigned long* pcrc_32_tab; - int crypt_header_size; -#endif -} curfile_info; - -//#define NO_ADDFILEINEXISTINGZIP -/* -======================== -zip_internal -======================== -*/ -typedef struct -{ - idFile* filestream; /* io structore of the zipfile */ - linkedlist_data central_dir; /* datablock with central dir in construction*/ - int in_opened_file_inzip; /* 1 if a file in the zip is currently writ.*/ - curfile_info ci; /* info on the file curretly writing */ - - unsigned long begin_pos; /* position of the beginning of the zipfile */ - unsigned long add_position_when_writting_offset; - unsigned long number_entry; -#ifndef NO_ADDFILEINEXISTINGZIP - char* globalcomment; -#endif -} zip_internal; - -#define APPEND_STATUS_CREATE (0) -#define APPEND_STATUS_CREATEAFTER (1) -#define APPEND_STATUS_ADDINZIP (2) - -/* - Create a zipfile. - pathname contain on Windows XP a filename like "c:\\zlib\\zlib113.zip" or on - an Unix computer "zlib/zlib113.zip". - if the file pathname exist and append==APPEND_STATUS_CREATEAFTER, the zip - will be created at the end of the file. - (useful if the file contain a self extractor code) - if the file pathname exist and append==APPEND_STATUS_ADDINZIP, we will - add files in existing zip (be sure you don't add file that doesn't exist) - If the zipfile cannot be opened, the return value is NULL. - Else, the return value is a zipFile Handle, usable with other function - of this zip package. -*/ - -/* Note : there is no delete function into a zipfile. - If you want delete file into a zipfile, you must open a zipfile, and create another - Of couse, you can use RAW reading and writing to copy the file you did not want delte -*/ -extern zipFile zipOpen( const char* pathname, int append ); - -/* - Open a file in the ZIP for writing. - filename : the filename in zip (if NULL, '-' without quote will be used - *zipfi contain supplemental information - if extrafield_local!=NULL and size_extrafield_local>0, extrafield_local - contains the extrafield data the the local header - if extrafield_global!=NULL and size_extrafield_global>0, extrafield_global - contains the extrafield data the the local header - if comment != NULL, comment contain the comment string - method contain the compression method (0 for store, Z_DEFLATED for deflate) - level contain the level of compression (can be Z_DEFAULT_COMPRESSION) -*/ -extern zipFile zipOpen2( const char* pathname, int append, char* globalcomment ); - -extern int zipOpenNewFileInZip( zipFile file, const char* filename, const zip_fileinfo* zipfi, const void* extrafield_local, - uInt size_extrafield_local, const void* extrafield_global, uInt size_extrafield_global, const char* comment, - int method, int level ); - -/* - Same than zipOpenNewFileInZip, except if raw=1, we write raw file -*/ -extern int zipOpenNewFileInZip2( zipFile file, const char* filename, const zip_fileinfo* zipfi, const void* extrafield_local, uInt size_extrafield_local, - const void* extrafield_global, uInt size_extrafield_global, const char* comment, int method, int level, int raw ); - -/* - Same than zipOpenNewFileInZip2, except - windowBits,memLevel,,strategy : see parameter strategy in deflateInit2 - password : crypting password (NULL for no crypting) - crcForCtypting : crc of file to compress (needed for crypting) -*/ -extern int zipOpenNewFileInZip3( zipFile file, const char* filename, const zip_fileinfo* zipfi, const void* extrafield_local, uInt size_extrafield_local, - const void* extrafield_global, uInt size_extrafield_global, const char* comment, int method, int level, int raw, int windowBits, - int memLevel, int strategy, const char* password, uLong crcForCtypting ); - -/* - Write data in the zipfile -*/ -extern int zipWriteInFileInZip( zipFile file, const void* buf, unsigned int len ); - - -/* - Close the current file in the zipfile -*/ -extern int zipCloseFileInZip( zipFile file ); - - -/* - Close the current file in the zipfile, for fiel opened with - parameter raw=1 in zipOpenNewFileInZip2 - uncompressed_size and crc32 are value for the uncompressed size -*/ -extern int zipCloseFileInZipRaw( zipFile file, uLong uncompressed_size, uLong crc32 ); - - -/* - Close the zipfile -*/ -extern int zipClose( zipFile file, const char* global_comment ); +// DG: all the zip access stuff from minizip is now in minizip/zip.h +#include "minizip/zip.h" /* diff --git a/neo/framework/minizip/MiniZip64_info.txt b/neo/framework/minizip/MiniZip64_info.txt index 09513213..78c06059 100644 --- a/neo/framework/minizip/MiniZip64_info.txt +++ b/neo/framework/minizip/MiniZip64_info.txt @@ -1,7 +1,7 @@ NOTE from Daniel Gibson: -These are parts of MiniZip (the unzip-parts), taken from zlib-1.2.7/contrib/minizip/ -and adjusted for doom3 by making small adjustments foor doom3 (doom3-specific allocator) +These are parts of MiniZip, taken from zlib-1.2.7/contrib/minizip/ +and adjusted for doom3 by making small adjustments for doom3 (doom3-specific allocator) and adding a function (unzReOpen()) from the original Doom3 GPL release by id Software that used MiniZip 0.15beta. It was adjusted by Daniel Gibson for MiniZip 1.1 Copyright (C) 1999-2011 id Software LLC, a ZeniMax Media company. diff --git a/neo/framework/minizip/zip.cpp b/neo/framework/minizip/zip.cpp new file mode 100644 index 00000000..a97d02cd --- /dev/null +++ b/neo/framework/minizip/zip.cpp @@ -0,0 +1,2036 @@ +/* + this is from zlib-1.2.7/contrib/minizip/ + + zip.c -- IO on .zip files using zlib + Version 1.1, February 14h, 2010 + part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) + + Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) + + Modifications for Zip64 support + Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) + + For more info read MiniZip_info.txt + + Changes + Oct-2009 - Mathias Svensson - Remove old C style function prototypes + Oct-2009 - Mathias Svensson - Added Zip64 Support when creating new file archives + Oct-2009 - Mathias Svensson - Did some code cleanup and refactoring to get better overview of some functions. + Oct-2009 - Mathias Svensson - Added zipRemoveExtraInfoBlock to strip extra field data from its ZIP64 data + It is used when recreting zip archive with RAW when deleting items from a zip. + ZIP64 data is automaticly added to items that needs it, and existing ZIP64 data need to be removed. + Oct-2009 - Mathias Svensson - Added support for BZIP2 as compression mode (bzip2 lib is required) + Jan-2010 - back to unzip and minizip 1.0 name scheme, with compatibility layer + + #################################################################################### + +DG: The file was renamed from zip.c to zip.cpp so we can use C++ functions from Doom3, furthermore we use doom3 headers + instead of system headers and Doom3's Mem_Alloc() and Mem_Free() instead of malloc() and free() + Other than that, there are no real changes to the original file. + +*/ + +// DG: add the precompiled.h beast.. +#include "precompiled.h" +#pragma hdrstop +// DG end + +#if 0 // we don't really want system includes here +#include +#include +#include +#include +#include "zlib.h" +#include "zip.h" + +#ifdef STDC +# include +# include +# include +#endif +#ifdef NO_ERRNO_H + extern int errno; +#else +# include +#endif + +#else // 0 + +// we don't need crypt support +#define NOCRYPT 1 + +#include "zip.h" +#endif // 0 + +#ifndef local +# define local static +#endif +/* compile with -Dlocal if your debugger can't find static symbols */ + +#ifndef VERSIONMADEBY +# define VERSIONMADEBY (0x0) /* platform depedent */ +#endif + +#ifndef Z_BUFSIZE +#define Z_BUFSIZE (64*1024) //(16384) +#endif + +#ifndef Z_MAXFILENAMEINZIP +#define Z_MAXFILENAMEINZIP (256) +#endif + +#if 0 // don't use system malloc but doom3's allocator +#ifndef ALLOC +# define ALLOC(size) (malloc(size)) +#endif +#ifndef TRYFREE +# define TRYFREE(p) {if (p) free(p);} +#endif +#else // 0 +#define ALLOC(size) (Mem_Alloc(size, TAG_IDFILE)) +#define TRYFREE(p) {Mem_Free(p);} // Mem_Free - as well as free() - check for NULL themselves, no need to do it here +#endif // 0 + +/* +#define SIZECENTRALDIRITEM (0x2e) +#define SIZEZIPLOCALHEADER (0x1e) +*/ + +/* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */ + + +// NOT sure that this work on ALL platform +#define MAKEULONG64(a, b) ((ZPOS64_T)(((unsigned long)(a)) | ((ZPOS64_T)((unsigned long)(b))) << 32)) + +#ifndef SEEK_CUR +#define SEEK_CUR 1 +#endif + +#ifndef SEEK_END +#define SEEK_END 2 +#endif + +#ifndef SEEK_SET +#define SEEK_SET 0 +#endif + +#ifndef DEF_MEM_LEVEL +#if MAX_MEM_LEVEL >= 8 +# define DEF_MEM_LEVEL 8 +#else +# define DEF_MEM_LEVEL MAX_MEM_LEVEL +#endif +#endif +const char zip_copyright[] =" zip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll"; + + +#define SIZEDATA_INDATABLOCK (4096-(4*4)) + +#define LOCALHEADERMAGIC (0x04034b50) +#define CENTRALHEADERMAGIC (0x02014b50) +#define ENDHEADERMAGIC (0x06054b50) +#define ZIP64ENDHEADERMAGIC (0x6064b50) +#define ZIP64ENDLOCHEADERMAGIC (0x7064b50) + +#define FLAG_LOCALHEADER_OFFSET (0x06) +#define CRC_LOCALHEADER_OFFSET (0x0e) + +#define SIZECENTRALHEADER (0x2e) /* 46 */ + +typedef struct linkedlist_datablock_internal_s +{ + struct linkedlist_datablock_internal_s* next_datablock; + uLong avail_in_this_block; + uLong filled_in_this_block; + uLong unused; /* for future use and alignement */ + unsigned char data[SIZEDATA_INDATABLOCK]; +} linkedlist_datablock_internal; + +typedef struct linkedlist_data_s +{ + linkedlist_datablock_internal* first_block; + linkedlist_datablock_internal* last_block; +} linkedlist_data; + + +typedef struct +{ + z_stream stream; /* zLib stream structure for inflate */ +#ifdef HAVE_BZIP2 + bz_stream bstream; /* bzLib stream structure for bziped */ +#endif + + int stream_initialised; /* 1 is stream is initialised */ + uInt pos_in_buffered_data; /* last written byte in buffered_data */ + + ZPOS64_T pos_local_header; /* offset of the local header of the file + currenty writing */ + char* central_header; /* central header data for the current file */ + uLong size_centralExtra; + uLong size_centralheader; /* size of the central header for cur file */ + uLong size_centralExtraFree; /* Extra bytes allocated to the centralheader but that are not used */ + uLong flag; /* flag of the file currently writing */ + + int method; /* compression method of file currenty wr.*/ + int raw; /* 1 for directly writing raw data */ + Byte buffered_data[Z_BUFSIZE];/* buffer contain compressed data to be writ*/ + uLong dosDate; + uLong crc32; + int encrypt; + int zip64; /* Add ZIP64 extened information in the extra field */ + ZPOS64_T pos_zip64extrainfo; + ZPOS64_T totalCompressedData; + ZPOS64_T totalUncompressedData; +#ifndef NOCRYPT + unsigned long keys[3]; /* keys defining the pseudo-random sequence */ + const unsigned long* pcrc_32_tab; + int crypt_header_size; +#endif +} curfile64_info; + +typedef struct +{ + zlib_filefunc64_32_def z_filefunc; + voidpf filestream; /* io structore of the zipfile */ + linkedlist_data central_dir;/* datablock with central dir in construction*/ + int in_opened_file_inzip; /* 1 if a file in the zip is currently writ.*/ + curfile64_info ci; /* info on the file curretly writing */ + + ZPOS64_T begin_pos; /* position of the beginning of the zipfile */ + ZPOS64_T add_position_when_writting_offset; + ZPOS64_T number_entry; + +#ifndef NO_ADDFILEINEXISTINGZIP + char *globalcomment; +#endif + +} zip64_internal; + + +#ifndef NOCRYPT +#define INCLUDECRYPTINGCODE_IFCRYPTALLOWED +#include "crypt.h" +#endif + +local linkedlist_datablock_internal* allocate_new_datablock() +{ + linkedlist_datablock_internal* ldi; + ldi = (linkedlist_datablock_internal*) + ALLOC(sizeof(linkedlist_datablock_internal)); + if (ldi!=NULL) + { + ldi->next_datablock = NULL ; + ldi->filled_in_this_block = 0 ; + ldi->avail_in_this_block = SIZEDATA_INDATABLOCK ; + } + return ldi; +} + +local void free_datablock(linkedlist_datablock_internal* ldi) +{ + while (ldi!=NULL) + { + linkedlist_datablock_internal* ldinext = ldi->next_datablock; + TRYFREE(ldi); + ldi = ldinext; + } +} + +local void init_linkedlist(linkedlist_data* ll) +{ + ll->first_block = ll->last_block = NULL; +} + +local void free_linkedlist(linkedlist_data* ll) +{ + free_datablock(ll->first_block); + ll->first_block = ll->last_block = NULL; +} + + +local int add_data_in_datablock(linkedlist_data* ll, const void* buf, uLong len) +{ + linkedlist_datablock_internal* ldi; + const unsigned char* from_copy; + + if (ll==NULL) + return ZIP_INTERNALERROR; + + if (ll->last_block == NULL) + { + ll->first_block = ll->last_block = allocate_new_datablock(); + if (ll->first_block == NULL) + return ZIP_INTERNALERROR; + } + + ldi = ll->last_block; + from_copy = (unsigned char*)buf; + + while (len>0) + { + uInt copy_this; + uInt i; + unsigned char* to_copy; + + if (ldi->avail_in_this_block==0) + { + ldi->next_datablock = allocate_new_datablock(); + if (ldi->next_datablock == NULL) + return ZIP_INTERNALERROR; + ldi = ldi->next_datablock ; + ll->last_block = ldi; + } + + if (ldi->avail_in_this_block < len) + copy_this = (uInt)ldi->avail_in_this_block; + else + copy_this = (uInt)len; + + to_copy = &(ldi->data[ldi->filled_in_this_block]); + + for (i=0;ifilled_in_this_block += copy_this; + ldi->avail_in_this_block -= copy_this; + from_copy += copy_this ; + len -= copy_this; + } + return ZIP_OK; +} + + + +/****************************************************************************/ + +#ifndef NO_ADDFILEINEXISTINGZIP +/* =========================================================================== + Inputs a long in LSB order to the given file + nbByte == 1, 2 ,4 or 8 (byte, short or long, ZPOS64_T) +*/ + +local int zip64local_putValue OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T x, int nbByte)); +local int zip64local_putValue (const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T x, int nbByte) +{ + unsigned char buf[8]; + int n; + for (n = 0; n < nbByte; n++) + { + buf[n] = (unsigned char)(x & 0xff); + x >>= 8; + } + if (x != 0) + { /* data overflow - hack for ZIP64 (X Roche) */ + for (n = 0; n < nbByte; n++) + { + buf[n] = 0xff; + } + } + + if (ZWRITE64(*pzlib_filefunc_def,filestream,buf,nbByte)!=(uLong)nbByte) + return ZIP_ERRNO; + else + return ZIP_OK; +} + +local void zip64local_putValue_inmemory OF((void* dest, ZPOS64_T x, int nbByte)); +local void zip64local_putValue_inmemory (void* dest, ZPOS64_T x, int nbByte) +{ + unsigned char* buf=(unsigned char*)dest; + int n; + for (n = 0; n < nbByte; n++) { + buf[n] = (unsigned char)(x & 0xff); + x >>= 8; + } + + if (x != 0) + { /* data overflow - hack for ZIP64 */ + for (n = 0; n < nbByte; n++) + { + buf[n] = 0xff; + } + } +} + +/****************************************************************************/ + + +local uLong zip64local_TmzDateToDosDate(const tm_zip* ptm) +{ + uLong year = (uLong)ptm->tm_year; + if (year>=1980) + year-=1980; + else if (year>=80) + year-=80; + return + (uLong) (((ptm->tm_mday) + (32 * (ptm->tm_mon+1)) + (512 * year)) << 16) | + ((ptm->tm_sec/2) + (32* ptm->tm_min) + (2048 * (uLong)ptm->tm_hour)); +} + + +/****************************************************************************/ + +local int zip64local_getByte OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, int *pi)); + +local int zip64local_getByte(const zlib_filefunc64_32_def* pzlib_filefunc_def,voidpf filestream,int* pi) +{ + unsigned char c; + int err = (int)ZREAD64(*pzlib_filefunc_def,filestream,&c,1); + if (err==1) + { + *pi = (int)c; + return ZIP_OK; + } + else + { + if (ZERROR64(*pzlib_filefunc_def,filestream)) + return ZIP_ERRNO; + else + return ZIP_EOF; + } +} + + +/* =========================================================================== + Reads a long in LSB order from the given gz_stream. Sets +*/ +local int zip64local_getShort OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong *pX)); + +local int zip64local_getShort (const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong* pX) +{ + uLong x ; + int i = 0; + int err; + + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x = (uLong)i; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((uLong)i)<<8; + + if (err==ZIP_OK) + *pX = x; + else + *pX = 0; + return err; +} + +local int zip64local_getLong OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong *pX)); + +local int zip64local_getLong (const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong* pX) +{ + uLong x ; + int i = 0; + int err; + + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x = (uLong)i; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((uLong)i)<<8; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((uLong)i)<<16; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((uLong)i)<<24; + + if (err==ZIP_OK) + *pX = x; + else + *pX = 0; + return err; +} + +local int zip64local_getLong64 OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T *pX)); + + +local int zip64local_getLong64 (const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T *pX) +{ + ZPOS64_T x; + int i = 0; + int err; + + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x = (ZPOS64_T)i; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((ZPOS64_T)i)<<8; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((ZPOS64_T)i)<<16; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((ZPOS64_T)i)<<24; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((ZPOS64_T)i)<<32; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((ZPOS64_T)i)<<40; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((ZPOS64_T)i)<<48; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((ZPOS64_T)i)<<56; + + if (err==ZIP_OK) + *pX = x; + else + *pX = 0; + + return err; +} + +#ifndef BUFREADCOMMENT +#define BUFREADCOMMENT (0x400) +#endif +/* + Locate the Central directory of a zipfile (at the end, just before + the global comment) +*/ +local ZPOS64_T zip64local_SearchCentralDir OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream)); + +local ZPOS64_T zip64local_SearchCentralDir(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream) +{ + unsigned char* buf; + ZPOS64_T uSizeFile; + ZPOS64_T uBackRead; + ZPOS64_T uMaxBack=0xffff; /* maximum size of global comment */ + ZPOS64_T uPosFound=0; + + if (ZSEEK64(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0) + return 0; + + + uSizeFile = ZTELL64(*pzlib_filefunc_def,filestream); + + if (uMaxBack>uSizeFile) + uMaxBack = uSizeFile; + + buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4); + if (buf==NULL) + return 0; + + uBackRead = 4; + while (uBackReaduMaxBack) + uBackRead = uMaxBack; + else + uBackRead+=BUFREADCOMMENT; + uReadPos = uSizeFile-uBackRead ; + + uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ? + (BUFREADCOMMENT+4) : (uLong)(uSizeFile-uReadPos); + if (ZSEEK64(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0) + break; + + if (ZREAD64(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize) + break; + + for (i=(int)uReadSize-3; (i--)>0;) + if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && + ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06)) + { + uPosFound = uReadPos+i; + break; + } + + if (uPosFound!=0) + break; + } + TRYFREE(buf); + return uPosFound; +} + +/* +Locate the End of Zip64 Central directory locator and from there find the CD of a zipfile (at the end, just before +the global comment) +*/ +local ZPOS64_T zip64local_SearchCentralDir64 OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream)); + +local ZPOS64_T zip64local_SearchCentralDir64(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream) +{ + unsigned char* buf; + ZPOS64_T uSizeFile; + ZPOS64_T uBackRead; + ZPOS64_T uMaxBack=0xffff; /* maximum size of global comment */ + ZPOS64_T uPosFound=0; + uLong uL; + ZPOS64_T relativeOffset; + + if (ZSEEK64(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0) + return 0; + + uSizeFile = ZTELL64(*pzlib_filefunc_def,filestream); + + if (uMaxBack>uSizeFile) + uMaxBack = uSizeFile; + + buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4); + if (buf==NULL) + return 0; + + uBackRead = 4; + while (uBackReaduMaxBack) + uBackRead = uMaxBack; + else + uBackRead+=BUFREADCOMMENT; + uReadPos = uSizeFile-uBackRead ; + + uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ? + (BUFREADCOMMENT+4) : (uLong)(uSizeFile-uReadPos); + if (ZSEEK64(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0) + break; + + if (ZREAD64(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize) + break; + + for (i=(int)uReadSize-3; (i--)>0;) + { + // Signature "0x07064b50" Zip64 end of central directory locater + if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && ((*(buf+i+2))==0x06) && ((*(buf+i+3))==0x07)) + { + uPosFound = uReadPos+i; + break; + } + } + + if (uPosFound!=0) + break; + } + + TRYFREE(buf); + if (uPosFound == 0) + return 0; + + /* Zip64 end of central directory locator */ + if (ZSEEK64(*pzlib_filefunc_def,filestream, uPosFound,ZLIB_FILEFUNC_SEEK_SET)!=0) + return 0; + + /* the signature, already checked */ + if (zip64local_getLong(pzlib_filefunc_def,filestream,&uL)!=ZIP_OK) + return 0; + + /* number of the disk with the start of the zip64 end of central directory */ + if (zip64local_getLong(pzlib_filefunc_def,filestream,&uL)!=ZIP_OK) + return 0; + if (uL != 0) + return 0; + + /* relative offset of the zip64 end of central directory record */ + if (zip64local_getLong64(pzlib_filefunc_def,filestream,&relativeOffset)!=ZIP_OK) + return 0; + + /* total number of disks */ + if (zip64local_getLong(pzlib_filefunc_def,filestream,&uL)!=ZIP_OK) + return 0; + if (uL != 1) + return 0; + + /* Goto Zip64 end of central directory record */ + if (ZSEEK64(*pzlib_filefunc_def,filestream, relativeOffset,ZLIB_FILEFUNC_SEEK_SET)!=0) + return 0; + + /* the signature */ + if (zip64local_getLong(pzlib_filefunc_def,filestream,&uL)!=ZIP_OK) + return 0; + + if (uL != 0x06064b50) // signature of 'Zip64 end of central directory' + return 0; + + return relativeOffset; +} + +int LoadCentralDirectoryRecord(zip64_internal* pziinit) +{ + int err=ZIP_OK; + ZPOS64_T byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ + + ZPOS64_T size_central_dir; /* size of the central directory */ + ZPOS64_T offset_central_dir; /* offset of start of central directory */ + ZPOS64_T central_pos; + uLong uL; + + uLong number_disk; /* number of the current dist, used for + spaning ZIP, unsupported, always 0*/ + uLong number_disk_with_CD; /* number the the disk with central dir, used + for spaning ZIP, unsupported, always 0*/ + ZPOS64_T number_entry; + ZPOS64_T number_entry_CD; /* total number of entries in + the central dir + (same than number_entry on nospan) */ + uLong VersionMadeBy; + uLong VersionNeeded; + uLong size_comment; + + int hasZIP64Record = 0; + + // check first if we find a ZIP64 record + central_pos = zip64local_SearchCentralDir64(&pziinit->z_filefunc,pziinit->filestream); + if(central_pos > 0) + { + hasZIP64Record = 1; + } + else if(central_pos == 0) + { + central_pos = zip64local_SearchCentralDir(&pziinit->z_filefunc,pziinit->filestream); + } + +/* disable to allow appending to empty ZIP archive + if (central_pos==0) + err=ZIP_ERRNO; +*/ + + if(hasZIP64Record) + { + ZPOS64_T sizeEndOfCentralDirectory; + if (ZSEEK64(pziinit->z_filefunc, pziinit->filestream, central_pos, ZLIB_FILEFUNC_SEEK_SET) != 0) + err=ZIP_ERRNO; + + /* the signature, already checked */ + if (zip64local_getLong(&pziinit->z_filefunc, pziinit->filestream,&uL)!=ZIP_OK) + err=ZIP_ERRNO; + + /* size of zip64 end of central directory record */ + if (zip64local_getLong64(&pziinit->z_filefunc, pziinit->filestream, &sizeEndOfCentralDirectory)!=ZIP_OK) + err=ZIP_ERRNO; + + /* version made by */ + if (zip64local_getShort(&pziinit->z_filefunc, pziinit->filestream, &VersionMadeBy)!=ZIP_OK) + err=ZIP_ERRNO; + + /* version needed to extract */ + if (zip64local_getShort(&pziinit->z_filefunc, pziinit->filestream, &VersionNeeded)!=ZIP_OK) + err=ZIP_ERRNO; + + /* number of this disk */ + if (zip64local_getLong(&pziinit->z_filefunc, pziinit->filestream,&number_disk)!=ZIP_OK) + err=ZIP_ERRNO; + + /* number of the disk with the start of the central directory */ + if (zip64local_getLong(&pziinit->z_filefunc, pziinit->filestream,&number_disk_with_CD)!=ZIP_OK) + err=ZIP_ERRNO; + + /* total number of entries in the central directory on this disk */ + if (zip64local_getLong64(&pziinit->z_filefunc, pziinit->filestream, &number_entry)!=ZIP_OK) + err=ZIP_ERRNO; + + /* total number of entries in the central directory */ + if (zip64local_getLong64(&pziinit->z_filefunc, pziinit->filestream,&number_entry_CD)!=ZIP_OK) + err=ZIP_ERRNO; + + if ((number_entry_CD!=number_entry) || (number_disk_with_CD!=0) || (number_disk!=0)) + err=ZIP_BADZIPFILE; + + /* size of the central directory */ + if (zip64local_getLong64(&pziinit->z_filefunc, pziinit->filestream,&size_central_dir)!=ZIP_OK) + err=ZIP_ERRNO; + + /* offset of start of central directory with respect to the + starting disk number */ + if (zip64local_getLong64(&pziinit->z_filefunc, pziinit->filestream,&offset_central_dir)!=ZIP_OK) + err=ZIP_ERRNO; + + // TODO.. + // read the comment from the standard central header. + size_comment = 0; + } + else + { + // Read End of central Directory info + if (ZSEEK64(pziinit->z_filefunc, pziinit->filestream, central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0) + err=ZIP_ERRNO; + + /* the signature, already checked */ + if (zip64local_getLong(&pziinit->z_filefunc, pziinit->filestream,&uL)!=ZIP_OK) + err=ZIP_ERRNO; + + /* number of this disk */ + if (zip64local_getShort(&pziinit->z_filefunc, pziinit->filestream,&number_disk)!=ZIP_OK) + err=ZIP_ERRNO; + + /* number of the disk with the start of the central directory */ + if (zip64local_getShort(&pziinit->z_filefunc, pziinit->filestream,&number_disk_with_CD)!=ZIP_OK) + err=ZIP_ERRNO; + + /* total number of entries in the central dir on this disk */ + number_entry = 0; + if (zip64local_getShort(&pziinit->z_filefunc, pziinit->filestream, &uL)!=ZIP_OK) + err=ZIP_ERRNO; + else + number_entry = uL; + + /* total number of entries in the central dir */ + number_entry_CD = 0; + if (zip64local_getShort(&pziinit->z_filefunc, pziinit->filestream, &uL)!=ZIP_OK) + err=ZIP_ERRNO; + else + number_entry_CD = uL; + + if ((number_entry_CD!=number_entry) || (number_disk_with_CD!=0) || (number_disk!=0)) + err=ZIP_BADZIPFILE; + + /* size of the central directory */ + size_central_dir = 0; + if (zip64local_getLong(&pziinit->z_filefunc, pziinit->filestream, &uL)!=ZIP_OK) + err=ZIP_ERRNO; + else + size_central_dir = uL; + + /* offset of start of central directory with respect to the starting disk number */ + offset_central_dir = 0; + if (zip64local_getLong(&pziinit->z_filefunc, pziinit->filestream, &uL)!=ZIP_OK) + err=ZIP_ERRNO; + else + offset_central_dir = uL; + + + /* zipfile global comment length */ + if (zip64local_getShort(&pziinit->z_filefunc, pziinit->filestream, &size_comment)!=ZIP_OK) + err=ZIP_ERRNO; + } + + if ((central_posz_filefunc, pziinit->filestream); + return ZIP_ERRNO; + } + + if (size_comment>0) + { + pziinit->globalcomment = (char*)ALLOC(size_comment+1); + if (pziinit->globalcomment) + { + size_comment = ZREAD64(pziinit->z_filefunc, pziinit->filestream, pziinit->globalcomment,size_comment); + pziinit->globalcomment[size_comment]=0; + } + } + + byte_before_the_zipfile = central_pos - (offset_central_dir+size_central_dir); + pziinit->add_position_when_writting_offset = byte_before_the_zipfile; + + { + ZPOS64_T size_central_dir_to_read = size_central_dir; + size_t buf_size = SIZEDATA_INDATABLOCK; + void* buf_read = (void*)ALLOC(buf_size); + if (ZSEEK64(pziinit->z_filefunc, pziinit->filestream, offset_central_dir + byte_before_the_zipfile, ZLIB_FILEFUNC_SEEK_SET) != 0) + err=ZIP_ERRNO; + + while ((size_central_dir_to_read>0) && (err==ZIP_OK)) + { + ZPOS64_T read_this = SIZEDATA_INDATABLOCK; + if (read_this > size_central_dir_to_read) + read_this = size_central_dir_to_read; + + if (ZREAD64(pziinit->z_filefunc, pziinit->filestream,buf_read,(uLong)read_this) != read_this) + err=ZIP_ERRNO; + + if (err==ZIP_OK) + err = add_data_in_datablock(&pziinit->central_dir,buf_read, (uLong)read_this); + + size_central_dir_to_read-=read_this; + } + TRYFREE(buf_read); + } + pziinit->begin_pos = byte_before_the_zipfile; + pziinit->number_entry = number_entry_CD; + + if (ZSEEK64(pziinit->z_filefunc, pziinit->filestream, offset_central_dir+byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET) != 0) + err=ZIP_ERRNO; + + return err; +} + + +#endif /* !NO_ADDFILEINEXISTINGZIP*/ + + +/************************************************************/ +extern zipFile ZEXPORT zipOpen3 (const void *pathname, int append, zipcharpc* globalcomment, zlib_filefunc64_32_def* pzlib_filefunc64_32_def) +{ + zip64_internal ziinit; + zip64_internal* zi; + int err=ZIP_OK; + + ziinit.z_filefunc.zseek32_file = NULL; + ziinit.z_filefunc.ztell32_file = NULL; + if (pzlib_filefunc64_32_def==NULL) + fill_fopen64_filefunc(&ziinit.z_filefunc.zfile_func64); + else + ziinit.z_filefunc = *pzlib_filefunc64_32_def; + + ziinit.filestream = ZOPEN64(ziinit.z_filefunc, + pathname, + (append == APPEND_STATUS_CREATE) ? + (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_CREATE) : + (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_EXISTING)); + + if (ziinit.filestream == NULL) + return NULL; + + if (append == APPEND_STATUS_CREATEAFTER) + ZSEEK64(ziinit.z_filefunc,ziinit.filestream,0,SEEK_END); + + ziinit.begin_pos = ZTELL64(ziinit.z_filefunc,ziinit.filestream); + ziinit.in_opened_file_inzip = 0; + ziinit.ci.stream_initialised = 0; + ziinit.number_entry = 0; + ziinit.add_position_when_writting_offset = 0; + init_linkedlist(&(ziinit.central_dir)); + + + + zi = (zip64_internal*)ALLOC(sizeof(zip64_internal)); + if (zi==NULL) + { + ZCLOSE64(ziinit.z_filefunc,ziinit.filestream); + return NULL; + } + + /* now we add file in a zipfile */ +# ifndef NO_ADDFILEINEXISTINGZIP + ziinit.globalcomment = NULL; + if (append == APPEND_STATUS_ADDINZIP) + { + // Read and Cache Central Directory Records + err = LoadCentralDirectoryRecord(&ziinit); + } + + if (globalcomment) + { + *globalcomment = ziinit.globalcomment; + } +# endif /* !NO_ADDFILEINEXISTINGZIP*/ + + if (err != ZIP_OK) + { +# ifndef NO_ADDFILEINEXISTINGZIP + TRYFREE(ziinit.globalcomment); +# endif /* !NO_ADDFILEINEXISTINGZIP*/ + TRYFREE(zi); + return NULL; + } + else + { + *zi = ziinit; + return (zipFile)zi; + } +} + +extern zipFile ZEXPORT zipOpen2 (const char *pathname, int append, zipcharpc* globalcomment, zlib_filefunc_def* pzlib_filefunc32_def) +{ + if (pzlib_filefunc32_def != NULL) + { + zlib_filefunc64_32_def zlib_filefunc64_32_def_fill; + fill_zlib_filefunc64_32_def_from_filefunc32(&zlib_filefunc64_32_def_fill,pzlib_filefunc32_def); + return zipOpen3(pathname, append, globalcomment, &zlib_filefunc64_32_def_fill); + } + else + return zipOpen3(pathname, append, globalcomment, NULL); +} + +extern zipFile ZEXPORT zipOpen2_64 (const void *pathname, int append, zipcharpc* globalcomment, zlib_filefunc64_def* pzlib_filefunc_def) +{ + if (pzlib_filefunc_def != NULL) + { + zlib_filefunc64_32_def zlib_filefunc64_32_def_fill; + zlib_filefunc64_32_def_fill.zfile_func64 = *pzlib_filefunc_def; + zlib_filefunc64_32_def_fill.ztell32_file = NULL; + zlib_filefunc64_32_def_fill.zseek32_file = NULL; + return zipOpen3(pathname, append, globalcomment, &zlib_filefunc64_32_def_fill); + } + else + return zipOpen3(pathname, append, globalcomment, NULL); +} + + + +extern zipFile ZEXPORT zipOpen (const char* pathname, int append) +{ + return zipOpen3((const void*)pathname,append,NULL,NULL); +} + +extern zipFile ZEXPORT zipOpen64 (const void* pathname, int append) +{ + return zipOpen3(pathname,append,NULL,NULL); +} + +int Write_LocalFileHeader(zip64_internal* zi, const char* filename, uInt size_extrafield_local, const void* extrafield_local) +{ + /* write the local header */ + int err; + uInt size_filename = (uInt)strlen(filename); + uInt size_extrafield = size_extrafield_local; + + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)LOCALHEADERMAGIC, 4); + + if (err==ZIP_OK) + { + if(zi->ci.zip64) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)45,2);/* version needed to extract */ + else + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)20,2);/* version needed to extract */ + } + + if (err==ZIP_OK) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.flag,2); + + if (err==ZIP_OK) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.method,2); + + if (err==ZIP_OK) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.dosDate,4); + + // CRC / Compressed size / Uncompressed size will be filled in later and rewritten later + if (err==ZIP_OK) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* crc 32, unknown */ + if (err==ZIP_OK) + { + if(zi->ci.zip64) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0xFFFFFFFF,4); /* compressed size, unknown */ + else + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* compressed size, unknown */ + } + if (err==ZIP_OK) + { + if(zi->ci.zip64) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0xFFFFFFFF,4); /* uncompressed size, unknown */ + else + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* uncompressed size, unknown */ + } + + if (err==ZIP_OK) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_filename,2); + + if(zi->ci.zip64) + { + size_extrafield += 20; + } + + if (err==ZIP_OK) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_extrafield,2); + + if ((err==ZIP_OK) && (size_filename > 0)) + { + if (ZWRITE64(zi->z_filefunc,zi->filestream,filename,size_filename)!=size_filename) + err = ZIP_ERRNO; + } + + if ((err==ZIP_OK) && (size_extrafield_local > 0)) + { + if (ZWRITE64(zi->z_filefunc, zi->filestream, extrafield_local, size_extrafield_local) != size_extrafield_local) + err = ZIP_ERRNO; + } + + + if ((err==ZIP_OK) && (zi->ci.zip64)) + { + // write the Zip64 extended info + short HeaderID = 1; + short DataSize = 16; + ZPOS64_T CompressedSize = 0; + ZPOS64_T UncompressedSize = 0; + + // Remember position of Zip64 extended info for the local file header. (needed when we update size after done with file) + zi->ci.pos_zip64extrainfo = ZTELL64(zi->z_filefunc,zi->filestream); + + err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (short)HeaderID,2); + err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (short)DataSize,2); + + err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (ZPOS64_T)UncompressedSize,8); + err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (ZPOS64_T)CompressedSize,8); + } + + return err; +} + +/* + NOTE. + When writing RAW the ZIP64 extended information in extrafield_local and extrafield_global needs to be stripped + before calling this function it can be done with zipRemoveExtraInfoBlock + + It is not done here because then we need to realloc a new buffer since parameters are 'const' and I want to minimize + unnecessary allocations. + */ +extern int ZEXPORT zipOpenNewFileInZip4_64 (zipFile file, const char* filename, const zip_fileinfo* zipfi, + const void* extrafield_local, uInt size_extrafield_local, + const void* extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level, int raw, + int windowBits,int memLevel, int strategy, + const char* password, uLong crcForCrypting, + uLong versionMadeBy, uLong flagBase, int zip64) +{ + zip64_internal* zi; + uInt size_filename; + uInt size_comment; + uInt i; + int err = ZIP_OK; + +# ifdef NOCRYPT + (crcForCrypting); + if (password != NULL) + return ZIP_PARAMERROR; +# endif + + if (file == NULL) + return ZIP_PARAMERROR; + +#ifdef HAVE_BZIP2 + if ((method!=0) && (method!=Z_DEFLATED) && (method!=Z_BZIP2ED)) + return ZIP_PARAMERROR; +#else + if ((method!=0) && (method!=Z_DEFLATED)) + return ZIP_PARAMERROR; +#endif + + zi = (zip64_internal*)file; + + if (zi->in_opened_file_inzip == 1) + { + err = zipCloseFileInZip (file); + if (err != ZIP_OK) + return err; + } + + if (filename==NULL) + filename="-"; + + if (comment==NULL) + size_comment = 0; + else + size_comment = (uInt)strlen(comment); + + size_filename = (uInt)strlen(filename); + + if (zipfi == NULL) + zi->ci.dosDate = 0; + else + { + if (zipfi->dosDate != 0) + zi->ci.dosDate = zipfi->dosDate; + else + zi->ci.dosDate = zip64local_TmzDateToDosDate(&zipfi->tmz_date); + } + + zi->ci.flag = flagBase; + if ((level==8) || (level==9)) + zi->ci.flag |= 2; + if (level==2) + zi->ci.flag |= 4; + if (level==1) + zi->ci.flag |= 6; + if (password != NULL) + zi->ci.flag |= 1; + + zi->ci.crc32 = 0; + zi->ci.method = method; + zi->ci.encrypt = 0; + zi->ci.stream_initialised = 0; + zi->ci.pos_in_buffered_data = 0; + zi->ci.raw = raw; + zi->ci.pos_local_header = ZTELL64(zi->z_filefunc,zi->filestream); + + zi->ci.size_centralheader = SIZECENTRALHEADER + size_filename + size_extrafield_global + size_comment; + zi->ci.size_centralExtraFree = 32; // Extra space we have reserved in case we need to add ZIP64 extra info data + + zi->ci.central_header = (char*)ALLOC((uInt)zi->ci.size_centralheader + zi->ci.size_centralExtraFree); + + zi->ci.size_centralExtra = size_extrafield_global; + zip64local_putValue_inmemory(zi->ci.central_header,(uLong)CENTRALHEADERMAGIC,4); + /* version info */ + zip64local_putValue_inmemory(zi->ci.central_header+4,(uLong)versionMadeBy,2); + zip64local_putValue_inmemory(zi->ci.central_header+6,(uLong)20,2); + zip64local_putValue_inmemory(zi->ci.central_header+8,(uLong)zi->ci.flag,2); + zip64local_putValue_inmemory(zi->ci.central_header+10,(uLong)zi->ci.method,2); + zip64local_putValue_inmemory(zi->ci.central_header+12,(uLong)zi->ci.dosDate,4); + zip64local_putValue_inmemory(zi->ci.central_header+16,(uLong)0,4); /*crc*/ + zip64local_putValue_inmemory(zi->ci.central_header+20,(uLong)0,4); /*compr size*/ + zip64local_putValue_inmemory(zi->ci.central_header+24,(uLong)0,4); /*uncompr size*/ + zip64local_putValue_inmemory(zi->ci.central_header+28,(uLong)size_filename,2); + zip64local_putValue_inmemory(zi->ci.central_header+30,(uLong)size_extrafield_global,2); + zip64local_putValue_inmemory(zi->ci.central_header+32,(uLong)size_comment,2); + zip64local_putValue_inmemory(zi->ci.central_header+34,(uLong)0,2); /*disk nm start*/ + + if (zipfi==NULL) + zip64local_putValue_inmemory(zi->ci.central_header+36,(uLong)0,2); + else + zip64local_putValue_inmemory(zi->ci.central_header+36,(uLong)zipfi->internal_fa,2); + + if (zipfi==NULL) + zip64local_putValue_inmemory(zi->ci.central_header+38,(uLong)0,4); + else + zip64local_putValue_inmemory(zi->ci.central_header+38,(uLong)zipfi->external_fa,4); + + if(zi->ci.pos_local_header >= 0xffffffff) + zip64local_putValue_inmemory(zi->ci.central_header+42,(uLong)0xffffffff,4); + else + zip64local_putValue_inmemory(zi->ci.central_header+42,(uLong)zi->ci.pos_local_header - zi->add_position_when_writting_offset,4); + + for (i=0;ici.central_header+SIZECENTRALHEADER+i) = *(filename+i); + + for (i=0;ici.central_header+SIZECENTRALHEADER+size_filename+i) = + *(((const char*)extrafield_global)+i); + + for (i=0;ici.central_header+SIZECENTRALHEADER+size_filename+ + size_extrafield_global+i) = *(comment+i); + if (zi->ci.central_header == NULL) + return ZIP_INTERNALERROR; + + zi->ci.zip64 = zip64; + zi->ci.totalCompressedData = 0; + zi->ci.totalUncompressedData = 0; + zi->ci.pos_zip64extrainfo = 0; + + err = Write_LocalFileHeader(zi, filename, size_extrafield_local, extrafield_local); + +#ifdef HAVE_BZIP2 + zi->ci.bstream.avail_in = (uInt)0; + zi->ci.bstream.avail_out = (uInt)Z_BUFSIZE; + zi->ci.bstream.next_out = (char*)zi->ci.buffered_data; + zi->ci.bstream.total_in_hi32 = 0; + zi->ci.bstream.total_in_lo32 = 0; + zi->ci.bstream.total_out_hi32 = 0; + zi->ci.bstream.total_out_lo32 = 0; +#endif + + zi->ci.stream.avail_in = (uInt)0; + zi->ci.stream.avail_out = (uInt)Z_BUFSIZE; + zi->ci.stream.next_out = zi->ci.buffered_data; + zi->ci.stream.total_in = 0; + zi->ci.stream.total_out = 0; + zi->ci.stream.data_type = Z_BINARY; + +#ifdef HAVE_BZIP2 + if ((err==ZIP_OK) && (zi->ci.method == Z_DEFLATED || zi->ci.method == Z_BZIP2ED) && (!zi->ci.raw)) +#else + if ((err==ZIP_OK) && (zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) +#endif + { + if(zi->ci.method == Z_DEFLATED) + { + zi->ci.stream.zalloc = (alloc_func)0; + zi->ci.stream.zfree = (free_func)0; + zi->ci.stream.opaque = (voidpf)0; + + if (windowBits>0) + windowBits = -windowBits; + + err = deflateInit2(&zi->ci.stream, level, Z_DEFLATED, windowBits, memLevel, strategy); + + if (err==Z_OK) + zi->ci.stream_initialised = Z_DEFLATED; + } + else if(zi->ci.method == Z_BZIP2ED) + { +#ifdef HAVE_BZIP2 + // Init BZip stuff here + zi->ci.bstream.bzalloc = 0; + zi->ci.bstream.bzfree = 0; + zi->ci.bstream.opaque = (voidpf)0; + + err = BZ2_bzCompressInit(&zi->ci.bstream, level, 0,35); + if(err == BZ_OK) + zi->ci.stream_initialised = Z_BZIP2ED; +#endif + } + + } + +# ifndef NOCRYPT + zi->ci.crypt_header_size = 0; + if ((err==Z_OK) && (password != NULL)) + { + unsigned char bufHead[RAND_HEAD_LEN]; + unsigned int sizeHead; + zi->ci.encrypt = 1; + zi->ci.pcrc_32_tab = get_crc_table(); + /*init_keys(password,zi->ci.keys,zi->ci.pcrc_32_tab);*/ + + sizeHead=crypthead(password,bufHead,RAND_HEAD_LEN,zi->ci.keys,zi->ci.pcrc_32_tab,crcForCrypting); + zi->ci.crypt_header_size = sizeHead; + + if (ZWRITE64(zi->z_filefunc,zi->filestream,bufHead,sizeHead) != sizeHead) + err = ZIP_ERRNO; + } +# endif + + if (err==Z_OK) + zi->in_opened_file_inzip = 1; + return err; +} + +extern int ZEXPORT zipOpenNewFileInZip4 (zipFile file, const char* filename, const zip_fileinfo* zipfi, + const void* extrafield_local, uInt size_extrafield_local, + const void* extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level, int raw, + int windowBits,int memLevel, int strategy, + const char* password, uLong crcForCrypting, + uLong versionMadeBy, uLong flagBase) +{ + return zipOpenNewFileInZip4_64 (file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, raw, + windowBits, memLevel, strategy, + password, crcForCrypting, versionMadeBy, flagBase, 0); +} + +extern int ZEXPORT zipOpenNewFileInZip3 (zipFile file, const char* filename, const zip_fileinfo* zipfi, + const void* extrafield_local, uInt size_extrafield_local, + const void* extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level, int raw, + int windowBits,int memLevel, int strategy, + const char* password, uLong crcForCrypting) +{ + return zipOpenNewFileInZip4_64 (file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, raw, + windowBits, memLevel, strategy, + password, crcForCrypting, VERSIONMADEBY, 0, 0); +} + +extern int ZEXPORT zipOpenNewFileInZip3_64(zipFile file, const char* filename, const zip_fileinfo* zipfi, + const void* extrafield_local, uInt size_extrafield_local, + const void* extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level, int raw, + int windowBits,int memLevel, int strategy, + const char* password, uLong crcForCrypting, int zip64) +{ + return zipOpenNewFileInZip4_64 (file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, raw, + windowBits, memLevel, strategy, + password, crcForCrypting, VERSIONMADEBY, 0, zip64); +} + +extern int ZEXPORT zipOpenNewFileInZip2(zipFile file, const char* filename, const zip_fileinfo* zipfi, + const void* extrafield_local, uInt size_extrafield_local, + const void* extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level, int raw) +{ + return zipOpenNewFileInZip4_64 (file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, raw, + -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, + NULL, 0, VERSIONMADEBY, 0, 0); +} + +extern int ZEXPORT zipOpenNewFileInZip2_64(zipFile file, const char* filename, const zip_fileinfo* zipfi, + const void* extrafield_local, uInt size_extrafield_local, + const void* extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level, int raw, int zip64) +{ + return zipOpenNewFileInZip4_64 (file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, raw, + -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, + NULL, 0, VERSIONMADEBY, 0, zip64); +} + +extern int ZEXPORT zipOpenNewFileInZip64 (zipFile file, const char* filename, const zip_fileinfo* zipfi, + const void* extrafield_local, uInt size_extrafield_local, + const void*extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level, int zip64) +{ + return zipOpenNewFileInZip4_64 (file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, 0, + -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, + NULL, 0, VERSIONMADEBY, 0, zip64); +} + +extern int ZEXPORT zipOpenNewFileInZip (zipFile file, const char* filename, const zip_fileinfo* zipfi, + const void* extrafield_local, uInt size_extrafield_local, + const void*extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level) +{ + return zipOpenNewFileInZip4_64 (file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, 0, + -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, + NULL, 0, VERSIONMADEBY, 0, 0); +} + +local int zip64FlushWriteBuffer(zip64_internal* zi) +{ + int err=ZIP_OK; + + if (zi->ci.encrypt != 0) + { +#ifndef NOCRYPT + uInt i; + int t; + for (i=0;ici.pos_in_buffered_data;i++) + zi->ci.buffered_data[i] = zencode(zi->ci.keys, zi->ci.pcrc_32_tab, zi->ci.buffered_data[i],t); +#endif + } + + if (ZWRITE64(zi->z_filefunc,zi->filestream,zi->ci.buffered_data,zi->ci.pos_in_buffered_data) != zi->ci.pos_in_buffered_data) + err = ZIP_ERRNO; + + zi->ci.totalCompressedData += zi->ci.pos_in_buffered_data; + +#ifdef HAVE_BZIP2 + if(zi->ci.method == Z_BZIP2ED) + { + zi->ci.totalUncompressedData += zi->ci.bstream.total_in_lo32; + zi->ci.bstream.total_in_lo32 = 0; + zi->ci.bstream.total_in_hi32 = 0; + } + else +#endif + { + zi->ci.totalUncompressedData += zi->ci.stream.total_in; + zi->ci.stream.total_in = 0; + } + + + zi->ci.pos_in_buffered_data = 0; + + return err; +} + +extern int ZEXPORT zipWriteInFileInZip (zipFile file,const void* buf,unsigned int len) +{ + zip64_internal* zi; + int err=ZIP_OK; + + if (file == NULL) + return ZIP_PARAMERROR; + zi = (zip64_internal*)file; + + if (zi->in_opened_file_inzip == 0) + return ZIP_PARAMERROR; + + // DG: cast void pointer to const unsigned char* because crc32() expects that + // and C++ is more strict in these things than plain C + zi->ci.crc32 = crc32(zi->ci.crc32, (const unsigned char *)buf, (uInt)len); + // DG end + +#ifdef HAVE_BZIP2 + if(zi->ci.method == Z_BZIP2ED && (!zi->ci.raw)) + { + zi->ci.bstream.next_in = (void*)buf; + zi->ci.bstream.avail_in = len; + err = BZ_RUN_OK; + + while ((err==BZ_RUN_OK) && (zi->ci.bstream.avail_in>0)) + { + if (zi->ci.bstream.avail_out == 0) + { + if (zip64FlushWriteBuffer(zi) == ZIP_ERRNO) + err = ZIP_ERRNO; + zi->ci.bstream.avail_out = (uInt)Z_BUFSIZE; + zi->ci.bstream.next_out = (char*)zi->ci.buffered_data; + } + + + if(err != BZ_RUN_OK) + break; + + if ((zi->ci.method == Z_BZIP2ED) && (!zi->ci.raw)) + { + uLong uTotalOutBefore_lo = zi->ci.bstream.total_out_lo32; +// uLong uTotalOutBefore_hi = zi->ci.bstream.total_out_hi32; + err=BZ2_bzCompress(&zi->ci.bstream, BZ_RUN); + + zi->ci.pos_in_buffered_data += (uInt)(zi->ci.bstream.total_out_lo32 - uTotalOutBefore_lo) ; + } + } + + if(err == BZ_RUN_OK) + err = ZIP_OK; + } + else +#endif + { + zi->ci.stream.next_in = (Bytef*)buf; + zi->ci.stream.avail_in = len; + + while ((err==ZIP_OK) && (zi->ci.stream.avail_in>0)) + { + if (zi->ci.stream.avail_out == 0) + { + if (zip64FlushWriteBuffer(zi) == ZIP_ERRNO) + err = ZIP_ERRNO; + zi->ci.stream.avail_out = (uInt)Z_BUFSIZE; + zi->ci.stream.next_out = zi->ci.buffered_data; + } + + + if(err != ZIP_OK) + break; + + if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) + { + uLong uTotalOutBefore = zi->ci.stream.total_out; + err=deflate(&zi->ci.stream, Z_NO_FLUSH); + if(uTotalOutBefore > zi->ci.stream.total_out) + { + int bBreak = 0; + bBreak++; + } + + zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - uTotalOutBefore) ; + } + else + { + uInt copy_this,i; + if (zi->ci.stream.avail_in < zi->ci.stream.avail_out) + copy_this = zi->ci.stream.avail_in; + else + copy_this = zi->ci.stream.avail_out; + + for (i = 0; i < copy_this; i++) + *(((char*)zi->ci.stream.next_out)+i) = + *(((const char*)zi->ci.stream.next_in)+i); + { + zi->ci.stream.avail_in -= copy_this; + zi->ci.stream.avail_out-= copy_this; + zi->ci.stream.next_in+= copy_this; + zi->ci.stream.next_out+= copy_this; + zi->ci.stream.total_in+= copy_this; + zi->ci.stream.total_out+= copy_this; + zi->ci.pos_in_buffered_data += copy_this; + } + } + }// while(...) + } + + return err; +} + +extern int ZEXPORT zipCloseFileInZipRaw (zipFile file, uLong uncompressed_size, uLong crc32) +{ + return zipCloseFileInZipRaw64 (file, uncompressed_size, crc32); +} + +extern int ZEXPORT zipCloseFileInZipRaw64 (zipFile file, ZPOS64_T uncompressed_size, uLong crc32) +{ + zip64_internal* zi; + ZPOS64_T compressed_size; + uLong invalidValue = 0xffffffff; + short datasize = 0; + int err=ZIP_OK; + + if (file == NULL) + return ZIP_PARAMERROR; + zi = (zip64_internal*)file; + + if (zi->in_opened_file_inzip == 0) + return ZIP_PARAMERROR; + zi->ci.stream.avail_in = 0; + + if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) + { + while (err==ZIP_OK) + { + uLong uTotalOutBefore; + if (zi->ci.stream.avail_out == 0) + { + if (zip64FlushWriteBuffer(zi) == ZIP_ERRNO) + err = ZIP_ERRNO; + zi->ci.stream.avail_out = (uInt)Z_BUFSIZE; + zi->ci.stream.next_out = zi->ci.buffered_data; + } + uTotalOutBefore = zi->ci.stream.total_out; + err=deflate(&zi->ci.stream, Z_FINISH); + zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - uTotalOutBefore) ; + } + } + else if ((zi->ci.method == Z_BZIP2ED) && (!zi->ci.raw)) + { +#ifdef HAVE_BZIP2 + err = BZ_FINISH_OK; + while (err==BZ_FINISH_OK) + { + uLong uTotalOutBefore; + if (zi->ci.bstream.avail_out == 0) + { + if (zip64FlushWriteBuffer(zi) == ZIP_ERRNO) + err = ZIP_ERRNO; + zi->ci.bstream.avail_out = (uInt)Z_BUFSIZE; + zi->ci.bstream.next_out = (char*)zi->ci.buffered_data; + } + uTotalOutBefore = zi->ci.bstream.total_out_lo32; + err=BZ2_bzCompress(&zi->ci.bstream, BZ_FINISH); + if(err == BZ_STREAM_END) + err = Z_STREAM_END; + + zi->ci.pos_in_buffered_data += (uInt)(zi->ci.bstream.total_out_lo32 - uTotalOutBefore); + } + + if(err == BZ_FINISH_OK) + err = ZIP_OK; +#endif + } + + if (err==Z_STREAM_END) + err=ZIP_OK; /* this is normal */ + + if ((zi->ci.pos_in_buffered_data>0) && (err==ZIP_OK)) + { + if (zip64FlushWriteBuffer(zi)==ZIP_ERRNO) + err = ZIP_ERRNO; + } + + if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) + { + int tmp_err = deflateEnd(&zi->ci.stream); + if (err == ZIP_OK) + err = tmp_err; + zi->ci.stream_initialised = 0; + } +#ifdef HAVE_BZIP2 + else if((zi->ci.method == Z_BZIP2ED) && (!zi->ci.raw)) + { + int tmperr = BZ2_bzCompressEnd(&zi->ci.bstream); + if (err==ZIP_OK) + err = tmperr; + zi->ci.stream_initialised = 0; + } +#endif + + if (!zi->ci.raw) + { + crc32 = (uLong)zi->ci.crc32; + uncompressed_size = zi->ci.totalUncompressedData; + } + compressed_size = zi->ci.totalCompressedData; + +# ifndef NOCRYPT + compressed_size += zi->ci.crypt_header_size; +# endif + + // update Current Item crc and sizes, + if(compressed_size >= 0xffffffff || uncompressed_size >= 0xffffffff || zi->ci.pos_local_header >= 0xffffffff) + { + /*version Made by*/ + zip64local_putValue_inmemory(zi->ci.central_header+4,(uLong)45,2); + /*version needed*/ + zip64local_putValue_inmemory(zi->ci.central_header+6,(uLong)45,2); + + } + + zip64local_putValue_inmemory(zi->ci.central_header+16,crc32,4); /*crc*/ + + + if(compressed_size >= 0xffffffff) + zip64local_putValue_inmemory(zi->ci.central_header+20, invalidValue,4); /*compr size*/ + else + zip64local_putValue_inmemory(zi->ci.central_header+20, compressed_size,4); /*compr size*/ + + /// set internal file attributes field + if (zi->ci.stream.data_type == Z_ASCII) + zip64local_putValue_inmemory(zi->ci.central_header+36,(uLong)Z_ASCII,2); + + if(uncompressed_size >= 0xffffffff) + zip64local_putValue_inmemory(zi->ci.central_header+24, invalidValue,4); /*uncompr size*/ + else + zip64local_putValue_inmemory(zi->ci.central_header+24, uncompressed_size,4); /*uncompr size*/ + + // Add ZIP64 extra info field for uncompressed size + if(uncompressed_size >= 0xffffffff) + datasize += 8; + + // Add ZIP64 extra info field for compressed size + if(compressed_size >= 0xffffffff) + datasize += 8; + + // Add ZIP64 extra info field for relative offset to local file header of current file + if(zi->ci.pos_local_header >= 0xffffffff) + datasize += 8; + + if(datasize > 0) + { + char* p = NULL; + + if((uLong)(datasize + 4) > zi->ci.size_centralExtraFree) + { + // we can not write more data to the buffer that we have room for. + return ZIP_BADZIPFILE; + } + + p = zi->ci.central_header + zi->ci.size_centralheader; + + // Add Extra Information Header for 'ZIP64 information' + zip64local_putValue_inmemory(p, 0x0001, 2); // HeaderID + p += 2; + zip64local_putValue_inmemory(p, datasize, 2); // DataSize + p += 2; + + if(uncompressed_size >= 0xffffffff) + { + zip64local_putValue_inmemory(p, uncompressed_size, 8); + p += 8; + } + + if(compressed_size >= 0xffffffff) + { + zip64local_putValue_inmemory(p, compressed_size, 8); + p += 8; + } + + if(zi->ci.pos_local_header >= 0xffffffff) + { + zip64local_putValue_inmemory(p, zi->ci.pos_local_header, 8); + p += 8; + } + + // Update how much extra free space we got in the memory buffer + // and increase the centralheader size so the new ZIP64 fields are included + // ( 4 below is the size of HeaderID and DataSize field ) + zi->ci.size_centralExtraFree -= datasize + 4; + zi->ci.size_centralheader += datasize + 4; + + // Update the extra info size field + zi->ci.size_centralExtra += datasize + 4; + zip64local_putValue_inmemory(zi->ci.central_header+30,(uLong)zi->ci.size_centralExtra,2); + } + + if (err==ZIP_OK) + err = add_data_in_datablock(&zi->central_dir, zi->ci.central_header, (uLong)zi->ci.size_centralheader); + + free(zi->ci.central_header); + + if (err==ZIP_OK) + { + // Update the LocalFileHeader with the new values. + + ZPOS64_T cur_pos_inzip = ZTELL64(zi->z_filefunc,zi->filestream); + + if (ZSEEK64(zi->z_filefunc,zi->filestream, zi->ci.pos_local_header + 14,ZLIB_FILEFUNC_SEEK_SET)!=0) + err = ZIP_ERRNO; + + if (err==ZIP_OK) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,crc32,4); /* crc 32, unknown */ + + if(uncompressed_size >= 0xffffffff || compressed_size >= 0xffffffff ) + { + if(zi->ci.pos_zip64extrainfo > 0) + { + // Update the size in the ZIP64 extended field. + if (ZSEEK64(zi->z_filefunc,zi->filestream, zi->ci.pos_zip64extrainfo + 4,ZLIB_FILEFUNC_SEEK_SET)!=0) + err = ZIP_ERRNO; + + if (err==ZIP_OK) /* compressed size, unknown */ + err = zip64local_putValue(&zi->z_filefunc, zi->filestream, uncompressed_size, 8); + + if (err==ZIP_OK) /* uncompressed size, unknown */ + err = zip64local_putValue(&zi->z_filefunc, zi->filestream, compressed_size, 8); + } + else + err = ZIP_BADZIPFILE; // Caller passed zip64 = 0, so no room for zip64 info -> fatal + } + else + { + if (err==ZIP_OK) /* compressed size, unknown */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,compressed_size,4); + + if (err==ZIP_OK) /* uncompressed size, unknown */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,uncompressed_size,4); + } + + if (ZSEEK64(zi->z_filefunc,zi->filestream, cur_pos_inzip,ZLIB_FILEFUNC_SEEK_SET)!=0) + err = ZIP_ERRNO; + } + + zi->number_entry ++; + zi->in_opened_file_inzip = 0; + + return err; +} + +extern int ZEXPORT zipCloseFileInZip (zipFile file) +{ + return zipCloseFileInZipRaw (file,0,0); +} + +int Write_Zip64EndOfCentralDirectoryLocator(zip64_internal* zi, ZPOS64_T zip64eocd_pos_inzip) +{ + int err = ZIP_OK; + ZPOS64_T pos = zip64eocd_pos_inzip - zi->add_position_when_writting_offset; + + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)ZIP64ENDLOCHEADERMAGIC,4); + + /*num disks*/ + if (err==ZIP_OK) /* number of the disk with the start of the central directory */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); + + /*relative offset*/ + if (err==ZIP_OK) /* Relative offset to the Zip64EndOfCentralDirectory */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream, pos,8); + + /*total disks*/ /* Do not support spawning of disk so always say 1 here*/ + if (err==ZIP_OK) /* number of the disk with the start of the central directory */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)1,4); + + return err; +} + +int Write_Zip64EndOfCentralDirectoryRecord(zip64_internal* zi, uLong size_centraldir, ZPOS64_T centraldir_pos_inzip) +{ + int err = ZIP_OK; + + uLong Zip64DataSize = 44; + + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)ZIP64ENDHEADERMAGIC,4); + + if (err==ZIP_OK) /* size of this 'zip64 end of central directory' */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(ZPOS64_T)Zip64DataSize,8); // why ZPOS64_T of this ? + + if (err==ZIP_OK) /* version made by */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)45,2); + + if (err==ZIP_OK) /* version needed */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)45,2); + + if (err==ZIP_OK) /* number of this disk */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); + + if (err==ZIP_OK) /* number of the disk with the start of the central directory */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); + + if (err==ZIP_OK) /* total number of entries in the central dir on this disk */ + err = zip64local_putValue(&zi->z_filefunc, zi->filestream, zi->number_entry, 8); + + if (err==ZIP_OK) /* total number of entries in the central dir */ + err = zip64local_putValue(&zi->z_filefunc, zi->filestream, zi->number_entry, 8); + + if (err==ZIP_OK) /* size of the central directory */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(ZPOS64_T)size_centraldir,8); + + if (err==ZIP_OK) /* offset of start of central directory with respect to the starting disk number */ + { + ZPOS64_T pos = centraldir_pos_inzip - zi->add_position_when_writting_offset; + err = zip64local_putValue(&zi->z_filefunc,zi->filestream, (ZPOS64_T)pos,8); + } + return err; +} +int Write_EndOfCentralDirectoryRecord(zip64_internal* zi, uLong size_centraldir, ZPOS64_T centraldir_pos_inzip) +{ + int err = ZIP_OK; + + /*signature*/ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)ENDHEADERMAGIC,4); + + if (err==ZIP_OK) /* number of this disk */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,2); + + if (err==ZIP_OK) /* number of the disk with the start of the central directory */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,2); + + if (err==ZIP_OK) /* total number of entries in the central dir on this disk */ + { + { + if(zi->number_entry >= 0xFFFF) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0xffff,2); // use value in ZIP64 record + else + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->number_entry,2); + } + } + + if (err==ZIP_OK) /* total number of entries in the central dir */ + { + if(zi->number_entry >= 0xFFFF) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0xffff,2); // use value in ZIP64 record + else + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->number_entry,2); + } + + if (err==ZIP_OK) /* size of the central directory */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_centraldir,4); + + if (err==ZIP_OK) /* offset of start of central directory with respect to the starting disk number */ + { + ZPOS64_T pos = centraldir_pos_inzip - zi->add_position_when_writting_offset; + if(pos >= 0xffffffff) + { + err = zip64local_putValue(&zi->z_filefunc,zi->filestream, (uLong)0xffffffff,4); + } + else + err = zip64local_putValue(&zi->z_filefunc,zi->filestream, (uLong)(centraldir_pos_inzip - zi->add_position_when_writting_offset),4); + } + + return err; +} + +int Write_GlobalComment(zip64_internal* zi, const char* global_comment) +{ + int err = ZIP_OK; + uInt size_global_comment = 0; + + if(global_comment != NULL) + size_global_comment = (uInt)strlen(global_comment); + + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_global_comment,2); + + if (err == ZIP_OK && size_global_comment > 0) + { + if (ZWRITE64(zi->z_filefunc,zi->filestream, global_comment, size_global_comment) != size_global_comment) + err = ZIP_ERRNO; + } + return err; +} + +extern int ZEXPORT zipClose (zipFile file, const char* global_comment) +{ + zip64_internal* zi; + int err = 0; + uLong size_centraldir = 0; + ZPOS64_T centraldir_pos_inzip; + ZPOS64_T pos; + + if (file == NULL) + return ZIP_PARAMERROR; + + zi = (zip64_internal*)file; + + if (zi->in_opened_file_inzip == 1) + { + err = zipCloseFileInZip (file); + } + +#ifndef NO_ADDFILEINEXISTINGZIP + if (global_comment==NULL) + global_comment = zi->globalcomment; +#endif + + centraldir_pos_inzip = ZTELL64(zi->z_filefunc,zi->filestream); + + if (err==ZIP_OK) + { + linkedlist_datablock_internal* ldi = zi->central_dir.first_block; + while (ldi!=NULL) + { + if ((err==ZIP_OK) && (ldi->filled_in_this_block>0)) + { + if (ZWRITE64(zi->z_filefunc,zi->filestream, ldi->data, ldi->filled_in_this_block) != ldi->filled_in_this_block) + err = ZIP_ERRNO; + } + + size_centraldir += ldi->filled_in_this_block; + ldi = ldi->next_datablock; + } + } + free_linkedlist(&(zi->central_dir)); + + pos = centraldir_pos_inzip - zi->add_position_when_writting_offset; + if(pos >= 0xffffffff || zi->number_entry > 0xFFFF) + { + ZPOS64_T Zip64EOCDpos = ZTELL64(zi->z_filefunc,zi->filestream); + Write_Zip64EndOfCentralDirectoryRecord(zi, size_centraldir, centraldir_pos_inzip); + + Write_Zip64EndOfCentralDirectoryLocator(zi, Zip64EOCDpos); + } + + if (err==ZIP_OK) + err = Write_EndOfCentralDirectoryRecord(zi, size_centraldir, centraldir_pos_inzip); + + if(err == ZIP_OK) + err = Write_GlobalComment(zi, global_comment); + + if (ZCLOSE64(zi->z_filefunc,zi->filestream) != 0) + if (err == ZIP_OK) + err = ZIP_ERRNO; + +#ifndef NO_ADDFILEINEXISTINGZIP + TRYFREE(zi->globalcomment); +#endif + TRYFREE(zi); + + return err; +} + +extern int ZEXPORT zipRemoveExtraInfoBlock (char* pData, int* dataLen, short sHeader) +{ + char* p = pData; + int size = 0; + char* pNewHeader; + char* pTmp; + short header; + short dataSize; + + int retVal = ZIP_OK; + + if(pData == NULL || *dataLen < 4) + return ZIP_PARAMERROR; + + pNewHeader = (char*)ALLOC(*dataLen); + pTmp = pNewHeader; + + while(p < (pData + *dataLen)) + { + header = *(short*)p; + dataSize = *(((short*)p)+1); + + if( header == sHeader ) // Header found. + { + p += dataSize + 4; // skip it. do not copy to temp buffer + } + else + { + // Extra Info block should not be removed, So copy it to the temp buffer. + memcpy(pTmp, p, dataSize + 4); + p += dataSize + 4; + size += dataSize + 4; + } + + } + + if(size < *dataLen) + { + // clean old extra info block. + memset(pData,0, *dataLen); + + // copy the new extra info block over the old + if(size > 0) + memcpy(pData, pNewHeader, size); + + // set the new extra info size + *dataLen = size; + + retVal = ZIP_OK; + } + else + retVal = ZIP_ERRNO; + + TRYFREE(pNewHeader); + + return retVal; +} diff --git a/neo/framework/minizip/zip.h b/neo/framework/minizip/zip.h new file mode 100644 index 00000000..477fe89b --- /dev/null +++ b/neo/framework/minizip/zip.h @@ -0,0 +1,362 @@ +/* zip.h -- IO on .zip files using zlib + Version 1.1, February 14h, 2010 + part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) + + Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) + + Modifications for Zip64 support + Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) + + For more info read MiniZip_info.txt + + --------------------------------------------------------------------------- + + Condition of use and distribution are the same than zlib : + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + --------------------------------------------------------------------------- + + Changes + + See header of zip.h + +*/ + +#ifndef _zip12_H +#define _zip12_H + +#ifdef __cplusplus +extern "C" { +#endif + +//#define HAVE_BZIP2 + +#ifndef _ZLIB_H +#include "../../libs/zlib/zlib.h" +#endif + +#ifndef _ZLIBIOAPI_H +#include "ioapi.h" +#endif + +#ifdef HAVE_BZIP2 +#include "bzlib.h" +#endif + +#define Z_BZIP2ED 12 + +#if defined(STRICTZIP) || defined(STRICTZIPUNZIP) +/* like the STRICT of WIN32, we define a pointer that cannot be converted + from (void*) without cast */ +typedef struct TagzipFile__ { int unused; } zipFile__; +typedef zipFile__ *zipFile; +#else +typedef voidp zipFile; +#endif + +#define ZIP_OK (0) +#define ZIP_EOF (0) +#define ZIP_ERRNO (Z_ERRNO) +#define ZIP_PARAMERROR (-102) +#define ZIP_BADZIPFILE (-103) +#define ZIP_INTERNALERROR (-104) + +#ifndef DEF_MEM_LEVEL +# if MAX_MEM_LEVEL >= 8 +# define DEF_MEM_LEVEL 8 +# else +# define DEF_MEM_LEVEL MAX_MEM_LEVEL +# endif +#endif +/* default memLevel */ + +/* tm_zip contain date/time info */ +typedef struct tm_zip_s +{ + uInt tm_sec; /* seconds after the minute - [0,59] */ + uInt tm_min; /* minutes after the hour - [0,59] */ + uInt tm_hour; /* hours since midnight - [0,23] */ + uInt tm_mday; /* day of the month - [1,31] */ + uInt tm_mon; /* months since January - [0,11] */ + uInt tm_year; /* years - [1980..2044] */ +} tm_zip; + +typedef struct +{ + tm_zip tmz_date; /* date in understandable format */ + uLong dosDate; /* if dos_date == 0, tmu_date is used */ +/* uLong flag; */ /* general purpose bit flag 2 bytes */ + + uLong internal_fa; /* internal file attributes 2 bytes */ + uLong external_fa; /* external file attributes 4 bytes */ +} zip_fileinfo; + +typedef const char* zipcharpc; + + +#define APPEND_STATUS_CREATE (0) +#define APPEND_STATUS_CREATEAFTER (1) +#define APPEND_STATUS_ADDINZIP (2) + +extern zipFile ZEXPORT zipOpen OF((const char *pathname, int append)); +extern zipFile ZEXPORT zipOpen64 OF((const void *pathname, int append)); +/* + Create a zipfile. + pathname contain on Windows XP a filename like "c:\\zlib\\zlib113.zip" or on + an Unix computer "zlib/zlib113.zip". + if the file pathname exist and append==APPEND_STATUS_CREATEAFTER, the zip + will be created at the end of the file. + (useful if the file contain a self extractor code) + if the file pathname exist and append==APPEND_STATUS_ADDINZIP, we will + add files in existing zip (be sure you don't add file that doesn't exist) + If the zipfile cannot be opened, the return value is NULL. + Else, the return value is a zipFile Handle, usable with other function + of this zip package. +*/ + +/* Note : there is no delete function into a zipfile. + If you want delete file into a zipfile, you must open a zipfile, and create another + Of couse, you can use RAW reading and writing to copy the file you did not want delte +*/ + +extern zipFile ZEXPORT zipOpen2 OF((const char *pathname, + int append, + zipcharpc* globalcomment, + zlib_filefunc_def* pzlib_filefunc_def)); + +extern zipFile ZEXPORT zipOpen2_64 OF((const void *pathname, + int append, + zipcharpc* globalcomment, + zlib_filefunc64_def* pzlib_filefunc_def)); + +extern int ZEXPORT zipOpenNewFileInZip OF((zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level)); + +extern int ZEXPORT zipOpenNewFileInZip64 OF((zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int zip64)); + +/* + Open a file in the ZIP for writing. + filename : the filename in zip (if NULL, '-' without quote will be used + *zipfi contain supplemental information + if extrafield_local!=NULL and size_extrafield_local>0, extrafield_local + contains the extrafield data the the local header + if extrafield_global!=NULL and size_extrafield_global>0, extrafield_global + contains the extrafield data the the local header + if comment != NULL, comment contain the comment string + method contain the compression method (0 for store, Z_DEFLATED for deflate) + level contain the level of compression (can be Z_DEFAULT_COMPRESSION) + zip64 is set to 1 if a zip64 extended information block should be added to the local file header. + this MUST be '1' if the uncompressed size is >= 0xffffffff. + +*/ + + +extern int ZEXPORT zipOpenNewFileInZip2 OF((zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int raw)); + + +extern int ZEXPORT zipOpenNewFileInZip2_64 OF((zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int raw, + int zip64)); +/* + Same than zipOpenNewFileInZip, except if raw=1, we write raw file + */ + +extern int ZEXPORT zipOpenNewFileInZip3 OF((zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int raw, + int windowBits, + int memLevel, + int strategy, + const char* password, + uLong crcForCrypting)); + +extern int ZEXPORT zipOpenNewFileInZip3_64 OF((zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int raw, + int windowBits, + int memLevel, + int strategy, + const char* password, + uLong crcForCrypting, + int zip64 + )); + +/* + Same than zipOpenNewFileInZip2, except + windowBits,memLevel,,strategy : see parameter strategy in deflateInit2 + password : crypting password (NULL for no crypting) + crcForCrypting : crc of file to compress (needed for crypting) + */ + +extern int ZEXPORT zipOpenNewFileInZip4 OF((zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int raw, + int windowBits, + int memLevel, + int strategy, + const char* password, + uLong crcForCrypting, + uLong versionMadeBy, + uLong flagBase + )); + + +extern int ZEXPORT zipOpenNewFileInZip4_64 OF((zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int raw, + int windowBits, + int memLevel, + int strategy, + const char* password, + uLong crcForCrypting, + uLong versionMadeBy, + uLong flagBase, + int zip64 + )); +/* + Same than zipOpenNewFileInZip4, except + versionMadeBy : value for Version made by field + flag : value for flag field (compression level info will be added) + */ + + +extern int ZEXPORT zipWriteInFileInZip OF((zipFile file, + const void* buf, + unsigned len)); +/* + Write data in the zipfile +*/ + +extern int ZEXPORT zipCloseFileInZip OF((zipFile file)); +/* + Close the current file in the zipfile +*/ + +extern int ZEXPORT zipCloseFileInZipRaw OF((zipFile file, + uLong uncompressed_size, + uLong crc32)); + +extern int ZEXPORT zipCloseFileInZipRaw64 OF((zipFile file, + ZPOS64_T uncompressed_size, + uLong crc32)); + +/* + Close the current file in the zipfile, for file opened with + parameter raw=1 in zipOpenNewFileInZip2 + uncompressed_size and crc32 are value for the uncompressed size +*/ + +extern int ZEXPORT zipClose OF((zipFile file, + const char* global_comment)); +/* + Close the zipfile +*/ + + +extern int ZEXPORT zipRemoveExtraInfoBlock OF((char* pData, int* dataLen, short sHeader)); +/* + zipRemoveExtraInfoBlock - Added by Mathias Svensson + + Remove extra information block from a extra information data for the local file header or central directory header + + It is needed to remove ZIP64 extra information blocks when before data is written if using RAW mode. + + 0x0001 is the signature header for the ZIP64 extra information blocks + + usage. + Remove ZIP64 Extra information from a central director extra field data + zipRemoveExtraInfoBlock(pCenDirExtraFieldData, &nCenDirExtraFieldDataLen, 0x0001); + + Remove ZIP64 Extra information from a Local File Header extra field data + zipRemoveExtraInfoBlock(pLocalHeaderExtraFieldData, &nLocalHeaderExtraFieldDataLen, 0x0001); +*/ + +#ifdef __cplusplus +} +#endif + +#endif /* _zip64_H */ From 946768ad9f7e0dfc77475b5430fbb48d0f273f76 Mon Sep 17 00:00:00 2001 From: Robert Beckebans Date: Wed, 2 Jan 2013 17:09:45 +0100 Subject: [PATCH 29/57] Moved minizip contrib code to libs/zlib/minizip/ --- neo/CMakeLists.txt | 16 ++++++++++++---- neo/astyle-code.bat | 4 ++-- neo/astyle-code.sh | 4 ++-- neo/framework/Unzip.h | 2 +- .../zlib}/minizip/MiniZip64_info.txt | 0 neo/{framework => libs/zlib}/minizip/ioapi.c | 0 neo/{framework => libs/zlib}/minizip/ioapi.h | 2 +- neo/{framework => libs/zlib}/minizip/unzip.cpp | 0 neo/{framework => libs/zlib}/minizip/unzip.h | 2 +- neo/{framework => libs/zlib}/minizip/zip.cpp | 0 neo/{framework => libs/zlib}/minizip/zip.h | 0 11 files changed, 19 insertions(+), 11 deletions(-) rename neo/{framework => libs/zlib}/minizip/MiniZip64_info.txt (100%) rename neo/{framework => libs/zlib}/minizip/ioapi.c (100%) rename neo/{framework => libs/zlib}/minizip/ioapi.h (99%) rename neo/{framework => libs/zlib}/minizip/unzip.cpp (100%) rename neo/{framework => libs/zlib}/minizip/unzip.h (99%) rename neo/{framework => libs/zlib}/minizip/zip.cpp (100%) rename neo/{framework => libs/zlib}/minizip/zip.h (100%) diff --git a/neo/CMakeLists.txt b/neo/CMakeLists.txt index 08d2de8f..845e60cc 100644 --- a/neo/CMakeLists.txt +++ b/neo/CMakeLists.txt @@ -123,8 +123,8 @@ file(GLOB AAS_SOURCES aas/*.cpp) file(GLOB_RECURSE CM_INCLUDES cm/*.h) file(GLOB_RECURSE CM_SOURCES cm/*.cpp) -file(GLOB FRAMEWORK_INCLUDES framework/*.h framework/minizip/*.h) -file(GLOB FRAMEWORK_SOURCES framework/*.cpp framework/minizip/*.c framework/minizip/*.cpp) +file(GLOB FRAMEWORK_INCLUDES framework/*.h) +file(GLOB FRAMEWORK_SOURCES framework/*.cpp) file(GLOB FRAMEWORK_ASYNC_INCLUDES framework/async/*.h) file(GLOB FRAMEWORK_ASYNC_SOURCES framework/async/*.cpp) @@ -303,6 +303,9 @@ file(GLOB PNG_SOURCES libs/png/*.c) file(GLOB ZLIB_INCLUDES libs/zlib/*.h) file(GLOB ZLIB_SOURCES libs/zlib/*.c) + +file(GLOB MINIZIP_INCLUDES libs/zlib/minizip/*.h) +file(GLOB MINIZIP_SOURCES libs/zlib/minizip/*.c libs/zlib/minizip/*.cpp) set(GLEW_INCLUDES libs/glew/include/GL/glew.h) @@ -781,6 +784,9 @@ source_group("libs\\png" FILES ${PNG_SOURCES}) source_group("libs\\zlib" FILES ${ZLIB_INCLUDES}) source_group("libs\\zlib" FILES ${ZLIB_SOURCES}) +source_group("libs\\zlib\\minizip" FILES ${MINIZIP_INCLUDES}) +source_group("libs\\zlib\\minizip" FILES ${MINIZIP_SOURCES}) + source_group("libs\\glew" FILES ${GLEW_INCLUDES}) source_group("libs\\glew" FILES ${GLEW_SOURCES}) @@ -915,6 +921,7 @@ set(RBDOOM3_INCLUDES ${JPEG_INCLUDES} #${PNG_INCLUDES} ${ZLIB_INCLUDES} + ${MINIZIP_INCLUDES} #${GLEW_INCLUDES} #${FREETYPE_SOURCES} ${SOUND_INCLUDES} @@ -939,6 +946,7 @@ set(RBDOOM3_SOURCES ${JPEG_SOURCES} #${PNG_SOURCES} ${ZLIB_SOURCES} + ${MINIZIP_SOURCES} #${GLEW_SOURCES} #${FREETYPE_SOURCES} ${SOUND_SOURCES} @@ -1062,7 +1070,7 @@ if(MSVC) set(RBDOOM3_PRECOMPILED_SOURCES ${RBDOOM3_SOURCES}) list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${TIMIDITY_SOURCES} ${JPEG_SOURCES} ${ZLIB_SOURCES}) - list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/framework/minizip/ioapi.c) + list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/libs/zlib/minizip/ioapi.c) list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/renderer/DXT/DXTDecoder.cpp) list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/renderer/DXT/DXTEncoder.cpp) list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/renderer/DXT/DXTEncoder_SSE2.cpp) @@ -1075,7 +1083,7 @@ if(MSVC) list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/../doomclassic/doom/i_sound_win32.cpp) foreach( src_file ${RBDOOM3_PRECOMPILED_SOURCES} ) - message(STATUS "/Yuprecompiled.h for ${src_file}") + #message(STATUS "/Yuprecompiled.h for ${src_file}") set_source_files_properties( ${src_file} PROPERTIES diff --git a/neo/astyle-code.bat b/neo/astyle-code.bat index 9008d5b9..9a7dc029 100644 --- a/neo/astyle-code.bat +++ b/neo/astyle-code.bat @@ -1,4 +1,4 @@ -astyle.exe -v --options=astyle-options.ini --exclude="libs" --exclude="framework/minizip" --recursive *.h -astyle.exe -v --options=astyle-options.ini --exclude="libs" --exclude="framework/minizip" --exclude="idlib/math/Simd.cpp" --exclude="d3xp/gamesys/SysCvar.cpp" --exclude="d3xp/gamesys/Callbacks.cpp" --exclude="sys/win32/win_cpu.cpp" --exclude="sys/win32/win_main.cpp" --recursive *.cpp +astyle.exe -v --options=astyle-options.ini --exclude="libs" --recursive *.h +astyle.exe -v --options=astyle-options.ini --exclude="libs" --exclude="idlib/math/Simd.cpp" --exclude="d3xp/gamesys/SysCvar.cpp" --exclude="d3xp/gamesys/Callbacks.cpp" --exclude="sys/win32/win_cpu.cpp" --exclude="sys/win32/win_main.cpp" --recursive *.cpp pause \ No newline at end of file diff --git a/neo/astyle-code.sh b/neo/astyle-code.sh index dac400f7..6b3919e3 100755 --- a/neo/astyle-code.sh +++ b/neo/astyle-code.sh @@ -1,5 +1,5 @@ #!/bin/sh -./astyle.exe -v --options=astyle-options.ini --exclude="libs" --exclude="framework/minizip" --recursive *.h -./astyle.exe -v --options=astyle-options.ini --exclude="libs" --exclude="framework/minizip" --exclude="idlib/math/Simd.cpp" --exclude="d3xp/gamesys/SysCvar.cpp" --exclude="d3xp/gamesys/Callbacks.cpp" --exclude="sys/win32/win_cpu.cpp" --exclude="sys/win32/win_main.cpp" --recursive *.cpp +./astyle.exe -v --options=astyle-options.ini --exclude="libs" --recursive *.h +./astyle.exe -v --options=astyle-options.ini --exclude="libs" --exclude="idlib/math/Simd.cpp" --exclude="d3xp/gamesys/SysCvar.cpp" --exclude="d3xp/gamesys/Callbacks.cpp" --exclude="sys/win32/win_cpu.cpp" --exclude="sys/win32/win_main.cpp" --recursive *.cpp #pause \ No newline at end of file diff --git a/neo/framework/Unzip.h b/neo/framework/Unzip.h index 8643d42b..0d0d1eec 100644 --- a/neo/framework/Unzip.h +++ b/neo/framework/Unzip.h @@ -37,7 +37,7 @@ #ifndef __UNZIP_H__ #define __UNZIP_H__ -#include "minizip/unzip.h" +#include "../libs/zlib/minizip/unzip.h" /* * DG: all unzip code has been moved to minizip/ diff --git a/neo/framework/minizip/MiniZip64_info.txt b/neo/libs/zlib/minizip/MiniZip64_info.txt similarity index 100% rename from neo/framework/minizip/MiniZip64_info.txt rename to neo/libs/zlib/minizip/MiniZip64_info.txt diff --git a/neo/framework/minizip/ioapi.c b/neo/libs/zlib/minizip/ioapi.c similarity index 100% rename from neo/framework/minizip/ioapi.c rename to neo/libs/zlib/minizip/ioapi.c diff --git a/neo/framework/minizip/ioapi.h b/neo/libs/zlib/minizip/ioapi.h similarity index 99% rename from neo/framework/minizip/ioapi.h rename to neo/libs/zlib/minizip/ioapi.h index 896cc437..b75aba42 100644 --- a/neo/framework/minizip/ioapi.h +++ b/neo/libs/zlib/minizip/ioapi.h @@ -46,7 +46,7 @@ #include #include -#include "../../libs/zlib/zlib.h" +#include "../zlib.h" #if defined(USE_FILE32API) #define fopen64 fopen diff --git a/neo/framework/minizip/unzip.cpp b/neo/libs/zlib/minizip/unzip.cpp similarity index 100% rename from neo/framework/minizip/unzip.cpp rename to neo/libs/zlib/minizip/unzip.cpp diff --git a/neo/framework/minizip/unzip.h b/neo/libs/zlib/minizip/unzip.h similarity index 99% rename from neo/framework/minizip/unzip.h rename to neo/libs/zlib/minizip/unzip.h index 728fea62..d1db0ba3 100644 --- a/neo/framework/minizip/unzip.h +++ b/neo/libs/zlib/minizip/unzip.h @@ -51,7 +51,7 @@ extern "C" { #endif #ifndef _ZLIB_H -#include "../../libs/zlib/zlib.h" +#include "../zlib.h" #endif #include "ioapi.h" diff --git a/neo/framework/minizip/zip.cpp b/neo/libs/zlib/minizip/zip.cpp similarity index 100% rename from neo/framework/minizip/zip.cpp rename to neo/libs/zlib/minizip/zip.cpp diff --git a/neo/framework/minizip/zip.h b/neo/libs/zlib/minizip/zip.h similarity index 100% rename from neo/framework/minizip/zip.h rename to neo/libs/zlib/minizip/zip.h From 9a40f246b66fb69e968f86b7e3c12363fed6a680 Mon Sep 17 00:00:00 2001 From: Robert Beckebans Date: Wed, 2 Jan 2013 21:45:47 +0100 Subject: [PATCH 30/57] Copied neo/sound/XAudio2/XA2_* to neo/sound/OpenAL/AL_* --- neo/CMakeLists.txt | 79 ++- neo/sound/OpenAL/AL_SoundHardware.cpp | 662 ++++++++++++++++++++++++++ neo/sound/OpenAL/AL_SoundHardware.h | 127 +++++ neo/sound/OpenAL/AL_SoundSample.cpp | 550 +++++++++++++++++++++ neo/sound/OpenAL/AL_SoundSample.h | 186 ++++++++ neo/sound/OpenAL/AL_SoundVoice.cpp | 574 ++++++++++++++++++++++ neo/sound/OpenAL/AL_SoundVoice.h | 119 +++++ neo/sound/snd_local.h | 14 +- 8 files changed, 2286 insertions(+), 25 deletions(-) create mode 100644 neo/sound/OpenAL/AL_SoundHardware.cpp create mode 100644 neo/sound/OpenAL/AL_SoundHardware.h create mode 100644 neo/sound/OpenAL/AL_SoundSample.cpp create mode 100644 neo/sound/OpenAL/AL_SoundSample.h create mode 100644 neo/sound/OpenAL/AL_SoundVoice.cpp create mode 100644 neo/sound/OpenAL/AL_SoundVoice.h diff --git a/neo/CMakeLists.txt b/neo/CMakeLists.txt index 845e60cc..b702c4ed 100644 --- a/neo/CMakeLists.txt +++ b/neo/CMakeLists.txt @@ -12,8 +12,8 @@ option(MONOLITH option(SDL2 "Use SDL2 instead of SDL1.2" OFF) -#option(STANDALONE -# "Skip Doom 3 base/ folder" ON) +option(OPENAL + "Use OpenAL soft instead of XAudio2" ON) if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_C_COMPILER_ID STREQUAL "Clang") @@ -382,6 +382,16 @@ set(XAUDIO2_SOURCES sound/XAudio2/XA2_SoundHardware.cpp sound/XAudio2/XA2_SoundSample.cpp sound/XAudio2/XA2_SoundVoice.cpp) + +set(OPENAL_INCLUDES + sound/OpenAL/AL_SoundHardware.h + sound/OpenAL/AL_SoundSample.h + sound/OpenAL/AL_SoundVoice.h) + +set(OPENAL_SOURCES + sound/OpenAL/AL_SoundHardware.cpp + sound/OpenAL/AL_SoundSample.cpp + sound/OpenAL/AL_SoundVoice.cpp) set(STUBAUDIO_INCLUDES sound/stub/SoundStub.h) @@ -798,6 +808,9 @@ source_group("sound" FILES ${SOUND_SOURCES}) source_group("sound\\XAudio2" FILES ${XAUDIO2_INCLUDES}) source_group("sound\\XAudio2" FILES ${XAUDIO2_SOURCES}) +source_group("sound\\OpenAL" FILES ${OPENAL_INCLUDES}) +source_group("sound\\OpenAL" FILES ${OPENAL_SOURCES}) + source_group("sound\\stub" FILES ${STUBAUDIO_INCLUDES}) source_group("sound\\stub" FILES ${STUBAUDIO_SOURCES}) @@ -1003,8 +1016,6 @@ include_directories( if(MSVC) - add_definitions(-DUSE_DOOMCLASSIC) - if(MSVC_VERSION EQUAL 1700) set(DirectX_LIBRARIES dinput8 @@ -1014,11 +1025,41 @@ if(MSVC) Xinput xaudio2.lib ) - add_definitions(-DUSE_XINPUT) + + if(NOT OPENAL) + list(APPEND DirectX_LIBRARIES xaudio2.lib) + endif() + else() find_package(DirectX REQUIRED) include_directories(${DirectX_INCLUDE_DIR}) - add_definitions(-DUSE_XINPUT) + endif() + + if(OPENAL) + add_definitions(-DUSE_OPENAL) + + include_directories(${CMAKE_CURRENT_SOURCE_DIR}/libs/openal-soft/include) + + if(CMAKE_CL_64) + link_directories(${CMAKE_CURRENT_SOURCE_DIR}/libs/openal-soft/lib/win64) + else() + link_directories(${CMAKE_CURRENT_SOURCE_DIR}/libs/openal-soft/lib/win32) + endif() + + list(APPEND RBDOOM3_INCLUDES ${OPENAL_INCLUDES}) + list(APPEND RBDOOM3_SOURCES ${OPENAL_SOURCES}) + else() + add_definitions(-DUSE_DOOMCLASSIC) + + list(APPEND RBDOOM3_INCLUDES + ${XAUDIO2_INCLUDES} + ${DOOMCLASSIC_INCLUDES} + ${TIMIDITY_INCLUDES}) + + list(APPEND RBDOOM3_SOURCES + ${XAUDIO2_SOURCES} + ${DOOMCLASSIC_SOURCES} + ${TIMIDITY_SOURCES}) endif() if(USE_MFC_TOOLS) @@ -1026,9 +1067,9 @@ if(MSVC) include_directories(libs/atlmfc/include) if(CMAKE_CL_64) link_directories(${CMAKE_CURRENT_SOURCE_DIR}/libs/atlmfc/lib/amd64) - else(CMAKE_CL_64) + else() link_directories(${CMAKE_CURRENT_SOURCE_DIR}/libs/atlmfc/lib) - endif(CMAKE_CL_64) + endif() add_definitions(-DUSE_MFC_TOOLS) @@ -1051,19 +1092,11 @@ if(MSVC) endif() list(APPEND RBDOOM3_INLCUDES - ${DOOMCLASSIC_INCLUDES} - ${TIMIDITY_INCLUDES} - ${SYS_INCLUDES} - ${XAUDIO2_INCLUDES} ${WIN32_INCLUDES}) list(APPEND RBDOOM3_SOURCES - ${DOOMCLASSIC_SOURCES} - ${TIMIDITY_SOURCES} - ${SYS_SOURCES} - ${XAUDIO2_SOURCES} ${WIN32_SOURCES}) list(REMOVE_DUPLICATES RBDOOM3_SOURCES) @@ -1122,13 +1155,13 @@ if(MSVC) ) #CMAKE_BINARY_DIR - # if(CMAKE_CL_64) - # install(TARGETS RBDoom3BFG - # RUNTIME DESTINATION ../bin/win64) - # else() - # install(TARGETS RBDoom3BFG - # RUNTIME DESTINATION ../bin/win32) - # endif() + if(CMAKE_CL_64) + install(TARGETS RBDoom3BFG + RUNTIME DESTINATION ../bin/win64) + else() + install(TARGETS RBDoom3BFG + RUNTIME DESTINATION ../bin/win32) + endif() else() diff --git a/neo/sound/OpenAL/AL_SoundHardware.cpp b/neo/sound/OpenAL/AL_SoundHardware.cpp new file mode 100644 index 00000000..45632fd3 --- /dev/null +++ b/neo/sound/OpenAL/AL_SoundHardware.cpp @@ -0,0 +1,662 @@ +/* +=========================================================================== + +Doom 3 BFG Edition GPL Source Code +Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company. +Copyright (C) 2012 Robert Beckebans + +This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code"). + +Doom 3 BFG Edition Source Code is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Doom 3 BFG Edition Source Code is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Doom 3 BFG Edition Source Code. If not, see . + +In addition, the Doom 3 BFG Edition Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 BFG Edition Source Code. If not, please request a copy in writing from id Software at the address below. + +If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA. + +=========================================================================== +*/ +#pragma hdrstop +#include "precompiled.h" +#include "../snd_local.h" +//#include "../../../doomclassic/doom/i_sound.h" + +idCVar s_showLevelMeter( "s_showLevelMeter", "0", CVAR_BOOL | CVAR_ARCHIVE, "Show VU meter" ); +idCVar s_meterTopTime( "s_meterTopTime", "1000", CVAR_INTEGER | CVAR_ARCHIVE, "How long (in milliseconds) peaks are displayed on the VU meter" ); +idCVar s_meterPosition( "s_meterPosition", "100 100 20 200", CVAR_ARCHIVE, "VU meter location (x y w h)" ); +idCVar s_device( "s_device", "-1", CVAR_INTEGER | CVAR_ARCHIVE, "Which audio device to use (listDevices to list, -1 for default)" ); +idCVar s_showPerfData( "s_showPerfData", "0", CVAR_BOOL, "Show XAudio2 Performance data" ); +extern idCVar s_volume_dB; + +/* +======================== +idSoundHardware_OpenAL::idSoundHardware_OpenAL +======================== +*/ +idSoundHardware_OpenAL::idSoundHardware_OpenAL() +{ + pXAudio2 = NULL; + pMasterVoice = NULL; + pSubmixVoice = NULL; + + vuMeterRMS = NULL; + vuMeterPeak = NULL; + + outputChannels = 0; + channelMask = 0; + + voices.SetNum( 0 ); + zombieVoices.SetNum( 0 ); + freeVoices.SetNum( 0 ); + + lastResetTime = 0; +} + +void listDevices_f( const idCmdArgs& args ) +{ + + IXAudio2* pXAudio2 = soundSystemLocal.hardware.GetIXAudio2(); + + if( pXAudio2 == NULL ) + { + idLib::Warning( "No xaudio object" ); + return; + } + +// RB: not available on Windows 8 SDK +#if (_WIN32_WINNT >= 0x0602 /*_WIN32_WINNT_WIN8*/) + + // FIXME + + idLib::Warning( "No audio devices found" ); + return; +#else + UINT32 deviceCount = 0; + if( pXAudio2->GetDeviceCount( &deviceCount ) != S_OK || deviceCount == 0 ) + { + idLib::Warning( "No audio devices found" ); + return; + } + + for( unsigned int i = 0; i < deviceCount; i++ ) + { + XAUDIO2_DEVICE_DETAILS deviceDetails; + if( pXAudio2->GetDeviceDetails( i, &deviceDetails ) != S_OK ) + { + continue; + } + idStaticList< const char*, 5 > roles; + if( deviceDetails.Role & DefaultConsoleDevice ) + { + roles.Append( "Console Device" ); + } + if( deviceDetails.Role & DefaultMultimediaDevice ) + { + roles.Append( "Multimedia Device" ); + } + if( deviceDetails.Role & DefaultCommunicationsDevice ) + { + roles.Append( "Communications Device" ); + } + if( deviceDetails.Role & DefaultGameDevice ) + { + roles.Append( "Game Device" ); + } + idStaticList< const char*, 11 > channelNames; + if( deviceDetails.OutputFormat.dwChannelMask & SPEAKER_FRONT_LEFT ) + { + channelNames.Append( "Front Left" ); + } + if( deviceDetails.OutputFormat.dwChannelMask & SPEAKER_FRONT_RIGHT ) + { + channelNames.Append( "Front Right" ); + } + if( deviceDetails.OutputFormat.dwChannelMask & SPEAKER_FRONT_CENTER ) + { + channelNames.Append( "Front Center" ); + } + if( deviceDetails.OutputFormat.dwChannelMask & SPEAKER_LOW_FREQUENCY ) + { + channelNames.Append( "Low Frequency" ); + } + if( deviceDetails.OutputFormat.dwChannelMask & SPEAKER_BACK_LEFT ) + { + channelNames.Append( "Back Left" ); + } + if( deviceDetails.OutputFormat.dwChannelMask & SPEAKER_BACK_RIGHT ) + { + channelNames.Append( "Back Right" ); + } + if( deviceDetails.OutputFormat.dwChannelMask & SPEAKER_FRONT_LEFT_OF_CENTER ) + { + channelNames.Append( "Front Left of Center" ); + } + if( deviceDetails.OutputFormat.dwChannelMask & SPEAKER_FRONT_RIGHT_OF_CENTER ) + { + channelNames.Append( "Front Right of Center" ); + } + if( deviceDetails.OutputFormat.dwChannelMask & SPEAKER_BACK_CENTER ) + { + channelNames.Append( "Back Center" ); + } + if( deviceDetails.OutputFormat.dwChannelMask & SPEAKER_SIDE_LEFT ) + { + channelNames.Append( "Side Left" ); + } + if( deviceDetails.OutputFormat.dwChannelMask & SPEAKER_SIDE_RIGHT ) + { + channelNames.Append( "Side Right" ); + } + char mbcsDisplayName[ 256 ]; + wcstombs( mbcsDisplayName, deviceDetails.DisplayName, sizeof( mbcsDisplayName ) ); + idLib::Printf( "%3d: %s\n", i, mbcsDisplayName ); + idLib::Printf( " %d channels, %d Hz\n", deviceDetails.OutputFormat.Format.nChannels, deviceDetails.OutputFormat.Format.nSamplesPerSec ); + if( channelNames.Num() != deviceDetails.OutputFormat.Format.nChannels ) + { + idLib::Printf( S_COLOR_YELLOW "WARNING: " S_COLOR_RED "Mismatch between # of channels and channel mask\n" ); + } + if( channelNames.Num() == 1 ) + { + idLib::Printf( " %s\n", channelNames[0] ); + } + else if( channelNames.Num() == 2 ) + { + idLib::Printf( " %s and %s\n", channelNames[0], channelNames[1] ); + } + else if( channelNames.Num() > 2 ) + { + idLib::Printf( " %s", channelNames[0] ); + for( int i = 1; i < channelNames.Num() - 1; i++ ) + { + idLib::Printf( ", %s", channelNames[i] ); + } + idLib::Printf( ", and %s\n", channelNames[channelNames.Num() - 1] ); + } + if( roles.Num() == 1 ) + { + idLib::Printf( " Default %s\n", roles[0] ); + } + else if( roles.Num() == 2 ) + { + idLib::Printf( " Default %s and %s\n", roles[0], roles[1] ); + } + else if( roles.Num() > 2 ) + { + idLib::Printf( " Default %s", roles[0] ); + for( int i = 1; i < roles.Num() - 1; i++ ) + { + idLib::Printf( ", %s", roles[i] ); + } + idLib::Printf( ", and %s\n", roles[roles.Num() - 1] ); + } + } +#endif +// RB end +} + +/* +======================== +idSoundHardware_OpenAL::Init +======================== +*/ +void idSoundHardware_OpenAL::Init() +{ + + cmdSystem->AddCommand( "listDevices", listDevices_f, 0, "Lists the connected sound devices", NULL ); + + DWORD xAudioCreateFlags = 0; + +// RB: not available on Windows 8 SDK +#if (_WIN32_WINNT < 0x0602 /*_WIN32_WINNT_WIN8*/) && defined(_DEBUG) + xAudioCreateFlags |= XAUDIO2_DEBUG_ENGINE; +#endif +// RB end + + XAUDIO2_PROCESSOR xAudioProcessor = XAUDIO2_DEFAULT_PROCESSOR; + +// RB: not available on Windows 8 SDK + if( FAILED( XAudio2Create( &pXAudio2, xAudioCreateFlags, xAudioProcessor ) ) ) + { +#if (_WIN32_WINNT < 0x0602 /*_WIN32_WINNT_WIN8*/) && defined(_DEBUG) + if( xAudioCreateFlags & XAUDIO2_DEBUG_ENGINE ) + { + // in case the debug engine isn't installed + xAudioCreateFlags &= ~XAUDIO2_DEBUG_ENGINE; + if( FAILED( XAudio2Create( &pXAudio2, xAudioCreateFlags, xAudioProcessor ) ) ) + { + idLib::FatalError( "Failed to create XAudio2 engine. Try installing the latest DirectX." ); + return; + } + } + else +#endif +// RB end + { + idLib::FatalError( "Failed to create XAudio2 engine. Try installing the latest DirectX." ); + return; + } + } +#ifdef _DEBUG + XAUDIO2_DEBUG_CONFIGURATION debugConfiguration = { 0 }; + debugConfiguration.TraceMask = XAUDIO2_LOG_WARNINGS; + debugConfiguration.BreakMask = XAUDIO2_LOG_ERRORS; + pXAudio2->SetDebugConfiguration( &debugConfiguration ); +#endif + + // Register the sound engine callback + pXAudio2->RegisterForCallbacks( &soundEngineCallback ); + soundEngineCallback.hardware = this; + +// RB: not available on Windows 8 SDK +#if (_WIN32_WINNT >= 0x0602 /*_WIN32_WINNT_WIN8*/) + + // FIXME + + idLib::Warning( "No audio devices found" ); + pXAudio2->Release(); + pXAudio2 = NULL; + return; +#else + UINT32 deviceCount = 0; + if( pXAudio2->GetDeviceCount( &deviceCount ) != S_OK || deviceCount == 0 ) + { + idLib::Warning( "No audio devices found" ); + pXAudio2->Release(); + pXAudio2 = NULL; + return; + } + + idCmdArgs args; + listDevices_f( args ); + + int preferredDevice = s_device.GetInteger(); + if( preferredDevice < 0 || preferredDevice >= ( int )deviceCount ) + { + int preferredChannels = 0; + for( unsigned int i = 0; i < deviceCount; i++ ) + { + XAUDIO2_DEVICE_DETAILS deviceDetails; + if( pXAudio2->GetDeviceDetails( i, &deviceDetails ) != S_OK ) + { + continue; + } + + if( deviceDetails.Role & DefaultGameDevice ) + { + // if we find a device the user marked as their preferred 'game' device, then always use that + preferredDevice = i; + preferredChannels = deviceDetails.OutputFormat.Format.nChannels; + break; + } + + if( deviceDetails.OutputFormat.Format.nChannels > preferredChannels ) + { + preferredDevice = i; + preferredChannels = deviceDetails.OutputFormat.Format.nChannels; + } + } + } + + idLib::Printf( "Using device %d\n", preferredDevice ); + + XAUDIO2_DEVICE_DETAILS deviceDetails; + if( pXAudio2->GetDeviceDetails( preferredDevice, &deviceDetails ) != S_OK ) + { + // One way this could happen is if a device is removed between the loop and this line of code + // Highly unlikely but possible + idLib::Warning( "Failed to get device details" ); + pXAudio2->Release(); + pXAudio2 = NULL; + return; + } + + DWORD outputSampleRate = 44100; // Max( (DWORD)XAUDIO2FX_REVERB_MIN_FRAMERATE, Min( (DWORD)XAUDIO2FX_REVERB_MAX_FRAMERATE, deviceDetails.OutputFormat.Format.nSamplesPerSec ) ); + + if( FAILED( pXAudio2->CreateMasteringVoice( &pMasterVoice, XAUDIO2_DEFAULT_CHANNELS, outputSampleRate, 0, preferredDevice, NULL ) ) ) + { + idLib::Warning( "Failed to create master voice" ); + pXAudio2->Release(); + pXAudio2 = NULL; + return; + } + pMasterVoice->SetVolume( DBtoLinear( s_volume_dB.GetFloat() ) ); + + outputChannels = deviceDetails.OutputFormat.Format.nChannels; + channelMask = deviceDetails.OutputFormat.dwChannelMask; + + idSoundVoice::InitSurround( outputChannels, channelMask ); + + // --------------------- + // Initialize the Doom classic sound system. + // --------------------- + I_InitSoundHardware( outputChannels, channelMask ); + + // --------------------- + // Create VU Meter Effect + // --------------------- + IUnknown* vuMeter = NULL; + XAudio2CreateVolumeMeter( &vuMeter, 0 ); + + XAUDIO2_EFFECT_DESCRIPTOR descriptor; + descriptor.InitialState = true; + descriptor.OutputChannels = outputChannels; + descriptor.pEffect = vuMeter; + + XAUDIO2_EFFECT_CHAIN chain; + chain.EffectCount = 1; + chain.pEffectDescriptors = &descriptor; + + pMasterVoice->SetEffectChain( &chain ); + + vuMeter->Release(); + + // --------------------- + // Create VU Meter Graph + // --------------------- + + vuMeterRMS = console->CreateGraph( outputChannels ); + vuMeterPeak = console->CreateGraph( outputChannels ); + vuMeterRMS->Enable( false ); + vuMeterPeak->Enable( false ); + + memset( vuMeterPeakTimes, 0, sizeof( vuMeterPeakTimes ) ); + + vuMeterPeak->SetFillMode( idDebugGraph::GRAPH_LINE ); + vuMeterPeak->SetBackgroundColor( idVec4( 0.0f, 0.0f, 0.0f, 0.0f ) ); + + vuMeterRMS->AddGridLine( 0.500f, idVec4( 0.5f, 0.5f, 0.5f, 1.0f ) ); + vuMeterRMS->AddGridLine( 0.250f, idVec4( 0.5f, 0.5f, 0.5f, 1.0f ) ); + vuMeterRMS->AddGridLine( 0.125f, idVec4( 0.5f, 0.5f, 0.5f, 1.0f ) ); + + const char* channelNames[] = { "L", "R", "C", "S", "Lb", "Rb", "Lf", "Rf", "Cb", "Ls", "Rs" }; + for( int i = 0, ci = 0; ci < sizeof( channelNames ) / sizeof( channelNames[0] ); ci++ ) + { + if( ( channelMask & BIT( ci ) ) == 0 ) + { + continue; + } + vuMeterRMS->SetLabel( i, channelNames[ ci ] ); + i++; + } + + // --------------------- + // Create submix buffer + // --------------------- + if( FAILED( pXAudio2->CreateSubmixVoice( &pSubmixVoice, 1, outputSampleRate, 0, 0, NULL, NULL ) ) ) + { + idLib::FatalError( "Failed to create submix voice" ); + } + + // XAudio doesn't really impose a maximum number of voices + voices.SetNum( voices.Max() ); + freeVoices.SetNum( voices.Max() ); + zombieVoices.SetNum( 0 ); + for( int i = 0; i < voices.Num(); i++ ) + { + freeVoices[i] = &voices[i]; + } +#endif // #if (_WIN32_WINNT < 0x0602 /*_WIN32_WINNT_WIN8*/) +// RB end +} + +/* +======================== +idSoundHardware_OpenAL::Shutdown +======================== +*/ +void idSoundHardware_OpenAL::Shutdown() +{ + for( int i = 0; i < voices.Num(); i++ ) + { + voices[ i ].DestroyInternal(); + } + voices.Clear(); + freeVoices.Clear(); + zombieVoices.Clear(); + + // --------------------- + // Shutdown the Doom classic sound system. + // --------------------- + //I_ShutdownSoundHardware(); + + if( pXAudio2 != NULL ) + { + // Unregister the sound engine callback + pXAudio2->UnregisterForCallbacks( &soundEngineCallback ); + } + + if( pSubmixVoice != NULL ) + { + pSubmixVoice->DestroyVoice(); + pSubmixVoice = NULL; + } + if( pMasterVoice != NULL ) + { + // release the vu meter effect + pMasterVoice->SetEffectChain( NULL ); + pMasterVoice->DestroyVoice(); + pMasterVoice = NULL; + } + if( pXAudio2 != NULL ) + { + XAUDIO2_PERFORMANCE_DATA perfData; + pXAudio2->GetPerformanceData( &perfData ); + idLib::Printf( "Final pXAudio2 performanceData: Voices: %d/%d CPU: %.2f%% Mem: %dkb\n", perfData.ActiveSourceVoiceCount, perfData.TotalSourceVoiceCount, perfData.AudioCyclesSinceLastQuery / ( float )perfData.TotalCyclesSinceLastQuery, perfData.MemoryUsageInBytes / 1024 ); + pXAudio2->Release(); + pXAudio2 = NULL; + } + if( vuMeterRMS != NULL ) + { + console->DestroyGraph( vuMeterRMS ); + vuMeterRMS = NULL; + } + if( vuMeterPeak != NULL ) + { + console->DestroyGraph( vuMeterPeak ); + vuMeterPeak = NULL; + } +} + +/* +======================== +idSoundHardware_OpenAL::AllocateVoice +======================== +*/ +idSoundVoice* idSoundHardware_OpenAL::AllocateVoice( const idSoundSample* leadinSample, const idSoundSample* loopingSample ) +{ + if( leadinSample == NULL ) + { + return NULL; + } + if( loopingSample != NULL ) + { + if( ( leadinSample->format.basic.formatTag != loopingSample->format.basic.formatTag ) || ( leadinSample->format.basic.numChannels != loopingSample->format.basic.numChannels ) ) + { + idLib::Warning( "Leadin/looping format mismatch: %s & %s", leadinSample->GetName(), loopingSample->GetName() ); + loopingSample = NULL; + } + } + + // Try to find a free voice that matches the format + // But fallback to the last free voice if none match the format + idSoundVoice* voice = NULL; + for( int i = 0; i < freeVoices.Num(); i++ ) + { + if( freeVoices[i]->IsPlaying() ) + { + continue; + } + voice = ( idSoundVoice* )freeVoices[i]; + if( voice->CompatibleFormat( ( idSoundSample_OpenAL* )leadinSample ) ) + { + break; + } + } + if( voice != NULL ) + { + voice->Create( leadinSample, loopingSample ); + freeVoices.Remove( voice ); + return voice; + } + + return NULL; +} + +/* +======================== +idSoundHardware_OpenAL::FreeVoice +======================== +*/ +void idSoundHardware_OpenAL::FreeVoice( idSoundVoice* voice ) +{ + voice->Stop(); + + // Stop() is asyncronous, so we won't flush bufferes until the + // voice on the zombie channel actually returns !IsPlaying() + zombieVoices.Append( voice ); +} + +/* +======================== +idSoundHardware_OpenAL::Update +======================== +*/ +void idSoundHardware_OpenAL::Update() +{ + if( pXAudio2 == NULL ) + { + int nowTime = Sys_Milliseconds(); + if( lastResetTime + 1000 < nowTime ) + { + lastResetTime = nowTime; + Init(); + } + return; + } + if( soundSystem->IsMuted() ) + { + pMasterVoice->SetVolume( 0.0f, OPERATION_SET ); + } + else + { + pMasterVoice->SetVolume( DBtoLinear( s_volume_dB.GetFloat() ), OPERATION_SET ); + } + + pXAudio2->CommitChanges( XAUDIO2_COMMIT_ALL ); + + // IXAudio2SourceVoice::Stop() has been called for every sound on the + // zombie list, but it is documented as asyncronous, so we have to wait + // until it actually reports that it is no longer playing. + for( int i = 0; i < zombieVoices.Num(); i++ ) + { + zombieVoices[i]->FlushSourceBuffers(); + if( !zombieVoices[i]->IsPlaying() ) + { + freeVoices.Append( zombieVoices[i] ); + zombieVoices.RemoveIndexFast( i ); + i--; + } + else + { + static int playingZombies; + playingZombies++; + } + } + + if( s_showPerfData.GetBool() ) + { + XAUDIO2_PERFORMANCE_DATA perfData; + pXAudio2->GetPerformanceData( &perfData ); + idLib::Printf( "Voices: %d/%d CPU: %.2f%% Mem: %dkb\n", perfData.ActiveSourceVoiceCount, perfData.TotalSourceVoiceCount, perfData.AudioCyclesSinceLastQuery / ( float )perfData.TotalCyclesSinceLastQuery, perfData.MemoryUsageInBytes / 1024 ); + } + + if( vuMeterRMS == NULL ) + { + // Init probably hasn't been called yet + return; + } + + vuMeterRMS->Enable( s_showLevelMeter.GetBool() ); + vuMeterPeak->Enable( s_showLevelMeter.GetBool() ); + + if( !s_showLevelMeter.GetBool() ) + { + pMasterVoice->DisableEffect( 0 ); + return; + } + else + { + pMasterVoice->EnableEffect( 0 ); + } + + float peakLevels[ 8 ]; + float rmsLevels[ 8 ]; + + XAUDIO2FX_VOLUMEMETER_LEVELS levels; + levels.ChannelCount = outputChannels; + levels.pPeakLevels = peakLevels; + levels.pRMSLevels = rmsLevels; + + if( levels.ChannelCount > 8 ) + { + levels.ChannelCount = 8; + } + + pMasterVoice->GetEffectParameters( 0, &levels, sizeof( levels ) ); + + int currentTime = Sys_Milliseconds(); + for( int i = 0; i < outputChannels; i++ ) + { + if( vuMeterPeakTimes[i] < currentTime ) + { + vuMeterPeak->SetValue( i, vuMeterPeak->GetValue( i ) * 0.9f, colorRed ); + } + } + + float width = 20.0f; + float height = 200.0f; + float left = 100.0f; + float top = 100.0f; + + sscanf( s_meterPosition.GetString(), "%f %f %f %f", &left, &top, &width, &height ); + + vuMeterRMS->SetPosition( left, top, width * levels.ChannelCount, height ); + vuMeterPeak->SetPosition( left, top, width * levels.ChannelCount, height ); + + for( uint32 i = 0; i < levels.ChannelCount; i++ ) + { + vuMeterRMS->SetValue( i, rmsLevels[ i ], idVec4( 0.5f, 1.0f, 0.0f, 1.00f ) ); + if( peakLevels[ i ] >= vuMeterPeak->GetValue( i ) ) + { + vuMeterPeak->SetValue( i, peakLevels[ i ], colorRed ); + vuMeterPeakTimes[i] = currentTime + s_meterTopTime.GetInteger(); + } + } +} + + +/* +================================================ +idSoundEngineCallback +================================================ +*/ + +/* +======================== +idSoundEngineCallback::OnCriticalError +======================== +*/ +void idSoundEngineCallback::OnCriticalError( HRESULT Error ) +{ + soundSystemLocal.SetNeedsRestart(); +} diff --git a/neo/sound/OpenAL/AL_SoundHardware.h b/neo/sound/OpenAL/AL_SoundHardware.h new file mode 100644 index 00000000..d3d8d717 --- /dev/null +++ b/neo/sound/OpenAL/AL_SoundHardware.h @@ -0,0 +1,127 @@ +/* +=========================================================================== + +Doom 3 BFG Edition GPL Source Code +Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company. +Copyright (C) 2012 Robert Beckebans + +This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code"). + +Doom 3 BFG Edition Source Code is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Doom 3 BFG Edition Source Code is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Doom 3 BFG Edition Source Code. If not, see . + +In addition, the Doom 3 BFG Edition Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 BFG Edition Source Code. If not, please request a copy in writing from id Software at the address below. + +If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA. + +=========================================================================== +*/ +#ifndef __AL_SOUNDHARDWARE_H__ +#define __AL_SOUNDHARDWARE_H__ + +class idSoundSample_OpenAL; +class idSoundVoice_OpenAL; +// RB +class idSoundHardware_OpenAL; + +/* +================================================ +idSoundEngineCallback +================================================ +*/ +class idSoundEngineCallback : public IXAudio2EngineCallback +{ +public: + idSoundHardware_OpenAL* hardware; + +private: + // Called by XAudio2 just before an audio processing pass begins. + STDMETHOD_( void, OnProcessingPassStart )( THIS ) {} + + // Called just after an audio processing pass ends. + STDMETHOD_( void, OnProcessingPassEnd )( THIS ) {} + + // Called in the event of a critical system error which requires XAudio2 + // to be closed down and restarted. The error code is given in Error. + STDMETHOD_( void, OnCriticalError )( THIS_ HRESULT Error ); +}; + +/* +================================================ +idSoundHardware_OpenAL +================================================ +*/ + +class idSoundHardware_OpenAL +{ +public: + idSoundHardware_OpenAL(); + + void Init(); + void Shutdown(); + + void Update(); + + idSoundVoice* AllocateVoice( const idSoundSample* leadinSample, const idSoundSample* loopingSample ); + void FreeVoice( idSoundVoice* voice ); + + // video playback needs this + IXAudio2* GetIXAudio2() const + { + return pXAudio2; + }; + + int GetNumZombieVoices() const + { + return zombieVoices.Num(); + } + int GetNumFreeVoices() const + { + return freeVoices.Num(); + } + +protected: + friend class idSoundSample_OpenAL; + friend class idSoundVoice_OpenAL; + +private: + IXAudio2* pXAudio2; + IXAudio2MasteringVoice* pMasterVoice; + IXAudio2SubmixVoice* pSubmixVoice; + + idSoundEngineCallback soundEngineCallback; + int lastResetTime; + + int outputChannels; + int channelMask; + + idDebugGraph* vuMeterRMS; + idDebugGraph* vuMeterPeak; + int vuMeterPeakTimes[ 8 ]; + + // Can't stop and start a voice on the same frame, so we have to double this to handle the worst case scenario of stopping all voices and starting a full new set + idStaticList voices; + idStaticList zombieVoices; + idStaticList freeVoices; +}; + +/* +================================================ +idSoundHardware +================================================ +*/ +class idSoundHardware : public idSoundHardware_OpenAL +{ +}; + +#endif diff --git a/neo/sound/OpenAL/AL_SoundSample.cpp b/neo/sound/OpenAL/AL_SoundSample.cpp new file mode 100644 index 00000000..d51371ef --- /dev/null +++ b/neo/sound/OpenAL/AL_SoundSample.cpp @@ -0,0 +1,550 @@ +/* +=========================================================================== + +Doom 3 BFG Edition GPL Source Code +Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company. + +This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code"). + +Doom 3 BFG Edition Source Code is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Doom 3 BFG Edition Source Code is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Doom 3 BFG Edition Source Code. If not, see . + +In addition, the Doom 3 BFG Edition Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 BFG Edition Source Code. If not, please request a copy in writing from id Software at the address below. + +If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA. + +=========================================================================== +*/ +#pragma hdrstop +#include "precompiled.h" +#include "../snd_local.h" + +extern idCVar s_useCompression; +extern idCVar s_noSound; + +#define GPU_CONVERT_CPU_TO_CPU_CACHED_READONLY_ADDRESS( x ) x + +const uint32 SOUND_MAGIC_IDMSA = 0x6D7A7274; + +extern idCVar sys_lang; + +/* +======================== +AllocBuffer +======================== +*/ +static void* AllocBuffer( int size, const char* name ) +{ + return Mem_Alloc( size, TAG_AUDIO ); +} + +/* +======================== +FreeBuffer +======================== +*/ +static void FreeBuffer( void* p ) +{ + return Mem_Free( p ); +} + +/* +======================== +idSoundSample_OpenAL::idSoundSample_OpenAL +======================== +*/ +idSoundSample_OpenAL::idSoundSample_OpenAL() +{ + timestamp = FILE_NOT_FOUND_TIMESTAMP; + loaded = false; + neverPurge = false; + levelLoadReferenced = false; + + memset( &format, 0, sizeof( format ) ); + + totalBufferSize = 0; + + playBegin = 0; + playLength = 0; + + lastPlayedTime = 0; +} + +/* +======================== +idSoundSample_OpenAL::~idSoundSample_OpenAL +======================== +*/ +idSoundSample_OpenAL::~idSoundSample_OpenAL() +{ + FreeData(); +} + +/* +======================== +idSoundSample_OpenAL::WriteGeneratedSample +======================== +*/ +void idSoundSample_OpenAL::WriteGeneratedSample( idFile* fileOut ) +{ + fileOut->WriteBig( SOUND_MAGIC_IDMSA ); + fileOut->WriteBig( timestamp ); + fileOut->WriteBig( loaded ); + fileOut->WriteBig( playBegin ); + fileOut->WriteBig( playLength ); + idWaveFile::WriteWaveFormatDirect( format, fileOut ); + fileOut->WriteBig( ( int )amplitude.Num() ); + fileOut->Write( amplitude.Ptr(), amplitude.Num() ); + fileOut->WriteBig( totalBufferSize ); + fileOut->WriteBig( ( int )buffers.Num() ); + for( int i = 0; i < buffers.Num(); i++ ) + { + fileOut->WriteBig( buffers[ i ].numSamples ); + fileOut->WriteBig( buffers[ i ].bufferSize ); + fileOut->Write( buffers[ i ].buffer, buffers[ i ].bufferSize ); + }; +} +/* +======================== +idSoundSample_OpenAL::WriteAllSamples +======================== +*/ +void idSoundSample_OpenAL::WriteAllSamples( const idStr& sampleName ) +{ + idSoundSample_OpenAL* samplePC = new idSoundSample_OpenAL(); + { + idStrStatic< MAX_OSPATH > inName = sampleName; + inName.Append( ".msadpcm" ); + idStrStatic< MAX_OSPATH > inName2 = sampleName; + inName2.Append( ".wav" ); + + idStrStatic< MAX_OSPATH > outName = "generated/"; + outName.Append( sampleName ); + outName.Append( ".idwav" ); + + if( samplePC->LoadWav( inName ) || samplePC->LoadWav( inName2 ) ) + { + idFile* fileOut = fileSystem->OpenFileWrite( outName, "fs_basepath" ); + samplePC->WriteGeneratedSample( fileOut ); + delete fileOut; + } + } + delete samplePC; +} + +/* +======================== +idSoundSample_OpenAL::LoadGeneratedSound +======================== +*/ +bool idSoundSample_OpenAL::LoadGeneratedSample( const idStr& filename ) +{ + idFileLocal fileIn( fileSystem->OpenFileReadMemory( filename ) ); + if( fileIn != NULL ) + { + uint32 magic; + fileIn->ReadBig( magic ); + fileIn->ReadBig( timestamp ); + fileIn->ReadBig( loaded ); + fileIn->ReadBig( playBegin ); + fileIn->ReadBig( playLength ); + idWaveFile::ReadWaveFormatDirect( format, fileIn ); + int num; + fileIn->ReadBig( num ); + amplitude.Clear(); + amplitude.SetNum( num ); + fileIn->Read( amplitude.Ptr(), amplitude.Num() ); + fileIn->ReadBig( totalBufferSize ); + fileIn->ReadBig( num ); + buffers.SetNum( num ); + for( int i = 0; i < num; i++ ) + { + fileIn->ReadBig( buffers[ i ].numSamples ); + fileIn->ReadBig( buffers[ i ].bufferSize ); + buffers[ i ].buffer = AllocBuffer( buffers[ i ].bufferSize, GetName() ); + fileIn->Read( buffers[ i ].buffer, buffers[ i ].bufferSize ); + buffers[ i ].buffer = GPU_CONVERT_CPU_TO_CPU_CACHED_READONLY_ADDRESS( buffers[ i ].buffer ); + } + return true; + } + return false; +} +/* +======================== +idSoundSample_OpenAL::Load +======================== +*/ +void idSoundSample_OpenAL::LoadResource() +{ + FreeData(); + + if( idStr::Icmpn( GetName(), "_default", 8 ) == 0 ) + { + MakeDefault(); + return; + } + + if( s_noSound.GetBool() ) + { + MakeDefault(); + return; + } + + loaded = false; + + for( int i = 0; i < 2; i++ ) + { + idStrStatic< MAX_OSPATH > sampleName = GetName(); + if( ( i == 0 ) && !sampleName.Replace( "/vo/", va( "/vo/%s/", sys_lang.GetString() ) ) ) + { + i++; + } + idStrStatic< MAX_OSPATH > generatedName = "generated/"; + generatedName.Append( sampleName ); + + { + if( s_useCompression.GetBool() ) + { + sampleName.Append( ".msadpcm" ); + } + else + { + sampleName.Append( ".wav" ); + } + generatedName.Append( ".idwav" ); + } + loaded = LoadGeneratedSample( generatedName ) || LoadWav( sampleName ); + + if( !loaded && s_useCompression.GetBool() ) + { + sampleName.SetFileExtension( "wav" ); + loaded = LoadWav( sampleName ); + } + + if( loaded ) + { + if( cvarSystem->GetCVarBool( "fs_buildresources" ) ) + { + fileSystem->AddSamplePreload( GetName() ); + WriteAllSamples( GetName() ); + + if( sampleName.Find( "/vo/" ) >= 0 ) + { + for( int i = 0; i < Sys_NumLangs(); i++ ) + { + const char* lang = Sys_Lang( i ); + if( idStr::Icmp( lang, ID_LANG_ENGLISH ) == 0 ) + { + continue; + } + idStrStatic< MAX_OSPATH > locName = GetName(); + locName.Replace( "/vo/", va( "/vo/%s/", Sys_Lang( i ) ) ); + WriteAllSamples( locName ); + } + } + } + return; + } + } + + if( !loaded ) + { + // make it default if everything else fails + MakeDefault(); + } + return; +} + +/* +======================== +idSoundSample_OpenAL::LoadWav +======================== +*/ +bool idSoundSample_OpenAL::LoadWav( const idStr& filename ) +{ + + // load the wave + idWaveFile wave; + if( !wave.Open( filename ) ) + { + return false; + } + + idStrStatic< MAX_OSPATH > sampleName = filename; + sampleName.SetFileExtension( "amp" ); + LoadAmplitude( sampleName ); + + const char* formatError = wave.ReadWaveFormat( format ); + if( formatError != NULL ) + { + idLib::Warning( "LoadWav( %s ) : %s", filename.c_str(), formatError ); + MakeDefault(); + return false; + } + timestamp = wave.Timestamp(); + + totalBufferSize = wave.SeekToChunk( 'data' ); + + if( format.basic.formatTag == idWaveFile::FORMAT_PCM || format.basic.formatTag == idWaveFile::FORMAT_EXTENSIBLE ) + { + + if( format.basic.bitsPerSample != 16 ) + { + idLib::Warning( "LoadWav( %s ) : %s", filename.c_str(), "Not a 16 bit PCM wav file" ); + MakeDefault(); + return false; + } + + playBegin = 0; + playLength = ( totalBufferSize ) / format.basic.blockSize; + + buffers.SetNum( 1 ); + buffers[0].bufferSize = totalBufferSize; + buffers[0].numSamples = playLength; + buffers[0].buffer = AllocBuffer( totalBufferSize, GetName() ); + + + wave.Read( buffers[0].buffer, totalBufferSize ); + + if( format.basic.bitsPerSample == 16 ) + { + idSwap::LittleArray( ( short* )buffers[0].buffer, totalBufferSize / sizeof( short ) ); + } + + buffers[0].buffer = GPU_CONVERT_CPU_TO_CPU_CACHED_READONLY_ADDRESS( buffers[0].buffer ); + + } + else if( format.basic.formatTag == idWaveFile::FORMAT_ADPCM ) + { + + playBegin = 0; + playLength = ( ( totalBufferSize / format.basic.blockSize ) * format.extra.adpcm.samplesPerBlock ); + + buffers.SetNum( 1 ); + buffers[0].bufferSize = totalBufferSize; + buffers[0].numSamples = playLength; + buffers[0].buffer = AllocBuffer( totalBufferSize, GetName() ); + + wave.Read( buffers[0].buffer, totalBufferSize ); + + buffers[0].buffer = GPU_CONVERT_CPU_TO_CPU_CACHED_READONLY_ADDRESS( buffers[0].buffer ); + + } + else if( format.basic.formatTag == idWaveFile::FORMAT_XMA2 ) + { + + if( format.extra.xma2.blockCount == 0 ) + { + idLib::Warning( "LoadWav( %s ) : %s", filename.c_str(), "No data blocks in file" ); + MakeDefault(); + return false; + } + + int bytesPerBlock = format.extra.xma2.bytesPerBlock; + assert( format.extra.xma2.blockCount == ALIGN( totalBufferSize, bytesPerBlock ) / bytesPerBlock ); + assert( format.extra.xma2.blockCount * bytesPerBlock >= totalBufferSize ); + assert( format.extra.xma2.blockCount * bytesPerBlock < totalBufferSize + bytesPerBlock ); + + buffers.SetNum( format.extra.xma2.blockCount ); + for( int i = 0; i < buffers.Num(); i++ ) + { + if( i == buffers.Num() - 1 ) + { + buffers[i].bufferSize = totalBufferSize - ( i * bytesPerBlock ); + } + else + { + buffers[i].bufferSize = bytesPerBlock; + } + + buffers[i].buffer = AllocBuffer( buffers[i].bufferSize, GetName() ); + wave.Read( buffers[i].buffer, buffers[i].bufferSize ); + buffers[i].buffer = GPU_CONVERT_CPU_TO_CPU_CACHED_READONLY_ADDRESS( buffers[i].buffer ); + } + + int seekTableSize = wave.SeekToChunk( 'seek' ); + if( seekTableSize != 4 * buffers.Num() ) + { + idLib::Warning( "LoadWav( %s ) : %s", filename.c_str(), "Wrong number of entries in seek table" ); + MakeDefault(); + return false; + } + + for( int i = 0; i < buffers.Num(); i++ ) + { + wave.Read( &buffers[i].numSamples, sizeof( buffers[i].numSamples ) ); + idSwap::Big( buffers[i].numSamples ); + } + + playBegin = format.extra.xma2.loopBegin; + playLength = format.extra.xma2.loopLength; + + if( buffers[buffers.Num() - 1].numSamples < playBegin + playLength ) + { + // This shouldn't happen, but it's not fatal if it does + playLength = buffers[buffers.Num() - 1].numSamples - playBegin; + } + else + { + // Discard samples beyond playLength + for( int i = 0; i < buffers.Num(); i++ ) + { + if( buffers[i].numSamples > playBegin + playLength ) + { + buffers[i].numSamples = playBegin + playLength; + // Ideally, the following loop should always have 0 iterations because playBegin + playLength ends in the last block already + // But there is no guarantee for that, so to be safe, discard all buffers beyond this one + for( int j = i + 1; j < buffers.Num(); j++ ) + { + FreeBuffer( buffers[j].buffer ); + } + buffers.SetNum( i + 1 ); + break; + } + } + } + + } + else + { + idLib::Warning( "LoadWav( %s ) : Unsupported wave format %d", filename.c_str(), format.basic.formatTag ); + MakeDefault(); + return false; + } + + wave.Close(); + + if( format.basic.formatTag == idWaveFile::FORMAT_EXTENSIBLE ) + { + // HACK: XAudio2 doesn't really support FORMAT_EXTENSIBLE so we convert it to a basic format after extracting the channel mask + format.basic.formatTag = format.extra.extensible.subFormat.data1; + } + + // sanity check... + assert( buffers[buffers.Num() - 1].numSamples == playBegin + playLength ); + + return true; +} + + +/* +======================== +idSoundSample_OpenAL::MakeDefault +======================== +*/ +void idSoundSample_OpenAL::MakeDefault() +{ + FreeData(); + + static const int DEFAULT_NUM_SAMPLES = 256; + + timestamp = FILE_NOT_FOUND_TIMESTAMP; + loaded = true; + + memset( &format, 0, sizeof( format ) ); + format.basic.formatTag = idWaveFile::FORMAT_PCM; + format.basic.numChannels = 1; + format.basic.bitsPerSample = 16; + format.basic.samplesPerSec = XAUDIO2_MIN_SAMPLE_RATE; + format.basic.blockSize = format.basic.numChannels * format.basic.bitsPerSample / 8; + format.basic.avgBytesPerSec = format.basic.samplesPerSec * format.basic.blockSize; + + assert( format.basic.blockSize == 2 ); + + totalBufferSize = DEFAULT_NUM_SAMPLES * 2; + + short* defaultBuffer = ( short* )AllocBuffer( totalBufferSize, GetName() ); + for( int i = 0; i < DEFAULT_NUM_SAMPLES; i += 2 ) + { + defaultBuffer[i + 0] = SHRT_MIN; + defaultBuffer[i + 1] = SHRT_MAX; + } + + buffers.SetNum( 1 ); + buffers[0].buffer = defaultBuffer; + buffers[0].bufferSize = totalBufferSize; + buffers[0].numSamples = DEFAULT_NUM_SAMPLES; + buffers[0].buffer = GPU_CONVERT_CPU_TO_CPU_CACHED_READONLY_ADDRESS( buffers[0].buffer ); + + playBegin = 0; + playLength = DEFAULT_NUM_SAMPLES; +} + +/* +======================== +idSoundSample_OpenAL::FreeData + +Called before deleting the object and at the start of LoadResource() +======================== +*/ +void idSoundSample_OpenAL::FreeData() +{ + if( buffers.Num() > 0 ) + { + soundSystemLocal.StopVoicesWithSample( ( idSoundSample* )this ); + for( int i = 0; i < buffers.Num(); i++ ) + { + FreeBuffer( buffers[i].buffer ); + } + buffers.Clear(); + } + amplitude.Clear(); + + timestamp = FILE_NOT_FOUND_TIMESTAMP; + memset( &format, 0, sizeof( format ) ); + loaded = false; + totalBufferSize = 0; + playBegin = 0; + playLength = 0; +} + +/* +======================== +idSoundSample_OpenAL::LoadAmplitude +======================== +*/ +bool idSoundSample_OpenAL::LoadAmplitude( const idStr& name ) +{ + amplitude.Clear(); + idFileLocal f( fileSystem->OpenFileRead( name ) ); + if( f == NULL ) + { + return false; + } + amplitude.SetNum( f->Length() ); + f->Read( amplitude.Ptr(), amplitude.Num() ); + return true; +} + +/* +======================== +idSoundSample_OpenAL::GetAmplitude +======================== +*/ +float idSoundSample_OpenAL::GetAmplitude( int timeMS ) const +{ + if( timeMS < 0 || timeMS > LengthInMsec() ) + { + return 0.0f; + } + if( IsDefault() ) + { + return 1.0f; + } + int index = timeMS * 60 / 1000; + if( index < 0 || index >= amplitude.Num() ) + { + return 0.0f; + } + return ( float )amplitude[index] / 255.0f; +} diff --git a/neo/sound/OpenAL/AL_SoundSample.h b/neo/sound/OpenAL/AL_SoundSample.h new file mode 100644 index 00000000..8f1a8487 --- /dev/null +++ b/neo/sound/OpenAL/AL_SoundSample.h @@ -0,0 +1,186 @@ +/* +=========================================================================== + +Doom 3 BFG Edition GPL Source Code +Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company. + +This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code"). + +Doom 3 BFG Edition Source Code is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Doom 3 BFG Edition Source Code is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Doom 3 BFG Edition Source Code. If not, see . + +In addition, the Doom 3 BFG Edition Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 BFG Edition Source Code. If not, please request a copy in writing from id Software at the address below. + +If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA. + +=========================================================================== +*/ +#ifndef __AL_SOUNDSAMPLE_H__ +#define __AL_SOUNDSAMPLE_H__ + +/* +================================================ +idSoundSample_OpenAL +================================================ +*/ +class idSampleInfo; +class idSoundSample_OpenAL +{ +public: + idSoundSample_OpenAL(); + + // Loads and initializes the resource based on the name. + virtual void LoadResource(); + + void SetName( const char* n ) + { + name = n; + } + const char* GetName() const + { + return name; + } + ID_TIME_T GetTimestamp() const + { + return timestamp; + } + + // turns it into a beep + void MakeDefault(); + + // frees all data + void FreeData(); + + int LengthInMsec() const + { + return SamplesToMsec( NumSamples(), SampleRate() ); + } + int SampleRate() const + { + return format.basic.samplesPerSec; + } + int NumSamples() const + { + return playLength; + } + int NumChannels() const + { + return format.basic.numChannels; + } + int BufferSize() const + { + return totalBufferSize; + } + + bool IsCompressed() const + { + return ( format.basic.formatTag != idWaveFile::FORMAT_PCM ); + } + + bool IsDefault() const + { + return timestamp == FILE_NOT_FOUND_TIMESTAMP; + } + bool IsLoaded() const + { + return loaded; + } + + void SetNeverPurge() + { + neverPurge = true; + } + bool GetNeverPurge() const + { + return neverPurge; + } + + void SetLevelLoadReferenced() + { + levelLoadReferenced = true; + } + void ResetLevelLoadReferenced() + { + levelLoadReferenced = false; + } + bool GetLevelLoadReferenced() const + { + return levelLoadReferenced; + } + + int GetLastPlayedTime() const + { + return lastPlayedTime; + } + void SetLastPlayedTime( int t ) + { + lastPlayedTime = t; + } + + float GetAmplitude( int timeMS ) const; + +protected: + friend class idSoundHardware_OpenAL; + friend class idSoundVoice_OpenAL; + + ~idSoundSample_OpenAL(); + + bool LoadWav( const idStr& name ); + bool LoadAmplitude( const idStr& name ); + void WriteAllSamples( const idStr& sampleName ); + bool LoadGeneratedSample( const idStr& name ); + void WriteGeneratedSample( idFile* fileOut ); + + struct sampleBuffer_t + { + void* buffer; + int bufferSize; + int numSamples; + }; + + idStr name; + + ID_TIME_T timestamp; + bool loaded; + + bool neverPurge; + bool levelLoadReferenced; + bool usesMapHeap; + + uint32 lastPlayedTime; + + int totalBufferSize; // total size of all the buffers + idList buffers; + + int playBegin; + int playLength; + + idWaveFile::waveFmt_t format; + + idList amplitude; +}; + +/* +================================================ +idSoundSample + +This reverse-inheritance purportedly makes working on +multiple platforms easier. +================================================ +*/ +class idSoundSample : public idSoundSample_OpenAL +{ +public: +}; + +#endif diff --git a/neo/sound/OpenAL/AL_SoundVoice.cpp b/neo/sound/OpenAL/AL_SoundVoice.cpp new file mode 100644 index 00000000..073c6d1a --- /dev/null +++ b/neo/sound/OpenAL/AL_SoundVoice.cpp @@ -0,0 +1,574 @@ +/* +=========================================================================== + +Doom 3 BFG Edition GPL Source Code +Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company. + +This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code"). + +Doom 3 BFG Edition Source Code is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Doom 3 BFG Edition Source Code is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Doom 3 BFG Edition Source Code. If not, see . + +In addition, the Doom 3 BFG Edition Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 BFG Edition Source Code. If not, please request a copy in writing from id Software at the address below. + +If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA. + +=========================================================================== +*/ +#pragma hdrstop +#include "precompiled.h" +#include "../snd_local.h" + +idCVar s_skipHardwareSets( "s_skipHardwareSets", "0", CVAR_BOOL, "Do all calculation, but skip XA2 calls" ); +idCVar s_debugHardware( "s_debugHardware", "0", CVAR_BOOL, "Print a message any time a hardware voice changes" ); + +// The whole system runs at this sample rate +static int SYSTEM_SAMPLE_RATE = 44100; +static float ONE_OVER_SYSTEM_SAMPLE_RATE = 1.0f / SYSTEM_SAMPLE_RATE; + +/* +======================== +idStreamingVoiceContext +======================== +*/ +class idStreamingVoiceContext : public IXAudio2VoiceCallback +{ +public: + STDMETHOD_( void, OnVoiceProcessingPassStart )( UINT32 BytesRequired ) {} + STDMETHOD_( void, OnVoiceProcessingPassEnd )() {} + STDMETHOD_( void, OnStreamEnd )() {} + STDMETHOD_( void, OnBufferStart )( void* pContext ) + { + idSoundSystemLocal::bufferContext_t* bufferContext = ( idSoundSystemLocal::bufferContext_t* ) pContext; + bufferContext->voice->OnBufferStart( bufferContext->sample, bufferContext->bufferNumber ); + } + STDMETHOD_( void, OnLoopEnd )( void* ) {} + STDMETHOD_( void, OnVoiceError )( void*, HRESULT hr ) + { + idLib::Warning( "OnVoiceError( %d )", hr ); + } + STDMETHOD_( void, OnBufferEnd )( void* pContext ) + { + idSoundSystemLocal::bufferContext_t* bufferContext = ( idSoundSystemLocal::bufferContext_t* ) pContext; + soundSystemLocal.ReleaseStreamBufferContext( bufferContext ); + } +} streamContext; + +/* +======================== +idSoundVoice_OpenAL::idSoundVoice_OpenAL +======================== +*/ +idSoundVoice_OpenAL::idSoundVoice_OpenAL() + : pSourceVoice( NULL ), + leadinSample( NULL ), + loopingSample( NULL ), + formatTag( 0 ), + numChannels( 0 ), + sampleRate( 0 ), + paused( true ), + hasVUMeter( false ) +{ + +} + +/* +======================== +idSoundVoice_OpenAL::~idSoundVoice_OpenAL +======================== +*/ +idSoundVoice_OpenAL::~idSoundVoice_OpenAL() +{ + DestroyInternal(); +} + +/* +======================== +idSoundVoice_OpenAL::CompatibleFormat +======================== +*/ +bool idSoundVoice_OpenAL::CompatibleFormat( idSoundSample_OpenAL* s ) +{ + if( pSourceVoice == NULL ) + { + // If this voice has never been allocated, then it's compatible with everything + return true; + } + return false; +} + +/* +======================== +idSoundVoice_OpenAL::Create +======================== +*/ +void idSoundVoice_OpenAL::Create( const idSoundSample* leadinSample_, const idSoundSample* loopingSample_ ) +{ + if( IsPlaying() ) + { + // This should never hit + Stop(); + return; + } + leadinSample = ( idSoundSample_OpenAL* )leadinSample_; + loopingSample = ( idSoundSample_OpenAL* )loopingSample_; + + if( pSourceVoice != NULL && CompatibleFormat( leadinSample ) ) + { + sampleRate = leadinSample->format.basic.samplesPerSec; + } + else + { + DestroyInternal(); + formatTag = leadinSample->format.basic.formatTag; + numChannels = leadinSample->format.basic.numChannels; + sampleRate = leadinSample->format.basic.samplesPerSec; + + soundSystemLocal.hardware.pXAudio2->CreateSourceVoice( &pSourceVoice, ( const WAVEFORMATEX* )&leadinSample->format, XAUDIO2_VOICE_USEFILTER, 4.0f, &streamContext ); + if( pSourceVoice == NULL ) + { + // If this hits, then we are most likely passing an invalid sample format, which should have been caught by the loader (and the sample defaulted) + return; + } + if( s_debugHardware.GetBool() ) + { + if( loopingSample == NULL || loopingSample == leadinSample ) + { + idLib::Printf( "%dms: %p created for %s\n", Sys_Milliseconds(), pSourceVoice, leadinSample ? leadinSample->GetName() : "" ); + } + else + { + idLib::Printf( "%dms: %p created for %s and %s\n", Sys_Milliseconds(), pSourceVoice, leadinSample ? leadinSample->GetName() : "", loopingSample ? loopingSample->GetName() : "" ); + } + } + } + sourceVoiceRate = sampleRate; + pSourceVoice->SetSourceSampleRate( sampleRate ); + pSourceVoice->SetVolume( 0.0f ); +} + +/* +======================== +idSoundVoice_OpenAL::DestroyInternal +======================== +*/ +void idSoundVoice_OpenAL::DestroyInternal() +{ + if( pSourceVoice != NULL ) + { + if( s_debugHardware.GetBool() ) + { + idLib::Printf( "%dms: %p destroyed\n", Sys_Milliseconds(), pSourceVoice ); + } + pSourceVoice->DestroyVoice(); + pSourceVoice = NULL; + hasVUMeter = false; + } +} + +/* +======================== +idSoundVoice_OpenAL::Start +======================== +*/ +void idSoundVoice_OpenAL::Start( int offsetMS, int ssFlags ) +{ + + if( s_debugHardware.GetBool() ) + { + idLib::Printf( "%dms: %p starting %s @ %dms\n", Sys_Milliseconds(), pSourceVoice, leadinSample ? leadinSample->GetName() : "", offsetMS ); + } + + if( !leadinSample ) + { + return; + } + if( !pSourceVoice ) + { + return; + } + + if( leadinSample->IsDefault() ) + { + idLib::Warning( "Starting defaulted sound sample %s", leadinSample->GetName() ); + } + + bool flicker = ( ssFlags & SSF_NO_FLICKER ) == 0; + + if( flicker != hasVUMeter ) + { + hasVUMeter = flicker; + + if( flicker ) + { + IUnknown* vuMeter = NULL; + if( XAudio2CreateVolumeMeter( &vuMeter, 0 ) == S_OK ) + { + + XAUDIO2_EFFECT_DESCRIPTOR descriptor; + descriptor.InitialState = true; + descriptor.OutputChannels = leadinSample->NumChannels(); + descriptor.pEffect = vuMeter; + + XAUDIO2_EFFECT_CHAIN chain; + chain.EffectCount = 1; + chain.pEffectDescriptors = &descriptor; + + pSourceVoice->SetEffectChain( &chain ); + + vuMeter->Release(); + } + } + else + { + pSourceVoice->SetEffectChain( NULL ); + } + } + + assert( offsetMS >= 0 ); + int offsetSamples = MsecToSamples( offsetMS, leadinSample->SampleRate() ); + if( loopingSample == NULL && offsetSamples >= leadinSample->playLength ) + { + return; + } + + RestartAt( offsetSamples ); + Update(); + UnPause(); +} + +/* +======================== +idSoundVoice_OpenAL::RestartAt +======================== +*/ +int idSoundVoice_OpenAL::RestartAt( int offsetSamples ) +{ + offsetSamples &= ~127; + + idSoundSample_OpenAL* sample = leadinSample; + if( offsetSamples >= leadinSample->playLength ) + { + if( loopingSample != NULL ) + { + offsetSamples %= loopingSample->playLength; + sample = loopingSample; + } + else + { + return 0; + } + } + + int previousNumSamples = 0; + for( int i = 0; i < sample->buffers.Num(); i++ ) + { + if( sample->buffers[i].numSamples > sample->playBegin + offsetSamples ) + { + return SubmitBuffer( sample, i, sample->playBegin + offsetSamples - previousNumSamples ); + } + previousNumSamples = sample->buffers[i].numSamples; + } + + return 0; +} + +/* +======================== +idSoundVoice_OpenAL::SubmitBuffer +======================== +*/ +int idSoundVoice_OpenAL::SubmitBuffer( idSoundSample_OpenAL* sample, int bufferNumber, int offset ) +{ + + if( sample == NULL || ( bufferNumber < 0 ) || ( bufferNumber >= sample->buffers.Num() ) ) + { + return 0; + } + idSoundSystemLocal::bufferContext_t* bufferContext = soundSystemLocal.ObtainStreamBufferContext(); + if( bufferContext == NULL ) + { + idLib::Warning( "No free buffer contexts!" ); + return 0; + } + + bufferContext->voice = this; + bufferContext->sample = sample; + bufferContext->bufferNumber = bufferNumber; + + XAUDIO2_BUFFER buffer = { 0 }; + if( offset > 0 ) + { + int previousNumSamples = 0; + if( bufferNumber > 0 ) + { + previousNumSamples = sample->buffers[bufferNumber - 1].numSamples; + } + buffer.PlayBegin = offset; + buffer.PlayLength = sample->buffers[bufferNumber].numSamples - previousNumSamples - offset; + } + buffer.AudioBytes = sample->buffers[bufferNumber].bufferSize; + buffer.pAudioData = ( BYTE* )sample->buffers[bufferNumber].buffer; + buffer.pContext = bufferContext; + if( ( loopingSample == NULL ) && ( bufferNumber == sample->buffers.Num() - 1 ) ) + { + buffer.Flags = XAUDIO2_END_OF_STREAM; + } + pSourceVoice->SubmitSourceBuffer( &buffer ); + + return buffer.AudioBytes; +} + +/* +======================== +idSoundVoice_OpenAL::Update +======================== +*/ +bool idSoundVoice_OpenAL::Update() +{ + if( pSourceVoice == NULL || leadinSample == NULL ) + { + return false; + } + + XAUDIO2_VOICE_STATE state; + pSourceVoice->GetState( &state ); + + const int srcChannels = leadinSample->NumChannels(); + + float pLevelMatrix[ MAX_CHANNELS_PER_VOICE * MAX_CHANNELS_PER_VOICE ] = { 0 }; + CalculateSurround( srcChannels, pLevelMatrix, 1.0f ); + + if( s_skipHardwareSets.GetBool() ) + { + return true; + } + + pSourceVoice->SetOutputMatrix( soundSystemLocal.hardware.pMasterVoice, srcChannels, dstChannels, pLevelMatrix, OPERATION_SET ); + + assert( idMath::Fabs( gain ) <= XAUDIO2_MAX_VOLUME_LEVEL ); + pSourceVoice->SetVolume( gain, OPERATION_SET ); + + SetSampleRate( sampleRate, OPERATION_SET ); + + // we don't do this any longer because we pause and unpause explicitly when the soundworld is paused or unpaused + // UnPause(); + return true; +} + +/* +======================== +idSoundVoice_OpenAL::IsPlaying +======================== +*/ +bool idSoundVoice_OpenAL::IsPlaying() +{ + if( pSourceVoice == NULL ) + { + return false; + } + XAUDIO2_VOICE_STATE state; + pSourceVoice->GetState( &state ); + return ( state.BuffersQueued != 0 ); +} + +/* +======================== +idSoundVoice_OpenAL::FlushSourceBuffers +======================== +*/ +void idSoundVoice_OpenAL::FlushSourceBuffers() +{ + if( pSourceVoice != NULL ) + { + pSourceVoice->FlushSourceBuffers(); + } +} + +/* +======================== +idSoundVoice_OpenAL::Pause +======================== +*/ +void idSoundVoice_OpenAL::Pause() +{ + if( !pSourceVoice || paused ) + { + return; + } + if( s_debugHardware.GetBool() ) + { + idLib::Printf( "%dms: %p pausing %s\n", Sys_Milliseconds(), pSourceVoice, leadinSample ? leadinSample->GetName() : "" ); + } + pSourceVoice->Stop( 0, OPERATION_SET ); + paused = true; +} + +/* +======================== +idSoundVoice_OpenAL::UnPause +======================== +*/ +void idSoundVoice_OpenAL::UnPause() +{ + if( !pSourceVoice || !paused ) + { + return; + } + if( s_debugHardware.GetBool() ) + { + idLib::Printf( "%dms: %p unpausing %s\n", Sys_Milliseconds(), pSourceVoice, leadinSample ? leadinSample->GetName() : "" ); + } + pSourceVoice->Start( 0, OPERATION_SET ); + paused = false; +} + +/* +======================== +idSoundVoice_OpenAL::Stop +======================== +*/ +void idSoundVoice_OpenAL::Stop() +{ + if( !pSourceVoice ) + { + return; + } + if( !paused ) + { + if( s_debugHardware.GetBool() ) + { + idLib::Printf( "%dms: %p stopping %s\n", Sys_Milliseconds(), pSourceVoice, leadinSample ? leadinSample->GetName() : "" ); + } + pSourceVoice->Stop( 0, OPERATION_SET ); + paused = true; + } +} + +/* +======================== +idSoundVoice_OpenAL::GetAmplitude +======================== +*/ +float idSoundVoice_OpenAL::GetAmplitude() +{ + if( !hasVUMeter ) + { + return 1.0f; + } + + float peakLevels[ MAX_CHANNELS_PER_VOICE ]; + float rmsLevels[ MAX_CHANNELS_PER_VOICE ]; + + XAUDIO2FX_VOLUMEMETER_LEVELS levels; + levels.ChannelCount = leadinSample->NumChannels(); + levels.pPeakLevels = peakLevels; + levels.pRMSLevels = rmsLevels; + + if( levels.ChannelCount > MAX_CHANNELS_PER_VOICE ) + { + levels.ChannelCount = MAX_CHANNELS_PER_VOICE; + } + + if( pSourceVoice->GetEffectParameters( 0, &levels, sizeof( levels ) ) != S_OK ) + { + return 0.0f; + } + + if( levels.ChannelCount == 1 ) + { + return rmsLevels[0]; + } + + float rms = 0.0f; + for( uint32 i = 0; i < levels.ChannelCount; i++ ) + { + rms += rmsLevels[i]; + } + + return rms / ( float )levels.ChannelCount; +} + +/* +======================== +idSoundVoice_OpenAL::ResetSampleRate +======================== +*/ +void idSoundVoice_OpenAL::SetSampleRate( uint32 newSampleRate, uint32 operationSet ) +{ + if( pSourceVoice == NULL || leadinSample == NULL ) + { + return; + } + + sampleRate = newSampleRate; + + XAUDIO2_FILTER_PARAMETERS filter; + filter.Type = LowPassFilter; + filter.OneOverQ = 1.0f; // [0.0f, XAUDIO2_MAX_FILTER_ONEOVERQ] + float cutoffFrequency = 1000.0f / Max( 0.01f, occlusion ); + if( cutoffFrequency * 6.0f >= ( float )sampleRate ) + { + filter.Frequency = XAUDIO2_MAX_FILTER_FREQUENCY; + } + else + { + filter.Frequency = 2.0f * idMath::Sin( idMath::PI * cutoffFrequency / ( float )sampleRate ); + } + assert( filter.Frequency >= 0.0f && filter.Frequency <= XAUDIO2_MAX_FILTER_FREQUENCY ); + filter.Frequency = idMath::ClampFloat( 0.0f, XAUDIO2_MAX_FILTER_FREQUENCY, filter.Frequency ); + + pSourceVoice->SetFilterParameters( &filter, operationSet ); + + float freqRatio = pitch * ( float )sampleRate / ( float )sourceVoiceRate; + assert( freqRatio >= XAUDIO2_MIN_FREQ_RATIO && freqRatio <= XAUDIO2_MAX_FREQ_RATIO ); + freqRatio = idMath::ClampFloat( XAUDIO2_MIN_FREQ_RATIO, XAUDIO2_MAX_FREQ_RATIO, freqRatio ); + + // if the value specified for maxFreqRatio is too high for the specified format, the call to CreateSourceVoice will fail + if( numChannels == 1 ) + { + assert( freqRatio * ( float )SYSTEM_SAMPLE_RATE <= XAUDIO2_MAX_RATIO_TIMES_RATE_XMA_MONO ); + } + else + { + assert( freqRatio * ( float )SYSTEM_SAMPLE_RATE <= XAUDIO2_MAX_RATIO_TIMES_RATE_XMA_MULTICHANNEL ); + } + pSourceVoice->SetFrequencyRatio( freqRatio, operationSet ); +} + +/* +======================== +idSoundVoice_OpenAL::OnBufferStart +======================== +*/ +void idSoundVoice_OpenAL::OnBufferStart( idSoundSample_OpenAL* sample, int bufferNumber ) +{ + SetSampleRate( sample->SampleRate(), XAUDIO2_COMMIT_NOW ); + + idSoundSample_OpenAL* nextSample = sample; + int nextBuffer = bufferNumber + 1; + if( nextBuffer == sample->buffers.Num() ) + { + if( sample == leadinSample ) + { + if( loopingSample == NULL ) + { + return; + } + nextSample = loopingSample; + } + nextBuffer = 0; + } + + SubmitBuffer( nextSample, nextBuffer, 0 ); +} diff --git a/neo/sound/OpenAL/AL_SoundVoice.h b/neo/sound/OpenAL/AL_SoundVoice.h new file mode 100644 index 00000000..3519565c --- /dev/null +++ b/neo/sound/OpenAL/AL_SoundVoice.h @@ -0,0 +1,119 @@ +/* +=========================================================================== + +Doom 3 BFG Edition GPL Source Code +Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company. + +This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code"). + +Doom 3 BFG Edition Source Code is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Doom 3 BFG Edition Source Code is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Doom 3 BFG Edition Source Code. If not, see . + +In addition, the Doom 3 BFG Edition Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 BFG Edition Source Code. If not, please request a copy in writing from id Software at the address below. + +If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA. + +=========================================================================== +*/ +#ifndef __AL_SOUNDVOICE_H__ +#define __AL_SOUNDVOICE_H__ + +static const int MAX_QUEUED_BUFFERS = 3; + +/* +================================================ +idSoundVoice_OpenAL +================================================ +*/ +class idSoundVoice_OpenAL : public idSoundVoice_Base +{ +public: + idSoundVoice_OpenAL(); + ~idSoundVoice_OpenAL(); + + void Create( const idSoundSample* leadinSample, const idSoundSample* loopingSample ); + + // Start playing at a particular point in the buffer. Does an Update() too + void Start( int offsetMS, int ssFlags ); + + // Stop playing. + void Stop(); + + // Stop consuming buffers + void Pause(); + // Start consuming buffers again + void UnPause(); + + // Sends new position/volume/pitch information to the hardware + bool Update(); + + // returns the RMS levels of the most recently processed block of audio, SSF_FLICKER must have been passed to Start + float GetAmplitude(); + + // returns true if we can re-use this voice + bool CompatibleFormat( idSoundSample_OpenAL* s ); + + uint32 GetSampleRate() const + { + return sampleRate; + } + + // callback function + void OnBufferStart( idSoundSample_OpenAL* sample, int bufferNumber ); + +private: + friend class idSoundHardware_OpenAL; + + // Returns true when all the buffers are finished processing + bool IsPlaying(); + + // Called after the voice has been stopped + void FlushSourceBuffers(); + + // Destroy the internal hardware resource + void DestroyInternal(); + + // Helper function used by the initial start as well as for looping a streamed buffer + int RestartAt( int offsetSamples ); + + // Helper function to submit a buffer + int SubmitBuffer( idSoundSample_OpenAL* sample, int bufferNumber, int offset ); + + // Adjust the voice frequency based on the new sample rate for the buffer + void SetSampleRate( uint32 newSampleRate, uint32 operationSet ); + + IXAudio2SourceVoice* pSourceVoice; + idSoundSample_OpenAL* leadinSample; + idSoundSample_OpenAL* loopingSample; + + // These are the fields from the sample format that matter to us for voice reuse + uint16 formatTag; + uint16 numChannels; + + uint32 sourceVoiceRate; + uint32 sampleRate; + + bool hasVUMeter; + bool paused; +}; + +/* +================================================ +idSoundVoice +================================================ +*/ +class idSoundVoice : public idSoundVoice_OpenAL +{ +}; + +#endif diff --git a/neo/sound/snd_local.h b/neo/sound/snd_local.h index 5a945add..5a84f11a 100644 --- a/neo/sound/snd_local.h +++ b/neo/sound/snd_local.h @@ -3,6 +3,7 @@ Doom 3 BFG Edition GPL Source Code Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company. +Copyright (C) 2013 Robert Beckebans This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code"). @@ -110,11 +111,17 @@ typedef enum #if (_WIN32_WINNT < 0x0602 /*_WIN32_WINNT_WIN8*/) #include #endif -// RB end +#if defined(USE_OPENAL) +#include "OpenAL/AL_SoundSample.h" +#include "OpenAL/AL_SoundVoice.h" +#include "OpenAL/AL_SoundHardware.h" +#else #include "XAudio2/XA2_SoundSample.h" #include "XAudio2/XA2_SoundVoice.h" #include "XAudio2/XA2_SoundHardware.h" +#endif +// RB end #else // not _MSC_VER => MinGW, GCC, ... // just a stub for now @@ -490,7 +497,10 @@ public: bufferNumber( 0 ) { } -#ifdef _MSC_VER // XAudio backend +#if defined(USE_OPENAL) + idSoundVoice_OpenAL* voice; + idSoundSample_OpenAL* sample; +#elif defined(_MSC_VER) // XAudio backend // DG: because the inheritance is kinda strange (idSoundVoice is derived // from idSoundVoice_XAudio2), casting the latter to the former isn't possible // so we need this ugly #ifdef .. From 038037e52445db79563ec4f182ac5f44fd7eb64f Mon Sep 17 00:00:00 2001 From: Robert Beckebans Date: Thu, 3 Jan 2013 16:56:25 +0100 Subject: [PATCH 31/57] Replaced most XAudio2 calls with OpenAL --- neo/CMakeLists.txt | 4 + neo/sound/OpenAL/AL_SoundHardware.cpp | 226 ++++++-------------------- neo/sound/OpenAL/AL_SoundHardware.h | 28 +++- neo/sound/OpenAL/AL_SoundSample.cpp | 3 +- neo/sound/OpenAL/AL_SoundSample.h | 1 + neo/sound/OpenAL/AL_SoundVoice.cpp | 136 +++++++++++----- neo/sound/OpenAL/AL_SoundVoice.h | 10 +- neo/sound/snd_local.h | 15 +- neo/sound/snd_system.cpp | 7 + 9 files changed, 200 insertions(+), 230 deletions(-) diff --git a/neo/CMakeLists.txt b/neo/CMakeLists.txt index b702c4ed..ec09fdcc 100644 --- a/neo/CMakeLists.txt +++ b/neo/CMakeLists.txt @@ -1048,6 +1048,9 @@ if(MSVC) list(APPEND RBDOOM3_INCLUDES ${OPENAL_INCLUDES}) list(APPEND RBDOOM3_SOURCES ${OPENAL_SOURCES}) + + set(OpenAL_LIBRARIES + OpenAL32) else() add_definitions(-DUSE_DOOMCLASSIC) @@ -1152,6 +1155,7 @@ if(MSVC) iphlpapi winmm wsock32.lib + ${OpenAL_LIBRARIES} ) #CMAKE_BINARY_DIR diff --git a/neo/sound/OpenAL/AL_SoundHardware.cpp b/neo/sound/OpenAL/AL_SoundHardware.cpp index 45632fd3..110b7ac5 100644 --- a/neo/sound/OpenAL/AL_SoundHardware.cpp +++ b/neo/sound/OpenAL/AL_SoundHardware.cpp @@ -3,7 +3,7 @@ Doom 3 BFG Edition GPL Source Code Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company. -Copyright (C) 2012 Robert Beckebans +Copyright (C) 2013 Robert Beckebans This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code"). @@ -45,15 +45,14 @@ idSoundHardware_OpenAL::idSoundHardware_OpenAL */ idSoundHardware_OpenAL::idSoundHardware_OpenAL() { - pXAudio2 = NULL; - pMasterVoice = NULL; - pSubmixVoice = NULL; + openalDevice = NULL; + openalContext = NULL; - vuMeterRMS = NULL; - vuMeterPeak = NULL; + //vuMeterRMS = NULL; + //vuMeterPeak = NULL; - outputChannels = 0; - channelMask = 0; + //outputChannels = 0; + //channelMask = 0; voices.SetNum( 0 ); zombieVoices.SetNum( 0 ); @@ -64,19 +63,8 @@ idSoundHardware_OpenAL::idSoundHardware_OpenAL() void listDevices_f( const idCmdArgs& args ) { - - IXAudio2* pXAudio2 = soundSystemLocal.hardware.GetIXAudio2(); - - if( pXAudio2 == NULL ) - { - idLib::Warning( "No xaudio object" ); - return; - } - -// RB: not available on Windows 8 SDK -#if (_WIN32_WINNT >= 0x0602 /*_WIN32_WINNT_WIN8*/) - - // FIXME +#if 1 + // TODO idLib::Warning( "No audio devices found" ); return; @@ -211,139 +199,46 @@ idSoundHardware_OpenAL::Init */ void idSoundHardware_OpenAL::Init() { - cmdSystem->AddCommand( "listDevices", listDevices_f, 0, "Lists the connected sound devices", NULL ); - DWORD xAudioCreateFlags = 0; + common->Printf( "Setup OpenAL device and context... " ); -// RB: not available on Windows 8 SDK -#if (_WIN32_WINNT < 0x0602 /*_WIN32_WINNT_WIN8*/) && defined(_DEBUG) - xAudioCreateFlags |= XAUDIO2_DEBUG_ENGINE; -#endif -// RB end - - XAUDIO2_PROCESSOR xAudioProcessor = XAUDIO2_DEFAULT_PROCESSOR; - -// RB: not available on Windows 8 SDK - if( FAILED( XAudio2Create( &pXAudio2, xAudioCreateFlags, xAudioProcessor ) ) ) + openalDevice = alcOpenDevice( NULL ); + if( openalDevice == NULL ) { -#if (_WIN32_WINNT < 0x0602 /*_WIN32_WINNT_WIN8*/) && defined(_DEBUG) - if( xAudioCreateFlags & XAUDIO2_DEBUG_ENGINE ) - { - // in case the debug engine isn't installed - xAudioCreateFlags &= ~XAUDIO2_DEBUG_ENGINE; - if( FAILED( XAudio2Create( &pXAudio2, xAudioCreateFlags, xAudioProcessor ) ) ) - { - idLib::FatalError( "Failed to create XAudio2 engine. Try installing the latest DirectX." ); - return; - } - } - else -#endif -// RB end - { - idLib::FatalError( "Failed to create XAudio2 engine. Try installing the latest DirectX." ); - return; - } - } -#ifdef _DEBUG - XAUDIO2_DEBUG_CONFIGURATION debugConfiguration = { 0 }; - debugConfiguration.TraceMask = XAUDIO2_LOG_WARNINGS; - debugConfiguration.BreakMask = XAUDIO2_LOG_ERRORS; - pXAudio2->SetDebugConfiguration( &debugConfiguration ); -#endif - - // Register the sound engine callback - pXAudio2->RegisterForCallbacks( &soundEngineCallback ); - soundEngineCallback.hardware = this; - -// RB: not available on Windows 8 SDK -#if (_WIN32_WINNT >= 0x0602 /*_WIN32_WINNT_WIN8*/) - - // FIXME - - idLib::Warning( "No audio devices found" ); - pXAudio2->Release(); - pXAudio2 = NULL; - return; -#else - UINT32 deviceCount = 0; - if( pXAudio2->GetDeviceCount( &deviceCount ) != S_OK || deviceCount == 0 ) - { - idLib::Warning( "No audio devices found" ); - pXAudio2->Release(); - pXAudio2 = NULL; + common->FatalError( "idSoundHardware_OpenAL::Init: alcOpenDevice() failed\n" ); return; } - idCmdArgs args; - listDevices_f( args ); - - int preferredDevice = s_device.GetInteger(); - if( preferredDevice < 0 || preferredDevice >= ( int )deviceCount ) + openalContext = alcCreateContext( openalDevice, NULL ); + if( alcMakeContextCurrent( openalContext ) == 0 ) { - int preferredChannels = 0; - for( unsigned int i = 0; i < deviceCount; i++ ) - { - XAUDIO2_DEVICE_DETAILS deviceDetails; - if( pXAudio2->GetDeviceDetails( i, &deviceDetails ) != S_OK ) - { - continue; - } - - if( deviceDetails.Role & DefaultGameDevice ) - { - // if we find a device the user marked as their preferred 'game' device, then always use that - preferredDevice = i; - preferredChannels = deviceDetails.OutputFormat.Format.nChannels; - break; - } - - if( deviceDetails.OutputFormat.Format.nChannels > preferredChannels ) - { - preferredDevice = i; - preferredChannels = deviceDetails.OutputFormat.Format.nChannels; - } - } - } - - idLib::Printf( "Using device %d\n", preferredDevice ); - - XAUDIO2_DEVICE_DETAILS deviceDetails; - if( pXAudio2->GetDeviceDetails( preferredDevice, &deviceDetails ) != S_OK ) - { - // One way this could happen is if a device is removed between the loop and this line of code - // Highly unlikely but possible - idLib::Warning( "Failed to get device details" ); - pXAudio2->Release(); - pXAudio2 = NULL; + common->FatalError( "idSoundHardware_OpenAL::Init: alcMakeContextCurrent( %p) failed\n", openalContext ); return; } - DWORD outputSampleRate = 44100; // Max( (DWORD)XAUDIO2FX_REVERB_MIN_FRAMERATE, Min( (DWORD)XAUDIO2FX_REVERB_MAX_FRAMERATE, deviceDetails.OutputFormat.Format.nSamplesPerSec ) ); + common->Printf( "Done.\n" ); - if( FAILED( pXAudio2->CreateMasteringVoice( &pMasterVoice, XAUDIO2_DEFAULT_CHANNELS, outputSampleRate, 0, preferredDevice, NULL ) ) ) - { - idLib::Warning( "Failed to create master voice" ); - pXAudio2->Release(); - pXAudio2 = NULL; - return; - } - pMasterVoice->SetVolume( DBtoLinear( s_volume_dB.GetFloat() ) ); + common->Printf( "OpenAL vendor: %s\n", alGetString( AL_VENDOR ) ); + common->Printf( "OpenAL renderer: %s\n", alGetString( AL_RENDERER ) ); + common->Printf( "OpenAL version: %s\n", alGetString( AL_VERSION ) ); - outputChannels = deviceDetails.OutputFormat.Format.nChannels; - channelMask = deviceDetails.OutputFormat.dwChannelMask; + //pMasterVoice->SetVolume( DBtoLinear( s_volume_dB.GetFloat() ) ); - idSoundVoice::InitSurround( outputChannels, channelMask ); + //outputChannels = deviceDetails.OutputFormat.Format.nChannels; + //channelMask = deviceDetails.OutputFormat.dwChannelMask; + + //idSoundVoice::InitSurround( outputChannels, channelMask ); // --------------------- // Initialize the Doom classic sound system. // --------------------- - I_InitSoundHardware( outputChannels, channelMask ); + //I_InitSoundHardware( outputChannels, channelMask ); // --------------------- // Create VU Meter Effect // --------------------- + /* IUnknown* vuMeter = NULL; XAudio2CreateVolumeMeter( &vuMeter, 0 ); @@ -359,11 +254,13 @@ void idSoundHardware_OpenAL::Init() pMasterVoice->SetEffectChain( &chain ); vuMeter->Release(); + */ // --------------------- // Create VU Meter Graph // --------------------- + /* vuMeterRMS = console->CreateGraph( outputChannels ); vuMeterPeak = console->CreateGraph( outputChannels ); vuMeterRMS->Enable( false ); @@ -388,16 +285,9 @@ void idSoundHardware_OpenAL::Init() vuMeterRMS->SetLabel( i, channelNames[ ci ] ); i++; } + */ - // --------------------- - // Create submix buffer - // --------------------- - if( FAILED( pXAudio2->CreateSubmixVoice( &pSubmixVoice, 1, outputSampleRate, 0, 0, NULL, NULL ) ) ) - { - idLib::FatalError( "Failed to create submix voice" ); - } - - // XAudio doesn't really impose a maximum number of voices + // OpenAL doesn't really impose a maximum number of sources voices.SetNum( voices.Max() ); freeVoices.SetNum( voices.Max() ); zombieVoices.SetNum( 0 ); @@ -405,8 +295,6 @@ void idSoundHardware_OpenAL::Init() { freeVoices[i] = &voices[i]; } -#endif // #if (_WIN32_WINNT < 0x0602 /*_WIN32_WINNT_WIN8*/) -// RB end } /* @@ -424,37 +312,21 @@ void idSoundHardware_OpenAL::Shutdown() freeVoices.Clear(); zombieVoices.Clear(); + alcMakeContextCurrent( NULL ); + + alcDestroyContext( openalContext ); + openalContext = NULL; + + alcCloseDevice( openalDevice ); + openalDevice = NULL; + + // --------------------- // Shutdown the Doom classic sound system. // --------------------- //I_ShutdownSoundHardware(); - if( pXAudio2 != NULL ) - { - // Unregister the sound engine callback - pXAudio2->UnregisterForCallbacks( &soundEngineCallback ); - } - - if( pSubmixVoice != NULL ) - { - pSubmixVoice->DestroyVoice(); - pSubmixVoice = NULL; - } - if( pMasterVoice != NULL ) - { - // release the vu meter effect - pMasterVoice->SetEffectChain( NULL ); - pMasterVoice->DestroyVoice(); - pMasterVoice = NULL; - } - if( pXAudio2 != NULL ) - { - XAUDIO2_PERFORMANCE_DATA perfData; - pXAudio2->GetPerformanceData( &perfData ); - idLib::Printf( "Final pXAudio2 performanceData: Voices: %d/%d CPU: %.2f%% Mem: %dkb\n", perfData.ActiveSourceVoiceCount, perfData.TotalSourceVoiceCount, perfData.AudioCyclesSinceLastQuery / ( float )perfData.TotalCyclesSinceLastQuery, perfData.MemoryUsageInBytes / 1024 ); - pXAudio2->Release(); - pXAudio2 = NULL; - } + /* if( vuMeterRMS != NULL ) { console->DestroyGraph( vuMeterRMS ); @@ -465,6 +337,7 @@ void idSoundHardware_OpenAL::Shutdown() console->DestroyGraph( vuMeterPeak ); vuMeterPeak = NULL; } + */ } /* @@ -533,7 +406,7 @@ idSoundHardware_OpenAL::Update */ void idSoundHardware_OpenAL::Update() { - if( pXAudio2 == NULL ) + if( openalDevice == NULL ) { int nowTime = Sys_Milliseconds(); if( lastResetTime + 1000 < nowTime ) @@ -543,17 +416,16 @@ void idSoundHardware_OpenAL::Update() } return; } + if( soundSystem->IsMuted() ) { - pMasterVoice->SetVolume( 0.0f, OPERATION_SET ); + alListenerf( AL_GAIN, 0.0f ); } else { - pMasterVoice->SetVolume( DBtoLinear( s_volume_dB.GetFloat() ), OPERATION_SET ); + alListenerf( AL_GAIN, DBtoLinear( s_volume_dB.GetFloat() ) ); } - pXAudio2->CommitChanges( XAUDIO2_COMMIT_ALL ); - // IXAudio2SourceVoice::Stop() has been called for every sound on the // zombie list, but it is documented as asyncronous, so we have to wait // until it actually reports that it is no longer playing. @@ -573,13 +445,16 @@ void idSoundHardware_OpenAL::Update() } } + /* if( s_showPerfData.GetBool() ) { XAUDIO2_PERFORMANCE_DATA perfData; pXAudio2->GetPerformanceData( &perfData ); idLib::Printf( "Voices: %d/%d CPU: %.2f%% Mem: %dkb\n", perfData.ActiveSourceVoiceCount, perfData.TotalSourceVoiceCount, perfData.AudioCyclesSinceLastQuery / ( float )perfData.TotalCyclesSinceLastQuery, perfData.MemoryUsageInBytes / 1024 ); } + */ + /* if( vuMeterRMS == NULL ) { // Init probably hasn't been called yet @@ -642,6 +517,7 @@ void idSoundHardware_OpenAL::Update() vuMeterPeakTimes[i] = currentTime + s_meterTopTime.GetInteger(); } } + */ } @@ -656,7 +532,9 @@ idSoundEngineCallback idSoundEngineCallback::OnCriticalError ======================== */ +/* void idSoundEngineCallback::OnCriticalError( HRESULT Error ) { soundSystemLocal.SetNeedsRestart(); } +*/ diff --git a/neo/sound/OpenAL/AL_SoundHardware.h b/neo/sound/OpenAL/AL_SoundHardware.h index d3d8d717..e828e43f 100644 --- a/neo/sound/OpenAL/AL_SoundHardware.h +++ b/neo/sound/OpenAL/AL_SoundHardware.h @@ -3,7 +3,7 @@ Doom 3 BFG Edition GPL Source Code Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company. -Copyright (C) 2012 Robert Beckebans +Copyright (C) 2013 Robert Beckebans This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code"). @@ -39,22 +39,24 @@ class idSoundHardware_OpenAL; idSoundEngineCallback ================================================ */ +/* class idSoundEngineCallback : public IXAudio2EngineCallback { public: idSoundHardware_OpenAL* hardware; - + private: // Called by XAudio2 just before an audio processing pass begins. STDMETHOD_( void, OnProcessingPassStart )( THIS ) {} - + // Called just after an audio processing pass ends. STDMETHOD_( void, OnProcessingPassEnd )( THIS ) {} - + // Called in the event of a critical system error which requires XAudio2 // to be closed down and restarted. The error code is given in Error. STDMETHOD_( void, OnCriticalError )( THIS_ HRESULT Error ); }; +*/ /* ================================================ @@ -76,10 +78,12 @@ public: void FreeVoice( idSoundVoice* voice ); // video playback needs this + /* IXAudio2* GetIXAudio2() const { return pXAudio2; }; + */ int GetNumZombieVoices() const { @@ -95,19 +99,25 @@ protected: friend class idSoundVoice_OpenAL; private: + /* IXAudio2* pXAudio2; IXAudio2MasteringVoice* pMasterVoice; IXAudio2SubmixVoice* pSubmixVoice; idSoundEngineCallback soundEngineCallback; + */ + + ALCdevice* openalDevice; + ALCcontext* openalContext; + int lastResetTime; - int outputChannels; - int channelMask; + //int outputChannels; + //int channelMask; - idDebugGraph* vuMeterRMS; - idDebugGraph* vuMeterPeak; - int vuMeterPeakTimes[ 8 ]; + //idDebugGraph* vuMeterRMS; + //idDebugGraph* vuMeterPeak; + //int vuMeterPeakTimes[ 8 ]; // Can't stop and start a voice on the same frame, so we have to double this to handle the worst case scenario of stopping all voices and starting a full new set idStaticList voices; diff --git a/neo/sound/OpenAL/AL_SoundSample.cpp b/neo/sound/OpenAL/AL_SoundSample.cpp index d51371ef..446db948 100644 --- a/neo/sound/OpenAL/AL_SoundSample.cpp +++ b/neo/sound/OpenAL/AL_SoundSample.cpp @@ -3,6 +3,7 @@ Doom 3 BFG Edition GPL Source Code Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company. +Copyright (C) 2013 Robert Beckebans This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code"). @@ -455,7 +456,7 @@ void idSoundSample_OpenAL::MakeDefault() format.basic.formatTag = idWaveFile::FORMAT_PCM; format.basic.numChannels = 1; format.basic.bitsPerSample = 16; - format.basic.samplesPerSec = XAUDIO2_MIN_SAMPLE_RATE; + format.basic.samplesPerSec = 1000; //XAUDIO2_MIN_SAMPLE_RATE; format.basic.blockSize = format.basic.numChannels * format.basic.bitsPerSample / 8; format.basic.avgBytesPerSec = format.basic.samplesPerSec * format.basic.blockSize; diff --git a/neo/sound/OpenAL/AL_SoundSample.h b/neo/sound/OpenAL/AL_SoundSample.h index 8f1a8487..9ce9faac 100644 --- a/neo/sound/OpenAL/AL_SoundSample.h +++ b/neo/sound/OpenAL/AL_SoundSample.h @@ -3,6 +3,7 @@ Doom 3 BFG Edition GPL Source Code Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company. +Copyright (C) 2013 Robert Beckebans This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code"). diff --git a/neo/sound/OpenAL/AL_SoundVoice.cpp b/neo/sound/OpenAL/AL_SoundVoice.cpp index 073c6d1a..68d80f9b 100644 --- a/neo/sound/OpenAL/AL_SoundVoice.cpp +++ b/neo/sound/OpenAL/AL_SoundVoice.cpp @@ -3,6 +3,7 @@ Doom 3 BFG Edition GPL Source Code Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company. +Copyright (C) 2013 Robert Beckebans This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code"). @@ -30,7 +31,7 @@ If you have questions concerning this license or the applicable additional terms #include "../snd_local.h" idCVar s_skipHardwareSets( "s_skipHardwareSets", "0", CVAR_BOOL, "Do all calculation, but skip XA2 calls" ); -idCVar s_debugHardware( "s_debugHardware", "0", CVAR_BOOL, "Print a message any time a hardware voice changes" ); +idCVar s_debugHardware( "s_debugHardware", "1", CVAR_BOOL, "Print a message any time a hardware voice changes" ); // The whole system runs at this sample rate static int SYSTEM_SAMPLE_RATE = 44100; @@ -41,6 +42,7 @@ static float ONE_OVER_SYSTEM_SAMPLE_RATE = 1.0f / SYSTEM_SAMPLE_RATE; idStreamingVoiceContext ======================== */ +/* class idStreamingVoiceContext : public IXAudio2VoiceCallback { public: @@ -63,6 +65,7 @@ public: soundSystemLocal.ReleaseStreamBufferContext( bufferContext ); } } streamContext; +*/ /* ======================== @@ -70,7 +73,7 @@ idSoundVoice_OpenAL::idSoundVoice_OpenAL ======================== */ idSoundVoice_OpenAL::idSoundVoice_OpenAL() - : pSourceVoice( NULL ), + : openalSource( 0 ), leadinSample( NULL ), loopingSample( NULL ), formatTag( 0 ), @@ -99,11 +102,12 @@ idSoundVoice_OpenAL::CompatibleFormat */ bool idSoundVoice_OpenAL::CompatibleFormat( idSoundSample_OpenAL* s ) { - if( pSourceVoice == NULL ) + if( alIsSource( openalSource ) ) { // If this voice has never been allocated, then it's compatible with everything return true; } + return false; } @@ -120,10 +124,11 @@ void idSoundVoice_OpenAL::Create( const idSoundSample* leadinSample_, const idSo Stop(); return; } + leadinSample = ( idSoundSample_OpenAL* )leadinSample_; loopingSample = ( idSoundSample_OpenAL* )loopingSample_; - if( pSourceVoice != NULL && CompatibleFormat( leadinSample ) ) + if( alIsSource( openalSource ) && CompatibleFormat( leadinSample ) ) { sampleRate = leadinSample->format.basic.samplesPerSec; } @@ -134,27 +139,41 @@ void idSoundVoice_OpenAL::Create( const idSoundSample* leadinSample_, const idSo numChannels = leadinSample->format.basic.numChannels; sampleRate = leadinSample->format.basic.samplesPerSec; - soundSystemLocal.hardware.pXAudio2->CreateSourceVoice( &pSourceVoice, ( const WAVEFORMATEX* )&leadinSample->format, XAUDIO2_VOICE_USEFILTER, 4.0f, &streamContext ); - if( pSourceVoice == NULL ) + //soundSystemLocal.hardware.pXAudio2->CreateSourceVoice( &pSourceVoice, ( const WAVEFORMATEX* )&leadinSample->format, XAUDIO2_VOICE_USEFILTER, 4.0f, &streamContext ); + + alGetError(); + alGenSources( 1, &openalSource ); + if( alGetError() != AL_NO_ERROR ) + //if( pSourceVoice == NULL ) { // If this hits, then we are most likely passing an invalid sample format, which should have been caught by the loader (and the sample defaulted) return; } + + alSourcef( openalSource, AL_ROLLOFF_FACTOR, 0.0f ); + if( s_debugHardware.GetBool() ) { if( loopingSample == NULL || loopingSample == leadinSample ) { - idLib::Printf( "%dms: %p created for %s\n", Sys_Milliseconds(), pSourceVoice, leadinSample ? leadinSample->GetName() : "" ); + idLib::Printf( "%dms: %i created for %s\n", Sys_Milliseconds(), openalSource, leadinSample ? leadinSample->GetName() : "" ); } else { - idLib::Printf( "%dms: %p created for %s and %s\n", Sys_Milliseconds(), pSourceVoice, leadinSample ? leadinSample->GetName() : "", loopingSample ? loopingSample->GetName() : "" ); + idLib::Printf( "%dms: %i created for %s and %s\n", Sys_Milliseconds(), openalSource, leadinSample ? leadinSample->GetName() : "", loopingSample ? loopingSample->GetName() : "" ); } } } + sourceVoiceRate = sampleRate; - pSourceVoice->SetSourceSampleRate( sampleRate ); - pSourceVoice->SetVolume( 0.0f ); + //pSourceVoice->SetSourceSampleRate( sampleRate ); + //pSourceVoice->SetVolume( 0.0f ); + + alSourcei( openalSource, AL_SOURCE_RELATIVE, AL_TRUE ); + alSource3f( openalSource, AL_POSITION, 0.0f, 0.0f, 0.0f ); + + // RB: FIXME 0.0f ? + alSourcef( openalSource, AL_GAIN, 1.0f ); } /* @@ -164,14 +183,16 @@ idSoundVoice_OpenAL::DestroyInternal */ void idSoundVoice_OpenAL::DestroyInternal() { - if( pSourceVoice != NULL ) + if( alIsSource( openalSource ) ) { if( s_debugHardware.GetBool() ) { - idLib::Printf( "%dms: %p destroyed\n", Sys_Milliseconds(), pSourceVoice ); + idLib::Printf( "%dms: %i destroyed\n", Sys_Milliseconds(), openalSource ); } - pSourceVoice->DestroyVoice(); - pSourceVoice = NULL; + + alDeleteSources( 1, &openalSource ); + openalSource = 0; + hasVUMeter = false; } } @@ -183,17 +204,17 @@ idSoundVoice_OpenAL::Start */ void idSoundVoice_OpenAL::Start( int offsetMS, int ssFlags ) { - if( s_debugHardware.GetBool() ) { - idLib::Printf( "%dms: %p starting %s @ %dms\n", Sys_Milliseconds(), pSourceVoice, leadinSample ? leadinSample->GetName() : "", offsetMS ); + idLib::Printf( "%dms: %i starting %s @ %dms\n", Sys_Milliseconds(), openalSource, leadinSample ? leadinSample->GetName() : "", offsetMS ); } if( !leadinSample ) { return; } - if( !pSourceVoice ) + + if( !alIsSource( openalSource ) ) { return; } @@ -209,23 +230,25 @@ void idSoundVoice_OpenAL::Start( int offsetMS, int ssFlags ) { hasVUMeter = flicker; + /* if( flicker ) { IUnknown* vuMeter = NULL; + if( XAudio2CreateVolumeMeter( &vuMeter, 0 ) == S_OK ) { - + XAUDIO2_EFFECT_DESCRIPTOR descriptor; descriptor.InitialState = true; descriptor.OutputChannels = leadinSample->NumChannels(); descriptor.pEffect = vuMeter; - + XAUDIO2_EFFECT_CHAIN chain; chain.EffectCount = 1; chain.pEffectDescriptors = &descriptor; - + pSourceVoice->SetEffectChain( &chain ); - + vuMeter->Release(); } } @@ -233,6 +256,7 @@ void idSoundVoice_OpenAL::Start( int offsetMS, int ssFlags ) { pSourceVoice->SetEffectChain( NULL ); } + */ } assert( offsetMS >= 0 ); @@ -290,11 +314,11 @@ idSoundVoice_OpenAL::SubmitBuffer */ int idSoundVoice_OpenAL::SubmitBuffer( idSoundSample_OpenAL* sample, int bufferNumber, int offset ) { - if( sample == NULL || ( bufferNumber < 0 ) || ( bufferNumber >= sample->buffers.Num() ) ) { return 0; } + idSoundSystemLocal::bufferContext_t* bufferContext = soundSystemLocal.ObtainStreamBufferContext(); if( bufferContext == NULL ) { @@ -306,6 +330,11 @@ int idSoundVoice_OpenAL::SubmitBuffer( idSoundSample_OpenAL* sample, int bufferN bufferContext->sample = sample; bufferContext->bufferNumber = bufferNumber; + // TODO openal stream + return 0; + + /* + XAUDIO2_BUFFER buffer = { 0 }; if( offset > 0 ) { @@ -327,6 +356,8 @@ int idSoundVoice_OpenAL::SubmitBuffer( idSoundSample_OpenAL* sample, int bufferN pSourceVoice->SubmitSourceBuffer( &buffer ); return buffer.AudioBytes; + + */ } /* @@ -336,6 +367,7 @@ idSoundVoice_OpenAL::Update */ bool idSoundVoice_OpenAL::Update() { + /* if( pSourceVoice == NULL || leadinSample == NULL ) { return false; @@ -363,6 +395,7 @@ bool idSoundVoice_OpenAL::Update() // we don't do this any longer because we pause and unpause explicitly when the soundworld is paused or unpaused // UnPause(); + */ return true; } @@ -373,13 +406,21 @@ idSoundVoice_OpenAL::IsPlaying */ bool idSoundVoice_OpenAL::IsPlaying() { - if( pSourceVoice == NULL ) + if( !alIsSource( openalSource ) ) { return false; } - XAUDIO2_VOICE_STATE state; - pSourceVoice->GetState( &state ); - return ( state.BuffersQueued != 0 ); + + ALint state = AL_INITIAL; + + alGetSourcei( openalSource, AL_SOURCE_STATE, &state ); + + return ( state == AL_PLAYING ); + + //XAUDIO2_VOICE_STATE state; + //pSourceVoice->GetState( &state ); + + //return ( state.BuffersQueued != 0 ); } /* @@ -389,9 +430,9 @@ idSoundVoice_OpenAL::FlushSourceBuffers */ void idSoundVoice_OpenAL::FlushSourceBuffers() { - if( pSourceVoice != NULL ) + if( alIsSource( openalSource ) ) { - pSourceVoice->FlushSourceBuffers(); + //pSourceVoice->FlushSourceBuffers(); } } @@ -402,15 +443,18 @@ idSoundVoice_OpenAL::Pause */ void idSoundVoice_OpenAL::Pause() { - if( !pSourceVoice || paused ) + if( !alIsSource( openalSource ) || paused ) { return; } + if( s_debugHardware.GetBool() ) { - idLib::Printf( "%dms: %p pausing %s\n", Sys_Milliseconds(), pSourceVoice, leadinSample ? leadinSample->GetName() : "" ); + idLib::Printf( "%dms: %i pausing %s\n", Sys_Milliseconds(), openalSource, leadinSample ? leadinSample->GetName() : "" ); } - pSourceVoice->Stop( 0, OPERATION_SET ); + + alSourcePause( openalSource ); + //pSourceVoice->Stop( 0, OPERATION_SET ); paused = true; } @@ -421,15 +465,18 @@ idSoundVoice_OpenAL::UnPause */ void idSoundVoice_OpenAL::UnPause() { - if( !pSourceVoice || !paused ) + if( !alIsSource( openalSource ) || !paused ) { return; } + if( s_debugHardware.GetBool() ) { - idLib::Printf( "%dms: %p unpausing %s\n", Sys_Milliseconds(), pSourceVoice, leadinSample ? leadinSample->GetName() : "" ); + idLib::Printf( "%dms: %i unpausing %s\n", Sys_Milliseconds(), openalSource, leadinSample ? leadinSample->GetName() : "" ); } - pSourceVoice->Start( 0, OPERATION_SET ); + + alSourcePlay( openalSource ); + //pSourceVoice->Start( 0, OPERATION_SET ); paused = false; } @@ -440,17 +487,22 @@ idSoundVoice_OpenAL::Stop */ void idSoundVoice_OpenAL::Stop() { - if( !pSourceVoice ) + if( !alIsSource( openalSource ) ) { return; } + if( !paused ) { if( s_debugHardware.GetBool() ) { - idLib::Printf( "%dms: %p stopping %s\n", Sys_Milliseconds(), pSourceVoice, leadinSample ? leadinSample->GetName() : "" ); + idLib::Printf( "%dms: %i stopping %s\n", Sys_Milliseconds(), openalSource, leadinSample ? leadinSample->GetName() : "" ); } - pSourceVoice->Stop( 0, OPERATION_SET ); + + alSourceStop( openalSource ); + alSourcei( openalSource, AL_BUFFER, 0 ); + + //pSourceVoice->Stop( 0, OPERATION_SET ); paused = true; } } @@ -462,6 +514,10 @@ idSoundVoice_OpenAL::GetAmplitude */ float idSoundVoice_OpenAL::GetAmplitude() { + // TODO + return 1.0f; + + /* if( !hasVUMeter ) { return 1.0f; @@ -497,6 +553,7 @@ float idSoundVoice_OpenAL::GetAmplitude() } return rms / ( float )levels.ChannelCount; + */ } /* @@ -506,6 +563,7 @@ idSoundVoice_OpenAL::ResetSampleRate */ void idSoundVoice_OpenAL::SetSampleRate( uint32 newSampleRate, uint32 operationSet ) { + /* if( pSourceVoice == NULL || leadinSample == NULL ) { return; @@ -543,7 +601,9 @@ void idSoundVoice_OpenAL::SetSampleRate( uint32 newSampleRate, uint32 operationS { assert( freqRatio * ( float )SYSTEM_SAMPLE_RATE <= XAUDIO2_MAX_RATIO_TIMES_RATE_XMA_MULTICHANNEL ); } + pSourceVoice->SetFrequencyRatio( freqRatio, operationSet ); + */ } /* @@ -553,7 +613,7 @@ idSoundVoice_OpenAL::OnBufferStart */ void idSoundVoice_OpenAL::OnBufferStart( idSoundSample_OpenAL* sample, int bufferNumber ) { - SetSampleRate( sample->SampleRate(), XAUDIO2_COMMIT_NOW ); + //SetSampleRate( sample->SampleRate(), XAUDIO2_COMMIT_NOW ); idSoundSample_OpenAL* nextSample = sample; int nextBuffer = bufferNumber + 1; diff --git a/neo/sound/OpenAL/AL_SoundVoice.h b/neo/sound/OpenAL/AL_SoundVoice.h index 3519565c..9afa5ad9 100644 --- a/neo/sound/OpenAL/AL_SoundVoice.h +++ b/neo/sound/OpenAL/AL_SoundVoice.h @@ -3,6 +3,7 @@ Doom 3 BFG Edition GPL Source Code Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company. +Copyright (C) 2013 Robert Beckebans This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code"). @@ -51,6 +52,7 @@ public: // Stop consuming buffers void Pause(); + // Start consuming buffers again void UnPause(); @@ -92,9 +94,11 @@ private: // Adjust the voice frequency based on the new sample rate for the buffer void SetSampleRate( uint32 newSampleRate, uint32 operationSet ); - IXAudio2SourceVoice* pSourceVoice; - idSoundSample_OpenAL* leadinSample; - idSoundSample_OpenAL* loopingSample; + //IXAudio2SourceVoice* pSourceVoice; + ALuint openalSource; + + idSoundSample_OpenAL* leadinSample; + idSoundSample_OpenAL* loopingSample; // These are the fields from the sample format that matter to us for voice reuse uint16 formatTag; diff --git a/neo/sound/snd_local.h b/neo/sound/snd_local.h index 5a84f11a..b4eabca6 100644 --- a/neo/sound/snd_local.h +++ b/neo/sound/snd_local.h @@ -97,6 +97,16 @@ typedef enum #define OPERATION_SET 1 +#if defined(USE_OPENAL) + +#include +#include + +#include "OpenAL/AL_SoundSample.h" +#include "OpenAL/AL_SoundVoice.h" +#include "OpenAL/AL_SoundHardware.h" +#else + // RB: not available on Windows 8 SDK #if (_WIN32_WINNT < 0x0602 /*_WIN32_WINNT_WIN8*/) #include @@ -112,11 +122,6 @@ typedef enum #include #endif -#if defined(USE_OPENAL) -#include "OpenAL/AL_SoundSample.h" -#include "OpenAL/AL_SoundVoice.h" -#include "OpenAL/AL_SoundHardware.h" -#else #include "XAudio2/XA2_SoundSample.h" #include "XAudio2/XA2_SoundVoice.h" #include "XAudio2/XA2_SoundHardware.h" diff --git a/neo/sound/snd_system.cpp b/neo/sound/snd_system.cpp index 21b8b211..68460e13 100644 --- a/neo/sound/snd_system.cpp +++ b/neo/sound/snd_system.cpp @@ -3,6 +3,7 @@ Doom 3 BFG Edition GPL Source Code Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company. +Copyright (C) 2013 Robert Beckebans This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code"). @@ -389,7 +390,13 @@ idSoundSystemLocal::GetIXAudio2 */ void* idSoundSystemLocal::GetIXAudio2() const { + // RB begin +#if defined(USE_OPENAL) + return NULL; +#else return ( void* )hardware.GetIXAudio2(); +#endif + // RB end } /* From 00a459c61b12ef8c322ef0799ffb84865abe6adb Mon Sep 17 00:00:00 2001 From: Robert Beckebans Date: Thu, 3 Jan 2013 20:17:54 +0100 Subject: [PATCH 32/57] OpenAL plays first scratchy sounds --- neo/sound/OpenAL/AL_SoundHardware.cpp | 1 + neo/sound/OpenAL/AL_SoundVoice.cpp | 136 ++++++++++++++++++++++++-- neo/sound/OpenAL/AL_SoundVoice.h | 18 ++++ neo/sound/SoundVoice.h | 9 +- neo/sound/snd_local.h | 1 + neo/sound/snd_world.cpp | 2 + 6 files changed, 156 insertions(+), 11 deletions(-) diff --git a/neo/sound/OpenAL/AL_SoundHardware.cpp b/neo/sound/OpenAL/AL_SoundHardware.cpp index 110b7ac5..47c503a3 100644 --- a/neo/sound/OpenAL/AL_SoundHardware.cpp +++ b/neo/sound/OpenAL/AL_SoundHardware.cpp @@ -222,6 +222,7 @@ void idSoundHardware_OpenAL::Init() common->Printf( "OpenAL vendor: %s\n", alGetString( AL_VENDOR ) ); common->Printf( "OpenAL renderer: %s\n", alGetString( AL_RENDERER ) ); common->Printf( "OpenAL version: %s\n", alGetString( AL_VERSION ) ); + common->Printf( "OpenAL extensions: %s\n", alGetString( AL_EXTENSIONS ) ); //pMasterVoice->SetVolume( DBtoLinear( s_volume_dB.GetFloat() ) ); diff --git a/neo/sound/OpenAL/AL_SoundVoice.cpp b/neo/sound/OpenAL/AL_SoundVoice.cpp index 68d80f9b..59898853 100644 --- a/neo/sound/OpenAL/AL_SoundVoice.cpp +++ b/neo/sound/OpenAL/AL_SoundVoice.cpp @@ -73,14 +73,16 @@ idSoundVoice_OpenAL::idSoundVoice_OpenAL ======================== */ idSoundVoice_OpenAL::idSoundVoice_OpenAL() - : openalSource( 0 ), - leadinSample( NULL ), - loopingSample( NULL ), - formatTag( 0 ), - numChannels( 0 ), - sampleRate( 0 ), - paused( true ), - hasVUMeter( false ) + : + triggered( false ), + openalSource( 0 ), + leadinSample( NULL ), + loopingSample( NULL ), + formatTag( 0 ), + numChannels( 0 ), + sampleRate( 0 ), + paused( true ), + hasVUMeter( false ) { } @@ -125,6 +127,8 @@ void idSoundVoice_OpenAL::Create( const idSoundSample* leadinSample_, const idSo return; } + triggered = true; + leadinSample = ( idSoundSample_OpenAL* )leadinSample_; loopingSample = ( idSoundSample_OpenAL* )loopingSample_; @@ -152,6 +156,27 @@ void idSoundVoice_OpenAL::Create( const idSoundSample* leadinSample_, const idSo alSourcef( openalSource, AL_ROLLOFF_FACTOR, 0.0f ); + // handle streaming sounds (decode on the fly) both single shot AND looping + //if( triggered ) + { + alSourcei( openalSource, AL_BUFFER, 0 ); + alDeleteBuffers( 3, &lastopenalStreamingBuffer[0] ); + lastopenalStreamingBuffer[0] = openalStreamingBuffer[0]; + lastopenalStreamingBuffer[1] = openalStreamingBuffer[1]; + lastopenalStreamingBuffer[2] = openalStreamingBuffer[2]; + + alGenBuffers( 3, &openalStreamingBuffer[0] ); + /* + if( soundSystemLocal.alEAXSetBufferMode ) + { + soundSystemLocal.alEAXSetBufferMode( 3, &chan->openalStreamingBuffer[0], alGetEnumValue( ID_ALCHAR "AL_STORAGE_ACCESSIBLE" ) ); + } + */ + openalStreamingBuffer[0]; + openalStreamingBuffer[1]; + openalStreamingBuffer[2]; + } + if( s_debugHardware.GetBool() ) { if( loopingSample == NULL || loopingSample == leadinSample ) @@ -173,7 +198,9 @@ void idSoundVoice_OpenAL::Create( const idSoundSample* leadinSample_, const idSo alSource3f( openalSource, AL_POSITION, 0.0f, 0.0f, 0.0f ); // RB: FIXME 0.0f ? - alSourcef( openalSource, AL_GAIN, 1.0f ); + alSourcef( openalSource, AL_GAIN, 0.0f ); + + //OnBufferStart( leadinSample, 0 ); } /* @@ -331,6 +358,73 @@ int idSoundVoice_OpenAL::SubmitBuffer( idSoundSample_OpenAL* sample, int bufferN bufferContext->bufferNumber = bufferNumber; // TODO openal stream + + ALint finishedbuffers; + + if( !triggered ) + { + alGetSourcei( openalSource, AL_BUFFERS_PROCESSED, &finishedbuffers ); + alSourceUnqueueBuffers( openalSource, finishedbuffers, &openalStreamingBuffer[0] ); + if( finishedbuffers == 3 ) + { + triggered = true; + } + } + else + { + finishedbuffers = 3; + } + + ALenum format; + + if( sample->format.basic.formatTag == idWaveFile::FORMAT_PCM ) + { + format = sample->NumChannels() == 1 ? AL_FORMAT_MONO_IMA4 : AL_FORMAT_STEREO_IMA4; + } + else + { + format = sample->NumChannels() == 1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16; + } + + for( int j = 0; j < finishedbuffers && j < 1; j++ ) + { + /* + chan->GatherChannelSamples( chan->openalStreamingOffset * sample->objectInfo.nChannels, MIXBUFFER_SAMPLES * sample->objectInfo.nChannels, alignedInputSamples ); + for( int i = 0; i < ( MIXBUFFER_SAMPLES * sample->objectInfo.nChannels ); i++ ) + { + if( alignedInputSamples[i] < -32768.0f ) + ( ( short* )alignedInputSamples )[i] = -32768; + else if( alignedInputSamples[i] > 32767.0f ) + ( ( short* )alignedInputSamples )[i] = 32767; + else + ( ( short* )alignedInputSamples )[i] = idMath::FtoiFast( alignedInputSamples[i] ); + } + */ + + //alBufferData( buffers[0], sample->NumChannels() == 1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16, sample->buffers[bufferNumber].buffer, sample->buffers[bufferNumber].bufferSize, sample->SampleRate() /*44100*/ ); + + + + + alBufferData( openalStreamingBuffer[j], format, sample->buffers[bufferNumber].buffer, sample->buffers[bufferNumber].bufferSize, sample->SampleRate() /*44100*/ ); + //openalStreamingOffset += MIXBUFFER_SAMPLES; + } + + if( finishedbuffers > 0 ) + { + //alSourceQueueBuffers( openalSource, finishedbuffers, &buffers[0] ); + alSourceQueueBuffers( openalSource, 1, &openalStreamingBuffer[0] ); + + if( bufferNumber == 0 ) + { + alSourcePlay( openalSource ); + triggered = false; + } + + return sample->buffers[bufferNumber].bufferSize; + } + + // should never happen return 0; /* @@ -502,6 +596,30 @@ void idSoundVoice_OpenAL::Stop() alSourceStop( openalSource ); alSourcei( openalSource, AL_BUFFER, 0 ); + if( openalStreamingBuffer[0] && openalStreamingBuffer[1] && openalStreamingBuffer[2] ) + { + alGetError(); + alDeleteBuffers( 3, &openalStreamingBuffer[0] ); + if( alGetError() == AL_NO_ERROR ) + { + openalStreamingBuffer[0] = openalStreamingBuffer[1] = openalStreamingBuffer[2] = 0; + } + } + + if( lastopenalStreamingBuffer[0] && lastopenalStreamingBuffer[1] && lastopenalStreamingBuffer[2] ) + { + alGetError(); + alDeleteBuffers( 3, &lastopenalStreamingBuffer[0] ); + if( alGetError() == AL_NO_ERROR ) + { + lastopenalStreamingBuffer[0] = lastopenalStreamingBuffer[1] = lastopenalStreamingBuffer[2] = 0; + } + } + + openalStreamingOffset = 0; + //openalStreamingBuffer[0] = openalStreamingBuffer[1] = openalStreamingBuffer[2] = 0; + //lastopenalStreamingBuffer[0] = lastopenalStreamingBuffer[1] = lastopenalStreamingBuffer[2] = 0; + //pSourceVoice->Stop( 0, OPERATION_SET ); paused = true; } diff --git a/neo/sound/OpenAL/AL_SoundVoice.h b/neo/sound/OpenAL/AL_SoundVoice.h index 9afa5ad9..9fdb1cec 100644 --- a/neo/sound/OpenAL/AL_SoundVoice.h +++ b/neo/sound/OpenAL/AL_SoundVoice.h @@ -42,6 +42,20 @@ public: idSoundVoice_OpenAL(); ~idSoundVoice_OpenAL(); + void SetPosition( const idVec3& p ) + { + idSoundVoice_Base::SetPosition( p ); + + alSource3f( openalSource, AL_POSITION, -p.y, p.z, -p.x ); + } + + void SetGain( float gain ) + { + idSoundVoice_Base::SetGain( gain ); + + alSourcef( openalSource, AL_GAIN, ( gain ) < ( 1.0f ) ? ( gain ) : ( 1.0f ) ); + } + void Create( const idSoundSample* leadinSample, const idSoundSample* loopingSample ); // Start playing at a particular point in the buffer. Does an Update() too @@ -95,7 +109,11 @@ private: void SetSampleRate( uint32 newSampleRate, uint32 operationSet ); //IXAudio2SourceVoice* pSourceVoice; + bool triggered; ALuint openalSource; + ALuint openalStreamingOffset; + ALuint openalStreamingBuffer[3]; + ALuint lastopenalStreamingBuffer[3]; idSoundSample_OpenAL* leadinSample; idSoundSample_OpenAL* loopingSample; diff --git a/neo/sound/SoundVoice.h b/neo/sound/SoundVoice.h index 2f92912b..7963a70b 100644 --- a/neo/sound/SoundVoice.h +++ b/neo/sound/SoundVoice.h @@ -3,6 +3,7 @@ Doom 3 BFG Edition GPL Source Code Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company. +Copyright (C) 2013 Robert Beckebans This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code"). @@ -43,14 +44,18 @@ public: void CalculateSurround( int srcChannels, float pLevelMatrix[ MAX_CHANNELS_PER_VOICE* MAX_CHANNELS_PER_VOICE ], float scale ); - void SetPosition( const idVec3& p ) + // RB begin + virtual void SetPosition( const idVec3& p ) { position = p; } - void SetGain( float g ) + + virtual void SetGain( float g ) { gain = g; } + // RB end + void SetCenterChannel( float c ) { centerChannel = c; diff --git a/neo/sound/snd_local.h b/neo/sound/snd_local.h index b4eabca6..de2a5223 100644 --- a/neo/sound/snd_local.h +++ b/neo/sound/snd_local.h @@ -101,6 +101,7 @@ typedef enum #include #include +#include #include "OpenAL/AL_SoundSample.h" #include "OpenAL/AL_SoundVoice.h" diff --git a/neo/sound/snd_world.cpp b/neo/sound/snd_world.cpp index c7d87dfe..a5a17bea 100644 --- a/neo/sound/snd_world.cpp +++ b/neo/sound/snd_world.cpp @@ -372,8 +372,10 @@ void idSoundWorldLocal::Update() const bool canMute = channel->CanMute(); if( canMute && channel->volumeDB <= DB_SILENCE ) { +#if !defined(USE_OPENAL) channel->Mute(); continue; +#endif } // Calculate the sort key. From c47e78d6f34808aefaf790a63dde5fec2779e637 Mon Sep 17 00:00:00 2001 From: Robert Beckebans Date: Thu, 3 Jan 2013 21:25:34 +0100 Subject: [PATCH 33/57] Misc changes --- neo/sound/OpenAL/AL_SoundVoice.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/neo/sound/OpenAL/AL_SoundVoice.cpp b/neo/sound/OpenAL/AL_SoundVoice.cpp index 59898853..245d3b3c 100644 --- a/neo/sound/OpenAL/AL_SoundVoice.cpp +++ b/neo/sound/OpenAL/AL_SoundVoice.cpp @@ -346,6 +346,7 @@ int idSoundVoice_OpenAL::SubmitBuffer( idSoundSample_OpenAL* sample, int bufferN return 0; } +#if 0 idSoundSystemLocal::bufferContext_t* bufferContext = soundSystemLocal.ObtainStreamBufferContext(); if( bufferContext == NULL ) { @@ -356,6 +357,7 @@ int idSoundVoice_OpenAL::SubmitBuffer( idSoundSample_OpenAL* sample, int bufferN bufferContext->voice = this; bufferContext->sample = sample; bufferContext->bufferNumber = bufferNumber; +#endif // TODO openal stream @@ -379,13 +381,23 @@ int idSoundVoice_OpenAL::SubmitBuffer( idSoundSample_OpenAL* sample, int bufferN if( sample->format.basic.formatTag == idWaveFile::FORMAT_PCM ) { - format = sample->NumChannels() == 1 ? AL_FORMAT_MONO_IMA4 : AL_FORMAT_STEREO_IMA4; + format = sample->NumChannels() == 1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16; + } + else if( sample->format.basic.formatTag == idWaveFile::FORMAT_ADPCM ) + { + format = sample->NumChannels() == 1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16; + } + else if( sample->format.basic.formatTag == idWaveFile::FORMAT_XMA2 ) + { + format = sample->NumChannels() == 1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16; } else { format = sample->NumChannels() == 1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16; } + int rate = sample->SampleRate(); /*44100*/ + for( int j = 0; j < finishedbuffers && j < 1; j++ ) { /* @@ -406,7 +418,7 @@ int idSoundVoice_OpenAL::SubmitBuffer( idSoundSample_OpenAL* sample, int bufferN - alBufferData( openalStreamingBuffer[j], format, sample->buffers[bufferNumber].buffer, sample->buffers[bufferNumber].bufferSize, sample->SampleRate() /*44100*/ ); + alBufferData( openalStreamingBuffer[j], format, sample->buffers[bufferNumber].buffer, sample->buffers[bufferNumber].bufferSize, rate ); //openalStreamingOffset += MIXBUFFER_SAMPLES; } From 33774e222501903aea82f91c5248c93af063ca30 Mon Sep 17 00:00:00 2001 From: Robert Beckebans Date: Fri, 4 Jan 2013 13:24:52 +0100 Subject: [PATCH 34/57] Added OpenAL support to Linux --- neo/CMakeLists.txt | 26 +++++++++++++++++++++++--- neo/sound/snd_local.h | 12 +++++------- 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/neo/CMakeLists.txt b/neo/CMakeLists.txt index ec09fdcc..443c4db6 100644 --- a/neo/CMakeLists.txt +++ b/neo/CMakeLists.txt @@ -1170,8 +1170,7 @@ if(MSVC) else() list(APPEND RBDOOM3_SOURCES - ${SYS_INCLUDES} ${SYS_SOURCES} - ${STUBAUDIO_INCLUDES} ${STUBAUDIO_SOURCES}) + ${SYS_INCLUDES} ${SYS_SOURCES}) if(WIN32) add_definitions(-DUSE_DOOMCLASSIC) @@ -1201,11 +1200,31 @@ else() ${POSIX_INCLUDES} ${POSIX_SOURCES} ${SDL_INCLUDES} ${SDL_SOURCES} sys/linux/linux_main.cpp) + + if(OPENAL) + find_package(OpenAL REQUIRED) + add_definitions(-DUSE_OPENAL) + + #include_directories(${CMAKE_CURRENT_SOURCE_DIR}/libs/openal-soft/include) + + #if(CMAKE_CL_64) + # link_directories(${CMAKE_CURRENT_SOURCE_DIR}/libs/openal-soft/lib/win64) + #else() + # link_directories(${CMAKE_CURRENT_SOURCE_DIR}/libs/openal-soft/lib/win32) + #endif() + + list(APPEND RBDOOM3_INCLUDES ${OPENAL_INCLUDES}) + list(APPEND RBDOOM3_SOURCES ${OPENAL_SOURCES}) + else() + list(APPEND RBDOOM3_INCLUDES ${STUBAUDIO_INCLUDES}) + list(APPEND RBDOOM3_SOURCES ${STUBAUDIO_SOURCES}) + endif() + endif() list(REMOVE_DUPLICATES RBDOOM3_SOURCES) - add_executable(RBDoom3BFG WIN32 ${RBDOOM3_SOURCES}) + add_executable(RBDoom3BFG WIN32 ${RBDOOM3_INCLUDES} ${RBDOOM3_SOURCES}) add_dependencies(RBDoom3BFG idlib) @@ -1242,6 +1261,7 @@ else() dl rt ${SDLx_LIBRARY} + ${OPENAL_LIBRARY} ) endif() diff --git a/neo/sound/snd_local.h b/neo/sound/snd_local.h index de2a5223..7e934425 100644 --- a/neo/sound/snd_local.h +++ b/neo/sound/snd_local.h @@ -93,10 +93,6 @@ typedef enum #include "SoundVoice.h" -#ifdef _MSC_VER // DG: stub out xaudio for MinGW etc - -#define OPERATION_SET 1 - #if defined(USE_OPENAL) #include @@ -106,7 +102,10 @@ typedef enum #include "OpenAL/AL_SoundSample.h" #include "OpenAL/AL_SoundVoice.h" #include "OpenAL/AL_SoundHardware.h" -#else + +#elif defined(_MSC_VER) // DG: stub out xaudio for MinGW etc + +#define OPERATION_SET 1 // RB: not available on Windows 8 SDK #if (_WIN32_WINNT < 0x0602 /*_WIN32_WINNT_WIN8*/) @@ -122,12 +121,11 @@ typedef enum #if (_WIN32_WINNT < 0x0602 /*_WIN32_WINNT_WIN8*/) #include #endif +// RB end #include "XAudio2/XA2_SoundSample.h" #include "XAudio2/XA2_SoundVoice.h" #include "XAudio2/XA2_SoundHardware.h" -#endif -// RB end #else // not _MSC_VER => MinGW, GCC, ... // just a stub for now From 19effdad2c77491d1bcf0052e0f4177a1bf6227a Mon Sep 17 00:00:00 2001 From: Daniel Gibson Date: Wed, 2 Jan 2013 21:20:31 +0100 Subject: [PATCH 35/57] fix zlib include path in zip.h --- neo/libs/zlib/minizip/zip.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/neo/libs/zlib/minizip/zip.h b/neo/libs/zlib/minizip/zip.h index 477fe89b..925d0d96 100644 --- a/neo/libs/zlib/minizip/zip.h +++ b/neo/libs/zlib/minizip/zip.h @@ -47,7 +47,7 @@ extern "C" { //#define HAVE_BZIP2 #ifndef _ZLIB_H -#include "../../libs/zlib/zlib.h" +#include "../zlib.h" #endif #ifndef _ZLIBIOAPI_H From d6c32cd49bc76c3fb280568daf9b2be36f66ab72 Mon Sep 17 00:00:00 2001 From: Daniel Gibson Date: Thu, 3 Jan 2013 05:50:51 +0100 Subject: [PATCH 36/57] Support resizing windows + improve fullscreen for SDL2 By implementing GLimp_SetScreenParms() and enhancing the event handling --- neo/renderer/RenderSystem_init.cpp | 6 + neo/sys/sdl/sdl_events.cpp | 45 +++++++- neo/sys/sdl/sdl_glimp.cpp | 174 ++++++++++++++++++++++++++++- 3 files changed, 218 insertions(+), 7 deletions(-) diff --git a/neo/renderer/RenderSystem_init.cpp b/neo/renderer/RenderSystem_init.cpp index c10b83e1..66dfcefc 100644 --- a/neo/renderer/RenderSystem_init.cpp +++ b/neo/renderer/RenderSystem_init.cpp @@ -53,7 +53,13 @@ idCVar r_skipIntelWorkarounds( "r_skipIntelWorkarounds", "0", CVAR_RENDERER | CV idCVar r_multiSamples( "r_multiSamples", "0", CVAR_RENDERER | CVAR_ARCHIVE | CVAR_INTEGER, "number of antialiasing samples" ); idCVar r_vidMode( "r_vidMode", "0", CVAR_ARCHIVE | CVAR_RENDERER | CVAR_INTEGER, "fullscreen video mode number" ); idCVar r_displayRefresh( "r_displayRefresh", "0", CVAR_RENDERER | CVAR_INTEGER | CVAR_NOCHEAT, "optional display refresh rate option for vid mode", 0.0f, 240.0f ); +#ifdef WIN32 idCVar r_fullscreen( "r_fullscreen", "1", CVAR_RENDERER | CVAR_ARCHIVE | CVAR_INTEGER, "0 = windowed, 1 = full screen on monitor 1, 2 = full screen on monitor 2, etc" ); +#else +// DG: add mode -2 for SDL, also defaulting to windowed mode, as that causes less trouble on linux +idCVar r_fullscreen( "r_fullscreen", "0", CVAR_RENDERER | CVAR_ARCHIVE | CVAR_INTEGER, "-2 = use current monitor, -1 = (reserved), 0 = windowed, 1 = full screen on monitor 1, 2 = full screen on monitor 2, etc" ); +// DG end +#endif idCVar r_customWidth( "r_customWidth", "1280", CVAR_RENDERER | CVAR_ARCHIVE | CVAR_INTEGER, "custom screen width. set r_vidMode to -1 to activate" ); idCVar r_customHeight( "r_customHeight", "720", CVAR_RENDERER | CVAR_ARCHIVE | CVAR_INTEGER, "custom screen height. set r_vidMode to -1 to activate" ); idCVar r_windowX( "r_windowX", "0", CVAR_RENDERER | CVAR_ARCHIVE | CVAR_INTEGER, "Non-fullscreen parameter" ); diff --git a/neo/sys/sdl/sdl_events.cpp b/neo/sys/sdl/sdl_events.cpp index 7fd4c890..b7988c6a 100644 --- a/neo/sys/sdl/sdl_events.cpp +++ b/neo/sys/sdl/sdl_events.cpp @@ -5,6 +5,7 @@ Doom 3 GPL Source Code Copyright (C) 1999-2011 id Software LLC, a ZeniMax Media company. Copyright (C) 2012 dhewg (dhewm3) Copyright (C) 2012 Robert Beckebans +Copyright (C) 2013 Daniel Gibson This file is part of the Doom 3 GPL Source Code ("Doom 3 Source Code"). @@ -28,9 +29,10 @@ If you have questions concerning this license or the applicable additional terms =========================================================================== */ +#include "../../idlib/precompiled.h" + #include -#include "../../idlib/precompiled.h" #include "renderer/tr_local.h" #include "sdl_local.h" #include "../posix/posix_public.h" @@ -58,6 +60,13 @@ If you have questions concerning this license or the applicable additional terms // DG end #endif +// DG: those are needed for moving/resizing windows +extern idCVar r_windowX; +extern idCVar r_windowY; +extern idCVar r_windowWidth; +extern idCVar r_windowHeight; +// DG end + const char* kbdNames[] = { "english", "french", "german", "italian", "spanish", "turkish", "norwegian", NULL @@ -742,7 +751,28 @@ sysEvent_t Sys_GetEvent() GLimp_GrabInput( 0 ); break; - // TODO: SDL_WINDOWEVENT_RESIZED + // DG: handle resizing and moving of window + case SDL_WINDOWEVENT_RESIZED: + { + int w = ev.window.data1; + int h = ev.window.data2; + r_windowWidth.SetInteger( w ); + r_windowHeight.SetInteger( h ); + + glConfig.nativeScreenWidth = w; + glConfig.nativeScreenHeight = h; + break; + } + + case SDL_WINDOWEVENT_MOVED: + { + int x = ev.window.data1; + int y = ev.window.data2; + r_windowX.SetInteger( x ); + r_windowY.SetInteger( y ); + break; + } + // DG end } return res_none; @@ -777,7 +807,16 @@ sysEvent_t Sys_GetEvent() case SDL_KEYDOWN: if( ev.key.keysym.sym == SDLK_RETURN && ( ev.key.keysym.mod & KMOD_ALT ) > 0 ) { - cvarSystem->SetCVarBool( "r_fullscreen", !renderSystem->IsFullScreen() ); + // DG: go to fullscreen on current display, instead of always first display + int fullscreen = 0; + if( ! renderSystem->IsFullScreen() ) + { + // this will be handled as "fullscreen on current window" + // r_fullscreen 1 means "fullscreen on first window" in d3 bfg + fullscreen = -2; + } + cvarSystem->SetCVarInteger( "r_fullscreen", fullscreen ); + // DG end PushConsoleEvent( "vid_restart" ); return res_none; } diff --git a/neo/sys/sdl/sdl_glimp.cpp b/neo/sys/sdl/sdl_glimp.cpp index 556112c0..fc1022d2 100644 --- a/neo/sys/sdl/sdl_glimp.cpp +++ b/neo/sys/sdl/sdl_glimp.cpp @@ -5,6 +5,7 @@ Doom 3 GPL Source Code Copyright (C) 1999-2011 id Software LLC, a ZeniMax Media company. Copyright (C) 2012 dhewg (dhewm3) Copyright (C) 2012 Robert Beckebans +Copyright (C) 2013 Daniel Gibson This file is part of the Doom 3 GPL Source Code ("Doom 3 Source Code"). @@ -89,7 +90,9 @@ bool GLimp_Init( glimpParms_t parms ) GLimp_PreInit(); // DG: make sure SDL is initialized - Uint32 flags = SDL_WINDOW_OPENGL; + // DG: make window resizable + Uint32 flags = SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE; + // DG end if( parms.fullScreen ) flags |= SDL_WINDOW_FULLSCREEN; @@ -198,10 +201,34 @@ bool GLimp_Init( glimpParms_t parms ) } // RB end + // DG: set display num for fullscreen + int windowPos = SDL_WINDOWPOS_UNDEFINED; + if( parms.fullScreen > 0 ) + { + if( parms.fullScreen > SDL_GetNumVideoDisplays() ) + { + common->Warning( "Couldn't set display to num %i because we only have %i displays", + parms.fullScreen, SDL_GetNumVideoDisplays() ); + } + else + { + // -1 because SDL starts counting displays at 0, while parms.fullScreen starts at 1 + windowPos = SDL_WINDOWPOS_UNDEFINED_DISPLAY( ( parms.fullScreen - 1 ) ); + } + } + // TODO: if parms.fullScreen == -1 there should be a borderless window spanning multiple displays + /* + * NOTE that this implicitly handles parms.fullScreen == -2 (from r_fullscreen -2) meaning + * "do fullscreen, but I don't care on what monitor", at least on my box it's the monitor with + * the mouse cursor. + */ + + window = SDL_CreateWindow( GAME_NAME, - SDL_WINDOWPOS_UNDEFINED, - SDL_WINDOWPOS_UNDEFINED, + windowPos, + windowPos, parms.width, parms.height, flags ); + // DG end context = SDL_GL_CreateContext( window ); if( !window ) @@ -273,6 +300,113 @@ bool GLimp_Init( glimpParms_t parms ) return true; } +/* +=================== + Helper functions for GLimp_SetScreenParms() +=================== +*/ + +#if SDL_VERSION_ATLEAST(2, 0, 0) +// SDL1 doesn't support multiple displays +// makes sure the window will be full-screened on the right display and returns the SDL display index +static int ScreenParmsHandleDisplayIndex( glimpParms_t parms ) +{ + int displayIdx; + if( parms.fullScreen > 0 ) + { + displayIdx = parms.fullScreen - 1; // first display for SDL is 0, in parms it's 1 + } + else // -2 == use current display + { + displayIdx = SDL_GetWindowDisplay( window ); + if( displayIdx < 0 ) // for some reason the display for the window couldn't be detected + displayIdx = 0; + } + + if( parms.fullScreen > SDL_GetNumVideoDisplays() ) + { + common->Warning( "Can't set fullscreen mode to display number %i, because SDL2 only knows about %i displays!", + parms.fullScreen, SDL_GetNumVideoDisplays() ); + return -1; + } + + if( parms.fullScreen != glConfig.isFullscreen ) + { + // we have to switch to another display + if( glConfig.isFullscreen ) + { + // if we're already in fullscreen mode but want to switch to another monitor + // we have to go to windowed mode first to move the window.. SDL-oddity. + SDL_SetWindowFullscreen( window, SDL_FALSE ); + } + // select display ; SDL_WINDOWPOS_UNDEFINED_DISPLAY() doesn't work. + int x = SDL_WINDOWPOS_CENTERED_DISPLAY( displayIdx ); + // move window to the center of selected display + SDL_SetWindowPosition( window, x, x ); + } + return displayIdx; +} +#endif // SDL_VERSION_ATLEAST(2, 0, 0) + +static bool SetScreenParmsFullscreen( glimpParms_t parms ) +{ +#if SDL_VERSION_ATLEAST(2, 0, 0) + SDL_DisplayMode m = {0}; + int displayIdx = ScreenParmsHandleDisplayIndex( parms ); + if( displayIdx < 0 ) + return false; + + // get current mode of display the window should be full-screened on + SDL_GetCurrentDisplayMode( displayIdx, &m ); + + // change settings in that display mode according to parms + // FIXME: check if refreshrate, width and height are supported? + // m.refresh_rate = parms.displayHz; + m.w = parms.width; + m.h = parms.height; + + // set that displaymode + if( SDL_SetWindowDisplayMode( window, &m ) < 0 ) + { + common->Warning( "Couldn't set window mode for fullscreen, reason: %s", SDL_GetError() ); + return false; + } + + // if we're currently not in fullscreen mode, we need to switch to fullscreen + if( !( SDL_GetWindowFlags( window ) & SDL_WINDOW_FULLSCREEN ) ) + { + if( SDL_SetWindowFullscreen( window, SDL_TRUE ) < 0 ) + { + common->Warning( "Couldn't switch to fullscreen mode, reason: %s!", SDL_GetError() ); + return false; + } + } +#else // ! SDL_VERSION_ATLEAST(2, 0, 0) => SDL1.2 + // TODO: SDL1.2 fullscreen handling +#endif // SDL_VERSION_ATLEAST(2, 0, 0) + return true; +} + +static bool SetScreenParmsWindowed( glimpParms_t parms ) +{ +#if SDL_VERSION_ATLEAST(2, 0, 0) + SDL_SetWindowSize( window, parms.width, parms.height ); + SDL_SetWindowPosition( window, parms.x, parms.y ); + + // if we're currently in fullscreen mode, we need to disable that + if( SDL_GetWindowFlags( window ) & SDL_WINDOW_FULLSCREEN ) + { + if( SDL_SetWindowFullscreen( window, SDL_FALSE ) < 0 ) + { + common->Warning( "Couldn't switch to windowed mode, reason: %s!", SDL_GetError() ); + return false; + } + } +#else // SDL 1.2 + // TODO: SDL1.2 windowed handling +#endif + return true; +} /* =================== @@ -281,7 +415,39 @@ GLimp_SetScreenParms */ bool GLimp_SetScreenParms( glimpParms_t parms ) { - common->DPrintf( "TODO: GLimp_SetScreenParms\n" ); +#if SDL_VERSION_ATLEAST(2, 0, 0) + if( parms.fullScreen > 0 || parms.fullScreen == -2 ) + { + if( !SetScreenParmsFullscreen( parms ) ) + return false; + } + else if( parms.fullScreen == 0 ) // windowed mode + { + if( !SetScreenParmsWindowed( parms ) ) + return false; + } + else + { + common->Warning( "GLimp_SetScreenParms: fullScreen -1 (borderless window for multiple displays) currently unsupported!" ); + return false; + } + + // Note: the following stuff would also work with SDL1.2 + SDL_GL_SetAttribute( SDL_GL_STEREO, parms.stereo ? 1 : 0 ); + + SDL_GL_SetAttribute( SDL_GL_MULTISAMPLEBUFFERS, parms.multiSamples ? 1 : 0 ); + SDL_GL_SetAttribute( SDL_GL_MULTISAMPLESAMPLES, parms.multiSamples ); + + glConfig.isFullscreen = parms.fullScreen; + glConfig.isStereoPixelFormat = parms.stereo; + glConfig.nativeScreenWidth = parms.width; + glConfig.nativeScreenHeight = parms.height; + glConfig.displayFrequency = parms.displayHz; + glConfig.multisamples = parms.multiSamples; +#else // SDL 1.2 + common->Printf( "TODO: Implement GLimp_SetScreenParms() for SDL1.2\n" ); +#endif + return true; } From a1c1f1b6b20b5fe6eb9605c3cf1e9d30750f4bc9 Mon Sep 17 00:00:00 2001 From: Daniel Gibson Date: Thu, 3 Jan 2013 08:15:09 +0100 Subject: [PATCH 37/57] Support resizing windows for SDL1.2 By implementing GLimp_SetScreenParms() for SDL1.2 and enhancing the event handling --- neo/sys/sdl/sdl_events.cpp | 18 +++++++++++++++- neo/sys/sdl/sdl_glimp.cpp | 43 ++++++++++++++++++++++++++------------ 2 files changed, 47 insertions(+), 14 deletions(-) diff --git a/neo/sys/sdl/sdl_events.cpp b/neo/sys/sdl/sdl_events.cpp index b7988c6a..251830d8 100644 --- a/neo/sys/sdl/sdl_events.cpp +++ b/neo/sys/sdl/sdl_events.cpp @@ -802,8 +802,24 @@ sysEvent_t Sys_GetEvent() case SDL_VIDEOEXPOSE: return res_none; -#endif + // DG: handle resizing and moving of window + case SDL_VIDEORESIZE: + { + int w = ev.resize.w; + int h = ev.resize.h; + r_windowWidth.SetInteger( w ); + r_windowHeight.SetInteger( h ); + + glConfig.nativeScreenWidth = w; + glConfig.nativeScreenHeight = h; + // for some reason this needs a vid_restart in SDL1 but not SDL2 so GLimp_SetScreenParms() is called + PushConsoleEvent( "vid_restart" ); + return res_none; + } + // DG end +#endif + case SDL_KEYDOWN: if( ev.key.keysym.sym == SDLK_RETURN && ( ev.key.keysym.mod & KMOD_ALT ) > 0 ) { diff --git a/neo/sys/sdl/sdl_glimp.cpp b/neo/sys/sdl/sdl_glimp.cpp index fc1022d2..fee6c78f 100644 --- a/neo/sys/sdl/sdl_glimp.cpp +++ b/neo/sys/sdl/sdl_glimp.cpp @@ -55,6 +55,7 @@ static SDL_GLContext context = NULL; static SDL_Surface* window = NULL; #define SDL_WINDOW_OPENGL SDL_OPENGL #define SDL_WINDOW_FULLSCREEN SDL_FULLSCREEN +#define SDL_WINDOW_RESIZABLE SDL_RESIZABLE #endif bool QGL_Init( const char* dllname ); @@ -307,7 +308,7 @@ bool GLimp_Init( glimpParms_t parms ) */ #if SDL_VERSION_ATLEAST(2, 0, 0) -// SDL1 doesn't support multiple displays +// SDL1 doesn't support multiple displays, so the source is much shorter and doesn't need seperate functions // makes sure the window will be full-screened on the right display and returns the SDL display index static int ScreenParmsHandleDisplayIndex( glimpParms_t parms ) { @@ -346,11 +347,9 @@ static int ScreenParmsHandleDisplayIndex( glimpParms_t parms ) } return displayIdx; } -#endif // SDL_VERSION_ATLEAST(2, 0, 0) static bool SetScreenParmsFullscreen( glimpParms_t parms ) { -#if SDL_VERSION_ATLEAST(2, 0, 0) SDL_DisplayMode m = {0}; int displayIdx = ScreenParmsHandleDisplayIndex( parms ); if( displayIdx < 0 ) @@ -381,15 +380,11 @@ static bool SetScreenParmsFullscreen( glimpParms_t parms ) return false; } } -#else // ! SDL_VERSION_ATLEAST(2, 0, 0) => SDL1.2 - // TODO: SDL1.2 fullscreen handling -#endif // SDL_VERSION_ATLEAST(2, 0, 0) return true; } static bool SetScreenParmsWindowed( glimpParms_t parms ) { -#if SDL_VERSION_ATLEAST(2, 0, 0) SDL_SetWindowSize( window, parms.width, parms.height ); SDL_SetWindowPosition( window, parms.x, parms.y ); @@ -402,11 +397,9 @@ static bool SetScreenParmsWindowed( glimpParms_t parms ) return false; } } -#else // SDL 1.2 - // TODO: SDL1.2 windowed handling -#endif return true; } +#endif // SDL_VERSION_ATLEAST(2, 0, 0) /* =================== @@ -431,6 +424,33 @@ bool GLimp_SetScreenParms( glimpParms_t parms ) common->Warning( "GLimp_SetScreenParms: fullScreen -1 (borderless window for multiple displays) currently unsupported!" ); return false; } +#else // SDL 1.2 - so much shorter, but doesn't handle multiple displays + SDL_Surface* s = SDL_GetVideoSurface(); + if( s == NULL ) + { + common->Warning( "GLimp_SetScreenParms: Couldn't get video information, reason: %s", SDL_GetError() ); + return false; + } + + + int bitsperpixel = 24; + if( s->format ) + bitsperpixel = s->format->BitsPerPixel; + + Uint32 flags = s->flags; + + if( parms.fullScreen ) + flags |= SDL_FULLSCREEN; + else + flags &= ~SDL_FULLSCREEN; + + s = SDL_SetVideoMode( parms.width, parms.height, bitsperpixel, flags ); + if( s == NULL ) + { + common->Warning( "GLimp_SetScreenParms: Couldn't set video information, reason: %s", SDL_GetError() ); + return false; + } +#endif // SDL_VERSION_ATLEAST(2, 0, 0) // Note: the following stuff would also work with SDL1.2 SDL_GL_SetAttribute( SDL_GL_STEREO, parms.stereo ? 1 : 0 ); @@ -444,9 +464,6 @@ bool GLimp_SetScreenParms( glimpParms_t parms ) glConfig.nativeScreenHeight = parms.height; glConfig.displayFrequency = parms.displayHz; glConfig.multisamples = parms.multiSamples; -#else // SDL 1.2 - common->Printf( "TODO: Implement GLimp_SetScreenParms() for SDL1.2\n" ); -#endif return true; } From 732d8987d3ebaa72628f2383210ccb18bdc8b1ad Mon Sep 17 00:00:00 2001 From: Daniel Gibson Date: Thu, 3 Jan 2013 09:28:52 +0100 Subject: [PATCH 38/57] support ctrl-g for (un)grabbing mouse Many Linux Games support that --- neo/sys/sdl/sdl_events.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/neo/sys/sdl/sdl_events.cpp b/neo/sys/sdl/sdl_events.cpp index 251830d8..dd0a4bbc 100644 --- a/neo/sys/sdl/sdl_events.cpp +++ b/neo/sys/sdl/sdl_events.cpp @@ -837,6 +837,16 @@ sysEvent_t Sys_GetEvent() return res_none; } + // DG: ctrl-g to un-grab mouse - yeah, left ctrl shoots, then just use right ctrl :) + if( ev.key.keysym.sym == SDLK_g && ( ev.key.keysym.mod & KMOD_CTRL ) > 0 ) + { + bool grab = cvarSystem->GetCVarBool( "in_nograb" ); + grab = !grab; + cvarSystem->SetCVarBool( "in_nograb", grab ); + return res_none; + } + // DG end + // fall through case SDL_KEYUP: { From a405b37f13907a06f1e7b96fa562ab860092c081 Mon Sep 17 00:00:00 2001 From: Daniel Gibson Date: Thu, 3 Jan 2013 12:39:16 +0100 Subject: [PATCH 39/57] Pause when window loses focus, introduce com_pause If the window loses focus com_pause is set to 1, when it regains focus it's set to 0. The behaviour on Win32 stayed the same (the implementation is less hacky though) and Linux now matchces that. --- neo/framework/Common.cpp | 4 ++++ neo/framework/common_frame.cpp | 22 +++++++++++++++++----- neo/sys/posix/posix_session_local.cpp | 5 ++--- neo/sys/sdl/sdl_events.cpp | 18 ++++++++++++------ neo/sys/win32/win_session_local.cpp | 4 +++- neo/sys/win32/win_wndproc.cpp | 4 ++++ 6 files changed, 42 insertions(+), 15 deletions(-) diff --git a/neo/framework/Common.cpp b/neo/framework/Common.cpp index 62bfabb4..21ab1960 100644 --- a/neo/framework/Common.cpp +++ b/neo/framework/Common.cpp @@ -86,6 +86,10 @@ idCVar preload_CommonAssets( "preload_CommonAssets", "1", CVAR_SYSTEM | CVAR_BOO idCVar net_inviteOnly( "net_inviteOnly", "1", CVAR_BOOL | CVAR_ARCHIVE, "whether or not the private server you create allows friends to join or invite only" ); +// DG: add cvar for pause +idCVar com_pause( "com_pause", "0", CVAR_BOOL | CVAR_SYSTEM , "set to 1 to pause game, to 0 to unpause again" ); +// DG end + extern idCVar g_demoMode; idCVar com_engineHz( "com_engineHz", "60", CVAR_FLOAT | CVAR_ARCHIVE, "Frames per second the engine runs at", 10.0f, 1024.0f ); diff --git a/neo/framework/common_frame.cpp b/neo/framework/common_frame.cpp index a1968f50..a63f0053 100644 --- a/neo/framework/common_frame.cpp +++ b/neo/framework/common_frame.cpp @@ -438,6 +438,8 @@ void idCommonLocal::ProcessGameReturn( const gameReturn_t& ret ) extern idCVar com_forceGenericSIMD; +extern idCVar com_pause; + /* ================= idCommonLocal::Frame @@ -485,13 +487,16 @@ void idCommonLocal::Frame() // if the console or another gui is down, we don't need to hold the mouse cursor bool chatting = false; + // DG: Add pause from com_pause cvar // RB begin #if defined(USE_DOOMCLASSIC) - if( console->Active() || Dialog().IsDialogActive() || session->IsSystemUIShowing() || ( game && game->InhibitControls() && !IsPlayingDoomClassic() ) ) + if( console->Active() || Dialog().IsDialogActive() || session->IsSystemUIShowing() + || ( game && game->InhibitControls() && !IsPlayingDoomClassic() ) ) #else - if( console->Active() || Dialog().IsDialogActive() || session->IsSystemUIShowing() || ( game && game->InhibitControls() ) ) + if( com_pause.GetInteger() || console->Active() || Dialog().IsDialogActive() || session->IsSystemUIShowing() + || ( game && game->InhibitControls() ) ) #endif - // RB end + // RB end, DG end { Sys_GrabMouseCursor( false ); usercmdGen->InhibitUsercmd( INHIBIT_SESSION, true ); @@ -505,9 +510,16 @@ void idCommonLocal::Frame() // RB begin #if defined(USE_DOOMCLASSIC) - const bool pauseGame = ( !mapSpawned || ( !IsMultiplayer() && ( Dialog().IsDialogPausing() || session->IsSystemUIShowing() || ( game && game->Shell_IsActive() ) ) ) ) && !IsPlayingDoomClassic(); + const bool pauseGame = ( !mapSpawned + || ( !IsMultiplayer() + && ( Dialog().IsDialogPausing() || session->IsSystemUIShowing() + || ( game && game->Shell_IsActive() ) || com_pause.GetInteger() ) ) ) + && !IsPlayingDoomClassic(); #else - const bool pauseGame = ( !mapSpawned || ( !IsMultiplayer() && ( Dialog().IsDialogPausing() || session->IsSystemUIShowing() || ( game && game->Shell_IsActive() ) ) ) ); + const bool pauseGame = ( !mapSpawned + || ( !IsMultiplayer() + && ( Dialog().IsDialogPausing() || session->IsSystemUIShowing() + || ( game && game->Shell_IsActive() ) || com_pause.GetInteger() ) ) ); #endif // RB end diff --git a/neo/sys/posix/posix_session_local.cpp b/neo/sys/posix/posix_session_local.cpp index 404f4670..cca9802e 100644 --- a/neo/sys/posix/posix_session_local.cpp +++ b/neo/sys/posix/posix_session_local.cpp @@ -456,10 +456,9 @@ idSessionLocalWin::IsSystemUIShowing */ bool idSessionLocalWin::IsSystemUIShowing() const { - // RB: TODO track SDL_ACTIVEENT + // DG: pausing here when window is out of focus like originally done on windows is hacky + // it's done with com_pause now. return isSysUIShowing; - - //return !win32.activeApp || isSysUIShowing; // If the user alt+tabs away, treat it the same as bringing up the steam overlay } /* diff --git a/neo/sys/sdl/sdl_events.cpp b/neo/sys/sdl/sdl_events.cpp index dd0a4bbc..e0e4ca21 100644 --- a/neo/sys/sdl/sdl_events.cpp +++ b/neo/sys/sdl/sdl_events.cpp @@ -741,14 +741,18 @@ sysEvent_t Sys_GetEvent() newmod |= KMOD_CAPS; SDL_SetModState( ( SDL_Keymod )newmod ); - // DG: disabling the cursor is now done once in GLimp_Init() because it should always be disabled - GLimp_GrabInput( GRAB_ENABLE | GRAB_REENABLE ); + + // DG: un-pause the game when focus is gained, that also re-grabs the input + // disabling the cursor is now done once in GLimp_Init() because it should always be disabled + cvarSystem->SetCVarBool( "com_pause", false ); // DG end break; } case SDL_WINDOWEVENT_FOCUS_LOST: - GLimp_GrabInput( 0 ); + // DG: pause the game when focus is lost, that also un-grabs the input + cvarSystem->SetCVarBool( "com_pause", true ); + // DG end break; // DG: handle resizing and moving of window @@ -779,11 +783,13 @@ sysEvent_t Sys_GetEvent() #else case SDL_ACTIVEEVENT: { - int flags = 0; + // DG: (un-)pause the game when focus is gained, that also (un-)grabs the input + bool pause = true; if( ev.active.gain ) { - flags = GRAB_ENABLE | GRAB_REENABLE | GRAB_HIDECURSOR; + + pause = false; // unset modifier, in case alt-tab was used to leave window and ALT is still set // as that can cause fullscreen-toggling when pressing enter... @@ -795,7 +801,7 @@ sysEvent_t Sys_GetEvent() SDL_SetModState( ( SDLMod )newmod ); } - GLimp_GrabInput( flags ); + cvarSystem->SetCVarBool( "com_pause", pause ); } return res_none; diff --git a/neo/sys/win32/win_session_local.cpp b/neo/sys/win32/win_session_local.cpp index 3b175eb7..b76b065b 100644 --- a/neo/sys/win32/win_session_local.cpp +++ b/neo/sys/win32/win_session_local.cpp @@ -456,7 +456,9 @@ idSessionLocalWin::IsSystemUIShowing */ bool idSessionLocalWin::IsSystemUIShowing() const { - return !win32.activeApp || isSysUIShowing; // If the user alt+tabs away, treat it the same as bringing up the steam overlay + // DG: wtf, !win32.activeApp doesn't belong here, this is totally confusing and hacky. + // pause (when losing focus or invoking explicitly) is now handled properly by com_pause + return isSysUIShowing; } /* diff --git a/neo/sys/win32/win_wndproc.cpp b/neo/sys/win32/win_wndproc.cpp index 680b467e..5eec81eb 100644 --- a/neo/sys/win32/win_wndproc.cpp +++ b/neo/sys/win32/win_wndproc.cpp @@ -288,6 +288,10 @@ LONG WINAPI MainWndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) // start playing the game sound world soundSystem->SetMute( !win32.activeApp ); + // DG: set com_pause so game pauses when focus is lost + // and continues when focus is regained + cvarSystem->SetCVarBool( "com_pause", !win32.activeApp ); + // DG end // we do not actually grab or release the mouse here, // that will be done next time through the main loop From cf8d287a4e1ae97ce4ba4d01679beb6c4afff26a Mon Sep 17 00:00:00 2001 From: Daniel Gibson Date: Fri, 4 Jan 2013 14:33:17 +0100 Subject: [PATCH 40/57] Fix Sys_ListFiles() on POSIX once again Turned out that as "extension" (which is really more like a pattern that matches the whole file) was even used with patterns like "*.*" so we do proper matching using fnmatch() now - which is even easier than the old way. Now deleting savegames on POSIX works. --- neo/sys/posix/posix_main.cpp | 32 +++++++++++++++----------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/neo/sys/posix/posix_main.cpp b/neo/sys/posix/posix_main.cpp index ea460114..80ee0831 100644 --- a/neo/sys/posix/posix_main.cpp +++ b/neo/sys/posix/posix_main.cpp @@ -42,6 +42,7 @@ If you have questions concerning this license or the applicable additional terms #include #include #include +#include // RB begin #if defined(__ANDROID__) @@ -358,21 +359,23 @@ int Sys_ListFiles( const char* directory, const char* extension, idStrList& list list.Clear(); debug = cvarSystem->GetCVarBool( "fs_debug" ); - - // DG: handle "*" as special case that matches everything - // FIXME: handle * properly as a wildcase somewhere in the string? - if( !extension || ( extension[0] == '*' && extension[1] == '\0' ) ) - extension = ""; - // DG end + // DG: we use fnmatch for shell-style pattern matching + // so the pattern should at least contain "*" to match everything, + // the extension will be added behind that (if !dironly) + idStr pattern( "*" ); // passing a slash as extension will find directories if( extension[0] == '/' && extension[1] == 0 ) { - extension = ""; dironly = true; } + else + { + // so we have *, the same as in the windows code basically + pattern += extension; + } + // DG end - // search // NOTE: case sensitivity of directory path can screw us up here if( ( fdir = opendir( directory ) ) == NULL ) { @@ -399,8 +402,6 @@ int Sys_ListFiles( const char* directory, const char* extension, idStrList& list return 0; } - int extLen = idStr::Length( extension ); - while( readdir_r( fdir, entry, &d ) == 0 && d != NULL ) { // DG end @@ -410,14 +411,11 @@ int Sys_ListFiles( const char* directory, const char* extension, idStrList& list if( !dironly ) { // DG: the original code didn't work because d3 bfg abuses the extension - // to match whole filenames in the savegame-code, not just file extensions... - // the extension must be the last chars of the filename - // so start matching at startPos = strlen(d->d_name) - strlen(extension) - int startPos = idStr::Length( d->d_name ) - extLen; - // of course the extension can't match if it's longer than the filename, i.e. startPos < 0 - if( startPos < 0 || idStr::FindText( d->d_name, extension, true, startPos ) < 0 ) + // to match whole filenames and patterns in the savegame-code, not just file extensions... + // so just use fnmatch() which supports matching shell wildcard patterns ("*.foo" etc) + // if we should ever need case insensitivity, use FNM_CASEFOLD as third flag + if( fnmatch( pattern.c_str(), d->d_name, 0 ) != 0 ) continue; - // DG end } if( ( dironly && !( st.st_mode & S_IFDIR ) ) || From c58f0d47496989b61c464143ec610f24e5481bb3 Mon Sep 17 00:00:00 2001 From: Daniel Gibson Date: Fri, 4 Jan 2013 17:01:40 +0100 Subject: [PATCH 41/57] Precompiled Headers for GCC+Clang --- neo/CMakeLists.txt | 68 ++++++++++++++++++++++++++++++++++++++-- neo/idlib/CMakeLists.txt | 43 ++++++++++++++++++++++--- 2 files changed, 104 insertions(+), 7 deletions(-) diff --git a/neo/CMakeLists.txt b/neo/CMakeLists.txt index ec09fdcc..fe61f08f 100644 --- a/neo/CMakeLists.txt +++ b/neo/CMakeLists.txt @@ -36,7 +36,7 @@ if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_C_COMPILER_ID STREQUAL "Clang") #endif() # the warnings are used for every profile anyway, so put them in a variable - set(my_warn_flags "-Wno-pragmas -fno-strict-aliasing -Wno-unused-variable -Wno-unused-but-set-variable -Wno-switch -Wno-unused-value") + set(my_warn_flags "-Wno-pragmas -Wno-unused-variable -Wno-unused-but-set-variable -Wno-switch -Wno-unused-value -Winvalid-pch") if(CMAKE_C_COMPILER_ID STREQUAL "Clang") # append clang-specific settings for warnings (the second one make sure clang doesn't complain @@ -1205,9 +1205,73 @@ else() list(REMOVE_DUPLICATES RBDOOM3_SOURCES) + set(RBDOOM3_PRECOMPILED_SOURCES ${RBDOOM3_SOURCES}) + list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${TIMIDITY_SOURCES} ${JPEG_SOURCES} ${ZLIB_SOURCES}) + list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/libs/zlib/minizip/ioapi.c) + list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/renderer/DXT/DXTDecoder.cpp) + list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/renderer/DXT/DXTEncoder.cpp) + list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/renderer/DXT/DXTEncoder_SSE2.cpp) + list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/renderer/jobs/dynamicshadowvolume/DynamicShadowVolume.cpp) + list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/renderer/jobs/prelightshadowvolume/PreLightShadowVolume.cpp) + list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/renderer/jobs/staticshadowvolume/StaticShadowVolume.cpp) + list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/renderer/jobs/ShadowShared.cpp) + list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/renderer/RenderLog.cpp) +# list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/../doomclassic/doom/i_sound_stub.cpp) + + foreach( src_file ${RBDOOM3_PRECOMPILED_SOURCES} ) + #message(STATUS "-include precompiled.h for ${src_file}") + set_source_files_properties( + ${src_file} + PROPERTIES + COMPILE_FLAGS "-include ${CMAKE_CURRENT_SOURCE_DIR}/idlib/precompiled.h" + ) + endforeach() + + # precompiled magic for GCC/clang, adapted from https://gist.github.com/573926 + STRING(TOUPPER "CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE}" _flags_var_name) + SET(_compiler_FLAGS ${${_flags_var_name}}) + GET_DIRECTORY_PROPERTY(_directory_flags INCLUDE_DIRECTORIES) + FOREACH(item ${_directory_flags}) + LIST(APPEND _compiler_FLAGS " -I${item}") + ENDFOREACH(item) + + GET_DIRECTORY_PROPERTY(_directory_flags DEFINITIONS) + LIST(APPEND _compiler_FLAGS ${_directory_flags}) + SEPARATE_ARGUMENTS(_compiler_FLAGS) + + # we need to recreate the precompiled header for RBDoom3BFG + # (i.e. can't use the one created for idlib before) + # because some definitions (e.g. -D__IDLIB__ -D__DOOM_DLL__) differ + add_custom_target(precomp_header_rbdoom3bfg ALL + COMMAND ${CMAKE_CXX_COMPILER} ${_compiler_FLAGS} -x c++-header idlib/precompiled.h -o idlib/precompiled.h.gch + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + COMMENT "Creating idlib/precompiled.h.gch for RBDoom3BFG" + ) + + if(WIN32) + set(remove_command "del") + else() + set(remove_command "rm") + endif() + # it's ugly enough that the precompiled header binary needs to be in the + # source directory (instead of the build directory), so let's at least + # delete it after build. + add_custom_target(rm_precomp_header ALL + COMMAND ${remove_command} "idlib/precompiled.h.gch" + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + COMMENT "remove idlib/precompiled.h.gch" + ) + + # make sure this is run after creating idlib + add_dependencies(precomp_header_rbdoom3bfg idlib) + add_executable(RBDoom3BFG WIN32 ${RBDOOM3_SOURCES}) - add_dependencies(RBDoom3BFG idlib) + # make sure precompiled header is created before executable is compiled + add_dependencies(RBDoom3BFG precomp_header_rbdoom3bfg) + + # make sure precompiled header is deleted after executable is compiled + add_dependencies(rm_precomp_header RBDoom3BFG) if(MINGW) include_directories(libs/sdl2/include) diff --git a/neo/idlib/CMakeLists.txt b/neo/idlib/CMakeLists.txt index 31f521fb..23d24219 100644 --- a/neo/idlib/CMakeLists.txt +++ b/neo/idlib/CMakeLists.txt @@ -14,14 +14,14 @@ endif() # add_definitions(-DSTANDALONE) #endif() +set(ID_PRECOMPILED_SOURCES ${ID_SOURCES}) +list(REMOVE_ITEM ID_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/geometry/RenderMatrix.cpp) +list(REMOVE_ITEM ID_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/SoftwareCache.cpp) + if(MSVC) #set_target_properties(idlib PROPERTIES COMPILE_FLAGS "/Yuprecompiled.h") - set(ID_PRECOMPILED_SOURCES ${ID_SOURCES}) - list(REMOVE_ITEM ID_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/geometry/RenderMatrix.cpp) - list(REMOVE_ITEM ID_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/SoftwareCache.cpp) - foreach( src_file ${ID_PRECOMPILED_SOURCES} ) #message(STATUS "/Yuprecompiled.h for ${src_file}") set_source_files_properties( @@ -35,11 +35,44 @@ if(MSVC) PROPERTIES COMPILE_FLAGS "/Ycprecompiled.h" ) + + add_library(idlib ${ID_SOURCES} ${ID_INCLUDES}) else() + foreach( src_file ${ID_PRECOMPILED_SOURCES} ) + #message(STATUS "-include precompiled.h for ${src_file}") + set_source_files_properties( + ${src_file} + PROPERTIES + COMPILE_FLAGS "-include ${CMAKE_CURRENT_SOURCE_DIR}/precompiled.h" + ) + endforeach() + include_directories(.) + + # precompiled magic for GCC/clang, adapted from https://gist.github.com/573926 + STRING(TOUPPER "CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE}" _flags_var_name) + SET(_compiler_FLAGS ${${_flags_var_name}}) + GET_DIRECTORY_PROPERTY(_directory_flags INCLUDE_DIRECTORIES) + FOREACH(item ${_directory_flags}) + LIST(APPEND _compiler_FLAGS " -I${item}") + ENDFOREACH(item) + + GET_DIRECTORY_PROPERTY(_directory_flags DEFINITIONS) + LIST(APPEND _compiler_FLAGS ${_directory_flags}) + + SEPARATE_ARGUMENTS(_compiler_FLAGS) + + add_custom_target(precomp_header_idlib ALL + COMMAND ${CMAKE_CXX_COMPILER} ${_compiler_FLAGS} -x c++-header precompiled.h -o precompiled.h.gch + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + COMMENT "Creating idlib/precompiled.h.gch for idlib" + ) + + add_library(idlib ${ID_SOURCES} ${ID_INCLUDES}) + add_dependencies(idlib precomp_header_idlib) + endif() -add_library(idlib ${ID_SOURCES} ${ID_INCLUDES}) # if(MSVC) # # set_source_files_properties(precompiled.cpp From 9ac405223b673ced0646202a90268d1e40031e09 Mon Sep 17 00:00:00 2001 From: Robert Beckebans Date: Fri, 4 Jan 2013 18:12:20 +0100 Subject: [PATCH 42/57] Changed idSoundSample_OpenAL::MakeDefault() to generated a proper beep sound --- neo/sound/OpenAL/AL_SoundSample.cpp | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/neo/sound/OpenAL/AL_SoundSample.cpp b/neo/sound/OpenAL/AL_SoundSample.cpp index 446db948..6199a1f4 100644 --- a/neo/sound/OpenAL/AL_SoundSample.cpp +++ b/neo/sound/OpenAL/AL_SoundSample.cpp @@ -150,6 +150,7 @@ idSoundSample_OpenAL::LoadGeneratedSound */ bool idSoundSample_OpenAL::LoadGeneratedSample( const idStr& filename ) { +#if 1 idFileLocal fileIn( fileSystem->OpenFileReadMemory( filename ) ); if( fileIn != NULL ) { @@ -178,6 +179,8 @@ bool idSoundSample_OpenAL::LoadGeneratedSample( const idStr& filename ) } return true; } +#endif + return false; } /* @@ -447,7 +450,7 @@ void idSoundSample_OpenAL::MakeDefault() { FreeData(); - static const int DEFAULT_NUM_SAMPLES = 256; + static const int DEFAULT_NUM_SAMPLES = 4096; timestamp = FILE_NOT_FOUND_TIMESTAMP; loaded = true; @@ -456,19 +459,24 @@ void idSoundSample_OpenAL::MakeDefault() format.basic.formatTag = idWaveFile::FORMAT_PCM; format.basic.numChannels = 1; format.basic.bitsPerSample = 16; - format.basic.samplesPerSec = 1000; //XAUDIO2_MIN_SAMPLE_RATE; + format.basic.samplesPerSec = 22050; //44100; //XAUDIO2_MIN_SAMPLE_RATE; format.basic.blockSize = format.basic.numChannels * format.basic.bitsPerSample / 8; format.basic.avgBytesPerSec = format.basic.samplesPerSec * format.basic.blockSize; assert( format.basic.blockSize == 2 ); - totalBufferSize = DEFAULT_NUM_SAMPLES * 2; + totalBufferSize = DEFAULT_NUM_SAMPLES * 2;// * sizeof( short ); short* defaultBuffer = ( short* )AllocBuffer( totalBufferSize, GetName() ); for( int i = 0; i < DEFAULT_NUM_SAMPLES; i += 2 ) { - defaultBuffer[i + 0] = SHRT_MIN; - defaultBuffer[i + 1] = SHRT_MAX; + float v = sin( idMath::PI * 2 * i / 64 ); + int sample = v * 0x4000; + defaultBuffer[i + 0] = sample; + defaultBuffer[i + 1] = sample; + + //defaultBuffer[i + 0] = SHRT_MIN; + //defaultBuffer[i + 1] = SHRT_MAX; } buffers.SetNum( 1 ); From 0cf039bfdb1da5ad570a1cbb90bfcbfb0de05055 Mon Sep 17 00:00:00 2001 From: Robert Beckebans Date: Fri, 4 Jan 2013 22:51:30 +0100 Subject: [PATCH 43/57] Changed project to use the DirectX10 SDK on Windows 8 --- doomclassic/doom/i_sound_win32.cpp | 6 +-- neo/CMakeLists.txt | 72 +++++++++++++++++-------- neo/sound/XAudio2/XA2_SoundHardware.cpp | 10 ++-- neo/sound/snd_local.h | 4 +- neo/sys/win32/win_snd.cpp | 2 +- 5 files changed, 60 insertions(+), 34 deletions(-) diff --git a/doomclassic/doom/i_sound_win32.cpp b/doomclassic/doom/i_sound_win32.cpp index 14513203..24aea157 100644 --- a/doomclassic/doom/i_sound_win32.cpp +++ b/doomclassic/doom/i_sound_win32.cpp @@ -665,7 +665,7 @@ void I_InitSoundChannel( int channel, int numOutputChannels_ ) { activeSound_t *soundchannel = &activeSounds[ channel ]; // RB: fixed non-aggregates cannot be initialized with initializer list -#if (_WIN32_WINNT >= 0x0602 /*_WIN32_WINNT_WIN8*/) +#if defined(USE_WINRT) //(_WIN32_WINNT >= 0x0602 /*_WIN32_WINNT_WIN8*/) X3DAUDIO_VECTOR ZeroVector( 0.0f, 0.0f, 0.0f ); #else X3DAUDIO_VECTOR ZeroVector = { 0.0f, 0.0f, 0.0f }; @@ -735,7 +735,7 @@ void I_InitSound() { int i; // RB: non-aggregates cannot be initialized with initializer list -#if (_WIN32_WINNT >= 0x0602 /*_WIN32_WINNT_WIN8*/) +#if defined(USE_WINRT) // (_WIN32_WINNT >= 0x0602 /*_WIN32_WINNT_WIN8*/) X3DAUDIO_VECTOR ZeroVector( 0.0f, 0.0f, 0.0f ); #else X3DAUDIO_VECTOR ZeroVector = { 0.0f, 0.0f, 0.0f }; @@ -836,7 +836,7 @@ void I_InitMusic(void) voiceFormat.cbSize = 0; // RB: XAUDIO2_VOICE_MUSIC not available on Windows 8 SDK -#if (_WIN32_WINNT < 0x0602 /*_WIN32_WINNT_WIN8*/) +#if !defined(USE_WINRT) //(_WIN32_WINNT < 0x0602 /*_WIN32_WINNT_WIN8*/) soundSystemLocal.hardware.GetIXAudio2()->CreateSourceVoice( &pMusicSourceVoice, (WAVEFORMATEX *)&voiceFormat, XAUDIO2_VOICE_MUSIC ); #endif // RB end diff --git a/neo/CMakeLists.txt b/neo/CMakeLists.txt index ec09fdcc..1755d2f4 100644 --- a/neo/CMakeLists.txt +++ b/neo/CMakeLists.txt @@ -13,7 +13,7 @@ option(SDL2 "Use SDL2 instead of SDL1.2" OFF) option(OPENAL - "Use OpenAL soft instead of XAudio2" ON) + "Use OpenAL soft instead of XAudio2" OFF) if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_C_COMPILER_ID STREQUAL "Clang") @@ -78,15 +78,41 @@ elseif(MSVC) # Omit Frame Pointers # "/Oy", - set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /D _DEBUG /MP /MTd") - set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /MP /Oi /Oy /MT") - set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} /MP /Oi /MTd") - set(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} /MP /Oi /Oy /MT") + # if(MSVC_VERSION EQUAL 1700) + # #message(STATUS "$ENV{LIBPATH}") + + # find_path(Windows_winmd_DIR NAMES Windows.winmd + # HINTS + # C:/Program Files (x86)/Windows Kits/8.0/References/CommonConfiguration/Neutral + # PATH_SUFFIXES "Neutral") + + # message(STATUS "${Windows_winmd_DIR}") + + # #set(WINRT_OPTIONS "/ZW /D USE_WINRT /AI \"C:\Program Files (x86)\Windows Kits\8.0\References\CommonConfiguration\Neutral\"") + # #set(WINRT_OPTIONS "/ZW /D USE_WINRT /AI \"$ENV{LIBPATH}\" ") + # set(WINRT_OPTIONS "/ZW /D USE_WINRT") + + # set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /D _DEBUG /MP ${WINRT_OPTIONS}") + # set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /MP /Oi /Oy ${WINRT_OPTIONS}") + # set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} /MP /Oi ${WINRT_OPTIONS}") + # set(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} /MP /Oi /Oy ${WINRT_OPTIONS}") + + # set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MP ${WINRT_OPTIONS}") + # set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MP /Oi /Oy ${WINRT_OPTIONS}") + # set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /MP ${WINRT_OPTIONS}") + # set(CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL} /MP /Oi /Oy ${WINRT_OPTIONS}") + # else() + set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /D _DEBUG /MP /MTd") + set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /MP /Oi /Oy /MT") + set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} /MP /Oi /MTd") + set(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} /MP /Oi /Oy /MT") + + set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MP /MTd") + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MP /Oi /Oy /MT") + set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /MP /MTd") + set(CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL} /MP /Oi /Oy /MT") + # endif() - set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MP /MTd") - set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MP /Oi /Oy /MT") - set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /MP /MTd") - set(CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL} /MP /Oi /Oy /MT") add_definitions(-DWIN32 -D_WINDOWS @@ -1016,24 +1042,24 @@ include_directories( if(MSVC) - if(MSVC_VERSION EQUAL 1700) - set(DirectX_LIBRARIES - dinput8 - dsound - dxguid - #dxerr - Xinput - xaudio2.lib - ) + # if(MSVC_VERSION EQUAL 1700) + # set(DirectX_LIBRARIES + # dinput8 + # dsound + # dxguid + # #dxerr + # Xinput + # xaudio2.lib + # ) - if(NOT OPENAL) - list(APPEND DirectX_LIBRARIES xaudio2.lib) - endif() + # if(NOT OPENAL) + # list(APPEND DirectX_LIBRARIES xaudio2.lib) + # endif() - else() + # else() find_package(DirectX REQUIRED) include_directories(${DirectX_INCLUDE_DIR}) - endif() + #endif() if(OPENAL) add_definitions(-DUSE_OPENAL) diff --git a/neo/sound/XAudio2/XA2_SoundHardware.cpp b/neo/sound/XAudio2/XA2_SoundHardware.cpp index ef569d13..47612292 100644 --- a/neo/sound/XAudio2/XA2_SoundHardware.cpp +++ b/neo/sound/XAudio2/XA2_SoundHardware.cpp @@ -3,7 +3,7 @@ Doom 3 BFG Edition GPL Source Code Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company. -Copyright (C) 2012 Robert Beckebans +Copyright (C) 2013 Robert Beckebans This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code"). @@ -74,7 +74,7 @@ void listDevices_f( const idCmdArgs& args ) } // RB: not available on Windows 8 SDK -#if (_WIN32_WINNT >= 0x0602 /*_WIN32_WINNT_WIN8*/) +#if defined(USE_WINRT) //(_WIN32_WINNT >= 0x0602 /*_WIN32_WINNT_WIN8*/) // FIXME @@ -217,7 +217,7 @@ void idSoundHardware_XAudio2::Init() DWORD xAudioCreateFlags = 0; // RB: not available on Windows 8 SDK -#if (_WIN32_WINNT < 0x0602 /*_WIN32_WINNT_WIN8*/) && defined(_DEBUG) +#if !defined(USE_WINRT) && defined(_DEBUG) // (_WIN32_WINNT < 0x0602 /*_WIN32_WINNT_WIN8*/) && defined(_DEBUG) xAudioCreateFlags |= XAUDIO2_DEBUG_ENGINE; #endif // RB end @@ -227,7 +227,7 @@ void idSoundHardware_XAudio2::Init() // RB: not available on Windows 8 SDK if( FAILED( XAudio2Create( &pXAudio2, xAudioCreateFlags, xAudioProcessor ) ) ) { -#if (_WIN32_WINNT < 0x0602 /*_WIN32_WINNT_WIN8*/) && defined(_DEBUG) +#if !defined(USE_WINRT) && defined(_DEBUG) // (_WIN32_WINNT < 0x0602 /*_WIN32_WINNT_WIN8*/) && defined(_DEBUG) if( xAudioCreateFlags & XAUDIO2_DEBUG_ENGINE ) { // in case the debug engine isn't installed @@ -258,7 +258,7 @@ void idSoundHardware_XAudio2::Init() soundEngineCallback.hardware = this; // RB: not available on Windows 8 SDK -#if (_WIN32_WINNT >= 0x0602 /*_WIN32_WINNT_WIN8*/) +#if defined(USE_WINRT) //(_WIN32_WINNT >= 0x0602 /*_WIN32_WINNT_WIN8*/) // FIXME diff --git a/neo/sound/snd_local.h b/neo/sound/snd_local.h index de2a5223..5875da59 100644 --- a/neo/sound/snd_local.h +++ b/neo/sound/snd_local.h @@ -109,7 +109,7 @@ typedef enum #else // RB: not available on Windows 8 SDK -#if (_WIN32_WINNT < 0x0602 /*_WIN32_WINNT_WIN8*/) +#if !defined(USE_WINRT) // (_WIN32_WINNT < 0x0602 /*_WIN32_WINNT_WIN8*/) #include #endif // RB end @@ -119,7 +119,7 @@ typedef enum #include // RB: not available on Windows 8 SDK -#if (_WIN32_WINNT < 0x0602 /*_WIN32_WINNT_WIN8*/) +#if !defined(USE_WINRT) // (_WIN32_WINNT < 0x0602 /*_WIN32_WINNT_WIN8*/) #include #endif diff --git a/neo/sys/win32/win_snd.cpp b/neo/sys/win32/win_snd.cpp index 0c57cad1..c7b4271b 100644 --- a/neo/sys/win32/win_snd.cpp +++ b/neo/sys/win32/win_snd.cpp @@ -31,7 +31,7 @@ If you have questions concerning this license or the applicable additional terms // RB: not available on Windows 8 SDK #if defined(__MINGW32__) #include -#elif (_WIN32_WINNT < 0x0602 /*_WIN32_WINNT_WIN8*/) +#elif !defined(USE_WINRT) // (_WIN32_WINNT < 0x0602 /*_WIN32_WINNT_WIN8*/) #include #endif // RB end From a2fe0796006bb83ee3d021c9adac8be4476efe94 Mon Sep 17 00:00:00 2001 From: Robert Beckebans Date: Sat, 5 Jan 2013 00:13:35 +0100 Subject: [PATCH 44/57] Changed OpenAL to use buffers instead of streaming --- neo/CMakeLists.txt | 26 +++- neo/cmake-vs2010-32bit.bat | 2 +- neo/cmake-vs2010-64bit.bat | 2 +- neo/cmake-vs2012-32bit.bat | 2 +- neo/cmake-vs2012-64bit.bat | 2 +- neo/sound/OpenAL/AL_SoundSample.cpp | 86 ++++++++++++ neo/sound/OpenAL/AL_SoundSample.h | 5 + neo/sound/OpenAL/AL_SoundVoice.cpp | 209 +++++++++++++++------------- 8 files changed, 235 insertions(+), 99 deletions(-) diff --git a/neo/CMakeLists.txt b/neo/CMakeLists.txt index 443c4db6..f8468f59 100644 --- a/neo/CMakeLists.txt +++ b/neo/CMakeLists.txt @@ -15,6 +15,21 @@ option(SDL2 option(OPENAL "Use OpenAL soft instead of XAudio2" ON) +if(MSVC) + #message(STATUS CMAKE_ROOT: ${CMAKE_ROOT}) + + #if(CMAKE_CL_64) + # SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/../bin/win64) + #else() + # SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/../bin/win32) + #endif() + + #message(STATUS EXECUTABLE_OUTPUT_PATH: ${EXECUTABLE_OUTPUT_PATH}) + #message(STATUS PROJECT_BINARY_DIR: ${PROJECT_BINARY_DIR}) + #message(STATUS CMAKE_BINARY_DIR: ${CMAKE_BINARY_DIR}) +else() + message(STATUS CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}) +endif() if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_C_COMPILER_ID STREQUAL "Clang") add_definitions(-pipe) @@ -1051,6 +1066,13 @@ if(MSVC) set(OpenAL_LIBRARIES OpenAL32) + + if(CMAKE_CL_64) + install(FILES libs/openal-soft/lib/win64/OpenAL64.dll DESTINATION .) + else() + install(FILES libs/openal-soft/lib/win32/OpenAL32.dll DESTINATION .) + install(FILES libs/openal-soft/lib/win32/OpenAL32.pdb DESTINATION .) + endif() else() add_definitions(-DUSE_DOOMCLASSIC) @@ -1161,10 +1183,10 @@ if(MSVC) #CMAKE_BINARY_DIR if(CMAKE_CL_64) install(TARGETS RBDoom3BFG - RUNTIME DESTINATION ../bin/win64) + RUNTIME DESTINATION .) else() install(TARGETS RBDoom3BFG - RUNTIME DESTINATION ../bin/win32) + RUNTIME DESTINATION .) endif() else() diff --git a/neo/cmake-vs2010-32bit.bat b/neo/cmake-vs2010-32bit.bat index ba2fbdd9..409edc5b 100644 --- a/neo/cmake-vs2010-32bit.bat +++ b/neo/cmake-vs2010-32bit.bat @@ -2,5 +2,5 @@ cd .. del /s /q build mkdir build cd build -cmake -G "Visual Studio 10" ../neo +cmake -G "Visual Studio 10" -DCMAKE_INSTALL_PREFIX=../bin/win32 ../neo pause \ No newline at end of file diff --git a/neo/cmake-vs2010-64bit.bat b/neo/cmake-vs2010-64bit.bat index aa2514c8..2932547b 100644 --- a/neo/cmake-vs2010-64bit.bat +++ b/neo/cmake-vs2010-64bit.bat @@ -2,5 +2,5 @@ cd .. del /s /q build mkdir build cd build -cmake -G "Visual Studio 10 Win64" ../neo +cmake -G "Visual Studio 10 Win64" -DCMAKE_INSTALL_PREFIX=../bin/win64 ../neo pause \ No newline at end of file diff --git a/neo/cmake-vs2012-32bit.bat b/neo/cmake-vs2012-32bit.bat index f2c04996..07aff35a 100644 --- a/neo/cmake-vs2012-32bit.bat +++ b/neo/cmake-vs2012-32bit.bat @@ -2,5 +2,5 @@ cd .. del /s /q build mkdir build cd build -cmake -G "Visual Studio 11" ../neo +cmake -G "Visual Studio 11" -DCMAKE_INSTALL_PREFIX=../bin/win8-32 ../neo pause \ No newline at end of file diff --git a/neo/cmake-vs2012-64bit.bat b/neo/cmake-vs2012-64bit.bat index 6f719d30..e8c17996 100644 --- a/neo/cmake-vs2012-64bit.bat +++ b/neo/cmake-vs2012-64bit.bat @@ -2,5 +2,5 @@ cd .. del /s /q build mkdir build cd build -cmake -G "Visual Studio 11 Win64" ../neo +cmake -G "Visual Studio 11 Win64" -DCMAKE_INSTALL_PREFIX=../bin/win8-64 ../neo pause \ No newline at end of file diff --git a/neo/sound/OpenAL/AL_SoundSample.cpp b/neo/sound/OpenAL/AL_SoundSample.cpp index 6199a1f4..afe6b6a2 100644 --- a/neo/sound/OpenAL/AL_SoundSample.cpp +++ b/neo/sound/OpenAL/AL_SoundSample.cpp @@ -79,6 +79,8 @@ idSoundSample_OpenAL::idSoundSample_OpenAL() playLength = 0; lastPlayedTime = 0; + + openalBuffer = 0; } /* @@ -257,6 +259,30 @@ void idSoundSample_OpenAL::LoadResource() } } } + + // build OpenAL buffer + alGetError(); + alGenBuffers( 1, &openalBuffer ); + + if( alGetError() != AL_NO_ERROR ) + { + common->Error( "idSoundSample_OpenAL::MakeDefault: error generating OpenAL hardware buffer" ); + } + + if( alIsBuffer( openalBuffer ) ) + { + alGetError(); + + // RB: TODO decode idWaveFile::FORMAT_ADPCM to idWaveFile::FORMAT_PCM + // and build one big OpenAL buffer using the alBufferSubData extension + + alBufferData( openalBuffer, GetOpenALBufferFormat(), buffers[0].buffer, buffers[0].bufferSize, format.basic.samplesPerSec ); + if( alGetError() != AL_NO_ERROR ) + { + common->Error( "idSoundSample_OpenAL::MakeDefault: error loading data into OpenAL hardware buffer" ); + } + } + return; } } @@ -487,6 +513,25 @@ void idSoundSample_OpenAL::MakeDefault() playBegin = 0; playLength = DEFAULT_NUM_SAMPLES; + + + alGetError(); + alGenBuffers( 1, &openalBuffer ); + + if( alGetError() != AL_NO_ERROR ) + { + common->Error( "idSoundSample_OpenAL::MakeDefault: error generating OpenAL hardware buffer" ); + } + + if( alIsBuffer( openalBuffer ) ) + { + alGetError(); + alBufferData( openalBuffer, GetOpenALBufferFormat(), defaultBuffer, totalBufferSize, format.basic.samplesPerSec ); + if( alGetError() != AL_NO_ERROR ) + { + common->Error( "idSoundSample_OpenAL::MakeDefault: error loading data into OpenAL hardware buffer" ); + } + } } /* @@ -515,6 +560,20 @@ void idSoundSample_OpenAL::FreeData() totalBufferSize = 0; playBegin = 0; playLength = 0; + + if( alIsBuffer( openalBuffer ) ) + { + alGetError(); + alDeleteBuffers( 1, &openalBuffer ); + if( alGetError() != AL_NO_ERROR ) + { + common->Error( "idSoundSample_OpenAL::FreeData: error unloading data from OpenAL hardware buffer" ); + } + else + { + openalBuffer = 0; + } + } } /* @@ -557,3 +616,30 @@ float idSoundSample_OpenAL::GetAmplitude( int timeMS ) const } return ( float )amplitude[index] / 255.0f; } + + +ALenum idSoundSample_OpenAL::GetOpenALBufferFormat() const +{ + ALenum alFormat; + + if( format.basic.formatTag == idWaveFile::FORMAT_PCM ) + { + alFormat = NumChannels() == 1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16; + } + else if( format.basic.formatTag == idWaveFile::FORMAT_ADPCM ) + { + alFormat = NumChannels() == 1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16; + //alFormat = NumChannels() == 1 ? AL_FORMAT_IMA_ADPCM_MONO16_EXT : AL_FORMAT_IMA_ADPCM_STEREO16_EXT; + } + else if( format.basic.formatTag == idWaveFile::FORMAT_XMA2 ) + { + alFormat = NumChannels() == 1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16; + } + else + { + alFormat = NumChannels() == 1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16; + } + + return alFormat; +} + diff --git a/neo/sound/OpenAL/AL_SoundSample.h b/neo/sound/OpenAL/AL_SoundSample.h index 9ce9faac..bfa16f42 100644 --- a/neo/sound/OpenAL/AL_SoundSample.h +++ b/neo/sound/OpenAL/AL_SoundSample.h @@ -130,6 +130,8 @@ public: float GetAmplitude( int timeMS ) const; + ALenum GetOpenALBufferFormat() const; + protected: friend class idSoundHardware_OpenAL; friend class idSoundVoice_OpenAL; @@ -163,6 +165,9 @@ protected: int totalBufferSize; // total size of all the buffers idList buffers; + // OpenAL buffer that contains all buffers + ALuint openalBuffer; + int playBegin; int playLength; diff --git a/neo/sound/OpenAL/AL_SoundVoice.cpp b/neo/sound/OpenAL/AL_SoundVoice.cpp index 245d3b3c..ba8f3f5c 100644 --- a/neo/sound/OpenAL/AL_SoundVoice.cpp +++ b/neo/sound/OpenAL/AL_SoundVoice.cpp @@ -156,8 +156,23 @@ void idSoundVoice_OpenAL::Create( const idSoundSample* leadinSample_, const idSo alSourcef( openalSource, AL_ROLLOFF_FACTOR, 0.0f ); - // handle streaming sounds (decode on the fly) both single shot AND looping - //if( triggered ) + //if( ( loopingSample == NULL && leadinSample->openalBuffer != 0 ) || ( loopingSample != NULL && soundShader->entries[0]->hardwareBuffer ) ) + if( leadinSample->openalBuffer != NULL ) + { + alSourcei( openalSource, AL_BUFFER, 0 ); + + // handle uncompressed (non streaming) single shot and looping sounds + /* + if( triggered ) + { + alSourcei( openalSource, AL_BUFFER, looping ? chan->soundShader->entries[0]->openalBuffer : leadinSample->openalBuffer ); + } + */ + } + else + + // handle streaming sounds (decode on the fly) both single shot AND looping + //if( triggered ) { alSourcei( openalSource, AL_BUFFER, 0 ); alDeleteBuffers( 3, &lastopenalStreamingBuffer[0] ); @@ -359,81 +374,89 @@ int idSoundVoice_OpenAL::SubmitBuffer( idSoundSample_OpenAL* sample, int bufferN bufferContext->bufferNumber = bufferNumber; #endif - // TODO openal stream - - ALint finishedbuffers; - - if( !triggered ) + if( sample->openalBuffer != 0 ) { - alGetSourcei( openalSource, AL_BUFFERS_PROCESSED, &finishedbuffers ); - alSourceUnqueueBuffers( openalSource, finishedbuffers, &openalStreamingBuffer[0] ); - if( finishedbuffers == 3 ) - { - triggered = true; - } + alSourcei( openalSource, AL_BUFFER, sample->openalBuffer ); + alSourcei( openalSource, AL_LOOPING, ( sample == loopingSample && loopingSample != NULL ? AL_TRUE : AL_FALSE ) ); + + return sample->totalBufferSize; } else { - finishedbuffers = 3; - } - - ALenum format; - - if( sample->format.basic.formatTag == idWaveFile::FORMAT_PCM ) - { - format = sample->NumChannels() == 1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16; - } - else if( sample->format.basic.formatTag == idWaveFile::FORMAT_ADPCM ) - { - format = sample->NumChannels() == 1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16; - } - else if( sample->format.basic.formatTag == idWaveFile::FORMAT_XMA2 ) - { - format = sample->NumChannels() == 1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16; - } - else - { - format = sample->NumChannels() == 1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16; - } - - int rate = sample->SampleRate(); /*44100*/ - - for( int j = 0; j < finishedbuffers && j < 1; j++ ) - { - /* - chan->GatherChannelSamples( chan->openalStreamingOffset * sample->objectInfo.nChannels, MIXBUFFER_SAMPLES * sample->objectInfo.nChannels, alignedInputSamples ); - for( int i = 0; i < ( MIXBUFFER_SAMPLES * sample->objectInfo.nChannels ); i++ ) + ALint finishedbuffers; + + if( !triggered ) { - if( alignedInputSamples[i] < -32768.0f ) - ( ( short* )alignedInputSamples )[i] = -32768; - else if( alignedInputSamples[i] > 32767.0f ) - ( ( short* )alignedInputSamples )[i] = 32767; - else - ( ( short* )alignedInputSamples )[i] = idMath::FtoiFast( alignedInputSamples[i] ); + alGetSourcei( openalSource, AL_BUFFERS_PROCESSED, &finishedbuffers ); + alSourceUnqueueBuffers( openalSource, finishedbuffers, &openalStreamingBuffer[0] ); + if( finishedbuffers == 3 ) + { + triggered = true; + } } - */ - - //alBufferData( buffers[0], sample->NumChannels() == 1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16, sample->buffers[bufferNumber].buffer, sample->buffers[bufferNumber].bufferSize, sample->SampleRate() /*44100*/ ); - - - - - alBufferData( openalStreamingBuffer[j], format, sample->buffers[bufferNumber].buffer, sample->buffers[bufferNumber].bufferSize, rate ); - //openalStreamingOffset += MIXBUFFER_SAMPLES; - } - - if( finishedbuffers > 0 ) - { - //alSourceQueueBuffers( openalSource, finishedbuffers, &buffers[0] ); - alSourceQueueBuffers( openalSource, 1, &openalStreamingBuffer[0] ); - - if( bufferNumber == 0 ) + else { - alSourcePlay( openalSource ); - triggered = false; + finishedbuffers = 3; } - return sample->buffers[bufferNumber].bufferSize; + ALenum format; + + if( sample->format.basic.formatTag == idWaveFile::FORMAT_PCM ) + { + format = sample->NumChannels() == 1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16; + } + else if( sample->format.basic.formatTag == idWaveFile::FORMAT_ADPCM ) + { + format = sample->NumChannels() == 1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16; + } + else if( sample->format.basic.formatTag == idWaveFile::FORMAT_XMA2 ) + { + format = sample->NumChannels() == 1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16; + } + else + { + format = sample->NumChannels() == 1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16; + } + + int rate = sample->SampleRate(); /*44100*/ + + for( int j = 0; j < finishedbuffers && j < 1; j++ ) + { + /* + chan->GatherChannelSamples( chan->openalStreamingOffset * sample->objectInfo.nChannels, MIXBUFFER_SAMPLES * sample->objectInfo.nChannels, alignedInputSamples ); + for( int i = 0; i < ( MIXBUFFER_SAMPLES * sample->objectInfo.nChannels ); i++ ) + { + if( alignedInputSamples[i] < -32768.0f ) + ( ( short* )alignedInputSamples )[i] = -32768; + else if( alignedInputSamples[i] > 32767.0f ) + ( ( short* )alignedInputSamples )[i] = 32767; + else + ( ( short* )alignedInputSamples )[i] = idMath::FtoiFast( alignedInputSamples[i] ); + } + */ + + //alBufferData( buffers[0], sample->NumChannels() == 1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16, sample->buffers[bufferNumber].buffer, sample->buffers[bufferNumber].bufferSize, sample->SampleRate() /*44100*/ ); + + + + + alBufferData( openalStreamingBuffer[j], format, sample->buffers[bufferNumber].buffer, sample->buffers[bufferNumber].bufferSize, rate ); + //openalStreamingOffset += MIXBUFFER_SAMPLES; + } + + if( finishedbuffers > 0 ) + { + //alSourceQueueBuffers( openalSource, finishedbuffers, &buffers[0] ); + alSourceQueueBuffers( openalSource, 1, &openalStreamingBuffer[0] ); + + if( bufferNumber == 0 ) + { + //alSourcePlay( openalSource ); + triggered = false; + } + + return sample->buffers[bufferNumber].bufferSize; + } } // should never happen @@ -539,6 +562,30 @@ void idSoundVoice_OpenAL::FlushSourceBuffers() if( alIsSource( openalSource ) ) { //pSourceVoice->FlushSourceBuffers(); + + alSourcei( openalSource, AL_BUFFER, 0 ); + + if( openalStreamingBuffer[0] && openalStreamingBuffer[1] && openalStreamingBuffer[2] ) + { + alGetError(); + alDeleteBuffers( 3, &openalStreamingBuffer[0] ); + if( alGetError() == AL_NO_ERROR ) + { + openalStreamingBuffer[0] = openalStreamingBuffer[1] = openalStreamingBuffer[2] = 0; + } + } + + if( lastopenalStreamingBuffer[0] && lastopenalStreamingBuffer[1] && lastopenalStreamingBuffer[2] ) + { + alGetError(); + alDeleteBuffers( 3, &lastopenalStreamingBuffer[0] ); + if( alGetError() == AL_NO_ERROR ) + { + lastopenalStreamingBuffer[0] = lastopenalStreamingBuffer[1] = lastopenalStreamingBuffer[2] = 0; + } + } + + openalStreamingOffset = 0; } } @@ -606,31 +653,7 @@ void idSoundVoice_OpenAL::Stop() } alSourceStop( openalSource ); - alSourcei( openalSource, AL_BUFFER, 0 ); - - if( openalStreamingBuffer[0] && openalStreamingBuffer[1] && openalStreamingBuffer[2] ) - { - alGetError(); - alDeleteBuffers( 3, &openalStreamingBuffer[0] ); - if( alGetError() == AL_NO_ERROR ) - { - openalStreamingBuffer[0] = openalStreamingBuffer[1] = openalStreamingBuffer[2] = 0; - } - } - - if( lastopenalStreamingBuffer[0] && lastopenalStreamingBuffer[1] && lastopenalStreamingBuffer[2] ) - { - alGetError(); - alDeleteBuffers( 3, &lastopenalStreamingBuffer[0] ); - if( alGetError() == AL_NO_ERROR ) - { - lastopenalStreamingBuffer[0] = lastopenalStreamingBuffer[1] = lastopenalStreamingBuffer[2] = 0; - } - } - - openalStreamingOffset = 0; - //openalStreamingBuffer[0] = openalStreamingBuffer[1] = openalStreamingBuffer[2] = 0; - //lastopenalStreamingBuffer[0] = lastopenalStreamingBuffer[1] = lastopenalStreamingBuffer[2] = 0; + //alSourcei( openalSource, AL_BUFFER, 0 ); //pSourceVoice->Stop( 0, OPERATION_SET ); paused = true; From 00a9c353f349ea8feb72ee8f66fc3cffc6a1303b Mon Sep 17 00:00:00 2001 From: Robert Beckebans Date: Sat, 5 Jan 2013 00:14:55 +0100 Subject: [PATCH 45/57] Defaulted OPENAL=ON for the openal branch --- neo/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/neo/CMakeLists.txt b/neo/CMakeLists.txt index 97b666af..2068bc7d 100644 --- a/neo/CMakeLists.txt +++ b/neo/CMakeLists.txt @@ -13,7 +13,7 @@ option(SDL2 "Use SDL2 instead of SDL1.2" OFF) option(OPENAL - "Use OpenAL soft instead of XAudio2" OFF) + "Use OpenAL soft instead of XAudio2" ON) if(MSVC) #message(STATUS CMAKE_ROOT: ${CMAKE_ROOT}) From 5bef3a327fb7bef7c2c62ecab5e8dbb37ae86e7f Mon Sep 17 00:00:00 2001 From: Robert Beckebans Date: Sat, 5 Jan 2013 17:02:48 +0100 Subject: [PATCH 46/57] Added MS ADPCM decoder from SDL2 --- neo/sound/OpenAL/AL_SoundSample.cpp | 602 ++++++++++++++++++++++++++-- neo/sound/OpenAL/AL_SoundSample.h | 27 ++ neo/sound/OpenAL/AL_SoundVoice.cpp | 11 +- neo/sound/snd_local.h | 2 + 4 files changed, 603 insertions(+), 39 deletions(-) diff --git a/neo/sound/OpenAL/AL_SoundSample.cpp b/neo/sound/OpenAL/AL_SoundSample.cpp index afe6b6a2..f65b1402 100644 --- a/neo/sound/OpenAL/AL_SoundSample.cpp +++ b/neo/sound/OpenAL/AL_SoundSample.cpp @@ -4,6 +4,8 @@ Doom 3 BFG Edition GPL Source Code Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company. Copyright (C) 2013 Robert Beckebans +Copyright (C) 1997-2012 Sam Lantinga (MS ADPCM decoder) +Copyright (c) 2011 Chris Robinson (OpenAL helpers) This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code"). @@ -260,28 +262,8 @@ void idSoundSample_OpenAL::LoadResource() } } - // build OpenAL buffer - alGetError(); - alGenBuffers( 1, &openalBuffer ); - - if( alGetError() != AL_NO_ERROR ) - { - common->Error( "idSoundSample_OpenAL::MakeDefault: error generating OpenAL hardware buffer" ); - } - - if( alIsBuffer( openalBuffer ) ) - { - alGetError(); - - // RB: TODO decode idWaveFile::FORMAT_ADPCM to idWaveFile::FORMAT_PCM - // and build one big OpenAL buffer using the alBufferSubData extension - - alBufferData( openalBuffer, GetOpenALBufferFormat(), buffers[0].buffer, buffers[0].bufferSize, format.basic.samplesPerSec ); - if( alGetError() != AL_NO_ERROR ) - { - common->Error( "idSoundSample_OpenAL::MakeDefault: error loading data into OpenAL hardware buffer" ); - } - } + // upload PCM data to OpenAL + CreateOpenALBuffer(); return; } @@ -295,6 +277,88 @@ void idSoundSample_OpenAL::LoadResource() return; } +void idSoundSample_OpenAL::CreateOpenALBuffer() +{ + // build OpenAL buffer + alGetError(); + alGenBuffers( 1, &openalBuffer ); + + if( alGetError() != AL_NO_ERROR ) + { + common->Error( "idSoundSample_OpenAL::CreateOpenALBuffer: error generating OpenAL hardware buffer" ); + } + + if( alIsBuffer( openalBuffer ) ) + { + alGetError(); + + // RB: TODO decode idWaveFile::FORMAT_ADPCM to idWaveFile::FORMAT_PCM + // and build one big OpenAL buffer using the alBufferSubData extension + + void* buffer = NULL; + uint32 bufferSize = 0; + + if( format.basic.formatTag == idWaveFile::FORMAT_ADPCM ) + { + buffer = buffers[0].buffer; + bufferSize = buffers[0].bufferSize; + + if( MS_ADPCM_decode( ( uint8** ) &buffer, &bufferSize ) < 0 ) + { + common->Error( "idSoundSample_OpenAL::CreateOpenALBuffer: could not decode ADPCM '%s' to 16 bit format", GetName() ); + } + + buffers[0].buffer = buffer; + buffers[0].bufferSize = bufferSize; + + totalBufferSize = bufferSize; + } + else if( format.basic.formatTag == idWaveFile::FORMAT_XMA2 ) + { + common->Error( "idSoundSample_OpenAL::CreateOpenALBuffer: could not decode XMA2 '%s' to 16 bit format", GetName() ); + } + else if( format.basic.formatTag == idWaveFile::FORMAT_EXTENSIBLE ) + { + common->Error( "idSoundSample_OpenAL::CreateOpenALBuffer: could not decode extensible WAV format '%s' to 16 bit format", GetName() ); + } + else + { + // TODO concatenate buffers + + assert( buffers.Num() == 1 ); + + buffer = buffers[0].buffer; + bufferSize = buffers[0].bufferSize; + } + +#if 0 + if( alIsExtensionPresent( "AL_SOFT_buffer_samples" ) ) + { + ALenum type = AL_SHORT_SOFT; + + if( format.basic.bitsPerSample != 16 ) + { + //common->Error( "idSoundSample_OpenAL::LoadResource: '%s' not a 16 bit format", GetName() ); + } + + ALenum channels = NumChannels() == 1 ? AL_MONO_SOFT : AL_STEREO_SOFT; + ALenum alFormat = GetOpenALSoftFormat( channels, type ); + + alBufferSamplesSOFT( openalBuffer, format.basic.samplesPerSec, alFormat, BytesToFrames( bufferSize, channels, type ), channels, type, buffer ); + } + else +#endif + { + alBufferData( openalBuffer, GetOpenALBufferFormat(), buffer, bufferSize, format.basic.samplesPerSec ); + } + + if( alGetError() != AL_NO_ERROR ) + { + common->Error( "idSoundSample_OpenAL::CreateOpenALBuffer: error loading data into OpenAL hardware buffer" ); + } + } +} + /* ======================== idSoundSample_OpenAL::LoadWav @@ -618,28 +682,498 @@ float idSoundSample_OpenAL::GetAmplitude( int timeMS ) const } +const char* idSoundSample_OpenAL::OpenALSoftChannelsName( ALenum chans ) const +{ + switch( chans ) + { + case AL_MONO_SOFT: + return "Mono"; + case AL_STEREO_SOFT: + return "Stereo"; + case AL_REAR_SOFT: + return "Rear"; + case AL_QUAD_SOFT: + return "Quadraphonic"; + case AL_5POINT1_SOFT: + return "5.1 Surround"; + case AL_6POINT1_SOFT: + return "6.1 Surround"; + case AL_7POINT1_SOFT: + return "7.1 Surround"; + } + + return "Unknown Channels"; +} + +const char* idSoundSample_OpenAL::OpenALSoftTypeName( ALenum type ) const +{ + switch( type ) + { + case AL_BYTE_SOFT: + return "S8"; + case AL_UNSIGNED_BYTE_SOFT: + return "U8"; + case AL_SHORT_SOFT: + return "S16"; + case AL_UNSIGNED_SHORT_SOFT: + return "U16"; + case AL_INT_SOFT: + return "S32"; + case AL_UNSIGNED_INT_SOFT: + return "U32"; + case AL_FLOAT_SOFT: + return "Float32"; + case AL_DOUBLE_SOFT: + return "Float64"; + } + + return "Unknown Type"; +} + +ALsizei idSoundSample_OpenAL::FramesToBytes( ALsizei size, ALenum channels, ALenum type ) const +{ + switch( channels ) + { + case AL_MONO_SOFT: + size *= 1; + break; + case AL_STEREO_SOFT: + size *= 2; + break; + case AL_REAR_SOFT: + size *= 2; + break; + case AL_QUAD_SOFT: + size *= 4; + break; + case AL_5POINT1_SOFT: + size *= 6; + break; + case AL_6POINT1_SOFT: + size *= 7; + break; + case AL_7POINT1_SOFT: + size *= 8; + break; + } + + switch( type ) + { + case AL_BYTE_SOFT: + size *= sizeof( ALbyte ); + break; + case AL_UNSIGNED_BYTE_SOFT: + size *= sizeof( ALubyte ); + break; + case AL_SHORT_SOFT: + size *= sizeof( ALshort ); + break; + case AL_UNSIGNED_SHORT_SOFT: + size *= sizeof( ALushort ); + break; + case AL_INT_SOFT: + size *= sizeof( ALint ); + break; + case AL_UNSIGNED_INT_SOFT: + size *= sizeof( ALuint ); + break; + case AL_FLOAT_SOFT: + size *= sizeof( ALfloat ); + break; + case AL_DOUBLE_SOFT: + size *= sizeof( ALdouble ); + break; + } + + return size; +} + +ALsizei idSoundSample_OpenAL::BytesToFrames( ALsizei size, ALenum channels, ALenum type ) const +{ + return size / FramesToBytes( 1, channels, type ); +} + +ALenum idSoundSample_OpenAL::GetOpenALSoftFormat( ALenum channels, ALenum type ) const +{ + ALenum format = AL_NONE; + + /* If using AL_SOFT_buffer_samples, try looking through its formats */ + if( alIsExtensionPresent( "AL_SOFT_buffer_samples" ) ) + { + /* AL_SOFT_buffer_samples is more lenient with matching formats. The + * specified sample type does not need to match the returned format, + * but it is nice to try to get something close. */ + if( type == AL_UNSIGNED_BYTE_SOFT || type == AL_BYTE_SOFT ) + { + if( channels == AL_MONO_SOFT ) format = AL_MONO8_SOFT; + else if( channels == AL_STEREO_SOFT ) format = AL_STEREO8_SOFT; + else if( channels == AL_QUAD_SOFT ) format = AL_QUAD8_SOFT; + else if( channels == AL_5POINT1_SOFT ) format = AL_5POINT1_8_SOFT; + else if( channels == AL_6POINT1_SOFT ) format = AL_6POINT1_8_SOFT; + else if( channels == AL_7POINT1_SOFT ) format = AL_7POINT1_8_SOFT; + } + else if( type == AL_UNSIGNED_SHORT_SOFT || type == AL_SHORT_SOFT ) + { + if( channels == AL_MONO_SOFT ) format = AL_MONO16_SOFT; + else if( channels == AL_STEREO_SOFT ) format = AL_STEREO16_SOFT; + else if( channels == AL_QUAD_SOFT ) format = AL_QUAD16_SOFT; + else if( channels == AL_5POINT1_SOFT ) format = AL_5POINT1_16_SOFT; + else if( channels == AL_6POINT1_SOFT ) format = AL_6POINT1_16_SOFT; + else if( channels == AL_7POINT1_SOFT ) format = AL_7POINT1_16_SOFT; + } + else if( type == AL_UNSIGNED_BYTE3_SOFT || type == AL_BYTE3_SOFT || + type == AL_UNSIGNED_INT_SOFT || type == AL_INT_SOFT || + type == AL_FLOAT_SOFT || type == AL_DOUBLE_SOFT ) + { + if( channels == AL_MONO_SOFT ) format = AL_MONO32F_SOFT; + else if( channels == AL_STEREO_SOFT ) format = AL_STEREO32F_SOFT; + else if( channels == AL_QUAD_SOFT ) format = AL_QUAD32F_SOFT; + else if( channels == AL_5POINT1_SOFT ) format = AL_5POINT1_32F_SOFT; + else if( channels == AL_6POINT1_SOFT ) format = AL_6POINT1_32F_SOFT; + else if( channels == AL_7POINT1_SOFT ) format = AL_7POINT1_32F_SOFT; + } + + if( format != AL_NONE && !alIsBufferFormatSupportedSOFT( format ) ) + format = AL_NONE; + + /* A matching format was not found or supported. Try 32-bit float. */ + if( format == AL_NONE ) + { + if( channels == AL_MONO_SOFT ) format = AL_MONO32F_SOFT; + else if( channels == AL_STEREO_SOFT ) format = AL_STEREO32F_SOFT; + else if( channels == AL_QUAD_SOFT ) format = AL_QUAD32F_SOFT; + else if( channels == AL_5POINT1_SOFT ) format = AL_5POINT1_32F_SOFT; + else if( channels == AL_6POINT1_SOFT ) format = AL_6POINT1_32F_SOFT; + else if( channels == AL_7POINT1_SOFT ) format = AL_7POINT1_32F_SOFT; + + if( format != AL_NONE && !alIsBufferFormatSupportedSOFT( format ) ) + format = AL_NONE; + } + /* 32-bit float not supported. Try 16-bit int. */ + if( format == AL_NONE ) + { + if( channels == AL_MONO_SOFT ) format = AL_MONO16_SOFT; + else if( channels == AL_STEREO_SOFT ) format = AL_STEREO16_SOFT; + else if( channels == AL_QUAD_SOFT ) format = AL_QUAD16_SOFT; + else if( channels == AL_5POINT1_SOFT ) format = AL_5POINT1_16_SOFT; + else if( channels == AL_6POINT1_SOFT ) format = AL_6POINT1_16_SOFT; + else if( channels == AL_7POINT1_SOFT ) format = AL_7POINT1_16_SOFT; + + if( format != AL_NONE && !alIsBufferFormatSupportedSOFT( format ) ) + format = AL_NONE; + } + /* 16-bit int not supported. Try 8-bit int. */ + if( format == AL_NONE ) + { + if( channels == AL_MONO_SOFT ) format = AL_MONO8_SOFT; + else if( channels == AL_STEREO_SOFT ) format = AL_STEREO8_SOFT; + else if( channels == AL_QUAD_SOFT ) format = AL_QUAD8_SOFT; + else if( channels == AL_5POINT1_SOFT ) format = AL_5POINT1_8_SOFT; + else if( channels == AL_6POINT1_SOFT ) format = AL_6POINT1_8_SOFT; + else if( channels == AL_7POINT1_SOFT ) format = AL_7POINT1_8_SOFT; + + if( format != AL_NONE && !alIsBufferFormatSupportedSOFT( format ) ) + format = AL_NONE; + } + + return format; + } + + /* We use the AL_EXT_MCFORMATS extension to provide output of Quad, 5.1, + * and 7.1 channel configs, AL_EXT_FLOAT32 for 32-bit float samples, and + * AL_EXT_DOUBLE for 64-bit float samples. */ + if( type == AL_UNSIGNED_BYTE_SOFT ) + { + if( channels == AL_MONO_SOFT ) + format = AL_FORMAT_MONO8; + else if( channels == AL_STEREO_SOFT ) + format = AL_FORMAT_STEREO8; + else if( alIsExtensionPresent( "AL_EXT_MCFORMATS" ) ) + { + if( channels == AL_QUAD_SOFT ) + format = alGetEnumValue( "AL_FORMAT_QUAD8" ); + else if( channels == AL_5POINT1_SOFT ) + format = alGetEnumValue( "AL_FORMAT_51CHN8" ); + else if( channels == AL_6POINT1_SOFT ) + format = alGetEnumValue( "AL_FORMAT_61CHN8" ); + else if( channels == AL_7POINT1_SOFT ) + format = alGetEnumValue( "AL_FORMAT_71CHN8" ); + } + } + else if( type == AL_SHORT_SOFT ) + { + if( channels == AL_MONO_SOFT ) + format = AL_FORMAT_MONO16; + else if( channels == AL_STEREO_SOFT ) + format = AL_FORMAT_STEREO16; + else if( alIsExtensionPresent( "AL_EXT_MCFORMATS" ) ) + { + if( channels == AL_QUAD_SOFT ) + format = alGetEnumValue( "AL_FORMAT_QUAD16" ); + else if( channels == AL_5POINT1_SOFT ) + format = alGetEnumValue( "AL_FORMAT_51CHN16" ); + else if( channels == AL_6POINT1_SOFT ) + format = alGetEnumValue( "AL_FORMAT_61CHN16" ); + else if( channels == AL_7POINT1_SOFT ) + format = alGetEnumValue( "AL_FORMAT_71CHN16" ); + } + } + else if( type == AL_FLOAT_SOFT && alIsExtensionPresent( "AL_EXT_FLOAT32" ) ) + { + if( channels == AL_MONO_SOFT ) + format = alGetEnumValue( "AL_FORMAT_MONO_FLOAT32" ); + else if( channels == AL_STEREO_SOFT ) + format = alGetEnumValue( "AL_FORMAT_STEREO_FLOAT32" ); + else if( alIsExtensionPresent( "AL_EXT_MCFORMATS" ) ) + { + if( channels == AL_QUAD_SOFT ) + format = alGetEnumValue( "AL_FORMAT_QUAD32" ); + else if( channels == AL_5POINT1_SOFT ) + format = alGetEnumValue( "AL_FORMAT_51CHN32" ); + else if( channels == AL_6POINT1_SOFT ) + format = alGetEnumValue( "AL_FORMAT_61CHN32" ); + else if( channels == AL_7POINT1_SOFT ) + format = alGetEnumValue( "AL_FORMAT_71CHN32" ); + } + } + else if( type == AL_DOUBLE_SOFT && alIsExtensionPresent( "AL_EXT_DOUBLE" ) ) + { + if( channels == AL_MONO_SOFT ) + format = alGetEnumValue( "AL_FORMAT_MONO_DOUBLE" ); + else if( channels == AL_STEREO_SOFT ) + format = alGetEnumValue( "AL_FORMAT_STEREO_DOUBLE" ); + } + + /* NOTE: It seems OSX returns -1 from alGetEnumValue for unknown enums, as + * opposed to 0. Correct it. */ + if( format == -1 ) + format = 0; + + return format; +} + ALenum idSoundSample_OpenAL::GetOpenALBufferFormat() const { ALenum alFormat; - if( format.basic.formatTag == idWaveFile::FORMAT_PCM ) +#if 0 + if( alIsExtensionPresent( "AL_SOFT_buffer_samples" ) ) { - alFormat = NumChannels() == 1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16; - } - else if( format.basic.formatTag == idWaveFile::FORMAT_ADPCM ) - { - alFormat = NumChannels() == 1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16; - //alFormat = NumChannels() == 1 ? AL_FORMAT_IMA_ADPCM_MONO16_EXT : AL_FORMAT_IMA_ADPCM_STEREO16_EXT; - } - else if( format.basic.formatTag == idWaveFile::FORMAT_XMA2 ) - { - alFormat = NumChannels() == 1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16; + if( format.basic.formatTag == idWaveFile::FORMAT_PCM ) + { + alFormat = NumChannels() == 1 ? AL_MONO16_SOFT : AL_STEREO16_SOFT; + } + else if( format.basic.formatTag == idWaveFile::FORMAT_ADPCM ) + { + alFormat = NumChannels() == 1 ? AL_MONO8_SOFT : AL_STEREO8_SOFT; + //alFormat = NumChannels() == 1 ? AL_MONO16_SOFT : AL_STEREO16_SOFT; + } + else if( format.basic.formatTag == idWaveFile::FORMAT_XMA2 ) + { + alFormat = NumChannels() == 1 ? AL_MONO16_SOFT : AL_STEREO16_SOFT; + } + else + { + alFormat = NumChannels() == 1 ? AL_MONO16_SOFT : AL_STEREO16_SOFT; + } + + if( !alIsBufferFormatSupportedSOFT( alFormat ) ) + { + alFormat = NumChannels() == 1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16; + } } else +#endif { - alFormat = NumChannels() == 1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16; + if( format.basic.formatTag == idWaveFile::FORMAT_PCM ) + { + alFormat = NumChannels() == 1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16; + } + else if( format.basic.formatTag == idWaveFile::FORMAT_ADPCM ) + { + //alFormat = NumChannels() == 1 ? AL_FORMAT_MONO8 : AL_FORMAT_STEREO8; + alFormat = NumChannels() == 1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16; + //alFormat = NumChannels() == 1 ? AL_FORMAT_MONO_IMA4 : AL_FORMAT_STEREO_IMA4; + } + else if( format.basic.formatTag == idWaveFile::FORMAT_XMA2 ) + { + alFormat = NumChannels() == 1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16; + } + else + { + alFormat = NumChannels() == 1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16; + } } return alFormat; } +int32 idSoundSample_OpenAL::MS_ADPCM_nibble( MS_ADPCM_decodeState_t* state, int8 nybble, int16* coeff ) +{ + const int32 max_audioval = ( ( 1 << ( 16 - 1 ) ) - 1 ); + const int32 min_audioval = -( 1 << ( 16 - 1 ) ); + const int32 adaptive[] = + { + 230, 230, 230, 230, 307, 409, 512, 614, + 768, 614, 512, 409, 307, 230, 230, 230 + }; + int32 new_sample, delta; + + new_sample = ( ( state->iSamp1 * coeff[0] ) + + ( state->iSamp2 * coeff[1] ) ) / 256; + + if( nybble & 0x08 ) + { + new_sample += state->iDelta * ( nybble - 0x10 ); + } + else + { + new_sample += state->iDelta * nybble; + } + + if( new_sample < min_audioval ) + { + new_sample = min_audioval; + } + else if( new_sample > max_audioval ) + { + new_sample = max_audioval; + } + + delta = ( ( int32 ) state->iDelta * adaptive[nybble] ) / 256; + if( delta < 16 ) + { + delta = 16; + } + + state->iDelta = ( uint16 ) delta; + state->iSamp2 = state->iSamp1; + state->iSamp1 = ( int16 ) new_sample; + + return ( new_sample ); +} + +int idSoundSample_OpenAL::MS_ADPCM_decode( uint8** audio_buf, uint32* audio_len ) +{ + static MS_ADPCM_decodeState_t state[2]; + uint8* freeable, *encoded, *decoded; + int32 encoded_len, samplesleft; + int8 nybble; + bool stereo; + int16* coeff[2]; + int32 new_sample; + + // Allocate the proper sized output buffer + encoded_len = *audio_len; + encoded = *audio_buf; + freeable = *audio_buf; + + /* + *audio_len = ( encoded_len / MS_ADPCM_state.wavefmt.blockalign ) * + MS_ADPCM_state.wSamplesPerBlock * + MS_ADPCM_state.wavefmt.channels * sizeof( int16 ); + */ + + *audio_len = ( encoded_len / format.basic.blockSize ) * format.extra.adpcm.samplesPerBlock * format.basic.numChannels * sizeof( int16 ); + + *audio_buf = ( uint8* ) Mem_Alloc( *audio_len, TAG_AUDIO ); + if( *audio_buf == NULL ) + { + //SDL_Error( SDL_ENOMEM ); + return ( -1 ); + } + decoded = *audio_buf; + + // Get ready... Go! + stereo = ( format.basic.numChannels == 2 ); + //state[0] = &MS_ADPCM_state.state[0]; + //state[1] = &MS_ADPCM_state.state[stereo]; + + while( encoded_len >= format.basic.blockSize ) + { + // Grab the initial information for this block + state[0].hPredictor = *encoded++; + if( stereo ) + { + state[1].hPredictor = *encoded++; + } + + state[0].iDelta = ( ( encoded[1] << 8 ) | encoded[0] ); + encoded += sizeof( int16 ); + if( stereo ) + { + state[1].iDelta = ( ( encoded[1] << 8 ) | encoded[0] ); + encoded += sizeof( int16 ); + } + state[0].iSamp1 = ( ( encoded[1] << 8 ) | encoded[0] ); + encoded += sizeof( int16 ); + if( stereo ) + { + state[1].iSamp1 = ( ( encoded[1] << 8 ) | encoded[0] ); + encoded += sizeof( int16 ); + } + state[0].iSamp2 = ( ( encoded[1] << 8 ) | encoded[0] ); + encoded += sizeof( int16 ); + if( stereo ) + { + state[1].iSamp2 = ( ( encoded[1] << 8 ) | encoded[0] ); + encoded += sizeof( int16 ); + } + + assert( state[0].hPredictor < format.extra.adpcm.numCoef ); + assert( state[1].hPredictor < format.extra.adpcm.numCoef ); + + coeff[0] = &format.extra.adpcm.aCoef[state[0].hPredictor].coef1; + coeff[1] = &format.extra.adpcm.aCoef[state[1].hPredictor].coef2; + + // Store the two initial samples we start with + decoded[0] = state[0].iSamp2 & 0xFF; + decoded[1] = state[0].iSamp2 >> 8; + decoded += 2; + if( stereo ) + { + decoded[0] = state[1].iSamp2 & 0xFF; + decoded[1] = state[1].iSamp2 >> 8; + decoded += 2; + } + decoded[0] = state[0].iSamp1 & 0xFF; + decoded[1] = state[0].iSamp1 >> 8; + decoded += 2; + if( stereo ) + { + decoded[0] = state[1].iSamp1 & 0xFF; + decoded[1] = state[1].iSamp1 >> 8; + decoded += 2; + } + + // Decode and store the other samples in this block + samplesleft = ( format.extra.adpcm.samplesPerBlock - 2 ) * format.basic.numChannels; + + while( samplesleft > 0 ) + { + nybble = ( *encoded ) >> 4; + new_sample = MS_ADPCM_nibble( &state[0], nybble, coeff[0] ); + decoded[0] = new_sample & 0xFF; + new_sample >>= 8; + decoded[1] = new_sample & 0xFF; + decoded += 2; + + nybble = ( *encoded ) & 0x0F; + new_sample = MS_ADPCM_nibble( &state[1], nybble, coeff[1] ); + decoded[0] = new_sample & 0xFF; + new_sample >>= 8; + decoded[1] = new_sample & 0xFF; + decoded += 2; + + ++encoded; + samplesleft -= 2; + } + + encoded_len -= format.basic.blockSize; + } + + Mem_Free( freeable ); + + return 0; +} + diff --git a/neo/sound/OpenAL/AL_SoundSample.h b/neo/sound/OpenAL/AL_SoundSample.h index bfa16f42..6174d34c 100644 --- a/neo/sound/OpenAL/AL_SoundSample.h +++ b/neo/sound/OpenAL/AL_SoundSample.h @@ -130,8 +130,24 @@ public: float GetAmplitude( int timeMS ) const; + const char* OpenALSoftChannelsName( ALenum chans ) const; + + const char* OpenALSoftTypeName( ALenum type ) const; + + ALsizei FramesToBytes( ALsizei size, ALenum channels, ALenum type ) const; + ALsizei BytesToFrames( ALsizei size, ALenum channels, ALenum type ) const; + + /* Retrieves a compatible buffer format given the channel configuration and + * sample type. If an alIsBufferFormatSupportedSOFT-compatible function is + * provided, it will be called to find the closest-matching format from + * AL_SOFT_buffer_samples. Returns AL_NONE (0) if no supported format can be + * found. */ + ALenum GetOpenALSoftFormat( ALenum channels, ALenum type ) const; + ALenum GetOpenALBufferFormat() const; + void CreateOpenALBuffer(); + protected: friend class idSoundHardware_OpenAL; friend class idSoundVoice_OpenAL; @@ -144,6 +160,17 @@ protected: bool LoadGeneratedSample( const idStr& name ); void WriteGeneratedSample( idFile* fileOut ); + struct MS_ADPCM_decodeState_t + { + uint8 hPredictor; + uint16 iDelta; + int16 iSamp1; + int16 iSamp2; + }; + + int32 MS_ADPCM_nibble( MS_ADPCM_decodeState_t* state, int8 nybble, int16* coeff ); + int MS_ADPCM_decode( uint8** audio_buf, uint32* audio_len ); + struct sampleBuffer_t { void* buffer; diff --git a/neo/sound/OpenAL/AL_SoundVoice.cpp b/neo/sound/OpenAL/AL_SoundVoice.cpp index ba8f3f5c..e734d7a7 100644 --- a/neo/sound/OpenAL/AL_SoundVoice.cpp +++ b/neo/sound/OpenAL/AL_SoundVoice.cpp @@ -31,7 +31,7 @@ If you have questions concerning this license or the applicable additional terms #include "../snd_local.h" idCVar s_skipHardwareSets( "s_skipHardwareSets", "0", CVAR_BOOL, "Do all calculation, but skip XA2 calls" ); -idCVar s_debugHardware( "s_debugHardware", "1", CVAR_BOOL, "Print a message any time a hardware voice changes" ); +idCVar s_debugHardware( "s_debugHardware", "0", CVAR_BOOL, "Print a message any time a hardware voice changes" ); // The whole system runs at this sample rate static int SYSTEM_SAMPLE_RATE = 44100; @@ -170,10 +170,11 @@ void idSoundVoice_OpenAL::Create( const idSoundSample* leadinSample_, const idSo */ } else - - // handle streaming sounds (decode on the fly) both single shot AND looping - //if( triggered ) { + //if( triggered ) + + // handle streaming sounds (decode on the fly) both single shot AND looping + alSourcei( openalSource, AL_BUFFER, 0 ); alDeleteBuffers( 3, &lastopenalStreamingBuffer[0] ); lastopenalStreamingBuffer[0] = openalStreamingBuffer[0]; @@ -213,7 +214,7 @@ void idSoundVoice_OpenAL::Create( const idSoundSample* leadinSample_, const idSo alSource3f( openalSource, AL_POSITION, 0.0f, 0.0f, 0.0f ); // RB: FIXME 0.0f ? - alSourcef( openalSource, AL_GAIN, 0.0f ); + alSourcef( openalSource, AL_GAIN, 1.0f ); //OnBufferStart( leadinSample, 0 ); } diff --git a/neo/sound/snd_local.h b/neo/sound/snd_local.h index 3415d061..14f73405 100644 --- a/neo/sound/snd_local.h +++ b/neo/sound/snd_local.h @@ -95,6 +95,8 @@ typedef enum #if defined(USE_OPENAL) +#define AL_ALEXT_PROTOTYPES + #include #include #include From 27b83db50dc382d6647f4e645a872c3c5c106687 Mon Sep 17 00:00:00 2001 From: Robert Beckebans Date: Sat, 5 Jan 2013 17:17:13 +0100 Subject: [PATCH 47/57] Added missing add_executable(RBDoom3BFG ...) --- neo/CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/neo/CMakeLists.txt b/neo/CMakeLists.txt index 19b6637c..9a2165f2 100644 --- a/neo/CMakeLists.txt +++ b/neo/CMakeLists.txt @@ -1332,7 +1332,8 @@ else() # make sure this is run after creating idlib add_dependencies(precomp_header_rbdoom3bfg idlib) - + add_executable(RBDoom3BFG WIN32 ${RBDOOM3_SOURCES}) + # make sure precompiled header is created before executable is compiled add_dependencies(RBDoom3BFG precomp_header_rbdoom3bfg) From 699e0e39f5eae31160548fd4e3a8f3f9f722dbf7 Mon Sep 17 00:00:00 2001 From: Robert Beckebans Date: Sat, 5 Jan 2013 19:00:22 +0100 Subject: [PATCH 48/57] Fixed problems in the ADPCM decoder. Sound is working. --- neo/sound/OpenAL/AL_SoundSample.cpp | 112 +++++++++++++++------------- neo/sound/OpenAL/AL_SoundSample.h | 5 +- 2 files changed, 65 insertions(+), 52 deletions(-) diff --git a/neo/sound/OpenAL/AL_SoundSample.cpp b/neo/sound/OpenAL/AL_SoundSample.cpp index f65b1402..d9758c25 100644 --- a/neo/sound/OpenAL/AL_SoundSample.cpp +++ b/neo/sound/OpenAL/AL_SoundSample.cpp @@ -1008,7 +1008,7 @@ ALenum idSoundSample_OpenAL::GetOpenALBufferFormat() const return alFormat; } -int32 idSoundSample_OpenAL::MS_ADPCM_nibble( MS_ADPCM_decodeState_t* state, int8 nybble, int16* coeff ) +int32 idSoundSample_OpenAL::MS_ADPCM_nibble( MS_ADPCM_decodeState_t* state, int8 nybble ) { const int32 max_audioval = ( ( 1 << ( 16 - 1 ) ) - 1 ); const int32 min_audioval = -( 1 << ( 16 - 1 ) ); @@ -1017,10 +1017,11 @@ int32 idSoundSample_OpenAL::MS_ADPCM_nibble( MS_ADPCM_decodeState_t* state, int8 230, 230, 230, 230, 307, 409, 512, 614, 768, 614, 512, 409, 307, 230, 230, 230 }; + int32 new_sample, delta; - new_sample = ( ( state->iSamp1 * coeff[0] ) + - ( state->iSamp2 * coeff[1] ) ) / 256; + new_sample = ( ( state->iSamp1 * state->coef1 ) + + ( state->iSamp2 * state->coef2 ) ) / 256; if( nybble & 0x08 ) { @@ -1055,12 +1056,13 @@ int32 idSoundSample_OpenAL::MS_ADPCM_nibble( MS_ADPCM_decodeState_t* state, int8 int idSoundSample_OpenAL::MS_ADPCM_decode( uint8** audio_buf, uint32* audio_len ) { - static MS_ADPCM_decodeState_t state[2]; + static MS_ADPCM_decodeState_t states[2]; + MS_ADPCM_decodeState_t* state[2]; + uint8* freeable, *encoded, *decoded; int32 encoded_len, samplesleft; int8 nybble; - bool stereo; - int16* coeff[2]; + int8 stereo; int32 new_sample; // Allocate the proper sized output buffer @@ -1068,12 +1070,6 @@ int idSoundSample_OpenAL::MS_ADPCM_decode( uint8** audio_buf, uint32* audio_len encoded = *audio_buf; freeable = *audio_buf; - /* - *audio_len = ( encoded_len / MS_ADPCM_state.wavefmt.blockalign ) * - MS_ADPCM_state.wSamplesPerBlock * - MS_ADPCM_state.wavefmt.channels * sizeof( int16 ); - */ - *audio_len = ( encoded_len / format.basic.blockSize ) * format.extra.adpcm.samplesPerBlock * format.basic.numChannels * sizeof( int16 ); *audio_buf = ( uint8* ) Mem_Alloc( *audio_len, TAG_AUDIO ); @@ -1084,65 +1080,79 @@ int idSoundSample_OpenAL::MS_ADPCM_decode( uint8** audio_buf, uint32* audio_len } decoded = *audio_buf; + assert( format.basic.numChannels == 1 || format.basic.numChannels == 2 ); + // Get ready... Go! - stereo = ( format.basic.numChannels == 2 ); - //state[0] = &MS_ADPCM_state.state[0]; - //state[1] = &MS_ADPCM_state.state[stereo]; + stereo = ( format.basic.numChannels == 2 ) ? 1 : 0; + state[0] = &states[0]; + state[1] = &states[stereo]; while( encoded_len >= format.basic.blockSize ) { // Grab the initial information for this block - state[0].hPredictor = *encoded++; + state[0]->hPredictor = *encoded++; + + assert( state[0]->hPredictor < format.extra.adpcm.numCoef ); + state[0]->hPredictor = idMath::ClampInt( 0, 6, state[0]->hPredictor ); + + state[0]->coef1 = format.extra.adpcm.aCoef[state[0]->hPredictor].coef1; + state[0]->coef2 = format.extra.adpcm.aCoef[state[0]->hPredictor].coef2; + if( stereo ) { - state[1].hPredictor = *encoded++; + state[1]->hPredictor = *encoded++; + + assert( state[1]->hPredictor < format.extra.adpcm.numCoef ); + state[1]->hPredictor = idMath::ClampInt( 0, 6, state[1]->hPredictor ); + + state[1]->coef1 = format.extra.adpcm.aCoef[state[1]->hPredictor].coef1; + state[1]->coef2 = format.extra.adpcm.aCoef[state[1]->hPredictor].coef2; } - state[0].iDelta = ( ( encoded[1] << 8 ) | encoded[0] ); + state[0]->iDelta = ( ( encoded[1] << 8 ) | encoded[0] ); encoded += sizeof( int16 ); if( stereo ) { - state[1].iDelta = ( ( encoded[1] << 8 ) | encoded[0] ); - encoded += sizeof( int16 ); - } - state[0].iSamp1 = ( ( encoded[1] << 8 ) | encoded[0] ); - encoded += sizeof( int16 ); - if( stereo ) - { - state[1].iSamp1 = ( ( encoded[1] << 8 ) | encoded[0] ); - encoded += sizeof( int16 ); - } - state[0].iSamp2 = ( ( encoded[1] << 8 ) | encoded[0] ); - encoded += sizeof( int16 ); - if( stereo ) - { - state[1].iSamp2 = ( ( encoded[1] << 8 ) | encoded[0] ); + state[1]->iDelta = ( ( encoded[1] << 8 ) | encoded[0] ); + encoded += sizeof( int16 ); + } + + state[0]->iSamp1 = ( ( encoded[1] << 8 ) | encoded[0] ); + encoded += sizeof( int16 ); + if( stereo ) + { + state[1]->iSamp1 = ( ( encoded[1] << 8 ) | encoded[0] ); + encoded += sizeof( int16 ); + } + + state[0]->iSamp2 = ( ( encoded[1] << 8 ) | encoded[0] ); + encoded += sizeof( int16 ); + if( stereo ) + { + state[1]->iSamp2 = ( ( encoded[1] << 8 ) | encoded[0] ); encoded += sizeof( int16 ); } - assert( state[0].hPredictor < format.extra.adpcm.numCoef ); - assert( state[1].hPredictor < format.extra.adpcm.numCoef ); - coeff[0] = &format.extra.adpcm.aCoef[state[0].hPredictor].coef1; - coeff[1] = &format.extra.adpcm.aCoef[state[1].hPredictor].coef2; // Store the two initial samples we start with - decoded[0] = state[0].iSamp2 & 0xFF; - decoded[1] = state[0].iSamp2 >> 8; + decoded[0] = state[0]->iSamp2 & 0xFF; + decoded[1] = ( state[0]->iSamp2 >> 8 ) & 0xFF; decoded += 2; if( stereo ) { - decoded[0] = state[1].iSamp2 & 0xFF; - decoded[1] = state[1].iSamp2 >> 8; + decoded[0] = state[1]->iSamp2 & 0xFF; + decoded[1] = ( state[1]->iSamp2 >> 8 ) & 0xFF; decoded += 2; } - decoded[0] = state[0].iSamp1 & 0xFF; - decoded[1] = state[0].iSamp1 >> 8; + + decoded[0] = state[0]->iSamp1 & 0xFF; + decoded[1] = ( state[0]->iSamp1 >> 8 ) & 0xFF; decoded += 2; if( stereo ) { - decoded[0] = state[1].iSamp1 & 0xFF; - decoded[1] = state[1].iSamp1 >> 8; + decoded[0] = state[1]->iSamp1 & 0xFF; + decoded[1] = ( state[1]->iSamp1 >> 8 ) & 0xFF; decoded += 2; } @@ -1152,17 +1162,17 @@ int idSoundSample_OpenAL::MS_ADPCM_decode( uint8** audio_buf, uint32* audio_len while( samplesleft > 0 ) { nybble = ( *encoded ) >> 4; - new_sample = MS_ADPCM_nibble( &state[0], nybble, coeff[0] ); + new_sample = MS_ADPCM_nibble( state[0], nybble ); + decoded[0] = new_sample & 0xFF; - new_sample >>= 8; - decoded[1] = new_sample & 0xFF; + decoded[1] = ( new_sample >> 8 ) & 0xFF; decoded += 2; nybble = ( *encoded ) & 0x0F; - new_sample = MS_ADPCM_nibble( &state[1], nybble, coeff[1] ); + new_sample = MS_ADPCM_nibble( state[1], nybble ); + decoded[0] = new_sample & 0xFF; - new_sample >>= 8; - decoded[1] = new_sample & 0xFF; + decoded[1] = ( new_sample >> 8 ) & 0xFF; decoded += 2; ++encoded; diff --git a/neo/sound/OpenAL/AL_SoundSample.h b/neo/sound/OpenAL/AL_SoundSample.h index 6174d34c..a64da4c9 100644 --- a/neo/sound/OpenAL/AL_SoundSample.h +++ b/neo/sound/OpenAL/AL_SoundSample.h @@ -163,12 +163,15 @@ protected: struct MS_ADPCM_decodeState_t { uint8 hPredictor; + int16 coef1; + int16 coef2; + uint16 iDelta; int16 iSamp1; int16 iSamp2; }; - int32 MS_ADPCM_nibble( MS_ADPCM_decodeState_t* state, int8 nybble, int16* coeff ); + int32 MS_ADPCM_nibble( MS_ADPCM_decodeState_t* state, int8 nybble ); int MS_ADPCM_decode( uint8** audio_buf, uint32* audio_len ); struct sampleBuffer_t From 4884cc5793b54e9e077e98b428ce98cf0d99cb12 Mon Sep 17 00:00:00 2001 From: Robert Beckebans Date: Sun, 6 Jan 2013 13:03:56 +0100 Subject: [PATCH 49/57] Fixed OpenAL bug when deleting the OpenAL buffers that caused the game to hang. --- neo/sound/OpenAL/AL_SoundHardware.cpp | 208 +++++++++++--------------- neo/sound/OpenAL/AL_SoundHardware.h | 13 +- neo/sound/OpenAL/AL_SoundSample.cpp | 21 +-- neo/sound/OpenAL/AL_SoundVoice.cpp | 17 ++- neo/sound/snd_local.h | 26 ++++ neo/sound/snd_system.cpp | 16 ++ neo/sound/sound.h | 4 + 7 files changed, 161 insertions(+), 144 deletions(-) diff --git a/neo/sound/OpenAL/AL_SoundHardware.cpp b/neo/sound/OpenAL/AL_SoundHardware.cpp index 47c503a3..3c28e34a 100644 --- a/neo/sound/OpenAL/AL_SoundHardware.cpp +++ b/neo/sound/OpenAL/AL_SoundHardware.cpp @@ -4,6 +4,7 @@ Doom 3 BFG Edition GPL Source Code Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company. Copyright (C) 2013 Robert Beckebans +Copyright (c) 2010 by Chris Robinson (OpenAL Info Utility) This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code"). @@ -61,135 +62,98 @@ idSoundHardware_OpenAL::idSoundHardware_OpenAL() lastResetTime = 0; } +void idSoundHardware_OpenAL::PrintDeviceList( const char* list ) +{ + if( !list || *list == '\0' ) + { + idLib::Printf( " !!! none !!!\n" ); + } + else + { + do + { + idLib::Printf( " %s\n", list ); + list += strlen( list ) + 1; + } + while( *list != '\0' ); + } +} + +void idSoundHardware_OpenAL::PrintALCInfo( ALCdevice* device ) +{ + ALCint major, minor; + + if( device ) + { + const ALCchar* devname = NULL; + idLib::Printf( "\n" ); + if( alcIsExtensionPresent( device, "ALC_ENUMERATE_ALL_EXT" ) != AL_FALSE ) + { + devname = alcGetString( device, ALC_ALL_DEVICES_SPECIFIER ); + } + + if( CheckALCErrors( device ) != ALC_NO_ERROR || !devname ) + { + devname = alcGetString( device, ALC_DEVICE_SPECIFIER ); + } + + idLib::Printf( "** Info for device \"%s\" **\n", devname ); + } + alcGetIntegerv( device, ALC_MAJOR_VERSION, 1, &major ); + alcGetIntegerv( device, ALC_MINOR_VERSION, 1, &minor ); + + if( CheckALCErrors( device ) == ALC_NO_ERROR ) + idLib::Printf( "ALC version: %d.%d\n", major, minor ); + + if( device ) + { + idLib::Printf( "OpenAL extensions: %s", alGetString( AL_EXTENSIONS ) ); + + //idLib::Printf("ALC extensions:"); + //printList(alcGetString(device, ALC_EXTENSIONS), ' '); + CheckALCErrors( device ); + } +} + +void idSoundHardware_OpenAL::PrintALInfo() +{ + idLib::Printf( "OpenAL vendor string: %s\n", alGetString( AL_VENDOR ) ); + idLib::Printf( "OpenAL renderer string: %s\n", alGetString( AL_RENDERER ) ); + idLib::Printf( "OpenAL version string: %s\n", alGetString( AL_VERSION ) ); + idLib::Printf( "OpenAL extensions: %s", alGetString( AL_EXTENSIONS ) ); + //PrintList(alGetString(AL_EXTENSIONS), ' '); + CheckALErrors(); +} + void listDevices_f( const idCmdArgs& args ) { -#if 1 - // TODO - - idLib::Warning( "No audio devices found" ); - return; -#else - UINT32 deviceCount = 0; - if( pXAudio2->GetDeviceCount( &deviceCount ) != S_OK || deviceCount == 0 ) + idLib::Printf( "Available playback devices:\n" ); + if( alcIsExtensionPresent( NULL, "ALC_ENUMERATE_ALL_EXT" ) != AL_FALSE ) { - idLib::Warning( "No audio devices found" ); - return; + idSoundHardware_OpenAL::PrintDeviceList( alcGetString( NULL, ALC_ALL_DEVICES_SPECIFIER ) ); + } + else + { + idSoundHardware_OpenAL::PrintDeviceList( alcGetString( NULL, ALC_DEVICE_SPECIFIER ) ); } - for( unsigned int i = 0; i < deviceCount; i++ ) + //idLib::Printf("Available capture devices:\n"); + //printDeviceList(alcGetString(NULL, ALC_CAPTURE_DEVICE_SPECIFIER)); + + if( alcIsExtensionPresent( NULL, "ALC_ENUMERATE_ALL_EXT" ) != AL_FALSE ) { - XAUDIO2_DEVICE_DETAILS deviceDetails; - if( pXAudio2->GetDeviceDetails( i, &deviceDetails ) != S_OK ) - { - continue; - } - idStaticList< const char*, 5 > roles; - if( deviceDetails.Role & DefaultConsoleDevice ) - { - roles.Append( "Console Device" ); - } - if( deviceDetails.Role & DefaultMultimediaDevice ) - { - roles.Append( "Multimedia Device" ); - } - if( deviceDetails.Role & DefaultCommunicationsDevice ) - { - roles.Append( "Communications Device" ); - } - if( deviceDetails.Role & DefaultGameDevice ) - { - roles.Append( "Game Device" ); - } - idStaticList< const char*, 11 > channelNames; - if( deviceDetails.OutputFormat.dwChannelMask & SPEAKER_FRONT_LEFT ) - { - channelNames.Append( "Front Left" ); - } - if( deviceDetails.OutputFormat.dwChannelMask & SPEAKER_FRONT_RIGHT ) - { - channelNames.Append( "Front Right" ); - } - if( deviceDetails.OutputFormat.dwChannelMask & SPEAKER_FRONT_CENTER ) - { - channelNames.Append( "Front Center" ); - } - if( deviceDetails.OutputFormat.dwChannelMask & SPEAKER_LOW_FREQUENCY ) - { - channelNames.Append( "Low Frequency" ); - } - if( deviceDetails.OutputFormat.dwChannelMask & SPEAKER_BACK_LEFT ) - { - channelNames.Append( "Back Left" ); - } - if( deviceDetails.OutputFormat.dwChannelMask & SPEAKER_BACK_RIGHT ) - { - channelNames.Append( "Back Right" ); - } - if( deviceDetails.OutputFormat.dwChannelMask & SPEAKER_FRONT_LEFT_OF_CENTER ) - { - channelNames.Append( "Front Left of Center" ); - } - if( deviceDetails.OutputFormat.dwChannelMask & SPEAKER_FRONT_RIGHT_OF_CENTER ) - { - channelNames.Append( "Front Right of Center" ); - } - if( deviceDetails.OutputFormat.dwChannelMask & SPEAKER_BACK_CENTER ) - { - channelNames.Append( "Back Center" ); - } - if( deviceDetails.OutputFormat.dwChannelMask & SPEAKER_SIDE_LEFT ) - { - channelNames.Append( "Side Left" ); - } - if( deviceDetails.OutputFormat.dwChannelMask & SPEAKER_SIDE_RIGHT ) - { - channelNames.Append( "Side Right" ); - } - char mbcsDisplayName[ 256 ]; - wcstombs( mbcsDisplayName, deviceDetails.DisplayName, sizeof( mbcsDisplayName ) ); - idLib::Printf( "%3d: %s\n", i, mbcsDisplayName ); - idLib::Printf( " %d channels, %d Hz\n", deviceDetails.OutputFormat.Format.nChannels, deviceDetails.OutputFormat.Format.nSamplesPerSec ); - if( channelNames.Num() != deviceDetails.OutputFormat.Format.nChannels ) - { - idLib::Printf( S_COLOR_YELLOW "WARNING: " S_COLOR_RED "Mismatch between # of channels and channel mask\n" ); - } - if( channelNames.Num() == 1 ) - { - idLib::Printf( " %s\n", channelNames[0] ); - } - else if( channelNames.Num() == 2 ) - { - idLib::Printf( " %s and %s\n", channelNames[0], channelNames[1] ); - } - else if( channelNames.Num() > 2 ) - { - idLib::Printf( " %s", channelNames[0] ); - for( int i = 1; i < channelNames.Num() - 1; i++ ) - { - idLib::Printf( ", %s", channelNames[i] ); - } - idLib::Printf( ", and %s\n", channelNames[channelNames.Num() - 1] ); - } - if( roles.Num() == 1 ) - { - idLib::Printf( " Default %s\n", roles[0] ); - } - else if( roles.Num() == 2 ) - { - idLib::Printf( " Default %s and %s\n", roles[0], roles[1] ); - } - else if( roles.Num() > 2 ) - { - idLib::Printf( " Default %s", roles[0] ); - for( int i = 1; i < roles.Num() - 1; i++ ) - { - idLib::Printf( ", %s", roles[i] ); - } - idLib::Printf( ", and %s\n", roles[roles.Num() - 1] ); - } + idLib::Printf( "Default playback device: %s\n", alcGetString( NULL, ALC_DEFAULT_ALL_DEVICES_SPECIFIER ) ); } -#endif -// RB end + else + { + idLib::Printf( "Default playback device: %s\n", alcGetString( NULL, ALC_DEFAULT_DEVICE_SPECIFIER ) ); + } + + //idLib::Printf("Default capture device: %s\n", alcGetString(NULL, ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER)); + + idSoundHardware_OpenAL::PrintALCInfo( NULL ); + + idSoundHardware_OpenAL::PrintALCInfo( ( ALCdevice* )soundSystem->GetOpenALDevice() ); } /* diff --git a/neo/sound/OpenAL/AL_SoundHardware.h b/neo/sound/OpenAL/AL_SoundHardware.h index e828e43f..49d389d3 100644 --- a/neo/sound/OpenAL/AL_SoundHardware.h +++ b/neo/sound/OpenAL/AL_SoundHardware.h @@ -77,13 +77,11 @@ public: idSoundVoice* AllocateVoice( const idSoundSample* leadinSample, const idSoundSample* loopingSample ); void FreeVoice( idSoundVoice* voice ); - // video playback needs this - /* - IXAudio2* GetIXAudio2() const + // listDevices needs this + ALCdevice* GetOpenALDevice() const { - return pXAudio2; + return openalDevice; }; - */ int GetNumZombieVoices() const { @@ -94,6 +92,11 @@ public: return freeVoices.Num(); } + // OpenAL info + static void PrintDeviceList( const char* list ); + static void PrintALCInfo( ALCdevice* device ); + static void PrintALInfo(); + protected: friend class idSoundSample_OpenAL; friend class idSoundVoice_OpenAL; diff --git a/neo/sound/OpenAL/AL_SoundSample.cpp b/neo/sound/OpenAL/AL_SoundSample.cpp index d9758c25..fb8d2e6f 100644 --- a/neo/sound/OpenAL/AL_SoundSample.cpp +++ b/neo/sound/OpenAL/AL_SoundSample.cpp @@ -280,17 +280,17 @@ void idSoundSample_OpenAL::LoadResource() void idSoundSample_OpenAL::CreateOpenALBuffer() { // build OpenAL buffer - alGetError(); + CheckALErrors(); alGenBuffers( 1, &openalBuffer ); - if( alGetError() != AL_NO_ERROR ) + if( CheckALErrors() != AL_NO_ERROR ) { common->Error( "idSoundSample_OpenAL::CreateOpenALBuffer: error generating OpenAL hardware buffer" ); } if( alIsBuffer( openalBuffer ) ) { - alGetError(); + CheckALErrors(); // RB: TODO decode idWaveFile::FORMAT_ADPCM to idWaveFile::FORMAT_PCM // and build one big OpenAL buffer using the alBufferSubData extension @@ -352,7 +352,7 @@ void idSoundSample_OpenAL::CreateOpenALBuffer() alBufferData( openalBuffer, GetOpenALBufferFormat(), buffer, bufferSize, format.basic.samplesPerSec ); } - if( alGetError() != AL_NO_ERROR ) + if( CheckALErrors() != AL_NO_ERROR ) { common->Error( "idSoundSample_OpenAL::CreateOpenALBuffer: error loading data into OpenAL hardware buffer" ); } @@ -579,19 +579,19 @@ void idSoundSample_OpenAL::MakeDefault() playLength = DEFAULT_NUM_SAMPLES; - alGetError(); + CheckALErrors(); alGenBuffers( 1, &openalBuffer ); - if( alGetError() != AL_NO_ERROR ) + if( CheckALErrors() != AL_NO_ERROR ) { common->Error( "idSoundSample_OpenAL::MakeDefault: error generating OpenAL hardware buffer" ); } if( alIsBuffer( openalBuffer ) ) { - alGetError(); + CheckALErrors(); alBufferData( openalBuffer, GetOpenALBufferFormat(), defaultBuffer, totalBufferSize, format.basic.samplesPerSec ); - if( alGetError() != AL_NO_ERROR ) + if( CheckALErrors() != AL_NO_ERROR ) { common->Error( "idSoundSample_OpenAL::MakeDefault: error loading data into OpenAL hardware buffer" ); } @@ -627,9 +627,10 @@ void idSoundSample_OpenAL::FreeData() if( alIsBuffer( openalBuffer ) ) { - alGetError(); + CheckALErrors(); + alDeleteBuffers( 1, &openalBuffer ); - if( alGetError() != AL_NO_ERROR ) + if( CheckALErrors() != AL_NO_ERROR ) { common->Error( "idSoundSample_OpenAL::FreeData: error unloading data from OpenAL hardware buffer" ); } diff --git a/neo/sound/OpenAL/AL_SoundVoice.cpp b/neo/sound/OpenAL/AL_SoundVoice.cpp index e734d7a7..8f403650 100644 --- a/neo/sound/OpenAL/AL_SoundVoice.cpp +++ b/neo/sound/OpenAL/AL_SoundVoice.cpp @@ -145,9 +145,10 @@ void idSoundVoice_OpenAL::Create( const idSoundSample* leadinSample_, const idSo //soundSystemLocal.hardware.pXAudio2->CreateSourceVoice( &pSourceVoice, ( const WAVEFORMATEX* )&leadinSample->format, XAUDIO2_VOICE_USEFILTER, 4.0f, &streamContext ); - alGetError(); + CheckALErrors(); + alGenSources( 1, &openalSource ); - if( alGetError() != AL_NO_ERROR ) + if( CheckALErrors() != AL_NO_ERROR ) //if( pSourceVoice == NULL ) { // If this hits, then we are most likely passing an invalid sample format, which should have been caught by the loader (and the sample defaulted) @@ -568,9 +569,10 @@ void idSoundVoice_OpenAL::FlushSourceBuffers() if( openalStreamingBuffer[0] && openalStreamingBuffer[1] && openalStreamingBuffer[2] ) { - alGetError(); + CheckALErrors(); + alDeleteBuffers( 3, &openalStreamingBuffer[0] ); - if( alGetError() == AL_NO_ERROR ) + if( CheckALErrors() == AL_NO_ERROR ) { openalStreamingBuffer[0] = openalStreamingBuffer[1] = openalStreamingBuffer[2] = 0; } @@ -578,9 +580,10 @@ void idSoundVoice_OpenAL::FlushSourceBuffers() if( lastopenalStreamingBuffer[0] && lastopenalStreamingBuffer[1] && lastopenalStreamingBuffer[2] ) { - alGetError(); + CheckALErrors(); + alDeleteBuffers( 3, &lastopenalStreamingBuffer[0] ); - if( alGetError() == AL_NO_ERROR ) + if( CheckALErrors() == AL_NO_ERROR ) { lastopenalStreamingBuffer[0] = lastopenalStreamingBuffer[1] = lastopenalStreamingBuffer[2] = 0; } @@ -654,7 +657,7 @@ void idSoundVoice_OpenAL::Stop() } alSourceStop( openalSource ); - //alSourcei( openalSource, AL_BUFFER, 0 ); + alSourcei( openalSource, AL_BUFFER, 0 ); //pSourceVoice->Stop( 0, OPERATION_SET ); paused = true; diff --git a/neo/sound/snd_local.h b/neo/sound/snd_local.h index 14f73405..ae18f52b 100644 --- a/neo/sound/snd_local.h +++ b/neo/sound/snd_local.h @@ -105,6 +105,28 @@ typedef enum #include "OpenAL/AL_SoundVoice.h" #include "OpenAL/AL_SoundHardware.h" +ID_INLINE_EXTERN ALenum CheckALErrors_( const char* filename, int line ) +{ + ALenum err = alGetError(); + if( err != AL_NO_ERROR ) + { + idLib::Printf( "OpenAL Error: %s (0x%x), @ %s %d\n", alGetString( err ), err, filename, line ); + } + return err; +} +#define CheckALErrors() CheckALErrors_(__FILE__, __LINE__) + +ID_INLINE_EXTERN ALCenum CheckALCErrors_( ALCdevice* device, const char* filename, int linenum ) +{ + ALCenum err = alcGetError( device ); + if( err != ALC_NO_ERROR ) + { + idLib::Printf( "ALC Error: %s (0x%x), @ %s %d\n", alcGetString( device, err ), err, filename, linenum ); + } + return err; +} +#define CheckALCErrors(x) CheckALCErrors_((x), __FILE__, __LINE__) + #elif defined(_MSC_VER) // DG: stub out xaudio for MinGW etc #define OPERATION_SET 1 @@ -460,6 +482,10 @@ public: virtual void* GetIXAudio2() const; // FIXME: stupid name; get rid of this? not sure if it's really needed.. + // RB begin + virtual void* GetOpenALDevice() const; + // RB end + // for the sound level meter window virtual cinData_t ImageForTime( const int milliseconds, const bool waveform ); diff --git a/neo/sound/snd_system.cpp b/neo/sound/snd_system.cpp index 68460e13..34821e04 100644 --- a/neo/sound/snd_system.cpp +++ b/neo/sound/snd_system.cpp @@ -399,6 +399,22 @@ void* idSoundSystemLocal::GetIXAudio2() const // RB end } +/* +======================== +idSoundSystemLocal::GetOpenALDevice +======================== +*/ +// RB begin +void* idSoundSystemLocal::GetOpenALDevice() const +{ +#if defined(USE_OPENAL) + return ( void* )hardware.GetOpenALDevice(); +#else + return ( void* )hardware.GetIXAudio2(); +#endif +} +// RB end + /* ======================== idSoundSystemLocal::SoundTime diff --git a/neo/sound/sound.h b/neo/sound/sound.h index b495a952..0b6abecb 100644 --- a/neo/sound/sound.h +++ b/neo/sound/sound.h @@ -321,6 +321,10 @@ public: // video playback needs to get this virtual void* GetIXAudio2() const = 0; // FIXME: stupid name if we have other backends +#if defined(USE_OPENAL) + virtual void* GetOpenALDevice() const = 0; +#endif + // for the sound level meter window virtual cinData_t ImageForTime( const int milliseconds, const bool waveform ) = 0; From 5234e4cd775ae89e595b73152b2973f6a13d082a Mon Sep 17 00:00:00 2001 From: Robert Beckebans Date: Sun, 6 Jan 2013 17:47:40 +0100 Subject: [PATCH 50/57] Cleaned up OpenAL code. Updated README.txt --- neo/CMakeLists.txt | 6 +- neo/sound/OpenAL/AL_SoundHardware.cpp | 18 +----- neo/sound/OpenAL/AL_SoundHardware.h | 23 -------- neo/sound/OpenAL/AL_SoundVoice.cpp | 82 +++++++++------------------ 4 files changed, 33 insertions(+), 96 deletions(-) diff --git a/neo/CMakeLists.txt b/neo/CMakeLists.txt index 9a2165f2..85112655 100644 --- a/neo/CMakeLists.txt +++ b/neo/CMakeLists.txt @@ -13,8 +13,12 @@ option(SDL2 "Use SDL2 instead of SDL1.2" OFF) option(OPENAL - "Use OpenAL soft instead of XAudio2" ON) + "Use OpenAL soft instead of XAudio2" OFF) +if(UNIX) + set(OPENAL TRUE) +endif() + if(MSVC) #message(STATUS CMAKE_ROOT: ${CMAKE_ROOT}) diff --git a/neo/sound/OpenAL/AL_SoundHardware.cpp b/neo/sound/OpenAL/AL_SoundHardware.cpp index 3c28e34a..83fd15a4 100644 --- a/neo/sound/OpenAL/AL_SoundHardware.cpp +++ b/neo/sound/OpenAL/AL_SoundHardware.cpp @@ -39,6 +39,7 @@ idCVar s_device( "s_device", "-1", CVAR_INTEGER | CVAR_ARCHIVE, "Which audio dev idCVar s_showPerfData( "s_showPerfData", "0", CVAR_BOOL, "Show XAudio2 Performance data" ); extern idCVar s_volume_dB; + /* ======================== idSoundHardware_OpenAL::idSoundHardware_OpenAL @@ -486,20 +487,3 @@ void idSoundHardware_OpenAL::Update() } -/* -================================================ -idSoundEngineCallback -================================================ -*/ - -/* -======================== -idSoundEngineCallback::OnCriticalError -======================== -*/ -/* -void idSoundEngineCallback::OnCriticalError( HRESULT Error ) -{ - soundSystemLocal.SetNeedsRestart(); -} -*/ diff --git a/neo/sound/OpenAL/AL_SoundHardware.h b/neo/sound/OpenAL/AL_SoundHardware.h index 49d389d3..adab2d78 100644 --- a/neo/sound/OpenAL/AL_SoundHardware.h +++ b/neo/sound/OpenAL/AL_SoundHardware.h @@ -31,32 +31,9 @@ If you have questions concerning this license or the applicable additional terms class idSoundSample_OpenAL; class idSoundVoice_OpenAL; -// RB class idSoundHardware_OpenAL; -/* -================================================ -idSoundEngineCallback -================================================ -*/ -/* -class idSoundEngineCallback : public IXAudio2EngineCallback -{ -public: - idSoundHardware_OpenAL* hardware; -private: - // Called by XAudio2 just before an audio processing pass begins. - STDMETHOD_( void, OnProcessingPassStart )( THIS ) {} - - // Called just after an audio processing pass ends. - STDMETHOD_( void, OnProcessingPassEnd )( THIS ) {} - - // Called in the event of a critical system error which requires XAudio2 - // to be closed down and restarted. The error code is given in Error. - STDMETHOD_( void, OnCriticalError )( THIS_ HRESULT Error ); -}; -*/ /* ================================================ diff --git a/neo/sound/OpenAL/AL_SoundVoice.cpp b/neo/sound/OpenAL/AL_SoundVoice.cpp index 8f403650..a2539ff4 100644 --- a/neo/sound/OpenAL/AL_SoundVoice.cpp +++ b/neo/sound/OpenAL/AL_SoundVoice.cpp @@ -37,35 +37,7 @@ idCVar s_debugHardware( "s_debugHardware", "0", CVAR_BOOL, "Print a message any static int SYSTEM_SAMPLE_RATE = 44100; static float ONE_OVER_SYSTEM_SAMPLE_RATE = 1.0f / SYSTEM_SAMPLE_RATE; -/* -======================== -idStreamingVoiceContext -======================== -*/ -/* -class idStreamingVoiceContext : public IXAudio2VoiceCallback -{ -public: - STDMETHOD_( void, OnVoiceProcessingPassStart )( UINT32 BytesRequired ) {} - STDMETHOD_( void, OnVoiceProcessingPassEnd )() {} - STDMETHOD_( void, OnStreamEnd )() {} - STDMETHOD_( void, OnBufferStart )( void* pContext ) - { - idSoundSystemLocal::bufferContext_t* bufferContext = ( idSoundSystemLocal::bufferContext_t* ) pContext; - bufferContext->voice->OnBufferStart( bufferContext->sample, bufferContext->bufferNumber ); - } - STDMETHOD_( void, OnLoopEnd )( void* ) {} - STDMETHOD_( void, OnVoiceError )( void*, HRESULT hr ) - { - idLib::Warning( "OnVoiceError( %d )", hr ); - } - STDMETHOD_( void, OnBufferEnd )( void* pContext ) - { - idSoundSystemLocal::bufferContext_t* bufferContext = ( idSoundSystemLocal::bufferContext_t* ) pContext; - soundSystemLocal.ReleaseStreamBufferContext( bufferContext ); - } -} streamContext; -*/ + /* ======================== @@ -237,6 +209,32 @@ void idSoundVoice_OpenAL::DestroyInternal() alDeleteSources( 1, &openalSource ); openalSource = 0; + alSourcei( openalSource, AL_BUFFER, 0 ); + + if( openalStreamingBuffer[0] && openalStreamingBuffer[1] && openalStreamingBuffer[2] ) + { + CheckALErrors(); + + alDeleteBuffers( 3, &openalStreamingBuffer[0] ); + if( CheckALErrors() == AL_NO_ERROR ) + { + openalStreamingBuffer[0] = openalStreamingBuffer[1] = openalStreamingBuffer[2] = 0; + } + } + + if( lastopenalStreamingBuffer[0] && lastopenalStreamingBuffer[1] && lastopenalStreamingBuffer[2] ) + { + CheckALErrors(); + + alDeleteBuffers( 3, &lastopenalStreamingBuffer[0] ); + if( CheckALErrors() == AL_NO_ERROR ) + { + lastopenalStreamingBuffer[0] = lastopenalStreamingBuffer[1] = lastopenalStreamingBuffer[2] = 0; + } + } + + openalStreamingOffset = 0; + hasVUMeter = false; } } @@ -564,32 +562,6 @@ void idSoundVoice_OpenAL::FlushSourceBuffers() if( alIsSource( openalSource ) ) { //pSourceVoice->FlushSourceBuffers(); - - alSourcei( openalSource, AL_BUFFER, 0 ); - - if( openalStreamingBuffer[0] && openalStreamingBuffer[1] && openalStreamingBuffer[2] ) - { - CheckALErrors(); - - alDeleteBuffers( 3, &openalStreamingBuffer[0] ); - if( CheckALErrors() == AL_NO_ERROR ) - { - openalStreamingBuffer[0] = openalStreamingBuffer[1] = openalStreamingBuffer[2] = 0; - } - } - - if( lastopenalStreamingBuffer[0] && lastopenalStreamingBuffer[1] && lastopenalStreamingBuffer[2] ) - { - CheckALErrors(); - - alDeleteBuffers( 3, &lastopenalStreamingBuffer[0] ); - if( CheckALErrors() == AL_NO_ERROR ) - { - lastopenalStreamingBuffer[0] = lastopenalStreamingBuffer[1] = lastopenalStreamingBuffer[2] = 0; - } - } - - openalStreamingOffset = 0; } } From 61a0a90f012ed14f7ce2f223743addc4ca687c91 Mon Sep 17 00:00:00 2001 From: Robert Beckebans Date: Sun, 6 Jan 2013 17:48:30 +0100 Subject: [PATCH 51/57] Updated README.txt .. --- README.txt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.txt b/README.txt index 6c0dbc48..390f0078 100644 --- a/README.txt +++ b/README.txt @@ -149,11 +149,11 @@ _________________________ On Debian or Ubuntu: - > apt-get install cmake libsdl1.2-dev + > apt-get install cmake libsdl1.2-dev libopenal-dev On Fedora - > yum install cmake SDL-devel + > yum install cmake SDL-devel openal-devel 3. Generate the Makefiles using CMake: @@ -172,9 +172,10 @@ ___________________________________________________ 7) CHANGES __________________________________________ -// TODO -See CHANGELOG.txt for full list of all changes. - + * Flexible build system using CMake + * Linux support (32 and 64 bit) + * New OpenAL Soft sound backend primarily developed for Linux but works on Windows as well + * Win64 support ___________________________________________________ @@ -189,7 +190,6 @@ ___________________________________________________ 10) KNOWN ISSUES __________________________________________ - * Sound engine does not work on Linux * Doomclassic is not supported on Linux (yet) * There are some issues with the binary format loaders/writers on 64 bit platforms * The intel open source drivers to not support OpenGL 3.2 yet From 1e22219121472f28577551d3099a9bd212313f04 Mon Sep 17 00:00:00 2001 From: Daniel Gibson Date: Sun, 6 Jan 2013 19:03:03 +0100 Subject: [PATCH 52/57] Add/update minizip copyright note in README forgot that when updating zip.. --- README.txt | 40 ++++++++++++++++++++++------------------ 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/README.txt b/README.txt index 390f0078..b38db429 100644 --- a/README.txt +++ b/README.txt @@ -321,29 +321,33 @@ STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -IO for uncompress .zip files using zlib +IO for (un)compress .zip files using zlib --------------------------------------------------------------------------- -neo/framework/Unzip.cpp -neo/framework/Unzip.h +neo/libs/zlib/minizip/* -Copyright (C) 1998 Gilles Vollant -zlib is Copyright (C) 1995-1998 Jean-loup Gailly and Mark Adler +Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. +Modifications of Unzip for Zip64 +Copyright (C) 2007-2008 Even Rouault - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: +Modifications for Zip64 support +Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. MD4 Message-Digest Algorithm ----------------------------------------------------------------------------- From 2a940490164973eecb23ba2d18b0559febf591ef Mon Sep 17 00:00:00 2001 From: Daniel Gibson Date: Sun, 6 Jan 2013 20:43:54 +0100 Subject: [PATCH 53/57] Add installation instructions to README --- README.txt | 84 +++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 73 insertions(+), 11 deletions(-) diff --git a/README.txt b/README.txt index b38db429..ab94b534 100644 --- a/README.txt +++ b/README.txt @@ -34,17 +34,19 @@ This file contains the following sections: 6) COMPILING ON GNU/LINUX - 7) CHANGES + 7) GETTING THE GAMEDATA, RUNNING THE GAME - 8) FEATURES + 8) CHANGES - 9) CONSOLE VARIABLES + 9) FEATURES - 10) KNOWN ISSUES + 10) CONSOLE VARIABLES - 11) BUG REPORTS + 11) KNOWN ISSUES - 12) CODE LICENSE EXCEPTIONS + 12) BUG REPORTS + + 13) CODE LICENSE EXCEPTIONS @@ -124,6 +126,9 @@ This project's GitHub.net Git repository can be checked out through Git with the > git clone https://github.com/RobertBeckebans/RBDOOM-3-BFG.git +If you don't want to use git, you can download the source as a zip file at + https://github.com/RobertBeckebans/RBDOOM-3-BFG/archive/master.zip + ___________________________________________________________________ @@ -154,6 +159,14 @@ _________________________ On Fedora > yum install cmake SDL-devel openal-devel + + Instead of SDL1.2 development files you can also use SDL2, but so far it + seems like no distributions has packages for it yet, so you may have to + compile and install SDL2 yourself. + (There may be inofficial repositories like Ubuntu PPAs) + + SDL2 has better input support (especially in the console) and better + support for multiple displays (especially in fullscreen mode). 3. Generate the Makefiles using CMake: @@ -166,10 +179,52 @@ _________________________ > cd ../build > make +___________________________________________________ + +7) GETTING THE GAMEDATA, RUNNING THE GAME +__________________________________________ + +To play the game, you need the game data from a legal copy of the game, which +unfortunately requires Steam for Windows - Steam for Linux or OSX won't do, because +(at least currently) the Doom3 BFG game is only installable on Steam for Windows. +Even the DVD version of Doom3 BFG only contains encrytped data that is decoded +by Steam on install. + +Fortunately, you can run Steam in Wine to install Doom3 BFG and afterwards copy the +game data somewhere else to use it with native executables. +Winetricks ( http://winetricks.org/ ) makes installing Windows Steam on Linux really easy. + +Anyway: + +1. Install Doom3 BFG in Steam (Windows version), make sure it's getting + updated/patched. + +2. Create your own doom3bfg directory, e.g. /path/to/Doom3BFG/ + +3. Copy the game-data's base dir from Steam to that directory + (e.g. /path/to/Doom3BFG/), it's in + /your/path/to/Steam/steamapps/common/DOOM 3 BFG Edition/base/ + +4. Copy your RBDoom3BFG executable that you created in 5) or 6) to your own + doom3bfg directory (/path/to/Doom3BFG). + + Your own doom3bfg directory now should look like: + /path/to/Doom3BFG/ + -> RBDoom3BFG (or RBDoom3BFG.exe on Windows) + -> base/ + -> classicmusic/ + -> _common.crc + -> (etc) + +5. Run the game by executing the RBDoom3BFG executable. + +6. Enjoy + +7. If you run into bugs, please report them, see 12) ___________________________________________________ -7) CHANGES +8) CHANGES __________________________________________ * Flexible build system using CMake @@ -179,7 +234,14 @@ __________________________________________ ___________________________________________________ -9) CONSOLE VARIABLES +9) FEATURES +__________________________________________ + +// TODO + +___________________________________________________ + +10) CONSOLE VARIABLES __________________________________________ // TODO @@ -187,7 +249,7 @@ __________________________________________ ___________________________________________________ -10) KNOWN ISSUES +11) KNOWN ISSUES __________________________________________ * Doomclassic is not supported on Linux (yet) @@ -197,7 +259,7 @@ __________________________________________ ___________________________________________________ -11) BUG REPORTS +12) BUG REPORTS __________________________________________ RBDoom3BFG is not perfect, it is not bug free as every other software. @@ -227,7 +289,7 @@ NOTE: We cannot help you with OS-specific issues like configuring OpenGL correct ____________________________________________________________________________________ -12) CODE LICENSE EXCEPTIONS - The parts that are not covered by the GPL: +13) CODE LICENSE EXCEPTIONS - The parts that are not covered by the GPL: _______________________________________________________________________ From 155e5e589e948f1e5c33d753fa8001d737275ee8 Mon Sep 17 00:00:00 2001 From: Daniel Gibson Date: Sat, 5 Jan 2013 16:42:24 +0100 Subject: [PATCH 54/57] Also check for com_pause when USE_DOOMCLASSIC oops, somehow forgot this one --- neo/framework/common_frame.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/neo/framework/common_frame.cpp b/neo/framework/common_frame.cpp index a63f0053..ebe0b674 100644 --- a/neo/framework/common_frame.cpp +++ b/neo/framework/common_frame.cpp @@ -490,7 +490,7 @@ void idCommonLocal::Frame() // DG: Add pause from com_pause cvar // RB begin #if defined(USE_DOOMCLASSIC) - if( console->Active() || Dialog().IsDialogActive() || session->IsSystemUIShowing() + if( com_pause.GetInteger() || console->Active() || Dialog().IsDialogActive() || session->IsSystemUIShowing() || ( game && game->InhibitControls() && !IsPlayingDoomClassic() ) ) #else if( com_pause.GetInteger() || console->Active() || Dialog().IsDialogActive() || session->IsSystemUIShowing() From d6dd5fabc69620fab52da5e5db1ce0645955b3dd Mon Sep 17 00:00:00 2001 From: SpiritQuaddicted Date: Mon, 7 Jan 2013 18:20:45 +0100 Subject: [PATCH 55/57] README.TXT, fixed list numbering The COMPILING ON GNU/LINUX list skipped the 2 and went straight from 1 to 3. --- README.txt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/README.txt b/README.txt index ab94b534..782284a0 100644 --- a/README.txt +++ b/README.txt @@ -1,4 +1,3 @@ - ____ ____ ____ _____ ____ ______ ______ / __ \ / __ ) / __ \ ____ ____ ____ ___ |__ / / __ ) / ____// ____/ / /_/ // __ |/ / / // __ \ / __ \ / __ `__ \ /_ < / __ |/ /_ / / __ @@ -169,12 +168,12 @@ _________________________ support for multiple displays (especially in fullscreen mode). -3. Generate the Makefiles using CMake: +2. Generate the Makefiles using CMake: > cd neo/ > ./cmake-eclipse-linux-profile.sh -4. Compile RBDoom3BFG targets with +3. Compile RBDoom3BFG targets with > cd ../build > make From 83b3439e875800ba25c086f7978ce2344c2cb5e8 Mon Sep 17 00:00:00 2001 From: Robert Beckebans Date: Tue, 8 Jan 2013 18:08:24 +0100 Subject: [PATCH 56/57] Disabled unused OpenAL code requiring the AL_SOFT_buffer_samples extension --- neo/sound/OpenAL/AL_SoundSample.cpp | 67 +++++++++-------------------- neo/sound/OpenAL/AL_SoundSample.h | 2 + neo/sound/snd_local.h | 2 +- 3 files changed, 23 insertions(+), 48 deletions(-) diff --git a/neo/sound/OpenAL/AL_SoundSample.cpp b/neo/sound/OpenAL/AL_SoundSample.cpp index fb8d2e6f..66af7d5e 100644 --- a/neo/sound/OpenAL/AL_SoundSample.cpp +++ b/neo/sound/OpenAL/AL_SoundSample.cpp @@ -292,14 +292,13 @@ void idSoundSample_OpenAL::CreateOpenALBuffer() { CheckALErrors(); - // RB: TODO decode idWaveFile::FORMAT_ADPCM to idWaveFile::FORMAT_PCM - // and build one big OpenAL buffer using the alBufferSubData extension - void* buffer = NULL; uint32 bufferSize = 0; if( format.basic.formatTag == idWaveFile::FORMAT_ADPCM ) { + // RB: decode idWaveFile::FORMAT_ADPCM to idWaveFile::FORMAT_PCM + buffer = buffers[0].buffer; bufferSize = buffers[0].bufferSize; @@ -315,10 +314,12 @@ void idSoundSample_OpenAL::CreateOpenALBuffer() } else if( format.basic.formatTag == idWaveFile::FORMAT_XMA2 ) { + // RB: not used in the PC version of the BFG edition common->Error( "idSoundSample_OpenAL::CreateOpenALBuffer: could not decode XMA2 '%s' to 16 bit format", GetName() ); } else if( format.basic.formatTag == idWaveFile::FORMAT_EXTENSIBLE ) { + // RB: not used in the PC version of the BFG edition common->Error( "idSoundSample_OpenAL::CreateOpenALBuffer: could not decode extensible WAV format '%s' to 16 bit format", GetName() ); } else @@ -331,7 +332,7 @@ void idSoundSample_OpenAL::CreateOpenALBuffer() bufferSize = buffers[0].bufferSize; } -#if 0 +#if 0 //#if defined(AL_SOFT_buffer_samples) if( alIsExtensionPresent( "AL_SOFT_buffer_samples" ) ) { ALenum type = AL_SHORT_SOFT; @@ -683,6 +684,7 @@ float idSoundSample_OpenAL::GetAmplitude( int timeMS ) const } +#if 0 //defined(AL_SOFT_buffer_samples) const char* idSoundSample_OpenAL::OpenALSoftChannelsName( ALenum chans ) const { switch( chans ) @@ -952,58 +954,29 @@ ALenum idSoundSample_OpenAL::GetOpenALSoftFormat( ALenum channels, ALenum type ) return format; } +#endif // #if defined(AL_SOFT_buffer_samples) ALenum idSoundSample_OpenAL::GetOpenALBufferFormat() const { ALenum alFormat; -#if 0 - if( alIsExtensionPresent( "AL_SOFT_buffer_samples" ) ) + if( format.basic.formatTag == idWaveFile::FORMAT_PCM ) { - if( format.basic.formatTag == idWaveFile::FORMAT_PCM ) - { - alFormat = NumChannels() == 1 ? AL_MONO16_SOFT : AL_STEREO16_SOFT; - } - else if( format.basic.formatTag == idWaveFile::FORMAT_ADPCM ) - { - alFormat = NumChannels() == 1 ? AL_MONO8_SOFT : AL_STEREO8_SOFT; - //alFormat = NumChannels() == 1 ? AL_MONO16_SOFT : AL_STEREO16_SOFT; - } - else if( format.basic.formatTag == idWaveFile::FORMAT_XMA2 ) - { - alFormat = NumChannels() == 1 ? AL_MONO16_SOFT : AL_STEREO16_SOFT; - } - else - { - alFormat = NumChannels() == 1 ? AL_MONO16_SOFT : AL_STEREO16_SOFT; - } - - if( !alIsBufferFormatSupportedSOFT( alFormat ) ) - { - alFormat = NumChannels() == 1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16; - } + alFormat = NumChannels() == 1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16; + } + else if( format.basic.formatTag == idWaveFile::FORMAT_ADPCM ) + { + //alFormat = NumChannels() == 1 ? AL_FORMAT_MONO8 : AL_FORMAT_STEREO8; + alFormat = NumChannels() == 1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16; + //alFormat = NumChannels() == 1 ? AL_FORMAT_MONO_IMA4 : AL_FORMAT_STEREO_IMA4; + } + else if( format.basic.formatTag == idWaveFile::FORMAT_XMA2 ) + { + alFormat = NumChannels() == 1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16; } else -#endif { - if( format.basic.formatTag == idWaveFile::FORMAT_PCM ) - { - alFormat = NumChannels() == 1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16; - } - else if( format.basic.formatTag == idWaveFile::FORMAT_ADPCM ) - { - //alFormat = NumChannels() == 1 ? AL_FORMAT_MONO8 : AL_FORMAT_STEREO8; - alFormat = NumChannels() == 1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16; - //alFormat = NumChannels() == 1 ? AL_FORMAT_MONO_IMA4 : AL_FORMAT_STEREO_IMA4; - } - else if( format.basic.formatTag == idWaveFile::FORMAT_XMA2 ) - { - alFormat = NumChannels() == 1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16; - } - else - { - alFormat = NumChannels() == 1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16; - } + alFormat = NumChannels() == 1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16; } return alFormat; diff --git a/neo/sound/OpenAL/AL_SoundSample.h b/neo/sound/OpenAL/AL_SoundSample.h index a64da4c9..459ac0b3 100644 --- a/neo/sound/OpenAL/AL_SoundSample.h +++ b/neo/sound/OpenAL/AL_SoundSample.h @@ -130,6 +130,7 @@ public: float GetAmplitude( int timeMS ) const; +#if 0 //defined(AL_SOFT_buffer_samples) const char* OpenALSoftChannelsName( ALenum chans ) const; const char* OpenALSoftTypeName( ALenum type ) const; @@ -143,6 +144,7 @@ public: * AL_SOFT_buffer_samples. Returns AL_NONE (0) if no supported format can be * found. */ ALenum GetOpenALSoftFormat( ALenum channels, ALenum type ) const; +#endif ALenum GetOpenALBufferFormat() const; diff --git a/neo/sound/snd_local.h b/neo/sound/snd_local.h index ae18f52b..688ab051 100644 --- a/neo/sound/snd_local.h +++ b/neo/sound/snd_local.h @@ -95,7 +95,7 @@ typedef enum #if defined(USE_OPENAL) -#define AL_ALEXT_PROTOTYPES +//#define AL_ALEXT_PROTOTYPES #include #include From 98093a4e8dd1795e04563bd2ae3a45c0a5ce24c5 Mon Sep 17 00:00:00 2001 From: Robert Beckebans Date: Mon, 14 Jan 2013 00:24:11 +0100 Subject: [PATCH 57/57] Added long neck GCC compiler workaround from dhewm3 --- neo/d3xp/anim/Anim_Blend.cpp | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/neo/d3xp/anim/Anim_Blend.cpp b/neo/d3xp/anim/Anim_Blend.cpp index cacf5f16..1a261da2 100644 --- a/neo/d3xp/anim/Anim_Blend.cpp +++ b/neo/d3xp/anim/Anim_Blend.cpp @@ -5490,19 +5490,21 @@ bool idAnimator::GetJointLocalTransform( jointHandle_t jointHandle, int currentT // FIXME: overkill CreateFrame( currentTime, false ); - if( jointHandle > 0 ) - { - idJointMat m = joints[ jointHandle ]; - m /= joints[ modelJoints[ jointHandle ].parentNum ]; - offset = m.ToVec3(); - axis = m.ToMat3(); - } - else + // RB: long neck GCC compiler bug workaround from dhewm3 ... + if( jointHandle == 0 ) { offset = joints[ jointHandle ].ToVec3(); axis = joints[ jointHandle ].ToMat3(); + + return true; } + idJointMat m = joints[ jointHandle ]; + m /= joints[ modelJoints[ jointHandle ].parentNum ]; + offset = m.ToVec3(); + axis = m.ToMat3(); + // RB end + return true; }