From 1eb87e7c7362e5a4fad0f5d8f683da0fcf80785d Mon Sep 17 00:00:00 2001 From: curt Date: Mon, 5 Apr 1999 21:32:32 +0000 Subject: [PATCH] Initial revision --- Audio/CHANGES | 139 --- Audio/Makefile.am | 1 - Audio/NOTICE | 9 - Audio/README | 9 - Audio/README.freebsd | 13 - Audio/README.linux | 13 - Audio/README.openbsd | 13 - Audio/README.sgi | 27 - Audio/README.unix | 20 - Audio/README.win | 15 - CVSROOT/checkoutlist | 13 - CVSROOT/commitinfo | 15 - CVSROOT/cvswrappers | 22 - CVSROOT/editinfo | 21 - CVSROOT/loginfo | 19 - CVSROOT/modules | 26 - CVSROOT/notify | 12 - CVSROOT/rcsinfo | 13 - CVSROOT/taginfo | 20 - {Bucket => Lib/Bucket}/Makefile.am | 0 {Bucket => Lib/Bucket}/newbucket.cxx | 3 + {Bucket => Lib/Bucket}/newbucket.hxx | 3 + {Bucket => Lib/Bucket}/testbucket.cxx | 0 {Debug => Lib/Debug}/Makefile.am | 0 {Debug => Lib/Debug}/debug_types.h | 0 {Debug => Lib/Debug}/fg_debug.c | 7 +- {Debug => Lib/Debug}/fg_debug.h | 0 {Debug => Lib/Debug}/logstream.cxx | 3 + {Debug => Lib/Debug}/logstream.hxx | 3 + {Debug => Lib/Debug}/logtest.cxx | 0 {Math => Lib/Math}/MAT3geom.c | 0 {Math => Lib/Math}/MAT3inv.c | 0 {Math => Lib/Math}/MAT3mat.c | 0 {Math => Lib/Math}/MAT3vec.c | 0 {Math => Lib/Math}/Makefile.am | 0 {Math => Lib/Math}/fg_geodesy.cxx | 6 + {Math => Lib/Math}/fg_geodesy.hxx | 6 + {Math => Lib/Math}/fg_random.c | 3 + {Math => Lib/Math}/fg_random.h | 3 + Lib/Math/geotest.c | 30 + {Math => Lib/Math}/interpolater.cxx | 3 + {Math => Lib/Math}/interpolater.hxx | 3 + Lib/Math/inttest.cxx | 23 + {Math => Lib/Math}/leastsqs.cxx | 3 + {Math => Lib/Math}/leastsqs.hxx | 3 + {Math => Lib/Math}/mat3.h | 0 {Math => Lib/Math}/mat3defs.h | 0 {Math => Lib/Math}/mat3err.h | 0 {Math => Lib/Math}/point3d.hxx | 3 + {Math => Lib/Math}/polar3d.cxx | 3 + {Math => Lib/Math}/polar3d.hxx | 3 + {Math => Lib/Math}/vector.cxx | 3 + {Math => Lib/Math}/vector.hxx | 3 + {Misc => Lib/Misc}/CREDITS | 0 {Misc => Lib/Misc}/Makefile.am | 0 {Misc => Lib/Misc}/fgstream.cxx | 3 + {Misc => Lib/Misc}/fgstream.hxx | 3 + {Misc => Lib/Misc}/stopwatch.hxx | 3 + {Misc => Lib/Misc}/strutils.cxx | 3 + {Misc => Lib/Misc}/strutils.hxx | 3 + {Misc => Lib/Misc}/zfstream.cxx | 3 + {Misc => Lib/Misc}/zfstream.hxx | 3 + {Serial => Lib/Serial}/Makefile.am | 0 {Serial => Lib/Serial}/serial.cxx | 3 + {Serial => Lib/Serial}/serial.hxx | 3 + {Serial => Lib/Serial}/testserial.cxx | 0 {XGL => Lib/XGL}/Makefile.am | 0 {XGL => Lib/XGL}/xgl.c | 0 {XGL => Lib/XGL}/xgl.h | 0 {XGL => Lib/XGL}/xglUtils.c | 0 PUI/Makefile.am | 24 - PUI/complex.cxx | 332 ------ PUI/pu.cxx | 332 ------ PUI/pu.h | 805 --------------- PUI/puBox.cxx | 319 ------ PUI/puButton.cxx | 61 -- PUI/puButtonBox.cxx | 100 -- PUI/puDialogBox.cxx | 4 - PUI/puFrame.cxx | 30 - PUI/puInput.cxx | 226 ----- PUI/puInterface.cxx | 268 ----- PUI/puLocal.h | 19 - PUI/puMenuBar.cxx | 83 -- PUI/puObject.cxx | 222 ---- PUI/puOneShot.cxx | 9 - PUI/puPopup.cxx | 3 - PUI/puPopupMenu.cxx | 175 ---- PUI/puSlider.cxx | 107 -- PUI/puText.cxx | 8 - example/Makefile.am | 17 - example/example.cxx | 89 -- src/Makefile.am | 10 - src/sl.h | 629 ------------ src/slDSP.cxx | 669 ------------ src/slEnvelope.cxx | 170 ---- src/slPortability.h | 71 -- src/slSample.cxx | 505 --------- src/slSamplePlayer.cxx | 188 ---- src/slScheduler.cxx | 253 ----- src/sm.h | 89 -- src/smMixer.cxx | 256 ----- zlib/ChangeLog | 471 --------- zlib/INDEX | 86 -- zlib/Makefile.am | 31 - zlib/README | 148 --- zlib/adler32.c | 48 - zlib/algorithm.txt | 213 ---- zlib/compress.c | 68 -- zlib/crc32.c | 162 --- zlib/deflate.c | 1350 ------------------------- zlib/deflate.h | 318 ------ zlib/descrip.mms | 48 - zlib/example.c | 556 ---------- zlib/gzio.c | 875 ---------------- zlib/infblock.c | 398 -------- zlib/infblock.h | 39 - zlib/infcodes.c | 257 ----- zlib/infcodes.h | 27 - zlib/inffast.c | 170 ---- zlib/inffast.h | 17 - zlib/inffixed.h | 151 --- zlib/inflate.c | 366 ------- zlib/inftrees.c | 455 --------- zlib/inftrees.h | 58 -- zlib/infutil.c | 87 -- zlib/infutil.h | 98 -- zlib/maketree.c | 85 -- zlib/minigzip.c | 320 ------ zlib/trees.c | 1214 ---------------------- zlib/trees.h | 128 --- zlib/uncompr.c | 58 -- zlib/zconf.h | 279 ----- zlib/zlib.3 | 107 -- zlib/zlib.h | 893 ---------------- zlib/zutil.c | 225 ----- zlib/zutil.h | 220 ---- 136 files changed, 142 insertions(+), 16521 deletions(-) delete mode 100644 Audio/CHANGES delete mode 100644 Audio/Makefile.am delete mode 100644 Audio/NOTICE delete mode 100644 Audio/README delete mode 100644 Audio/README.freebsd delete mode 100644 Audio/README.linux delete mode 100644 Audio/README.openbsd delete mode 100644 Audio/README.sgi delete mode 100644 Audio/README.unix delete mode 100644 Audio/README.win delete mode 100644 CVSROOT/checkoutlist delete mode 100644 CVSROOT/commitinfo delete mode 100644 CVSROOT/cvswrappers delete mode 100644 CVSROOT/editinfo delete mode 100644 CVSROOT/loginfo delete mode 100644 CVSROOT/modules delete mode 100644 CVSROOT/notify delete mode 100644 CVSROOT/rcsinfo delete mode 100644 CVSROOT/taginfo rename {Bucket => Lib/Bucket}/Makefile.am (100%) rename {Bucket => Lib/Bucket}/newbucket.cxx (98%) rename {Bucket => Lib/Bucket}/newbucket.hxx (99%) rename {Bucket => Lib/Bucket}/testbucket.cxx (100%) rename {Debug => Lib/Debug}/Makefile.am (100%) rename {Debug => Lib/Debug}/debug_types.h (100%) rename {Debug => Lib/Debug}/fg_debug.c (98%) rename {Debug => Lib/Debug}/fg_debug.h (100%) rename {Debug => Lib/Debug}/logstream.cxx (96%) rename {Debug => Lib/Debug}/logstream.hxx (98%) rename {Debug => Lib/Debug}/logtest.cxx (100%) rename {Math => Lib/Math}/MAT3geom.c (100%) rename {Math => Lib/Math}/MAT3inv.c (100%) rename {Math => Lib/Math}/MAT3mat.c (100%) rename {Math => Lib/Math}/MAT3vec.c (100%) rename {Math => Lib/Math}/Makefile.am (100%) rename {Math => Lib/Math}/fg_geodesy.cxx (98%) rename {Math => Lib/Math}/fg_geodesy.hxx (98%) rename {Math => Lib/Math}/fg_random.c (98%) rename {Math => Lib/Math}/fg_random.h (96%) create mode 100644 Lib/Math/geotest.c rename {Math => Lib/Math}/interpolater.cxx (98%) rename {Math => Lib/Math}/interpolater.hxx (97%) create mode 100644 Lib/Math/inttest.cxx rename {Math => Lib/Math}/leastsqs.cxx (98%) rename {Math => Lib/Math}/leastsqs.hxx (97%) rename {Math => Lib/Math}/mat3.h (100%) rename {Math => Lib/Math}/mat3defs.h (100%) rename {Math => Lib/Math}/mat3err.h (100%) rename {Math => Lib/Math}/point3d.hxx (99%) rename {Math => Lib/Math}/polar3d.cxx (98%) rename {Math => Lib/Math}/polar3d.hxx (98%) rename {Math => Lib/Math}/vector.cxx (98%) rename {Math => Lib/Math}/vector.hxx (97%) rename {Misc => Lib/Misc}/CREDITS (100%) rename {Misc => Lib/Misc}/Makefile.am (100%) rename {Misc => Lib/Misc}/fgstream.cxx (98%) rename {Misc => Lib/Misc}/fgstream.hxx (98%) rename {Misc => Lib/Misc}/stopwatch.hxx (98%) rename {Misc => Lib/Misc}/strutils.cxx (96%) rename {Misc => Lib/Misc}/strutils.hxx (97%) rename {Misc => Lib/Misc}/zfstream.cxx (98%) rename {Misc => Lib/Misc}/zfstream.hxx (98%) rename {Serial => Lib/Serial}/Makefile.am (100%) rename {Serial => Lib/Serial}/serial.cxx (99%) rename {Serial => Lib/Serial}/serial.hxx (97%) rename {Serial => Lib/Serial}/testserial.cxx (100%) rename {XGL => Lib/XGL}/Makefile.am (100%) rename {XGL => Lib/XGL}/xgl.c (100%) rename {XGL => Lib/XGL}/xgl.h (100%) rename {XGL => Lib/XGL}/xglUtils.c (100%) delete mode 100644 PUI/Makefile.am delete mode 100644 PUI/complex.cxx delete mode 100644 PUI/pu.cxx delete mode 100644 PUI/pu.h delete mode 100644 PUI/puBox.cxx delete mode 100644 PUI/puButton.cxx delete mode 100644 PUI/puButtonBox.cxx delete mode 100644 PUI/puDialogBox.cxx delete mode 100644 PUI/puFrame.cxx delete mode 100644 PUI/puInput.cxx delete mode 100644 PUI/puInterface.cxx delete mode 100644 PUI/puLocal.h delete mode 100644 PUI/puMenuBar.cxx delete mode 100644 PUI/puObject.cxx delete mode 100644 PUI/puOneShot.cxx delete mode 100644 PUI/puPopup.cxx delete mode 100644 PUI/puPopupMenu.cxx delete mode 100644 PUI/puSlider.cxx delete mode 100644 PUI/puText.cxx delete mode 100644 example/Makefile.am delete mode 100644 example/example.cxx delete mode 100644 src/Makefile.am delete mode 100644 src/sl.h delete mode 100644 src/slDSP.cxx delete mode 100644 src/slEnvelope.cxx delete mode 100644 src/slPortability.h delete mode 100644 src/slSample.cxx delete mode 100644 src/slSamplePlayer.cxx delete mode 100644 src/slScheduler.cxx delete mode 100644 src/sm.h delete mode 100644 src/smMixer.cxx delete mode 100644 zlib/ChangeLog delete mode 100644 zlib/INDEX delete mode 100644 zlib/Makefile.am delete mode 100644 zlib/README delete mode 100644 zlib/adler32.c delete mode 100644 zlib/algorithm.txt delete mode 100644 zlib/compress.c delete mode 100644 zlib/crc32.c delete mode 100644 zlib/deflate.c delete mode 100644 zlib/deflate.h delete mode 100644 zlib/descrip.mms delete mode 100644 zlib/example.c delete mode 100644 zlib/gzio.c delete mode 100644 zlib/infblock.c delete mode 100644 zlib/infblock.h delete mode 100644 zlib/infcodes.c delete mode 100644 zlib/infcodes.h delete mode 100644 zlib/inffast.c delete mode 100644 zlib/inffast.h delete mode 100644 zlib/inffixed.h delete mode 100644 zlib/inflate.c delete mode 100644 zlib/inftrees.c delete mode 100644 zlib/inftrees.h delete mode 100644 zlib/infutil.c delete mode 100644 zlib/infutil.h delete mode 100644 zlib/maketree.c delete mode 100644 zlib/minigzip.c delete mode 100644 zlib/trees.c delete mode 100644 zlib/trees.h delete mode 100644 zlib/uncompr.c delete mode 100644 zlib/zconf.h delete mode 100644 zlib/zlib.3 delete mode 100644 zlib/zlib.h delete mode 100644 zlib/zutil.c delete mode 100644 zlib/zutil.h diff --git a/Audio/CHANGES b/Audio/CHANGES deleted file mode 100644 index c3601071..00000000 --- a/Audio/CHANGES +++ /dev/null @@ -1,139 +0,0 @@ - -/**********************************************\ -* * -* W A R N I N G * -* * -* This file is now kept in reverse chronolog- * -* ical order so recent changes are now at the * -* top. * -* * -\**********************************************/ - -* 28th Sept 1889 -- Fixed a bug associated with exiting the - program with sounds still playing. - Fixed a bug associated with using the - package in the absence of a sound card. - Added a new member function "working" - which is the opposite of "not_working", - (as demanded by a bunch of rabid optimists)! - Fixed a couple of typo's in the manual. - -* 23rd Sept 1998 -- The Good News: Finally got around to - getting the pitch envelope working. (Hooray) - The Bad News: This costs quite a bit in - performance - and it was a MAJOR rewrite - of significant parts of the internals, - so we may need some bug fixes. - This version is 0.5 - -* 7th July 1998 -- Fixed some error checking in slSample.cxx and - a missing declaration in sl.h - -* 6th July 1998 -- Fixed an initialisation problem when - slScheduler was not a static/global. - - Tom Knienieder's port to SGI/IRIX is now - working, documentation updated to reflect that. - -* 16th June 1998 -- Added some slPortability.h fixes for - FreeBSD and the Cygnus WIN32 compiler. - Many thanks to Curt. - -* 14th June 1998 -- Tom Knienieder's port to OpenBSD is now - working, documentation updated to reflect that. - Tom's improved Makefiles included, also some - example sound samples that were accidentally - left out of the release are now present. - A couple of typo's in the WIN32 section - have been fixed. The top level Makefile - now requires you to type 'make linux', - 'make win' or 'make openbsd'. - -* 13th June 1998 -- Tom Knienieder's port to WIN32 engine is now - working, documentation updated to reflect that - revised status. Some default constructor parameters - have changed, slDSP no longer supports setRate/setBps/setStereo. - You now have to delete the slDSP and recreate it with - new parameters. This makes porting a little easier. - 'sound_test' renamed 'example'. - -* 7th June 1998 -- Volume envelopes (and inverse volume envelopes) - now work correctly. Pan envelopes won't work - until stereo is implemented. Pitch and filter - envelopes turn out to be a major pain to implement - with the present slSceduler/slSamplePlayer interface, - so some significant internal changes are to be - expected. - - Changed the CHANGES file to be in reverse - chronological order. - - This version is officially SL v0.3 (beta) - -* 3rd June 1998 -- Moved sample program and it's data files into - 'example', moved documents into 'doc' and sources - into 'src'. Final library goes into 'lib'. - - The entire preempting mechanism was broken - - now it's fixed. - - Added a callback mechanism that allows - applications to know when a sound - loops, finishes playing, is pre-empted, etc. - - New mechanisms added to stop/pause/resume a - playing sample. - - All the documentation - and some of the code - - for slEnvelopes has been added, they don't - work yet - so don't bother with them for now. - - Made some code a little more bullet-proof. - slSample's are now reference-counted so you - can't accidentally delete one while it's - playing without getting a FATAL error. - -* 2nd June 1998 -- Fixed bug in initialisation that prevented SL - from functioning correctly in the case were there - is no sound card present. - - This version is officially SL v0.2 (beta) - -* 1st June 1998 -- Split library into two parts - libsm and - libsl. libsm contains only the Mixer class - since it is likely to be hard to port to - a lot of non-OSS systems - and most programs - won't need it anyway. Hence the documentation - has blossomed into three files and all the - 'slMixer' references have turned into 'smMixer'. - Also, I finally got a hold of the OSS documentation, - which is a lot more complete - and straightened - me out on a few points. slDSP has changed - (internally) somewhat as a result and in particular, - you can no longer mess with the sampling rate, - stereo and bps settings after the slDSP or - slScheduler has been created. This also allows the - scheduler to enforce it's rule about only mono/8bps - operations. - - I also added an 'autoMatch' function to the slSample - class to automagically match incoming samples to the - current slDSP/slScheduler. This makes using the library - a lot less painful and error-prone. - - This version is officially SL v0.1 (beta) - - We need a better name! - -* 30th May 1998 -- Almost total rewrite, library can now - play multiple sounds without interruption, - supports '.WAV' and '.AU' file formats as - well as raw binary files. Able to copy with - much shorter safetyMargin on sound buffers, - and play without using the 'stop' call. - All class and external symbols now begin - with 'sl' or 'SL'. HTML documentation now - available. - -* 27th May 1998 -- First hack - diff --git a/Audio/Makefile.am b/Audio/Makefile.am deleted file mode 100644 index 835577f8..00000000 --- a/Audio/Makefile.am +++ /dev/null @@ -1 +0,0 @@ -SUBDIRS = src example diff --git a/Audio/NOTICE b/Audio/NOTICE deleted file mode 100644 index ba95093a..00000000 --- a/Audio/NOTICE +++ /dev/null @@ -1,9 +0,0 @@ -NOTICE: This Sound Library (SL) distribution contains source code that is -placed into the public domain without copyright. These programs are freely -distributable without licensing fees. These programs are provided without -guarantee or warrantee expressed or implied. - -If you use SL in a commercial or shareware product, it would be nice if you -gave credit where it is due. If you make any modifications or improvements -to SL, I would greatly appreciate a copy of the improved code. - diff --git a/Audio/README b/Audio/README deleted file mode 100644 index 8bf6b4da..00000000 --- a/Audio/README +++ /dev/null @@ -1,9 +0,0 @@ - -Hi! - - This is the fifth prototype of Steve's 'SL' sound library. - - Check out 'CHANGES' and the new HTML documentation. - -Steve - diff --git a/Audio/README.freebsd b/Audio/README.freebsd deleted file mode 100644 index 540c00e4..00000000 --- a/Audio/README.freebsd +++ /dev/null @@ -1,13 +0,0 @@ - -Building SL for Linux. -~~~~~~~~~~~~~~~~~~~~~~ - - % make freebsd - % su root - % make install - -...that's all folks. - -Header files go into /usr/include/SL (analogous to /usr/include/GL for graphics) -Library file(s) go into /usr/lib - diff --git a/Audio/README.linux b/Audio/README.linux deleted file mode 100644 index 7df00e8f..00000000 --- a/Audio/README.linux +++ /dev/null @@ -1,13 +0,0 @@ - -Building SL for Linux. -~~~~~~~~~~~~~~~~~~~~~~ - - % make linux - % su root - % make install - -...that's all folks. - -Header files go into /usr/include/SL (analogous to /usr/include/GL for graphics) -Library file(s) go into /usr/lib - diff --git a/Audio/README.openbsd b/Audio/README.openbsd deleted file mode 100644 index 9ef788f3..00000000 --- a/Audio/README.openbsd +++ /dev/null @@ -1,13 +0,0 @@ - -Building SL for OpenBSD. -~~~~~~~~~~~~~~~~~~~~~~~~ - - % make openbsd - % su root - % make install - -...that's all folks. - -Header files go into /usr/include/SL (analogous to /usr/include/GL for graphics) -Library file(s) go into /usr/lib - diff --git a/Audio/README.sgi b/Audio/README.sgi deleted file mode 100644 index c1c52e15..00000000 --- a/Audio/README.sgi +++ /dev/null @@ -1,27 +0,0 @@ - -Building SL for SGI. -~~~~~~~~~~~~~~~~~~~~~~ - -There are two options, depending on whether you want to use GCC or -the standard SGI C++ compiler. - -GNU G++: - - % make sgigcc - % su root - % make install - -SGI C++: - - % make sgi - % su root - % make install - -...that's all folks. - -Header files go into /usr/include/SL (analogous to /usr/include/GL for graphics) -Library file(s) go into /usr/lib - -When you link, be sure to include to -laudio - - diff --git a/Audio/README.unix b/Audio/README.unix deleted file mode 100644 index 771e856d..00000000 --- a/Audio/README.unix +++ /dev/null @@ -1,20 +0,0 @@ -Building SL for UNIX -~~~~~~~~~~~~~~~~~~~~ - -If your UNIX box is Linux or OpenBSD then -check out README.linux or README.openbsd. - -If your UNIX box supports OSS (the Open -Sound System) then in principal, you should -only need to type: - - % make oss - % su root - % make install - -...however, your milage may vary. If you succeed -in getting a non-Linux, non-OpenBSD version to -work, I'd like to hear about it. - - Steve Baker - diff --git a/Audio/README.win b/Audio/README.win deleted file mode 100644 index a9d52822..00000000 --- a/Audio/README.win +++ /dev/null @@ -1,15 +0,0 @@ - -Building SL for win32 (msvc) -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - C:>nmake win32 - - -don't forget to set the environment ! - -example: - -set include=c:\msdev\include; -set lib=c:\msdev\lib - -path c:\msdev\bin;c:\bin;c:\winnt;...... diff --git a/CVSROOT/checkoutlist b/CVSROOT/checkoutlist deleted file mode 100644 index b04b3501..00000000 --- a/CVSROOT/checkoutlist +++ /dev/null @@ -1,13 +0,0 @@ -# The "checkoutlist" file is used to support additional version controlled -# administrative files in $CVSROOT/CVSROOT, such as template files. -# -# The first entry on a line is a filename which will be checked out from -# the corresponding RCS file in the $CVSROOT/CVSROOT directory. -# The remainder of the line is an error message to use if the file cannot -# be checked out. -# -# File format: -# -# [] -# -# comment lines begin with '#' diff --git a/CVSROOT/commitinfo b/CVSROOT/commitinfo deleted file mode 100644 index b19e7b7a..00000000 --- a/CVSROOT/commitinfo +++ /dev/null @@ -1,15 +0,0 @@ -# The "commitinfo" file is used to control pre-commit checks. -# The filter on the right is invoked with the repository and a list -# of files to check. A non-zero exit of the filter program will -# cause the commit to be aborted. -# -# The first entry on a line is a regular expression which is tested -# against the directory that the change is being committed to, relative -# to the $CVSROOT. For the first match that is found, then the remainder -# of the line is the name of the filter to run. -# -# If the repository name does not match any of the regular expressions in this -# file, the "DEFAULT" line is used, if it is specified. -# -# If the name "ALL" appears as a regular expression it is always used -# in addition to the first matching regex or "DEFAULT". diff --git a/CVSROOT/cvswrappers b/CVSROOT/cvswrappers deleted file mode 100644 index 5047bf1c..00000000 --- a/CVSROOT/cvswrappers +++ /dev/null @@ -1,22 +0,0 @@ -# This file describes wrappers and other binary files to CVS. -# -# Wrappers are the concept where directories of files are to be -# treated as a single file. The intended use is to wrap up a wrapper -# into a single tar such that the tar archive can be treated as a -# single binary file in CVS. -# -# To solve the problem effectively, it was also necessary to be able to -# prevent rcsmerge from merging these files. -# -# Format of wrapper file ($CVSROOT/CVSROOT/cvswrappers or .cvswrappers) -# -# wildcard [option value][option value]... -# -# where option is one of -# -f from cvs filter value: path to filter -# -t to cvs filter value: path to filter -# -m update methodology value: MERGE or COPY -# -# and value is a single-quote delimited value. -# -# For example: diff --git a/CVSROOT/editinfo b/CVSROOT/editinfo deleted file mode 100644 index d78886c1..00000000 --- a/CVSROOT/editinfo +++ /dev/null @@ -1,21 +0,0 @@ -# The "editinfo" file is used to allow verification of logging -# information. It works best when a template (as specified in the -# rcsinfo file) is provided for the logging procedure. Given a -# template with locations for, a bug-id number, a list of people who -# reviewed the code before it can be checked in, and an external -# process to catalog the differences that were code reviewed, the -# following test can be applied to the code: -# -# Making sure that the entered bug-id number is correct. -# Validating that the code that was reviewed is indeed the code being -# checked in (using the bug-id number or a seperate review -# number to identify this particular code set.). -# -# If any of the above test failed, then the commit would be aborted. -# -# Actions such as mailing a copy of the report to each reviewer are -# better handled by an entry in the loginfo file. -# -# One thing that should be noted is the the ALL keyword is not -# supported. There can be only one entry that matches a given -# repository. diff --git a/CVSROOT/loginfo b/CVSROOT/loginfo deleted file mode 100644 index 226e9377..00000000 --- a/CVSROOT/loginfo +++ /dev/null @@ -1,19 +0,0 @@ -# The "loginfo" file is used to control where "cvs commit" log information is -# sent. The first entry on a line is a regular expression which is tested -# against the directory that the change is being made to, relative to the -# $CVSROOT. For the first match that is found, the remainder of the line is a -# filter program that should expect log information on its standard input -# -# If the repository name does not match any of the regular expressions in the -# first field of this file, the "DEFAULT" line is used, if it is specified. -# -# If the name "ALL" appears as a regular expression it is always used -# in addition to the first matching regex or "DEFAULT". -# -# The filter program may use one and only one "%s" modifier (ala printf). If -# such a "%s" is specified in the filter program, a brief title is included -# (as one argument, enclosed in single quotes) showing the relative directory -# name and listing the modified file names. -# -# For example: -#DEFAULT (echo ""; who am i; echo %s; date; cat) >> $CVSROOT/CVSROOT/commitlog diff --git a/CVSROOT/modules b/CVSROOT/modules deleted file mode 100644 index cb9e9efc..00000000 --- a/CVSROOT/modules +++ /dev/null @@ -1,26 +0,0 @@ -# Three different line formats are valid: -# key -a aliases... -# key [options] directory -# key [options] directory files... -# -# Where "options" are composed of: -# -i prog Run "prog" on "cvs commit" from top-level of module. -# -o prog Run "prog" on "cvs checkout" of module. -# -e prog Run "prog" on "cvs export" of module. -# -t prog Run "prog" on "cvs rtag" of module. -# -u prog Run "prog" on "cvs update" of module. -# -d dir Place module in directory "dir" instead of module name. -# -l Top-level directory only -- do not recurse. -# -# NOTE: If you change any of the "Run" options above, you'll have to -# release and re-checkout any working directories of these modules. -# -# And "directory" is a path to a directory relative to $CVSROOT. -# -# The "-a" option specifies an alias. An alias is interpreted as if -# everything on the right of the "-a" had been typed on the command line. -# -# You can encode a module within a module by using the special '&' -# character to interpose another module into the current module. This -# can be useful for creating a module that consists of many directories -# spread out over the entire source repository. diff --git a/CVSROOT/notify b/CVSROOT/notify deleted file mode 100644 index 34f0bc28..00000000 --- a/CVSROOT/notify +++ /dev/null @@ -1,12 +0,0 @@ -# The "notify" file controls where notifications from watches set by -# "cvs watch add" or "cvs edit" are sent. The first entry on a line is -# a regular expression which is tested against the directory that the -# change is being made to, relative to the $CVSROOT. If it matches, -# then the remainder of the line is a filter program that should contain -# one occurrence of %s for the user to notify, and information on its -# standard input. -# -# "ALL" or "DEFAULT" can be used in place of the regular expression. -# -# For example: -#ALL mail %s -s "CVS notification" diff --git a/CVSROOT/rcsinfo b/CVSROOT/rcsinfo deleted file mode 100644 index 49e59f4d..00000000 --- a/CVSROOT/rcsinfo +++ /dev/null @@ -1,13 +0,0 @@ -# The "rcsinfo" file is used to control templates with which the editor -# is invoked on commit and import. -# -# The first entry on a line is a regular expression which is tested -# against the directory that the change is being made to, relative to the -# $CVSROOT. For the first match that is found, then the remainder of the -# line is the name of the file that contains the template. -# -# If the repository name does not match any of the regular expressions in this -# file, the "DEFAULT" line is used, if it is specified. -# -# If the name "ALL" appears as a regular expression it is always used -# in addition to the first matching regex or "DEFAULT". diff --git a/CVSROOT/taginfo b/CVSROOT/taginfo deleted file mode 100644 index 274a46dd..00000000 --- a/CVSROOT/taginfo +++ /dev/null @@ -1,20 +0,0 @@ -# The "taginfo" file is used to control pre-tag checks. -# The filter on the right is invoked with the following arguments: -# -# $1 -- tagname -# $2 -- operation "add" for tag, "mov" for tag -F, and "del" for tag -d -# $3 -- repository -# $4-> file revision [file revision ...] -# -# A non-zero exit of the filter program will cause the tag to be aborted. -# -# The first entry on a line is a regular expression which is tested -# against the directory that the change is being committed to, relative -# to the $CVSROOT. For the first match that is found, then the remainder -# of the line is the name of the filter to run. -# -# If the repository name does not match any of the regular expressions in this -# file, the "DEFAULT" line is used, if it is specified. -# -# If the name "ALL" appears as a regular expression it is always used -# in addition to the first matching regex or "DEFAULT". diff --git a/Bucket/Makefile.am b/Lib/Bucket/Makefile.am similarity index 100% rename from Bucket/Makefile.am rename to Lib/Bucket/Makefile.am diff --git a/Bucket/newbucket.cxx b/Lib/Bucket/newbucket.cxx similarity index 98% rename from Bucket/newbucket.cxx rename to Lib/Bucket/newbucket.cxx index 2fbb32ec..b17103fb 100644 --- a/Bucket/newbucket.cxx +++ b/Lib/Bucket/newbucket.cxx @@ -146,6 +146,9 @@ void fgBucketDiff( const FGBucket& b1, const FGBucket& b2, int *dx, int *dy ) { // $Log$ +// Revision 1.1 1999/04/05 21:32:34 curt +// Initial revision +// // Revision 1.4 1999/03/27 05:34:05 curt // Elimitated some const warnings from the compiler. // diff --git a/Bucket/newbucket.hxx b/Lib/Bucket/newbucket.hxx similarity index 99% rename from Bucket/newbucket.hxx rename to Lib/Bucket/newbucket.hxx index 3ef337d4..91a19342 100644 --- a/Bucket/newbucket.hxx +++ b/Lib/Bucket/newbucket.hxx @@ -330,6 +330,9 @@ operator== ( const FGBucket& b1, const FGBucket& b2 ) // $Log$ +// Revision 1.1 1999/04/05 21:32:34 curt +// Initial revision +// // Revision 1.8 1999/03/27 05:34:06 curt // Elimitated some const warnings from the compiler. // diff --git a/Bucket/testbucket.cxx b/Lib/Bucket/testbucket.cxx similarity index 100% rename from Bucket/testbucket.cxx rename to Lib/Bucket/testbucket.cxx diff --git a/Debug/Makefile.am b/Lib/Debug/Makefile.am similarity index 100% rename from Debug/Makefile.am rename to Lib/Debug/Makefile.am diff --git a/Debug/debug_types.h b/Lib/Debug/debug_types.h similarity index 100% rename from Debug/debug_types.h rename to Lib/Debug/debug_types.h diff --git a/Debug/fg_debug.c b/Lib/Debug/fg_debug.c similarity index 98% rename from Debug/fg_debug.c rename to Lib/Debug/fg_debug.c index ca236a33..9224d9c2 100644 --- a/Debug/fg_debug.c +++ b/Lib/Debug/fg_debug.c @@ -282,9 +282,12 @@ int fgPrintf( fgDebugClass dbg_class, fgDebugPriority prio, char *fmt, ... ) { /* $Log$ -/* Revision 1.4 1998/06/01 17:49:44 curt -/* Rewrote a slightly ambiguous code fragment (contributed by Charlie Hotchkiss) +/* Revision 1.1 1999/04/05 21:32:33 curt +/* Initial revision /* + * Revision 1.4 1998/06/01 17:49:44 curt + * Rewrote a slightly ambiguous code fragment (contributed by Charlie Hotchkiss) + * * Revision 1.3 1998/05/07 23:03:54 curt * Added an entry for AUTOPILOT. * diff --git a/Debug/fg_debug.h b/Lib/Debug/fg_debug.h similarity index 100% rename from Debug/fg_debug.h rename to Lib/Debug/fg_debug.h diff --git a/Debug/logstream.cxx b/Lib/Debug/logstream.cxx similarity index 96% rename from Debug/logstream.cxx rename to Lib/Debug/logstream.cxx index 182cafda..6431f346 100644 --- a/Debug/logstream.cxx +++ b/Lib/Debug/logstream.cxx @@ -63,6 +63,9 @@ logstream::setLogLevels( fgDebugClass c, fgDebugPriority p ) } // $Log$ +// Revision 1.1 1999/04/05 21:32:33 curt +// Initial revision +// // Revision 1.2 1999/01/19 20:53:34 curt // Portability updates by Bernie Bright. // diff --git a/Debug/logstream.hxx b/Lib/Debug/logstream.hxx similarity index 98% rename from Debug/logstream.hxx rename to Lib/Debug/logstream.hxx index f79f1b88..63d7e2d1 100644 --- a/Debug/logstream.hxx +++ b/Lib/Debug/logstream.hxx @@ -212,6 +212,9 @@ fglog() #endif // _LOGSTREAM_H // $Log$ +// Revision 1.1 1999/04/05 21:32:33 curt +// Initial revision +// // Revision 1.4 1999/03/02 01:01:47 curt // Tweaks for compiling with native SGI compilers. // diff --git a/Debug/logtest.cxx b/Lib/Debug/logtest.cxx similarity index 100% rename from Debug/logtest.cxx rename to Lib/Debug/logtest.cxx diff --git a/Math/MAT3geom.c b/Lib/Math/MAT3geom.c similarity index 100% rename from Math/MAT3geom.c rename to Lib/Math/MAT3geom.c diff --git a/Math/MAT3inv.c b/Lib/Math/MAT3inv.c similarity index 100% rename from Math/MAT3inv.c rename to Lib/Math/MAT3inv.c diff --git a/Math/MAT3mat.c b/Lib/Math/MAT3mat.c similarity index 100% rename from Math/MAT3mat.c rename to Lib/Math/MAT3mat.c diff --git a/Math/MAT3vec.c b/Lib/Math/MAT3vec.c similarity index 100% rename from Math/MAT3vec.c rename to Lib/Math/MAT3vec.c diff --git a/Math/Makefile.am b/Lib/Math/Makefile.am similarity index 100% rename from Math/Makefile.am rename to Lib/Math/Makefile.am diff --git a/Math/fg_geodesy.cxx b/Lib/Math/fg_geodesy.cxx similarity index 98% rename from Math/fg_geodesy.cxx rename to Lib/Math/fg_geodesy.cxx index af10c101..4dd73be7 100644 --- a/Math/fg_geodesy.cxx +++ b/Lib/Math/fg_geodesy.cxx @@ -164,6 +164,9 @@ void fgGeodToGeoc( double lat_geod, double alt, double *sl_radius, $Header$ $Log$ +Revision 1.1 1999/04/05 21:32:33 curt +Initial revision + Revision 1.6 1999/03/02 01:01:49 curt Tweaks for compiling with native SGI compilers. @@ -256,6 +259,9 @@ Initial Flight Gear revision. // $Log$ +// Revision 1.1 1999/04/05 21:32:33 curt +// Initial revision +// // Revision 1.6 1999/03/02 01:01:49 curt // Tweaks for compiling with native SGI compilers. // diff --git a/Math/fg_geodesy.hxx b/Lib/Math/fg_geodesy.hxx similarity index 98% rename from Math/fg_geodesy.hxx rename to Lib/Math/fg_geodesy.hxx index f863d39d..8b20a22c 100644 --- a/Math/fg_geodesy.hxx +++ b/Lib/Math/fg_geodesy.hxx @@ -114,6 +114,9 @@ inline Point3D fgGeodToCart(const Point3D& geod) { $Header$ $Log$ +Revision 1.1 1999/04/05 21:32:33 curt +Initial revision + Revision 1.4 1999/01/27 04:46:15 curt Portability tweaks by Bernie Bright. @@ -193,6 +196,9 @@ Initial Flight Gear revision. // $Log$ +// Revision 1.1 1999/04/05 21:32:33 curt +// Initial revision +// // Revision 1.4 1999/01/27 04:46:15 curt // Portability tweaks by Bernie Bright. // diff --git a/Math/fg_random.c b/Lib/Math/fg_random.c similarity index 98% rename from Math/fg_random.c rename to Lib/Math/fg_random.c index 31b24be7..add3ac43 100644 --- a/Math/fg_random.c +++ b/Lib/Math/fg_random.c @@ -71,6 +71,9 @@ double fg_random(void) { // $Log$ +// Revision 1.1 1999/04/05 21:32:33 curt +// Initial revision +// // Revision 1.10 1998/11/07 19:07:03 curt // Enable release builds using the --without-logging option to the configure // script. Also a couple log message cleanups, plus some C to C++ comment diff --git a/Math/fg_random.h b/Lib/Math/fg_random.h similarity index 96% rename from Math/fg_random.h rename to Lib/Math/fg_random.h index 3ae53a05..e633ce46 100644 --- a/Math/fg_random.h +++ b/Lib/Math/fg_random.h @@ -48,6 +48,9 @@ double fg_random(void); // $Log$ +// Revision 1.1 1999/04/05 21:32:33 curt +// Initial revision +// // Revision 1.4 1998/11/07 19:07:04 curt // Enable release builds using the --without-logging option to the configure // script. Also a couple log message cleanups, plus some C to C++ comment diff --git a/Lib/Math/geotest.c b/Lib/Math/geotest.c new file mode 100644 index 00000000..cdaaec94 --- /dev/null +++ b/Lib/Math/geotest.c @@ -0,0 +1,30 @@ +#include +#include + +#include + +void +main( void ) +{ + double Lon, Alt, sl_radius; + double geodetic_Lat; + double geocentric_Lat; + + Lon = -87.75 * DEG_TO_RAD; + geodetic_Lat = 41.83 * DEG_TO_RAD; + Alt = 1.5; /* km */ + + printf("Geodetic position = (%.8f, %.8f, %.8f)\n", Lon, geodetic_Lat, Alt); + + fgGeodToGeoc( geodetic_Lat, Alt, &sl_radius, &geocentric_Lat ); + + printf("Geocentric position = (%.8f, %.8f, %.8f)\n", Lon, geocentric_Lat, + sl_radius + Alt); + printf("new sl_radius = %.8f\n", sl_radius); + + fgGeocToGeod( geocentric_Lat, sl_radius + Alt, &geodetic_Lat, + &Alt, &sl_radius ); + + printf("Geodetic position = (%.8f, %.8f, %.8f)\n", Lon, geodetic_Lat, Alt); + printf("new sl_radius = %.8f\n", sl_radius); +} diff --git a/Math/interpolater.cxx b/Lib/Math/interpolater.cxx similarity index 98% rename from Math/interpolater.cxx rename to Lib/Math/interpolater.cxx index 9aabeda2..c0ebc3f2 100644 --- a/Math/interpolater.cxx +++ b/Lib/Math/interpolater.cxx @@ -103,6 +103,9 @@ fgINTERPTABLE::~fgINTERPTABLE( void ) { // $Log$ +// Revision 1.1 1999/04/05 21:32:33 curt +// Initial revision +// // Revision 1.7 1999/02/26 22:08:03 curt // Added initial support for native SGI compilers. // diff --git a/Math/interpolater.hxx b/Lib/Math/interpolater.hxx similarity index 97% rename from Math/interpolater.hxx rename to Lib/Math/interpolater.hxx index 4260ba48..dd0adac5 100644 --- a/Math/interpolater.hxx +++ b/Lib/Math/interpolater.hxx @@ -62,6 +62,9 @@ public: // $Log$ +// Revision 1.1 1999/04/05 21:32:33 curt +// Initial revision +// // Revision 1.6 1999/03/02 01:01:50 curt // Tweaks for compiling with native SGI compilers. // diff --git a/Lib/Math/inttest.cxx b/Lib/Math/inttest.cxx new file mode 100644 index 00000000..1fbc286c --- /dev/null +++ b/Lib/Math/inttest.cxx @@ -0,0 +1,23 @@ +#include +#include + +#include "interpolater.hxx" + +main() { + fgINTERPTABLE test("test.table"); + + fgInitDebug(); + + printf("-1.0 = %.2f\n", test.interpolate(-1.0)); + printf("0.0 = %.2f\n", test.interpolate(0.0)); + printf("2.9 = %.2f\n", test.interpolate(2.9)); + printf("3.0 = %.2f\n", test.interpolate(3.0)); + printf("3.5 = %.2f\n", test.interpolate(3.5)); + printf("4.0 = %.2f\n", test.interpolate(4.0)); + printf("4.5 = %.2f\n", test.interpolate(4.5)); + printf("5.2 = %.2f\n", test.interpolate(5.2)); + printf("8.0 = %.2f\n", test.interpolate(8.0)); + printf("8.5 = %.2f\n", test.interpolate(8.5)); + printf("9.0 = %.2f\n", test.interpolate(9.0)); + printf("10.0 = %.2f\n", test.interpolate(10.0)); +} diff --git a/Math/leastsqs.cxx b/Lib/Math/leastsqs.cxx similarity index 98% rename from Math/leastsqs.cxx rename to Lib/Math/leastsqs.cxx index 28e2bd35..20fc331b 100644 --- a/Math/leastsqs.cxx +++ b/Lib/Math/leastsqs.cxx @@ -135,6 +135,9 @@ double least_squares_max_error(double *x, double *y, int n, double m, double b){ // $Log$ +// Revision 1.1 1999/04/05 21:32:33 curt +// Initial revision +// // Revision 1.1 1999/03/13 17:34:45 curt // Moved to math subdirectory. // diff --git a/Math/leastsqs.hxx b/Lib/Math/leastsqs.hxx similarity index 97% rename from Math/leastsqs.hxx rename to Lib/Math/leastsqs.hxx index d8b40c80..5e1ae461 100644 --- a/Math/leastsqs.hxx +++ b/Lib/Math/leastsqs.hxx @@ -73,6 +73,9 @@ double least_squares_max_error(double *x, double *y, int n, double m, double b); // $Log$ +// Revision 1.1 1999/04/05 21:32:33 curt +// Initial revision +// // Revision 1.1 1999/03/13 17:34:45 curt // Moved to math subdirectory. // diff --git a/Math/mat3.h b/Lib/Math/mat3.h similarity index 100% rename from Math/mat3.h rename to Lib/Math/mat3.h diff --git a/Math/mat3defs.h b/Lib/Math/mat3defs.h similarity index 100% rename from Math/mat3defs.h rename to Lib/Math/mat3defs.h diff --git a/Math/mat3err.h b/Lib/Math/mat3err.h similarity index 100% rename from Math/mat3err.h rename to Lib/Math/mat3err.h diff --git a/Math/point3d.hxx b/Lib/Math/point3d.hxx similarity index 99% rename from Math/point3d.hxx rename to Lib/Math/point3d.hxx index 97527077..d6fabc05 100644 --- a/Math/point3d.hxx +++ b/Lib/Math/point3d.hxx @@ -337,6 +337,9 @@ Point3D::distance3Dsquared(const Point3D& a ) const // $Log$ +// Revision 1.1 1999/04/05 21:32:33 curt +// Initial revision +// // Revision 1.10 1999/03/02 01:01:52 curt // Tweaks for compiling with native SGI compilers. // diff --git a/Math/polar3d.cxx b/Lib/Math/polar3d.cxx similarity index 98% rename from Math/polar3d.cxx rename to Lib/Math/polar3d.cxx index 7958a83c..45b25e21 100644 --- a/Math/polar3d.cxx +++ b/Lib/Math/polar3d.cxx @@ -61,6 +61,9 @@ double fgGeodAltFromCart(const Point3D& cp) // $Log$ +// Revision 1.1 1999/04/05 21:32:33 curt +// Initial revision +// // Revision 1.6 1999/01/27 04:46:19 curt // Portability tweaks by Bernie Bright. // diff --git a/Math/polar3d.hxx b/Lib/Math/polar3d.hxx similarity index 98% rename from Math/polar3d.hxx rename to Lib/Math/polar3d.hxx index 4118f2d2..7839a32e 100644 --- a/Math/polar3d.hxx +++ b/Lib/Math/polar3d.hxx @@ -67,6 +67,9 @@ inline Point3D fgCartToPolar3d(const Point3D& cp) { // $Log$ +// Revision 1.1 1999/04/05 21:32:33 curt +// Initial revision +// // Revision 1.5 1999/01/27 04:46:20 curt // Portability tweaks by Bernie Bright. // diff --git a/Math/vector.cxx b/Lib/Math/vector.cxx similarity index 98% rename from Math/vector.cxx rename to Lib/Math/vector.cxx index 22509cd6..c27f8c0b 100644 --- a/Math/vector.cxx +++ b/Lib/Math/vector.cxx @@ -129,6 +129,9 @@ double fgPointLineSquared(MAT3vec p, MAT3vec p0, MAT3vec d) { // $Log$ +// Revision 1.1 1999/04/05 21:32:33 curt +// Initial revision +// // Revision 1.6 1999/03/25 19:02:28 curt // Minor optimization tweaks. // diff --git a/Math/vector.hxx b/Lib/Math/vector.hxx similarity index 97% rename from Math/vector.hxx rename to Lib/Math/vector.hxx index 92e897c3..61a2ca5a 100644 --- a/Math/vector.hxx +++ b/Lib/Math/vector.hxx @@ -63,6 +63,9 @@ double fgPointLineSquared(MAT3vec p, MAT3vec p0, MAT3vec d); // $Log$ +// Revision 1.1 1999/04/05 21:32:33 curt +// Initial revision +// // Revision 1.4 1998/10/16 23:36:39 curt // c++-ifying. // diff --git a/Misc/CREDITS b/Lib/Misc/CREDITS similarity index 100% rename from Misc/CREDITS rename to Lib/Misc/CREDITS diff --git a/Misc/Makefile.am b/Lib/Misc/Makefile.am similarity index 100% rename from Misc/Makefile.am rename to Lib/Misc/Makefile.am diff --git a/Misc/fgstream.cxx b/Lib/Misc/fgstream.cxx similarity index 98% rename from Misc/fgstream.cxx rename to Lib/Misc/fgstream.cxx index b695315c..e474937f 100644 --- a/Misc/fgstream.cxx +++ b/Lib/Misc/fgstream.cxx @@ -140,6 +140,9 @@ skipcomment( istream& in ) } // $Log$ +// Revision 1.1 1999/04/05 21:32:33 curt +// Initial revision +// // Revision 1.3 1998/11/06 14:05:12 curt // More portability improvements by Bernie Bright. // diff --git a/Misc/fgstream.hxx b/Lib/Misc/fgstream.hxx similarity index 98% rename from Misc/fgstream.hxx rename to Lib/Misc/fgstream.hxx index e8b7c0bb..10007b2d 100644 --- a/Misc/fgstream.hxx +++ b/Lib/Misc/fgstream.hxx @@ -100,6 +100,9 @@ istream& skipcomment( istream& in ); #endif /* _FGSTREAM_HXX */ // $Log$ +// Revision 1.1 1999/04/05 21:32:33 curt +// Initial revision +// // Revision 1.9 1999/03/27 14:04:25 curt // Added is_open() so we can check if the open() succeeded. // diff --git a/Misc/stopwatch.hxx b/Lib/Misc/stopwatch.hxx similarity index 98% rename from Misc/stopwatch.hxx rename to Lib/Misc/stopwatch.hxx index d3bcfade..2b40bba1 100644 --- a/Misc/stopwatch.hxx +++ b/Lib/Misc/stopwatch.hxx @@ -25,6 +25,9 @@ * *************************************************************************** * $Log$ + * Revision 1.1 1999/04/05 21:32:33 curt + * Initial revision + * * Revision 1.3 1998/11/20 01:01:03 curt * FreeBSD support. * diff --git a/Misc/strutils.cxx b/Lib/Misc/strutils.cxx similarity index 96% rename from Misc/strutils.cxx rename to Lib/Misc/strutils.cxx index 2f23d83f..c9a34825 100644 --- a/Misc/strutils.cxx +++ b/Lib/Misc/strutils.cxx @@ -71,6 +71,9 @@ trim( const string& s, const string& trimmings ) } // $Log$ +// Revision 1.1 1999/04/05 21:32:33 curt +// Initial revision +// // Revision 1.2 1998/10/18 01:17:15 curt // Point3D tweaks. // diff --git a/Misc/strutils.hxx b/Lib/Misc/strutils.hxx similarity index 97% rename from Misc/strutils.hxx rename to Lib/Misc/strutils.hxx index b2c47a77..291df5d1 100644 --- a/Misc/strutils.hxx +++ b/Lib/Misc/strutils.hxx @@ -64,6 +64,9 @@ atoi( const string& str ) #endif // STRUTILS_H // $Log$ +// Revision 1.1 1999/04/05 21:32:33 curt +// Initial revision +// // Revision 1.6 1999/03/02 01:01:56 curt // Tweaks for compiling with native SGI compilers. // diff --git a/Misc/zfstream.cxx b/Lib/Misc/zfstream.cxx similarity index 98% rename from Misc/zfstream.cxx rename to Lib/Misc/zfstream.cxx index 38387cb8..9c4d213c 100644 --- a/Misc/zfstream.cxx +++ b/Lib/Misc/zfstream.cxx @@ -309,6 +309,9 @@ gzifstream::close() #endif // $Log$ +// Revision 1.1 1999/04/05 21:32:33 curt +// Initial revision +// // Revision 1.3 1999/01/19 20:41:48 curt // Portability updates contributed by Bernie Bright. // diff --git a/Misc/zfstream.hxx b/Lib/Misc/zfstream.hxx similarity index 98% rename from Misc/zfstream.hxx rename to Lib/Misc/zfstream.hxx index 71439345..1c081aab 100644 --- a/Misc/zfstream.hxx +++ b/Lib/Misc/zfstream.hxx @@ -154,6 +154,9 @@ struct gzifstream_base #endif // _zfstream_hxx // $Log$ +// Revision 1.1 1999/04/05 21:32:33 curt +// Initial revision +// // Revision 1.9 1999/03/08 22:00:12 curt // Tweak for native SGI compilers. // diff --git a/Serial/Makefile.am b/Lib/Serial/Makefile.am similarity index 100% rename from Serial/Makefile.am rename to Lib/Serial/Makefile.am diff --git a/Serial/serial.cxx b/Lib/Serial/serial.cxx similarity index 99% rename from Serial/serial.cxx rename to Lib/Serial/serial.cxx index ed580f8a..15527b3e 100644 --- a/Serial/serial.cxx +++ b/Lib/Serial/serial.cxx @@ -336,6 +336,9 @@ int fgSERIAL::write_port(const string& value) { // $Log$ +// Revision 1.1 1999/04/05 21:32:34 curt +// Initial revision +// // Revision 1.9 1999/02/02 20:13:23 curt // MSVC++ portability changes by Bernie Bright: // diff --git a/Serial/serial.hxx b/Lib/Serial/serial.hxx similarity index 97% rename from Serial/serial.hxx rename to Lib/Serial/serial.hxx index 3b2c60b6..6f763bce 100644 --- a/Serial/serial.hxx +++ b/Lib/Serial/serial.hxx @@ -80,6 +80,9 @@ public: // $Log$ +// Revision 1.1 1999/04/05 21:32:34 curt +// Initial revision +// // Revision 1.5 1999/03/02 01:01:58 curt // Tweaks for compiling with native SGI compilers. // diff --git a/Serial/testserial.cxx b/Lib/Serial/testserial.cxx similarity index 100% rename from Serial/testserial.cxx rename to Lib/Serial/testserial.cxx diff --git a/XGL/Makefile.am b/Lib/XGL/Makefile.am similarity index 100% rename from XGL/Makefile.am rename to Lib/XGL/Makefile.am diff --git a/XGL/xgl.c b/Lib/XGL/xgl.c similarity index 100% rename from XGL/xgl.c rename to Lib/XGL/xgl.c diff --git a/XGL/xgl.h b/Lib/XGL/xgl.h similarity index 100% rename from XGL/xgl.h rename to Lib/XGL/xgl.h diff --git a/XGL/xglUtils.c b/Lib/XGL/xglUtils.c similarity index 100% rename from XGL/xglUtils.c rename to Lib/XGL/xglUtils.c diff --git a/PUI/Makefile.am b/PUI/Makefile.am deleted file mode 100644 index aa38a0cd..00000000 --- a/PUI/Makefile.am +++ /dev/null @@ -1,24 +0,0 @@ -noinst_LIBRARIES = libPUI.a - -EXTRA_DIST = complex.cxx simple.cxx - -libPUI_a_SOURCES = \ - pu.h puLocal.h \ - pu.cxx \ - puBox.cxx \ - puButton.cxx \ - puButtonBox.cxx \ - puDialogBox.cxx \ - puFrame.cxx \ - puInput.cxx \ - puInterface.cxx \ - puMenuBar.cxx \ - puObject.cxx \ - puOneShot.cxx \ - puPopup.cxx \ - puPopupMenu.cxx \ - puSlider.cxx \ - puText.cxx - -INCLUDES += -I$(top_builddir) - diff --git a/PUI/complex.cxx b/PUI/complex.cxx deleted file mode 100644 index 6c5d93a7..00000000 --- a/PUI/complex.cxx +++ /dev/null @@ -1,332 +0,0 @@ -#include -#include -#include -#include -#ifdef WIN32 -#include -#else -#include -#endif -#include -#include -#include "pu.h" - -/***********************************\ -* * -* These are the PUI widget pointers * -* * -\***********************************/ - -puMenuBar *main_menu_bar ; -puButton *hide_menu_button ; -puDialogBox *dialog_box ; -puText *dialog_box_message ; -puOneShot *dialog_box_ok_button ; -puText *timer_text ; -puSlider *rspeedSlider; - - -/***********************************\ -* * -* This is a generic tumbling cube * -* * -\***********************************/ - -GLfloat light_diffuse [] = {0.0, 1.0, 0.0, 1.0} ; /* Red diffuse light. */ -GLfloat light_position[] = {1.0, 1.0, 1.0, 0.0} ; /* Infinite light location. */ - -GLfloat cube_n[6][3] = /* Normals */ -{ - {-1.0, 0.0, 0.0}, {0.0, 1.0, 0.0}, {1.0, 0.0, 0.0}, - { 0.0,-1.0, 0.0}, {0.0, 0.0, 1.0}, {0.0, 0.0,-1.0} -} ; - -GLint cube_i[6][4] = /* Vertex indices */ -{ - {0, 1, 2, 3}, {3, 2, 6, 7}, {7, 6, 5, 4}, - {4, 5, 1, 0}, {5, 6, 2, 1}, {7, 4, 0, 3} -} ; - -GLfloat cube_v[8][3] = /* Vertices */ -{ - {-1.0,-1.0, 1.0}, {-1.0,-1.0,-1.0}, {-1.0, 1.0,-1.0}, {-1.0, 1.0, 1.0}, - { 1.0,-1.0, 1.0}, { 1.0,-1.0,-1.0}, { 1.0, 1.0,-1.0}, { 1.0, 1.0, 1.0} -} ; - - -static int firsttime; - -void drawCube (void) -{ - - if ( firsttime ) - { - /* - Deliberately do this only once - it's a better test of - PUI's attempts to leave the OpenGL state undisturbed - */ - - firsttime = FALSE ; - glLightfv ( GL_LIGHT0, GL_DIFFUSE , light_diffuse ) ; - glLightfv ( GL_LIGHT0, GL_POSITION, light_position ) ; - glEnable ( GL_LIGHT0 ) ; - glEnable ( GL_LIGHTING ) ; - glEnable ( GL_DEPTH_TEST ) ; - glMatrixMode ( GL_PROJECTION ) ; - gluPerspective ( 40.0, 1.0, 1.0, 10.0 ) ; - glMatrixMode ( GL_MODELVIEW ) ; - gluLookAt ( 0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0 ) ; - glTranslatef ( 0.0, 0.0, -1.0 ) ; - glRotatef ( 60.0, 1.0, 0.0, 0.0 ) ; - } - - glCullFace ( GL_FRONT ) ; - glEnable ( GL_CULL_FACE ) ; - // glRotatef ( 1.0f, 0.0, 0.0, 1.0 ) ; /* Tumble that cube! */ - - glBegin ( GL_QUADS ) ; - - for ( int i = 0 ; i < 6 ; i++ ) - { - glNormal3fv ( &cube_n[i][0] ) ; - glVertex3fv ( cube_v[cube_i[i][0]] ) ; glVertex3fv ( cube_v[cube_i[i][1]] ) ; - glVertex3fv ( cube_v[cube_i[i][2]] ) ; glVertex3fv ( cube_v[cube_i[i][3]] ) ; - } - - glEnd () ; -} - -/********************************\ -* * -* End of cube renderer in OpenGL * -* * -\********************************/ - - -/**************************************\ -* * -* These three functions capture mouse * -* and keystrokes (special and mundane) * -* from GLUT and pass them on to PUI. * -* * -\**************************************/ - -static void specialfn ( int key, int, int ) -{ - puKeyboard ( key + PU_KEY_GLUT_SPECIAL_OFFSET, PU_DOWN ) ; - glutPostRedisplay () ; -} - -static void keyfn ( unsigned char key, int, int ) -{ - puKeyboard ( key, PU_DOWN ) ; - glutPostRedisplay () ; -} - -static void motionfn ( int x, int y ) -{ - puMouse ( x, y ) ; - glutPostRedisplay () ; -} - -static void mousefn ( int button, int updown, int x, int y ) -{ - puMouse ( button, updown, x, y ) ; - glutPostRedisplay () ; -} - -/**************************************\ -* * -* This function redisplays the PUI and * -* the tumbling cube, flips the double * -* buffer and then asks GLUT to post a * -* redisplay command - so we re-render * -* at maximum rate. * -* * -\**************************************/ - -static void displayfn (void) -{ - /* Clear the screen */ - - glClearColor ( 0.0, 0.0, 0.0, 1.0 ) ; - glClear ( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ) ; - - /* Draw the tumbling cube */ - - float val ; rspeedSlider->getValue ( &val ) ; - - glRotatef( 4*val, 15.0, 10.0 , 5.0 ); - - drawCube () ; - - /* Update the 'timer' */ - - time_t t = time ( NULL ) ; - timer_text -> setLabel ( ctime ( & t ) ) ; - - /* Make PUI redraw */ - - puDisplay () ; - - /* Off we go again... */ - - glutSwapBuffers () ; - glutPostRedisplay () ; -} - - -/***********************************\ -* * -* Here are the PUI widget callback * -* functions. * -* * -\***********************************/ - -void hide_menu_cb ( puObject *cb ) -{ - if ( cb -> getValue () ) - { - main_menu_bar -> reveal () ; - hide_menu_button->setLegend ( "Hide Menu" ) ; - } - else - { - main_menu_bar -> hide () ; - hide_menu_button->setLegend ( "Show Menu" ) ; - } -} - - -void go_away_cb ( puObject * ) -{ - /* - Delete the dialog box when its 'OK' button is pressed. - - This seems to crash on MSVC compilers - probably because - I delete dialog_box - whose member function is calling - this function. Hence we return to something that is - in a distinctly 'iffy' state. - */ - - delete dialog_box ; - dialog_box = NULL ; -} - -void mk_dialog ( char *txt ) -{ - dialog_box = new puDialogBox ( 150, 50 ) ; - { - new puFrame ( 0, 0, 400, 100 ) ; - dialog_box_message = new puText ( 10, 70 ) ; - dialog_box_message -> setLabel ( txt ) ; - dialog_box_ok_button = new puOneShot ( 180, 10, 240, 50 ) ; - dialog_box_ok_button -> setLegend ( "OK" ) ; - dialog_box_ok_button -> makeReturnDefault ( TRUE ) ; - dialog_box_ok_button -> setCallback ( go_away_cb ) ; - } - dialog_box -> close () ; - dialog_box -> reveal () ; -} - -void ni_cb ( puObject * ) -{ - mk_dialog ( "Sorry, that function isn't implemented" ) ; -} - -void about_cb ( puObject * ) -{ - mk_dialog ( "This is the PUI 'complex' program" ) ; -} - -void help_cb ( puObject * ) -{ - mk_dialog ( "Sorry, no help is available for this demo" ) ; -} - -void edit_cb ( puObject * ) -{ -} - -void exit_cb ( puObject * ) -{ - fprintf ( stderr, "Exiting PUI demo program.\n" ) ; - exit ( 1 ) ; -} - -/* Menu bar entries: */ - -char *file_submenu [] = { "Exit", "Close", "--------", "Print", "--------", "Save", "New", NULL } ; -puCallback file_submenu_cb [] = { exit_cb, exit_cb, NULL, ni_cb , NULL, ni_cb, ni_cb, NULL } ; - -char *edit_submenu [] = { "Edit text", NULL } ; -puCallback edit_submenu_cb [] = { edit_cb, NULL } ; - -char *help_submenu [] = { "About...", "Help", NULL } ; -puCallback help_submenu_cb [] = { about_cb, help_cb, NULL } ; - - -void sliderCB( puObject *sliderObj) -{ - glutPostRedisplay(); -} - -int main ( int argc, char **argv ) -{ - firsttime = TRUE; - -#ifdef VOODOO - glutInitWindowPosition( 0, 0 ) ; -#endif - glutInitWindowSize ( 640, 480 ) ; - glutInit ( &argc, argv ) ; - glutInitDisplayMode ( GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH ) ; - glutCreateWindow ( "Complex PUI Application" ) ; - glutDisplayFunc ( displayfn ) ; - glutKeyboardFunc ( keyfn ) ; - glutSpecialFunc ( specialfn ) ; - glutMouseFunc ( mousefn ) ; - glutMotionFunc ( motionfn ) ; - glutPassiveMotionFunc ( motionfn ) ; - glutIdleFunc ( displayfn ) ; - - puInit () ; - -#ifdef VOODOO - puShowCursor () ; -#endif - - puSetDefaultStyle ( PUSTYLE_SMALL_SHADED ) ; - puSetDefaultColourScheme ( 0.8, 0.8, 0.8 ) ; - - timer_text = new puText ( 300, 10 ) ; - timer_text -> setColour ( PUCOL_LABEL, 1.0, 1.0, 1.0 ) ; - - /* Make a button to hide the menu bar */ - - hide_menu_button = new puButton ( 10, 10, 150, 50 ) ; - hide_menu_button->setValue ( TRUE ) ; - hide_menu_button->setLegend ( "Hide Menu" ) ; - hide_menu_button->setCallback ( hide_menu_cb ) ; - hide_menu_button->makeReturnDefault ( TRUE ) ; - - /* Make the menu bar */ - - main_menu_bar = new puMenuBar () ; - { - main_menu_bar -> add_submenu ( "File", file_submenu, file_submenu_cb ) ; - main_menu_bar -> add_submenu ( "Edit", edit_submenu, edit_submenu_cb ) ; - main_menu_bar -> add_submenu ( "Help", help_submenu, help_submenu_cb ) ; - } - main_menu_bar -> close () ; - - rspeedSlider = new puSlider (20,80,150,TRUE); - rspeedSlider->setDelta(0.1); - rspeedSlider->setCBMode( PUSLIDER_DELTA ); - rspeedSlider->setCallback(sliderCB); - - glutMainLoop () ; - return 0 ; -} - - diff --git a/PUI/pu.cxx b/PUI/pu.cxx deleted file mode 100644 index 5e47cf05..00000000 --- a/PUI/pu.cxx +++ /dev/null @@ -1,332 +0,0 @@ - -#include "puLocal.h" - -#ifdef PU_NOT_USING_GLUT -#include -#include -#endif - -#define PU_STRING_X_FUDGE 6 -#define PU_STRING_Y_FUDGE 6 - -int puRefresh = TRUE ; - -#ifdef PU_NOT_USING_GLUT - -static int puWindowWidth = 400 ; -static int puWindowHeight = 400 ; - -int puGetWindowHeight () { return puWindowHeight ; } -int puGetWindowWidth () { return puWindowWidth ; } - -void puSetWindowSize ( int width, int height ) -{ - puWindowWidth = width ; - puWindowHeight = height ; -} - -static int fontBase = 0; -static int fontSize[257]; -#else - -int puGetWindowHeight () { return glutGet ( (GLenum) GLUT_WINDOW_HEIGHT ) ; } -int puGetWindowWidth () { return glutGet ( (GLenum) GLUT_WINDOW_WIDTH ) ; } - -void puSetWindowSize ( int width, int height ) -{ - fprintf ( stderr, "PUI: puSetWindowSize shouldn't be used with GLUT.\n" ) ; -} - -#endif - -puColour _puDefaultColourTable[] = -{ - { 0.5f, 0.5f, 0.5f, 1.0f }, /* PUCOL_FOREGROUND */ - { 0.3f, 0.3f, 0.3f, 1.0f }, /* PUCOL_BACKGROUND */ - { 0.7f, 0.7f, 0.7f, 1.0f }, /* PUCOL_HIGHLIGHT */ - { 0.0f, 0.0f, 0.0f, 1.0f }, /* PUCOL_LABEL */ - { 1.0f, 1.0f, 1.0f, 1.0f }, /* PUCOL_TEXT */ - - { 0.0f, 0.0f, 0.0f, 0.0f } /* ILLEGAL */ -} ; - - -puValue::~puValue () {} - -static int _puCursor_enable = FALSE ; -static int _puCursor_x = 0 ; -static int _puCursor_y = 0 ; -static float _puCursor_bgcolour [4] = { 1.0f, 1.0f, 1.0f, 1.0f } ; -static float _puCursor_fgcolour [4] = { 0.0f, 0.0f, 0.0f, 1.0f } ; - -void puHideCursor ( void ) { _puCursor_enable = FALSE ; } -void puShowCursor ( void ) { _puCursor_enable = TRUE ; } -int puCursorIsHidden ( void ) { return ! _puCursor_enable ; } - -void puCursor ( int x, int y ) -{ - _puCursor_x = x ; - _puCursor_y = y ; -} - -int puGetStringDescender ( void *fnt ) -{ - if ( fnt == NULL ) - fnt = PUFONT_9_BY_15 ; - - if ( fnt == PUFONT_8_BY_13 ) return 2 ; - if ( fnt == PUFONT_9_BY_15 ) return 3 ; - if ( fnt == PUFONT_TIMES_ROMAN_10 ) return 2 ; - if ( fnt == PUFONT_TIMES_ROMAN_24 ) return 5 ; - if ( fnt == PUFONT_HELVETICA_10 ) return 2 ; - if ( fnt == PUFONT_HELVETICA_12 ) return 3 ; - if ( fnt == PUFONT_HELVETICA_18 ) return 4 ; - - return 0 ; -} - -int puGetStringHeight ( void *fnt ) -{ - /* Height *excluding* descender */ - if ( fnt == NULL ) - fnt = PUFONT_9_BY_15 ; - - if ( fnt == PUFONT_8_BY_13 ) return 9 ; - if ( fnt == PUFONT_9_BY_15 ) return 10 ; - if ( fnt == PUFONT_TIMES_ROMAN_10 ) return 7 ; - if ( fnt == PUFONT_TIMES_ROMAN_24 ) return 17 ; - if ( fnt == PUFONT_HELVETICA_10 ) return 8 ; - if ( fnt == PUFONT_HELVETICA_12 ) return 9 ; - if ( fnt == PUFONT_HELVETICA_18 ) return 14 ; - - return 0 ; -} - -int puGetStringWidth ( void *fnt, char *str ) -{ - - if ( str == NULL ) - return 0 ; - - int res = 0 ; - -#ifdef PU_NOT_USING_GLUT - while ( *str != '\0' ) - { - res += fontSize [ *str ] ; - str++ ; - } -#else - if ( fnt == NULL ) - fnt = PUFONT_9_BY_15 ; - - while ( *str != '\0' ) - { - res += glutBitmapWidth ( fnt, *str ) ; - str++ ; - } -#endif - - return res ; -} - - -void puDrawString ( void *fnt, char *str, int x, int y ) -{ - if ( str == NULL ) - return ; - - glRasterPos2f((float)x, (float)y); - -#ifdef PU_NOT_USING_GLUT - /* - Display a string: - indicate start of glyph display lists - */ - - glListBase (fontBase); - - /* Now draw the characters in a string */ - - int len = strlen(str); - glCallLists(len, GL_UNSIGNED_BYTE, str); - glListBase(0); -#else - if ( fnt == NULL ) - fnt = PUFONT_9_BY_15 ; - - while ( *str != '\0' ) - { - glutBitmapCharacter ( fnt, *str ) ; - str++ ; - } -#endif -} - - -static void puDrawCursor ( int x, int y ) -{ - glColor4fv ( _puCursor_bgcolour ) ; - - glBegin ( GL_TRIANGLES ) ; - glVertex2i ( x, y ) ; - glVertex2i ( x + 13, y - 4 ) ; - glVertex2i ( x + 4, y - 13 ) ; - - glVertex2i ( x + 8, y - 3 ) ; - glVertex2i ( x + 17, y - 12 ) ; - glVertex2i ( x + 12, y - 17 ) ; - - glVertex2i ( x + 12, y - 17 ) ; - glVertex2i ( x + 3, y - 8 ) ; - glVertex2i ( x + 8, y - 3 ) ; - glEnd () ; - - glColor4fv ( _puCursor_fgcolour ) ; - - glBegin ( GL_TRIANGLES ) ; - glVertex2i ( x+1, y-1 ) ; - glVertex2i ( x + 11, y - 4 ) ; - glVertex2i ( x + 4, y - 11 ) ; - - glVertex2i ( x + 8, y - 5 ) ; - glVertex2i ( x + 15, y - 12 ) ; - glVertex2i ( x + 12, y - 15 ) ; - - glVertex2i ( x + 12, y - 15 ) ; - glVertex2i ( x + 5, y - 8 ) ; - glVertex2i ( x + 8, y - 5 ) ; - glEnd () ; -} - -void puInit ( void ) -{ - static int firsttime = TRUE ; - - if ( firsttime ) - { - puInterface *base_interface = new puInterface ( 0, 0 ) ; - puPushInterface ( base_interface ) ; - puPushLiveInterface ( base_interface ) ; - firsttime = FALSE ; -#ifdef PU_NOT_USING_GLUT - - /* Create bitmaps for the device context font's first 256 glyphs */ - - fontBase = glGenLists(256); - assert(fontBase); - HDC hdc = wglGetCurrentDC(); - - /* Make the system font the device context's selected font */ - - SelectObject (hdc, GetStockObject (SYSTEM_FONT)); - - int *tempSize = &fontSize[1]; - - if ( ! GetCharWidth32 ( hdc, 1, 255, tempSize ) && - ! GetCharWidth ( hdc, 1, 255, tempSize ) ) - { - LPVOID lpMsgBuf ; - - FormatMessage ( FORMAT_MESSAGE_ALLOCATE_BUFFER | - FORMAT_MESSAGE_FROM_SYSTEM, - NULL, - GetLastError(), - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - (LPTSTR) &lpMsgBuf, - 0, NULL ) ; - - fprintf ( stderr, "PUI: Error: %s\n", (char *)lpMsgBuf ) ; - LocalFree ( lpMsgBuf ) ; - } - - wglUseFontBitmaps ( hdc, 0, 256, fontBase ) ; -#endif - } -} - -static void puSetOpenGLState ( void ) -{ - int w = puGetWindowWidth () ; - int h = puGetWindowHeight () ; - - glPushAttrib ( GL_ENABLE_BIT | GL_VIEWPORT_BIT | GL_TRANSFORM_BIT ) ; - glDisable ( GL_LIGHTING ) ; - glDisable ( GL_FOG ) ; - glDisable ( GL_TEXTURE_2D ) ; - glDisable ( GL_DEPTH_TEST ) ; - glDisable ( GL_CULL_FACE ) ; - - glViewport ( 0, 0, w, h ) ; - glMatrixMode ( GL_PROJECTION ) ; - glPushMatrix () ; - glLoadIdentity () ; - gluOrtho2D ( 0, w, 0, h ) ; - glMatrixMode ( GL_MODELVIEW ) ; - glPushMatrix () ; - glLoadIdentity () ; -} - -static void puRestoreOpenGLState ( void ) -{ - glMatrixMode ( GL_PROJECTION ) ; - glPopMatrix () ; - glMatrixMode ( GL_MODELVIEW ) ; - glPopMatrix () ; - glPopAttrib () ; -} - - -void puDisplay ( void ) -{ - puSetOpenGLState () ; - puGetUltimateLiveInterface () -> draw ( 0, 0 ) ; - - int h = puGetWindowHeight () ; - - if ( _puCursor_enable ) - puDrawCursor ( _puCursor_x, - h - _puCursor_y ) ; - - puRestoreOpenGLState () ; -} - -int puKeyboard ( int key, int updown ) -{ - return puGetBaseLiveInterface () -> checkKey ( key, updown ) ; -} - - -static int last_buttons = 0 ; -int puMouse ( int button, int updown, int x, int y ) -{ - puCursor ( x, y ) ; - - int h = puGetWindowHeight () ; - - if ( updown == PU_DOWN ) - last_buttons |= ( 1 << button ) ; - else - last_buttons &= ~( 1 << button ) ; - - return puGetBaseLiveInterface () -> checkHit ( button, updown, x, - h - y ) ; -} - -int puMouse ( int x, int y ) -{ - puCursor ( x, y ) ; - - if ( last_buttons == 0 ) - return FALSE ; - - int button = (last_buttons & (1< checkHit ( button, PU_DRAG, x, - h - y ) ; -} - diff --git a/PUI/pu.h b/PUI/pu.h deleted file mode 100644 index 02f99ada..00000000 --- a/PUI/pu.h +++ /dev/null @@ -1,805 +0,0 @@ -#ifndef _PU_H_ -#define _PU_H_ - -#ifdef HAVE_CONFIG_H -# include -#endif - -#ifdef HAVE_WINDOWS_H -# include -#endif - -#include -#include -#include - -#ifdef PU_NOT_USING_GLUT -#include -#include -#include -#else -#include -#endif - -#ifndef TRUE -#define TRUE 1 -#define FALSE 0 -#endif - -/* - Webster's Dictionary (for American English) permits - Color or Colour as acceptable spellings - but - The Oxford English Dictionary (for English) only - permits Colour. - - Hence, the logical thing to do is to use 'colour', - which *ought* to be acceptable on both sides of - the atlantic. - - However, as a concession to the illogical: -*/ - -#define setColorScheme setColourScheme -#define setColor setColour -#define getColor getColour -#define puColor puColour -#define puSetColor puSetColour -#define puSetDefaultColorScheme puSetDefaultColourScheme -#define puGetDefaultColorScheme puGetDefaultColourScheme - - -typedef void *puFont ; - -#ifdef PU_NOT_USING_GLUT -#define PU_LEFT_BUTTON 0 -#define PU_LEFT_BUTTON 0 -#define PU_MIDDLE_BUTTON 1 -#define PU_RIGHT_BUTTON 2 -#define PU_DOWN 0 -#define PU_UP 1 - -#define PUFONT_8_BY_13 ((void*)3) -#define PUFONT_9_BY_15 ((void*)2) -#define PUFONT_TIMES_ROMAN_10 ((void*)4) -#define PUFONT_TIMES_ROMAN_24 ((void*)5) -#define PUFONT_HELVETICA_10 ((void*)6) -#define PUFONT_HELVETICA_12 ((void*)7) -#define PUFONT_HELVETICA_18 ((void*)8) - -#else - -#define PUFONT_8_BY_13 GLUT_BITMAP_8_BY_13 -#define PUFONT_9_BY_15 GLUT_BITMAP_9_BY_15 -#define PUFONT_TIMES_ROMAN_10 GLUT_BITMAP_TIMES_ROMAN_10 -#define PUFONT_TIMES_ROMAN_24 GLUT_BITMAP_TIMES_ROMAN_24 -#define PUFONT_HELVETICA_10 GLUT_BITMAP_HELVETICA_10 -#define PUFONT_HELVETICA_12 GLUT_BITMAP_HELVETICA_12 -#define PUFONT_HELVETICA_18 GLUT_BITMAP_HELVETICA_18 - -#define PU_LEFT_BUTTON GLUT_LEFT_BUTTON -#define PU_MIDDLE_BUTTON GLUT_MIDDLE_BUTTON -#define PU_RIGHT_BUTTON GLUT_RIGHT_BUTTON -#define PU_DOWN GLUT_DOWN -#define PU_UP GLUT_UP -#endif // PU_NOT_USING_GLUT - -#define PU_UP_AND_DOWN 254 -#define PU_DRAG 255 -#define PU_CONTINUAL PU_DRAG - -#define PU_KEY_GLUT_SPECIAL_OFFSET 256 - -#ifdef PU_NOT_USING_GLUT -#define PU_KEY_F1 (1 + PU_KEY_GLUT_SPECIAL_OFFSET) -#define PU_KEY_F2 (2 + PU_KEY_GLUT_SPECIAL_OFFSET) -#define PU_KEY_F3 (3 + PU_KEY_GLUT_SPECIAL_OFFSET) -#define PU_KEY_F4 (4 + PU_KEY_GLUT_SPECIAL_OFFSET) -#define PU_KEY_F5 (5 + PU_KEY_GLUT_SPECIAL_OFFSET) -#define PU_KEY_F6 (6 + PU_KEY_GLUT_SPECIAL_OFFSET) -#define PU_KEY_F7 (7 + PU_KEY_GLUT_SPECIAL_OFFSET) -#define PU_KEY_F8 (8 + PU_KEY_GLUT_SPECIAL_OFFSET) -#define PU_KEY_F9 (9 + PU_KEY_GLUT_SPECIAL_OFFSET) -#define PU_KEY_F10 (10 + PU_KEY_GLUT_SPECIAL_OFFSET) -#define PU_KEY_F11 (11 + PU_KEY_GLUT_SPECIAL_OFFSET) -#define PU_KEY_F12 (12 + PU_KEY_GLUT_SPECIAL_OFFSET) -#define PU_KEY_LEFT (100 + PU_KEY_GLUT_SPECIAL_OFFSET) -#define PU_KEY_UP (101 + PU_KEY_GLUT_SPECIAL_OFFSET) -#define PU_KEY_RIGHT (102 + PU_KEY_GLUT_SPECIAL_OFFSET) -#define PU_KEY_DOWN (103 + PU_KEY_GLUT_SPECIAL_OFFSET) -#define PU_KEY_PAGE_UP (104 + PU_KEY_GLUT_SPECIAL_OFFSET) -#define PU_KEY_PAGE_DOWN (105 + PU_KEY_GLUT_SPECIAL_OFFSET) -#define PU_KEY_HOME (106 + PU_KEY_GLUT_SPECIAL_OFFSET) -#define PU_KEY_END (107 + PU_KEY_GLUT_SPECIAL_OFFSET) -#define PU_KEY_INSERT (108 + PU_KEY_GLUT_SPECIAL_OFFSET) - -#else -#define PU_KEY_F1 (GLUT_KEY_F1 + PU_KEY_GLUT_SPECIAL_OFFSET) -#define PU_KEY_F2 (GLUT_KEY_F2 + PU_KEY_GLUT_SPECIAL_OFFSET) -#define PU_KEY_F3 (GLUT_KEY_F3 + PU_KEY_GLUT_SPECIAL_OFFSET) -#define PU_KEY_F4 (GLUT_KEY_F4 + PU_KEY_GLUT_SPECIAL_OFFSET) -#define PU_KEY_F5 (GLUT_KEY_F5 + PU_KEY_GLUT_SPECIAL_OFFSET) -#define PU_KEY_F6 (GLUT_KEY_F6 + PU_KEY_GLUT_SPECIAL_OFFSET) -#define PU_KEY_F7 (GLUT_KEY_F7 + PU_KEY_GLUT_SPECIAL_OFFSET) -#define PU_KEY_F8 (GLUT_KEY_F8 + PU_KEY_GLUT_SPECIAL_OFFSET) -#define PU_KEY_F9 (GLUT_KEY_F9 + PU_KEY_GLUT_SPECIAL_OFFSET) -#define PU_KEY_F10 (GLUT_KEY_F10 + PU_KEY_GLUT_SPECIAL_OFFSET) -#define PU_KEY_F11 (GLUT_KEY_F11 + PU_KEY_GLUT_SPECIAL_OFFSET) -#define PU_KEY_F12 (GLUT_KEY_F12 + PU_KEY_GLUT_SPECIAL_OFFSET) -#define PU_KEY_LEFT (GLUT_KEY_LEFT + PU_KEY_GLUT_SPECIAL_OFFSET) -#define PU_KEY_UP (GLUT_KEY_UP + PU_KEY_GLUT_SPECIAL_OFFSET) -#define PU_KEY_RIGHT (GLUT_KEY_RIGHT + PU_KEY_GLUT_SPECIAL_OFFSET) -#define PU_KEY_DOWN (GLUT_KEY_DOWN + PU_KEY_GLUT_SPECIAL_OFFSET) -#define PU_KEY_PAGE_UP (GLUT_KEY_PAGE_UP + PU_KEY_GLUT_SPECIAL_OFFSET) -#define PU_KEY_PAGE_DOWN (GLUT_KEY_PAGE_DOWN + PU_KEY_GLUT_SPECIAL_OFFSET) -#define PU_KEY_HOME (GLUT_KEY_HOME + PU_KEY_GLUT_SPECIAL_OFFSET) -#define PU_KEY_END (GLUT_KEY_END + PU_KEY_GLUT_SPECIAL_OFFSET) -#define PU_KEY_INSERT (GLUT_KEY_INSERT + PU_KEY_GLUT_SPECIAL_OFFSET) -#endif // PU_NOT_USING_GLUT - -#define PUPLACE_DEFAULT PUPLACE_RIGHT -#define PUPLACE_ABOVE 0 -#define PUPLACE_BELOW 1 -#define PUPLACE_LEFT 2 -#define PUPLACE_RIGHT 3 - -#define PUCOL_FOREGROUND 0 -#define PUCOL_BACKGROUND 1 -#define PUCOL_HIGHLIGHT 2 -#define PUCOL_LABEL 3 -#define PUCOL_LEGEND 4 -#define PUCOL_MAX 5 - -#define PUSLIDER_CLICK 0 -#define PUSLIDER_ALWAYS 1 -#define PUSLIDER_DELTA 2 - -/* These styles may be negated to get 'highlighted' graphics */ - -#define PUSTYLE_DEFAULT PUSTYLE_SHADED -#define PUSTYLE_NONE 0 -#define PUSTYLE_PLAIN 1 -#define PUSTYLE_BEVELLED 2 -#define PUSTYLE_BOXED 3 -#define PUSTYLE_DROPSHADOW 4 -#define PUSTYLE_SPECIAL_UNDERLINED 5 -#define PUSTYLE_SMALL_BEVELLED 6 -#define PUSTYLE_RADIO 7 -#define PUSTYLE_SHADED 8 -#define PUSTYLE_SMALL_SHADED 9 -#define PUSTYLE_MAX 10 - -/* These are the gaps that we try to leave around text objects */ - -#define PUSTR_TGAP 5 -#define PUSTR_BGAP 5 -#define PUSTR_LGAP 5 -#define PUSTR_RGAP 5 -#define PUSTR_MAX_HEIGHT ( 25 + PUSTR_TGAP + PUSTR_BGAP ) - -#define PU_RADIO_BUTTON_SIZE 16 - -extern int puRefresh ; - -#define PUCLASS_VALUE 0x00000001 -#define PUCLASS_OBJECT 0x00000002 -#define PUCLASS_INTERFACE 0x00000004 -#define PUCLASS_FRAME 0x00000008 -#define PUCLASS_TEXT 0x00000010 -#define PUCLASS_BUTTON 0x00000020 -#define PUCLASS_ONESHOT 0x00000040 -#define PUCLASS_POPUP 0x00000080 -#define PUCLASS_POPUPMENU 0x00000100 -#define PUCLASS_MENUBAR 0x00000200 -#define PUCLASS_INPUT 0x00000400 -#define PUCLASS_BUTTONBOX 0x00000800 -#define PUCLASS_SLIDER 0x00001000 -#define PUCLASS_DIALOGBOX 0x00002000 - -/* This function is not required for GLUT programs */ -void puSetWindowSize ( int width, int height ) ; - -int puGetWindowHeight () ; -int puGetWindowWidth () ; - -class puValue ; -class puObject ; -class puInterface ; -class puButtonBox ; -class puFrame ; -class puText ; -class puButton ; -class puOneShot ; -class puPopup ; -class puPopupMenu ; -class puMenuBar ; -class puInput ; -class puSlider ; - -typedef float puColour [ 4 ] ; /* RGBA */ - -struct puBox -{ - int min [ 2 ] ; - int max [ 2 ] ; - - void draw ( int dx, int dy, int style, puColour colour[], int am_default ) ; - void extend ( puBox *bx ) ; - - void empty ( void ) { min[0]=min[1]=1000000 ; max[0]=max[1]=-1000000 ; } - int isEmpty ( void ) { return min[0]>max[0] || min[1]>max[1] ; } -} ; - -#define PUSTRING_MAX 80 - -/* If you change - or add to these, be sure to change _puDefaultColourTable */ - -extern puColour _puDefaultColourTable[] ; - - -inline void puSetColour ( puColour dst, puColour src ) -{ - dst[0] = src[0] ; dst[1] = src[1] ; dst[2] = src[2] ; dst[3] = src[3] ; -} - -inline void puSetColour ( puColour c, float r, float g, float b, float a = 1.0f ) -{ - c [ 0 ] = r ; c [ 1 ] = g ; c [ 2 ] = b ; c [ 3 ] = a ; -} - - -void puInit ( void ) ; -void puDisplay ( void ) ; -int puMouse ( int button, int updown, int x, int y ) ; -int puMouse ( int x, int y ) ; -int puKeyboard ( int key, int updown ) ; -void puHideCursor ( void ) ; -void puShowCursor ( void ) ; -int puCursorIsHidden ( void ) ; - -void puDrawString ( puFont fnt, char *str, int x, int y ) ; -int puGetStringWidth ( puFont fnt, char *str ) ; -int puGetStringHeight ( puFont fnt = NULL ) ; -int puGetStringDescender ( puFont fnt = NULL ) ; - -class puValue -{ -protected: - int type ; - int integer ; - float floater ; - char string [ PUSTRING_MAX ] ; -public: - puValue () { type = PUCLASS_VALUE ; clrValue () ; } - - virtual ~puValue () ; - - int getType ( void ) { return type ; } - char *getTypeString ( void ) ; - void clrValue ( void ) { setValue ( "" ) ; } - - void setValue ( puValue *pv ) - { - integer = pv -> integer ; - floater = pv -> floater ; - strcpy ( string, pv -> string ) ; - puRefresh = TRUE ; - } - - void setValue ( int i ) { integer = i ; floater = (float) i ; sprintf ( string, "%d", i ) ; puRefresh = TRUE ; } - void setValue ( float f ) { integer = (int) f ; floater = f ; sprintf ( string, "%g", f ) ; puRefresh = TRUE ; } - void setValue ( char *s ) { - if ( s == NULL || s[0] == '\0' ) - { - integer = 0 ; - floater = 0.0f ; - s = "" ; - } - else - { - integer = atoi(s) ; - floater = (float)atof(s) ; - - if ( string != s ) strcpy ( string, s ) ; - } - puRefresh = TRUE ; - } - - void getValue ( int *i ) { *i = integer ; } - void getValue ( float *f ) { *f = floater ; } - void getValue ( char **s ) { *s = string ; } - void getValue ( char *s ) { strcpy ( s, string ) ; } - - int getValue ( void ) { return integer ; } -} ; - -typedef void (*puCallback)(class puObject *) ; - -void puSetDefaultStyle ( int style ) ; -int puGetDefaultStyle ( void ) ; -void puSetDefaultFonts ( puFont legendFont, puFont labelFont ) ; -void puGetDefaultFonts ( puFont *legendFont, puFont *labelFont ) ; -void puSetDefaultColourScheme ( float r, float g, float b, float a = 1.0 ) ; -void puGetDefaultColourScheme ( float *r, float *g, float *b, float *a = NULL ); - -class puObject : public puValue -{ -protected: - puValue default_value ; - - puBox bbox ; /* Bounding box of entire Object */ - puBox abox ; /* Active (clickable) area */ - puColour colour [ PUCOL_MAX ] ; - puInterface *parent ; - - int active_mouse_edge ; /* is it PU_UP or PU_DOWN (or both) that activates this? */ - int style ; - int visible ; - int active ; - int highlighted ; - int am_default ; - - char *label ; puFont labelFont ; int labelPlace ; - char *legend ; puFont legendFont ; - - void *user_data ; - puCallback cb ; - - virtual void draw_label ( int dx, int dy ) ; - virtual int isHit ( int x, int y ) { return isVisible() && isActive() && - x >= abox.min[0] && - x <= abox.max[0] && - y >= abox.min[1] && - y <= abox.max[1] ; } - virtual void doHit ( int button, int updown, int x, int y ) ; - -public: - puObject ( int minx, int miny, int maxx, int maxy ) ; - ~puObject () ; - - puObject *next ; - puObject *prev ; - - puBox *getBBox ( void ) { return & bbox ; } - puBox *getABox ( void ) { return & abox ; } - - void setPosition ( int x, int y ) - { - if ( abox.isEmpty() ) - { - abox.max[0] = abox.min[0] = x ; - abox.max[1] = abox.min[1] = y ; - } - else - { - abox.max[0] += x - abox.min[0] ; - abox.max[1] += y - abox.min[1] ; - abox.min[0] = x ; - abox.min[1] = y ; - } - recalc_bbox() ; puRefresh = TRUE ; - } - - void setSize ( int w, int h ) - { - abox.max[0] = abox.min[0] + w ; - abox.max[1] = abox.min[1] + h ; - recalc_bbox() ; puRefresh = TRUE ; - } - - void getPosition ( int *x, int *y ) - { - if ( abox . isEmpty () ) - { - if ( x ) *x = 0 ; - if ( y ) *y = 0 ; - } - else - { - if ( x ) *x = abox.min[0] ; - if ( y ) *y = abox.min[1] ; - } - } - - void getSize ( int *w, int *h ) - { - if ( abox . isEmpty () ) - { - if ( w ) *w = 0 ; - if ( h ) *h = 0 ; - } - else - { - if ( w ) *w = abox.max[0] - abox.min[0] ; - if ( h ) *h = abox.max[1] - abox.min[1] ; - } - } - - virtual void recalc_bbox ( void ) ; - virtual int checkHit ( int button, int updown, int x, int y ) ; - virtual int checkKey ( int key , int updown ) ; - virtual void draw ( int dx, int dy ) = 0 ; - - puInterface *getParent ( void ) { return parent ; } - puObject *getNextObject ( void ) { return next ; } - puObject *getPrevObject ( void ) { return prev ; } - - void setCallback ( puCallback c ) { cb = c ; } - puCallback getCallback ( void ) { return cb ; } - void invokeCallback ( void ) { if ( cb ) (*cb)(this) ; } - - void makeReturnDefault ( int def ) { am_default = def ; } - int isReturnDefault ( void ) { return am_default ; } - - void setActiveDirn ( int e ) { active_mouse_edge = e ; } - int getActiveDirn ( void ) { return active_mouse_edge ; } - - void setLegend ( char *l ) { legend = l ; recalc_bbox() ; puRefresh = TRUE ; } - char *getLegend ( void ) { return legend ; } - - void setLegendFont ( puFont f ) { legendFont = f ; recalc_bbox() ; puRefresh = TRUE ; } - puFont getLegendFont ( void ) { return legendFont ; } - - void setLabel ( char *l ) { label = l ; recalc_bbox() ; puRefresh = TRUE ; } - char *getLabel ( void ) { return label ; } - - void setLabelFont ( puFont f ) { labelFont = f ; recalc_bbox() ; puRefresh = TRUE ; } - puFont getLabelFont ( void ) { return labelFont ; } - - void setLabelPlace ( int lp ) { labelPlace = lp ; recalc_bbox() ; puRefresh = TRUE ; } - int getLabelPlace ( void ) { return labelPlace ; } - - void activate ( void ) { if ( ! active ) { active = TRUE ; puRefresh = TRUE ; } } - void greyOut ( void ) { if ( active ) { active = FALSE ; puRefresh = TRUE ; } } - int isActive ( void ) { return active ; } - - void highlight ( void ) { if ( ! highlighted ) { highlighted = TRUE ; puRefresh = TRUE ; } } - void lowlight ( void ) { if ( highlighted ) { highlighted = FALSE ; puRefresh = TRUE ; } } - int isHighlighted( void ){ return highlighted ; } - - void reveal ( void ) { if ( ! visible ) { visible = TRUE ; puRefresh = TRUE ; } } - void hide ( void ) { if ( visible ) { visible = FALSE ; puRefresh = TRUE ; } } - int isVisible ( void ) { return visible ; } - - void setStyle ( int which ) - { - style = which ; - recalc_bbox () ; - puRefresh = TRUE ; - } - - int getStyle ( void ) { return style ; } - - void setColourScheme ( float r, float g, float b, float a = 1.0f ) ; - - void setColour ( int which, float r, float g, float b, float a = 1.0f ) - { - puSetColour ( colour [ which ], r, g, b, a ) ; - puRefresh = TRUE ; - } - - void getColour ( int which, float *r, float *g, float *b, float *a = NULL ) - { - if ( r ) *r = colour[which][0] ; - if ( g ) *g = colour[which][1] ; - if ( b ) *b = colour[which][2] ; - if ( a ) *a = colour[which][3] ; - } - - void setUserData ( void *data ) { user_data = data ; } - void *getUserData ( void ) { return user_data ; } - - void defaultValue ( void ) { setValue ( & default_value ) ; } - - void setDefaultValue ( int i ) { default_value . setValue ( i ) ; } - void setDefaultValue ( float f ) { default_value . setValue ( f ) ; } - void setDefaultValue ( char *s ) { default_value . setValue ( s ) ; } - - void getDefaultValue ( int *i ) { default_value . getValue ( i ) ; } - void getDefaultValue ( float *f ) { default_value . getValue ( f ) ; } - void getDefaultValue ( char **s ) { default_value . getValue ( s ) ; } - int getDefaultValue ( void ) { return default_value . getValue () ; } -} ; - -/* - The 'live' interface stack is used for clicking and rendering. -*/ - -void puPushLiveInterface ( puInterface *in ) ; -void puPopLiveInterface ( void ) ; -int puNoLiveInterface ( void ) ; -puInterface *puGetBaseLiveInterface ( void ) ; -puInterface *puGetUltimateLiveInterface ( void ) ; - -/* - The regular interface stack is used for adding widgets -*/ - -void puPushInterface ( puInterface *in ) ; -void puPopInterface ( void ) ; -int puNoInterface ( void ) ; -puInterface *puGetCurrInterface ( void ) ; - -class puInterface : public puObject -{ -protected: - int num_children ; - puObject *dlist ; - - void doHit ( int button, int updown, int x, int y ) ; - -public: - - puInterface ( int x, int y ) : puObject ( x, y, x, y ) - { - type |= PUCLASS_INTERFACE ; - dlist = NULL ; - num_children = 0 ; - puPushInterface ( this ) ; - puPushLiveInterface ( this ) ; - } - - ~puInterface () ; - - void recalc_bbox ( void ) ; - virtual void add ( puObject *new_object ) ; - virtual void remove ( puObject *old_object ) ; - - void draw ( int dx, int dy ) ; - int checkHit ( int button, int updown, int x, int y ) ; - int checkKey ( int key , int updown ) ; - - puObject *getFirstChild ( void ) { return dlist ; } - int getNumChildren ( void ) { return num_children ; } - - virtual void close ( void ) - { - if ( puGetCurrInterface () != this ) - fprintf ( stderr, "PUI: puInterface::close() is mismatched!\n" ) ; - else - puPopInterface () ; - } -} ; - -class puFrame : public puObject -{ -protected: - virtual int isHit ( int /* x */, int /* y */ ) { return FALSE ; } -public: - void draw ( int dx, int dy ) ; - puFrame ( int minx, int miny, int maxx, int maxy ) : - puObject ( minx, miny, maxx, maxy ) - { - type |= PUCLASS_FRAME ; - } -} ; - - -class puText : public puObject -{ -protected: - virtual int isHit ( int /* x */, int /* y */ ) { return FALSE ; } -public: - void draw ( int dx, int dy ) ; - puText ( int x, int y ) : puObject ( x, y, x, y ) - { - type |= PUCLASS_TEXT ; - } -} ; - - -class puButton : public puObject -{ -protected: -public: - void doHit ( int button, int updown, int x, int y ) ; - void draw ( int dx, int dy ) ; - puButton ( int minx, int miny, char *l ) : - puObject ( minx, miny, - minx + puGetStringWidth ( NULL, l ) + PUSTR_LGAP + PUSTR_RGAP, - miny + puGetStringHeight () + puGetStringDescender () + PUSTR_TGAP + PUSTR_BGAP ) - { - type |= PUCLASS_BUTTON ; - setLegend ( l ) ; - } - - puButton ( int minx, int miny, int maxx, int maxy ) : - puObject ( minx, miny, maxx, maxy ) - { - type |= PUCLASS_BUTTON ; - } -} ; - - -class puSlider : public puObject -{ -protected: - int vert ; - float last_cb_value ; - float cb_delta ; - int cb_mode ; - float slider_fraction ; -public: - void doHit ( int button, int updown, int x, int y ) ; - void draw ( int dx, int dy ) ; - puSlider ( int minx, int miny, int sz, int vertical = FALSE ) : - puObject ( minx, miny, vertical ? - ( minx + puGetStringWidth ( NULL, "W" ) + - PUSTR_LGAP + PUSTR_RGAP ) : - ( minx + sz ), - vertical ? - ( miny + sz ) : - ( miny + puGetStringHeight () + - puGetStringDescender () + - PUSTR_TGAP + PUSTR_BGAP ) - ) - { - type |= PUCLASS_SLIDER ; - slider_fraction = 0.1f ; - getValue ( & last_cb_value ) ; - vert = vertical ; - cb_delta = 0.1f ; - cb_mode = PUSLIDER_ALWAYS ; - } - - void setCBMode ( int m ) { cb_mode = m ; } - float getCBMode ( void ) { return (float)cb_mode ; } - - int isVertical ( void ) { return vert ; } - - void setDelta ( float f ) { cb_delta = (f<=0.0f) ? 0.1f : (f>=1.0f) ? 0.9f : f ; } - float getDelta ( void ) { return cb_delta ; } - - void setSliderFraction ( float f ) { slider_fraction = (f<=0.0f) ? 0.1f : (f>=1.0f) ? 0.9f : f ; } - float getSliderFraction ( void ) { return slider_fraction ; } -} ; - - - -class puOneShot : public puButton -{ -protected: -public: - void doHit ( int button, int updown, int x, int y ) ; - - puOneShot ( int minx, int miny, char *l ) : puButton ( minx, miny, l ) - { - type |= PUCLASS_ONESHOT ; - } - - puOneShot ( int minx, int miny, int maxx, int maxy ) : - puButton ( minx, miny, maxx, maxy ) - { - type |= PUCLASS_ONESHOT ; - } -} ; - - - -class puPopup : public puInterface -{ -protected: -public: - puPopup ( int x, int y ) : puInterface ( x, y ) - { - type |= PUCLASS_POPUP ; - hide () ; - } -} ; - -class puPopupMenu : public puPopup -{ -protected: -public: - puPopupMenu ( int x, int y ) : puPopup ( x, y ) - { - type |= PUCLASS_POPUPMENU ; - } - - puObject *add_item ( char *str, puCallback cb ) ; - int checkHit ( int button, int updown, int x, int y ) ; - int checkKey ( int key , int updown ) ; - void close ( void ) ; -} ; - -class puMenuBar : public puInterface -{ -protected: -public: - puMenuBar ( int h = -1 ) : - - puInterface ( 0, h < 0 ? puGetWindowHeight() - - ( puGetStringHeight() + PUSTR_TGAP + PUSTR_BGAP ) : h ) - { - type |= PUCLASS_MENUBAR ; - } - - void add_submenu ( char *str, char *items[], puCallback cb[] ) ; - void close ( void ) ; -} ; - - -class puInput : public puObject -{ - int accepting ; - int cursor_position ; - int select_start_position ; - int select_end_position ; - - void normalize_cursors ( void ) ; - -public: - void draw ( int dx, int dy ) ; - void doHit ( int button, int updown, int x, int y ) ; - int checkKey ( int key, int updown ) ; - - int isAcceptingInput ( void ) { return accepting ; } - void rejectInput ( void ) { accepting = FALSE ; } - void acceptInput ( void ) { accepting = TRUE ; - cursor_position = strlen ( string ) ; - select_start_position = select_end_position = -1 ; } - - int getCursor ( void ) { return cursor_position ; } - void setCursor ( int c ) { cursor_position = c ; } - - void setSelectRegion ( int s, int e ) - { - select_start_position = s ; - select_end_position = e ; - } - - void getSelectRegion ( int *s, int *e ) - { - if ( s ) *s = select_start_position ; - if ( e ) *e = select_end_position ; - } - - puInput ( int minx, int miny, int maxx, int maxy ) : - puObject ( minx, miny, maxx, maxy ) - { - type |= PUCLASS_INPUT ; - - accepting = FALSE ; - - cursor_position = 0 ; - select_start_position = -1 ; - select_end_position = -1 ; - - setColourScheme ( 0.8f, 0.7f, 0.7f ) ; /* Yeukky Pink */ - } -} ; - - -class puButtonBox : public puObject -{ -protected: - int one_only ; - int num_kids ; - char **button_labels ; - -public: - - puButtonBox ( int minx, int miny, int maxx, int maxy, - char **labels, int one_button ) ; - - int isOneButton ( void ) { return one_only ; } - - int checkKey ( int key , int updown ) ; - int checkHit ( int button, int updown, int x, int y ) ; - void draw ( int dx, int dy ) ; -} ; - - - -class puDialogBox : public puPopup -{ -protected: -public: - - puDialogBox ( int x, int y ) : puPopup ( x, y ) - { - type |= PUCLASS_DIALOGBOX ; - } -} ; - -#endif - diff --git a/PUI/puBox.cxx b/PUI/puBox.cxx deleted file mode 100644 index d0d92628..00000000 --- a/PUI/puBox.cxx +++ /dev/null @@ -1,319 +0,0 @@ - -#include "puLocal.h" - -#define PU_BEVEL 5 -#define PU_SMALL_BEVEL 2 -#define PU_DFLT_OFFSET 8 -#define PU_BOX_WIDTH 2 -#define PU_DROPSHADOW_OFFSET 5 - -void puBox::extend ( puBox *bx ) -{ - if ( bx -> isEmpty () ) return ; - - if ( min[0]>bx->min[0] ) min[0] = bx->min[0] ; - if ( min[1]>bx->min[1] ) min[1] = bx->min[1] ; - if ( max[0]max[0] ) max[0] = bx->max[0] ; - if ( max[1]max[1] ) max[1] = bx->max[1] ; -} - - - -void puBox::draw ( int dx, int dy, int style, puColour colour[], int am_default ) -{ - int hi, mid, lo ; - - /* Colour assignments */ - - switch ( style ) - { - case PUSTYLE_NONE : - return ; - - case PUSTYLE_PLAIN : - case PUSTYLE_DROPSHADOW : - mid = PUCOL_FOREGROUND ; - lo = PUCOL_BACKGROUND ; - break ; - - case PUSTYLE_SMALL_SHADED : - case PUSTYLE_SHADED : - case PUSTYLE_SMALL_BEVELLED : - case PUSTYLE_BEVELLED : - case PUSTYLE_BOXED : - case PUSTYLE_SPECIAL_UNDERLINED : - mid = PUCOL_FOREGROUND ; - hi = PUCOL_HIGHLIGHT ; - lo = PUCOL_BACKGROUND ; - break ; - - case PUSTYLE_RADIO : - case -PUSTYLE_RADIO : - hi = PUCOL_HIGHLIGHT ; - lo = PUCOL_BACKGROUND ; - break ; - - case -PUSTYLE_PLAIN : - case -PUSTYLE_DROPSHADOW : - mid = PUCOL_HIGHLIGHT ; - lo = PUCOL_BACKGROUND ; - break ; - - case -PUSTYLE_SMALL_BEVELLED : - case -PUSTYLE_BEVELLED : - case -PUSTYLE_SMALL_SHADED : - case -PUSTYLE_SHADED : - case -PUSTYLE_BOXED : - case -PUSTYLE_SPECIAL_UNDERLINED : - mid = PUCOL_FOREGROUND ; - hi = PUCOL_BACKGROUND ; - lo = PUCOL_HIGHLIGHT ; - break ; - - default : - fprintf ( stderr, "PUI: Unrecognised 'style' %d\n", style ) ; - return ; - } - - switch ( abs(style) ) - { - case PUSTYLE_PLAIN : - glColor4fv ( colour [ mid ] ) ; - glRecti ( dx + min[0], dy + min[1], - dx + max[0], dy + max[1] ) ; - break ; - - case PUSTYLE_SMALL_BEVELLED : - case PUSTYLE_SMALL_SHADED : - glColor4fv ( colour [ hi ] ) ; - glBegin ( GL_QUAD_STRIP ) ; - glVertex2i ( dx + min[0] + PU_SMALL_BEVEL, dy + min[1] + PU_SMALL_BEVEL ) ; - glVertex2i ( dx + min[0], dy + min[1] ) ; - glVertex2i ( dx + min[0] + PU_SMALL_BEVEL, dy + max[1] - PU_SMALL_BEVEL ) ; - glVertex2i ( dx + min[0], dy + max[1] ) ; - glVertex2i ( dx + max[0] - PU_SMALL_BEVEL, dy + max[1] - PU_SMALL_BEVEL ) ; - glVertex2i ( dx + max[0], dy + max[1] ) ; - glEnd () ; - glColor4fv ( colour [ lo ] ) ; - glBegin ( GL_QUAD_STRIP ) ; - glVertex2i ( dx + min[0], dy + min[1] ) ; - glVertex2i ( dx + min[0] + PU_SMALL_BEVEL, dy + min[1] + PU_SMALL_BEVEL ) ; - glVertex2i ( dx + max[0], dy + min[1] ) ; - glVertex2i ( dx + max[0] - PU_SMALL_BEVEL, dy + min[1] + PU_SMALL_BEVEL ) ; - glVertex2i ( dx + max[0], dy + max[1] ) ; - glVertex2i ( dx + max[0] - PU_SMALL_BEVEL, dy + max[1] - PU_SMALL_BEVEL ) ; - glEnd () ; - - if ( abs(style) == PUSTYLE_SMALL_BEVELLED ) - { - glColor4fv ( colour [ mid ] ) ; - glRecti ( dx + min[0] + PU_SMALL_BEVEL, dy + min[1] + PU_SMALL_BEVEL, - dx + max[0] - PU_SMALL_BEVEL, dy + max[1] - PU_SMALL_BEVEL ) ; - } - else - { - glShadeModel(GL_SMOOTH); - glBegin(GL_POLYGON); - glColor4fv( colour [ mid ] ); - glVertex2i( dx + min[0] + PU_SMALL_BEVEL , dy + min[1] + PU_SMALL_BEVEL ); - if(style==PUSTYLE_SMALL_SHADED) - glColor4f( colour [mid][0] + (colour[lo][0] - colour[mid][0])/2.0f, - colour [mid][1] + (colour[lo][1] - colour[mid][1])/2.0f, - colour [mid][2] + (colour[lo][2] - colour[mid][2])/2.0f, - colour [lo][3] ); - else - glColor4f( colour [mid][0] + (colour[hi][0] - colour[mid][0])/2.0f, - colour [mid][1] + (colour[hi][1] - colour[mid][1])/2.0f, - colour [mid][2] + (colour[hi][2] - colour[mid][2])/2.0f, - colour [hi][3] ); - glVertex2i( dx + min[0] + PU_SMALL_BEVEL , dy + max[1] - PU_SMALL_BEVEL ); - glColor4fv( colour [ mid ] ); - glVertex2i( dx + max[0] - PU_SMALL_BEVEL , dy + max[1] - PU_SMALL_BEVEL ); - if(style==-PUSTYLE_SMALL_SHADED) - glColor4f( colour [mid][0] + (colour[lo][0] - colour[mid][0])/2.0f, - colour [mid][1] + (colour[lo][1] - colour[mid][1])/2.0f, - colour [mid][2] + (colour[lo][2] - colour[mid][2])/2.0f, - colour [lo][3] ); - else - glColor4f( colour [mid][0] + (colour[hi][0] - colour[mid][0])/2.0f, - colour [mid][1] + (colour[hi][1] - colour[mid][1])/2.0f, - colour [mid][2] + (colour[hi][2] - colour[mid][2])/2.0f, - colour [hi][3] ); - glVertex2i( dx + max[0] - PU_SMALL_BEVEL , dy + min[1] + PU_SMALL_BEVEL ); - glEnd(); - glShadeModel(GL_FLAT); - - if(style == -PUSTYLE_SMALL_SHADED) - { - glColor4fv ( colour [ lo ] ) ; - glBegin ( GL_QUAD_STRIP ) ; - glVertex2i ( dx + min[0] + PU_SMALL_BEVEL , dy + min[1] + PU_SMALL_BEVEL ) ; - glVertex2i ( dx + min[0] + PU_SMALL_BEVEL/2 , dy + min[1] + PU_SMALL_BEVEL/2 ) ; - glVertex2i ( dx + min[0] + PU_SMALL_BEVEL , dy + max[1] - PU_SMALL_BEVEL ) ; - glVertex2i ( dx + min[0] + PU_SMALL_BEVEL/2 , dy + max[1] - PU_SMALL_BEVEL/2 ) ; - glVertex2i ( dx + max[0] - PU_SMALL_BEVEL , dy + max[1] - PU_SMALL_BEVEL ) ; - glVertex2i ( dx + max[0] - PU_SMALL_BEVEL/2 , dy + max[1] - PU_SMALL_BEVEL/2 ) ; - glEnd () ; - glColor4fv ( colour [ hi ] ) ; - glBegin ( GL_QUAD_STRIP ) ; - glVertex2i ( dx + min[0] + PU_SMALL_BEVEL/2 , dy + min[1] + PU_SMALL_BEVEL/2 ) ; - glVertex2i ( dx + min[0] + PU_SMALL_BEVEL , dy + min[1] + PU_SMALL_BEVEL ) ; - glVertex2i ( dx + max[0] - PU_SMALL_BEVEL/2 , dy + min[1] + PU_SMALL_BEVEL/2 ) ; - glVertex2i ( dx + max[0] - PU_SMALL_BEVEL , dy + min[1] + PU_SMALL_BEVEL ) ; - glVertex2i ( dx + max[0] - PU_SMALL_BEVEL/2 , dy + max[1] - PU_SMALL_BEVEL/2 ) ; - glVertex2i ( dx + max[0] - PU_SMALL_BEVEL , dy + max[1] - PU_SMALL_BEVEL ) ; - glEnd () ; - } - } - break ; - - case PUSTYLE_BEVELLED : - case PUSTYLE_SHADED : - glColor4fv ( colour [ hi ] ) ; - glBegin ( GL_QUAD_STRIP ) ; - glVertex2i ( dx + min[0] + PU_BEVEL, dy + min[1] + PU_BEVEL ) ; - glVertex2i ( dx + min[0], dy + min[1] ) ; - glVertex2i ( dx + min[0] + PU_BEVEL, dy + max[1] - PU_BEVEL ) ; - glVertex2i ( dx + min[0], dy + max[1] ) ; - glVertex2i ( dx + max[0] - PU_BEVEL, dy + max[1] - PU_BEVEL ) ; - glVertex2i ( dx + max[0], dy + max[1] ) ; - glEnd () ; - glColor4fv ( colour [ lo ] ) ; - glBegin ( GL_QUAD_STRIP ) ; - glVertex2i ( dx + min[0], dy + min[1] ) ; - glVertex2i ( dx + min[0] + PU_BEVEL, dy + min[1] + PU_BEVEL ) ; - glVertex2i ( dx + max[0], dy + min[1] ) ; - glVertex2i ( dx + max[0] - PU_BEVEL, dy + min[1] + PU_BEVEL ) ; - glVertex2i ( dx + max[0], dy + max[1] ) ; - glVertex2i ( dx + max[0] - PU_BEVEL, dy + max[1] - PU_BEVEL ) ; - glEnd () ; - - if ( abs(style) == PUSTYLE_BEVELLED ) - { - glColor4fv ( colour [ mid ] ) ; - glRecti ( dx + min[0] + PU_BEVEL, dy + min[1] + PU_BEVEL, - dx + max[0] - PU_BEVEL, dy + max[1] - PU_BEVEL ) ; - } - else - { - glShadeModel(GL_SMOOTH); - glBegin(GL_POLYGON); - glColor4fv( colour [ mid ] ); - glVertex2i( dx + min[0] + PU_BEVEL , dy + min[1] + PU_BEVEL ); - if(style==PUSTYLE_SHADED) - glColor4f( colour [mid][0] + (colour[lo][0] - colour[mid][0])/2.0f, - colour [mid][1] + (colour[lo][1] - colour[mid][1])/2.0f, - colour [mid][2] + (colour[lo][2] - colour[mid][2])/2.0f, - colour [lo][3] ); - else - glColor4f( colour [mid][0] + (colour[hi][0] - colour[mid][0])/2.0f, - colour [mid][1] + (colour[hi][1] - colour[mid][1])/2.0f, - colour [mid][2] + (colour[hi][2] - colour[mid][2])/2.0f, - colour [hi][3] ); - glVertex2i( dx + min[0] + PU_BEVEL , dy + max[1] - PU_BEVEL ); - glColor4fv( colour [ mid ] ); - glVertex2i( dx + max[0] - PU_BEVEL , dy + max[1] - PU_BEVEL ); - if(style==-PUSTYLE_SHADED) - glColor4f( colour [mid][0] + (colour[lo][0] - colour[mid][0])/2.0f, - colour [mid][1] + (colour[lo][1] - colour[mid][1])/2.0f, - colour [mid][2] + (colour[lo][2] - colour[mid][2])/2.0f, - colour [lo][3] ); - else - glColor4f( colour [mid][0] + (colour[hi][0] - colour[mid][0])/2.0f, - colour [mid][1] + (colour[hi][1] - colour[mid][1])/2.0f, - colour [mid][2] + (colour[hi][2] - colour[mid][2])/2.0f, - colour [hi][3] ); - glVertex2i( dx + max[0] - PU_BEVEL , dy + min[1] + PU_BEVEL ); - glEnd(); - glShadeModel(GL_FLAT); - - if(style == -PUSTYLE_SHADED) - { - glColor4fv ( colour [ lo ] ) ; - glBegin ( GL_QUAD_STRIP ) ; - glVertex2i ( dx + min[0] + PU_BEVEL , dy + min[1] + PU_BEVEL ) ; - glVertex2i ( dx + min[0] + PU_BEVEL/2 , dy + min[1] + PU_BEVEL/2 ) ; - glVertex2i ( dx + min[0] + PU_BEVEL , dy + max[1] - PU_BEVEL ) ; - glVertex2i ( dx + min[0] + PU_BEVEL/2 , dy + max[1] - PU_BEVEL/2 ) ; - glVertex2i ( dx + max[0] - PU_BEVEL , dy + max[1] - PU_BEVEL ) ; - glVertex2i ( dx + max[0] - PU_BEVEL/2 , dy + max[1] - PU_BEVEL/2 ) ; - glEnd () ; - glColor4fv ( colour [ hi ] ) ; - glBegin ( GL_QUAD_STRIP ) ; - glVertex2i ( dx + min[0] + PU_BEVEL/2 , dy + min[1] + PU_BEVEL/2 ) ; - glVertex2i ( dx + min[0] + PU_BEVEL , dy + min[1] + PU_BEVEL ) ; - glVertex2i ( dx + max[0] - PU_BEVEL/2 , dy + min[1] + PU_BEVEL/2 ) ; - glVertex2i ( dx + max[0] - PU_BEVEL , dy + min[1] + PU_BEVEL ) ; - glVertex2i ( dx + max[0] - PU_BEVEL/2 , dy + max[1] - PU_BEVEL/2 ) ; - glVertex2i ( dx + max[0] - PU_BEVEL , dy + max[1] - PU_BEVEL ) ; - glEnd () ; - } - } - break ; - - case PUSTYLE_BOXED : - glColor4fv ( colour [ hi ] ) ; - glRecti ( dx + min[0], dy + min[1], - dx + max[0], dy + max[1] ) ; - glColor4fv ( colour [ mid ] ) ; - glRecti ( dx + min[0]+PU_BOX_WIDTH, dy + min[1]+PU_BOX_WIDTH, - dx + max[0]-PU_BOX_WIDTH, dy + max[1]-PU_BOX_WIDTH ) ; - break ; - - case PUSTYLE_RADIO : - glColor4fv ( colour [ lo ] ) ; - glBegin ( GL_LINE_LOOP ) ; - glVertex2i ( dx + min[0] + PU_RADIO_BUTTON_SIZE/2, dy + min[1] ) ; - glVertex2i ( dx + min[0] + PU_RADIO_BUTTON_SIZE , dy + min[1] + PU_RADIO_BUTTON_SIZE/2 ) ; - glVertex2i ( dx + min[0] + PU_RADIO_BUTTON_SIZE/2, dy + min[1] + PU_RADIO_BUTTON_SIZE ) ; - glVertex2i ( dx + min[0] , dy + min[1] + PU_RADIO_BUTTON_SIZE/2 ) ; - glEnd () ; - - if ( style < 0 ) - { - glColor4fv ( colour [ hi ] ) ; - glBegin ( GL_QUADS ) ; - glVertex2i ( dx + min[0] + PU_RADIO_BUTTON_SIZE/2, dy + min[1] + 2 ) ; - glVertex2i ( dx + min[0] + PU_RADIO_BUTTON_SIZE-2, dy + min[1] + PU_RADIO_BUTTON_SIZE/2 ) ; - glVertex2i ( dx + min[0] + PU_RADIO_BUTTON_SIZE/2, dy + min[1] + PU_RADIO_BUTTON_SIZE-2 ) ; - glVertex2i ( dx + min[0] + 2 , dy + min[1] + PU_RADIO_BUTTON_SIZE/2 ) ; - glEnd () ; - } - break ; - - case PUSTYLE_SPECIAL_UNDERLINED : - glColor4fv ( colour [ hi ] ) ; - glRecti ( dx + min[0], dy + min[1], - dx + max[0], dy + min[1]+2 ) ; - glColor4fv ( colour [ mid ] ) ; - glRecti ( dx + min[0], dy + min[1]+1, - dx + max[0], dy + max[1] ) ; - break ; - - case PUSTYLE_DROPSHADOW : - glColor4fv ( colour [ lo ] ) ; - glRecti ( dx + min[0] + PU_DROPSHADOW_OFFSET, dy + min[1] - PU_DROPSHADOW_OFFSET, - dx + max[0] + PU_DROPSHADOW_OFFSET, dy + max[1] - PU_DROPSHADOW_OFFSET ) ; - glColor4fv ( colour [ mid ] ) ; - glRecti ( dx + min[0], dy + min[1], - dx + max[0], dy + max[1] ) ; - break ; - } - - if ( am_default ) - { - glColor4fv ( colour [ PUCOL_BACKGROUND ] ) ; - glLineStipple ( 1, 0xF0F0 ) ; - glEnable ( GL_LINE_STIPPLE ) ; - glBegin ( GL_LINE_LOOP ) ; - glVertex2i ( dx + min[0] + PU_DFLT_OFFSET, dy + min[1] + PU_DFLT_OFFSET ) ; - glVertex2i ( dx + min[0] + PU_DFLT_OFFSET, dy + max[1] - PU_DFLT_OFFSET ) ; - glVertex2i ( dx + max[0] - PU_DFLT_OFFSET, dy + max[1] - PU_DFLT_OFFSET ) ; - glVertex2i ( dx + max[0] - PU_DFLT_OFFSET, dy + min[1] + PU_DFLT_OFFSET ) ; - glEnd () ; - glDisable ( GL_LINE_STIPPLE ) ; - } -} - - - diff --git a/PUI/puButton.cxx b/PUI/puButton.cxx deleted file mode 100644 index 66ded922..00000000 --- a/PUI/puButton.cxx +++ /dev/null @@ -1,61 +0,0 @@ - - -#include "puLocal.h" - -void puButton::draw ( int dx, int dy ) -{ - if ( !visible ) return ; - - /* If button is pushed or highlighted - use inverse style for button itself */ - - int tempStyle; - - if ( parent && ( ( parent->getType() & PUCLASS_POPUPMENU ) || - ( parent->getType() & PUCLASS_MENUBAR ) ) ) - tempStyle = ( getValue() ^ highlighted ) ? PUSTYLE_SMALL_SHADED : style ; - else - tempStyle = ( getValue() ^ highlighted ) ? -style : style ; - - abox . draw ( dx, dy, tempStyle, colour, isReturnDefault() ) ; - - /* If greyed out then halve the opacity when drawing the label and legend */ - - if ( active ) - glColor4fv ( colour [ PUCOL_LEGEND ] ) ; - else - glColor4f ( colour [ PUCOL_LEGEND ][0], - colour [ PUCOL_LEGEND ][1], - colour [ PUCOL_LEGEND ][2], - colour [ PUCOL_LEGEND ][3] / 2.0f ) ; /* 50% more transparent */ - - int xx = ( abox.max[0] - abox.min[0] - puGetStringWidth(legendFont,legend) ) / 2 ; - int yy = ( abox.max[1] - abox.min[1] - puGetStringHeight(legendFont) ) / 2 ; - - puDrawString ( legendFont, legend, - dx + abox.min[0] + xx, - dy + abox.min[1] + yy ) ; - - draw_label ( dx, dy ) ; -} - - -void puButton::doHit ( int button, int updown, int, int ) -{ - - - if ( button == PU_LEFT_BUTTON ) - { - if ( updown == active_mouse_edge || active_mouse_edge == PU_UP_AND_DOWN ) - { - lowlight () ; - setValue ( (int) ! getValue () ) ; - invokeCallback () ; - } - else - highlight () ; - } - else - lowlight () ; -} - - diff --git a/PUI/puButtonBox.cxx b/PUI/puButtonBox.cxx deleted file mode 100644 index f569ed78..00000000 --- a/PUI/puButtonBox.cxx +++ /dev/null @@ -1,100 +0,0 @@ - -#include "puLocal.h" - -puButtonBox::puButtonBox ( int minx, int miny, int maxx, int maxy, - char **labels, int one_button ) : - puObject ( minx, miny, maxx, maxy ) -{ - type |= PUCLASS_BUTTONBOX ; - one_only = one_button ; - - button_labels = labels ; - - for ( num_kids = 0 ; button_labels [ num_kids ] != NULL ; num_kids++ ) - /* Count number of labels */ ; -} - - -int puButtonBox::checkKey ( int key, int updown ) -{ - if ( updown == PU_UP || - ! isReturnDefault() || - ( key != '\r' && key != '\n' ) ) - return FALSE ; - - int v = getValue () ; - - if ( ! one_only ) - v = ~v ; - else - if ( v++ > num_kids ) - v = 0 ; - - setValue ( v ) ; - invokeCallback() ; - return TRUE ; -} - - -int puButtonBox::checkHit ( int button, int updown, int x, int y ) -{ - if ( ! isHit ( x, y ) || - ( updown != active_mouse_edge && - active_mouse_edge != PU_UP_AND_DOWN ) ) - return FALSE ; - - int i = num_kids - 1 - (( y - abox.min[1] - PUSTR_BGAP ) * num_kids ) / - ( abox.max[1] - abox.min[1] - PUSTR_BGAP - PUSTR_TGAP ) ; - - if ( i < 0 ) i = 0 ; - if ( i >= num_kids ) i = num_kids - 1 ; - - if ( one_only ) - setValue ( i ) ; - else - setValue ( getValue () ^ ( 1 << i ) ) ; - - invokeCallback () ; - return TRUE ; -} - - -void puButtonBox::draw ( int dx, int dy ) -{ - if ( !visible ) return ; - - abox . draw ( dx, dy, style, colour, isReturnDefault() ) ; - - for ( int i = 0 ; i < num_kids ; i++ ) - { - puBox tbox ; - - tbox . min [ 0 ] = abox.min [ 0 ] + PUSTR_LGAP + PUSTR_LGAP ; - tbox . min [ 1 ] = abox.min [ 1 ] + ((abox.max[1]-abox.min[1]-PUSTR_TGAP-PUSTR_BGAP)/num_kids) * (num_kids-1-i) ; - tbox . max [ 0 ] = tbox.min [ 0 ] ; - tbox . max [ 1 ] = tbox.min [ 1 ] ; - - if (( one_only && i == getValue() ) || - ( !one_only && ((1< sl ) cursor_position = sl ; - if ( select_start_position > sl ) select_start_position = sl ; - if ( select_end_position > sl ) select_end_position = sl ; - - /* Swap the ends of the select window if they get crossed over */ - - if ( select_end_position < select_start_position ) - { - int tmp = select_end_position ; - select_end_position = select_start_position ; - select_start_position = tmp ; - } -} - -void puInput::draw ( int dx, int dy ) -{ - normalize_cursors () ; - - if ( !visible ) return ; - - /* 3D Input boxes look nicest if they are always in inverse style. */ - - abox . draw ( dx, dy, ( (style==PUSTYLE_SMALL_BEVELLED || - style==PUSTYLE_SMALL_SHADED) ) ? -style : - (accepting ? -style : style ), colour, FALSE ) ; - - int xx = puGetStringWidth ( legendFont, " " ) ; - int yy = ( abox.max[1] - abox.min[1] - puGetStringHeight(legendFont) ) / 2 ; - - if ( accepting ) - { - char val [ PUSTRING_MAX ] ; - getValue ( val ) ; - - /* Highlight the select area */ - - if ( select_end_position > 0 && - select_end_position != select_start_position ) - { - val [ select_end_position ] = '\0' ; - int cpos2 = puGetStringWidth ( legendFont, val ) + xx + dx + abox.min[0] ; - val [ select_start_position ] = '\0' ; - int cpos1 = puGetStringWidth ( legendFont, val ) + xx + dx + abox.min[0] ; - - glColor3f ( 1.0f, 1.0f, 0.7f ) ; - glRecti ( cpos1, dy + abox.min[1] + 6 , - cpos2, dy + abox.max[1] - 6 ) ; - } - } - - /* Draw the text */ - - { - /* If greyed out then halve the opacity when drawing the label and legend */ - - if ( active ) - glColor4fv ( colour [ PUCOL_LEGEND ] ) ; - else - glColor4f ( colour [ PUCOL_LEGEND ][0], - colour [ PUCOL_LEGEND ][1], - colour [ PUCOL_LEGEND ][2], - colour [ PUCOL_LEGEND ][3] / 2.0f ) ; /* 50% more transparent */ - - char val [ PUSTRING_MAX ] ; - getValue ( val ) ; - - puDrawString ( legendFont, val, - dx + abox.min[0] + xx, - dy + abox.min[1] + yy ) ; - - draw_label ( dx, dy ) ; - } - - if ( accepting ) - { - char val [ PUSTRING_MAX ] ; - getValue ( val ) ; - - /* Draw the 'I' bar cursor. */ - - if ( cursor_position >= 0 ) - { - val [ cursor_position ] = '\0' ; - - int cpos = puGetStringWidth ( legendFont, val ) + xx + dx + abox.min[0] ; - - glColor3f ( 0.1f, 0.1f, 1.0f ) ; - glBegin ( GL_LINES ) ; - glVertex2i ( cpos , dy + abox.min[1] + 7 ) ; - glVertex2i ( cpos , dy + abox.max[1] - 7 ) ; - glVertex2i ( cpos - 1, dy + abox.min[1] + 7 ) ; - glVertex2i ( cpos - 1, dy + abox.max[1] - 7 ) ; - glVertex2i ( cpos - 4, dy + abox.min[1] + 7 ) ; - glVertex2i ( cpos + 3, dy + abox.min[1] + 7 ) ; - glVertex2i ( cpos - 4, dy + abox.max[1] - 7 ) ; - glVertex2i ( cpos + 3, dy + abox.max[1] - 7 ) ; - glEnd () ; - } - } -} - - -void puInput::doHit ( int button, int updown, int x, int /* y */ ) -{ - if ( button == PU_LEFT_BUTTON ) - { - /* Most GUI's activate a button on button-UP not button-DOWN. */ - - if ( updown == active_mouse_edge || active_mouse_edge == PU_UP_AND_DOWN ) - { - lowlight () ; - - char *strval ; - getValue ( & strval ) ; - char *tmpval = new char [ strlen(strval) + 1 ] ; - strcpy ( tmpval, strval ) ; - - int i = strlen ( tmpval ) ; - - while ( x <= puGetStringWidth ( legendFont, tmpval ) + abox.min[0] && - i >= 0 ) - tmpval[--i] = '\0' ; - - accepting = TRUE ; - cursor_position = i ; - normalize_cursors () ; - invokeCallback () ; - } - else - highlight () ; - } - else - lowlight () ; -} - -int puInput::checkKey ( int key, int updown ) -{ - (updown,updown); - - if ( ! isAcceptingInput() || ! isActive () || ! isVisible () ) - return FALSE ; - - normalize_cursors () ; - - char *p ; - - switch ( key ) - { - case PU_KEY_PAGE_UP : - case PU_KEY_PAGE_DOWN : - case PU_KEY_INSERT : return FALSE ; - - case PU_KEY_UP : - case PU_KEY_DOWN : - case 0x1B /* ESC */ : - case '\t' : - case '\r' : - case '\n' : /* Carriage return/Line Feed/TAB -- End of input */ - rejectInput () ; - normalize_cursors () ; - invokeCallback () ; - break ; - - case '\b' : /* Backspace */ - if ( cursor_position > 0 ) - for ( p = & string [ --cursor_position ] ; *p != '\0' ; p++ ) - *p = *(p+1) ; - break ; - - case 0x7F : /* DEL */ - if ( select_start_position != select_end_position ) - { - char *p1 = & string [ select_start_position ] ; - char *p2 = & string [ select_end_position ] ; - - while ( *p1 != '\0' ) - *p1++ = *p2++ ; - - select_end_position = select_start_position ; - } - else - for ( p = & string [ cursor_position ] ; *p != '\0' ; p++ ) - *p = *(p+1) ; - break ; - - case 0x15 /* ^U */ : string [ 0 ] = '\0' ; break ; - case PU_KEY_HOME : cursor_position = 0 ; break ; - case PU_KEY_END : cursor_position = PUSTRING_MAX ; break ; - case PU_KEY_LEFT : cursor_position-- ; break ; - case PU_KEY_RIGHT : cursor_position++ ; break ; - - default: - if ( key < ' ' || key > 127 ) return FALSE ; - - if ( strlen ( string ) >= PUSTRING_MAX ) - return FALSE ; - - for ( p = & string [ strlen(string) ] ; - p != &string[cursor_position] ; p-- ) - *(p+1) = *p ; - - *p = key ; - cursor_position++ ; - break ; - } - - setValue ( string ) ; - normalize_cursors () ; - return TRUE ; -} - - diff --git a/PUI/puInterface.cxx b/PUI/puInterface.cxx deleted file mode 100644 index 500f8297..00000000 --- a/PUI/puInterface.cxx +++ /dev/null @@ -1,268 +0,0 @@ - -#include "puLocal.h" - -#define PUSTACK_MAX 100 - -static int currLiveInterface = -1 ; -static puInterface *liveInterfaceStack [ PUSTACK_MAX ] ; -static int currInterface = -1 ; -static puInterface *interfaceStack [ PUSTACK_MAX ] ; - -void puPushLiveInterface ( puInterface *in ) -{ - if ( currLiveInterface < PUSTACK_MAX ) - liveInterfaceStack [ ++currLiveInterface ] = in ; - else - fprintf ( stderr, "PUI: Too many live puInterfaces open at once!\n" ) ; -} - -void puPushInterface ( puInterface *in ) -{ - if ( currInterface < PUSTACK_MAX ) - interfaceStack [ ++currInterface ] = in ; - else - fprintf ( stderr, "PUI: Too many puInterfaces open at once!\n" ) ; -} - -void puPopLiveInterface ( void ) -{ - if ( currLiveInterface > 0 ) - --currLiveInterface ; - else - fprintf ( stderr, "PUI: Live puInterface stack is empty!\n" ) ; -} - -void puPopInterface ( void ) -{ - if ( currInterface > 0 ) - --currInterface ; - else - fprintf ( stderr, "PUI: puInterface stack is empty!\n" ) ; -} - -int puNoLiveInterface ( void ) -{ - return currLiveInterface < 0 ; -} - -int puNoInterface ( void ) -{ - return currInterface < 0 ; -} - -puInterface *puGetUltimateLiveInterface ( void ) -{ - if ( currLiveInterface < 0 ) - { - fprintf ( stderr, "PUI: No Live Interface!\n" ) ; - return NULL ; - } - - return liveInterfaceStack [ 0 ] ; -} - - -puInterface *puGetBaseLiveInterface ( void ) -{ - if ( currLiveInterface < 0 ) - { - fprintf ( stderr, "PUI: No Live Interface!\n" ) ; - return NULL ; - } - - /* - Work down the interface stack until you - either get to the bottom or find a block - in the form of a puDialogBox. - */ - - for ( int i = currLiveInterface ; i > 0 ; i-- ) - if ( liveInterfaceStack [ i ] -> getType () & PUCLASS_DIALOGBOX ) - return liveInterfaceStack [ i ] ; - - return liveInterfaceStack [ 0 ] ; -} - -puInterface *puGetCurrInterface ( void ) -{ - if ( currInterface < 0 ) - { - fprintf ( stderr, "PUI: No Interface!\n" ) ; - return NULL ; - } - - return interfaceStack [ currInterface ] ; -} - -void puInterface::remove ( puObject *obj ) -{ - if ( dlist == NULL ) - return ; - - /* Are we the first object in the list */ - - if ( obj -> prev == NULL ) - dlist = obj -> next ; - else - obj -> prev -> next = obj -> next ; - - /* Are we the last object in the list */ - - if ( obj -> next != NULL ) - obj -> next -> prev = obj -> prev ; - - obj -> next = NULL ; - obj -> prev = NULL ; - - num_children-- ; - recalc_bbox () ; -} - -void puInterface::add ( puObject *new_obj ) -{ - if ( dlist == NULL ) - { - dlist = new_obj ; - new_obj -> next = NULL ; - new_obj -> prev = NULL ; - } - else - { - puObject *last ; - - for ( last = dlist ; last->next != NULL ; last = last->next ) - /* Search for end of list. */ ; - - last -> next = new_obj ; - new_obj -> prev = last ; - new_obj -> next = NULL ; - } - - num_children++ ; - recalc_bbox () ; -} - -int puInterface::checkKey ( int key, int updown ) -{ - if ( dlist == NULL || ! isVisible () || ! isActive () ) - return FALSE ; - - puObject *bo ; - - /* - We have to walk the list backwards to ensure that - the click order is the same as the DRAW order. - */ - - for ( bo = dlist ; bo->next != NULL ; bo = bo->next ) - /* Find the last object in our list. */ ; - - for ( ; bo != NULL ; bo = bo->prev ) - if ( bo -> checkKey ( key, updown ) ) - return TRUE ; - - return FALSE ; -} - -int puInterface::checkHit ( int button, int updown, int x, int y ) -{ - if ( dlist == NULL || ! isVisible () || ! isActive () ) - return FALSE ; - - /* - This might be a bit redundant - but it's too hard to keep - track of changing abox sizes when daughter objects are - changing sizes. - */ - - recalc_bbox () ; - - puObject *bo ; - - x -= abox.min[0] ; - y -= abox.min[1] ; - - /* - We have to walk the list backwards to ensure that - the click order is the same as the DRAW order. - */ - - for ( bo = dlist ; bo->next != NULL ; bo = bo->next ) - /* Find the last object in our list. */ ; - - for ( ; bo != NULL ; bo = bo->prev ) - if ( bo -> checkHit ( button, updown, x, y ) ) - return TRUE ; - - return FALSE ; -} - - -void puInterface::draw ( int dx, int dy ) -{ - if ( ! isVisible () ) - return ; - - for ( puObject *bo = dlist ; bo != NULL ; bo = bo->next ) - { - /* June 16th, 98, Shammi : - * The next if statement checks if the object is - * a menu bar and makes sure it is repositioned - * correctly. - */ - - if ( bo->getType() & PUCLASS_MENUBAR ) - { - int obWidth, obHeight ; - bo -> getSize ( &obWidth, &obHeight ) ; - bo -> setPosition ( 0, puGetWindowHeight() - obHeight ) ; - } - - bo -> draw ( dx + abox.min[0], dy + abox.min[1] ) ; - } -} - - -void puInterface::recalc_bbox ( void ) -{ - puBox contents ; - contents . empty () ; - - for ( puObject *bo = dlist ; bo != NULL ; bo = bo->next ) - contents . extend ( bo -> getBBox() ) ; - - if ( contents . isEmpty () ) - { - abox . max[0] = abox . min[0] ; - abox . max[1] = abox . min[1] ; - } - else - { - abox . max[0] = abox . min[0] + contents . max[0] ; - abox . max[1] = abox . min[1] + contents . max[1] ; - } - - puObject::recalc_bbox () ; -} - - -void puInterface::doHit ( int, int, int, int ) -{ -} - - -puInterface::~puInterface () -{ - puPopLiveInterface () ; - - puObject *bo = dlist ; - - while ( bo != NULL ) { - puObject *tmp_bo = bo->next ; - delete bo ; - bo = tmp_bo ; - } -} - - - diff --git a/PUI/puLocal.h b/PUI/puLocal.h deleted file mode 100644 index a366d287..00000000 --- a/PUI/puLocal.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifdef HAVE_CONFIG_H -# include -#endif - -#include -#include -#include -#ifdef WIN32 -#include -#else -#include -#endif -#include - -#ifndef PU_NOT_USING_GLUT -#include -#endif -#include "pu.h" - diff --git a/PUI/puMenuBar.cxx b/PUI/puMenuBar.cxx deleted file mode 100644 index 87a2299b..00000000 --- a/PUI/puMenuBar.cxx +++ /dev/null @@ -1,83 +0,0 @@ - -#include "puLocal.h" - -void drop_down_the_menu ( puObject *b ) -{ - puPopupMenu *p = (puPopupMenu *) b -> getUserData () ; - - if ( b -> getValue () ) - p->reveal () ; - else - p->hide () ; - - for ( puObject *child = b -> getParent () -> getFirstChild () ; - child != NULL ; child = child -> next ) - { - if (( child -> getType() & PUCLASS_BUTTON ) != 0 && child != b ) child -> clrValue () ; - if (( child -> getType() & PUCLASS_POPUPMENU ) != 0 && child != p ) child -> hide () ; - } -} - -void puMenuBar::add_submenu ( char *str, char *items[], puCallback cb[] ) -{ - int w, h ; - getSize ( &w, &h ) ; - - puOneShot *b = new puOneShot ( w+10, 0, str ) ; - b -> setStyle ( PUSTYLE_SPECIAL_UNDERLINED ) ; - b -> setColourScheme ( colour[PUCOL_FOREGROUND][0], - colour[PUCOL_FOREGROUND][1], - colour[PUCOL_FOREGROUND][2], - colour[PUCOL_FOREGROUND][3] ) ; - b -> setCallback ( drop_down_the_menu ) ; - b -> setActiveDirn ( PU_UP_AND_DOWN ) ; - - puPopupMenu *p = new puPopupMenu ( w+10, 0 ) ; - - b -> setUserData ( p ) ; - - for ( int i = 0 ; items[i] != NULL ; i++ ) - p -> add_item ( items[i], cb[i] ) ; - - p->close () ; - recalc_bbox () ; -} - -void puMenuBar::close (void) -{ - puInterface::close () ; - - if ( dlist == NULL ) - return ; - - int width = 0 ; - puObject *ob ; - - /* - Use alternate objects - which gets the puOneShot/puPopupMenu pairs - */ - - for ( ob = dlist ; ob != NULL ; ob = ob -> next ) - { - int w, h ; - - /* Reposition the button so it looks nice */ - - ob -> getSize ( &w, &h ) ; - ob -> setPosition ( width, 0 ) ; - ob = ob -> next ; - - /* Reposition the submenu so it sits under the button */ - - int w2, h2 ; - ob -> getSize ( &w2, &h2 ) ; - ob -> setPosition ( width, -h2 ) ; - - /* Next please! */ - width += w ; - } - - recalc_bbox () ; -} - - diff --git a/PUI/puObject.cxx b/PUI/puObject.cxx deleted file mode 100644 index 00fc5a26..00000000 --- a/PUI/puObject.cxx +++ /dev/null @@ -1,222 +0,0 @@ - -#include "puLocal.h" - -inline float clamp01 ( float x ) -{ - return (x >= 1.0f) ? 1.0f : x ; -} - -static void load_colour_scheme ( float col[][4], float r, float g, - float b, float a ) -{ - puSetColour ( col [ PUCOL_FOREGROUND ], r, g, b, a ) ; - puSetColour ( col [ PUCOL_BACKGROUND ], r/2, g/2, b/2, a ) ; - puSetColour ( col [ PUCOL_HIGHLIGHT ], clamp01(r*1.3f), clamp01(g*1.3f), - clamp01(b*1.3f), a ) ; - - if ( 4 * g + 3 * r + b > 0.5 ) - puSetColour ( col [ PUCOL_LEGEND ], 0.0, 0.0, 0.0, a ) ; - else - puSetColour ( col [ PUCOL_LEGEND ], 1.0, 1.0, 1.0, a ) ; -} - - -static int defaultStyle = PUSTYLE_DEFAULT ; -static puFont defaultLegendFont = NULL ; -static puFont defaultLabelFont = NULL ; -static float defaultColourScheme [ 4 ] ; - -void puSetDefaultStyle ( int style ) { defaultStyle = style ; } -int puGetDefaultStyle ( void ) { return defaultStyle ; } - -void puSetDefaultFonts ( puFont legendFont, puFont labelFont ) -{ - defaultLegendFont = legendFont ; - defaultLabelFont = labelFont ; -} - -void puGetDefaultFonts ( puFont *legendFont, puFont *labelFont ) -{ - if ( legendFont ) *legendFont = defaultLegendFont ; - if ( labelFont ) *labelFont = defaultLabelFont ; -} - -void puSetDefaultColourScheme ( float r, float g, float b, float a ) -{ - defaultColourScheme[0] = r ; - defaultColourScheme[1] = g ; - defaultColourScheme[2] = b ; - defaultColourScheme[3] = a ; - load_colour_scheme ( _puDefaultColourTable, r, g, b, a ) ; -} - -void puGetDefaultColourScheme ( float *r, float *g, float *b, float *a ) -{ - if ( r ) *r = defaultColourScheme[0] ; - if ( g ) *g = defaultColourScheme[1] ; - if ( b ) *b = defaultColourScheme[2] ; - if ( a ) *a = defaultColourScheme[3] ; -} - - - -void puObject::setColourScheme ( float r, float g, float b, float a ) -{ - load_colour_scheme ( colour, r, g, b, a ) ; -} - -puObject::puObject ( int minx, int miny, int maxx, int maxy ) : puValue () -{ - type |= PUCLASS_OBJECT ; - bbox.min[0] = abox.min[0] = minx ; - bbox.min[1] = abox.min[1] = miny ; - bbox.max[0] = abox.max[0] = maxx ; - bbox.max[1] = abox.max[1] = maxy ; - - active_mouse_edge = PU_UP ; - style = defaultStyle ; - visible = active = TRUE ; - highlighted = FALSE ; - am_default = FALSE ; - - cb = NULL ; - user_data = NULL ; - next = prev = NULL ; - label = NULL ; - labelPlace = PUPLACE_DEFAULT ; - labelFont = defaultLabelFont ; - legend = NULL ; - legendFont = defaultLegendFont ; - - for ( int i = 0 ; i < PUCOL_MAX ; i++ ) - puSetColour ( colour[i], _puDefaultColourTable[i] ) ; - - if ( ! puNoInterface() ) - { - parent = puGetCurrInterface() ; - parent -> add ( this ) ; - } - else - parent = NULL ; -} - - -puObject::~puObject () -{ - if ( parent != this && parent != NULL ) - parent -> remove ( this ) ; -} - -void puObject::recalc_bbox ( void ) -{ - bbox = abox ; - - if ( label != NULL ) - switch ( labelPlace ) - { - case PUPLACE_ABOVE : bbox.max[1] += puGetStringHeight ( getLabelFont() ) + puGetStringDescender ( getLabelFont () ) + PUSTR_TGAP + PUSTR_BGAP ; break ; - case PUPLACE_BELOW : bbox.min[1] -= puGetStringHeight ( getLabelFont() ) + puGetStringDescender ( getLabelFont () ) + PUSTR_TGAP + PUSTR_BGAP ; break ; - case PUPLACE_LEFT : bbox.min[0] -= puGetStringWidth ( getLabelFont(), getLabel() ) + PUSTR_LGAP + PUSTR_RGAP ; break ; - case PUPLACE_RIGHT : bbox.max[0] += puGetStringWidth ( getLabelFont(), getLabel() ) + PUSTR_LGAP + PUSTR_RGAP ; break ; - } - - if ( parent != NULL ) - parent -> recalc_bbox () ; -} - -void puObject::draw_label ( int dx, int dy ) -{ - if ( !visible ) return ; - - /* If greyed out then halve the opacity when drawing the label */ - - if ( active ) - glColor4fv ( colour [ PUCOL_LABEL ] ) ; - else - glColor4f ( colour [ PUCOL_LABEL ][0], - colour [ PUCOL_LABEL ][1], - colour [ PUCOL_LABEL ][2], - colour [ PUCOL_LABEL ][3] / 2.0f ) ; /* 50% more transparent */ - - switch ( labelPlace ) - { - case PUPLACE_ABOVE : puDrawString ( labelFont, label, dx + abox.min[0] + PUSTR_LGAP, dy + abox.max[1] + puGetStringDescender(labelFont) + PUSTR_BGAP ) ; break ; - case PUPLACE_BELOW : puDrawString ( labelFont, label, dx + abox.min[0] + PUSTR_LGAP, dy + bbox.min[1] + puGetStringDescender(labelFont) + PUSTR_BGAP ) ; break ; - case PUPLACE_LEFT : puDrawString ( labelFont, label, dx + bbox.min[0] + PUSTR_LGAP, dy + abox.min[1] + puGetStringDescender(labelFont) + PUSTR_BGAP ) ; break ; - case PUPLACE_RIGHT : puDrawString ( labelFont, label, dx + abox.max[0] + PUSTR_LGAP, dy + abox.min[1] + puGetStringDescender(labelFont) + PUSTR_BGAP ) ; break ; - } -} - - -int puObject::checkKey ( int key, int updown ) -{ - if ( updown == PU_UP ) - return FALSE ; - - if ( isReturnDefault() && ( key == '\r' || key == '\n' ) ) - { - checkHit ( PU_LEFT_BUTTON, PU_DOWN, (abox.min[0]+abox.max[0])/2, - (abox.min[1]+abox.max[1])/2 ) ; - checkHit ( PU_LEFT_BUTTON, PU_UP , (abox.min[0]+abox.max[0])/2, - (abox.min[1]+abox.max[1])/2 ) ; - return TRUE ; - } - - return FALSE ; -} - - -void puObject::doHit ( int button, int updown, int x, int y ) -{ - (x,x);(y,y); - - if ( button == PU_LEFT_BUTTON ) - { - if ( updown == active_mouse_edge || active_mouse_edge == PU_UP_AND_DOWN ) - { - lowlight () ; - invokeCallback () ; - } - else - highlight () ; - } - else - lowlight () ; -} - -int puObject::checkHit ( int button, int updown, int x, int y ) -{ - if ( isHit( x, y ) ) - { - doHit ( button, updown, x, y ) ; - return TRUE ; - } - - lowlight () ; - return FALSE ; -} - - -char *puValue::getTypeString ( void ) -{ - int i = getType () ; - - if ( i & PUCLASS_DIALOGBOX ) return "puDialogBox" ; - if ( i & PUCLASS_SLIDER ) return "puSlider" ; - if ( i & PUCLASS_BUTTONBOX ) return "puButtonBox" ; - if ( i & PUCLASS_INPUT ) return "puInput" ; - if ( i & PUCLASS_MENUBAR ) return "puMenuBar" ; - if ( i & PUCLASS_POPUPMENU ) return "puPopupMenu" ; - if ( i & PUCLASS_POPUP ) return "puPopup" ; - if ( i & PUCLASS_ONESHOT ) return "puOneShot" ; - if ( i & PUCLASS_BUTTON ) return "puButton" ; - if ( i & PUCLASS_TEXT ) return "puText" ; - if ( i & PUCLASS_FRAME ) return "puFrame" ; - if ( i & PUCLASS_INTERFACE ) return "puInterface" ; - if ( i & PUCLASS_OBJECT ) return "puObject" ; - if ( i & PUCLASS_VALUE ) return "puValue" ; - - return "Unknown Object type." ; -} - - diff --git a/PUI/puOneShot.cxx b/PUI/puOneShot.cxx deleted file mode 100644 index 7d0f7c9b..00000000 --- a/PUI/puOneShot.cxx +++ /dev/null @@ -1,9 +0,0 @@ - -#include "puLocal.h" - -void puOneShot::doHit ( int button, int updown, int x, int y ) -{ - puButton::doHit ( button, updown, x, y ) ; - setValue ( 0 ) ; -} - diff --git a/PUI/puPopup.cxx b/PUI/puPopup.cxx deleted file mode 100644 index 59a5fef5..00000000 --- a/PUI/puPopup.cxx +++ /dev/null @@ -1,3 +0,0 @@ - -#include "puLocal.h" - diff --git a/PUI/puPopupMenu.cxx b/PUI/puPopupMenu.cxx deleted file mode 100644 index 0eed1023..00000000 --- a/PUI/puPopupMenu.cxx +++ /dev/null @@ -1,175 +0,0 @@ -#include "puLocal.h" - -#define PUMENU_BUTTON_HEIGHT 25 -#define PUMENU_BUTTON_EXTRA_WIDTH 25 - -puObject *puPopupMenu::add_item ( char *str, puCallback cb ) -{ - int w, h ; - getSize ( &w, &h ) ; - puOneShot *b = new puOneShot ( 0, h, str ) ; - b->setStyle ( PUSTYLE_PLAIN ) ; - b->setColourScheme ( colour[PUCOL_FOREGROUND][0], - colour[PUCOL_FOREGROUND][1], - colour[PUCOL_FOREGROUND][2], - colour[PUCOL_FOREGROUND][3] ) ; - b->setCallback ( cb ) ; - recalc_bbox () ; - return b ; -} - -void puPopupMenu::close ( void ) -{ - puPopup::close () ; - - int widest = 0 ; - puObject *ob = dlist ; - - /* - * June 17th, 1998, Shammi - * There seems to be some mismatch with the - * #define pumenusize and the actual size - * There seems to be some overlap resulting - * in more than one option being highlighted. - * By setting the size to the actual values, - * the overlap area seems to be less now. - */ - - int w, h ; - - for ( ob = dlist ; ob != NULL ; ob = ob -> next ) - { - ob -> getSize ( &w, &h ) ; - - if ( w > widest ) widest = w ; - } - - for ( ob = dlist ; ob != NULL ; ob = ob -> next ) - { - ob -> getSize ( &w, &h ) ; - ob -> setSize ( widest, h ) ; - } - - recalc_bbox () ; -} - - -int puPopupMenu::checkKey ( int key, int updown ) -{ - if ( dlist == NULL || ! isVisible () || ! isActive () ) - return FALSE ; - - if ( updown == PU_DOWN ) - { - hide () ; - - /* Turn everything off ready for next time. */ - - for ( puObject *bo = dlist ; bo != NULL ; bo = bo->next ) - bo -> clrValue () ; - } - - puObject *bo ; - - /* - We have to walk the list backwards to ensure that - the click order is the same as the DRAW order. - */ - - for ( bo = dlist ; bo->next != NULL ; bo = bo->next ) - /* Find the last object in our list. */ ; - - for ( ; bo != NULL ; bo = bo->prev ) - if ( bo -> checkKey ( key, updown ) ) - return TRUE ; - - return FALSE ; -} - - -int puPopupMenu::checkHit ( int button, int updown, int x, int y ) -{ - if ( dlist == NULL || ! isVisible () || ! isActive () ) - return FALSE ; - - /* Must test 'isHit' before making the menu invisible! */ - - int hit = isHit ( x, y ) ; - - /* - * June 17th, 1998, Shammi : - * There seemed to be a miscalculation with the menus initially - * Therefore I moved the recalculation stuff before the clearing. - */ - - /* - This might be a bit redundant - but it's too hard to keep - track of changing abox sizes when daughter objects are - changing sizes. - */ - - recalc_bbox(); - x -= abox.min[0] ; - y -= abox.min[1] ; - - /* - * June 17th, 1998, Shammi : - * Also clear the menu when the dragging the mouse and not hit. - */ - - if ( updown == active_mouse_edge || active_mouse_edge == PU_UP_AND_DOWN || - ( updown == PU_DRAG && !hit ) ) - { - - /* June 17th, 1998, Shammi : - * Do not hide the menu if mouse is dragged out - */ - - if ( updown != PU_DRAG ) - hide () ; - - /* Turn everything off ready for next time. */ - - /* June 17th, 1998, Shammi: - * Make sure we check for a hit, if the mouse is moved - * out of the menu. - */ - - for ( puObject *bo = dlist ; bo != NULL ; bo = bo->next ) - { - if ( ! hit ) - bo -> checkHit ( button, updown, x , y ) ; - - bo -> clrValue () ; - } - } - - if ( ! hit ) - return FALSE ; - - puObject *bo ; - - /* - We have to walk the list backwards to ensure that - the click order is the same as the DRAW order. - */ - - /* June 17th, 1998, Shammi : - * If the mouse is dragged and the menuItem is not hit, - * clear it - */ - - for ( bo = dlist ; bo->next != NULL ; bo = bo->next ) - if ( updown == PU_DRAG && ! bo -> checkHit ( button, updown, x, y ) ) - bo -> clrValue () ; - - /* Find the last object in our list. */ ; - - for ( ; bo != NULL ; bo = bo->prev ) - if ( bo -> checkHit ( button, updown, x, y ) ) - return TRUE ; - - return FALSE ; -} - - diff --git a/PUI/puSlider.cxx b/PUI/puSlider.cxx deleted file mode 100644 index aeab8f17..00000000 --- a/PUI/puSlider.cxx +++ /dev/null @@ -1,107 +0,0 @@ - -#include "puLocal.h" - -void puSlider::draw ( int dx, int dy ) -{ - if ( !visible ) return ; - - abox . draw ( dx, dy, - (style==PUSTYLE_BEVELLED|| - style==PUSTYLE_SHADED) ? -PUSTYLE_BOXED : -style, - colour, FALSE ) ; - - int sd, od ; - - if ( isVertical() ) { sd = 1 ; od = 0 ; } else { sd = 0 ; od = 1 ; } - - int sz = abox.max [sd] - abox.min [sd] ; - - float val ; - - getValue ( & val ) ; - - if ( val < 0.0f ) val = 0.0f ; - if ( val > 1.0f ) val = 1.0f ; - - val *= (float) sz * (1.0f - slider_fraction) ; - - puBox bx ; - - bx . min [ sd ] = abox . min [ sd ] + (int) val ; - bx . max [ sd ] = (int) ( (float) bx . min [ sd ] + (float) sz * slider_fraction ) ; - bx . min [ od ] = abox . min [ od ] + 2 ; - bx . max [ od ] = abox . max [ od ] - 2 ; - - bx . draw ( dx, dy, PUSTYLE_SMALL_SHADED, colour, FALSE ) ; - - /* If greyed out then halve the opacity when drawing the label and legend */ - - if ( active ) - glColor4fv ( colour [ PUCOL_LEGEND ] ) ; - else - glColor4f ( colour [ PUCOL_LEGEND ][0], - colour [ PUCOL_LEGEND ][1], - colour [ PUCOL_LEGEND ][2], - colour [ PUCOL_LEGEND ][3] / 2.0f ) ; /* 50% more transparent */ - - int xx = ( abox.max[0] - abox.min[0] - puGetStringWidth(legendFont,legend) ) / 2 ; - int yy = ( abox.max[1] - abox.min[1] - puGetStringHeight(legendFont) ) / 2 ; - - puDrawString ( legendFont, legend, - dx + abox.min[0] + xx, - dy + abox.min[1] + yy ) ; - - draw_label ( dx, dy ) ; -} - - -void puSlider::doHit ( int button, int updown, int x, int y ) -{ - if ( button == PU_LEFT_BUTTON ) - { - int sd = isVertical() ; - int sz = abox.max [sd] - abox.min [sd] ; - int coord = isVertical() ? y : x ; - - float next_value ; - - if ( sz == 0 ) - next_value = 0.5f ; - else - { - next_value = ( (float)coord - (float)abox.min[sd] - (float)sz * slider_fraction / 2.0f ) / - ( (float) sz * (1.0f - slider_fraction) ) ; - } - - next_value = (next_value < 0.0f) ? 0.0f : (next_value > 1.0) ? 1.0f : next_value ; - - setValue ( next_value ) ; - - switch ( cb_mode ) - { - case PUSLIDER_CLICK : - if ( updown == active_mouse_edge ) - { - last_cb_value = next_value ; - invokeCallback () ; - } - break ; - - case PUSLIDER_DELTA : - if ( fabs ( last_cb_value - next_value ) >= cb_delta ) - { - last_cb_value = next_value ; - invokeCallback () ; - } - break ; - - case PUSLIDER_ALWAYS : - default : - last_cb_value = next_value ; - invokeCallback () ; - break ; - } - } -} - - diff --git a/PUI/puText.cxx b/PUI/puText.cxx deleted file mode 100644 index 032c0162..00000000 --- a/PUI/puText.cxx +++ /dev/null @@ -1,8 +0,0 @@ - -#include "puLocal.h" - -void puText::draw ( int dx, int dy ) -{ - draw_label ( dx, dy ) ; -} - diff --git a/example/Makefile.am b/example/Makefile.am deleted file mode 100644 index 8528348b..00000000 --- a/example/Makefile.am +++ /dev/null @@ -1,17 +0,0 @@ -bin_PROGRAMS = example - -example_SOURCES = example.cxx - -example_LDADD = \ - $(top_builddir)/Lib/Audio/src/libsl.a \ - $(top_builddir)/Lib/Audio/src/libsm.a - -INCLUDES += -I$(top_builddir)/Lib/Audio/src - -if ENABLE_IRIX_AUDIO -LIBS += -laudio -endif - -if ENABLE_WIN32_AUDIO -LIBS += -lwinmm -endif diff --git a/example/example.cxx b/example/example.cxx deleted file mode 100644 index ae519786..00000000 --- a/example/example.cxx +++ /dev/null @@ -1,89 +0,0 @@ - - -#include "sl.h" -#include "sm.h" -#include - -/* - Construct a sound scheduler and a mixer. -*/ - -slScheduler sched ( 8000 ) ; -smMixer mixer ; - -int main () -{ - mixer . setMasterVolume ( 30 ) ; - sched . setSafetyMargin ( 0.128 ) ; - - /* Just for fun, let's make a one second synthetic engine sample... */ - - Uchar buffer [ 8000 ] ; - - for ( int i = 0 ; i < 8000 ; i++ ) - { - /* Sum some sin waves and convert to range 0..1 */ - - float level = ( sin ( (double) i * 2.0 * M_PI / (8000.0/ 50.0) ) + - sin ( (double) i * 2.0 * M_PI / (8000.0/149.0) ) + - sin ( (double) i * 2.0 * M_PI / (8000.0/152.0) ) + - sin ( (double) i * 2.0 * M_PI / (8000.0/192.0) ) - ) / 8.0f + 0.5f ; - - /* Convert to unsigned byte */ - - buffer [ i ] = (Uchar) ( level * 255.0 ) ; - } - - /* Set up four samples and a loop */ - - slSample *s = new slSample ( buffer, 8000 ) ; - slSample *s1 = new slSample ( "scream.ub", & sched ) ; - slSample *s2 = new slSample ( "zzap.wav" , & sched ) ; - slSample *s3 = new slSample ( "cuckoo.au", & sched ) ; - slSample *s4 = new slSample ( "wheeee.ub", & sched ) ; - - /* Mess about with some of the samples... */ - - s1 -> adjustVolume ( 2.2 ) ; - s2 -> adjustVolume ( 0.5 ) ; - s3 -> adjustVolume ( 0.2 ) ; - - /* Play the engine sample continuously. */ - - sched . loopSample ( s ) ; - - int tim = 0 ; /* My periodic event timer. */ - - while ( SL_TRUE ) - { - tim++ ; /* Time passes */ - - if ( tim % 200 == 0 ) sched.playSample ( s1 ) ; - if ( tim % 180 == 0 ) sched.playSample ( s2 ) ; - if ( tim % 150 == 0 ) sched.playSample ( s3 ) ; - if ( tim % 120 == 0 ) sched.playSample ( s4 ) ; - - /* - For the sake of realism, I'll delay for 1/30th second to - simulate a graphics update process. - */ - -#ifdef WIN32 - Sleep ( 1000 / 30 ) ; /* 30Hz */ -#elif defined(sgi) - sginap( 3 ); /* ARG */ -#else - usleep ( 1000000 / 30 ) ; /* 30Hz */ -#endif - - /* - This would normally be called just before the graphics buffer swap - - but it could be anywhere where it's guaranteed to get called - fairly often. - */ - - sched . update () ; - } -} - diff --git a/src/Makefile.am b/src/Makefile.am deleted file mode 100644 index e9f45317..00000000 --- a/src/Makefile.am +++ /dev/null @@ -1,10 +0,0 @@ -noinst_LIBRARIES = libsl.a libsm.a - -libsl_a_SOURCES = \ - sl.h slPortability.h \ - slDSP.cxx slSample.cxx slEnvelope.cxx \ - slSamplePlayer.cxx slScheduler.cxx - -libsm_a_SOURCES = sm.h slPortability.h smMixer.cxx - -INCLUDES += -I$(top_builddir) -I. diff --git a/src/sl.h b/src/sl.h deleted file mode 100644 index 5cbbc2ad..00000000 --- a/src/sl.h +++ /dev/null @@ -1,629 +0,0 @@ - -#ifndef __SL_H__ -#define __SL_H__ 1 - -#include "slPortability.h" - -#ifdef SL_USING_OSS_AUDIO -#define SLDSP_DEFAULT_DEVICE "/dev/dsp" -#elif defined(WIN32) -#define SLDSP_DEFAULT_DEVICE "dsp" -#elif defined(__OpenBSD__) -#define SLDSP_DEFAULT_DEVICE "/dev/audio" -#elif defined(sgi) -#define SLDSP_DEFAULT_DEVICE "dsp" // dummy ... -#else -#error "Port me !" -#endif - -# define SL_TRUE 1 -# define SL_FALSE 0 - -typedef unsigned char Uchar ; -typedef unsigned short Ushort ; - -#define SL_DEFAULT_SAMPLING_RATE 11025 - -class slSample ; -class slSamplePlayer ; -class slEnvelope ; -class slScheduler ; -class slDSP ; - -extern char *__slPendingError ; - -class slDSP -{ -private: - - int stereo ; - int rate ; - int bps ; - - int error ; - int fd ; - -#ifdef __OpenBSD__ - audio_info_t ainfo; // ioctl structure - audio_offset_t audio_offset; // offset in audiostream - long counter; // counter-written packets -#elif defined(SL_USING_OSS_AUDIO) - audio_buf_info buff_info ; -#elif defined(sgi) - ALconfig config; // configuration stuff - ALport port; // .. we are here -#endif - - -#ifndef WIN32 - int ioctl ( int cmd, int param = 0 ) - { - if ( error ) return param ; - - if ( ::ioctl ( fd, cmd, & param ) == -1 ) - { - perror ( "slDSP: ioctl" ) ; - error = SL_TRUE ; - } - - return param ; - } - -#elif defined(WIN32) - - HWAVEOUT hWaveOut; // device handle - WAVEFORMATEX Format; // open needs this - MMTIME mmt; // timing - WAVEHDR wavehdr[ 3 ]; // for round robin .. - int curr_header; // index of actual wavehdr - long counter; // counter-written packets - -#endif - - void open ( char *device, int _rate, int _stereo, int _bps ) ; - void close () ; - void getBufferInfo () ; - void write ( void *buffer, size_t length ) ; - -protected: - - void setError () { error = SL_TRUE ; } - int getDriverBufferSize () ; - -public: - - slDSP ( int _rate = SL_DEFAULT_SAMPLING_RATE, - int _stereo = SL_FALSE, int _bps = 8 ) - { - open ( SLDSP_DEFAULT_DEVICE, _rate, _stereo, _bps ) ; - } - - slDSP ( char *device, int _rate = SL_DEFAULT_SAMPLING_RATE, - int _stereo = SL_FALSE, int _bps = 8 ) - { - open ( device, _rate, _stereo, _bps ) ; - } - - ~slDSP () { close () ; } - - float secondsRemaining () ; - float secondsUsed () ; - - void play ( void *buffer, size_t length ) { write ( buffer, length ) ; } - - int working () { return !error ; } - int not_working () { return error ; } - - int getBps () { return bps ; } - int getRate () { return rate ; } - int getStereo() { return stereo ; } - - void sync () ; - void stop () ; -} ; - - -class slSample -{ - int ref_count ; -protected: - - char *comment; - int rate ; - int bps ; - int stereo ; - - Uchar *buffer ; - int length ; - - void init () - { - ref_count = 0 ; - comment = NULL ; - buffer = NULL ; - length = 0 ; - rate = SL_DEFAULT_SAMPLING_RATE ; - bps = 8 ; - stereo = SL_FALSE ; - } - -public: - - slSample () { init () ; } - - slSample ( Uchar *buff, int leng ) - { - init () ; - setBuffer ( buff, leng ) ; - } - - slSample ( char *fname, class slDSP *dsp = NULL ) - { - init () ; - loadFile ( fname ) ; - autoMatch ( dsp ) ; - } - - ~slSample () - { - if ( ref_count != 0 && __slPendingError == NULL ) - __slPendingError = - "slSample: FATAL ERROR - Application deleted a sample while it was playing.\n" ; - - delete buffer ; - } - - void ref () { ref_count++ ; } - void unRef () { ref_count-- ; } - - int getPlayCount () { return ref_count ; } - - char *getComment () { return comment ; } - - void setComment ( char *nc ) - { - delete comment ; - comment = new char [ strlen ( nc ) + 1 ] ; - strcpy ( comment, nc ) ; - } - - Uchar *getBuffer () { return buffer ; } - int getLength () { return length ; } - - void autoMatch ( slDSP *dsp ) ; - - void setBuffer ( Uchar *buff, int leng ) - { - delete buffer ; - - buffer = new Uchar [ leng ] ; - - if ( buff != NULL ) - memcpy ( buffer, buff, leng ) ; - - length = leng ; - } - - /* These routines only set flags - use changeXXX () to convert a sound */ - - void setRate ( int r ) { rate = r ; } - void setBps ( int b ) { bps = b ; } - void setStereo ( int s ) { stereo = s ; } - - int getRate () { return rate ; } - int getBps () { return bps ; } - int getStereo () { return stereo ; } - - float getDuration () { return (float) getLength() / - (float) ( (getStereo()?2.0f:1.0f)* - (getBps()/8.0f)*getRate() ) ; } - - int loadFile ( char *fname ) ; - - int loadRawFile ( char *fname ) ; - int loadAUFile ( char *fname ) ; - int loadWavFile ( char *fname ) ; - - void changeRate ( int r ) ; - void changeBps ( int b ) ; - void changeStereo ( int s ) ; - void changeToUnsigned () ; - - void adjustVolume ( float vol ) ; - - void print ( FILE *fd ) - { - if ( buffer == NULL ) - { - fprintf ( fd, "Empty sample buffer\n" ) ; - } - else - { - fprintf ( fd, "\"%s\"\n",(getComment() == NULL || - getComment()[0]=='\0') ? "Sample" : comment ) ; - fprintf ( fd, "%s, %d bits per sample.\n", - getStereo() ? "Stereo" : "Mono", getBps() ) ; - fprintf ( fd, "%gKHz sample rate.\n", (float) getRate() / 1000.0f ) ; - fprintf ( fd, "%d bytes of samples == %g seconds duration.\n", getLength(), getDuration() ) ; - } - } -} ; - - -enum slSampleStatus -{ - SL_SAMPLE_WAITING, /* Sound hasn't started playing yet */ - SL_SAMPLE_RUNNING, /* Sound has started playing */ - SL_SAMPLE_DONE , /* Sound is complete */ - SL_SAMPLE_PAUSED /* Sound hasn't started playing yet */ -} ; - - -enum slPreemptMode -{ - SL_SAMPLE_CONTINUE, /* Don't allow yourself to be preempted */ - SL_SAMPLE_ABORT , /* Abort playing the sound when preempted */ - SL_SAMPLE_RESTART , /* Restart the sound when load permits */ - SL_SAMPLE_MUTE , /* Continue silently until load permits */ - SL_SAMPLE_DELAY /* Pause until load permits */ -} ; - - -enum slReplayMode -{ - SL_SAMPLE_LOOP, /* Loop sound so that it plays forever */ - SL_SAMPLE_ONE_SHOT /* Play sound just once */ -} ; - -enum slEvent -{ - SL_EVENT_COMPLETE, /* Sound finished playing */ - SL_EVENT_LOOPED, /* Sound looped back to the start */ - SL_EVENT_PREEMPTED /* Sound was preempted */ -} ; - -typedef void (*slCallBack) ( slSample *, slEvent, int ) ; - -class slEnvelope -{ -public: /* SJB TESTING! */ - - float *time ; - float *value ; - int nsteps ; - int ref_count ; - - slReplayMode replay_mode ; - - int getStepDelta ( float *_time, float *delta ) ; - -public: - - slEnvelope ( int _nsteps, slReplayMode _rm, float *_times, float *_values ) - { - ref_count = 0 ; - nsteps = _nsteps ; - time = new float [ nsteps ] ; - value = new float [ nsteps ] ; - memcpy ( time , _times , sizeof(float) * nsteps ) ; - memcpy ( value, _values, sizeof(float) * nsteps ) ; - - replay_mode = _rm ; - } - - - slEnvelope ( int _nsteps = 1, slReplayMode _rm = SL_SAMPLE_ONE_SHOT ) - { - ref_count = 0 ; - nsteps = _nsteps ; - time = new float [ nsteps ] ; - value = new float [ nsteps ] ; - - for ( int i = 0 ; i < nsteps ; i++ ) - time [ i ] = value [ i ] = 0.0 ; - - replay_mode = _rm ; - } - - ~slEnvelope () - { - if ( ref_count != 0 && __slPendingError == NULL ) - __slPendingError = - "slEnvelope: FATAL ERROR - Application deleted an envelope while it was playing.\n" ; - - delete time ; - delete value ; - } - - void ref () { ref_count++ ; } - void unRef () { ref_count-- ; } - - int getPlayCount () { return ref_count ; } - - void setStep ( int n, float _time, float _value ) - { - if ( n >= 0 && n < nsteps ) - { - time [ n ] = _time ; - value [ n ] = _value ; - } - } - - float getStepValue ( int s ) { return value [ s ] ; } - float getStepTime ( int s ) { return time [ s ] ; } - - int getNumSteps () { return nsteps ; } - - float getValue ( float _time ) ; - - void applyToPitch ( Uchar *dst, slSamplePlayer *src, int nframes, int start, int next_env ) ; - void applyToInvPitch ( Uchar *dst, slSamplePlayer *src, int nframes, int start, int next_env ) ; - void applyToVolume ( Uchar *dst, Uchar *src, int nframes, int start ) ; - void applyToInvVolume ( Uchar *dst, Uchar *src, int nframes, int start ) ; -} ; - -#define SL_MAX_PRIORITY 16 -#define SL_MAX_SAMPLES 16 -#define SL_MAX_CALLBACKS (SL_MAX_SAMPLES * 2) -#define SL_MAX_ENVELOPES 4 - -enum slEnvelopeType -{ - SL_PITCH_ENVELOPE , SL_INVERSE_PITCH_ENVELOPE , - SL_VOLUME_ENVELOPE, SL_INVERSE_VOLUME_ENVELOPE, - SL_FILTER_ENVELOPE, SL_INVERSE_FILTER_ENVELOPE, - SL_PAN_ENVELOPE , SL_INVERSE_PAN_ENVELOPE , - SL_ECHO_ENVELOPE , SL_INVERSE_ECHO_ENVELOPE , - - SL_NULL_ENVELOPE -} ; - -struct slPendingCallBack -{ - slCallBack callback ; - slSample *sample ; - slEvent event ; - int magic ; -} ; - -class slSamplePlayer -{ - int lengthRemaining ; /* Sample frames remaining until repeat */ - Uchar *bufferPos ; /* Sample frame to replay next */ - slSample *sample ; - - slEnvelope *env [ SL_MAX_ENVELOPES ] ; - slEnvelopeType env_type [ SL_MAX_ENVELOPES ] ; - int env_start_time [ SL_MAX_ENVELOPES ] ; - - slReplayMode replay_mode ; - slPreemptMode preempt_mode ; - slSampleStatus status ; - int priority ; - - slCallBack callback ; - int magic ; - - void low_read ( int nframes, Uchar *dest ) ; - -public: - - slSamplePlayer ( slSample *s, slReplayMode rp_mode = SL_SAMPLE_ONE_SHOT, - int pri = 0, slPreemptMode pr_mode = SL_SAMPLE_DELAY, - int _magic = 0, slCallBack cb = NULL ) - { - magic = _magic ; - sample = s ; - callback = cb ; - - for ( int i = 0 ; i < SL_MAX_ENVELOPES ; i++ ) - { - env [ i ] = NULL ; - env_type [ i ] = SL_NULL_ENVELOPE ; - } - - if ( sample ) sample -> ref () ; - - reset () ; - - replay_mode = rp_mode ; - preempt_mode = pr_mode ; - priority = pri ; - } - - ~slSamplePlayer () ; - - slPreemptMode getPreemptMode () { return preempt_mode ; } - - int getPriority () - { - return ( isRunning() && - preempt_mode == SL_SAMPLE_CONTINUE ) ? (SL_MAX_PRIORITY+1) : - priority ; - } - - int preempt ( int delay ) ; - - void addEnvelope ( int i, slEnvelope *_env, slEnvelopeType _type ) ; - - void pause () - { - if ( status != SL_SAMPLE_DONE ) - status = SL_SAMPLE_PAUSED ; - } - - void resume () - { - if ( status == SL_SAMPLE_PAUSED ) - status = SL_SAMPLE_RUNNING ; - } - - void reset () - { - status = SL_SAMPLE_WAITING ; - lengthRemaining = sample->getLength () ; - bufferPos = sample->getBuffer () ; - } - - void start () - { - status = SL_SAMPLE_RUNNING ; - lengthRemaining = sample->getLength () ; - bufferPos = sample->getBuffer () ; - } - - void stop () - { - status = SL_SAMPLE_DONE ; - lengthRemaining = 0 ; - bufferPos = NULL ; - } - - int getMagic () { return magic ; } - slSample *getSample () { return sample ; } - - int isWaiting () { return status == SL_SAMPLE_WAITING ; } - int isPaused () { return status == SL_SAMPLE_PAUSED ; } - int isRunning () { return status == SL_SAMPLE_RUNNING ; } - int isDone () { return status == SL_SAMPLE_DONE ; } - - void skip ( int nframes ) ; - void read ( int nframes, Uchar *dest, int next_env = 0 ) ; -} ; - - -class slScheduler : public slDSP -{ - slPendingCallBack pending_callback [ SL_MAX_CALLBACKS ] ; - int num_pending_callbacks ; - - float safety_margin ; - - int mixer_buffer_size ; - - Uchar *mixer_buffer ; - Uchar *spare_buffer0 ; - Uchar *spare_buffer1 ; - Uchar *spare_buffer2 ; - - Uchar *mixer ; - int amount_left ; - - slSamplePlayer *samplePlayer [ SL_MAX_SAMPLES ] ; - - void init () ; - - void mixBuffer ( slSamplePlayer *a, - slSamplePlayer *b ) ; - - void mixBuffer ( slSamplePlayer *a, - slSamplePlayer *b, - slSamplePlayer *c ) ; - - Uchar mix ( Uchar a, Uchar b ) - { - register int r = a + b - 0x80 ; - return ( r > 255 ) ? 255 : - ( r < 0 ) ? 0 : r ; - } - - Uchar mix ( Uchar a, Uchar b, Uchar c ) - { - register int r = a + b + c - 0x80 - 0x80 ; - return ( r > 255 ) ? 255 : - ( r < 0 ) ? 0 : r ; - } - - void realUpdate ( int dump_first = SL_FALSE ) ; - - void initBuffers () ; - - int now ; - - static slScheduler *current ; - -public: - - slScheduler ( int _rate = SL_DEFAULT_SAMPLING_RATE ) : slDSP ( _rate, SL_FALSE, 8 ) { init () ; } - slScheduler ( char *device, - int _rate = SL_DEFAULT_SAMPLING_RATE ) : slDSP ( device, _rate, SL_FALSE, 8 ) { init () ; } - ~slScheduler () ; - - static slScheduler *getCurrent () { return current ; } - - int getTimeNow () { return now ; } - float getElapsedTime ( int then ) { return (float)(now-then)/(float)getRate() ; } - - void flushCallBacks () ; - void addCallBack ( slCallBack c, slSample *s, slEvent e, int m ) ; - - void update () { realUpdate ( SL_FALSE ) ; } - void dumpUpdate () { realUpdate ( SL_TRUE ) ; } - - void addSampleEnvelope ( slSample *s = NULL, int magic = 0, - int slot = 1, slEnvelope *e = NULL, - slEnvelopeType t = SL_VOLUME_ENVELOPE ) - { - for ( int i = 0 ; i < SL_MAX_SAMPLES ; i++ ) - if ( samplePlayer [ i ] != NULL && - ( s == NULL || samplePlayer [ i ] -> getSample () == s ) && - ( magic == 0 || samplePlayer [ i ] -> getMagic () == magic ) ) - samplePlayer [ i ] -> addEnvelope ( slot, e, t ) ; - } - - void resumeSample ( slSample *s = NULL, int magic = 0 ) - { - for ( int i = 0 ; i < SL_MAX_SAMPLES ; i++ ) - if ( samplePlayer [ i ] != NULL && - ( s == NULL || samplePlayer [ i ] -> getSample () == s ) && - ( magic == 0 || samplePlayer [ i ] -> getMagic () == magic ) ) - samplePlayer [ i ] -> resume () ; - } - - void pauseSample ( slSample *s = NULL, int magic = 0 ) - { - for ( int i = 0 ; i < SL_MAX_SAMPLES ; i++ ) - if ( samplePlayer [ i ] != NULL && - ( s == NULL || samplePlayer [ i ] -> getSample () == s ) && - ( magic == 0 || samplePlayer [ i ] -> getMagic () == magic ) ) - samplePlayer [ i ] -> pause () ; - } - - void stopSample ( slSample *s = NULL, int magic = 0 ) - { - for ( int i = 0 ; i < SL_MAX_SAMPLES ; i++ ) - if ( samplePlayer [ i ] != NULL && - ( s == NULL || samplePlayer [ i ] -> getSample () == s ) && - ( magic == 0 || samplePlayer [ i ] -> getMagic () == magic ) ) - samplePlayer [ i ] -> stop () ; - } - - int loopSample ( slSample *s, int pri = 0, slPreemptMode mode = SL_SAMPLE_MUTE, int magic = 0, slCallBack cb = NULL ) - { - for ( int i = 0 ; i < SL_MAX_SAMPLES ; i++ ) - if ( samplePlayer [ i ] == NULL ) - { - samplePlayer [ i ] = new slSamplePlayer ( s, SL_SAMPLE_LOOP, pri, mode, magic, cb ) ; - return i ; - } - - return -1 ; - } - - int playSample ( slSample *s, int pri = 1, slPreemptMode mode = SL_SAMPLE_ABORT, int magic = 0, slCallBack cb = NULL ) - { - for ( int i = 0 ; i < SL_MAX_SAMPLES ; i++ ) - if ( samplePlayer [ i ] == NULL ) - { - samplePlayer [ i ] = new slSamplePlayer ( s, SL_SAMPLE_ONE_SHOT, pri, mode, magic, cb ) ; - return SL_TRUE ; - } - - return SL_FALSE ; - } - - void setSafetyMargin ( float seconds ) { safety_margin = seconds ; } -} ; - -#endif - diff --git a/src/slDSP.cxx b/src/slDSP.cxx deleted file mode 100644 index a8a96d4d..00000000 --- a/src/slDSP.cxx +++ /dev/null @@ -1,669 +0,0 @@ - -#include "sl.h" - -static int init_bytes ; - -#ifdef SL_USING_OSS_AUDIO - -/* ------------------------------------------------------------ */ -/* OSSAUDIO - Linux, FreeBSD, etc */ -/* ------------------------------------------------------------ */ - -void slDSP::open ( char *device, int _rate, int _stereo, int _bps ) -{ - fd = ::open ( device, O_WRONLY ) ; - - if ( fd < 0 ) - { - perror ( "slDSP: open" ) ; - error = SL_TRUE ; - - stereo = SL_FALSE ; - bps = 1 ; - rate = 8000 ; - init_bytes = 0 ; - } - else - { - error = SL_FALSE ; - - /* Set up a driver fragment size of 1024 (ie 2^10) */ - - ioctl ( SNDCTL_DSP_SETFRAGMENT, 0x7FFF000A ) ; - - stereo = ioctl ( SOUND_PCM_WRITE_CHANNELS, _stereo ? 2 : 1 ) >= 2 ; - bps = ioctl ( SOUND_PCM_WRITE_BITS, _bps ) ; - rate = ioctl ( SOUND_PCM_WRITE_RATE, _rate ) ; - - getBufferInfo () ; - init_bytes = buff_info.bytes ; - } -} - - -void slDSP::close () -{ - if ( fd >= 0 ) - ::close ( fd ) ; -} - - -int slDSP::getDriverBufferSize () -{ - if ( error ) - return 0 ; - - getBufferInfo () ; - return buff_info.fragsize ; -} - -void slDSP::getBufferInfo () -{ - if ( error ) - return ; - - if ( ::ioctl ( fd, SNDCTL_DSP_GETOSPACE, & buff_info ) < 0 ) - { - perror ( "slDSP: getBufferInfo" ) ; - error = SL_TRUE ; - return ; - } -} - - -void slDSP::write ( void *buffer, size_t length ) -{ - if ( error || length <= 0 ) - return ; - - int nwritten = ::write ( fd, (const char *) buffer, length ) ; - - if ( nwritten < 0 ) - perror ( "slDSP: write" ) ; - else - if ( nwritten != length ) - perror ( "slDSP: short write" ) ; -} - - -float slDSP::secondsRemaining () -{ - if ( error ) - return 0.0f ; - - getBufferInfo () ; - - int samples_left = buff_info.fragments * buff_info.fragsize ; - - if ( stereo ) samples_left /= 2 ; - if ( bps == 16 ) samples_left /= 2 ; - return (float) samples_left / (float) rate ; -} - - -float slDSP::secondsUsed () -{ - if ( error ) - return 0.0f ; - - getBufferInfo () ; - - int samples_used = init_bytes - buff_info.bytes ; - - if ( stereo ) samples_used /= 2 ; - if ( bps == 16 ) samples_used /= 2 ; - return (float) samples_used / (float) rate ; -} - - -void slDSP::sync () -{ - if ( !error) ::ioctl ( fd, SOUND_PCM_SYNC , 0 ) ; -} - -void slDSP::stop () -{ - if ( !error) ::ioctl ( fd, SOUND_PCM_RESET, 0 ) ; -} - -#endif - -#ifdef WIN32 - -/* ------------------------------------------------------------ */ -/* win32 */ -/* ------------------------------------------------------------ */ - -static void wperror(MMRESULT num) -{ - char buffer[0xff]; // yes, this is hardcoded :-) - - waveOutGetErrorText( num, buffer, sizeof(buffer)-1); - - fprintf( stderr, "SlDSP: %s\n", buffer ); - fflush ( stderr ); -} - - - -void CALLBACK waveOutProc( HWAVEOUT hwo, UINT uMsg, - DWORD dwInstance, DWORD dwParam1, DWORD dwParam2 ) -{ - switch( uMsg ) - { - case WOM_CLOSE: - break; - - case WOM_OPEN: - break; - - case WOM_DONE: - waveOutUnprepareHeader( (HWAVEOUT)dwParam1, - (LPWAVEHDR)dwParam2, sizeof( WAVEHDR )); - break; - } -} - - -void slDSP::open ( char *device, int _rate, int _stereo, int _bps ) -{ - MMRESULT result; - - hWaveOut = NULL; - curr_header = 0; - counter = 0; - - Format.wFormatTag = WAVE_FORMAT_PCM; - Format.nChannels = _stereo ? 2 : 1; - Format.nSamplesPerSec = _rate; - Format.wBitsPerSample = _bps; - Format.nBlockAlign = 1; - Format.nAvgBytesPerSec = _rate * Format.nChannels; - Format.cbSize = 0; - - result = waveOutOpen( & hWaveOut, WAVE_MAPPER, & Format, NULL, - 0L, WAVE_FORMAT_QUERY ); - - if ( result != MMSYSERR_NOERROR ) - { - wperror( result); - - error = SL_TRUE ; - stereo = SL_FALSE ; - bps = _bps ; - rate = _rate ; - init_bytes = 0 ; - - return; - } - - // Now the hwaveouthandle "should" be valid - - if ( ( result = waveOutOpen( & hWaveOut, WAVE_MAPPER, - (WAVEFORMATEX *)& Format, (DWORD)waveOutProc, - 0L, CALLBACK_FUNCTION )) != MMSYSERR_NOERROR ) - { - wperror( result); - - error = SL_TRUE ; - stereo = SL_FALSE ; - bps = _bps ; - rate = _rate ; - init_bytes = 0 ; - return; - } - else - { - error = SL_FALSE ; - stereo = _stereo; - bps = _bps; - rate = _rate; - - /* hmm ?! */ - - init_bytes = 1024*8; - } -} - - -void slDSP::close () -{ - if ( hWaveOut != NULL ) - { - waveOutClose( hWaveOut ); - hWaveOut = NULL; - } -} - -int slDSP::getDriverBufferSize () -{ - if ( error ) - return 0 ; - - /* hmm ?! */ - - return 1024*8; -} - -void slDSP::getBufferInfo () -{ - return ; -} - - -void slDSP::write ( void *buffer, size_t length ) -{ - MMRESULT result; - - if ( error || length <= 0 ) - return ; - - wavehdr[curr_header].lpData = (LPSTR) buffer; - wavehdr[curr_header].dwBufferLength = (long) length; - wavehdr[curr_header].dwBytesRecorded = 0L; - wavehdr[curr_header].dwUser = NULL; - wavehdr[curr_header].dwFlags = 0; - wavehdr[curr_header].dwLoops = 0; - wavehdr[curr_header].lpNext = NULL; - wavehdr[curr_header].reserved = 0; - - - result = waveOutPrepareHeader( hWaveOut, & wavehdr[curr_header], - sizeof(WAVEHDR)); - - if ( result != MMSYSERR_NOERROR ) - { - wperror ( result ); - error = SL_TRUE; - } - - result = waveOutWrite(hWaveOut, & wavehdr[curr_header], - sizeof(WAVEHDR)); - if ( result != MMSYSERR_NOERROR ) - { - wperror ( result ); - error = SL_TRUE; - } - - counter ++; - - curr_header = ( curr_header + 1 ) % 3; -} - - -float slDSP::secondsRemaining () -{ - if ( error ) - return 0.0f ; - - return 0.0f ; -} - - -float slDSP::secondsUsed () -{ - int samples_used; - MMRESULT result; - float samp_time; - - if ( error ) - return 0.0f ; - - mmt.wType = TIME_BYTES; - - result = waveOutGetPosition( hWaveOut, &mmt, sizeof( mmt )); - - if ( mmt.u.cb == 0 || counter == 0) - return (float)0.0; - - samples_used = ( init_bytes * counter ) - mmt.u.cb; - - if ( stereo ) samples_used /= 2 ; - if ( bps == 16 ) samples_used /= 2 ; - - samp_time = (float) samples_used / (float) rate ; - - //printf("%0.2f position=%ld total written=%ld\n", - // samp_time, mmt.u.cb, init_bytes * counter ); - - return samp_time; -} - - -void slDSP::sync () -{ -} - -void slDSP::stop () -{ - if ( error ) - return ; - - waveOutReset( hWaveOut ); -} - -/* ------------------------------------------------------------ */ -/* OpenBSD 2.3 this should be very close to SUN Audio */ -/* ------------------------------------------------------------ */ - -#elif defined(__OpenBSD__) -void slDSP::open ( char *device, int _rate, int _stereo, int _bps ) -{ - - counter = 0; - - fd = ::open ( device, O_RDWR ) ; - - if ( fd < 0 ) - { - perror ( "slDSP: open" ) ; - error = SL_TRUE ; - } - else - { - - if( ::ioctl( fd, AUDIO_GETINFO, &ainfo) == -1) - { - perror("slDSP: open - getinfo"); - stereo = SL_FALSE ; - bps = 8 ; - rate = 8000 ; - init_bytes = 0 ; - - return; - } - - ainfo.play.sample_rate = _rate; - ainfo.play.precision = _bps; - ainfo.play.channels = _stereo ? 2 : 1; - - ainfo.play.encoding = AUDIO_ENCODING_ULINEAR; - - if( :: ioctl(fd, AUDIO_SETINFO, &ainfo) == -1) - { - perror("slDSP: open - setinfo"); - stereo = SL_FALSE ; - bps = 8 ; - rate = 8000 ; - init_bytes = 0 ; - return; - } - - rate = _rate; - stereo = _stereo; - bps = _bps; - - error = SL_FALSE ; - - getBufferInfo (); - - // I could not change the size, - // so let's try this ... - - init_bytes = 1024 * 8; - } -} - - -void slDSP::close () -{ - if ( fd >= 0 ) - ::close ( fd ) ; -} - - -int slDSP::getDriverBufferSize () -{ - if ( error ) - return 0 ; - - getBufferInfo () ; - - // HW buffer is 0xffff on my box - //return ainfo.play.buffer_size; - - return 1024 * 8; -} - -void slDSP::getBufferInfo () -{ - if ( error ) - return ; - - if( ::ioctl( fd, AUDIO_GETINFO, &ainfo) < 0) - { - perror ( "slDSP: getBufferInfo" ) ; - error = SL_TRUE ; - return ; - } - - if( ::ioctl( fd, AUDIO_GETOOFFS, &audio_offset ) < 0) - { - perror ( "slDSP: getBufferInfo" ) ; - error = SL_TRUE ; - return ; - } -} - - -void slDSP::write ( void *buffer, size_t length ) -{ - if ( error || length <= 0 ) - return ; - - int nwritten = ::write ( fd, (const char *) buffer, length ) ; - - if ( nwritten < 0 ) - perror ( "slDSP: write" ) ; - else if ( nwritten != length ) - perror ( "slDSP: short write" ) ; - - counter ++; /* hmmm */ -} - - -float slDSP::secondsRemaining () -{ - return 0.0f ; -} - - -float slDSP::secondsUsed () -{ - /* - * original formula from Steve: - * ----------------------------- - * - * int samples_used = init_bytes - buff_info.bytes ; - * | | - * | +--- current available - * | space in bytes ! - * +---------------- available space - * when empty; - * - * sample_used contains the number of bytes which are - * "used" or in the DSP "pipeline". - */ - - - int samples_used; - - if ( error ) - return 0.0f ; - - getBufferInfo () ; - - //This is wrong: this is the hw queue in the kernel ! - //samples_used = ainfo.play.buffer_size - audio_offset.offset ; - - // This is: all data written minus where we are now in the queue - - if ( counter == 0 ) - return 0.0; - - samples_used = ( counter * init_bytes ) - audio_offset.samples; - - if ( stereo ) samples_used /= 2 ; - if ( bps == 16 ) samples_used /= 2 ; - - return (float) samples_used / (float) rate ; -} - - -void slDSP::sync () -{ - if ( !error) ::ioctl ( fd, AUDIO_FLUSH , 0 ) ; -} - -void slDSP::stop () -{ - // nothing found yet -} - -/* ------------------------------------------------------------ */ -/* SGI IRIX audio */ -/* ------------------------------------------------------------ */ - -#elif defined(sgi) - -void slDSP::open ( char *device, int _rate, int _stereo, int _bps ) -{ - if ( _bps != 8 ) - { - perror ( "slDSP: supports only 8bit audio for sgi" ) ; - error = SL_TRUE; - return; - } - - init_bytes = 1024 * 8; - - config = ALnewconfig(); - - ALsetchannels ( config, _stereo ? AL_STEREO : AL_MONO ); - ALsetwidth ( config, _bps == 8 ? AL_SAMPLE_8 : AL_SAMPLE_16 ); - ALsetqueuesize( config, init_bytes ); - - port = ALopenport( device, "w", config ); - - if ( port == NULL ) - { - perror ( "slDSP: open" ) ; - error = SL_TRUE ; - } - else - { - long params[2] = {AL_OUTPUT_RATE, 0 }; - - params[1] = _rate; - - if ( ALsetparams(AL_DEFAULT_DEVICE, params, 2) != 0 ) - { - perror ( "slDSP: open - ALsetparams" ) ; - error = SL_TRUE ; - return; - } - - rate = _rate; - stereo = _stereo; - bps = _bps; - - error = SL_FALSE ; - - } -} - - -void slDSP::close () -{ - if ( port != NULL ) - { - ALcloseport ( port ); - ALfreeconfig( config ); - port = NULL; - } -} - - -int slDSP::getDriverBufferSize () -{ - if ( error ) - return 0 ; - - return ALgetqueuesize( config ); -} - -void slDSP::getBufferInfo () -{ - if ( error ) - return ; -} - - -void slDSP::write ( void *buffer, size_t length ) -{ - char *buf = (char *)buffer; - int i; - - if ( error || length <= 0 ) - return ; - - // Steve: is this a problem ?? - - for ( i = 0; i < length; i ++ ) - buf[i] = buf[i] >> 1; - - ALwritesamps(port, (void *)buf, length ); -} - - -float slDSP::secondsRemaining () -{ - int samples_remain; - - if ( error ) - return 0.0f ; - - samples_remain = ALgetfillable(port); - - if ( stereo ) samples_remain /= 2 ; - if ( bps == 16 ) samples_remain /= 2 ; - - return (float) samples_remain / (float) rate ; -} - - -float slDSP::secondsUsed () -{ - int samples_used; - - if ( error ) - return 0.0f ; - - samples_used = ALgetfilled(port); - - if ( stereo ) samples_used /= 2 ; - if ( bps == 16 ) samples_used /= 2 ; - - return (float) samples_used / (float) rate ; -} - - -void slDSP::sync () -{ - if ( error ) - return ; - - /* found this in the header file - but no description - * or example for the long parameter. - */ - - // ALflush(ALport, long); -} - -void slDSP::stop () -{ -} - - -#endif - diff --git a/src/slEnvelope.cxx b/src/slEnvelope.cxx deleted file mode 100644 index 13e726c4..00000000 --- a/src/slEnvelope.cxx +++ /dev/null @@ -1,170 +0,0 @@ - -#include "sl.h" - -float slEnvelope::getValue ( float _time ) -{ - float delta ; - int step = getStepDelta ( &_time, &delta ) ; - - return delta * (_time - time[step]) + value[step] ; -} - - - -int slEnvelope::getStepDelta ( float *_time, float *delta ) -{ - float tt ; - - if ( replay_mode == SL_SAMPLE_LOOP ) - { - tt = floor ( *_time / time [ nsteps-1 ] ) ; - *_time -= tt * time [ nsteps-1 ] ; - } - - tt = *_time ; - - if ( tt <= time[ 0 ] ) { *delta = 0.0f ; return 0 ; } - if ( tt >= time[nsteps-1] ) { *delta = 0.0f ; return nsteps-1 ; } - - for ( int i = 1 ; i <= nsteps-1 ; i++ ) - if ( tt <= time[i] ) - { - float t1 = time[i-1] ; float v1 = value[i-1] ; - float t2 = time[ i ] ; float v2 = value[ i ] ; - - if ( t1 == t2 ) - { - *delta = 0.0f ; - return i ; - } - - *delta = (v2-v1) / (t2-t1) ; - return i-1 ; - } - - *delta = 0.0f ; - return nsteps - 1 ; -} - - -void slEnvelope::applyToPitch ( Uchar *dst, slSamplePlayer *src, - int nframes, int start, int next_env ) -{ - float delta ; - float _time = slScheduler::getCurrent() -> getElapsedTime ( start ) ; - int step = getStepDelta ( &_time, &delta ) ; - float _value = delta * (_time - time[step]) + value[step] ; - - delta /= (float) slScheduler::getCurrent() -> getRate () ; - - unsigned char tmp [ 512 ] ; - float pos = 0 ; - float npos = 0 ; - unsigned char last = 0x80 ; - - while ( nframes-- ) - { - npos += _value ; - _value += delta ; - - int offset = (int) ( npos - pos ) ; - - if ( offset > 512 ) - offset = 512 ; - - if ( offset < 1 ) - *(dst++) = last ; - else - { - pos += offset ; - - src -> read ( offset, tmp, next_env ) ; - - *(dst++) = last = tmp [ offset-1 ] ; - } - } -} - - -void slEnvelope::applyToInvPitch ( Uchar *dst, slSamplePlayer *src, - int nframes, int start, int next_env ) -{ - float delta ; - float _time = slScheduler::getCurrent() -> getElapsedTime ( start ) ; - int step = getStepDelta ( &_time, &delta ) ; - float _value = delta * (_time - time[step]) + value[step] ; - - delta /= (float) slScheduler::getCurrent() -> getRate () ; - - unsigned char tmp [ 512 ] ; - float pos = 0 ; - float npos = 0 ; - unsigned char last = 0x80 ; - - while ( nframes-- ) - { - npos += 1.0 / _value ; - _value += delta ; - - int offset = (int) ( npos - pos ) ; - - if ( offset > 512 ) - offset = 512 ; - - if ( offset < 1 ) - *(dst++) = last ; - else - { - pos += offset ; - - src -> read ( offset, tmp, next_env ) ; - - *(dst++) = last = tmp [ offset-1 ] ; - } - } -} - -void slEnvelope::applyToVolume ( Uchar *dst, Uchar *src, - int nframes, int start ) -{ - float delta ; - float _time = slScheduler::getCurrent() -> getElapsedTime ( start ) ; - int step = getStepDelta ( &_time, &delta ) ; - float _value = delta * (_time - time[step]) + value[step] ; - - delta /= (float) slScheduler::getCurrent() -> getRate () ; - - while ( nframes-- ) - { - register int res = (int)( (float)((int)*(src++)-0x80) * _value ) + 0x80 ; - - _value += delta ; - - *(dst++) = ( res > 255 ) ? 255 : ( res < 0 ) ? 0 : res ; - } -} - -void slEnvelope::applyToInvVolume ( Uchar *dst, Uchar *src, - int nframes, int start ) -{ - float delta ; - float _time = slScheduler::getCurrent() -> getElapsedTime ( start ) ; - int step = getStepDelta ( &_time, &delta ) ; - float _value = delta * (_time - time[step]) + value[step] ; - - delta /= (float) slScheduler::getCurrent() -> getRate () ; - - delta = - delta ; - _value = 1.0 - _value ; - - while ( nframes-- ) - { - register int res = (int)( (float)((int)*(src++)-0x80) * _value ) + 0x80 ; - - _value += delta ; - - *(dst++) = ( res > 255 ) ? 255 : ( res < 0 ) ? 0 : res ; - } -} - - diff --git a/src/slPortability.h b/src/slPortability.h deleted file mode 100644 index 08d780c1..00000000 --- a/src/slPortability.h +++ /dev/null @@ -1,71 +0,0 @@ - -#ifndef __SLPORTABILITY_H__ -#define __SLPORTABILITY_H__ 1 - -/* ------------------------------------------------------------- */ -/* OS specific includes and defines ... */ -/* ------------------------------------------------------------- */ - -#ifdef HAVE_CONFIG_H -# include -#endif -#undef VERSION - -#include -#include - -#ifndef WIN32 -#include -#include -#else -#include -#if defined( __CYGWIN__ ) || defined( __CYGWIN32__ ) -# define NEAR /* */ -# define FAR /* */ -#endif -#include -#endif - -#include -#include -#include -#include - -#if defined(__linux__) || defined(__FreeBSD__) -#define SL_USING_OSS_AUDIO 1 -#endif - -#ifdef SL_USING_OSS_AUDIO -#if defined(__linux__) -#include -#elif defined(__FreeBSD__) -#include -#else -/* - Tom thinks this file may be under some - unixen - but that isn't where the OSS manuals say it - should be. - - If you ever find out the truth, please email me: - Steve Baker -*/ -#include -#endif -#endif - -#ifdef __OpenBSD__ -#include -#endif - -#ifdef WIN32 -#define strcasecmp stricmp /* Yes, Steve really does *HATE* Windoze */ -#endif - -/* Tom */ - -#ifdef sgi -#include -#endif - -#endif - diff --git a/src/slSample.cxx b/src/slSample.cxx deleted file mode 100644 index 386a3ce2..00000000 --- a/src/slSample.cxx +++ /dev/null @@ -1,505 +0,0 @@ - - -#include "sl.h" -#include - -void slSample::autoMatch ( slDSP *dsp ) -{ - if ( dsp == NULL ) return ; - - changeRate ( dsp->getRate () ) ; - changeBps ( dsp->getBps () ) ; - changeStereo ( dsp->getStereo () ) ; -} - -void slSample::adjustVolume ( float vol ) -{ - for ( int i = 0 ; i < length ; i++ ) - { - int s = (int)(((float) buffer[i] - (float) 0x80) * vol) + 0x80 ; - - buffer [ i ] = ( s > 255 ) ? 255 : - ( s < 0 ) ? 0 : s ; - } -} - - -void slSample::changeRate ( int r ) -{ - if ( r == rate ) return ; - - int length1 = length / (getBps ()/8) ; - int length2 = (int) ( (float) length1 * ( (float) r / (float) rate ) ) ; - Uchar *buffer2 = new Uchar [ length2 ] ; - - float step = (float) length1 / (float) length2 ; - - for ( int i = 0 ; i < length2 / (getBps()/8); i++ ) - { - float pos = (float) i * step ; - - int p1 = (int) floor ( pos ) ; - int p2 = (int) ceil ( pos ) ; - - if ( stereo ) - { - if ( ( p1 & 1 ) != ( i & 1 ) ) { pos++ ; p1++ ; p2++ ; } - p2++ ; - } - - float ratio = pos - (float) p1 ; - - float b1 = (getBps()==8) ? - (float) buffer [(p1<0)?0:(p1>=length1)?length1-1:p1] : - (float) ((Ushort*)buffer)[(p1<0)?0:(p1>=length1)?length1-1:p1] ; - float b2 = (getBps()==8) ? - (float) buffer [(p2<0)?0:(p2>=length1)?length1-1:p2] : - (float) ((Ushort*)buffer)[(p2<0)?0:(p2>=length1)?length1-1:p2] ; - - float res = b1 * (1.0-ratio) + b2 * ratio ; - - if ( getBps () == 8 ) - buffer2 [ i ] = (Uchar) ( (res < 0) ? 0 : (res > 255) ? 255 : res ) ; - else - ((Ushort *) buffer2 ) [ i ] = - (Ushort) ( (res < 0) ? 0 : (res > 65535) ? 65535 : res ) ; - } - - rate = r ; - length = length2 ; - delete buffer ; - buffer = buffer2 ; -} - - -void slSample::changeToUnsigned () -{ - if ( getBps() == 16 ) - { - int length2 = length / 2 ; - Ushort *buffer2 = (Ushort *) buffer ; - - for ( int i = 0 ; i < length2 ; i++ ) - buffer2 [ i ] = buffer2 [ i ] + 32768 ; - } - else - { - for ( int i = 0 ; i < length ; i++ ) - buffer [ i ] = (buffer [ i ]>0x80) ? (buffer[i]-0x80) : - (0xFF-buffer[i]) ; - } -} - - - -void slSample::changeBps ( int b ) -{ - if ( b == getBps () ) return ; - - if ( b == 8 && getBps() == 16 ) - { - length /= 2 ; - Uchar *buffer2 = new Uchar [ length ] ; - - for ( int i = 0 ; i < length ; i++ ) - buffer2 [ i ] = ((Ushort *)buffer) [ i ] >> 8 ; - - delete buffer ; - buffer = buffer2 ; - setBps ( b ) ; - } - else - if ( b == 16 && getBps() == 8 ) - { - Ushort *buffer2 = new Ushort [ length ] ; - - for ( int i = 0 ; i < length ; i++ ) - buffer2 [ i ] = buffer [ i ] << 8 ; - - delete buffer ; - buffer = (Uchar *) buffer2 ; - length *= 2 ; - setBps ( b ) ; - } -} - -void slSample::changeStereo ( int s ) -{ - if ( s == getStereo () ) - return ; - - if ( s && ! getStereo () ) - { - if ( getBps () == 8 ) - { - Uchar *buffer2 = new Uchar [ length * 2 ] ; - - for ( int i = 0 ; i < length ; i++ ) - buffer2 [ i*2 ] = buffer2 [ i*2+1 ] = buffer [ i ] ; - - delete buffer ; - buffer = buffer2 ; - length *= 2 ; - setStereo ( SL_TRUE ) ; - } - else - { - Ushort *buffer2 = new Ushort [ length ] ; - - for ( int i = 0 ; i < length / 2 ; i++ ) - buffer2 [ i*2 ] = buffer2 [ i*2+1 ] = ((Ushort *) buffer) [ i ] ; - - delete buffer ; - buffer = (Uchar *)buffer2 ; - length *= 2 ; - setStereo ( SL_TRUE ) ; - } - } - else - { - if ( getBps () == 8 ) - { - Uchar *buffer2 = new Uchar [ length / 2 ] ; - - for ( int i = 0 ; i < (length-1)/2 ; i++ ) - buffer2 [ i ] = ((int)buffer [ i*2 ] + (int)buffer [ i*2 + 1 ] ) / 2 ; - - delete buffer ; - buffer = buffer2 ; - length /= 2 ; - setStereo ( SL_FALSE ) ; - } - else - { - Ushort *buffer2 = new Ushort [ length / 4 ] ; - - for ( int i = 0 ; i < (length-3) / 4 ; i++ ) - buffer2 [ i ] = ((int)((Ushort *)buffer) [ i*2 ] + - (int)((Ushort *)buffer) [ i*2 + 1 ] ) / 2 ; - - delete buffer ; - buffer = (Uchar *)buffer2 ; - length /= 4 ; - setStereo ( SL_FALSE ) ; - } - } -} - - -static void swap_Ushort ( Ushort *i ) -{ - *i = ((*i << 8) & 0xFF00) + - ((*i >> 8) & 0x00FF) ; -} - -static void swap_int ( int *i ) -{ - *i = ((*i << 24) & 0xFF000000) + - ((*i << 8) & 0x00FF0000) + - ((*i >> 8) & 0x0000FF00) + - ((*i >> 24) & 0x000000FF) ; -} - -int slSample::loadFile ( char *fname ) -{ - if ( strcasecmp ( & fname [ strlen ( fname ) - 4 ], ".wav" ) == 0 ) - return loadWavFile ( fname ) ; - - if ( strcasecmp ( & fname [ strlen ( fname ) - 3 ], ".au" ) == 0 ) - return loadAUFile ( fname ) ; - - if ( strcasecmp ( & fname [ strlen ( fname ) - 3 ], ".ub" ) == 0 ) - return loadRawFile ( fname ) ; - - fprintf ( stderr, "slSample:loadFile: Unknown file type for '%s'.\n", - fname ) ; - return SL_FALSE ; -} - - -int slSample::loadWavFile ( char *fname ) -{ - int found_header = SL_FALSE ; - int needs_swabbing = SL_FALSE ; - - delete buffer ; - buffer = NULL ; - length = 0 ; - - FILE *fd = fopen ( fname, "rb" ) ; - - if ( fd == NULL ) - { - fprintf ( stderr, - "slSample: loadWavFile: Cannot open '%s' for reading.\n", - fname ) ; - return SL_FALSE ; - } - - char magic [ 8 ] ; - - if ( fread ( magic, 4, 1, fd ) == 0 || - magic[0] != 'R' || magic[1] != 'I' || - magic[2] != 'F' || magic[3] != 'F' ) - { - fprintf ( stderr, "slWavSample: File '%s' has wrong magic number\n", fname ) ; - fprintf ( stderr, " - it probably isn't in '.wav' format.\n" ) ; - fclose ( fd ) ; - return SL_FALSE ; - } - - int leng1 ; - - if ( fread ( & leng1, sizeof(int), 1, fd ) == 0 ) - { - fprintf ( stderr, "slSample: File '%s' has premature EOF in header\n", fname ) ; - fclose ( fd ) ; - return SL_FALSE ; - } - - fread ( magic, 4, 1, fd ) ; - - if ( magic[0] != 'W' || magic[1] != 'A' || - magic[2] != 'V' || magic[3] != 'E' ) - { - fprintf ( stderr, "slSample: File '%s' has no WAVE tag.\n", fname ) ; - fclose ( fd ) ; - return SL_FALSE ; - } - - while ( ! feof ( fd ) ) - { - fread ( magic, 4, 1, fd ) ; - - if ( magic[0] == 'f' && magic[1] == 'm' && - magic[2] == 't' && magic[3] == ' ' ) - { - found_header = SL_TRUE ; - - if ( fread ( & leng1, sizeof(int), 1, fd ) == 0 ) - { - fprintf ( stderr, "slSample: File '%s' has premature EOF in header\n", fname ) ; - fclose ( fd ) ; - return SL_FALSE ; - } - - if ( leng1 > 65536 ) - { - needs_swabbing = SL_TRUE ; - swap_int ( & leng1 ) ; - } - - Ushort header [ 8 ] ; - - if ( leng1 != sizeof ( header ) ) - fprintf ( stderr, - "slSample: File '%s' has unexpectedly long (%d byte) header\n", - fname, leng1 ) ; - - fread ( & header, sizeof(header), 1, fd ) ; - - for ( int junk = sizeof(header) ; junk < leng1 ; junk++ ) - fgetc ( fd ) ; - - if ( needs_swabbing ) - { - swap_Ushort ( & header[0] ) ; - swap_Ushort ( & header[1] ) ; - swap_int ( (int *) & header[2] ) ; - swap_int ( (int *) & header[4] ) ; - swap_Ushort ( & header[6] ) ; - swap_Ushort ( & header[7] ) ; - } - - if ( header [ 0 ] != 0x0001 ) - { - fprintf ( stderr, "slSample: File '%s' is not WAVE_FORMAT_PCM!\n", fname ) ; - fclose ( fd ) ; - return SL_FALSE ; - } - - setStereo ( header[1] > 1 ) ; - setRate ( *((int *) (& header[2])) ) ; - setBps ( header[7] ) ; - } - else - if ( magic[0] == 'd' && magic[1] == 'a' && - magic[2] == 't' && magic[3] == 'a' ) - { - if ( ! found_header ) - { - fprintf ( stderr, "slSample: File '%s' has no data section\n", fname ) ; - fclose ( fd ) ; - return SL_FALSE ; - } - - if ( fread ( & length, sizeof(int), 1, fd ) == 0 ) - { - fprintf ( stderr, "slSample: File '%s' has premature EOF in data\n", fname ) ; - fclose ( fd ) ; - return SL_FALSE ; - } - - if ( needs_swabbing ) - swap_int ( & length ) ; - - buffer = new Uchar [ length ] ; - - fread ( buffer, 1, length, fd ) ; - - if ( getBps () == 16 ) - { - Ushort *b = (Ushort*) buffer ; - - for ( int i = 0 ; i < length/2 ; i++ ) - b [ i ] = (Ushort) ( (int)((short) b [ i ]) + 32768 ) ; - } - - fclose ( fd ) ; - return SL_TRUE ; - } - } - - fclose ( fd ) ; - return SL_FALSE ; -} - -int slSample::loadAUFile ( char *fname ) -{ - delete buffer ; - buffer = NULL ; - length = 0 ; - - FILE *fd = fopen ( fname, "rb" ) ; - - if ( fd == NULL ) - { - fprintf ( stderr, - "slSample: loadAUFile: Cannot open '%s' for reading.\n", - fname ) ; - return SL_FALSE ; - } - - char magic [ 4 ] ; - - if ( fread ( magic, 4, 1, fd ) == 0 || - magic[0] != '.' || magic[1] != 's' || - magic[2] != 'n' || magic[3] != 'd' ) - { - fprintf ( stderr, "slSample: File '%s' has wrong magic number\n", fname ) ; - fprintf ( stderr, " - it probably isn't in '.au' format.\n" ) ; - fclose ( fd ) ; - return SL_FALSE ; - } - - int hdr_length ; - int dat_length ; - int nbytes ; - int irate ; - int nchans ; - - if ( fread ( & hdr_length, sizeof(int), 1, fd ) == 0 || - fread ( & dat_length, sizeof(int), 1, fd ) == 0 || - fread ( & nbytes , sizeof(int), 1, fd ) == 0 || - fread ( & irate , sizeof(int), 1, fd ) == 0 || - fread ( & nchans , sizeof(int), 1, fd ) == 0 ) - { - fprintf ( stderr, "slSample: File '%s' has premature EOF in header\n", fname ) ; - fclose ( fd ) ; - return SL_FALSE ; - } - - if ( hdr_length > 65536 ) - { - swap_int ( & hdr_length ) ; - swap_int ( & dat_length ) ; - swap_int ( & nbytes ) ; - swap_int ( & irate ) ; - swap_int ( & nchans ) ; - } - - bps = nbytes * 8 ; - stereo = (nchans>1) ; - rate = irate ; - - if ( nbytes > 2 || nbytes <= 0 || hdr_length > 512 || hdr_length < 24 || - irate > 65526 || irate <= 1000 || nchans < 1 || nchans > 2 ) - { - fprintf ( stderr, "slSample: File '%s' has a very strange header\n", fname ) ; - - fprintf ( stderr, " Header Length = %d\n", hdr_length ) ; - fprintf ( stderr, " Data Length = %d\n", dat_length ) ; - fprintf ( stderr, " Bytes/sample = %d\n", nbytes ) ; - fprintf ( stderr, " Sampling Rate = %dHz\n",irate ) ; - fprintf ( stderr, " Num Channels = %d\n", nchans ) ; - fprintf ( stderr, "\n" ) ; - fclose ( fd ) ; - return SL_FALSE ; - } - - if ( hdr_length > 24 ) - { - delete comment ; - comment = new char [ hdr_length - 24 + 1 ] ; - - fread ( comment, 1, hdr_length - 24, fd ) ; - } - - if ( dat_length > 0 ) - { - buffer = new Uchar [ dat_length ] ; - length = fread ( buffer, 1, dat_length, fd ) ; - - if ( length != dat_length ) - fprintf ( stderr, "slAUSample: File '%s' has premature EOF in data.\n", fname ) ; - } - - fclose ( fd ) ; - return SL_TRUE ; -} - - -int slSample::loadRawFile ( char *fname ) -{ - delete buffer ; - buffer = NULL ; - length = 0 ; - - FILE *fd = fopen ( fname, "rb" ) ; - - if ( fd == NULL ) - { - fprintf ( stderr, - "slSample: loadRawFile: Cannot open '%s' for reading.\n", - fname ) ; - return SL_FALSE ; - } - - struct stat stat_buf ; - - if ( fstat ( fileno ( fd ), & stat_buf ) != 0 ) - { - fprintf ( stderr, - "slSample: loadRawFile: Cannot get status for '%s'.\n", - fname ) ; - fclose ( fd ) ; - return SL_FALSE ; - } - - length = stat_buf . st_size ; - - if ( length > 0 ) - { - buffer = new Uchar [ length ] ; - length = fread ( buffer, 1, length, fd ) ; - } - - bps = 8 ; - stereo = SL_FALSE ; - rate = 8000 ; /* Guess */ - - fclose ( fd ) ; - return SL_TRUE ; -} - - diff --git a/src/slSamplePlayer.cxx b/src/slSamplePlayer.cxx deleted file mode 100644 index 12eecaf6..00000000 --- a/src/slSamplePlayer.cxx +++ /dev/null @@ -1,188 +0,0 @@ - -#include "sl.h" - -void slSamplePlayer::addEnvelope ( int i, slEnvelope *_env, slEnvelopeType _type ) -{ - if ( i < 0 || i >= SL_MAX_ENVELOPES ) return ; - - if ( env [ i ] != NULL ) - env [ i ] -> unRef () ; - - env [ i ] = _env ; - - if ( _env != NULL ) - env [ i ] -> ref () ; - - env_type [ i ] = _type ; - env_start_time [ i ] = slScheduler::getCurrent() -> getTimeNow () ; -} - -int slSamplePlayer::preempt ( int delay ) -{ - slScheduler::getCurrent() -> addCallBack ( callback, sample, SL_EVENT_PREEMPTED, magic ) ; - - switch ( preempt_mode ) - { - case SL_SAMPLE_CONTINUE: if ( isRunning() ) - return SL_FALSE ; - /* FALLTHROUGH! */ - case SL_SAMPLE_DELAY : break ; - case SL_SAMPLE_MUTE : skip ( delay ) ; break ; - case SL_SAMPLE_ABORT : stop () ; break ; - case SL_SAMPLE_RESTART : reset () ; break ; - } - - return SL_TRUE ; -} - -slSamplePlayer::~slSamplePlayer () -{ - if ( sample ) - sample -> unRef () ; - - slScheduler::getCurrent() -> addCallBack ( callback, sample, SL_EVENT_COMPLETE, magic ) ; -} - -void slSamplePlayer::skip ( int nframes ) -{ - if ( nframes < lengthRemaining ) - { - lengthRemaining -= nframes ; - bufferPos += nframes ; - } - else - if ( replay_mode == SL_SAMPLE_LOOP ) - { - slScheduler::getCurrent() -> addCallBack ( callback, sample, SL_EVENT_LOOPED, magic ) ; - - nframes -= lengthRemaining ; - - while ( nframes >= sample->getLength () ) - nframes -= sample->getLength () ; - - lengthRemaining = sample->getLength() - nframes ; - bufferPos = & ( sample->getBuffer() [ nframes ] ) ; - } - else - stop () ; -} - - -void slSamplePlayer::read ( int nframes, Uchar *dst, int next_env ) -{ - /* - WARNING: - - CO-RECURSIVE! - */ - - /* Find the next envelope */ - - while ( next_env < SL_MAX_ENVELOPES && env [ next_env ] == NULL ) - next_env++ ; - - /* - If there are no fancy envelopes to process then return - the raw data. - */ - - if ( next_env >= SL_MAX_ENVELOPES ) /* No fancy envelopes left */ - { - low_read ( nframes, dst ) ; - return ; - } - - /* - Envelope processing required... - - Process the next envelope using data read recursively through - the remaining envelopes. - */ - - switch ( env_type [ next_env ] ) - { - /* For Volume envelopes, SRC and DST can be the same buffer */ - - case SL_INVERSE_VOLUME_ENVELOPE: - read ( nframes, dst, next_env+1 ) ; - env[ next_env ]->applyToInvVolume ( dst,dst,nframes,env_start_time[ next_env ] ) ; - break ; - - case SL_VOLUME_ENVELOPE : - read ( nframes, dst, next_env+1 ) ; - env[ next_env ]->applyToVolume ( dst,dst,nframes,env_start_time[ next_env ] ) ; - break ; - - case SL_INVERSE_PITCH_ENVELOPE : - env[ next_env ]->applyToInvPitch ( dst,this,nframes,env_start_time[ next_env ], next_env+1 ) ; - break ; - - case SL_PITCH_ENVELOPE : - env[ next_env ]->applyToPitch ( dst,this,nframes,env_start_time[ next_env ], next_env+1 ) ; - break ; - - case SL_INVERSE_FILTER_ENVELOPE: - case SL_FILTER_ENVELOPE : - read ( nframes, dst, next_env+1 ) ; - break ; - - case SL_INVERSE_PAN_ENVELOPE : - case SL_PAN_ENVELOPE : - read ( nframes, dst, next_env+1 ) ; - break ; - - case SL_INVERSE_ECHO_ENVELOPE : - case SL_ECHO_ENVELOPE : - read ( nframes, dst, next_env+1 ) ; - break ; - } -} - - -void slSamplePlayer::low_read ( int nframes, Uchar *dst ) -{ - if ( isWaiting() ) start () ; - - if ( bufferPos == NULL ) /* Run out of sample & no repeats */ - { - memset ( dst, 0x80, nframes ) ; - return ; - } - - while ( SL_TRUE ) - { - /* - If we can satisfy this request in one read (with data left in - the sample buffer ready for next time around) - then we are done... - */ - - if ( nframes < lengthRemaining ) - { - memcpy ( dst, bufferPos, nframes ) ; - bufferPos += nframes ; - lengthRemaining -= nframes ; - return ; - } - - memcpy ( dst, bufferPos, lengthRemaining ) ; - bufferPos += lengthRemaining ; - dst += lengthRemaining ; - nframes -= lengthRemaining ; - lengthRemaining = 0 ; - - if ( replay_mode == SL_SAMPLE_ONE_SHOT ) - { - stop () ; - memset ( dst, 0x80, nframes ) ; - return ; - } - else - { - slScheduler::getCurrent() -> addCallBack ( callback, sample, SL_EVENT_LOOPED, magic ) ; - start () ; - } - } -} - - - diff --git a/src/slScheduler.cxx b/src/slScheduler.cxx deleted file mode 100644 index 5fe4caa9..00000000 --- a/src/slScheduler.cxx +++ /dev/null @@ -1,253 +0,0 @@ - -#include "sl.h" - -char *__slPendingError = NULL ; - -slScheduler *slScheduler::current = NULL ; - -void slScheduler::init () -{ - current = this ; - - if ( not_working () ) - { - fprintf ( stderr, "slScheduler: soundcard init failed.\n" ) ; - setError () ; - return ; - } - - if ( getBps() != 8 ) - { - fprintf ( stderr, "slScheduler: Needs a sound card that supports 8 bits per sample.\n" ) ; - setError () ; - return ; - } - - if ( getStereo() ) - { - fprintf ( stderr, "slScheduler: Needs a sound card that supports monophonic replay.\n" ) ; - setError () ; - return ; - } - - for ( int i = 0 ; i < SL_MAX_SAMPLES ; i++ ) - samplePlayer [ i ] = NULL ; - - amount_left = 0 ; - now = 0 ; - num_pending_callbacks = 0 ; - safety_margin = 1.0 ; - - mixer = NULL ; - - mixer_buffer = NULL ; - spare_buffer0 = NULL ; - spare_buffer1 = NULL ; - spare_buffer2 = NULL ; - - initBuffers () ; -} - -void slScheduler::initBuffers () -{ - if ( not_working () ) - return ; - - delete mixer_buffer ; - delete spare_buffer0 ; - delete spare_buffer1 ; - delete spare_buffer2 ; - - mixer_buffer_size = getDriverBufferSize () ; - - mixer_buffer = new Uchar [ mixer_buffer_size ] ; - memset ( mixer_buffer, 0x80, mixer_buffer_size ) ; - - spare_buffer0 = new Uchar [ mixer_buffer_size ] ; - spare_buffer1 = new Uchar [ mixer_buffer_size ] ; - spare_buffer2 = new Uchar [ mixer_buffer_size ] ; -} - -slScheduler::~slScheduler () -{ - if ( current == this ) - current = NULL ; - - delete mixer_buffer ; - - delete spare_buffer0 ; - delete spare_buffer1 ; - delete spare_buffer2 ; -} - - - - - -void slScheduler::mixBuffer ( slSamplePlayer *spa, slSamplePlayer *spb ) -{ - register int l = mixer_buffer_size ; - register Uchar *d = mixer_buffer ; - - register Uchar *a = spare_buffer0 ; - register Uchar *b = spare_buffer1 ; - - spa -> read ( l, a ) ; - spb -> read ( l, b ) ; - - while ( l-- ) *d++ = mix ( *a++, *b++ ) ; -} - - - -void slScheduler::mixBuffer ( slSamplePlayer *spa, slSamplePlayer *spb, - slSamplePlayer *spc ) -{ - register int l = mixer_buffer_size ; - register Uchar *d = mixer_buffer ; - - register Uchar *a = spare_buffer0 ; - register Uchar *b = spare_buffer1 ; - register Uchar *c = spare_buffer2 ; - - spa -> read ( l, a ) ; - spb -> read ( l, b ) ; - spc -> read ( l, c ) ; - - while ( l-- ) *d++ = mix ( *a++, *b++, *c++ ) ; -} - - -void slScheduler::realUpdate ( int dump_first ) -{ - if ( not_working () ) - return ; - - if ( __slPendingError != NULL ) - { - fprintf ( stderr, "%s", __slPendingError ) ; - exit ( 1 ) ; - } - - int i ; - - while ( secondsUsed() <= safety_margin ) - { - slSamplePlayer *psp [ 3 ] ; - int pri [ 3 ] ; - - pri [ 0 ] = pri [ 1 ] = pri [ 2 ] = -1 ; - - for ( i = 0 ; i < SL_MAX_SAMPLES ; i++ ) - { - if ( samplePlayer [ i ] == NULL ) - continue ; - - /* Clean up dead sample players */ - - if ( samplePlayer [ i ] -> isDone () ) - { - delete samplePlayer [ i ] ; - samplePlayer [ i ] = NULL ; - continue ; - } - - if ( samplePlayer [ i ] -> isPaused () ) - continue ; - - int lowest = ( pri [0] <= pri [2] ) ? - (( pri [0] <= pri [1] ) ? 0 : 1 ) : - (( pri [1] <= pri [2] ) ? 1 : 2 ) ; - - if ( samplePlayer[i]->getPriority() > pri[lowest] ) - { - psp[lowest] = samplePlayer[i] ; - pri[lowest] = samplePlayer[i]->getPriority() ; - } - } - - for ( i = 0 ; i < SL_MAX_SAMPLES ; i++ ) - { - if ( samplePlayer [ i ] == NULL ) - continue ; - - if ( ! samplePlayer [ i ] -> isPaused () && - samplePlayer [ i ] != psp[0] && - samplePlayer [ i ] != psp[1] && - samplePlayer [ i ] != psp[2] ) - { - samplePlayer [ i ] -> preempt ( mixer_buffer_size ) ; - } - } - - if ( pri[0] < 0 ) - { - memset ( mixer_buffer, 0x80, mixer_buffer_size ) ; - amount_left = 0 ; - } - else - if ( pri[1] < 0 ) - psp[0] -> read ( mixer_buffer_size, mixer_buffer ) ; - else - if ( pri[2] < 0 ) - mixBuffer ( psp[0], psp[1] ) ; - else - mixBuffer ( psp[0], psp[1], psp[2] ) ; - - if ( dump_first ) - { - stop () ; - dump_first = SL_FALSE ; - } - - play ( mixer_buffer, mixer_buffer_size ) ; - - now += mixer_buffer_size ; - } - - flushCallBacks () ; -} - -void slScheduler::addCallBack ( slCallBack c, slSample *s, slEvent e, int m ) -{ - if ( not_working () ) - return ; - - if ( num_pending_callbacks >= SL_MAX_CALLBACKS ) - { - fprintf ( stderr, "slScheduler: Too many pending callback events!\n" ) ; - return ; - } - - slPendingCallBack *p = & ( pending_callback [ num_pending_callbacks++ ] ) ; - - p -> callback = c ; - p -> sample = s ; - p -> event = e ; - p -> magic = m ; -} - -void slScheduler::flushCallBacks () -{ - if ( not_working () ) - return ; - - /* - Execute all the callbacks that we accumulated - in this iteration. - - This is done at the end of 'update' to reduce the risk - of nasty side-effects caused by 'unusual' activities - in the application's callback function. - */ - - while ( num_pending_callbacks > 0 ) - { - slPendingCallBack *p = & ( pending_callback [ --num_pending_callbacks ] ) ; - - if ( p -> callback ) - (*(p->callback))( p->sample, p->event, p->magic ) ; - } -} - - diff --git a/src/sm.h b/src/sm.h deleted file mode 100644 index f884cd03..00000000 --- a/src/sm.h +++ /dev/null @@ -1,89 +0,0 @@ - -#ifndef __SM_H__ -#define __SM_H__ 1 - -#include "slPortability.h" - -#ifdef SL_USING_OSS_AUDIO -#define SMMIXER_DEFAULT_DEVICE "/dev/mixer" -// static char *labels [] = SOUND_DEVICE_LABELS; -#elif defined(WIN32) -#define SMMIXER_DEFAULT_DEVICE "mixer" -#else -#endif - - -# define SM_TRUE 1 -# define SM_FALSE 0 - -typedef unsigned char Uchar ; -typedef unsigned short Ushort ; - - -class smMixer -{ -private: - - int devices ; - int error ; - int fd ; - -#ifdef SL_USING_OSS_AUDIO - // static char *labels [] = SOUND_DEVICE_LABELS ; - - int ioctl ( int cmd, int param = 0 ) - { - if ( error ) return param ; - - if ( ::ioctl ( fd, cmd, & param ) == -1 ) - { - perror ( "smMixer: ioctl" ) ; - error = SM_TRUE ; - } - - return param ; - } -#endif - void open ( char *device ) ; - void close () ; - -public: - - /* Tom */ - - smMixer (); - smMixer ( char *device ); - ~smMixer (); - - int not_working (); - - /* Volume controls are in integer percentages */ - - int getVolume ( int channel ); - void setVolume ( int channel, int volume ); - - void getVolume ( int channel, int *left, int *right ); - void setVolume ( int channel, int left, int right ); - - void setTreble ( int treble ); - void setBass ( int bass ); - - void setMasterVolume ( int volume ); - void setSynthVolume ( int volume ); - void setPCMVolume ( int volume ); - void setSpeakerVolume( int volume ); - void setLineVolume ( int volume ); - void setMicVolume ( int volume ); - void setCDVolume ( int volume ); - - void setMasterVolume ( int left, int right ); - void setSynthVolume ( int left, int right ); - void setPCMVolume ( int left, int right ); - void setSpeakerVolume( int left, int right ); - void setLineVolume ( int left, int right ); - void setMicVolume ( int left, int right ); - void setCDVolume ( int left, int right ); -} ; - -#endif - diff --git a/src/smMixer.cxx b/src/smMixer.cxx deleted file mode 100644 index f7be007d..00000000 --- a/src/smMixer.cxx +++ /dev/null @@ -1,256 +0,0 @@ -#include "sm.h" - -#ifdef SL_USING_OSS_AUDIO -/* ------------------------------------------------------------ */ -/* OSSAUDIO - Linux, FreeBSD */ -/* ------------------------------------------------------------ */ - - -void smMixer::open ( char *device ) -{ - fd = ::open ( device, O_WRONLY ) ; - - if ( fd < 0 ) - { - perror ( "smMixer: open" ) ; - error = SM_TRUE ; - } - else - error = SM_FALSE ; - - devices = ioctl ( SOUND_MIXER_READ_DEVMASK ) ; -} - -void smMixer::close () -{ - if ( fd >= 0 ) - ::close ( fd ) ; -} - - -smMixer::smMixer () -{ - open ( SMMIXER_DEFAULT_DEVICE ) ; -} - -smMixer::smMixer ( char *device ) -{ - open ( device ) ; -} - -smMixer::~smMixer () -{ - close () ; -} - -int smMixer::not_working () -{ - return error ; -} - - /* Volume controls are in integer percentages */ - -int smMixer::getVolume ( int channel ) -{ - return ioctl ( MIXER_READ ( channel ) ) & 0xFF ; -} - - -void smMixer::setVolume ( int channel, int volume ) -{ - ioctl ( MIXER_WRITE ( channel ), (( volume & 255 ) << 8 ) | - ( volume & 255 ) ) ; -} - -void smMixer::getVolume ( int channel, int *left, int *right ) -{ - int vv = ioctl ( MIXER_READ ( channel ) ) ; - - if ( left ) *left = vv & 0xFF ; - if ( right ) *right = (vv>>8) & 0xFF ; -} - -void smMixer::setVolume ( int channel, int left, int right ) -{ - ioctl ( MIXER_WRITE ( channel ), (( right & 255 ) << 8 ) | - ( left & 255 ) ) ; -} - -void smMixer::setTreble ( int treble ) -{ - setVolume ( SOUND_MIXER_TREBLE , treble ) ; -} - -void smMixer::setBass ( int bass ) -{ - setVolume ( SOUND_MIXER_TREBLE , bass ) ; -} - -void smMixer::setMasterVolume ( int volume ) -{ - setVolume ( SOUND_MIXER_VOLUME , volume ) ; -} - -void smMixer::setSynthVolume ( int volume ) -{ - setVolume ( SOUND_MIXER_SYNTH , volume ) ; -} - -void smMixer::setPCMVolume ( int volume ) -{ - setVolume ( SOUND_MIXER_PCM , volume ) ; -} - -void smMixer::setSpeakerVolume( int volume ) -{ - setVolume ( SOUND_MIXER_SPEAKER, volume ) ; -} - -void smMixer::setLineVolume ( int volume ) -{ - setVolume ( SOUND_MIXER_LINE , volume ) ; -} - -void smMixer::setMicVolume ( int volume ) -{ - setVolume ( SOUND_MIXER_MIC , volume ) ; -} - -void smMixer::setCDVolume ( int volume ) -{ - setVolume ( SOUND_MIXER_CD , volume ) ; -} - -void smMixer::setMasterVolume ( int left, int right ) -{ - setVolume ( SOUND_MIXER_VOLUME , left, right ) ; -} - -void smMixer::setSynthVolume ( int left, int right ) -{ - setVolume ( SOUND_MIXER_SYNTH , left, right ) ; -} - -void smMixer::setPCMVolume ( int left, int right ) -{ - setVolume ( SOUND_MIXER_PCM , left, right ) ; -} - -void smMixer::setSpeakerVolume( int left, int right ) -{ - setVolume ( SOUND_MIXER_SPEAKER, left, right ) ; -} - -void smMixer::setLineVolume ( int left, int right ) -{ - setVolume ( SOUND_MIXER_LINE , left, right ) ; -} - -void smMixer::setMicVolume ( int left, int right ) -{ - setVolume ( SOUND_MIXER_MIC , left, right ) ; -} - -void smMixer::setCDVolume ( int left, int right ) -{ - setVolume ( SOUND_MIXER_CD , left, right ) ; -} - -#elif defined(__OpenBSD__) - -/* ------------------------------------------------------------ */ -/* OpenBSD 2.3 */ -/* ------------------------------------------------------------ */ - -void smMixer::open ( char *device ) -{ -} - -void smMixer::close (){} - -smMixer::smMixer () {} -smMixer::smMixer ( char * ) {} -smMixer::~smMixer () {} - -int smMixer::not_working () -{ - return error ; -} - - /* Volume controls are in integer percentages */ - -int smMixer::getVolume ( int ) { return 50 ; } -void smMixer::getVolume ( int, int *left, int *right ) -{ - if ( left ) *left = 50 ; - if ( right ) *right = 50 ; -} - -void smMixer::setVolume ( int , int ) {} -void smMixer::setVolume ( int , int , int ){} -void smMixer::setTreble ( int ) {} -void smMixer::setBass ( int ) {} -void smMixer::setMasterVolume ( int ) {} -void smMixer::setSynthVolume ( int ) {} -void smMixer::setPCMVolume ( int ) {} -void smMixer::setSpeakerVolume( int ) {} -void smMixer::setLineVolume ( int ) {} -void smMixer::setMicVolume ( int ) {} -void smMixer::setCDVolume ( int ) {} -void smMixer::setMasterVolume ( int, int ) {} -void smMixer::setSynthVolume ( int, int ) {} -void smMixer::setPCMVolume ( int, int ) {} -void smMixer::setSpeakerVolume( int, int ) {} -void smMixer::setLineVolume ( int, int ) {} -void smMixer::setMicVolume ( int, int ) {} -void smMixer::setCDVolume ( int, int ) {} - - -#else -/* ------------------------------------------------------------ */ -/* win32 */ -/* ------------------------------------------------------------ */ - -void smMixer::open ( char * ) {} - -void smMixer::close (){} - -smMixer::smMixer () {} -smMixer::smMixer ( char * ) {} -smMixer::~smMixer () {} - -int smMixer::not_working () -{ - return error ; -} - - /* Volume controls are in integer percentages */ - -int smMixer::getVolume ( int ) { return 50 ; } -void smMixer::getVolume ( int, int *left, int *right ) -{ - if ( left ) *left = 50 ; - if ( right ) *right = 50 ; -} - -void smMixer::setVolume ( int, int ) {} -void smMixer::setVolume ( int, int, int ){} -void smMixer::setTreble ( int ) {} -void smMixer::setBass ( int ) {} -void smMixer::setMasterVolume ( int ) {} -void smMixer::setSynthVolume ( int ) {} -void smMixer::setPCMVolume ( int ) {} -void smMixer::setSpeakerVolume( int ) {} -void smMixer::setLineVolume ( int ) {} -void smMixer::setMicVolume ( int ) {} -void smMixer::setCDVolume ( int ) {} -void smMixer::setMasterVolume ( int, int ) {} -void smMixer::setSynthVolume ( int, int ) {} -void smMixer::setPCMVolume ( int, int ) {} -void smMixer::setSpeakerVolume( int, int ) {} -void smMixer::setLineVolume ( int, int ) {} -void smMixer::setMicVolume ( int, int ) {} -void smMixer::setCDVolume ( int, int ) {} - - -#endif diff --git a/zlib/ChangeLog b/zlib/ChangeLog deleted file mode 100644 index 57386a26..00000000 --- a/zlib/ChangeLog +++ /dev/null @@ -1,471 +0,0 @@ - - ChangeLog file for zlib - -Changes in 1.1.3 (9 July 1998) -- fix "an inflate input buffer bug that shows up on rare but persistent - occasions" (Mark) -- fix gzread and gztell for concatenated .gz files (Didier Le Botlan) -- fix gzseek(..., SEEK_SET) in write mode -- fix crc check after a gzeek (Frank Faubert) -- fix miniunzip when the last entry in a zip file is itself a zip file - (J Lillge) -- add contrib/asm586 and contrib/asm686 (Brian Raiter) - See http://www.muppetlabs.com/~breadbox/software/assembly.html -- add support for Delphi 3 in contrib/delphi (Bob Dellaca) -- add support for C++Builder 3 and Delphi 3 in contrib/delphi2 (Davide Moretti) -- do not exit prematurely in untgz if 0 at start of block (Magnus Holmgren) -- use macro EXTERN instead of extern to support DLL for BeOS (Sander Stoks) -- added a FAQ file - -- Support gzdopen on Mac with Metrowerks (Jason Linhart) -- Do not redefine Byte on Mac (Brad Pettit & Jason Linhart) -- define SEEK_END too if SEEK_SET is not defined (Albert Chin-A-Young) -- avoid some warnings with Borland C (Tom Tanner) -- fix a problem in contrib/minizip/zip.c for 16-bit MSDOS (Gilles Vollant) -- emulate utime() for WIN32 in contrib/untgz (Gilles Vollant) -- allow several arguments to configure (Tim Mooney, Frodo Looijaard) -- use libdir and includedir in Makefile.in (Tim Mooney) -- support shared libraries on OSF1 V4 (Tim Mooney) -- remove so_locations in "make clean" (Tim Mooney) -- fix maketree.c compilation error (Glenn, Mark) -- Python interface to zlib now in Python 1.5 (Jeremy Hylton) -- new Makefile.riscos (Rich Walker) -- initialize static descriptors in trees.c for embedded targets (Nick Smith) -- use "foo-gz" in example.c for RISCOS and VMS (Nick Smith) -- add the OS/2 files in Makefile.in too (Andrew Zabolotny) -- fix fdopen and halloc macros for Microsoft C 6.0 (Tom Lane) -- fix maketree.c to allow clean compilation of inffixed.h (Mark) -- fix parameter check in deflateCopy (Gunther Nikl) -- cleanup trees.c, use compressed_len only in debug mode (Christian Spieler) -- Many portability patches by Christian Spieler: - . zutil.c, zutil.h: added "const" for zmem* - . Make_vms.com: fixed some typos - . Make_vms.com: msdos/Makefile.*: removed zutil.h from some dependency lists - . msdos/Makefile.msc: remove "default rtl link library" info from obj files - . msdos/Makefile.*: use model-dependent name for the built zlib library - . msdos/Makefile.emx, nt/Makefile.emx, nt/Makefile.gcc: - new makefiles, for emx (DOS/OS2), emx&rsxnt and mingw32 (Windows 9x / NT) -- use define instead of typedef for Bytef also for MSC small/medium (Tom Lane) -- replace __far with _far for better portability (Christian Spieler, Tom Lane) -- fix test for errno.h in configure (Tim Newsham) - -Changes in 1.1.2 (19 March 98) -- added contrib/minzip, mini zip and unzip based on zlib (Gilles Vollant) - See http://www.winimage.com/zLibDll/unzip.html -- preinitialize the inflate tables for fixed codes, to make the code - completely thread safe (Mark) -- some simplifications and slight speed-up to the inflate code (Mark) -- fix gzeof on non-compressed files (Allan Schrum) -- add -std1 option in configure for OSF1 to fix gzprintf (Martin Mokrejs) -- use default value of 4K for Z_BUFSIZE for 16-bit MSDOS (Tim Wegner + Glenn) -- added os2/Makefile.def and os2/zlib.def (Andrew Zabolotny) -- add shared lib support for UNIX_SV4.2MP (MATSUURA Takanori) -- do not wrap extern "C" around system includes (Tom Lane) -- mention zlib binding for TCL in README (Andreas Kupries) -- added amiga/Makefile.pup for Amiga powerUP SAS/C PPC (Andreas Kleinert) -- allow "make install prefix=..." even after configure (Glenn Randers-Pehrson) -- allow "configure --prefix $HOME" (Tim Mooney) -- remove warnings in example.c and gzio.c (Glenn Randers-Pehrson) -- move Makefile.sas to amiga/Makefile.sas - -Changes in 1.1.1 (27 Feb 98) -- fix macros _tr_tally_* in deflate.h for debug mode (Glenn Randers-Pehrson) -- remove block truncation heuristic which had very marginal effect for zlib - (smaller lit_bufsize than in gzip 1.2.4) and degraded a little the - compression ratio on some files. This also allows inlining _tr_tally for - matches in deflate_slow. -- added msdos/Makefile.w32 for WIN32 Microsoft Visual C++ (Bob Frazier) - -Changes in 1.1.0 (24 Feb 98) -- do not return STREAM_END prematurely in inflate (John Bowler) -- revert to the zlib 1.0.8 inflate to avoid the gcc 2.8.0 bug (Jeremy Buhler) -- compile with -DFASTEST to get compression code optimized for speed only -- in minigzip, try mmap'ing the input file first (Miguel Albrecht) -- increase size of I/O buffers in minigzip.c and gzio.c (not a big gain - on Sun but significant on HP) - -- add a pointer to experimental unzip library in README (Gilles Vollant) -- initialize variable gcc in configure (Chris Herborth) - -Changes in 1.0.9 (17 Feb 1998) -- added gzputs and gzgets functions -- do not clear eof flag in gzseek (Mark Diekhans) -- fix gzseek for files in transparent mode (Mark Diekhans) -- do not assume that vsprintf returns the number of bytes written (Jens Krinke) -- replace EXPORT with ZEXPORT to avoid conflict with other programs -- added compress2 in zconf.h, zlib.def, zlib.dnt -- new asm code from Gilles Vollant in contrib/asm386 -- simplify the inflate code (Mark): - . Replace ZALLOC's in huft_build() with single ZALLOC in inflate_blocks_new() - . ZALLOC the length list in inflate_trees_fixed() instead of using stack - . ZALLOC the value area for huft_build() instead of using stack - . Simplify Z_FINISH check in inflate() - -- Avoid gcc 2.8.0 comparison bug a little differently than zlib 1.0.8 -- in inftrees.c, avoid cc -O bug on HP (Farshid Elahi) -- in zconf.h move the ZLIB_DLL stuff earlier to avoid problems with - the declaration of FAR (Gilles VOllant) -- install libz.so* with mode 755 (executable) instead of 644 (Marc Lehmann) -- read_buf buf parameter of type Bytef* instead of charf* -- zmemcpy parameters are of type Bytef*, not charf* (Joseph Strout) -- do not redeclare unlink in minigzip.c for WIN32 (John Bowler) -- fix check for presence of directories in "make install" (Ian Willis) - -Changes in 1.0.8 (27 Jan 1998) -- fixed offsets in contrib/asm386/gvmat32.asm (Gilles Vollant) -- fix gzgetc and gzputc for big endian systems (Markus Oberhumer) -- added compress2() to allow setting the compression level -- include sys/types.h to get off_t on some systems (Marc Lehmann & QingLong) -- use constant arrays for the static trees in trees.c instead of computing - them at run time (thanks to Ken Raeburn for this suggestion). To create - trees.h, compile with GEN_TREES_H and run "make test". -- check return code of example in "make test" and display result -- pass minigzip command line options to file_compress -- simplifying code of inflateSync to avoid gcc 2.8 bug - -- support CC="gcc -Wall" in configure -s (QingLong) -- avoid a flush caused by ftell in gzopen for write mode (Ken Raeburn) -- fix test for shared library support to avoid compiler warnings -- zlib.lib -> zlib.dll in msdos/zlib.rc (Gilles Vollant) -- check for TARGET_OS_MAC in addition to MACOS (Brad Pettit) -- do not use fdopen for Metrowerks on Mac (Brad Pettit)) -- add checks for gzputc and gzputc in example.c -- avoid warnings in gzio.c and deflate.c (Andreas Kleinert) -- use const for the CRC table (Ken Raeburn) -- fixed "make uninstall" for shared libraries -- use Tracev instead of Trace in infblock.c -- in example.c use correct compressed length for test_sync -- suppress +vnocompatwarnings in configure for HPUX (not always supported) - -Changes in 1.0.7 (20 Jan 1998) -- fix gzseek which was broken in write mode -- return error for gzseek to negative absolute position -- fix configure for Linux (Chun-Chung Chen) -- increase stack space for MSC (Tim Wegner) -- get_crc_table and inflateSyncPoint are EXPORTed (Gilles Vollant) -- define EXPORTVA for gzprintf (Gilles Vollant) -- added man page zlib.3 (Rick Rodgers) -- for contrib/untgz, fix makedir() and improve Makefile - -- check gzseek in write mode in example.c -- allocate extra buffer for seeks only if gzseek is actually called -- avoid signed/unsigned comparisons (Tim Wegner, Gilles Vollant) -- add inflateSyncPoint in zconf.h -- fix list of exported functions in nt/zlib.dnt and mdsos/zlib.def - -Changes in 1.0.6 (19 Jan 1998) -- add functions gzprintf, gzputc, gzgetc, gztell, gzeof, gzseek, gzrewind and - gzsetparams (thanks to Roland Giersig and Kevin Ruland for some of this code) -- Fix a deflate bug occuring only with compression level 0 (thanks to - Andy Buckler for finding this one). -- In minigzip, pass transparently also the first byte for .Z files. -- return Z_BUF_ERROR instead of Z_OK if output buffer full in uncompress() -- check Z_FINISH in inflate (thanks to Marc Schluper) -- Implement deflateCopy (thanks to Adam Costello) -- make static libraries by default in configure, add --shared option. -- move MSDOS or Windows specific files to directory msdos -- suppress the notion of partial flush to simplify the interface - (but the symbol Z_PARTIAL_FLUSH is kept for compatibility with 1.0.4) -- suppress history buffer provided by application to simplify the interface - (this feature was not implemented anyway in 1.0.4) -- next_in and avail_in must be initialized before calling inflateInit or - inflateInit2 -- add EXPORT in all exported functions (for Windows DLL) -- added Makefile.nt (thanks to Stephen Williams) -- added the unsupported "contrib" directory: - contrib/asm386/ by Gilles Vollant - 386 asm code replacing longest_match(). - contrib/iostream/ by Kevin Ruland - A C++ I/O streams interface to the zlib gz* functions - contrib/iostream2/ by Tyge Løvset - Another C++ I/O streams interface - contrib/untgz/ by "Pedro A. Aranda Guti\irrez" - A very simple tar.gz file extractor using zlib - contrib/visual-basic.txt by Carlos Rios - How to use compress(), uncompress() and the gz* functions from VB. -- pass params -f (filtered data), -h (huffman only), -1 to -9 (compression - level) in minigzip (thanks to Tom Lane) - -- use const for rommable constants in deflate -- added test for gzseek and gztell in example.c -- add undocumented function inflateSyncPoint() (hack for Paul Mackerras) -- add undocumented function zError to convert error code to string - (for Tim Smithers) -- Allow compilation of gzio with -DNO_DEFLATE to avoid the compression code. -- Use default memcpy for Symantec MSDOS compiler. -- Add EXPORT keyword for check_func (needed for Windows DLL) -- add current directory to LD_LIBRARY_PATH for "make test" -- create also a link for libz.so.1 -- added support for FUJITSU UXP/DS (thanks to Toshiaki Nomura) -- use $(SHAREDLIB) instead of libz.so in Makefile.in (for HPUX) -- added -soname for Linux in configure (Chun-Chung Chen, -- assign numbers to the exported functions in zlib.def (for Windows DLL) -- add advice in zlib.h for best usage of deflateSetDictionary -- work around compiler bug on Atari (cast Z_NULL in call of s->checkfn) -- allow compilation with ANSI keywords only enabled for TurboC in large model -- avoid "versionString"[0] (Borland bug) -- add NEED_DUMMY_RETURN for Borland -- use variable z_verbose for tracing in debug mode (L. Peter Deutsch). -- allow compilation with CC -- defined STDC for OS/2 (David Charlap) -- limit external names to 8 chars for MVS (Thomas Lund) -- in minigzip.c, use static buffers only for 16-bit systems -- fix suffix check for "minigzip -d foo.gz" -- do not return an error for the 2nd of two consecutive gzflush() (Felix Lee) -- use _fdopen instead of fdopen for MSC >= 6.0 (Thomas Fanslau) -- added makelcc.bat for lcc-win32 (Tom St Denis) -- in Makefile.dj2, use copy and del instead of install and rm (Frank Donahoe) -- Avoid expanded $Id$. Use "rcs -kb" or "cvs admin -kb" to avoid Id expansion. -- check for unistd.h in configure (for off_t) -- remove useless check parameter in inflate_blocks_free -- avoid useless assignment of s->check to itself in inflate_blocks_new -- do not flush twice in gzclose (thanks to Ken Raeburn) -- rename FOPEN as F_OPEN to avoid clash with /usr/include/sys/file.h -- use NO_ERRNO_H instead of enumeration of operating systems with errno.h -- work around buggy fclose on pipes for HP/UX -- support zlib DLL with BORLAND C++ 5.0 (thanks to Glenn Randers-Pehrson) -- fix configure if CC is already equal to gcc - -Changes in 1.0.5 (3 Jan 98) -- Fix inflate to terminate gracefully when fed corrupted or invalid data -- Use const for rommable constants in inflate -- Eliminate memory leaks on error conditions in inflate -- Removed some vestigial code in inflate -- Update web address in README - -Changes in 1.0.4 (24 Jul 96) -- In very rare conditions, deflate(s, Z_FINISH) could fail to produce an EOF - bit, so the decompressor could decompress all the correct data but went - on to attempt decompressing extra garbage data. This affected minigzip too. -- zlibVersion and gzerror return const char* (needed for DLL) -- port to RISCOS (no fdopen, no multiple dots, no unlink, no fileno) -- use z_error only for DEBUG (avoid problem with DLLs) - -Changes in 1.0.3 (2 Jul 96) -- use z_streamp instead of z_stream *, which is now a far pointer in MSDOS - small and medium models; this makes the library incompatible with previous - versions for these models. (No effect in large model or on other systems.) -- return OK instead of BUF_ERROR if previous deflate call returned with - avail_out as zero but there is nothing to do -- added memcmp for non STDC compilers -- define NO_DUMMY_DECL for more Mac compilers (.h files merged incorrectly) -- define __32BIT__ if __386__ or i386 is defined (pb. with Watcom and SCO) -- better check for 16-bit mode MSC (avoids problem with Symantec) - -Changes in 1.0.2 (23 May 96) -- added Windows DLL support -- added a function zlibVersion (for the DLL support) -- fixed declarations using Bytef in infutil.c (pb with MSDOS medium model) -- Bytef is define's instead of typedef'd only for Borland C -- avoid reading uninitialized memory in example.c -- mention in README that the zlib format is now RFC1950 -- updated Makefile.dj2 -- added algorithm.doc - -Changes in 1.0.1 (20 May 96) [1.0 skipped to avoid confusion] -- fix array overlay in deflate.c which sometimes caused bad compressed data -- fix inflate bug with empty stored block -- fix MSDOS medium model which was broken in 0.99 -- fix deflateParams() which could generated bad compressed data. -- Bytef is define'd instead of typedef'ed (work around Borland bug) -- added an INDEX file -- new makefiles for DJGPP (Makefile.dj2), 32-bit Borland (Makefile.b32), - Watcom (Makefile.wat), Amiga SAS/C (Makefile.sas) -- speed up adler32 for modern machines without auto-increment -- added -ansi for IRIX in configure -- static_init_done in trees.c is an int -- define unlink as delete for VMS -- fix configure for QNX -- add configure branch for SCO and HPUX -- avoid many warnings (unused variables, dead assignments, etc...) -- no fdopen for BeOS -- fix the Watcom fix for 32 bit mode (define FAR as empty) -- removed redefinition of Byte for MKWERKS -- work around an MWKERKS bug (incorrect merge of all .h files) - -Changes in 0.99 (27 Jan 96) -- allow preset dictionary shared between compressor and decompressor -- allow compression level 0 (no compression) -- add deflateParams in zlib.h: allow dynamic change of compression level - and compression strategy. -- test large buffers and deflateParams in example.c -- add optional "configure" to build zlib as a shared library -- suppress Makefile.qnx, use configure instead -- fixed deflate for 64-bit systems (detected on Cray) -- fixed inflate_blocks for 64-bit systems (detected on Alpha) -- declare Z_DEFLATED in zlib.h (possible parameter for deflateInit2) -- always return Z_BUF_ERROR when deflate() has nothing to do -- deflateInit and inflateInit are now macros to allow version checking -- prefix all global functions and types with z_ with -DZ_PREFIX -- make falloc completely reentrant (inftrees.c) -- fixed very unlikely race condition in ct_static_init -- free in reverse order of allocation to help memory manager -- use zlib-1.0/* instead of zlib/* inside the tar.gz -- make zlib warning-free with "gcc -O3 -Wall -Wwrite-strings -Wpointer-arith - -Wconversion -Wstrict-prototypes -Wmissing-prototypes" -- allow gzread on concatenated .gz files -- deflateEnd now returns Z_DATA_ERROR if it was premature -- deflate is finally (?) fully deterministic (no matches beyond end of input) -- Document Z_SYNC_FLUSH -- add uninstall in Makefile -- Check for __cpluplus in zlib.h -- Better test in ct_align for partial flush -- avoid harmless warnings for Borland C++ -- initialize hash_head in deflate.c -- avoid warning on fdopen (gzio.c) for HP cc -Aa -- include stdlib.h for STDC compilers -- include errno.h for Cray -- ignore error if ranlib doesn't exist -- call ranlib twice for NeXTSTEP -- use exec_prefix instead of prefix for libz.a -- renamed ct_* as _tr_* to avoid conflict with applications -- clear z->msg in inflateInit2 before any error return -- initialize opaque in example.c, gzio.c, deflate.c and inflate.c -- fixed typo in zconf.h (_GNUC__ => __GNUC__) -- check for WIN32 in zconf.h and zutil.c (avoid farmalloc in 32-bit mode) -- fix typo in Make_vms.com (f$trnlnm -> f$getsyi) -- in fcalloc, normalize pointer if size > 65520 bytes -- don't use special fcalloc for 32 bit Borland C++ -- use STDC instead of __GO32__ to avoid redeclaring exit, calloc, etc... -- use Z_BINARY instead of BINARY -- document that gzclose after gzdopen will close the file -- allow "a" as mode in gzopen. -- fix error checking in gzread -- allow skipping .gz extra-field on pipes -- added reference to Perl interface in README -- put the crc table in FAR data (I dislike more and more the medium model :) -- added get_crc_table -- added a dimension to all arrays (Borland C can't count). -- workaround Borland C bug in declaration of inflate_codes_new & inflate_fast -- guard against multiple inclusion of *.h (for precompiled header on Mac) -- Watcom C pretends to be Microsoft C small model even in 32 bit mode. -- don't use unsized arrays to avoid silly warnings by Visual C++: - warning C4746: 'inflate_mask' : unsized array treated as '__far' - (what's wrong with far data in far model?). -- define enum out of inflate_blocks_state to allow compilation with C++ - -Changes in 0.95 (16 Aug 95) -- fix MSDOS small and medium model (now easier to adapt to any compiler) -- inlined send_bits -- fix the final (:-) bug for deflate with flush (output was correct but - not completely flushed in rare occasions). -- default window size is same for compression and decompression - (it's now sufficient to set MAX_WBITS in zconf.h). -- voidp -> voidpf and voidnp -> voidp (for consistency with other - typedefs and because voidnp was not near in large model). - -Changes in 0.94 (13 Aug 95) -- support MSDOS medium model -- fix deflate with flush (could sometimes generate bad output) -- fix deflateReset (zlib header was incorrectly suppressed) -- added support for VMS -- allow a compression level in gzopen() -- gzflush now calls fflush -- For deflate with flush, flush even if no more input is provided. -- rename libgz.a as libz.a -- avoid complex expression in infcodes.c triggering Turbo C bug -- work around a problem with gcc on Alpha (in INSERT_STRING) -- don't use inline functions (problem with some gcc versions) -- allow renaming of Byte, uInt, etc... with #define. -- avoid warning about (unused) pointer before start of array in deflate.c -- avoid various warnings in gzio.c, example.c, infblock.c, adler32.c, zutil.c -- avoid reserved word 'new' in trees.c - -Changes in 0.93 (25 June 95) -- temporarily disable inline functions -- make deflate deterministic -- give enough lookahead for PARTIAL_FLUSH -- Set binary mode for stdin/stdout in minigzip.c for OS/2 -- don't even use signed char in inflate (not portable enough) -- fix inflate memory leak for segmented architectures - -Changes in 0.92 (3 May 95) -- don't assume that char is signed (problem on SGI) -- Clear bit buffer when starting a stored block -- no memcpy on Pyramid -- suppressed inftest.c -- optimized fill_window, put longest_match inline for gcc -- optimized inflate on stored blocks. -- untabify all sources to simplify patches - -Changes in 0.91 (2 May 95) -- Default MEM_LEVEL is 8 (not 9 for Unix) as documented in zlib.h -- Document the memory requirements in zconf.h -- added "make install" -- fix sync search logic in inflateSync -- deflate(Z_FULL_FLUSH) now works even if output buffer too short -- after inflateSync, don't scare people with just "lo world" -- added support for DJGPP - -Changes in 0.9 (1 May 95) -- don't assume that zalloc clears the allocated memory (the TurboC bug - was Mark's bug after all :) -- let again gzread copy uncompressed data unchanged (was working in 0.71) -- deflate(Z_FULL_FLUSH), inflateReset and inflateSync are now fully implemented -- added a test of inflateSync in example.c -- moved MAX_WBITS to zconf.h because users might want to change that. -- document explicitly that zalloc(64K) on MSDOS must return a normalized - pointer (zero offset) -- added Makefiles for Microsoft C, Turbo C, Borland C++ -- faster crc32() - -Changes in 0.8 (29 April 95) -- added fast inflate (inffast.c) -- deflate(Z_FINISH) now returns Z_STREAM_END when done. Warning: this - is incompatible with previous versions of zlib which returned Z_OK. -- work around a TurboC compiler bug (bad code for b << 0, see infutil.h) - (actually that was not a compiler bug, see 0.81 above) -- gzread no longer reads one extra byte in certain cases -- In gzio destroy(), don't reference a freed structure -- avoid many warnings for MSDOS -- avoid the ERROR symbol which is used by MS Windows - -Changes in 0.71 (14 April 95) -- Fixed more MSDOS compilation problems :( There is still a bug with - TurboC large model. - -Changes in 0.7 (14 April 95) -- Added full inflate support. -- Simplified the crc32() interface. The pre- and post-conditioning - (one's complement) is now done inside crc32(). WARNING: this is - incompatible with previous versions; see zlib.h for the new usage. - -Changes in 0.61 (12 April 95) -- workaround for a bug in TurboC. example and minigzip now work on MSDOS. - -Changes in 0.6 (11 April 95) -- added minigzip.c -- added gzdopen to reopen a file descriptor as gzFile -- added transparent reading of non-gziped files in gzread. -- fixed bug in gzread (don't read crc as data) -- fixed bug in destroy (gzio.c) (don't return Z_STREAM_END for gzclose). -- don't allocate big arrays in the stack (for MSDOS) -- fix some MSDOS compilation problems - -Changes in 0.5: -- do real compression in deflate.c. Z_PARTIAL_FLUSH is supported but - not yet Z_FULL_FLUSH. -- support decompression but only in a single step (forced Z_FINISH) -- added opaque object for zalloc and zfree. -- added deflateReset and inflateReset -- added a variable zlib_version for consistency checking. -- renamed the 'filter' parameter of deflateInit2 as 'strategy'. - Added Z_FILTERED and Z_HUFFMAN_ONLY constants. - -Changes in 0.4: -- avoid "zip" everywhere, use zlib instead of ziplib. -- suppress Z_BLOCK_FLUSH, interpret Z_PARTIAL_FLUSH as block flush - if compression method == 8. -- added adler32 and crc32 -- renamed deflateOptions as deflateInit2, call one or the other but not both -- added the method parameter for deflateInit2. -- added inflateInit2 -- simplied considerably deflateInit and inflateInit by not supporting - user-provided history buffer. This is supported only in deflateInit2 - and inflateInit2. - -Changes in 0.3: -- prefix all macro names with Z_ -- use Z_FINISH instead of deflateEnd to finish compression. -- added Z_HUFFMAN_ONLY -- added gzerror() diff --git a/zlib/INDEX b/zlib/INDEX deleted file mode 100644 index 8a245766..00000000 --- a/zlib/INDEX +++ /dev/null @@ -1,86 +0,0 @@ -ChangeLog history of changes -INDEX this file -FAQ Frequently Asked Questions about zlib -Make_vms.com script for Vax/VMS -Makefile makefile for Unix (generated by configure) -Makefile.in makefile for Unix (template for configure) -Makefile.riscos makefile for RISCOS -README guess what -algorithm.txt description of the (de)compression algorithm -configure configure script for Unix -descrip.mms makefile for Vax/VMS -zlib.3 mini man page for zlib (volunteers to write full - man pages from zlib.h welcome. write to jloup@gzip.org) - -amiga/Makefile.sas makefile for Amiga SAS/C -amiga/Makefile.pup makefile for Amiga powerUP SAS/C PPC - -msdos/Makefile.w32 makefile for Microsoft Visual C++ 32-bit -msdos/Makefile.b32 makefile for Borland C++ 32-bit -msdos/Makefile.bor makefile for Borland C/C++ 16-bit -msdos/Makefile.dj2 makefile for DJGPP 2.x -msdos/Makefile.emx makefile for EMX 0.9c (32-bit DOS/OS2) -msdos/Makefile.msc makefile for Microsoft C 16-bit -msdos/Makefile.tc makefile for Turbo C -msdos/Makefile.wat makefile for Watcom C -msdos/zlib.def definition file for Windows DLL -msdos/zlib.rc definition file for Windows DLL - -nt/Makefile.nt makefile for Windows NT -nt/zlib.dnt definition file for Windows NT DLL -nt/Makefile.emx makefile for EMX 0.9c/RSXNT 1.41 (Win32 Intel) -nt/Makefile.gcc makefile for Windows NT using GCC (mingw32) - - - zlib public header files (must be kept): -zconf.h -zlib.h - - private source files used to build the zlib library: -adler32.c -compress.c -crc32.c -deflate.c -deflate.h -gzio.c -infblock.c -infblock.h -infcodes.c -infcodes.h -inffast.c -inffast.h -inflate.c -inftrees.c -inftrees.h -infutil.c -infutil.h -maketree.c -trees.c -uncompr.c -zutil.c -zutil.h - - source files for sample programs: -example.c -minigzip.c - - unsupported contribution by third parties - -contrib/asm386/ by Gilles Vollant - 386 asm code replacing longest_match(). - -contrib/minizip/ by Gilles Vollant - Mini zip and unzip based on zlib - See http://www.winimage.com/zLibDll/unzip.html - -contrib/iostream/ by Kevin Ruland - A C++ I/O streams interface to the zlib gz* functions - -contrib/iostream2/ by Tyge Løvset - Another C++ I/O streams interface - -contrib/untgz/ by "Pedro A. Aranda Guti\irrez" - A very simple tar.gz extractor using zlib - -contrib/visual-basic.txt by Carlos Rios - How to use compress(), uncompress() and the gz* functions from VB. diff --git a/zlib/Makefile.am b/zlib/Makefile.am deleted file mode 100644 index 0c93862f..00000000 --- a/zlib/Makefile.am +++ /dev/null @@ -1,31 +0,0 @@ -EXTRA_DIST = ChangeLog INDEX Make_vms.com Makefile.riscos README \ - algorithm.txt descrip.mms example.c maketree.c minigzip.c zlib.3 - -lib_LIBRARIES = libz.a - -libz_a_SOURCES = \ - adler32.c \ - compress.c \ - crc32.c \ - deflate.c \ - deflate.h \ - gzio.c \ - infblock.c \ - infblock.h \ - infcodes.c \ - infcodes.h \ - inffast.c \ - inffast.h \ - inffixed.h \ - inflate.c \ - inftrees.c \ - inftrees.h \ - infutil.c \ - infutil.h \ - trees.c \ - trees.h \ - uncompr.c \ - zconf.h \ - zlib.h \ - zutil.c \ - zutil.h diff --git a/zlib/README b/zlib/README deleted file mode 100644 index 8ff45879..00000000 --- a/zlib/README +++ /dev/null @@ -1,148 +0,0 @@ -zlib 1.1.3 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 -ftp://ds.internic.net/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 - -All functions of the compression library are documented in the file zlib.h -(volunteer to write man pages welcome, contact jloup@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. - -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 or descrip.mms. - -Questions about zlib should be sent to , or to -Gilles Vollant for the Windows DLL version. -The zlib home page is http://www.cdrom.com/pub/infozip/zlib/ -The official zlib ftp site is ftp://ftp.cdrom.com/pub/infozip/zlib/ -Before reporting a problem, please check those sites to verify that -you have the latest version of zlib; otherwise get the latest version and -check whether the problem still exists or not. - -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://web2.airmail.net/markn/articles/zlibtool/zlibtool.htm - -The changes made in version 1.1.3 are documented in the file ChangeLog. -The main changes since 1.1.2 are: - -- fix "an inflate input buffer bug that shows up on rare but persistent - occasions" (Mark) -- fix gzread and gztell for concatenated .gz files (Didier Le Botlan) -- fix gzseek(..., SEEK_SET) in write mode -- fix crc check after a gzeek (Frank Faubert) -- fix miniunzip when the last entry in a zip file is itself a zip file - (J Lillge) -- add contrib/asm586 and contrib/asm686 (Brian Raiter) - See http://www.muppetlabs.com/~breadbox/software/assembly.html -- add support for Delphi 3 in contrib/delphi (Bob Dellaca) -- add support for C++Builder 3 and Delphi 3 in contrib/delphi2 (Davide Moretti) -- do not exit prematurely in untgz if 0 at start of block (Magnus Holmgren) -- use macro EXTERN instead of extern to support DLL for BeOS (Sander Stoks) -- added a FAQ file - -plus many changes for portability. - -Unsupported third party contributions are provided in directory "contrib". - -A Java implementation of zlib is available in the Java Development Kit 1.1 -http://www.javasoft.com/products/JDK/1.1/docs/api/Package-java.util.zip.html -See the zlib home page http://www.cdrom.com/pub/infozip/zlib/ for details. - -A Perl interface to zlib written by Paul Marquess -is in the CPAN (Comprehensive Perl Archive Network) sites, such as: -ftp://ftp.cis.ufl.edu/pub/perl/CPAN/modules/by-module/Compress/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 - -A zlib binding for TCL written by Andreas Kupries -is availlable at http://www.westend.com/~kupries/doc/trf/man/man.html - -An experimental package to read and write files in .zip format, -written on top of zlib by Gilles Vollant , is -available at http://www.winimage.com/zLibDll/unzip.html -and also in the contrib/minizip directory of zlib. - - -Notes for some targets: - -- To build a Windows DLL version, include in a DLL project zlib.def, zlib.rc - and all .c files except example.c and minigzip.c; compile with -DZLIB_DLL - The zlib DLL support was initially done by Alessandro Iacopetti and is - now maintained by Gilles Vollant . Check the zlib DLL - home page at http://www.winimage.com/zLibDll - - From Visual Basic, you can call the DLL functions which do not take - a structure as argument: compress, uncompress and all gz* functions. - See contrib/visual-basic.txt for more information, or get - http://www.tcfb.com/dowseware/cmp-z-it.zip - -- For 64-bit Irix, deflate.c must be compiled without any optimization. - With -O, one libpng test fails. The test works in 32 bit mode (with - the -n32 compiler flag). The compiler bug has been reported to SGI. - -- zlib doesn't work with gcc 2.6.3 on a DEC 3000/300LX under OSF/1 2.1 - it works when compiled with cc. - -- on Digital Unix 4.0D (formely OSF/1) on AlphaServer, the cc option -std1 - is necessary to get gzprintf working correctly. This is done by configure. - -- 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. - -- For Turbo C the small model is supported only with reduced performance to - avoid any far allocation; it was tested with -DMAX_WBITS=11 -DMAX_MEM_LEVEL=3 - -- For PalmOs, see http://www.cs.uit.no/~perm/PASTA/pilot/software.html - Per Harald Myrvang - - -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. - -Copyright notice: - - (C) 1995-1998 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 - 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. - - 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 redistribute modified sources, we would appreciate that you include -in the file ChangeLog history information documenting your changes. diff --git a/zlib/adler32.c b/zlib/adler32.c deleted file mode 100644 index 16cf9a70..00000000 --- a/zlib/adler32.c +++ /dev/null @@ -1,48 +0,0 @@ -/* adler32.c -- compute the Adler-32 checksum of a data stream - * Copyright (C) 1995-1998 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* @(#) $Id$ */ - -#include "zlib.h" - -#define BASE 65521L /* 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 */ - -#define DO1(buf,i) {s1 += buf[i]; s2 += s1;} -#define DO2(buf,i) DO1(buf,i); DO1(buf,i+1); -#define DO4(buf,i) DO2(buf,i); DO2(buf,i+2); -#define DO8(buf,i) DO4(buf,i); DO4(buf,i+4); -#define DO16(buf) DO8(buf,0); DO8(buf,8); - -/* ========================================================================= */ -uLong ZEXPORT adler32(adler, buf, len) - uLong adler; - const Bytef *buf; - uInt len; -{ - unsigned long s1 = adler & 0xffff; - unsigned long s2 = (adler >> 16) & 0xffff; - int k; - - if (buf == Z_NULL) return 1L; - - while (len > 0) { - k = len < NMAX ? len : NMAX; - len -= k; - while (k >= 16) { - DO16(buf); - buf += 16; - k -= 16; - } - if (k != 0) do { - s1 += *buf++; - s2 += s1; - } while (--k); - s1 %= BASE; - s2 %= BASE; - } - return (s2 << 16) | s1; -} diff --git a/zlib/algorithm.txt b/zlib/algorithm.txt deleted file mode 100644 index cdc830b5..00000000 --- a/zlib/algorithm.txt +++ /dev/null @@ -1,213 +0,0 @@ -1. Compression algorithm (deflate) - -The deflation algorithm used by gzip (also zip and zlib) is a variation of -LZ77 (Lempel-Ziv 1977, see reference below). It finds duplicated strings in -the input data. The second occurrence of a string is replaced by a -pointer to the previous string, in the form of a pair (distance, -length). Distances are limited to 32K bytes, and lengths are limited -to 258 bytes. When a string does not occur anywhere in the previous -32K bytes, it is emitted as a sequence of literal bytes. (In this -description, `string' must be taken as an arbitrary sequence of bytes, -and is not restricted to printable characters.) - -Literals or match lengths are compressed with one Huffman tree, and -match distances are compressed with another tree. The trees are stored -in a compact form at the start of each block. The blocks can have any -size (except that the compressed data for one block must fit in -available memory). A block is terminated when deflate() determines that -it would be useful to start another block with fresh trees. (This is -somewhat similar to the behavior of LZW-based _compress_.) - -Duplicated strings are found using a hash table. All input strings of -length 3 are inserted in the hash table. A hash index is computed for -the next 3 bytes. If the hash chain for this index is not empty, all -strings in the chain are compared with the current input string, and -the longest match is selected. - -The hash chains are searched starting with the most recent strings, to -favor small distances and thus take advantage of the Huffman encoding. -The hash chains are singly linked. There are no deletions from the -hash chains, the algorithm simply discards matches that are too old. - -To avoid a worst-case situation, very long hash chains are arbitrarily -truncated at a certain length, determined by a runtime option (level -parameter of deflateInit). So deflate() does not always find the longest -possible match but generally finds a match which is long enough. - -deflate() also defers the selection of matches with a lazy evaluation -mechanism. After a match of length N has been found, deflate() searches for -a longer match at the next input byte. If a longer match is found, the -previous match is truncated to a length of one (thus producing a single -literal byte) and the process of lazy evaluation begins again. Otherwise, -the original match is kept, and the next match search is attempted only N -steps later. - -The lazy match evaluation is also subject to a runtime parameter. If -the current match is long enough, deflate() reduces the search for a longer -match, thus speeding up the whole process. If compression ratio is more -important than speed, deflate() attempts a complete second search even if -the first match is already long enough. - -The lazy match evaluation is not performed for the fastest compression -modes (level parameter 1 to 3). For these fast modes, new strings -are inserted in the hash table only when no match was found, or -when the match is not too long. This degrades the compression ratio -but saves time since there are both fewer insertions and fewer searches. - - -2. Decompression algorithm (inflate) - -2.1 Introduction - -The real question is, given a Huffman tree, how to decode fast. The most -important realization is that shorter codes are much more common than -longer codes, so pay attention to decoding the short codes fast, and let -the long codes take longer to decode. - -inflate() sets up a first level table that covers some number of bits of -input less than the length of longest code. It gets that many bits from the -stream, and looks it up in the table. The table will tell if the next -code is that many bits or less and how many, and if it is, it will tell -the value, else it will point to the next level table for which inflate() -grabs more bits and tries to decode a longer code. - -How many bits to make the first lookup is a tradeoff between the time it -takes to decode and the time it takes to build the table. If building the -table took no time (and if you had infinite memory), then there would only -be a first level table to cover all the way to the longest code. However, -building the table ends up taking a lot longer for more bits since short -codes are replicated many times in such a table. What inflate() does is -simply to make the number of bits in the first table a variable, and set it -for the maximum speed. - -inflate() sends new trees relatively often, so it is possibly set for a -smaller first level table than an application that has only one tree for -all the data. For inflate, which has 286 possible codes for the -literal/length tree, the size of the first table is nine bits. Also the -distance trees have 30 possible values, and the size of the first table is -six bits. Note that for each of those cases, the table ended up one bit -longer than the ``average'' code length, i.e. the code length of an -approximately flat code which would be a little more than eight bits for -286 symbols and a little less than five bits for 30 symbols. It would be -interesting to see if optimizing the first level table for other -applications gave values within a bit or two of the flat code size. - - -2.2 More details on the inflate table lookup - -Ok, you want to know what this cleverly obfuscated inflate tree actually -looks like. You are correct that it's not a Huffman tree. It is simply a -lookup table for the first, let's say, nine bits of a Huffman symbol. The -symbol could be as short as one bit or as long as 15 bits. If a particular -symbol is shorter than nine bits, then that symbol's translation is duplicated -in all those entries that start with that symbol's bits. For example, if the -symbol is four bits, then it's duplicated 32 times in a nine-bit table. If a -symbol is nine bits long, it appears in the table once. - -If the symbol is longer than nine bits, then that entry in the table points -to another similar table for the remaining bits. Again, there are duplicated -entries as needed. The idea is that most of the time the symbol will be short -and there will only be one table look up. (That's whole idea behind data -compression in the first place.) For the less frequent long symbols, there -will be two lookups. If you had a compression method with really long -symbols, you could have as many levels of lookups as is efficient. For -inflate, two is enough. - -So a table entry either points to another table (in which case nine bits in -the above example are gobbled), or it contains the translation for the symbol -and the number of bits to gobble. Then you start again with the next -ungobbled bit. - -You may wonder: why not just have one lookup table for how ever many bits the -longest symbol is? The reason is that if you do that, you end up spending -more time filling in duplicate symbol entries than you do actually decoding. -At least for deflate's output that generates new trees every several 10's of -kbytes. You can imagine that filling in a 2^15 entry table for a 15-bit code -would take too long if you're only decoding several thousand symbols. At the -other extreme, you could make a new table for every bit in the code. In fact, -that's essentially a Huffman tree. But then you spend two much time -traversing the tree while decoding, even for short symbols. - -So the number of bits for the first lookup table is a trade of the time to -fill out the table vs. the time spent looking at the second level and above of -the table. - -Here is an example, scaled down: - -The code being decoded, with 10 symbols, from 1 to 6 bits long: - -A: 0 -B: 10 -C: 1100 -D: 11010 -E: 11011 -F: 11100 -G: 11101 -H: 11110 -I: 111110 -J: 111111 - -Let's make the first table three bits long (eight entries): - -000: A,1 -001: A,1 -010: A,1 -011: A,1 -100: B,2 -101: B,2 -110: -> table X (gobble 3 bits) -111: -> table Y (gobble 3 bits) - -Each entry is what the bits decode to and how many bits that is, i.e. how -many bits to gobble. Or the entry points to another table, with the number of -bits to gobble implicit in the size of the table. - -Table X is two bits long since the longest code starting with 110 is five bits -long: - -00: C,1 -01: C,1 -10: D,2 -11: E,2 - -Table Y is three bits long since the longest code starting with 111 is six -bits long: - -000: F,2 -001: F,2 -010: G,2 -011: G,2 -100: H,2 -101: H,2 -110: I,3 -111: J,3 - -So what we have here are three tables with a total of 20 entries that had to -be constructed. That's compared to 64 entries for a single table. Or -compared to 16 entries for a Huffman tree (six two entry tables and one four -entry table). Assuming that the code ideally represents the probability of -the symbols, it takes on the average 1.25 lookups per symbol. That's compared -to one lookup for the single table, or 1.66 lookups per symbol for the -Huffman tree. - -There, I think that gives you a picture of what's going on. For inflate, the -meaning of a particular symbol is often more than just a letter. It can be a -byte (a "literal"), or it can be either a length or a distance which -indicates a base value and a number of bits to fetch after the code that is -added to the base value. Or it might be the special end-of-block code. The -data structures created in inftrees.c try to encode all that information -compactly in the tables. - - -Jean-loup Gailly Mark Adler -jloup@gzip.org madler@alumni.caltech.edu - - -References: - -[LZ77] Ziv J., Lempel A., ``A Universal Algorithm for Sequential Data -Compression,'' IEEE Transactions on Information Theory, Vol. 23, No. 3, -pp. 337-343. - -``DEFLATE Compressed Data Format Specification'' available in -ftp://ds.internic.net/rfc/rfc1951.txt diff --git a/zlib/compress.c b/zlib/compress.c deleted file mode 100644 index 1cee4709..00000000 --- a/zlib/compress.c +++ /dev/null @@ -1,68 +0,0 @@ -/* compress.c -- compress a memory buffer - * Copyright (C) 1995-1998 Jean-loup Gailly. - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* @(#) $Id$ */ - -#include "zlib.h" - -/* =========================================================================== - 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 - destination buffer, which must be at least 0.1% larger than sourceLen plus - 12 bytes. 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 - memory, Z_BUF_ERROR if there was not enough room in the output buffer, - Z_STREAM_ERROR if the level parameter is invalid. -*/ -int ZEXPORT compress2 (dest, destLen, source, sourceLen, level) - Bytef *dest; - uLongf *destLen; - const Bytef *source; - uLong sourceLen; - int level; -{ - z_stream stream; - int err; - - stream.next_in = (Bytef*)source; - stream.avail_in = (uInt)sourceLen; -#ifdef MAXSEG_64K - /* Check for source > 64K on 16-bit machine: */ - if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; -#endif - stream.next_out = dest; - stream.avail_out = (uInt)*destLen; - if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; - - stream.zalloc = (alloc_func)0; - stream.zfree = (free_func)0; - stream.opaque = (voidpf)0; - - err = deflateInit(&stream, level); - if (err != Z_OK) return err; - - err = deflate(&stream, Z_FINISH); - if (err != Z_STREAM_END) { - deflateEnd(&stream); - return err == Z_OK ? Z_BUF_ERROR : err; - } - *destLen = stream.total_out; - - err = deflateEnd(&stream); - return err; -} - -/* =========================================================================== - */ -int ZEXPORT compress (dest, destLen, source, sourceLen) - Bytef *dest; - uLongf *destLen; - const Bytef *source; - uLong sourceLen; -{ - return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION); -} diff --git a/zlib/crc32.c b/zlib/crc32.c deleted file mode 100644 index a91101a8..00000000 --- a/zlib/crc32.c +++ /dev/null @@ -1,162 +0,0 @@ -/* crc32.c -- compute the CRC-32 of a data stream - * Copyright (C) 1995-1998 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* @(#) $Id$ */ - -#include "zlib.h" - -#define local static - -#ifdef DYNAMIC_CRC_TABLE - -local int crc_table_empty = 1; -local uLongf crc_table[256]; -local void make_crc_table OF((void)); - -/* - Generate a table for a byte-wise 32-bit CRC calculation on the polynomial: - x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1. - - Polynomials over GF(2) are represented in binary, one bit per coefficient, - with the lowest powers in the most significant bit. Then adding polynomials - is just exclusive-or, and multiplying a polynomial by x is a right shift by - one. If we call the above polynomial p, and represent a byte as the - polynomial q, also with the lowest power in the most significant bit (so the - byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p, - where a mod b means the remainder after dividing a by b. - - This calculation is done using the shift-register method of multiplying and - taking the remainder. The register is initialized to zero, and for each - incoming bit, x^32 is added mod p to the register if the bit is a one (where - x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by - x (which is shifting right by one and adding x^32 mod p if the bit shifted - out is a one). We start with the highest power (least significant bit) of - q and repeat for all eight bits of q. - - The table is simply the CRC of all possible eight bit values. This is all - the information needed to generate CRC's on data a byte at a time for all - combinations of CRC register values and incoming bytes. -*/ -local void make_crc_table() -{ - uLong c; - int n, k; - uLong poly; /* polynomial exclusive-or pattern */ - /* terms of polynomial defining this crc (except x^32): */ - static const Byte p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26}; - - /* make exclusive-or pattern from polynomial (0xedb88320L) */ - poly = 0L; - for (n = 0; n < sizeof(p)/sizeof(Byte); n++) - poly |= 1L << (31 - p[n]); - - for (n = 0; n < 256; n++) - { - c = (uLong)n; - for (k = 0; k < 8; k++) - c = c & 1 ? poly ^ (c >> 1) : c >> 1; - crc_table[n] = c; - } - crc_table_empty = 0; -} -#else -/* ======================================================================== - * Table of CRC-32's of all single-byte values (made by make_crc_table) - */ -local const uLongf crc_table[256] = { - 0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L, - 0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L, - 0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L, - 0x90bf1d91L, 0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL, - 0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L, 0x136c9856L, - 0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL, 0x14015c4fL, 0x63066cd9L, - 0xfa0f3d63L, 0x8d080df5L, 0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L, - 0xa2677172L, 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL, - 0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L, - 0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L, 0x26d930acL, 0x51de003aL, - 0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L, - 0xb8bda50fL, 0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L, - 0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL, 0x76dc4190L, - 0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL, - 0x9fbfe4a5L, 0xe8b8d433L, 0x7807c9a2L, 0x0f00f934L, 0x9609a88eL, - 0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L, - 0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL, 0x6c0695edL, - 0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L, 0x65b0d9c6L, 0x12b7e950L, - 0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L, - 0xfbd44c65L, 0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L, - 0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL, 0x4369e96aL, - 0x346ed9fcL, 0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L, - 0xaa0a4c5fL, 0xdd0d7cc9L, 0x5005713cL, 0x270241aaL, 0xbe0b1010L, - 0xc90c2086L, 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL, - 0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L, - 0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL, 0xedb88320L, 0x9abfb3b6L, - 0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL, 0x04db2615L, - 0x73dc1683L, 0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L, - 0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L, 0xf00f9344L, - 0x8708a3d2L, 0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL, - 0x196c3671L, 0x6e6b06e7L, 0xfed41b76L, 0x89d32be0L, 0x10da7a5aL, - 0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L, - 0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L, - 0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL, 0xd80d2bdaL, 0xaf0a1b4cL, - 0x36034af6L, 0x41047a60L, 0xdf60efc3L, 0xa867df55L, 0x316e8eefL, - 0x4669be79L, 0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L, - 0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL, 0xc5ba3bbeL, - 0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L, - 0x2cd99e8bL, 0x5bdeae1dL, 0x9b64c2b0L, 0xec63f226L, 0x756aa39cL, - 0x026d930aL, 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L, - 0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL, - 0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L, 0x86d3d2d4L, 0xf1d4e242L, - 0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L, - 0x18b74777L, 0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL, - 0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L, 0xa00ae278L, - 0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L, - 0x4969474dL, 0x3e6e77dbL, 0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L, - 0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L, - 0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L, 0xbad03605L, - 0xcdd70693L, 0x54de5729L, 0x23d967bfL, 0xb3667a2eL, 0xc4614ab8L, - 0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL, - 0x2d02ef8dL -}; -#endif - -/* ========================================================================= - * This function can be used by asm versions of crc32() - */ -const uLongf * ZEXPORT get_crc_table() -{ -#ifdef DYNAMIC_CRC_TABLE - if (crc_table_empty) make_crc_table(); -#endif - return (const uLongf *)crc_table; -} - -/* ========================================================================= */ -#define DO1(buf) crc = crc_table[((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8); -#define DO2(buf) DO1(buf); DO1(buf); -#define DO4(buf) DO2(buf); DO2(buf); -#define DO8(buf) DO4(buf); DO4(buf); - -/* ========================================================================= */ -uLong ZEXPORT crc32(crc, buf, len) - uLong crc; - const Bytef *buf; - uInt len; -{ - if (buf == Z_NULL) return 0L; -#ifdef DYNAMIC_CRC_TABLE - if (crc_table_empty) - make_crc_table(); -#endif - crc = crc ^ 0xffffffffL; - while (len >= 8) - { - DO8(buf); - len -= 8; - } - if (len) do { - DO1(buf); - } while (--len); - return crc ^ 0xffffffffL; -} diff --git a/zlib/deflate.c b/zlib/deflate.c deleted file mode 100644 index 25d5818e..00000000 --- a/zlib/deflate.c +++ /dev/null @@ -1,1350 +0,0 @@ -/* deflate.c -- compress data using the deflation algorithm - * Copyright (C) 1995-1998 Jean-loup Gailly. - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* - * ALGORITHM - * - * The "deflation" process depends on being able to identify portions - * of the input text which are identical to earlier input (within a - * sliding window trailing behind the input currently being processed). - * - * The most straightforward technique turns out to be the fastest for - * most input files: try all possible matches and select the longest. - * The key feature of this algorithm is that insertions into the string - * dictionary are very simple and thus fast, and deletions are avoided - * completely. Insertions are performed at each input character, whereas - * string matches are performed only when the previous match ends. So it - * is preferable to spend more time in matches to allow very fast string - * insertions and avoid deletions. The matching algorithm for small - * strings is inspired from that of Rabin & Karp. A brute force approach - * is used to find longer strings when a small match has been found. - * A similar algorithm is used in comic (by Jan-Mark Wams) and freeze - * (by Leonid Broukhis). - * A previous version of this file used a more sophisticated algorithm - * (by Fiala and Greene) which is guaranteed to run in linear amortized - * time, but has a larger average cost, uses more memory and is patented. - * However the F&G algorithm may be faster for some highly redundant - * files if the parameter max_chain_length (described below) is too large. - * - * ACKNOWLEDGEMENTS - * - * The idea of lazy evaluation of matches is due to Jan-Mark Wams, and - * I found it in 'freeze' written by Leonid Broukhis. - * Thanks to many people for bug reports and testing. - * - * REFERENCES - * - * Deutsch, L.P.,"DEFLATE Compressed Data Format Specification". - * Available in ftp://ds.internic.net/rfc/rfc1951.txt - * - * A description of the Rabin and Karp algorithm is given in the book - * "Algorithms" by R. Sedgewick, Addison-Wesley, p252. - * - * Fiala,E.R., and Greene,D.H. - * Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595 - * - */ - -/* @(#) $Id$ */ - -#include "deflate.h" - -const char deflate_copyright[] = - " deflate 1.1.3 Copyright 1995-1998 Jean-loup Gailly "; -/* - 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 - include such an acknowledgment, I would appreciate that you keep this - copyright string in the executable of your product. - */ - -/* =========================================================================== - * Function prototypes. - */ -typedef enum { - need_more, /* block not completed, need more input or more output */ - block_done, /* block flush performed */ - finish_started, /* finish started, need only more output at next deflate */ - finish_done /* finish done, accept no more input or output */ -} block_state; - -typedef block_state (*compress_func) OF((deflate_state *s, int flush)); -/* Compression function. Returns the block state after the call. */ - -local void fill_window OF((deflate_state *s)); -local block_state deflate_stored OF((deflate_state *s, int flush)); -local block_state deflate_fast OF((deflate_state *s, int flush)); -local block_state deflate_slow 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)); -#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 - -#ifdef DEBUG -local void check_match OF((deflate_state *s, IPos start, IPos match, - int length)); -#endif - -/* =========================================================================== - * Local data - */ - -#define NIL 0 -/* Tail of hash chains */ - -#ifndef TOO_FAR -# define TOO_FAR 4096 -#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 - * found for specific files. - */ -typedef struct config_s { - ush good_length; /* reduce lazy search above this match length */ - ush max_lazy; /* do not perform lazy search above this match length */ - ush nice_length; /* quit search above this match length */ - ush max_chain; - compress_func func; -} config; - -local const config configuration_table[10] = { -/* good lazy nice chain */ -/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ -/* 1 */ {4, 4, 8, 4, deflate_fast}, /* maximum speed, no lazy matches */ -/* 2 */ {4, 5, 16, 8, deflate_fast}, -/* 3 */ {4, 6, 32, 32, deflate_fast}, - -/* 4 */ {4, 4, 16, 16, deflate_slow}, /* lazy matches */ -/* 5 */ {8, 16, 32, 32, deflate_slow}, -/* 6 */ {8, 16, 128, 128, deflate_slow}, -/* 7 */ {8, 32, 128, 256, deflate_slow}, -/* 8 */ {32, 128, 258, 1024, deflate_slow}, -/* 9 */ {32, 258, 258, 4096, deflate_slow}}; /* maximum compression */ - -/* Note: the deflate() code requires max_lazy >= MIN_MATCH and max_chain >= 4 - * For deflate_fast() (levels <= 3) good is ignored and lazy has a different - * meaning. - */ - -#define EQUAL 0 -/* result of memcmp for equal strings */ - -struct static_tree_desc_s {int dummy;}; /* for buggy compilers */ - -/* =========================================================================== - * Update a hash value with the given input byte - * IN assertion: all calls to to UPDATE_HASH are made with consecutive - * input characters, so that a running hash key can be computed from the - * previous key instead of complete recalculation each time. - */ -#define UPDATE_HASH(s,h,c) (h = (((h)<hash_shift) ^ (c)) & s->hash_mask) - - -/* =========================================================================== - * Insert string str in the dictionary and set match_head to the previous head - * of the hash chain (the most recent string with same hash key). Return - * the previous length of the hash chain. - * If this file is compiled with -DFASTEST, the compression level is forced - * to 1, and no hash chains are maintained. - * IN assertion: all calls to to INSERT_STRING are made with consecutive - * input characters and the first MIN_MATCH bytes of str are valid - * (except for the last MIN_MATCH-1 bytes of the input file). - */ -#ifdef FASTEST -#define INSERT_STRING(s, str, match_head) \ - (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ - match_head = s->head[s->ins_h], \ - s->head[s->ins_h] = (Pos)(str)) -#else -#define INSERT_STRING(s, str, match_head) \ - (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ - s->prev[(str) & s->w_mask] = match_head = s->head[s->ins_h], \ - s->head[s->ins_h] = (Pos)(str)) -#endif - -/* =========================================================================== - * Initialize the hash table (avoiding 64K overflow for 16 bit systems). - * prev[] will be initialized on the fly. - */ -#define CLEAR_HASH(s) \ - s->head[s->hash_size-1] = NIL; \ - zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head)); - -/* ========================================================================= */ -int ZEXPORT deflateInit_(strm, level, version, stream_size) - z_streamp strm; - int level; - const char *version; - int stream_size; -{ - return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, - Z_DEFAULT_STRATEGY, version, stream_size); - /* To do: ignore strm->next_in if we use it as window */ -} - -/* ========================================================================= */ -int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, - version, stream_size) - z_streamp strm; - int level; - int method; - int windowBits; - int memLevel; - int strategy; - const char *version; - int stream_size; -{ - deflate_state *s; - int noheader = 0; - static const char* my_version = ZLIB_VERSION; - - ushf *overlay; - /* We overlay pending_buf and d_buf+l_buf. This works since the average - * output size for (length,distance) codes is <= 24 bits. - */ - - if (version == Z_NULL || version[0] != my_version[0] || - stream_size != sizeof(z_stream)) { - return Z_VERSION_ERROR; - } - if (strm == Z_NULL) return Z_STREAM_ERROR; - - strm->msg = Z_NULL; - if (strm->zalloc == Z_NULL) { - strm->zalloc = zcalloc; - strm->opaque = (voidpf)0; - } - if (strm->zfree == Z_NULL) strm->zfree = zcfree; - - if (level == Z_DEFAULT_COMPRESSION) level = 6; -#ifdef FASTEST - level = 1; -#endif - - if (windowBits < 0) { /* undocumented feature: suppress zlib header */ - noheader = 1; - windowBits = -windowBits; - } - if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED || - windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || - strategy < 0 || strategy > Z_HUFFMAN_ONLY) { - return Z_STREAM_ERROR; - } - s = (deflate_state *) ZALLOC(strm, 1, sizeof(deflate_state)); - if (s == Z_NULL) return Z_MEM_ERROR; - strm->state = (struct internal_state FAR *)s; - s->strm = strm; - - s->noheader = noheader; - s->w_bits = windowBits; - s->w_size = 1 << s->w_bits; - s->w_mask = s->w_size - 1; - - s->hash_bits = memLevel + 7; - s->hash_size = 1 << s->hash_bits; - s->hash_mask = s->hash_size - 1; - s->hash_shift = ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH); - - s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte)); - s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos)); - s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos)); - - s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ - - overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2); - s->pending_buf = (uchf *) overlay; - s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L); - - if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL || - s->pending_buf == Z_NULL) { - strm->msg = (char*)ERR_MSG(Z_MEM_ERROR); - deflateEnd (strm); - return Z_MEM_ERROR; - } - s->d_buf = overlay + s->lit_bufsize/sizeof(ush); - s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize; - - s->level = level; - s->strategy = strategy; - s->method = (Byte)method; - - return deflateReset(strm); -} - -/* ========================================================================= */ -int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength) - z_streamp strm; - const Bytef *dictionary; - uInt dictLength; -{ - deflate_state *s; - uInt length = dictLength; - uInt n; - IPos hash_head = 0; - - if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL || - strm->state->status != INIT_STATE) return Z_STREAM_ERROR; - - s = strm->state; - strm->adler = adler32(strm->adler, dictionary, dictLength); - - if (length < MIN_MATCH) return Z_OK; - if (length > MAX_DIST(s)) { - length = MAX_DIST(s); -#ifndef USE_DICT_HEAD - dictionary += dictLength - length; /* use the tail of the dictionary */ -#endif - } - 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); - } - if (hash_head) hash_head = 0; /* to make compiler happy */ - return Z_OK; -} - -/* ========================================================================= */ -int ZEXPORT deflateReset (strm) - z_streamp strm; -{ - deflate_state *s; - - if (strm == Z_NULL || strm->state == Z_NULL || - strm->zalloc == Z_NULL || strm->zfree == Z_NULL) return Z_STREAM_ERROR; - - strm->total_in = strm->total_out = 0; - strm->msg = Z_NULL; /* use zfree if we ever allocate msg dynamically */ - strm->data_type = Z_UNKNOWN; - - s = (deflate_state *)strm->state; - s->pending = 0; - s->pending_out = s->pending_buf; - - if (s->noheader < 0) { - s->noheader = 0; /* was set to -1 by deflate(..., Z_FINISH); */ - } - s->status = s->noheader ? BUSY_STATE : INIT_STATE; - strm->adler = 1; - s->last_flush = Z_NO_FLUSH; - - _tr_init(s); - lm_init(s); - - return Z_OK; -} - -/* ========================================================================= */ -int ZEXPORT deflateParams(strm, level, strategy) - z_streamp strm; - int level; - int strategy; -{ - deflate_state *s; - compress_func func; - int err = Z_OK; - - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - s = strm->state; - - if (level == Z_DEFAULT_COMPRESSION) { - level = 6; - } - if (level < 0 || level > 9 || strategy < 0 || strategy > Z_HUFFMAN_ONLY) { - return Z_STREAM_ERROR; - } - func = configuration_table[s->level].func; - - if (func != configuration_table[level].func && strm->total_in != 0) { - /* Flush the last buffer: */ - err = deflate(strm, Z_PARTIAL_FLUSH); - } - if (s->level != level) { - s->level = level; - s->max_lazy_match = configuration_table[level].max_lazy; - s->good_match = configuration_table[level].good_length; - s->nice_match = configuration_table[level].nice_length; - s->max_chain_length = configuration_table[level].max_chain; - } - s->strategy = strategy; - return err; -} - -/* ========================================================================= - * Put a short in the pending buffer. The 16-bit value is put in MSB order. - * IN assertion: the stream state is correct and there is enough room in - * pending_buf. - */ -local void putShortMSB (s, b) - deflate_state *s; - uInt b; -{ - put_byte(s, (Byte)(b >> 8)); - put_byte(s, (Byte)(b & 0xff)); -} - -/* ========================================================================= - * Flush as much pending output as possible. All deflate() output goes - * through this function so some applications may wish to modify it - * to avoid allocating a large strm->next_out buffer and copying into it. - * (See also read_buf()). - */ -local void flush_pending(strm) - z_streamp strm; -{ - unsigned len = strm->state->pending; - - if (len > strm->avail_out) len = strm->avail_out; - if (len == 0) return; - - zmemcpy(strm->next_out, strm->state->pending_out, len); - strm->next_out += len; - strm->state->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; - } -} - -/* ========================================================================= */ -int ZEXPORT deflate (strm, flush) - z_streamp strm; - int flush; -{ - int old_flush; /* value of flush param for previous deflate call */ - deflate_state *s; - - if (strm == Z_NULL || strm->state == Z_NULL || - flush > Z_FINISH || flush < 0) { - return Z_STREAM_ERROR; - } - s = strm->state; - - if (strm->next_out == Z_NULL || - (strm->next_in == Z_NULL && strm->avail_in != 0) || - (s->status == FINISH_STATE && flush != Z_FINISH)) { - ERR_RETURN(strm, Z_STREAM_ERROR); - } - if (strm->avail_out == 0) ERR_RETURN(strm, Z_BUF_ERROR); - - s->strm = strm; /* just in case */ - old_flush = s->last_flush; - s->last_flush = flush; - - /* Write the zlib header */ - if (s->status == INIT_STATE) { - - uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8; - uInt level_flags = (s->level-1) >> 1; - - if (level_flags > 3) level_flags = 3; - header |= (level_flags << 6); - if (s->strstart != 0) header |= PRESET_DICT; - header += 31 - (header % 31); - - s->status = BUSY_STATE; - putShortMSB(s, header); - - /* Save the adler32 of the preset dictionary: */ - if (s->strstart != 0) { - putShortMSB(s, (uInt)(strm->adler >> 16)); - putShortMSB(s, (uInt)(strm->adler & 0xffff)); - } - strm->adler = 1L; - } - - /* Flush as much pending output as possible */ - if (s->pending != 0) { - flush_pending(strm); - if (strm->avail_out == 0) { - /* Since avail_out is 0, deflate will be called again with - * more output space, but possibly with both pending and - * avail_in equal to zero. There won't be anything to do, - * but this is not an error situation so make sure we - * return OK instead of BUF_ERROR at next call of deflate: - */ - s->last_flush = -1; - return Z_OK; - } - - /* Make sure there is something to do and avoid duplicate consecutive - * flushes. For repeated and useless calls with Z_FINISH, we keep - * returning Z_STREAM_END instead of Z_BUFF_ERROR. - */ - } else if (strm->avail_in == 0 && flush <= old_flush && - flush != Z_FINISH) { - ERR_RETURN(strm, Z_BUF_ERROR); - } - - /* User must not provide more input after the first FINISH: */ - if (s->status == FINISH_STATE && strm->avail_in != 0) { - ERR_RETURN(strm, Z_BUF_ERROR); - } - - /* Start a new block or continue the current one. - */ - if (strm->avail_in != 0 || s->lookahead != 0 || - (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) { - block_state bstate; - - bstate = (*(configuration_table[s->level].func))(s, flush); - - if (bstate == finish_started || bstate == finish_done) { - s->status = FINISH_STATE; - } - if (bstate == need_more || bstate == finish_started) { - if (strm->avail_out == 0) { - s->last_flush = -1; /* avoid BUF_ERROR next call, see above */ - } - return Z_OK; - /* If flush != Z_NO_FLUSH && avail_out == 0, the next call - * of deflate should use the same flush parameter to make sure - * that the flush is complete. So we don't have to output an - * empty block here, this will be done at next call. This also - * ensures that for a very small output buffer, we emit at most - * one empty block. - */ - } - if (bstate == block_done) { - if (flush == Z_PARTIAL_FLUSH) { - _tr_align(s); - } else { /* 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 */ - } - } - flush_pending(strm); - if (strm->avail_out == 0) { - s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */ - return Z_OK; - } - } - } - Assert(strm->avail_out > 0, "bug2"); - - if (flush != Z_FINISH) return Z_OK; - if (s->noheader) return Z_STREAM_END; - - /* Write the zlib trailer (adler32) */ - putShortMSB(s, (uInt)(strm->adler >> 16)); - putShortMSB(s, (uInt)(strm->adler & 0xffff)); - flush_pending(strm); - /* If avail_out is zero, the application will call deflate again - * to flush the rest. - */ - s->noheader = -1; /* write the trailer only once! */ - return s->pending != 0 ? Z_OK : Z_STREAM_END; -} - -/* ========================================================================= */ -int ZEXPORT deflateEnd (strm) - z_streamp strm; -{ - int status; - - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - - status = strm->state->status; - if (status != INIT_STATE && status != BUSY_STATE && - status != FINISH_STATE) { - return Z_STREAM_ERROR; - } - - /* Deallocate in reverse order of allocations: */ - TRY_FREE(strm, strm->state->pending_buf); - TRY_FREE(strm, strm->state->head); - TRY_FREE(strm, strm->state->prev); - TRY_FREE(strm, strm->state->window); - - ZFREE(strm, strm->state); - strm->state = Z_NULL; - - return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK; -} - -/* ========================================================================= - * Copy the source state to the destination state. - * To simplify the source, this is not supported for 16-bit MSDOS (which - * doesn't have enough memory anyway to duplicate compression states). - */ -int ZEXPORT deflateCopy (dest, source) - z_streamp dest; - z_streamp source; -{ -#ifdef MAXSEG_64K - return Z_STREAM_ERROR; -#else - deflate_state *ds; - deflate_state *ss; - ushf *overlay; - - - if (source == Z_NULL || dest == Z_NULL || source->state == Z_NULL) { - return Z_STREAM_ERROR; - } - - ss = source->state; - - *dest = *source; - - ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state)); - if (ds == Z_NULL) return Z_MEM_ERROR; - dest->state = (struct internal_state FAR *) ds; - *ds = *ss; - ds->strm = dest; - - ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte)); - ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos)); - ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos)); - overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2); - ds->pending_buf = (uchf *) overlay; - - if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL || - ds->pending_buf == Z_NULL) { - deflateEnd (dest); - return Z_MEM_ERROR; - } - /* 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(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size); - - ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf); - ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush); - ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize; - - ds->l_desc.dyn_tree = ds->dyn_ltree; - ds->d_desc.dyn_tree = ds->dyn_dtree; - ds->bl_desc.dyn_tree = ds->bl_tree; - - return Z_OK; -#endif -} - -/* =========================================================================== - * Read a new buffer from the current input stream, update the adler32 - * and total number of bytes read. All deflate() input goes through - * this function so some applications may wish to modify it to avoid - * allocating a large strm->next_in buffer and copying from it. - * (See also flush_pending()). - */ -local int read_buf(strm, buf, size) - z_streamp strm; - Bytef *buf; - unsigned size; -{ - unsigned len = strm->avail_in; - - if (len > size) len = size; - if (len == 0) return 0; - - strm->avail_in -= len; - - if (!strm->state->noheader) { - strm->adler = adler32(strm->adler, strm->next_in, len); - } - zmemcpy(buf, strm->next_in, len); - strm->next_in += len; - strm->total_in += len; - - return (int)len; -} - -/* =========================================================================== - * Initialize the "longest match" routines for a new zlib stream - */ -local void lm_init (s) - deflate_state *s; -{ - s->window_size = (ulg)2L*s->w_size; - - CLEAR_HASH(s); - - /* Set the default configuration parameters: - */ - s->max_lazy_match = configuration_table[s->level].max_lazy; - s->good_match = configuration_table[s->level].good_length; - s->nice_match = configuration_table[s->level].nice_length; - s->max_chain_length = configuration_table[s->level].max_chain; - - s->strstart = 0; - s->block_start = 0L; - s->lookahead = 0; - s->match_length = s->prev_length = MIN_MATCH-1; - s->match_available = 0; - s->ins_h = 0; -#ifdef ASMV - match_init(); /* initialize the asm code */ -#endif -} - -/* =========================================================================== - * Set match_start to the longest match starting at the given string and - * return its length. Matches shorter or equal to prev_length are discarded, - * in which case the result is equal to prev_length and match_start is - * garbage. - * IN assertions: cur_match is the head of the hash chain for the current - * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 - * OUT assertion: the match length is not greater than s->lookahead. - */ -#ifndef ASMV -/* For 80x86 and 680x0, an optimized version will be provided in match.asm or - * match.S. The code will be functionally equivalent. - */ -#ifndef FASTEST -local uInt longest_match(s, cur_match) - deflate_state *s; - IPos cur_match; /* current match */ -{ - unsigned chain_length = s->max_chain_length;/* max hash chain length */ - register Bytef *scan = s->window + s->strstart; /* current string */ - register Bytef *match; /* matched string */ - register int len; /* length of current match */ - int best_len = s->prev_length; /* best match length so far */ - int nice_match = s->nice_match; /* stop if match long enough */ - IPos limit = s->strstart > (IPos)MAX_DIST(s) ? - s->strstart - (IPos)MAX_DIST(s) : NIL; - /* Stop when cur_match becomes <= limit. To simplify the code, - * we prevent matches with the string of window index 0. - */ - Posf *prev = s->prev; - uInt wmask = s->w_mask; - -#ifdef UNALIGNED_OK - /* Compare two bytes at a time. Note: this is not always beneficial. - * Try with and without -DUNALIGNED_OK to check. - */ - register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1; - register ush scan_start = *(ushf*)scan; - register ush scan_end = *(ushf*)(scan+best_len-1); -#else - register Bytef *strend = s->window + s->strstart + MAX_MATCH; - register Byte scan_end1 = scan[best_len-1]; - register Byte scan_end = scan[best_len]; -#endif - - /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. - * It is easy to get rid of this optimization if necessary. - */ - Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); - - /* Do not waste too much time if we already have a good match: */ - if (s->prev_length >= s->good_match) { - chain_length >>= 2; - } - /* Do not look for matches beyond the end of the input. This is necessary - * to make deflate deterministic. - */ - if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; - - Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); - - do { - Assert(cur_match < s->strstart, "no future"); - match = s->window + cur_match; - - /* Skip to next match if the match length cannot increase - * or if the match length is less than 2: - */ -#if (defined(UNALIGNED_OK) && MAX_MATCH == 258) - /* This code assumes sizeof(unsigned short) == 2. Do not use - * UNALIGNED_OK if your compiler uses a different size. - */ - if (*(ushf*)(match+best_len-1) != scan_end || - *(ushf*)match != scan_start) continue; - - /* It is not necessary to compare scan[2] and match[2] since they are - * always equal when the other bytes match, given that the hash keys - * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at - * strstart+3, +5, ... up to strstart+257. We check for insufficient - * lookahead only every 4th comparison; the 128th check will be made - * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is - * necessary to put more guard bytes at the end of the window, or - * to check more often for insufficient lookahead. - */ - Assert(scan[2] == match[2], "scan[2]?"); - scan++, match++; - do { - } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) && - *(ushf*)(scan+=2) == *(ushf*)(match+=2) && - *(ushf*)(scan+=2) == *(ushf*)(match+=2) && - *(ushf*)(scan+=2) == *(ushf*)(match+=2) && - scan < strend); - /* The funny "do {}" generates better code on most compilers */ - - /* Here, scan <= window+strstart+257 */ - Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); - if (*scan == *match) scan++; - - len = (MAX_MATCH - 1) - (int)(strend-scan); - scan = strend - (MAX_MATCH-1); - -#else /* UNALIGNED_OK */ - - if (match[best_len] != scan_end || - match[best_len-1] != scan_end1 || - *match != *scan || - *++match != scan[1]) continue; - - /* The check at best_len-1 can be removed because it will be made - * again later. (This heuristic is not always a win.) - * It is not necessary to compare scan[2] and match[2] since they - * are always equal when the other bytes match, given that - * the hash keys are equal and that HASH_BITS >= 8. - */ - scan += 2, match++; - Assert(*scan == *match, "match[2]?"); - - /* We check for insufficient lookahead only every 8th comparison; - * the 256th check will be made at strstart+258. - */ - do { - } while (*++scan == *++match && *++scan == *++match && - *++scan == *++match && *++scan == *++match && - *++scan == *++match && *++scan == *++match && - *++scan == *++match && *++scan == *++match && - scan < strend); - - Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); - - len = MAX_MATCH - (int)(strend - scan); - scan = strend - MAX_MATCH; - -#endif /* UNALIGNED_OK */ - - if (len > best_len) { - s->match_start = cur_match; - best_len = len; - if (len >= nice_match) break; -#ifdef UNALIGNED_OK - scan_end = *(ushf*)(scan+best_len-1); -#else - scan_end1 = scan[best_len-1]; - scan_end = scan[best_len]; -#endif - } - } while ((cur_match = prev[cur_match & wmask]) > limit - && --chain_length != 0); - - if ((uInt)best_len <= s->lookahead) return (uInt)best_len; - return s->lookahead; -} - -#else /* FASTEST */ -/* --------------------------------------------------------------------------- - * Optimized version for level == 1 only - */ -local uInt longest_match(s, cur_match) - deflate_state *s; - IPos cur_match; /* current match */ -{ - register Bytef *scan = s->window + s->strstart; /* current string */ - register Bytef *match; /* matched string */ - register int len; /* length of current match */ - register Bytef *strend = s->window + s->strstart + MAX_MATCH; - - /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. - * It is easy to get rid of this optimization if necessary. - */ - Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); - - Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); - - Assert(cur_match < s->strstart, "no future"); - - match = s->window + cur_match; - - /* Return failure if the match length is less than 2: - */ - if (match[0] != scan[0] || match[1] != scan[1]) return MIN_MATCH-1; - - /* The check at best_len-1 can be removed because it will be made - * again later. (This heuristic is not always a win.) - * It is not necessary to compare scan[2] and match[2] since they - * are always equal when the other bytes match, given that - * the hash keys are equal and that HASH_BITS >= 8. - */ - scan += 2, match += 2; - Assert(*scan == *match, "match[2]?"); - - /* We check for insufficient lookahead only every 8th comparison; - * the 256th check will be made at strstart+258. - */ - do { - } while (*++scan == *++match && *++scan == *++match && - *++scan == *++match && *++scan == *++match && - *++scan == *++match && *++scan == *++match && - *++scan == *++match && *++scan == *++match && - scan < strend); - - Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); - - len = MAX_MATCH - (int)(strend - scan); - - if (len < MIN_MATCH) return MIN_MATCH - 1; - - s->match_start = cur_match; - return len <= s->lookahead ? len : s->lookahead; -} -#endif /* FASTEST */ -#endif /* ASMV */ - -#ifdef DEBUG -/* =========================================================================== - * Check that the match at match_start is indeed a match. - */ -local void check_match(s, start, match, length) - deflate_state *s; - IPos start, match; - int length; -{ - /* check that the match is indeed a match */ - if (zmemcmp(s->window + match, - s->window + start, length) != EQUAL) { - fprintf(stderr, " start %u, match %u, length %d\n", - start, match, length); - do { - fprintf(stderr, "%c%c", s->window[match++], s->window[start++]); - } while (--length != 0); - z_error("invalid match"); - } - if (z_verbose > 1) { - fprintf(stderr,"\\[%d,%d]", start-match, length); - do { putc(s->window[start++], stderr); } while (--length != 0); - } -} -#else -# define check_match(s, start, match, length) -#endif - -/* =========================================================================== - * Fill the window when the lookahead becomes insufficient. - * Updates strstart and lookahead. - * - * IN assertion: lookahead < MIN_LOOKAHEAD - * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD - * At least one byte has been read, or avail_in == 0; reads are - * performed for at least two bytes (required for the zip translate_eol - * option -- not supported here). - */ -local void fill_window(s) - deflate_state *s; -{ - register unsigned n, m; - register Posf *p; - unsigned more; /* Amount of free space at the end of the window. */ - uInt wsize = s->w_size; - - do { - more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart); - - /* Deal with !@#$% 64K limit: */ - if (more == 0 && s->strstart == 0 && s->lookahead == 0) { - more = wsize; - - } else if (more == (unsigned)(-1)) { - /* Very unlikely, but possible on 16 bit machine if strstart == 0 - * and lookahead == 1 (input done one byte at time) - */ - more--; - - /* If the window is almost full and there is insufficient lookahead, - * move the upper half to the lower one to make room in the upper half. - */ - } else if (s->strstart >= wsize+MAX_DIST(s)) { - - zmemcpy(s->window, s->window+wsize, (unsigned)wsize); - s->match_start -= wsize; - s->strstart -= wsize; /* we now have strstart >= MAX_DIST */ - s->block_start -= (long) wsize; - - /* Slide the hash table (could be avoided with 32 bit values - at the expense of memory usage). We slide even when level == 0 - to keep the hash table consistent if we switch back to level > 0 - later. (Using level 0 permanently is not an optimal usage of - zlib, so we don't care about this pathological case.) - */ - n = s->hash_size; - p = &s->head[n]; - do { - m = *--p; - *p = (Pos)(m >= wsize ? m-wsize : NIL); - } while (--n); - - n = wsize; -#ifndef FASTEST - p = &s->prev[n]; - do { - m = *--p; - *p = (Pos)(m >= wsize ? m-wsize : NIL); - /* If n is not on any hash chain, prev[n] is garbage but - * its value will never be used. - */ - } while (--n); -#endif - more += wsize; - } - if (s->strm->avail_in == 0) return; - - /* If there was no sliding: - * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && - * more == window_size - lookahead - strstart - * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) - * => more >= window_size - 2*WSIZE + 2 - * In the BIG_MEM or MMAP case (not yet supported), - * window_size == input_size + MIN_LOOKAHEAD && - * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. - * Otherwise, window_size == 2*WSIZE so more >= 2. - * If there was sliding, more >= WSIZE. So in all cases, more >= 2. - */ - Assert(more >= 2, "more < 2"); - - n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more); - 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 MIN_MATCH != 3 - Call UPDATE_HASH() MIN_MATCH-3 more times -#endif - } - /* 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); -} - -/* =========================================================================== - * 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) { \ - _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)); \ - 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; \ -} - -/* =========================================================================== - * Copy without compression as much as possible from the input stream, return - * the current block state. - * This function does not insert new strings in the dictionary since - * uncompressible data is probably not useful. This function is used - * only for the level=0 compression option. - * NOTE: this function should be optimized to avoid extra copying from - * window to pending_buf. - */ -local block_state deflate_stored(s, flush) - deflate_state *s; - int flush; -{ - /* Stored blocks are limited to 0xffff bytes, pending_buf is limited - * to pending_buf_size, and each stored block has a 5 byte header: - */ - ulg max_block_size = 0xffff; - ulg max_start; - - if (max_block_size > s->pending_buf_size - 5) { - max_block_size = s->pending_buf_size - 5; - } - - /* Copy as much as possible from input to output: */ - for (;;) { - /* Fill the window as much as possible: */ - if (s->lookahead <= 1) { - - Assert(s->strstart < s->w_size+MAX_DIST(s) || - s->block_start >= (long)s->w_size, "slide too late"); - - fill_window(s); - if (s->lookahead == 0 && flush == Z_NO_FLUSH) return need_more; - - if (s->lookahead == 0) break; /* flush the current block */ - } - Assert(s->block_start >= 0L, "block gone"); - - s->strstart += s->lookahead; - s->lookahead = 0; - - /* Emit a stored block if pending_buf will be full: */ - max_start = s->block_start + max_block_size; - if (s->strstart == 0 || (ulg)s->strstart >= max_start) { - /* strstart == 0 is possible when wraparound on 16-bit machine */ - s->lookahead = (uInt)(s->strstart - max_start); - s->strstart = (uInt)max_start; - FLUSH_BLOCK(s, 0); - } - /* Flush if we may have to slide, otherwise block_start may become - * negative and the data will be gone: - */ - if (s->strstart - (uInt)s->block_start >= MAX_DIST(s)) { - FLUSH_BLOCK(s, 0); - } - } - FLUSH_BLOCK(s, flush == Z_FINISH); - return flush == Z_FINISH ? finish_done : block_done; -} - -/* =========================================================================== - * Compress as much as possible from the input stream, return the current - * block state. - * This function does not perform lazy evaluation of matches and inserts - * new strings in the dictionary only for unmatched strings or for short - * matches. It is used only for the fast compression options. - */ -local block_state deflate_fast(s, flush) - deflate_state *s; - int flush; -{ - IPos hash_head = NIL; /* head of the hash chain */ - int bflush; /* set if current block must be flushed */ - - for (;;) { - /* Make sure that we always have enough lookahead, except - * at the end of the input file. We need MAX_MATCH bytes - * for the next match, plus MIN_MATCH bytes to insert the - * string following the next match. - */ - if (s->lookahead < MIN_LOOKAHEAD) { - fill_window(s); - if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { - return need_more; - } - if (s->lookahead == 0) break; /* flush the current block */ - } - - /* Insert the string window[strstart .. strstart+2] in the - * dictionary, and set hash_head to the head of the hash chain: - */ - if (s->lookahead >= MIN_MATCH) { - INSERT_STRING(s, s->strstart, hash_head); - } - - /* Find the longest match, discarding those <= prev_length. - * At this point we have always match_length < MIN_MATCH - */ - if (hash_head != NIL && s->strstart - hash_head <= MAX_DIST(s)) { - /* To simplify the code, we prevent matches with the string - * 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->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); - - _tr_tally_dist(s, s->strstart - s->match_start, - s->match_length - MIN_MATCH, bflush); - - s->lookahead -= s->match_length; - - /* Insert new strings in the hash table only if the match length - * is not too large. This saves time but degrades compression. - */ -#ifndef FASTEST - if (s->match_length <= s->max_insert_length && - s->lookahead >= MIN_MATCH) { - s->match_length--; /* string at strstart already in hash table */ - do { - s->strstart++; - INSERT_STRING(s, s->strstart, hash_head); - /* strstart never exceeds WSIZE-MAX_MATCH, so there are - * always MIN_MATCH bytes ahead. - */ - } while (--s->match_length != 0); - s->strstart++; - } else -#endif - { - s->strstart += s->match_length; - s->match_length = 0; - s->ins_h = s->window[s->strstart]; - UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); -#if MIN_MATCH != 3 - Call UPDATE_HASH() MIN_MATCH-3 more times -#endif - /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not - * matter since it will be recomputed at next deflate call. - */ - } - } else { - /* No match, output a literal byte */ - 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); - } - FLUSH_BLOCK(s, flush == Z_FINISH); - return flush == Z_FINISH ? finish_done : block_done; -} - -/* =========================================================================== - * Same as above, but achieves better compression. We use a lazy - * evaluation for matches: a match is finally adopted only if there is - * no better match at the next window position. - */ -local block_state deflate_slow(s, flush) - deflate_state *s; - int flush; -{ - IPos hash_head = NIL; /* head of hash chain */ - int bflush; /* set if current block must be flushed */ - - /* Process the input block. */ - for (;;) { - /* Make sure that we always have enough lookahead, except - * at the end of the input file. We need MAX_MATCH bytes - * for the next match, plus MIN_MATCH bytes to insert the - * string following the next match. - */ - if (s->lookahead < MIN_LOOKAHEAD) { - fill_window(s); - if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { - return need_more; - } - if (s->lookahead == 0) break; /* flush the current block */ - } - - /* Insert the string window[strstart .. strstart+2] in the - * dictionary, and set hash_head to the head of the hash chain: - */ - if (s->lookahead >= MIN_MATCH) { - INSERT_STRING(s, s->strstart, hash_head); - } - - /* Find the longest match, discarding those <= prev_length. - */ - s->prev_length = s->match_length, s->prev_match = s->match_start; - s->match_length = MIN_MATCH-1; - - if (hash_head != NIL && s->prev_length < s->max_lazy_match && - s->strstart - hash_head <= MAX_DIST(s)) { - /* To simplify the code, we prevent matches with the string - * 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->match_length = longest_match (s, hash_head); - } - /* longest_match() sets match_start */ - - if (s->match_length <= 5 && (s->strategy == Z_FILTERED || - (s->match_length == MIN_MATCH && - s->strstart - s->match_start > TOO_FAR))) { - - /* If prev_match is also MIN_MATCH, match_start is garbage - * but we will ignore the current match anyway. - */ - s->match_length = MIN_MATCH-1; - } - } - /* If there was a match at the previous step and the current - * match is not better, output the previous match: - */ - if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) { - uInt max_insert = s->strstart + s->lookahead - MIN_MATCH; - /* Do not insert strings in hash table beyond this. */ - - check_match(s, s->strstart-1, s->prev_match, s->prev_length); - - _tr_tally_dist(s, s->strstart -1 - s->prev_match, - s->prev_length - MIN_MATCH, bflush); - - /* Insert in hash table all strings up to the end of the match. - * strstart-1 and strstart are already inserted. If there is not - * enough lookahead, the last two strings are not inserted in - * the hash table. - */ - s->lookahead -= s->prev_length-1; - s->prev_length -= 2; - do { - if (++s->strstart <= max_insert) { - INSERT_STRING(s, s->strstart, hash_head); - } - } while (--s->prev_length != 0); - s->match_available = 0; - s->match_length = MIN_MATCH-1; - s->strstart++; - - if (bflush) FLUSH_BLOCK(s, 0); - - } else if (s->match_available) { - /* If there was no match at the previous position, output a - * single literal. If there was a match but the current match - * is longer, truncate the previous match to a single literal. - */ - Tracevv((stderr,"%c", s->window[s->strstart-1])); - _tr_tally_lit(s, s->window[s->strstart-1], bflush); - if (bflush) { - FLUSH_BLOCK_ONLY(s, 0); - } - s->strstart++; - s->lookahead--; - if (s->strm->avail_out == 0) return need_more; - } else { - /* There is no previous match to compare with, wait for - * the next step to decide. - */ - s->match_available = 1; - s->strstart++; - s->lookahead--; - } - } - Assert (flush != Z_NO_FLUSH, "no flush?"); - if (s->match_available) { - Tracevv((stderr,"%c", s->window[s->strstart-1])); - _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; -} diff --git a/zlib/deflate.h b/zlib/deflate.h deleted file mode 100644 index 962676da..00000000 --- a/zlib/deflate.h +++ /dev/null @@ -1,318 +0,0 @@ -/* deflate.h -- internal compression state - * Copyright (C) 1995-1998 Jean-loup Gailly - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* 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. - */ - -/* @(#) $Id$ */ - -#ifndef _DEFLATE_H -#define _DEFLATE_H - -#include "zutil.h" - -/* =========================================================================== - * Internal compression state. - */ - -#define LENGTH_CODES 29 -/* number of length codes, not counting the special END_BLOCK code */ - -#define LITERALS 256 -/* number of literal bytes 0..255 */ - -#define L_CODES (LITERALS+1+LENGTH_CODES) -/* number of Literal or Length codes, including the END_BLOCK code */ - -#define D_CODES 30 -/* number of distance codes */ - -#define BL_CODES 19 -/* number of codes used to transfer the bit lengths */ - -#define HEAP_SIZE (2*L_CODES+1) -/* maximum heap size */ - -#define MAX_BITS 15 -/* All codes must not exceed MAX_BITS bits */ - -#define INIT_STATE 42 -#define BUSY_STATE 113 -#define FINISH_STATE 666 -/* Stream status */ - - -/* Data structure describing a single value and its code string. */ -typedef struct ct_data_s { - union { - ush freq; /* frequency count */ - ush code; /* bit string */ - } fc; - union { - ush dad; /* father node in Huffman tree */ - ush len; /* length of bit string */ - } dl; -} FAR ct_data; - -#define Freq fc.freq -#define Code fc.code -#define Dad dl.dad -#define Len dl.len - -typedef struct static_tree_desc_s static_tree_desc; - -typedef struct tree_desc_s { - ct_data *dyn_tree; /* the dynamic tree */ - int max_code; /* largest code with non zero frequency */ - static_tree_desc *stat_desc; /* the corresponding static tree */ -} FAR tree_desc; - -typedef ush Pos; -typedef Pos FAR Posf; -typedef unsigned IPos; - -/* A Pos is an index in the character window. We use short instead of int to - * save space in the various tables. IPos is used only for parameter passing. - */ - -typedef struct internal_state { - z_streamp strm; /* pointer back to this zlib stream */ - int status; /* as the name implies */ - Bytef *pending_buf; /* output still pending */ - ulg pending_buf_size; /* size of pending_buf */ - Bytef *pending_out; /* next pending byte to output to the stream */ - int pending; /* nb of bytes in the pending buffer */ - int noheader; /* suppress zlib header and adler32 */ - Byte data_type; /* UNKNOWN, BINARY or ASCII */ - Byte method; /* STORED (for zip only) or DEFLATED */ - int last_flush; /* value of flush param for previous deflate call */ - - /* used by deflate.c: */ - - uInt w_size; /* LZ77 window size (32K by default) */ - uInt w_bits; /* log2(w_size) (8..16) */ - uInt w_mask; /* w_size - 1 */ - - Bytef *window; - /* Sliding window. Input bytes are read into the second half of the window, - * and move to the first half later to keep a dictionary of at least wSize - * bytes. With this organization, matches are limited to a distance of - * wSize-MAX_MATCH bytes, but this ensures that IO is always - * performed with a length multiple of the block size. Also, it limits - * the window size to 64K, which is quite useful on MSDOS. - * To do: use the user input buffer as sliding window. - */ - - ulg window_size; - /* Actual size of window: 2*wSize, except when the user input buffer - * is directly used as sliding window. - */ - - Posf *prev; - /* Link to older string with same hash index. To limit the size of this - * array to 64K, this link is maintained only for the last 32K strings. - * An index in this array is thus a window index modulo 32K. - */ - - Posf *head; /* Heads of the hash chains or NIL. */ - - uInt ins_h; /* hash index of string to be inserted */ - uInt hash_size; /* number of elements in hash table */ - uInt hash_bits; /* log2(hash_size) */ - uInt hash_mask; /* hash_size-1 */ - - uInt hash_shift; - /* Number of bits by which ins_h must be shifted at each input - * step. It must be such that after MIN_MATCH steps, the oldest - * byte no longer takes part in the hash key, that is: - * hash_shift * MIN_MATCH >= hash_bits - */ - - long block_start; - /* Window position at the beginning of the current output block. Gets - * negative when the window is moved backwards. - */ - - uInt match_length; /* length of best match */ - IPos prev_match; /* previous match */ - int match_available; /* set if previous match exists */ - uInt strstart; /* start of string to insert */ - uInt match_start; /* start of matching string */ - uInt lookahead; /* number of valid bytes ahead in window */ - - uInt prev_length; - /* Length of the best match at previous step. Matches not greater than this - * are discarded. This is used in the lazy match evaluation. - */ - - uInt max_chain_length; - /* To speed up deflation, hash chains are never searched beyond this - * length. A higher limit improves compression ratio but degrades the - * speed. - */ - - uInt max_lazy_match; - /* Attempt to find a better match only when the current match is strictly - * smaller than this value. This mechanism is used only for compression - * levels >= 4. - */ -# define max_insert_length max_lazy_match - /* Insert new strings in the hash table only if the match length is not - * greater than this length. This saves time but degrades compression. - * max_insert_length is used only for compression levels <= 3. - */ - - int level; /* compression level (1..9) */ - int strategy; /* favor or force Huffman coding*/ - - uInt good_match; - /* Use a faster search when the previous match is longer than this */ - - 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 */ - 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 */ - - struct tree_desc_s l_desc; /* desc. for literal tree */ - struct tree_desc_s d_desc; /* desc. for distance tree */ - struct tree_desc_s bl_desc; /* desc. for bit length tree */ - - ush bl_count[MAX_BITS+1]; - /* number of codes at each bit length for an optimal tree */ - - int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */ - int heap_len; /* number of elements in the heap */ - int heap_max; /* element of largest frequency */ - /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. - * The same heap array is used to build all trees. - */ - - uch depth[2*L_CODES+1]; - /* Depth of each subtree used as tie breaker for trees of equal frequency - */ - - uchf *l_buf; /* buffer for literals or lengths */ - - uInt lit_bufsize; - /* Size of match buffer for literals/lengths. There are 4 reasons for - * limiting lit_bufsize to 64K: - * - frequencies can be kept in 16 bit counters - * - if compression is not successful for the first block, all input - * data is still in the window so we can still emit a stored block even - * when input comes from standard input. (This can also be done for - * all blocks if lit_bufsize is not greater than 32K.) - * - if compression is not successful for a file smaller than 64K, we can - * even emit a stored file instead of a stored block (saving 5 bytes). - * This is applicable only for zip (not gzip or zlib). - * - creating new Huffman trees less frequently may not provide fast - * adaptation to changes in the input data statistics. (Take for - * example a binary file with poorly compressible code followed by - * a highly compressible string table.) Smaller buffer sizes give - * fast adaptation but have of course the overhead of transmitting - * trees more frequently. - * - I can't count above 4 - */ - - uInt last_lit; /* running index in l_buf */ - - ushf *d_buf; - /* Buffer for distances. To simplify the code, d_buf and l_buf have - * the same number of elements. To use different lengths, an extra flag - * array would be necessary. - */ - - 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 */ - -#ifdef DEBUG - ulg compressed_len; /* total bit length of compressed file mod 2^32 */ - ulg bits_sent; /* bit length of compressed data sent mod 2^32 */ -#endif - - ush bi_buf; - /* Output buffer. bits are inserted starting at the bottom (least - * significant bits). - */ - int bi_valid; - /* Number of valid bits in bi_buf. All bits above the last valid bit - * are always zero. - */ - -} FAR deflate_state; - -/* Output a byte on the stream. - * IN assertion: there is enough room in pending_buf. - */ -#define put_byte(s, c) {s->pending_buf[s->pending++] = (c);} - - -#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. - */ - -#define MAX_DIST(s) ((s)->w_size-MIN_LOOKAHEAD) -/* In order to simplify the code, particularly on 16 bit machines, match - * distances are limited to MAX_DIST instead of WSIZE. - */ - - /* 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)); - -#define d_code(dist) \ - ((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)]) -/* Mapping from a distance to a distance code. dist is the distance - 1 and - * must not have side effects. _dist_code[256] and _dist_code[257] are never - * used. - */ - -#ifndef DEBUG -/* Inline versions of _tr_tally for speed: */ - -#if defined(GEN_TREES_H) || !defined(STDC) - extern uch _length_code[]; - extern uch _dist_code[]; -#else - extern const uch _length_code[]; - extern const uch _dist_code[]; -#endif - -# define _tr_tally_lit(s, c, flush) \ - { uch cc = (c); \ - s->d_buf[s->last_lit] = 0; \ - s->l_buf[s->last_lit++] = cc; \ - s->dyn_ltree[cc].Freq++; \ - flush = (s->last_lit == s->lit_bufsize-1); \ - } -# define _tr_tally_dist(s, distance, length, flush) \ - { uch len = (length); \ - ush dist = (distance); \ - s->d_buf[s->last_lit] = dist; \ - s->l_buf[s->last_lit++] = len; \ - dist--; \ - s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \ - s->dyn_dtree[d_code(dist)].Freq++; \ - flush = (s->last_lit == s->lit_bufsize-1); \ - } -#else -# define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c) -# define _tr_tally_dist(s, distance, length, flush) \ - flush = _tr_tally(s, distance, length) -#endif - -#endif diff --git a/zlib/descrip.mms b/zlib/descrip.mms deleted file mode 100644 index 9d364598..00000000 --- a/zlib/descrip.mms +++ /dev/null @@ -1,48 +0,0 @@ -# descrip.mms: MMS description file for building zlib on VMS -# written by Martin P.J. Zinser - -cc_defs = -c_deb = - -.ifdef __DECC__ -pref = /prefix=all -.endif - -OBJS = adler32.obj, compress.obj, crc32.obj, gzio.obj, uncompr.obj,\ - deflate.obj, trees.obj, zutil.obj, inflate.obj, infblock.obj,\ - inftrees.obj, infcodes.obj, infutil.obj, inffast.obj - -CFLAGS= $(C_DEB) $(CC_DEFS) $(PREF) - -all : example.exe minigzip.exe - @ write sys$output " Example applications available" -libz.olb : libz.olb($(OBJS)) - @ write sys$output " libz available" - -example.exe : example.obj libz.olb - link example,libz.olb/lib - -minigzip.exe : minigzip.obj libz.olb - link minigzip,libz.olb/lib,x11vms:xvmsutils.olb/lib - -clean : - delete *.obj;*,libz.olb;* - - -# Other dependencies. -adler32.obj : zutil.h zlib.h zconf.h -compress.obj : zlib.h zconf.h -crc32.obj : zutil.h zlib.h zconf.h -deflate.obj : deflate.h zutil.h zlib.h zconf.h -example.obj : zlib.h zconf.h -gzio.obj : zutil.h zlib.h zconf.h -infblock.obj : zutil.h zlib.h zconf.h infblock.h inftrees.h infcodes.h infutil.h -infcodes.obj : zutil.h zlib.h zconf.h inftrees.h infutil.h infcodes.h inffast.h -inffast.obj : zutil.h zlib.h zconf.h inftrees.h infutil.h inffast.h -inflate.obj : zutil.h zlib.h zconf.h infblock.h -inftrees.obj : zutil.h zlib.h zconf.h inftrees.h -infutil.obj : zutil.h zlib.h zconf.h inftrees.h infutil.h -minigzip.obj : zlib.h zconf.h -trees.obj : deflate.h zutil.h zlib.h zconf.h -uncompr.obj : zlib.h zconf.h -zutil.obj : zutil.h zlib.h zconf.h diff --git a/zlib/example.c b/zlib/example.c deleted file mode 100644 index 8307c841..00000000 --- a/zlib/example.c +++ /dev/null @@ -1,556 +0,0 @@ -/* example.c -- usage example of the zlib compression library - * Copyright (C) 1995-1998 Jean-loup Gailly. - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* @(#) $Id$ */ - -#include -#include "zlib.h" - -#ifdef STDC -# include -# include -#else - extern void exit OF((int)); -#endif - -#if defined(VMS) || defined(RISCOS) -# define TESTFILE "foo-gz" -#else -# define TESTFILE "foo.gz" -#endif - -#define CHECK_ERR(err, msg) { \ - if (err != Z_OK) { \ - fprintf(stderr, "%s error: %d\n", msg, err); \ - exit(1); \ - } \ -} - -const char hello[] = "hello, hello!"; -/* "hello world" would be more standard, but the repeated "hello" - * stresses the compression code better, sorry... - */ - -const char dictionary[] = "hello"; -uLong dictId; /* Adler32 value of the dictionary */ - -void test_compress OF((Byte *compr, uLong comprLen, - Byte *uncompr, uLong uncomprLen)); -void test_gzio OF((const char *out, const char *in, - Byte *uncompr, int uncomprLen)); -void test_deflate OF((Byte *compr, uLong comprLen)); -void test_inflate OF((Byte *compr, uLong comprLen, - Byte *uncompr, uLong uncomprLen)); -void test_large_deflate OF((Byte *compr, uLong comprLen, - Byte *uncompr, uLong uncomprLen)); -void test_large_inflate OF((Byte *compr, uLong comprLen, - Byte *uncompr, uLong uncomprLen)); -void test_flush OF((Byte *compr, uLong *comprLen)); -void test_sync OF((Byte *compr, uLong comprLen, - Byte *uncompr, uLong uncomprLen)); -void test_dict_deflate OF((Byte *compr, uLong comprLen)); -void test_dict_inflate OF((Byte *compr, uLong comprLen, - Byte *uncompr, uLong uncomprLen)); -int main OF((int argc, char *argv[])); - -/* =========================================================================== - * Test compress() and uncompress() - */ -void test_compress(compr, comprLen, uncompr, uncomprLen) - Byte *compr, *uncompr; - uLong comprLen, uncomprLen; -{ - int err; - uLong len = strlen(hello)+1; - - err = compress(compr, &comprLen, (const Bytef*)hello, len); - CHECK_ERR(err, "compress"); - - strcpy((char*)uncompr, "garbage"); - - err = uncompress(uncompr, &uncomprLen, compr, comprLen); - CHECK_ERR(err, "uncompress"); - - if (strcmp((char*)uncompr, hello)) { - fprintf(stderr, "bad uncompress\n"); - exit(1); - } else { - printf("uncompress(): %s\n", (char *)uncompr); - } -} - -/* =========================================================================== - * Test read/write of .gz files - */ -void test_gzio(out, in, uncompr, uncomprLen) - const char *out; /* compressed output file */ - const char *in; /* compressed input file */ - Byte *uncompr; - int uncomprLen; -{ - int err; - int len = strlen(hello)+1; - gzFile file; - z_off_t pos; - - file = gzopen(out, "wb"); - if (file == NULL) { - fprintf(stderr, "gzopen error\n"); - exit(1); - } - gzputc(file, 'h'); - if (gzputs(file, "ello") != 4) { - fprintf(stderr, "gzputs err: %s\n", gzerror(file, &err)); - exit(1); - } - if (gzprintf(file, ", %s!", "hello") != 8) { - fprintf(stderr, "gzprintf err: %s\n", gzerror(file, &err)); - exit(1); - } - gzseek(file, 1L, SEEK_CUR); /* add one zero byte */ - gzclose(file); - - file = gzopen(in, "rb"); - if (file == NULL) { - fprintf(stderr, "gzopen error\n"); - } - strcpy((char*)uncompr, "garbage"); - - uncomprLen = gzread(file, uncompr, (unsigned)uncomprLen); - if (uncomprLen != len) { - fprintf(stderr, "gzread err: %s\n", gzerror(file, &err)); - exit(1); - } - if (strcmp((char*)uncompr, hello)) { - fprintf(stderr, "bad gzread: %s\n", (char*)uncompr); - exit(1); - } else { - printf("gzread(): %s\n", (char *)uncompr); - } - - pos = gzseek(file, -8L, SEEK_CUR); - if (pos != 6 || gztell(file) != pos) { - fprintf(stderr, "gzseek error, pos=%ld, gztell=%ld\n", - (long)pos, (long)gztell(file)); - exit(1); - } - - if (gzgetc(file) != ' ') { - fprintf(stderr, "gzgetc error\n"); - exit(1); - } - - gzgets(file, (char*)uncompr, uncomprLen); - uncomprLen = strlen((char*)uncompr); - if (uncomprLen != 6) { /* "hello!" */ - fprintf(stderr, "gzgets err after gzseek: %s\n", gzerror(file, &err)); - exit(1); - } - if (strcmp((char*)uncompr, hello+7)) { - fprintf(stderr, "bad gzgets after gzseek\n"); - exit(1); - } else { - printf("gzgets() after gzseek: %s\n", (char *)uncompr); - } - - gzclose(file); -} - -/* =========================================================================== - * Test deflate() with small buffers - */ -void test_deflate(compr, comprLen) - Byte *compr; - uLong comprLen; -{ - z_stream c_stream; /* compression stream */ - int err; - int len = strlen(hello)+1; - - c_stream.zalloc = (alloc_func)0; - c_stream.zfree = (free_func)0; - c_stream.opaque = (voidpf)0; - - err = deflateInit(&c_stream, Z_DEFAULT_COMPRESSION); - CHECK_ERR(err, "deflateInit"); - - c_stream.next_in = (Bytef*)hello; - c_stream.next_out = compr; - - while (c_stream.total_in != (uLong)len && c_stream.total_out < comprLen) { - c_stream.avail_in = c_stream.avail_out = 1; /* force small buffers */ - err = deflate(&c_stream, Z_NO_FLUSH); - CHECK_ERR(err, "deflate"); - } - /* Finish the stream, still forcing small buffers: */ - for (;;) { - c_stream.avail_out = 1; - err = deflate(&c_stream, Z_FINISH); - if (err == Z_STREAM_END) break; - CHECK_ERR(err, "deflate"); - } - - err = deflateEnd(&c_stream); - CHECK_ERR(err, "deflateEnd"); -} - -/* =========================================================================== - * Test inflate() with small buffers - */ -void test_inflate(compr, comprLen, uncompr, uncomprLen) - Byte *compr, *uncompr; - uLong comprLen, uncomprLen; -{ - int err; - z_stream d_stream; /* decompression stream */ - - strcpy((char*)uncompr, "garbage"); - - d_stream.zalloc = (alloc_func)0; - d_stream.zfree = (free_func)0; - d_stream.opaque = (voidpf)0; - - d_stream.next_in = compr; - d_stream.avail_in = 0; - d_stream.next_out = uncompr; - - err = inflateInit(&d_stream); - CHECK_ERR(err, "inflateInit"); - - while (d_stream.total_out < uncomprLen && d_stream.total_in < comprLen) { - d_stream.avail_in = d_stream.avail_out = 1; /* force small buffers */ - err = inflate(&d_stream, Z_NO_FLUSH); - if (err == Z_STREAM_END) break; - CHECK_ERR(err, "inflate"); - } - - err = inflateEnd(&d_stream); - CHECK_ERR(err, "inflateEnd"); - - if (strcmp((char*)uncompr, hello)) { - fprintf(stderr, "bad inflate\n"); - exit(1); - } else { - printf("inflate(): %s\n", (char *)uncompr); - } -} - -/* =========================================================================== - * Test deflate() with large buffers and dynamic change of compression level - */ -void test_large_deflate(compr, comprLen, uncompr, uncomprLen) - Byte *compr, *uncompr; - uLong comprLen, uncomprLen; -{ - z_stream c_stream; /* compression stream */ - int err; - - c_stream.zalloc = (alloc_func)0; - c_stream.zfree = (free_func)0; - c_stream.opaque = (voidpf)0; - - err = deflateInit(&c_stream, Z_BEST_SPEED); - CHECK_ERR(err, "deflateInit"); - - c_stream.next_out = compr; - c_stream.avail_out = (uInt)comprLen; - - /* At this point, uncompr is still mostly zeroes, so it should compress - * very well: - */ - c_stream.next_in = uncompr; - c_stream.avail_in = (uInt)uncomprLen; - err = deflate(&c_stream, Z_NO_FLUSH); - CHECK_ERR(err, "deflate"); - if (c_stream.avail_in != 0) { - fprintf(stderr, "deflate not greedy\n"); - exit(1); - } - - /* Feed in already compressed data and switch to no compression: */ - deflateParams(&c_stream, Z_NO_COMPRESSION, Z_DEFAULT_STRATEGY); - c_stream.next_in = compr; - c_stream.avail_in = (uInt)comprLen/2; - err = deflate(&c_stream, Z_NO_FLUSH); - CHECK_ERR(err, "deflate"); - - /* Switch back to compressing mode: */ - deflateParams(&c_stream, Z_BEST_COMPRESSION, Z_FILTERED); - c_stream.next_in = uncompr; - c_stream.avail_in = (uInt)uncomprLen; - err = deflate(&c_stream, Z_NO_FLUSH); - CHECK_ERR(err, "deflate"); - - err = deflate(&c_stream, Z_FINISH); - if (err != Z_STREAM_END) { - fprintf(stderr, "deflate should report Z_STREAM_END\n"); - exit(1); - } - err = deflateEnd(&c_stream); - CHECK_ERR(err, "deflateEnd"); -} - -/* =========================================================================== - * Test inflate() with large buffers - */ -void test_large_inflate(compr, comprLen, uncompr, uncomprLen) - Byte *compr, *uncompr; - uLong comprLen, uncomprLen; -{ - int err; - z_stream d_stream; /* decompression stream */ - - strcpy((char*)uncompr, "garbage"); - - d_stream.zalloc = (alloc_func)0; - d_stream.zfree = (free_func)0; - d_stream.opaque = (voidpf)0; - - d_stream.next_in = compr; - d_stream.avail_in = (uInt)comprLen; - - err = inflateInit(&d_stream); - CHECK_ERR(err, "inflateInit"); - - for (;;) { - d_stream.next_out = uncompr; /* discard the output */ - d_stream.avail_out = (uInt)uncomprLen; - err = inflate(&d_stream, Z_NO_FLUSH); - if (err == Z_STREAM_END) break; - CHECK_ERR(err, "large inflate"); - } - - err = inflateEnd(&d_stream); - CHECK_ERR(err, "inflateEnd"); - - if (d_stream.total_out != 2*uncomprLen + comprLen/2) { - fprintf(stderr, "bad large inflate: %ld\n", d_stream.total_out); - exit(1); - } else { - printf("large_inflate(): OK\n"); - } -} - -/* =========================================================================== - * Test deflate() with full flush - */ -void test_flush(compr, comprLen) - Byte *compr; - uLong *comprLen; -{ - z_stream c_stream; /* compression stream */ - int err; - int len = strlen(hello)+1; - - c_stream.zalloc = (alloc_func)0; - c_stream.zfree = (free_func)0; - c_stream.opaque = (voidpf)0; - - err = deflateInit(&c_stream, Z_DEFAULT_COMPRESSION); - CHECK_ERR(err, "deflateInit"); - - c_stream.next_in = (Bytef*)hello; - c_stream.next_out = compr; - c_stream.avail_in = 3; - c_stream.avail_out = (uInt)*comprLen; - err = deflate(&c_stream, Z_FULL_FLUSH); - CHECK_ERR(err, "deflate"); - - compr[3]++; /* force an error in first compressed block */ - c_stream.avail_in = len - 3; - - err = deflate(&c_stream, Z_FINISH); - if (err != Z_STREAM_END) { - CHECK_ERR(err, "deflate"); - } - err = deflateEnd(&c_stream); - CHECK_ERR(err, "deflateEnd"); - - *comprLen = c_stream.total_out; -} - -/* =========================================================================== - * Test inflateSync() - */ -void test_sync(compr, comprLen, uncompr, uncomprLen) - Byte *compr, *uncompr; - uLong comprLen, uncomprLen; -{ - int err; - z_stream d_stream; /* decompression stream */ - - strcpy((char*)uncompr, "garbage"); - - d_stream.zalloc = (alloc_func)0; - d_stream.zfree = (free_func)0; - d_stream.opaque = (voidpf)0; - - d_stream.next_in = compr; - d_stream.avail_in = 2; /* just read the zlib header */ - - err = inflateInit(&d_stream); - CHECK_ERR(err, "inflateInit"); - - d_stream.next_out = uncompr; - d_stream.avail_out = (uInt)uncomprLen; - - inflate(&d_stream, Z_NO_FLUSH); - CHECK_ERR(err, "inflate"); - - d_stream.avail_in = (uInt)comprLen-2; /* read all compressed data */ - err = inflateSync(&d_stream); /* but skip the damaged part */ - CHECK_ERR(err, "inflateSync"); - - err = inflate(&d_stream, Z_FINISH); - if (err != Z_DATA_ERROR) { - fprintf(stderr, "inflate should report DATA_ERROR\n"); - /* Because of incorrect adler32 */ - exit(1); - } - err = inflateEnd(&d_stream); - CHECK_ERR(err, "inflateEnd"); - - printf("after inflateSync(): hel%s\n", (char *)uncompr); -} - -/* =========================================================================== - * Test deflate() with preset dictionary - */ -void test_dict_deflate(compr, comprLen) - Byte *compr; - uLong comprLen; -{ - z_stream c_stream; /* compression stream */ - int err; - - c_stream.zalloc = (alloc_func)0; - c_stream.zfree = (free_func)0; - c_stream.opaque = (voidpf)0; - - err = deflateInit(&c_stream, Z_BEST_COMPRESSION); - CHECK_ERR(err, "deflateInit"); - - err = deflateSetDictionary(&c_stream, - (const Bytef*)dictionary, sizeof(dictionary)); - CHECK_ERR(err, "deflateSetDictionary"); - - dictId = c_stream.adler; - c_stream.next_out = compr; - c_stream.avail_out = (uInt)comprLen; - - c_stream.next_in = (Bytef*)hello; - c_stream.avail_in = (uInt)strlen(hello)+1; - - err = deflate(&c_stream, Z_FINISH); - if (err != Z_STREAM_END) { - fprintf(stderr, "deflate should report Z_STREAM_END\n"); - exit(1); - } - err = deflateEnd(&c_stream); - CHECK_ERR(err, "deflateEnd"); -} - -/* =========================================================================== - * Test inflate() with a preset dictionary - */ -void test_dict_inflate(compr, comprLen, uncompr, uncomprLen) - Byte *compr, *uncompr; - uLong comprLen, uncomprLen; -{ - int err; - z_stream d_stream; /* decompression stream */ - - strcpy((char*)uncompr, "garbage"); - - d_stream.zalloc = (alloc_func)0; - d_stream.zfree = (free_func)0; - d_stream.opaque = (voidpf)0; - - d_stream.next_in = compr; - d_stream.avail_in = (uInt)comprLen; - - err = inflateInit(&d_stream); - CHECK_ERR(err, "inflateInit"); - - d_stream.next_out = uncompr; - d_stream.avail_out = (uInt)uncomprLen; - - for (;;) { - err = inflate(&d_stream, Z_NO_FLUSH); - if (err == Z_STREAM_END) break; - if (err == Z_NEED_DICT) { - if (d_stream.adler != dictId) { - fprintf(stderr, "unexpected dictionary"); - exit(1); - } - err = inflateSetDictionary(&d_stream, (const Bytef*)dictionary, - sizeof(dictionary)); - } - CHECK_ERR(err, "inflate with dict"); - } - - err = inflateEnd(&d_stream); - CHECK_ERR(err, "inflateEnd"); - - if (strcmp((char*)uncompr, hello)) { - fprintf(stderr, "bad inflate with dict\n"); - exit(1); - } else { - printf("inflate with dictionary: %s\n", (char *)uncompr); - } -} - -/* =========================================================================== - * Usage: example [output.gz [input.gz]] - */ - -int main(argc, argv) - int argc; - char *argv[]; -{ - Byte *compr, *uncompr; - uLong comprLen = 10000*sizeof(int); /* don't overflow on MSDOS */ - uLong uncomprLen = comprLen; - static const char* myVersion = ZLIB_VERSION; - - if (zlibVersion()[0] != myVersion[0]) { - fprintf(stderr, "incompatible zlib version\n"); - exit(1); - - } else if (strcmp(zlibVersion(), ZLIB_VERSION) != 0) { - fprintf(stderr, "warning: different zlib version\n"); - } - - compr = (Byte*)calloc((uInt)comprLen, 1); - uncompr = (Byte*)calloc((uInt)uncomprLen, 1); - /* compr and uncompr are cleared to avoid reading uninitialized - * data and to ensure that uncompr compresses well. - */ - if (compr == Z_NULL || uncompr == Z_NULL) { - printf("out of memory\n"); - exit(1); - } - test_compress(compr, comprLen, uncompr, uncomprLen); - - test_gzio((argc > 1 ? argv[1] : TESTFILE), - (argc > 2 ? argv[2] : TESTFILE), - uncompr, (int)uncomprLen); - - test_deflate(compr, comprLen); - test_inflate(compr, comprLen, uncompr, uncomprLen); - - test_large_deflate(compr, comprLen, uncompr, uncomprLen); - test_large_inflate(compr, comprLen, uncompr, uncomprLen); - - test_flush(compr, &comprLen); - test_sync(compr, comprLen, uncompr, uncomprLen); - comprLen = uncomprLen; - - test_dict_deflate(compr, comprLen); - test_dict_inflate(compr, comprLen, uncompr, uncomprLen); - - exit(0); - return 0; /* to avoid warning */ -} diff --git a/zlib/gzio.c b/zlib/gzio.c deleted file mode 100644 index f7c336a5..00000000 --- a/zlib/gzio.c +++ /dev/null @@ -1,875 +0,0 @@ -/* gzio.c -- IO on .gz files - * Copyright (C) 1995-1998 Jean-loup Gailly. - * For conditions of distribution and use, see copyright notice in zlib.h - * - * Compile this file with -DNO_DEFLATE to avoid the compression code. - */ - -/* @(#) $Id$ */ - -#include - -#include "zutil.h" - -struct internal_state {int dummy;}; /* for buggy compilers */ - -#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 - -#define ALLOC(size) malloc(size) -#define TRYFREE(p) {if (p) free(p);} - -static int 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' */ - long startpos; /* start of compressed data in file (header skipped) */ -} 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 return 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->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 { - *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_DEFLATE - 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->startpos = 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 - * startpos anyway in write mode, so this initialization is not - * necessary. - */ - } else { - check_header(s); /* skip the .gz header */ - s->startpos = (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[20]; - - 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 = 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; - - /* Check the gzip magic header */ - for (len = 0; len < 2; len++) { - c = get_byte(s); - if (c != gz_magic[len]) { - if (len != 0) s->stream.avail_in++, s->stream.next_in--; - if (c != EOF) { - s->stream.avail_in++, s->stream.next_in--; - s->transparent = 1; - } - s->z_err = s->stream.avail_in != 0 ? Z_OK : Z_STREAM_END; - return; - } - } - 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_DEFLATE - 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; - - 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 -= fread(next_out, 1, s->stream.avail_out, - s->file); - } - len -= s->stream.avail_out; - s->stream.total_in += (uLong)len; - s->stream.total_out += (uLong)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 = 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->z_err = inflate(&(s->stream), Z_NO_FLUSH); - - 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->stream.total_out) in case of - * concatenated .gz files. Check for such files: - */ - check_header(s); - if (s->z_err == Z_OK) { - uLong total_in = s->stream.total_in; - uLong total_out = s->stream.total_out; - - inflateReset(&(s->stream)); - s->stream.total_in = total_in; - s->stream.total_out = total_out; - 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)); - - 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; -} - - -/* =========================================================================== - 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_DEFLATE -/* =========================================================================== - 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; - const voidp 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->z_err = deflate(&(s->stream), Z_NO_FLUSH); - 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; - - va_start(va, format); -#ifdef HAS_vsnprintf - (void)vsnprintf(buf, sizeof(buf), format, va); -#else - (void)vsprintf(buf, format, va); -#endif - va_end(va); - len = strlen(buf); /* some *sprintf don't return the nb of bytes written */ - if (len <= 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; - -#ifdef HAS_snprintf - 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); -#else - sprintf(buf, format, a1, a2, a3, a4, a5, a6, a7, a8, - a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); -#endif - len = strlen(buf); /* old sprintf doesn't return the nb of bytes written */ - if (len <= 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->z_err = deflate(&(s->stream), flush); - - /* 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_DEFLATE */ - -/* =========================================================================== - 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_DEFLATE - return -1L; -#else - if (whence == SEEK_SET) { - offset -= s->stream.total_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 */ - 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 (z_off_t)s->stream.total_in; -#endif - } - /* Rest of function is for reading only */ - - /* compute absolute position */ - if (whence == SEEK_CUR) { - offset += s->stream.total_out; - } - if (offset < 0) return -1L; - - if (s->transparent) { - /* map to fseek */ - s->stream.avail_in = 0; - s->stream.next_in = s->inbuf; - if (fseek(s->file, offset, SEEK_SET) < 0) return -1L; - - s->stream.total_in = s->stream.total_out = (uLong)offset; - return offset; - } - - /* For a negative seek, rewind and use positive seek */ - if ((uLong)offset >= s->stream.total_out) { - offset -= s->stream.total_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); - } - 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 (z_off_t)s->stream.total_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->stream.avail_in = 0; - s->stream.next_in = s->inbuf; - s->crc = crc32(0L, Z_NULL, 0); - - if (s->startpos == 0) { /* not a compressed file */ - rewind(s->file); - return 0; - } - - (void) inflateReset(&s->stream); - return fseek(s->file, s->startpos, 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; - - return (s == NULL || s->mode != 'r') ? 0 : s->z_eof; -} - -/* =========================================================================== - 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; -{ - int err; - gz_stream *s = (gz_stream*)file; - - if (s == NULL) return Z_STREAM_ERROR; - - if (s->mode == 'w') { -#ifdef NO_DEFLATE - return Z_STREAM_ERROR; -#else - err = do_flush (file, Z_FINISH); - if (err != Z_OK) return destroy((gz_stream*)file); - - putLong (s->file, s->crc); - putLong (s->file, s->stream.total_in); -#endif - } - return destroy((gz_stream*)file); -} - -/* =========================================================================== - Returns the error message for the last error which occured on the - given compressed file. errnum is set to zlib error number. If an - error occured 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); - strcpy(s->msg, s->path); - strcat(s->msg, ": "); - strcat(s->msg, m); - return (const char*)s->msg; -} diff --git a/zlib/infblock.c b/zlib/infblock.c deleted file mode 100644 index f4920faa..00000000 --- a/zlib/infblock.c +++ /dev/null @@ -1,398 +0,0 @@ -/* infblock.c -- interpret and process block types to last block - * Copyright (C) 1995-1998 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -#include "zutil.h" -#include "infblock.h" -#include "inftrees.h" -#include "infcodes.h" -#include "infutil.h" - -struct inflate_codes_state {int dummy;}; /* for buggy compilers */ - -/* simplify the use of the inflate_huft type with some defines */ -#define exop word.what.Exop -#define bits word.what.Bits - -/* Table for deflate from PKZIP's appnote.txt. */ -local const uInt border[] = { /* Order of the bit length code lengths */ - 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; - -/* - Notes beyond the 1.93a appnote.txt: - - 1. Distance pointers never point before the beginning of the output - stream. - 2. Distance pointers can point back across blocks, up to 32k away. - 3. There is an implied maximum of 7 bits for the bit length table and - 15 bits for the actual data. - 4. If only one code exists, then it is encoded using one bit. (Zero - would be more efficient, but perhaps a little confusing.) If two - codes exist, they are coded using one bit each (0 and 1). - 5. There is no way of sending zero distance codes--a dummy must be - sent if there are none. (History: a pre 2.0 version of PKZIP would - store blocks with no distance codes, but this was discovered to be - too harsh a criterion.) Valid only for 1.93a. 2.04c does allow - zero distance codes, which is sent as one code of zero bits in - length. - 6. There are up to 286 literal/length codes. Code 256 represents the - end-of-block. Note however that the static length tree defines - 288 codes just to fill out the Huffman codes. Codes 286 and 287 - cannot be used though, since there is no length base or extra bits - defined for them. Similarily, there are up to 30 distance codes. - However, static trees define 32 codes (all 5 bits) to fill out the - Huffman codes, but the last two had better not show up in the data. - 7. Unzip can check dynamic Huffman blocks for complete code sets. - The exception is that a single code would not be complete (see #4). - 8. The five bits following the block type is really the number of - literal codes sent minus 257. - 9. Length codes 8,16,16 are interpreted as 13 length codes of 8 bits - (1+6+6). Therefore, to output three times the length, you output - three codes (1+1+1), whereas to output four times the same length, - you only need two codes (1+3). Hmm. - 10. In the tree reconstruction algorithm, Code = Code + Increment - only if BitLength(i) is not zero. (Pretty obvious.) - 11. Correction: 4 Bits: # of Bit Length codes - 4 (4 - 19) - 12. Note: length code 284 can represent 227-258, but length code 285 - really is 258. The last length deserves its own, short code - since it gets used a lot in very redundant files. The length - 258 is special since 258 - 3 (the min match length) is 255. - 13. The literal/length and distance code bit lengths are read as a - single stream of lengths. It is possible (and advantageous) for - a repeat code (16, 17, or 18) to go across the boundary between - the two sets of lengths. - */ - - -void inflate_blocks_reset(s, z, c) -inflate_blocks_statef *s; -z_streamp z; -uLongf *c; -{ - if (c != Z_NULL) - *c = s->check; - if (s->mode == BTREE || s->mode == DTREE) - ZFREE(z, s->sub.trees.blens); - if (s->mode == CODES) - inflate_codes_free(s->sub.decode.codes, z); - s->mode = TYPE; - s->bitk = 0; - s->bitb = 0; - s->read = s->write = s->window; - if (s->checkfn != Z_NULL) - z->adler = s->check = (*s->checkfn)(0L, (const Bytef *)Z_NULL, 0); - Tracev((stderr, "inflate: blocks reset\n")); -} - - -inflate_blocks_statef *inflate_blocks_new(z, c, w) -z_streamp z; -check_func c; -uInt w; -{ - inflate_blocks_statef *s; - - if ((s = (inflate_blocks_statef *)ZALLOC - (z,1,sizeof(struct inflate_blocks_state))) == Z_NULL) - return s; - if ((s->hufts = - (inflate_huft *)ZALLOC(z, sizeof(inflate_huft), MANY)) == Z_NULL) - { - ZFREE(z, s); - return Z_NULL; - } - if ((s->window = (Bytef *)ZALLOC(z, 1, w)) == Z_NULL) - { - ZFREE(z, s->hufts); - ZFREE(z, s); - return Z_NULL; - } - s->end = s->window + w; - s->checkfn = c; - s->mode = TYPE; - Tracev((stderr, "inflate: blocks allocated\n")); - inflate_blocks_reset(s, z, Z_NULL); - return s; -} - - -int inflate_blocks(s, z, r) -inflate_blocks_statef *s; -z_streamp z; -int r; -{ - uInt t; /* temporary storage */ - uLong b; /* bit buffer */ - uInt k; /* bits in bit buffer */ - Bytef *p; /* input data pointer */ - uInt n; /* bytes available there */ - Bytef *q; /* output window write pointer */ - uInt m; /* bytes to end of window or read pointer */ - - /* copy input/output information to locals (UPDATE macro restores) */ - LOAD - - /* process input based on current state */ - while (1) switch (s->mode) - { - case TYPE: - NEEDBITS(3) - t = (uInt)b & 7; - s->last = t & 1; - switch (t >> 1) - { - case 0: /* stored */ - Tracev((stderr, "inflate: stored block%s\n", - s->last ? " (last)" : "")); - DUMPBITS(3) - t = k & 7; /* go to byte boundary */ - DUMPBITS(t) - s->mode = LENS; /* get length of stored block */ - break; - case 1: /* fixed */ - Tracev((stderr, "inflate: fixed codes block%s\n", - s->last ? " (last)" : "")); - { - uInt bl, bd; - inflate_huft *tl, *td; - - inflate_trees_fixed(&bl, &bd, &tl, &td, z); - s->sub.decode.codes = inflate_codes_new(bl, bd, tl, td, z); - if (s->sub.decode.codes == Z_NULL) - { - r = Z_MEM_ERROR; - LEAVE - } - } - DUMPBITS(3) - s->mode = CODES; - break; - case 2: /* dynamic */ - Tracev((stderr, "inflate: dynamic codes block%s\n", - s->last ? " (last)" : "")); - DUMPBITS(3) - s->mode = TABLE; - break; - case 3: /* illegal */ - DUMPBITS(3) - s->mode = BAD; - z->msg = (char*)"invalid block type"; - r = Z_DATA_ERROR; - LEAVE - } - break; - case LENS: - NEEDBITS(32) - if ((((~b) >> 16) & 0xffff) != (b & 0xffff)) - { - s->mode = BAD; - z->msg = (char*)"invalid stored block lengths"; - r = Z_DATA_ERROR; - LEAVE - } - s->sub.left = (uInt)b & 0xffff; - b = k = 0; /* dump bits */ - Tracev((stderr, "inflate: stored length %u\n", s->sub.left)); - s->mode = s->sub.left ? STORED : (s->last ? DRY : TYPE); - break; - case STORED: - if (n == 0) - LEAVE - NEEDOUT - t = s->sub.left; - if (t > n) t = n; - if (t > m) t = m; - zmemcpy(q, p, t); - p += t; n -= t; - q += t; m -= t; - if ((s->sub.left -= t) != 0) - break; - Tracev((stderr, "inflate: stored end, %lu total out\n", - z->total_out + (q >= s->read ? q - s->read : - (s->end - s->read) + (q - s->window)))); - s->mode = s->last ? DRY : TYPE; - break; - case TABLE: - NEEDBITS(14) - s->sub.trees.table = t = (uInt)b & 0x3fff; -#ifndef PKZIP_BUG_WORKAROUND - if ((t & 0x1f) > 29 || ((t >> 5) & 0x1f) > 29) - { - s->mode = BAD; - z->msg = (char*)"too many length or distance symbols"; - r = Z_DATA_ERROR; - LEAVE - } -#endif - t = 258 + (t & 0x1f) + ((t >> 5) & 0x1f); - if ((s->sub.trees.blens = (uIntf*)ZALLOC(z, t, sizeof(uInt))) == Z_NULL) - { - r = Z_MEM_ERROR; - LEAVE - } - DUMPBITS(14) - s->sub.trees.index = 0; - Tracev((stderr, "inflate: table sizes ok\n")); - s->mode = BTREE; - case BTREE: - while (s->sub.trees.index < 4 + (s->sub.trees.table >> 10)) - { - NEEDBITS(3) - s->sub.trees.blens[border[s->sub.trees.index++]] = (uInt)b & 7; - DUMPBITS(3) - } - while (s->sub.trees.index < 19) - s->sub.trees.blens[border[s->sub.trees.index++]] = 0; - s->sub.trees.bb = 7; - t = inflate_trees_bits(s->sub.trees.blens, &s->sub.trees.bb, - &s->sub.trees.tb, s->hufts, z); - if (t != Z_OK) - { - ZFREE(z, s->sub.trees.blens); - r = t; - if (r == Z_DATA_ERROR) - s->mode = BAD; - LEAVE - } - s->sub.trees.index = 0; - Tracev((stderr, "inflate: bits tree ok\n")); - s->mode = DTREE; - case DTREE: - while (t = s->sub.trees.table, - s->sub.trees.index < 258 + (t & 0x1f) + ((t >> 5) & 0x1f)) - { - inflate_huft *h; - uInt i, j, c; - - t = s->sub.trees.bb; - NEEDBITS(t) - h = s->sub.trees.tb + ((uInt)b & inflate_mask[t]); - t = h->bits; - c = h->base; - if (c < 16) - { - DUMPBITS(t) - s->sub.trees.blens[s->sub.trees.index++] = c; - } - else /* c == 16..18 */ - { - i = c == 18 ? 7 : c - 14; - j = c == 18 ? 11 : 3; - NEEDBITS(t + i) - DUMPBITS(t) - j += (uInt)b & inflate_mask[i]; - DUMPBITS(i) - i = s->sub.trees.index; - t = s->sub.trees.table; - if (i + j > 258 + (t & 0x1f) + ((t >> 5) & 0x1f) || - (c == 16 && i < 1)) - { - ZFREE(z, s->sub.trees.blens); - s->mode = BAD; - z->msg = (char*)"invalid bit length repeat"; - r = Z_DATA_ERROR; - LEAVE - } - c = c == 16 ? s->sub.trees.blens[i - 1] : 0; - do { - s->sub.trees.blens[i++] = c; - } while (--j); - s->sub.trees.index = i; - } - } - s->sub.trees.tb = Z_NULL; - { - uInt bl, bd; - inflate_huft *tl, *td; - inflate_codes_statef *c; - - bl = 9; /* must be <= 9 for lookahead assumptions */ - bd = 6; /* must be <= 9 for lookahead assumptions */ - t = s->sub.trees.table; - t = inflate_trees_dynamic(257 + (t & 0x1f), 1 + ((t >> 5) & 0x1f), - s->sub.trees.blens, &bl, &bd, &tl, &td, - s->hufts, z); - ZFREE(z, s->sub.trees.blens); - if (t != Z_OK) - { - if (t == (uInt)Z_DATA_ERROR) - s->mode = BAD; - r = t; - LEAVE - } - Tracev((stderr, "inflate: trees ok\n")); - if ((c = inflate_codes_new(bl, bd, tl, td, z)) == Z_NULL) - { - r = Z_MEM_ERROR; - LEAVE - } - s->sub.decode.codes = c; - } - s->mode = CODES; - case CODES: - UPDATE - if ((r = inflate_codes(s, z, r)) != Z_STREAM_END) - return inflate_flush(s, z, r); - r = Z_OK; - inflate_codes_free(s->sub.decode.codes, z); - LOAD - Tracev((stderr, "inflate: codes end, %lu total out\n", - z->total_out + (q >= s->read ? q - s->read : - (s->end - s->read) + (q - s->window)))); - if (!s->last) - { - s->mode = TYPE; - break; - } - s->mode = DRY; - case DRY: - FLUSH - if (s->read != s->write) - LEAVE - s->mode = DONE; - case DONE: - r = Z_STREAM_END; - LEAVE - case BAD: - r = Z_DATA_ERROR; - LEAVE - default: - r = Z_STREAM_ERROR; - LEAVE - } -} - - -int inflate_blocks_free(s, z) -inflate_blocks_statef *s; -z_streamp z; -{ - inflate_blocks_reset(s, z, Z_NULL); - ZFREE(z, s->window); - ZFREE(z, s->hufts); - ZFREE(z, s); - Tracev((stderr, "inflate: blocks freed\n")); - return Z_OK; -} - - -void inflate_set_dictionary(s, d, n) -inflate_blocks_statef *s; -const Bytef *d; -uInt n; -{ - zmemcpy(s->window, d, n); - s->read = s->write = s->window + n; -} - - -/* Returns true if inflate is currently at the end of a block generated - * by Z_SYNC_FLUSH or Z_FULL_FLUSH. - * IN assertion: s != Z_NULL - */ -int inflate_blocks_sync_point(s) -inflate_blocks_statef *s; -{ - return s->mode == LENS; -} diff --git a/zlib/infblock.h b/zlib/infblock.h deleted file mode 100644 index bd25c807..00000000 --- a/zlib/infblock.h +++ /dev/null @@ -1,39 +0,0 @@ -/* infblock.h -- header to use infblock.c - * Copyright (C) 1995-1998 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* 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. - */ - -struct inflate_blocks_state; -typedef struct inflate_blocks_state FAR inflate_blocks_statef; - -extern inflate_blocks_statef * inflate_blocks_new OF(( - z_streamp z, - check_func c, /* check function */ - uInt w)); /* window size */ - -extern int inflate_blocks OF(( - inflate_blocks_statef *, - z_streamp , - int)); /* initial return code */ - -extern void inflate_blocks_reset OF(( - inflate_blocks_statef *, - z_streamp , - uLongf *)); /* check value on output */ - -extern int inflate_blocks_free OF(( - inflate_blocks_statef *, - z_streamp)); - -extern void inflate_set_dictionary OF(( - inflate_blocks_statef *s, - const Bytef *d, /* dictionary */ - uInt n)); /* dictionary length */ - -extern int inflate_blocks_sync_point OF(( - inflate_blocks_statef *s)); diff --git a/zlib/infcodes.c b/zlib/infcodes.c deleted file mode 100644 index d4e5ee9a..00000000 --- a/zlib/infcodes.c +++ /dev/null @@ -1,257 +0,0 @@ -/* infcodes.c -- process literals and length/distance pairs - * Copyright (C) 1995-1998 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -#include "zutil.h" -#include "inftrees.h" -#include "infblock.h" -#include "infcodes.h" -#include "infutil.h" -#include "inffast.h" - -/* simplify the use of the inflate_huft type with some defines */ -#define exop word.what.Exop -#define bits word.what.Bits - -typedef enum { /* waiting for "i:"=input, "o:"=output, "x:"=nothing */ - START, /* x: set up for LEN */ - LEN, /* i: get length/literal/eob next */ - LENEXT, /* i: getting length extra (have base) */ - DIST, /* i: get distance next */ - DISTEXT, /* i: getting distance extra */ - COPY, /* o: copying bytes in window, waiting for space */ - LIT, /* o: got literal, waiting for output space */ - WASH, /* o: got eob, possibly still output waiting */ - END, /* x: got eob and all data flushed */ - BADCODE} /* x: got error */ -inflate_codes_mode; - -/* inflate codes private state */ -struct inflate_codes_state { - - /* mode */ - inflate_codes_mode mode; /* current inflate_codes mode */ - - /* mode dependent information */ - uInt len; - union { - struct { - inflate_huft *tree; /* pointer into tree */ - uInt need; /* bits needed */ - } code; /* if LEN or DIST, where in tree */ - uInt lit; /* if LIT, literal */ - struct { - uInt get; /* bits to get for extra */ - uInt dist; /* distance back to copy from */ - } copy; /* if EXT or COPY, where and how much */ - } sub; /* submode */ - - /* mode independent information */ - Byte lbits; /* ltree bits decoded per branch */ - Byte dbits; /* dtree bits decoder per branch */ - inflate_huft *ltree; /* literal/length/eob tree */ - inflate_huft *dtree; /* distance tree */ - -}; - - -inflate_codes_statef *inflate_codes_new(bl, bd, tl, td, z) -uInt bl, bd; -inflate_huft *tl; -inflate_huft *td; /* need separate declaration for Borland C++ */ -z_streamp z; -{ - inflate_codes_statef *c; - - if ((c = (inflate_codes_statef *) - ZALLOC(z,1,sizeof(struct inflate_codes_state))) != Z_NULL) - { - c->mode = START; - c->lbits = (Byte)bl; - c->dbits = (Byte)bd; - c->ltree = tl; - c->dtree = td; - Tracev((stderr, "inflate: codes new\n")); - } - return c; -} - - -int inflate_codes(s, z, r) -inflate_blocks_statef *s; -z_streamp z; -int r; -{ - uInt j; /* temporary storage */ - inflate_huft *t; /* temporary pointer */ - uInt e; /* extra bits or operation */ - uLong b; /* bit buffer */ - uInt k; /* bits in bit buffer */ - Bytef *p; /* input data pointer */ - uInt n; /* bytes available there */ - Bytef *q; /* output window write pointer */ - uInt m; /* bytes to end of window or read pointer */ - Bytef *f; /* pointer to copy strings from */ - inflate_codes_statef *c = s->sub.decode.codes; /* codes state */ - - /* copy input/output information to locals (UPDATE macro restores) */ - LOAD - - /* process input and output based on current state */ - while (1) switch (c->mode) - { /* waiting for "i:"=input, "o:"=output, "x:"=nothing */ - case START: /* x: set up for LEN */ -#ifndef SLOW - if (m >= 258 && n >= 10) - { - UPDATE - r = inflate_fast(c->lbits, c->dbits, c->ltree, c->dtree, s, z); - LOAD - if (r != Z_OK) - { - c->mode = r == Z_STREAM_END ? WASH : BADCODE; - break; - } - } -#endif /* !SLOW */ - c->sub.code.need = c->lbits; - c->sub.code.tree = c->ltree; - c->mode = LEN; - case LEN: /* i: get length/literal/eob next */ - j = c->sub.code.need; - NEEDBITS(j) - t = c->sub.code.tree + ((uInt)b & inflate_mask[j]); - DUMPBITS(t->bits) - e = (uInt)(t->exop); - if (e == 0) /* literal */ - { - c->sub.lit = t->base; - Tracevv((stderr, t->base >= 0x20 && t->base < 0x7f ? - "inflate: literal '%c'\n" : - "inflate: literal 0x%02x\n", t->base)); - c->mode = LIT; - break; - } - if (e & 16) /* length */ - { - c->sub.copy.get = e & 15; - c->len = t->base; - c->mode = LENEXT; - break; - } - if ((e & 64) == 0) /* next table */ - { - c->sub.code.need = e; - c->sub.code.tree = t + t->base; - break; - } - if (e & 32) /* end of block */ - { - Tracevv((stderr, "inflate: end of block\n")); - c->mode = WASH; - break; - } - c->mode = BADCODE; /* invalid code */ - z->msg = (char*)"invalid literal/length code"; - r = Z_DATA_ERROR; - LEAVE - case LENEXT: /* i: getting length extra (have base) */ - j = c->sub.copy.get; - NEEDBITS(j) - c->len += (uInt)b & inflate_mask[j]; - DUMPBITS(j) - c->sub.code.need = c->dbits; - c->sub.code.tree = c->dtree; - Tracevv((stderr, "inflate: length %u\n", c->len)); - c->mode = DIST; - case DIST: /* i: get distance next */ - j = c->sub.code.need; - NEEDBITS(j) - t = c->sub.code.tree + ((uInt)b & inflate_mask[j]); - DUMPBITS(t->bits) - e = (uInt)(t->exop); - if (e & 16) /* distance */ - { - c->sub.copy.get = e & 15; - c->sub.copy.dist = t->base; - c->mode = DISTEXT; - break; - } - if ((e & 64) == 0) /* next table */ - { - c->sub.code.need = e; - c->sub.code.tree = t + t->base; - break; - } - c->mode = BADCODE; /* invalid code */ - z->msg = (char*)"invalid distance code"; - r = Z_DATA_ERROR; - LEAVE - case DISTEXT: /* i: getting distance extra */ - j = c->sub.copy.get; - NEEDBITS(j) - c->sub.copy.dist += (uInt)b & inflate_mask[j]; - DUMPBITS(j) - Tracevv((stderr, "inflate: distance %u\n", c->sub.copy.dist)); - c->mode = COPY; - case COPY: /* o: copying bytes in window, waiting for space */ -#ifndef __TURBOC__ /* Turbo C bug for following expression */ - f = (uInt)(q - s->window) < c->sub.copy.dist ? - s->end - (c->sub.copy.dist - (q - s->window)) : - q - c->sub.copy.dist; -#else - f = q - c->sub.copy.dist; - if ((uInt)(q - s->window) < c->sub.copy.dist) - f = s->end - (c->sub.copy.dist - (uInt)(q - s->window)); -#endif - while (c->len) - { - NEEDOUT - OUTBYTE(*f++) - if (f == s->end) - f = s->window; - c->len--; - } - c->mode = START; - break; - case LIT: /* o: got literal, waiting for output space */ - NEEDOUT - OUTBYTE(c->sub.lit) - c->mode = START; - break; - case WASH: /* o: got eob, possibly more output */ - if (k > 7) /* return unused byte, if any */ - { - Assert(k < 16, "inflate_codes grabbed too many bytes") - k -= 8; - n++; - p--; /* can always return one */ - } - FLUSH - if (s->read != s->write) - LEAVE - c->mode = END; - case END: - r = Z_STREAM_END; - LEAVE - case BADCODE: /* x: got error */ - r = Z_DATA_ERROR; - LEAVE - default: - r = Z_STREAM_ERROR; - LEAVE - } -#ifdef NEED_DUMMY_RETURN - return Z_STREAM_ERROR; /* Some dumb compilers complain without this */ -#endif -} - - -void inflate_codes_free(c, z) -inflate_codes_statef *c; -z_streamp z; -{ - ZFREE(z, c); - Tracev((stderr, "inflate: codes free\n")); -} diff --git a/zlib/infcodes.h b/zlib/infcodes.h deleted file mode 100644 index 6c750d89..00000000 --- a/zlib/infcodes.h +++ /dev/null @@ -1,27 +0,0 @@ -/* infcodes.h -- header to use infcodes.c - * Copyright (C) 1995-1998 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* 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. - */ - -struct inflate_codes_state; -typedef struct inflate_codes_state FAR inflate_codes_statef; - -extern inflate_codes_statef *inflate_codes_new OF(( - uInt, uInt, - inflate_huft *, inflate_huft *, - z_streamp )); - -extern int inflate_codes OF(( - inflate_blocks_statef *, - z_streamp , - int)); - -extern void inflate_codes_free OF(( - inflate_codes_statef *, - z_streamp )); - diff --git a/zlib/inffast.c b/zlib/inffast.c deleted file mode 100644 index 61a78ee9..00000000 --- a/zlib/inffast.c +++ /dev/null @@ -1,170 +0,0 @@ -/* inffast.c -- process literals and length/distance pairs fast - * Copyright (C) 1995-1998 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -#include "zutil.h" -#include "inftrees.h" -#include "infblock.h" -#include "infcodes.h" -#include "infutil.h" -#include "inffast.h" - -struct inflate_codes_state {int dummy;}; /* for buggy compilers */ - -/* simplify the use of the inflate_huft type with some defines */ -#define exop word.what.Exop -#define bits word.what.Bits - -/* macros for bit input with no checking and for returning unused bytes */ -#define GRABBITS(j) {while(k<(j)){b|=((uLong)NEXTBYTE)<avail_in-n;c=(k>>3)>3:c;n+=c;p-=c;k-=c<<3;} - -/* Called with number of bytes left to write in window at least 258 - (the maximum string length) and number of input bytes available - at least ten. The ten bytes are six bytes for the longest length/ - distance pair plus four bytes for overloading the bit buffer. */ - -int inflate_fast(bl, bd, tl, td, s, z) -uInt bl, bd; -inflate_huft *tl; -inflate_huft *td; /* need separate declaration for Borland C++ */ -inflate_blocks_statef *s; -z_streamp z; -{ - inflate_huft *t; /* temporary pointer */ - uInt e; /* extra bits or operation */ - uLong b; /* bit buffer */ - uInt k; /* bits in bit buffer */ - Bytef *p; /* input data pointer */ - uInt n; /* bytes available there */ - Bytef *q; /* output window write pointer */ - uInt m; /* bytes to end of window or read pointer */ - uInt ml; /* mask for literal/length tree */ - uInt md; /* mask for distance tree */ - uInt c; /* bytes to copy */ - uInt d; /* distance back to copy from */ - Bytef *r; /* copy source pointer */ - - /* load input, output, bit values */ - LOAD - - /* initialize masks */ - ml = inflate_mask[bl]; - md = inflate_mask[bd]; - - /* do until not enough input or output space for fast loop */ - do { /* assume called with m >= 258 && n >= 10 */ - /* get literal/length code */ - GRABBITS(20) /* max bits for literal/length code */ - if ((e = (t = tl + ((uInt)b & ml))->exop) == 0) - { - DUMPBITS(t->bits) - Tracevv((stderr, t->base >= 0x20 && t->base < 0x7f ? - "inflate: * literal '%c'\n" : - "inflate: * literal 0x%02x\n", t->base)); - *q++ = (Byte)t->base; - m--; - continue; - } - do { - DUMPBITS(t->bits) - if (e & 16) - { - /* get extra bits for length */ - e &= 15; - c = t->base + ((uInt)b & inflate_mask[e]); - DUMPBITS(e) - Tracevv((stderr, "inflate: * length %u\n", c)); - - /* decode distance base of block to copy */ - GRABBITS(15); /* max bits for distance code */ - e = (t = td + ((uInt)b & md))->exop; - do { - DUMPBITS(t->bits) - if (e & 16) - { - /* get extra bits to add to distance base */ - e &= 15; - GRABBITS(e) /* get extra bits (up to 13) */ - d = t->base + ((uInt)b & inflate_mask[e]); - DUMPBITS(e) - Tracevv((stderr, "inflate: * distance %u\n", d)); - - /* do the copy */ - m -= c; - if ((uInt)(q - s->window) >= d) /* offset before dest */ - { /* just copy */ - r = q - d; - *q++ = *r++; c--; /* minimum count is three, */ - *q++ = *r++; c--; /* so unroll loop a little */ - } - else /* else offset after destination */ - { - e = d - (uInt)(q - s->window); /* bytes from offset to end */ - r = s->end - e; /* pointer to offset */ - if (c > e) /* if source crosses, */ - { - c -= e; /* copy to end of window */ - do { - *q++ = *r++; - } while (--e); - r = s->window; /* copy rest from start of window */ - } - } - do { /* copy all or what's left */ - *q++ = *r++; - } while (--c); - break; - } - else if ((e & 64) == 0) - { - t += t->base; - e = (t += ((uInt)b & inflate_mask[e]))->exop; - } - else - { - z->msg = (char*)"invalid distance code"; - UNGRAB - UPDATE - return Z_DATA_ERROR; - } - } while (1); - break; - } - if ((e & 64) == 0) - { - t += t->base; - if ((e = (t += ((uInt)b & inflate_mask[e]))->exop) == 0) - { - DUMPBITS(t->bits) - Tracevv((stderr, t->base >= 0x20 && t->base < 0x7f ? - "inflate: * literal '%c'\n" : - "inflate: * literal 0x%02x\n", t->base)); - *q++ = (Byte)t->base; - m--; - break; - } - } - else if (e & 32) - { - Tracevv((stderr, "inflate: * end of block\n")); - UNGRAB - UPDATE - return Z_STREAM_END; - } - else - { - z->msg = (char*)"invalid literal/length code"; - UNGRAB - UPDATE - return Z_DATA_ERROR; - } - } while (1); - } while (m >= 258 && n >= 10); - - /* not enough input or output--restore pointers and return */ - UNGRAB - UPDATE - return Z_OK; -} diff --git a/zlib/inffast.h b/zlib/inffast.h deleted file mode 100644 index 8facec55..00000000 --- a/zlib/inffast.h +++ /dev/null @@ -1,17 +0,0 @@ -/* inffast.h -- header to use inffast.c - * Copyright (C) 1995-1998 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* 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. - */ - -extern int inflate_fast OF(( - uInt, - uInt, - inflate_huft *, - inflate_huft *, - inflate_blocks_statef *, - z_streamp )); diff --git a/zlib/inffixed.h b/zlib/inffixed.h deleted file mode 100644 index 77f7e763..00000000 --- a/zlib/inffixed.h +++ /dev/null @@ -1,151 +0,0 @@ -/* inffixed.h -- table for decoding fixed codes - * Generated automatically by the maketree.c program - */ - -/* 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. - */ - -local uInt fixed_bl = 9; -local uInt fixed_bd = 5; -local inflate_huft fixed_tl[] = { - {{{96,7}},256}, {{{0,8}},80}, {{{0,8}},16}, {{{84,8}},115}, - {{{82,7}},31}, {{{0,8}},112}, {{{0,8}},48}, {{{0,9}},192}, - {{{80,7}},10}, {{{0,8}},96}, {{{0,8}},32}, {{{0,9}},160}, - {{{0,8}},0}, {{{0,8}},128}, {{{0,8}},64}, {{{0,9}},224}, - {{{80,7}},6}, {{{0,8}},88}, {{{0,8}},24}, {{{0,9}},144}, - {{{83,7}},59}, {{{0,8}},120}, {{{0,8}},56}, {{{0,9}},208}, - {{{81,7}},17}, {{{0,8}},104}, {{{0,8}},40}, {{{0,9}},176}, - {{{0,8}},8}, {{{0,8}},136}, {{{0,8}},72}, {{{0,9}},240}, - {{{80,7}},4}, {{{0,8}},84}, {{{0,8}},20}, {{{85,8}},227}, - {{{83,7}},43}, {{{0,8}},116}, {{{0,8}},52}, {{{0,9}},200}, - {{{81,7}},13}, {{{0,8}},100}, {{{0,8}},36}, {{{0,9}},168}, - {{{0,8}},4}, {{{0,8}},132}, {{{0,8}},68}, {{{0,9}},232}, - {{{80,7}},8}, {{{0,8}},92}, {{{0,8}},28}, {{{0,9}},152}, - {{{84,7}},83}, {{{0,8}},124}, {{{0,8}},60}, {{{0,9}},216}, - {{{82,7}},23}, {{{0,8}},108}, {{{0,8}},44}, {{{0,9}},184}, - {{{0,8}},12}, {{{0,8}},140}, {{{0,8}},76}, {{{0,9}},248}, - {{{80,7}},3}, {{{0,8}},82}, {{{0,8}},18}, {{{85,8}},163}, - {{{83,7}},35}, {{{0,8}},114}, {{{0,8}},50}, {{{0,9}},196}, - {{{81,7}},11}, {{{0,8}},98}, {{{0,8}},34}, {{{0,9}},164}, - {{{0,8}},2}, {{{0,8}},130}, {{{0,8}},66}, {{{0,9}},228}, - {{{80,7}},7}, {{{0,8}},90}, {{{0,8}},26}, {{{0,9}},148}, - {{{84,7}},67}, {{{0,8}},122}, {{{0,8}},58}, {{{0,9}},212}, - {{{82,7}},19}, {{{0,8}},106}, {{{0,8}},42}, {{{0,9}},180}, - {{{0,8}},10}, {{{0,8}},138}, {{{0,8}},74}, {{{0,9}},244}, - {{{80,7}},5}, {{{0,8}},86}, {{{0,8}},22}, {{{192,8}},0}, - {{{83,7}},51}, {{{0,8}},118}, {{{0,8}},54}, {{{0,9}},204}, - {{{81,7}},15}, {{{0,8}},102}, {{{0,8}},38}, {{{0,9}},172}, - {{{0,8}},6}, {{{0,8}},134}, {{{0,8}},70}, {{{0,9}},236}, - {{{80,7}},9}, {{{0,8}},94}, {{{0,8}},30}, {{{0,9}},156}, - {{{84,7}},99}, {{{0,8}},126}, {{{0,8}},62}, {{{0,9}},220}, - {{{82,7}},27}, {{{0,8}},110}, {{{0,8}},46}, {{{0,9}},188}, - {{{0,8}},14}, {{{0,8}},142}, {{{0,8}},78}, {{{0,9}},252}, - {{{96,7}},256}, {{{0,8}},81}, {{{0,8}},17}, {{{85,8}},131}, - {{{82,7}},31}, {{{0,8}},113}, {{{0,8}},49}, {{{0,9}},194}, - {{{80,7}},10}, {{{0,8}},97}, {{{0,8}},33}, {{{0,9}},162}, - {{{0,8}},1}, {{{0,8}},129}, {{{0,8}},65}, {{{0,9}},226}, - {{{80,7}},6}, {{{0,8}},89}, {{{0,8}},25}, {{{0,9}},146}, - {{{83,7}},59}, {{{0,8}},121}, {{{0,8}},57}, {{{0,9}},210}, - {{{81,7}},17}, {{{0,8}},105}, {{{0,8}},41}, {{{0,9}},178}, - {{{0,8}},9}, {{{0,8}},137}, {{{0,8}},73}, {{{0,9}},242}, - {{{80,7}},4}, {{{0,8}},85}, {{{0,8}},21}, {{{80,8}},258}, - {{{83,7}},43}, {{{0,8}},117}, {{{0,8}},53}, {{{0,9}},202}, - {{{81,7}},13}, {{{0,8}},101}, {{{0,8}},37}, {{{0,9}},170}, - {{{0,8}},5}, {{{0,8}},133}, {{{0,8}},69}, {{{0,9}},234}, - {{{80,7}},8}, {{{0,8}},93}, {{{0,8}},29}, {{{0,9}},154}, - {{{84,7}},83}, {{{0,8}},125}, {{{0,8}},61}, {{{0,9}},218}, - {{{82,7}},23}, {{{0,8}},109}, {{{0,8}},45}, {{{0,9}},186}, - {{{0,8}},13}, {{{0,8}},141}, {{{0,8}},77}, {{{0,9}},250}, - {{{80,7}},3}, {{{0,8}},83}, {{{0,8}},19}, {{{85,8}},195}, - {{{83,7}},35}, {{{0,8}},115}, {{{0,8}},51}, {{{0,9}},198}, - {{{81,7}},11}, {{{0,8}},99}, {{{0,8}},35}, {{{0,9}},166}, - {{{0,8}},3}, {{{0,8}},131}, {{{0,8}},67}, {{{0,9}},230}, - {{{80,7}},7}, {{{0,8}},91}, {{{0,8}},27}, {{{0,9}},150}, - {{{84,7}},67}, {{{0,8}},123}, {{{0,8}},59}, {{{0,9}},214}, - {{{82,7}},19}, {{{0,8}},107}, {{{0,8}},43}, {{{0,9}},182}, - {{{0,8}},11}, {{{0,8}},139}, {{{0,8}},75}, {{{0,9}},246}, - {{{80,7}},5}, {{{0,8}},87}, {{{0,8}},23}, {{{192,8}},0}, - {{{83,7}},51}, {{{0,8}},119}, {{{0,8}},55}, {{{0,9}},206}, - {{{81,7}},15}, {{{0,8}},103}, {{{0,8}},39}, {{{0,9}},174}, - {{{0,8}},7}, {{{0,8}},135}, {{{0,8}},71}, {{{0,9}},238}, - {{{80,7}},9}, {{{0,8}},95}, {{{0,8}},31}, {{{0,9}},158}, - {{{84,7}},99}, {{{0,8}},127}, {{{0,8}},63}, {{{0,9}},222}, - {{{82,7}},27}, {{{0,8}},111}, {{{0,8}},47}, {{{0,9}},190}, - {{{0,8}},15}, {{{0,8}},143}, {{{0,8}},79}, {{{0,9}},254}, - {{{96,7}},256}, {{{0,8}},80}, {{{0,8}},16}, {{{84,8}},115}, - {{{82,7}},31}, {{{0,8}},112}, {{{0,8}},48}, {{{0,9}},193}, - {{{80,7}},10}, {{{0,8}},96}, {{{0,8}},32}, {{{0,9}},161}, - {{{0,8}},0}, {{{0,8}},128}, {{{0,8}},64}, {{{0,9}},225}, - {{{80,7}},6}, {{{0,8}},88}, {{{0,8}},24}, {{{0,9}},145}, - {{{83,7}},59}, {{{0,8}},120}, {{{0,8}},56}, {{{0,9}},209}, - {{{81,7}},17}, {{{0,8}},104}, {{{0,8}},40}, {{{0,9}},177}, - {{{0,8}},8}, {{{0,8}},136}, {{{0,8}},72}, {{{0,9}},241}, - {{{80,7}},4}, {{{0,8}},84}, {{{0,8}},20}, {{{85,8}},227}, - {{{83,7}},43}, {{{0,8}},116}, {{{0,8}},52}, {{{0,9}},201}, - {{{81,7}},13}, {{{0,8}},100}, {{{0,8}},36}, {{{0,9}},169}, - {{{0,8}},4}, {{{0,8}},132}, {{{0,8}},68}, {{{0,9}},233}, - {{{80,7}},8}, {{{0,8}},92}, {{{0,8}},28}, {{{0,9}},153}, - {{{84,7}},83}, {{{0,8}},124}, {{{0,8}},60}, {{{0,9}},217}, - {{{82,7}},23}, {{{0,8}},108}, {{{0,8}},44}, {{{0,9}},185}, - {{{0,8}},12}, {{{0,8}},140}, {{{0,8}},76}, {{{0,9}},249}, - {{{80,7}},3}, {{{0,8}},82}, {{{0,8}},18}, {{{85,8}},163}, - {{{83,7}},35}, {{{0,8}},114}, {{{0,8}},50}, {{{0,9}},197}, - {{{81,7}},11}, {{{0,8}},98}, {{{0,8}},34}, {{{0,9}},165}, - {{{0,8}},2}, {{{0,8}},130}, {{{0,8}},66}, {{{0,9}},229}, - {{{80,7}},7}, {{{0,8}},90}, {{{0,8}},26}, {{{0,9}},149}, - {{{84,7}},67}, {{{0,8}},122}, {{{0,8}},58}, {{{0,9}},213}, - {{{82,7}},19}, {{{0,8}},106}, {{{0,8}},42}, {{{0,9}},181}, - {{{0,8}},10}, {{{0,8}},138}, {{{0,8}},74}, {{{0,9}},245}, - {{{80,7}},5}, {{{0,8}},86}, {{{0,8}},22}, {{{192,8}},0}, - {{{83,7}},51}, {{{0,8}},118}, {{{0,8}},54}, {{{0,9}},205}, - {{{81,7}},15}, {{{0,8}},102}, {{{0,8}},38}, {{{0,9}},173}, - {{{0,8}},6}, {{{0,8}},134}, {{{0,8}},70}, {{{0,9}},237}, - {{{80,7}},9}, {{{0,8}},94}, {{{0,8}},30}, {{{0,9}},157}, - {{{84,7}},99}, {{{0,8}},126}, {{{0,8}},62}, {{{0,9}},221}, - {{{82,7}},27}, {{{0,8}},110}, {{{0,8}},46}, {{{0,9}},189}, - {{{0,8}},14}, {{{0,8}},142}, {{{0,8}},78}, {{{0,9}},253}, - {{{96,7}},256}, {{{0,8}},81}, {{{0,8}},17}, {{{85,8}},131}, - {{{82,7}},31}, {{{0,8}},113}, {{{0,8}},49}, {{{0,9}},195}, - {{{80,7}},10}, {{{0,8}},97}, {{{0,8}},33}, {{{0,9}},163}, - {{{0,8}},1}, {{{0,8}},129}, {{{0,8}},65}, {{{0,9}},227}, - {{{80,7}},6}, {{{0,8}},89}, {{{0,8}},25}, {{{0,9}},147}, - {{{83,7}},59}, {{{0,8}},121}, {{{0,8}},57}, {{{0,9}},211}, - {{{81,7}},17}, {{{0,8}},105}, {{{0,8}},41}, {{{0,9}},179}, - {{{0,8}},9}, {{{0,8}},137}, {{{0,8}},73}, {{{0,9}},243}, - {{{80,7}},4}, {{{0,8}},85}, {{{0,8}},21}, {{{80,8}},258}, - {{{83,7}},43}, {{{0,8}},117}, {{{0,8}},53}, {{{0,9}},203}, - {{{81,7}},13}, {{{0,8}},101}, {{{0,8}},37}, {{{0,9}},171}, - {{{0,8}},5}, {{{0,8}},133}, {{{0,8}},69}, {{{0,9}},235}, - {{{80,7}},8}, {{{0,8}},93}, {{{0,8}},29}, {{{0,9}},155}, - {{{84,7}},83}, {{{0,8}},125}, {{{0,8}},61}, {{{0,9}},219}, - {{{82,7}},23}, {{{0,8}},109}, {{{0,8}},45}, {{{0,9}},187}, - {{{0,8}},13}, {{{0,8}},141}, {{{0,8}},77}, {{{0,9}},251}, - {{{80,7}},3}, {{{0,8}},83}, {{{0,8}},19}, {{{85,8}},195}, - {{{83,7}},35}, {{{0,8}},115}, {{{0,8}},51}, {{{0,9}},199}, - {{{81,7}},11}, {{{0,8}},99}, {{{0,8}},35}, {{{0,9}},167}, - {{{0,8}},3}, {{{0,8}},131}, {{{0,8}},67}, {{{0,9}},231}, - {{{80,7}},7}, {{{0,8}},91}, {{{0,8}},27}, {{{0,9}},151}, - {{{84,7}},67}, {{{0,8}},123}, {{{0,8}},59}, {{{0,9}},215}, - {{{82,7}},19}, {{{0,8}},107}, {{{0,8}},43}, {{{0,9}},183}, - {{{0,8}},11}, {{{0,8}},139}, {{{0,8}},75}, {{{0,9}},247}, - {{{80,7}},5}, {{{0,8}},87}, {{{0,8}},23}, {{{192,8}},0}, - {{{83,7}},51}, {{{0,8}},119}, {{{0,8}},55}, {{{0,9}},207}, - {{{81,7}},15}, {{{0,8}},103}, {{{0,8}},39}, {{{0,9}},175}, - {{{0,8}},7}, {{{0,8}},135}, {{{0,8}},71}, {{{0,9}},239}, - {{{80,7}},9}, {{{0,8}},95}, {{{0,8}},31}, {{{0,9}},159}, - {{{84,7}},99}, {{{0,8}},127}, {{{0,8}},63}, {{{0,9}},223}, - {{{82,7}},27}, {{{0,8}},111}, {{{0,8}},47}, {{{0,9}},191}, - {{{0,8}},15}, {{{0,8}},143}, {{{0,8}},79}, {{{0,9}},255} - }; -local inflate_huft fixed_td[] = { - {{{80,5}},1}, {{{87,5}},257}, {{{83,5}},17}, {{{91,5}},4097}, - {{{81,5}},5}, {{{89,5}},1025}, {{{85,5}},65}, {{{93,5}},16385}, - {{{80,5}},3}, {{{88,5}},513}, {{{84,5}},33}, {{{92,5}},8193}, - {{{82,5}},9}, {{{90,5}},2049}, {{{86,5}},129}, {{{192,5}},24577}, - {{{80,5}},2}, {{{87,5}},385}, {{{83,5}},25}, {{{91,5}},6145}, - {{{81,5}},7}, {{{89,5}},1537}, {{{85,5}},97}, {{{93,5}},24577}, - {{{80,5}},4}, {{{88,5}},769}, {{{84,5}},49}, {{{92,5}},12289}, - {{{82,5}},13}, {{{90,5}},3073}, {{{86,5}},193}, {{{192,5}},24577} - }; diff --git a/zlib/inflate.c b/zlib/inflate.c deleted file mode 100644 index 32e9b8de..00000000 --- a/zlib/inflate.c +++ /dev/null @@ -1,366 +0,0 @@ -/* inflate.c -- zlib interface to inflate modules - * Copyright (C) 1995-1998 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -#include "zutil.h" -#include "infblock.h" - -struct inflate_blocks_state {int dummy;}; /* for buggy compilers */ - -typedef enum { - METHOD, /* waiting for method byte */ - FLAG, /* waiting for flag byte */ - DICT4, /* four dictionary check bytes to go */ - DICT3, /* three dictionary check bytes to go */ - DICT2, /* two dictionary check bytes to go */ - DICT1, /* one dictionary check byte to go */ - DICT0, /* waiting for inflateSetDictionary */ - BLOCKS, /* decompressing blocks */ - CHECK4, /* four check bytes to go */ - CHECK3, /* three check bytes to go */ - CHECK2, /* two check bytes to go */ - CHECK1, /* one check byte to go */ - DONE, /* finished check, done */ - BAD} /* got an error--stay here */ -inflate_mode; - -/* inflate private state */ -struct internal_state { - - /* mode */ - inflate_mode mode; /* current inflate mode */ - - /* mode dependent information */ - union { - uInt method; /* if FLAGS, method byte */ - struct { - uLong was; /* computed check value */ - uLong need; /* stream check value */ - } check; /* if CHECK, check values to compare */ - uInt marker; /* if BAD, inflateSync's marker bytes count */ - } sub; /* submode */ - - /* mode independent information */ - int nowrap; /* flag for no wrapper */ - uInt wbits; /* log2(window size) (8..15, defaults to 15) */ - inflate_blocks_statef - *blocks; /* current inflate_blocks state */ - -}; - - -int ZEXPORT inflateReset(z) -z_streamp z; -{ - if (z == Z_NULL || z->state == Z_NULL) - return Z_STREAM_ERROR; - z->total_in = z->total_out = 0; - z->msg = Z_NULL; - z->state->mode = z->state->nowrap ? BLOCKS : METHOD; - inflate_blocks_reset(z->state->blocks, z, Z_NULL); - Tracev((stderr, "inflate: reset\n")); - return Z_OK; -} - - -int ZEXPORT inflateEnd(z) -z_streamp z; -{ - if (z == Z_NULL || z->state == Z_NULL || z->zfree == Z_NULL) - return Z_STREAM_ERROR; - if (z->state->blocks != Z_NULL) - inflate_blocks_free(z->state->blocks, z); - ZFREE(z, z->state); - z->state = Z_NULL; - Tracev((stderr, "inflate: end\n")); - return Z_OK; -} - - -int ZEXPORT inflateInit2_(z, w, version, stream_size) -z_streamp z; -int w; -const char *version; -int stream_size; -{ - if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || - stream_size != sizeof(z_stream)) - return Z_VERSION_ERROR; - - /* initialize state */ - if (z == Z_NULL) - return Z_STREAM_ERROR; - z->msg = Z_NULL; - if (z->zalloc == Z_NULL) - { - z->zalloc = zcalloc; - z->opaque = (voidpf)0; - } - if (z->zfree == Z_NULL) z->zfree = zcfree; - if ((z->state = (struct internal_state FAR *) - ZALLOC(z,1,sizeof(struct internal_state))) == Z_NULL) - return Z_MEM_ERROR; - z->state->blocks = Z_NULL; - - /* handle undocumented nowrap option (no zlib header or check) */ - z->state->nowrap = 0; - if (w < 0) - { - w = - w; - z->state->nowrap = 1; - } - - /* set window size */ - if (w < 8 || w > 15) - { - inflateEnd(z); - return Z_STREAM_ERROR; - } - z->state->wbits = (uInt)w; - - /* create inflate_blocks state */ - if ((z->state->blocks = - inflate_blocks_new(z, z->state->nowrap ? Z_NULL : adler32, (uInt)1 << w)) - == Z_NULL) - { - inflateEnd(z); - return Z_MEM_ERROR; - } - Tracev((stderr, "inflate: allocated\n")); - - /* reset state */ - inflateReset(z); - return Z_OK; -} - - -int ZEXPORT inflateInit_(z, version, stream_size) -z_streamp z; -const char *version; -int stream_size; -{ - return inflateInit2_(z, DEF_WBITS, version, stream_size); -} - - -#define NEEDBYTE {if(z->avail_in==0)return r;r=f;} -#define NEXTBYTE (z->avail_in--,z->total_in++,*z->next_in++) - -int ZEXPORT inflate(z, f) -z_streamp z; -int f; -{ - int r; - uInt b; - - if (z == Z_NULL || z->state == Z_NULL || z->next_in == Z_NULL) - return Z_STREAM_ERROR; - f = f == Z_FINISH ? Z_BUF_ERROR : Z_OK; - r = Z_BUF_ERROR; - while (1) switch (z->state->mode) - { - case METHOD: - NEEDBYTE - if (((z->state->sub.method = NEXTBYTE) & 0xf) != Z_DEFLATED) - { - z->state->mode = BAD; - z->msg = (char*)"unknown compression method"; - z->state->sub.marker = 5; /* can't try inflateSync */ - break; - } - if ((z->state->sub.method >> 4) + 8 > z->state->wbits) - { - z->state->mode = BAD; - z->msg = (char*)"invalid window size"; - z->state->sub.marker = 5; /* can't try inflateSync */ - break; - } - z->state->mode = FLAG; - case FLAG: - NEEDBYTE - b = NEXTBYTE; - if (((z->state->sub.method << 8) + b) % 31) - { - z->state->mode = BAD; - z->msg = (char*)"incorrect header check"; - z->state->sub.marker = 5; /* can't try inflateSync */ - break; - } - Tracev((stderr, "inflate: zlib header ok\n")); - if (!(b & PRESET_DICT)) - { - z->state->mode = BLOCKS; - break; - } - z->state->mode = DICT4; - case DICT4: - NEEDBYTE - z->state->sub.check.need = (uLong)NEXTBYTE << 24; - z->state->mode = DICT3; - case DICT3: - NEEDBYTE - z->state->sub.check.need += (uLong)NEXTBYTE << 16; - z->state->mode = DICT2; - case DICT2: - NEEDBYTE - z->state->sub.check.need += (uLong)NEXTBYTE << 8; - z->state->mode = DICT1; - case DICT1: - NEEDBYTE - z->state->sub.check.need += (uLong)NEXTBYTE; - z->adler = z->state->sub.check.need; - z->state->mode = DICT0; - return Z_NEED_DICT; - case DICT0: - z->state->mode = BAD; - z->msg = (char*)"need dictionary"; - z->state->sub.marker = 0; /* can try inflateSync */ - return Z_STREAM_ERROR; - case BLOCKS: - r = inflate_blocks(z->state->blocks, z, r); - if (r == Z_DATA_ERROR) - { - z->state->mode = BAD; - z->state->sub.marker = 0; /* can try inflateSync */ - break; - } - if (r == Z_OK) - r = f; - if (r != Z_STREAM_END) - return r; - r = f; - inflate_blocks_reset(z->state->blocks, z, &z->state->sub.check.was); - if (z->state->nowrap) - { - z->state->mode = DONE; - break; - } - z->state->mode = CHECK4; - case CHECK4: - NEEDBYTE - z->state->sub.check.need = (uLong)NEXTBYTE << 24; - z->state->mode = CHECK3; - case CHECK3: - NEEDBYTE - z->state->sub.check.need += (uLong)NEXTBYTE << 16; - z->state->mode = CHECK2; - case CHECK2: - NEEDBYTE - z->state->sub.check.need += (uLong)NEXTBYTE << 8; - z->state->mode = CHECK1; - case CHECK1: - NEEDBYTE - z->state->sub.check.need += (uLong)NEXTBYTE; - - if (z->state->sub.check.was != z->state->sub.check.need) - { - z->state->mode = BAD; - z->msg = (char*)"incorrect data check"; - z->state->sub.marker = 5; /* can't try inflateSync */ - break; - } - Tracev((stderr, "inflate: zlib check ok\n")); - z->state->mode = DONE; - case DONE: - return Z_STREAM_END; - case BAD: - return Z_DATA_ERROR; - default: - return Z_STREAM_ERROR; - } -#ifdef NEED_DUMMY_RETURN - return Z_STREAM_ERROR; /* Some dumb compilers complain without this */ -#endif -} - - -int ZEXPORT inflateSetDictionary(z, dictionary, dictLength) -z_streamp z; -const Bytef *dictionary; -uInt dictLength; -{ - uInt length = dictLength; - - if (z == Z_NULL || z->state == Z_NULL || z->state->mode != DICT0) - return Z_STREAM_ERROR; - - if (adler32(1L, dictionary, dictLength) != z->adler) return Z_DATA_ERROR; - z->adler = 1L; - - if (length >= ((uInt)1<state->wbits)) - { - length = (1<state->wbits)-1; - dictionary += dictLength - length; - } - inflate_set_dictionary(z->state->blocks, dictionary, length); - z->state->mode = BLOCKS; - return Z_OK; -} - - -int ZEXPORT inflateSync(z) -z_streamp z; -{ - uInt n; /* number of bytes to look at */ - Bytef *p; /* pointer to bytes */ - uInt m; /* number of marker bytes found in a row */ - uLong r, w; /* temporaries to save total_in and total_out */ - - /* set up */ - if (z == Z_NULL || z->state == Z_NULL) - return Z_STREAM_ERROR; - if (z->state->mode != BAD) - { - z->state->mode = BAD; - z->state->sub.marker = 0; - } - if ((n = z->avail_in) == 0) - return Z_BUF_ERROR; - p = z->next_in; - m = z->state->sub.marker; - - /* search */ - while (n && m < 4) - { - static const Byte mark[4] = {0, 0, 0xff, 0xff}; - if (*p == mark[m]) - m++; - else if (*p) - m = 0; - else - m = 4 - m; - p++, n--; - } - - /* restore */ - z->total_in += p - z->next_in; - z->next_in = p; - z->avail_in = n; - z->state->sub.marker = m; - - /* return no joy or set up to restart on a new block */ - if (m != 4) - return Z_DATA_ERROR; - r = z->total_in; w = z->total_out; - inflateReset(z); - z->total_in = r; z->total_out = w; - z->state->mode = BLOCKS; - return Z_OK; -} - - -/* Returns true if inflate is currently at the end of a block generated - * by Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP - * implementation to provide an additional safety check. PPP uses Z_SYNC_FLUSH - * but removes the length bytes of the resulting empty stored block. When - * decompressing, PPP checks that at the end of input packet, inflate is - * waiting for these length bytes. - */ -int ZEXPORT inflateSyncPoint(z) -z_streamp z; -{ - if (z == Z_NULL || z->state == Z_NULL || z->state->blocks == Z_NULL) - return Z_STREAM_ERROR; - return inflate_blocks_sync_point(z->state->blocks); -} diff --git a/zlib/inftrees.c b/zlib/inftrees.c deleted file mode 100644 index ef1e0b6b..00000000 --- a/zlib/inftrees.c +++ /dev/null @@ -1,455 +0,0 @@ -/* inftrees.c -- generate Huffman trees for efficient decoding - * Copyright (C) 1995-1998 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -#include "zutil.h" -#include "inftrees.h" - -#if !defined(BUILDFIXED) && !defined(STDC) -# define BUILDFIXED /* non ANSI compilers may not accept inffixed.h */ -#endif - -const char inflate_copyright[] = - " inflate 1.1.3 Copyright 1995-1998 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 - include such an acknowledgment, I would appreciate that you keep this - copyright string in the executable of your product. - */ -struct internal_state {int dummy;}; /* for buggy compilers */ - -/* simplify the use of the inflate_huft type with some defines */ -#define exop word.what.Exop -#define bits word.what.Bits - - -local int huft_build OF(( - uIntf *, /* code lengths in bits */ - uInt, /* number of codes */ - uInt, /* number of "simple" codes */ - const uIntf *, /* list of base values for non-simple codes */ - const uIntf *, /* list of extra bits for non-simple codes */ - inflate_huft * FAR*,/* result: starting table */ - uIntf *, /* maximum lookup bits (returns actual) */ - inflate_huft *, /* space for trees */ - uInt *, /* hufts used in space */ - uIntf * )); /* space for values */ - -/* Tables for deflate from PKZIP's appnote.txt. */ -local const uInt cplens[31] = { /* Copy lengths for literal codes 257..285 */ - 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, - 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; - /* see note #13 above about 258 */ -local const uInt cplext[31] = { /* Extra bits for literal codes 257..285 */ - 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, - 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 112, 112}; /* 112==invalid */ -local const uInt cpdist[30] = { /* Copy offsets for distance codes 0..29 */ - 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, - 8193, 12289, 16385, 24577}; -local const uInt cpdext[30] = { /* Extra bits for distance codes */ - 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, - 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, - 12, 12, 13, 13}; - -/* - Huffman code decoding is performed using a multi-level table lookup. - The fastest way to decode is to simply build a lookup table whose - size is determined by the longest code. However, the time it takes - to build this table can also be a factor if the data being decoded - is not very long. The most common codes are necessarily the - shortest codes, so those codes dominate the decoding time, and hence - the speed. The idea is you can have a shorter table that decodes the - shorter, more probable codes, and then point to subsidiary tables for - the longer codes. The time it costs to decode the longer codes is - then traded against the time it takes to make longer tables. - - This results of this trade are in the variables lbits and dbits - below. lbits is the number of bits the first level table for literal/ - length codes can decode in one step, and dbits is the same thing for - the distance codes. Subsequent tables are also less than or equal to - those sizes. These values may be adjusted either when all of the - codes are shorter than that, in which case the longest code length in - bits is used, or when the shortest code is *longer* than the requested - table size, in which case the length of the shortest code in bits is - used. - - There are two different values for the two tables, since they code a - different number of possibilities each. The literal/length table - codes 286 possible values, or in a flat code, a little over eight - bits. The distance table codes 30 possible values, or a little less - than five bits, flat. The optimum values for speed end up being - about one bit more than those, so lbits is 8+1 and dbits is 5+1. - The optimum values may differ though from machine to machine, and - possibly even between compilers. Your mileage may vary. - */ - - -/* If BMAX needs to be larger than 16, then h and x[] should be uLong. */ -#define BMAX 15 /* maximum bit length of any code */ - -local int huft_build(b, n, s, d, e, t, m, hp, hn, v) -uIntf *b; /* code lengths in bits (all assumed <= BMAX) */ -uInt n; /* number of codes (assumed <= 288) */ -uInt s; /* number of simple-valued codes (0..s-1) */ -const uIntf *d; /* list of base values for non-simple codes */ -const uIntf *e; /* list of extra bits for non-simple codes */ -inflate_huft * FAR *t; /* result: starting table */ -uIntf *m; /* maximum lookup bits, returns actual */ -inflate_huft *hp; /* space for trees */ -uInt *hn; /* hufts used in space */ -uIntf *v; /* working area: values in order of bit length */ -/* Given a list of code lengths and a maximum table size, make a set of - tables to decode that set of codes. Return Z_OK on success, Z_BUF_ERROR - if the given code set is incomplete (the tables are still built in this - case), Z_DATA_ERROR if the input is invalid (an over-subscribed set of - lengths), or Z_MEM_ERROR if not enough memory. */ -{ - - uInt a; /* counter for codes of length k */ - uInt c[BMAX+1]; /* bit length count table */ - uInt f; /* i repeats in table every f entries */ - int g; /* maximum code length */ - int h; /* table level */ - register uInt i; /* counter, current code */ - register uInt j; /* counter */ - register int k; /* number of bits in current code */ - int l; /* bits per table (returned in m) */ - uInt mask; /* (1 << w) - 1, to avoid cc -O bug on HP */ - register uIntf *p; /* pointer into c[], b[], or v[] */ - inflate_huft *q; /* points to current table */ - struct inflate_huft_s r; /* table entry for structure assignment */ - inflate_huft *u[BMAX]; /* table stack */ - register int w; /* bits before this table == (l * h) */ - uInt x[BMAX+1]; /* bit offsets, then code stack */ - uIntf *xp; /* pointer into x */ - int y; /* number of dummy codes added */ - uInt z; /* number of entries in current table */ - - - /* Generate counts for each bit length */ - p = c; -#define C0 *p++ = 0; -#define C2 C0 C0 C0 C0 -#define C4 C2 C2 C2 C2 - C4 /* clear c[]--assume BMAX+1 is 16 */ - p = b; i = n; - do { - c[*p++]++; /* assume all entries <= BMAX */ - } while (--i); - if (c[0] == n) /* null input--all zero length codes */ - { - *t = (inflate_huft *)Z_NULL; - *m = 0; - return Z_OK; - } - - - /* Find minimum and maximum length, bound *m by those */ - l = *m; - for (j = 1; j <= BMAX; j++) - if (c[j]) - break; - k = j; /* minimum code length */ - if ((uInt)l < j) - l = j; - for (i = BMAX; i; i--) - if (c[i]) - break; - g = i; /* maximum code length */ - if ((uInt)l > i) - l = i; - *m = l; - - - /* Adjust last length count to fill out codes, if needed */ - for (y = 1 << j; j < i; j++, y <<= 1) - if ((y -= c[j]) < 0) - return Z_DATA_ERROR; - if ((y -= c[i]) < 0) - return Z_DATA_ERROR; - c[i] += y; - - - /* Generate starting offsets into the value table for each length */ - x[1] = j = 0; - p = c + 1; xp = x + 2; - while (--i) { /* note that i == g from above */ - *xp++ = (j += *p++); - } - - - /* Make a table of values in order of bit lengths */ - p = b; i = 0; - do { - if ((j = *p++) != 0) - v[x[j]++] = i; - } while (++i < n); - n = x[g]; /* set n to length of v */ - - - /* Generate the Huffman codes and for each, make the table entries */ - x[0] = i = 0; /* first Huffman code is zero */ - p = v; /* grab values in bit order */ - h = -1; /* no tables yet--level -1 */ - w = -l; /* bits decoded == (l * h) */ - u[0] = (inflate_huft *)Z_NULL; /* just to keep compilers happy */ - q = (inflate_huft *)Z_NULL; /* ditto */ - z = 0; /* ditto */ - - /* go through the bit lengths (k already is bits in shortest code) */ - for (; k <= g; k++) - { - a = c[k]; - while (a--) - { - /* here i is the Huffman code of length k bits for value *p */ - /* make tables up to required level */ - while (k > w + l) - { - h++; - w += l; /* previous table always l bits */ - - /* compute minimum size table less than or equal to l bits */ - z = g - w; - z = z > (uInt)l ? l : z; /* table size upper limit */ - if ((f = 1 << (j = k - w)) > a + 1) /* try a k-w bit table */ - { /* too few codes for k-w bit table */ - f -= a + 1; /* deduct codes from patterns left */ - xp = c + k; - if (j < z) - while (++j < z) /* try smaller tables up to z bits */ - { - if ((f <<= 1) <= *++xp) - break; /* enough codes to use up j bits */ - f -= *xp; /* else deduct codes from patterns */ - } - } - z = 1 << j; /* table entries for j-bit table */ - - /* allocate new table */ - if (*hn + z > MANY) /* (note: doesn't matter for fixed) */ - return Z_MEM_ERROR; /* not enough memory */ - u[h] = q = hp + *hn; - *hn += z; - - /* connect to last table, if there is one */ - if (h) - { - x[h] = i; /* save pattern for backing up */ - r.bits = (Byte)l; /* bits to dump before this table */ - r.exop = (Byte)j; /* bits in this table */ - j = i >> (w - l); - r.base = (uInt)(q - u[h-1] - j); /* offset to this table */ - u[h-1][j] = r; /* connect to last table */ - } - else - *t = q; /* first table is returned result */ - } - - /* set up table entry in r */ - r.bits = (Byte)(k - w); - if (p >= v + n) - r.exop = 128 + 64; /* out of values--invalid code */ - else if (*p < s) - { - r.exop = (Byte)(*p < 256 ? 0 : 32 + 64); /* 256 is end-of-block */ - r.base = *p++; /* simple code is just the value */ - } - else - { - r.exop = (Byte)(e[*p - s] + 16 + 64);/* non-simple--look up in lists */ - r.base = d[*p++ - s]; - } - - /* fill code-like entries with r */ - f = 1 << (k - w); - for (j = i >> w; j < z; j += f) - q[j] = r; - - /* backwards increment the k-bit code i */ - for (j = 1 << (k - 1); i & j; j >>= 1) - i ^= j; - i ^= j; - - /* backup over finished tables */ - mask = (1 << w) - 1; /* needed on HP, cc -O bug */ - while ((i & mask) != x[h]) - { - h--; /* don't need to update q */ - w -= l; - mask = (1 << w) - 1; - } - } - } - - - /* Return Z_BUF_ERROR if we were given an incomplete table */ - return y != 0 && g != 1 ? Z_BUF_ERROR : Z_OK; -} - - -int inflate_trees_bits(c, bb, tb, hp, z) -uIntf *c; /* 19 code lengths */ -uIntf *bb; /* bits tree desired/actual depth */ -inflate_huft * FAR *tb; /* bits tree result */ -inflate_huft *hp; /* space for trees */ -z_streamp z; /* for messages */ -{ - int r; - uInt hn = 0; /* hufts used in space */ - uIntf *v; /* work area for huft_build */ - - if ((v = (uIntf*)ZALLOC(z, 19, sizeof(uInt))) == Z_NULL) - return Z_MEM_ERROR; - r = huft_build(c, 19, 19, (uIntf*)Z_NULL, (uIntf*)Z_NULL, - tb, bb, hp, &hn, v); - if (r == Z_DATA_ERROR) - z->msg = (char*)"oversubscribed dynamic bit lengths tree"; - else if (r == Z_BUF_ERROR || *bb == 0) - { - z->msg = (char*)"incomplete dynamic bit lengths tree"; - r = Z_DATA_ERROR; - } - ZFREE(z, v); - return r; -} - - -int inflate_trees_dynamic(nl, nd, c, bl, bd, tl, td, hp, z) -uInt nl; /* number of literal/length codes */ -uInt nd; /* number of distance codes */ -uIntf *c; /* that many (total) code lengths */ -uIntf *bl; /* literal desired/actual bit depth */ -uIntf *bd; /* distance desired/actual bit depth */ -inflate_huft * FAR *tl; /* literal/length tree result */ -inflate_huft * FAR *td; /* distance tree result */ -inflate_huft *hp; /* space for trees */ -z_streamp z; /* for messages */ -{ - int r; - uInt hn = 0; /* hufts used in space */ - uIntf *v; /* work area for huft_build */ - - /* allocate work area */ - if ((v = (uIntf*)ZALLOC(z, 288, sizeof(uInt))) == Z_NULL) - return Z_MEM_ERROR; - - /* build literal/length tree */ - r = huft_build(c, nl, 257, cplens, cplext, tl, bl, hp, &hn, v); - if (r != Z_OK || *bl == 0) - { - if (r == Z_DATA_ERROR) - z->msg = (char*)"oversubscribed literal/length tree"; - else if (r != Z_MEM_ERROR) - { - z->msg = (char*)"incomplete literal/length tree"; - r = Z_DATA_ERROR; - } - ZFREE(z, v); - return r; - } - - /* build distance tree */ - r = huft_build(c + nl, nd, 0, cpdist, cpdext, td, bd, hp, &hn, v); - if (r != Z_OK || (*bd == 0 && nl > 257)) - { - if (r == Z_DATA_ERROR) - z->msg = (char*)"oversubscribed distance tree"; - else if (r == Z_BUF_ERROR) { -#ifdef PKZIP_BUG_WORKAROUND - r = Z_OK; - } -#else - z->msg = (char*)"incomplete distance tree"; - r = Z_DATA_ERROR; - } - else if (r != Z_MEM_ERROR) - { - z->msg = (char*)"empty distance tree with lengths"; - r = Z_DATA_ERROR; - } - ZFREE(z, v); - return r; -#endif - } - - /* done */ - ZFREE(z, v); - return Z_OK; -} - - -/* build fixed tables only once--keep them here */ -#ifdef BUILDFIXED -local int fixed_built = 0; -#define FIXEDH 544 /* number of hufts used by fixed tables */ -local inflate_huft fixed_mem[FIXEDH]; -local uInt fixed_bl; -local uInt fixed_bd; -local inflate_huft *fixed_tl; -local inflate_huft *fixed_td; -#else -#include "inffixed.h" -#endif - - -int inflate_trees_fixed(bl, bd, tl, td, z) -uIntf *bl; /* literal desired/actual bit depth */ -uIntf *bd; /* distance desired/actual bit depth */ -inflate_huft * FAR *tl; /* literal/length tree result */ -inflate_huft * FAR *td; /* distance tree result */ -z_streamp z; /* for memory allocation */ -{ -#ifdef BUILDFIXED - /* build fixed tables if not already */ - if (!fixed_built) - { - int k; /* temporary variable */ - uInt f = 0; /* number of hufts used in fixed_mem */ - uIntf *c; /* length list for huft_build */ - uIntf *v; /* work area for huft_build */ - - /* allocate memory */ - if ((c = (uIntf*)ZALLOC(z, 288, sizeof(uInt))) == Z_NULL) - return Z_MEM_ERROR; - if ((v = (uIntf*)ZALLOC(z, 288, sizeof(uInt))) == Z_NULL) - { - ZFREE(z, c); - return Z_MEM_ERROR; - } - - /* literal table */ - for (k = 0; k < 144; k++) - c[k] = 8; - for (; k < 256; k++) - c[k] = 9; - for (; k < 280; k++) - c[k] = 7; - for (; k < 288; k++) - c[k] = 8; - fixed_bl = 9; - huft_build(c, 288, 257, cplens, cplext, &fixed_tl, &fixed_bl, - fixed_mem, &f, v); - - /* distance table */ - for (k = 0; k < 30; k++) - c[k] = 5; - fixed_bd = 5; - huft_build(c, 30, 0, cpdist, cpdext, &fixed_td, &fixed_bd, - fixed_mem, &f, v); - - /* done */ - ZFREE(z, v); - ZFREE(z, c); - fixed_built = 1; - } -#endif - *bl = fixed_bl; - *bd = fixed_bd; - *tl = fixed_tl; - *td = fixed_td; - return Z_OK; -} diff --git a/zlib/inftrees.h b/zlib/inftrees.h deleted file mode 100644 index 85853e09..00000000 --- a/zlib/inftrees.h +++ /dev/null @@ -1,58 +0,0 @@ -/* inftrees.h -- header to use inftrees.c - * Copyright (C) 1995-1998 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* 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. - */ - -/* Huffman code lookup table entry--this entry is four bytes for machines - that have 16-bit pointers (e.g. PC's in the small or medium model). */ - -typedef struct inflate_huft_s FAR inflate_huft; - -struct inflate_huft_s { - union { - struct { - Byte Exop; /* number of extra bits or operation */ - Byte Bits; /* number of bits in this code or subcode */ - } what; - uInt pad; /* pad structure to a power of 2 (4 bytes for */ - } word; /* 16-bit, 8 bytes for 32-bit int's) */ - uInt base; /* literal, length base, distance base, - or table offset */ -}; - -/* Maximum size of dynamic tree. The maximum found in a long but non- - exhaustive search was 1004 huft structures (850 for length/literals - and 154 for distances, the latter actually the result of an - exhaustive search). The actual maximum is not known, but the - value below is more than safe. */ -#define MANY 1440 - -extern int inflate_trees_bits OF(( - uIntf *, /* 19 code lengths */ - uIntf *, /* bits tree desired/actual depth */ - inflate_huft * FAR *, /* bits tree result */ - inflate_huft *, /* space for trees */ - z_streamp)); /* for messages */ - -extern int inflate_trees_dynamic OF(( - uInt, /* number of literal/length codes */ - uInt, /* number of distance codes */ - uIntf *, /* that many (total) code lengths */ - uIntf *, /* literal desired/actual bit depth */ - uIntf *, /* distance desired/actual bit depth */ - inflate_huft * FAR *, /* literal/length tree result */ - inflate_huft * FAR *, /* distance tree result */ - inflate_huft *, /* space for trees */ - z_streamp)); /* for messages */ - -extern int inflate_trees_fixed OF(( - uIntf *, /* literal desired/actual bit depth */ - uIntf *, /* distance desired/actual bit depth */ - inflate_huft * FAR *, /* literal/length tree result */ - inflate_huft * FAR *, /* distance tree result */ - z_streamp)); /* for memory allocation */ diff --git a/zlib/infutil.c b/zlib/infutil.c deleted file mode 100644 index 824dab57..00000000 --- a/zlib/infutil.c +++ /dev/null @@ -1,87 +0,0 @@ -/* inflate_util.c -- data and routines common to blocks and codes - * Copyright (C) 1995-1998 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -#include "zutil.h" -#include "infblock.h" -#include "inftrees.h" -#include "infcodes.h" -#include "infutil.h" - -struct inflate_codes_state {int dummy;}; /* for buggy compilers */ - -/* And'ing with mask[n] masks the lower n bits */ -uInt inflate_mask[17] = { - 0x0000, - 0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff, - 0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff -}; - - -/* copy as much as possible from the sliding window to the output area */ -int inflate_flush(s, z, r) -inflate_blocks_statef *s; -z_streamp z; -int r; -{ - uInt n; - Bytef *p; - Bytef *q; - - /* local copies of source and destination pointers */ - p = z->next_out; - q = s->read; - - /* compute number of bytes to copy as far as end of window */ - n = (uInt)((q <= s->write ? s->write : s->end) - q); - if (n > z->avail_out) n = z->avail_out; - if (n && r == Z_BUF_ERROR) r = Z_OK; - - /* update counters */ - z->avail_out -= n; - z->total_out += n; - - /* update check information */ - if (s->checkfn != Z_NULL) - z->adler = s->check = (*s->checkfn)(s->check, q, n); - - /* copy as far as end of window */ - zmemcpy(p, q, n); - p += n; - q += n; - - /* see if more to copy at beginning of window */ - if (q == s->end) - { - /* wrap pointers */ - q = s->window; - if (s->write == s->end) - s->write = s->window; - - /* compute bytes to copy */ - n = (uInt)(s->write - q); - if (n > z->avail_out) n = z->avail_out; - if (n && r == Z_BUF_ERROR) r = Z_OK; - - /* update counters */ - z->avail_out -= n; - z->total_out += n; - - /* update check information */ - if (s->checkfn != Z_NULL) - z->adler = s->check = (*s->checkfn)(s->check, q, n); - - /* copy */ - zmemcpy(p, q, n); - p += n; - q += n; - } - - /* update pointers */ - z->next_out = p; - s->read = q; - - /* done */ - return r; -} diff --git a/zlib/infutil.h b/zlib/infutil.h deleted file mode 100644 index 99d1135d..00000000 --- a/zlib/infutil.h +++ /dev/null @@ -1,98 +0,0 @@ -/* infutil.h -- types and macros common to blocks and codes - * Copyright (C) 1995-1998 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* 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. - */ - -#ifndef _INFUTIL_H -#define _INFUTIL_H - -typedef enum { - TYPE, /* get type bits (3, including end bit) */ - LENS, /* get lengths for stored */ - STORED, /* processing stored block */ - TABLE, /* get table lengths */ - BTREE, /* get bit lengths tree for a dynamic block */ - DTREE, /* get length, distance trees for a dynamic block */ - CODES, /* processing fixed or dynamic block */ - DRY, /* output remaining window bytes */ - DONE, /* finished last block, done */ - BAD} /* got a data error--stuck here */ -inflate_block_mode; - -/* inflate blocks semi-private state */ -struct inflate_blocks_state { - - /* mode */ - inflate_block_mode mode; /* current inflate_block mode */ - - /* mode dependent information */ - union { - uInt left; /* if STORED, bytes left to copy */ - struct { - uInt table; /* table lengths (14 bits) */ - uInt index; /* index into blens (or border) */ - uIntf *blens; /* bit lengths of codes */ - uInt bb; /* bit length tree depth */ - inflate_huft *tb; /* bit length decoding tree */ - } trees; /* if DTREE, decoding info for trees */ - struct { - inflate_codes_statef - *codes; - } decode; /* if CODES, current state */ - } sub; /* submode */ - uInt last; /* true if this block is the last block */ - - /* mode independent information */ - uInt bitk; /* bits in bit buffer */ - uLong bitb; /* bit buffer */ - inflate_huft *hufts; /* single malloc for tree space */ - Bytef *window; /* sliding window */ - Bytef *end; /* one byte after sliding window */ - Bytef *read; /* window read pointer */ - Bytef *write; /* window write pointer */ - check_func checkfn; /* check function */ - uLong check; /* check on output */ - -}; - - -/* defines for inflate input/output */ -/* update pointers and return */ -#define UPDBITS {s->bitb=b;s->bitk=k;} -#define UPDIN {z->avail_in=n;z->total_in+=p-z->next_in;z->next_in=p;} -#define UPDOUT {s->write=q;} -#define UPDATE {UPDBITS UPDIN UPDOUT} -#define LEAVE {UPDATE return inflate_flush(s,z,r);} -/* get bytes and bits */ -#define LOADIN {p=z->next_in;n=z->avail_in;b=s->bitb;k=s->bitk;} -#define NEEDBYTE {if(n)r=Z_OK;else LEAVE} -#define NEXTBYTE (n--,*p++) -#define NEEDBITS(j) {while(k<(j)){NEEDBYTE;b|=((uLong)NEXTBYTE)<>=(j);k-=(j);} -/* output bytes */ -#define WAVAIL (uInt)(qread?s->read-q-1:s->end-q) -#define LOADOUT {q=s->write;m=(uInt)WAVAIL;} -#define WRAP {if(q==s->end&&s->read!=s->window){q=s->window;m=(uInt)WAVAIL;}} -#define FLUSH {UPDOUT r=inflate_flush(s,z,r); LOADOUT} -#define NEEDOUT {if(m==0){WRAP if(m==0){FLUSH WRAP if(m==0) LEAVE}}r=Z_OK;} -#define OUTBYTE(a) {*q++=(Byte)(a);m--;} -/* load local pointers */ -#define LOAD {LOADIN LOADOUT} - -/* masks for lower bits (size given to avoid silly warnings with Visual C++) */ -extern uInt inflate_mask[17]; - -/* copy as much as possible from the sliding window to the output area */ -extern int inflate_flush OF(( - inflate_blocks_statef *, - z_streamp , - int)); - -struct internal_state {int dummy;}; /* for buggy compilers */ - -#endif diff --git a/zlib/maketree.c b/zlib/maketree.c deleted file mode 100644 index 949d7864..00000000 --- a/zlib/maketree.c +++ /dev/null @@ -1,85 +0,0 @@ -/* maketree.c -- make inffixed.h table for decoding fixed codes - * Copyright (C) 1998 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* 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. - */ - -/* This program is included in the distribution for completeness. - You do not need to compile or run this program since inffixed.h - is already included in the distribution. To use this program - you need to compile zlib with BUILDFIXED defined and then compile - and link this program with the zlib library. Then the output of - this program can be piped to inffixed.h. */ - -#include -#include -#include "zutil.h" -#include "inftrees.h" - -/* simplify the use of the inflate_huft type with some defines */ -#define exop word.what.Exop -#define bits word.what.Bits - -/* generate initialization table for an inflate_huft structure array */ -void maketree(uInt b, inflate_huft *t) -{ - int i, e; - - i = 0; - while (1) - { - e = t[i].exop; - if (e && (e & (16+64)) == 0) /* table pointer */ - { - fprintf(stderr, "maketree: cannot initialize sub-tables!\n"); - exit(1); - } - if (i % 4 == 0) - printf("\n "); - printf(" {{{%u,%u}},%u}", t[i].exop, t[i].bits, t[i].base); - if (++i == (1< -#include "zlib.h" - -#ifdef STDC -# include -# include -#else - extern void exit OF((int)); -#endif - -#ifdef USE_MMAP -# include -# include -# include -#endif - -#if defined(MSDOS) || defined(OS2) || defined(WIN32) -# include -# include -# define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY) -#else -# define SET_BINARY_MODE(file) -#endif - -#ifdef VMS -# define unlink delete -# define GZ_SUFFIX "-gz" -#endif -#ifdef RISCOS -# define unlink remove -# define GZ_SUFFIX "-gz" -# define fileno(file) file->__file -#endif -#if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os -# include /* for fileno */ -#endif - -#ifndef WIN32 /* unlink already in stdio.h for WIN32 */ - extern int unlink OF((const char *)); -#endif - -#ifndef GZ_SUFFIX -# define GZ_SUFFIX ".gz" -#endif -#define SUFFIX_LEN (sizeof(GZ_SUFFIX)-1) - -#define BUFLEN 16384 -#define MAX_NAME_LEN 1024 - -#ifdef MAXSEG_64K -# define local static - /* Needed for systems with limitation on stack size. */ -#else -# define local -#endif - -char *prog; - -void error OF((const char *msg)); -void gz_compress OF((FILE *in, gzFile out)); -#ifdef USE_MMAP -int gz_compress_mmap OF((FILE *in, gzFile out)); -#endif -void gz_uncompress OF((gzFile in, FILE *out)); -void file_compress OF((char *file, char *mode)); -void file_uncompress OF((char *file)); -int main OF((int argc, char *argv[])); - -/* =========================================================================== - * Display error message and exit - */ -void error(msg) - const char *msg; -{ - fprintf(stderr, "%s: %s\n", prog, msg); - exit(1); -} - -/* =========================================================================== - * Compress input to output then close both files. - */ - -void gz_compress(in, out) - FILE *in; - gzFile out; -{ - local char buf[BUFLEN]; - int len; - int err; - -#ifdef USE_MMAP - /* Try first compressing with mmap. If mmap fails (minigzip used in a - * pipe), use the normal fread loop. - */ - if (gz_compress_mmap(in, out) == Z_OK) return; -#endif - for (;;) { - len = fread(buf, 1, sizeof(buf), in); - if (ferror(in)) { - perror("fread"); - exit(1); - } - if (len == 0) break; - - if (gzwrite(out, buf, (unsigned)len) != len) error(gzerror(out, &err)); - } - fclose(in); - if (gzclose(out) != Z_OK) error("failed gzclose"); -} - -#ifdef USE_MMAP /* MMAP version, Miguel Albrecht */ - -/* Try compressing the input file at once using mmap. Return Z_OK if - * if success, Z_ERRNO otherwise. - */ -int gz_compress_mmap(in, out) - FILE *in; - gzFile out; -{ - int len; - int err; - int ifd = fileno(in); - caddr_t buf; /* mmap'ed buffer for the entire input file */ - off_t buf_len; /* length of the input file */ - struct stat sb; - - /* Determine the size of the file, needed for mmap: */ - if (fstat(ifd, &sb) < 0) return Z_ERRNO; - buf_len = sb.st_size; - if (buf_len <= 0) return Z_ERRNO; - - /* Now do the actual mmap: */ - buf = mmap((caddr_t) 0, buf_len, PROT_READ, MAP_SHARED, ifd, (off_t)0); - if (buf == (caddr_t)(-1)) return Z_ERRNO; - - /* Compress the whole file at once: */ - len = gzwrite(out, (char *)buf, (unsigned)buf_len); - - if (len != (int)buf_len) error(gzerror(out, &err)); - - munmap(buf, buf_len); - fclose(in); - if (gzclose(out) != Z_OK) error("failed gzclose"); - return Z_OK; -} -#endif /* USE_MMAP */ - -/* =========================================================================== - * Uncompress input to output then close both files. - */ -void gz_uncompress(in, out) - gzFile in; - FILE *out; -{ - local char buf[BUFLEN]; - int len; - int err; - - for (;;) { - len = gzread(in, buf, sizeof(buf)); - if (len < 0) error (gzerror(in, &err)); - if (len == 0) break; - - if ((int)fwrite(buf, 1, (unsigned)len, out) != len) { - error("failed fwrite"); - } - } - if (fclose(out)) error("failed fclose"); - - if (gzclose(in) != Z_OK) error("failed gzclose"); -} - - -/* =========================================================================== - * Compress the given file: create a corresponding .gz file and remove the - * original. - */ -void file_compress(file, mode) - char *file; - char *mode; -{ - local char outfile[MAX_NAME_LEN]; - FILE *in; - gzFile out; - - strcpy(outfile, file); - strcat(outfile, GZ_SUFFIX); - - in = fopen(file, "rb"); - if (in == NULL) { - perror(file); - exit(1); - } - out = gzopen(outfile, mode); - if (out == NULL) { - fprintf(stderr, "%s: can't gzopen %s\n", prog, outfile); - exit(1); - } - gz_compress(in, out); - - unlink(file); -} - - -/* =========================================================================== - * Uncompress the given file and remove the original. - */ -void file_uncompress(file) - char *file; -{ - local char buf[MAX_NAME_LEN]; - char *infile, *outfile; - FILE *out; - gzFile in; - int len = strlen(file); - - strcpy(buf, file); - - if (len > SUFFIX_LEN && strcmp(file+len-SUFFIX_LEN, GZ_SUFFIX) == 0) { - infile = file; - outfile = buf; - outfile[len-3] = '\0'; - } else { - outfile = file; - infile = buf; - strcat(infile, GZ_SUFFIX); - } - in = gzopen(infile, "rb"); - if (in == NULL) { - fprintf(stderr, "%s: can't gzopen %s\n", prog, infile); - exit(1); - } - out = fopen(outfile, "wb"); - if (out == NULL) { - perror(file); - exit(1); - } - - gz_uncompress(in, out); - - unlink(infile); -} - - -/* =========================================================================== - * Usage: minigzip [-d] [-f] [-h] [-1 to -9] [files...] - * -d : decompress - * -f : compress with Z_FILTERED - * -h : compress with Z_HUFFMAN_ONLY - * -1 to -9 : compression level - */ - -int main(argc, argv) - int argc; - char *argv[]; -{ - int uncompr = 0; - gzFile file; - char outmode[20]; - - strcpy(outmode, "wb6 "); - - prog = argv[0]; - argc--, argv++; - - while (argc > 0) { - if (strcmp(*argv, "-d") == 0) - uncompr = 1; - else if (strcmp(*argv, "-f") == 0) - outmode[3] = 'f'; - else if (strcmp(*argv, "-h") == 0) - outmode[3] = 'h'; - else if ((*argv)[0] == '-' && (*argv)[1] >= '1' && (*argv)[1] <= '9' && - (*argv)[2] == 0) - outmode[2] = (*argv)[1]; - else - break; - argc--, argv++; - } - if (argc == 0) { - SET_BINARY_MODE(stdin); - SET_BINARY_MODE(stdout); - if (uncompr) { - file = gzdopen(fileno(stdin), "rb"); - if (file == NULL) error("can't gzdopen stdin"); - gz_uncompress(file, stdout); - } else { - file = gzdopen(fileno(stdout), outmode); - if (file == NULL) error("can't gzdopen stdout"); - gz_compress(stdin, file); - } - } else { - do { - if (uncompr) { - file_uncompress(*argv); - } else { - file_compress(*argv, outmode); - } - } while (argv++, --argc); - } - exit(0); - return 0; /* to avoid warning */ -} diff --git a/zlib/trees.c b/zlib/trees.c deleted file mode 100644 index f01fb30d..00000000 --- a/zlib/trees.c +++ /dev/null @@ -1,1214 +0,0 @@ -/* trees.c -- output deflated data using Huffman coding - * Copyright (C) 1995-1998 Jean-loup Gailly - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* - * ALGORITHM - * - * The "deflation" process uses several Huffman trees. The more - * common source values are represented by shorter bit sequences. - * - * Each code tree is stored in a compressed form which is itself - * a Huffman encoding of the lengths of all the code strings (in - * ascending order by source values). The actual code strings are - * reconstructed from the lengths in the inflate process, as described - * in the deflate specification. - * - * REFERENCES - * - * Deutsch, L.P.,"'Deflate' Compressed Data Format Specification". - * Available in ftp.uu.net:/pub/archiving/zip/doc/deflate-1.1.doc - * - * Storer, James A. - * Data Compression: Methods and Theory, pp. 49-50. - * Computer Science Press, 1988. ISBN 0-7167-8156-5. - * - * Sedgewick, R. - * Algorithms, p290. - * Addison-Wesley, 1983. ISBN 0-201-06672-6. - */ - -/* @(#) $Id$ */ - -/* #define GEN_TREES_H */ - -#include "deflate.h" - -#ifdef DEBUG -# include -#endif - -/* =========================================================================== - * Constants - */ - -#define MAX_BL_BITS 7 -/* Bit length codes must not exceed MAX_BL_BITS bits */ - -#define END_BLOCK 256 -/* end of block literal code */ - -#define REP_3_6 16 -/* repeat previous bit length 3-6 times (2 bits of repeat count) */ - -#define REPZ_3_10 17 -/* repeat a zero length 3-10 times (3 bits of repeat count) */ - -#define REPZ_11_138 18 -/* repeat a zero length 11-138 times (7 bits of repeat count) */ - -local const int extra_lbits[LENGTH_CODES] /* extra bits for each length code */ - = {0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0}; - -local const int extra_dbits[D_CODES] /* extra bits for each distance code */ - = {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; - -local const int extra_blbits[BL_CODES]/* extra bits for each bit length code */ - = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7}; - -local const uch bl_order[BL_CODES] - = {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15}; -/* The lengths of the bit length codes are sent in order of decreasing - * 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. - */ - -#define DIST_CODE_LEN 512 /* see definition of array dist_code below */ - -#if defined(GEN_TREES_H) || !defined(STDC) -/* non ANSI compilers may not accept trees.h */ - -local ct_data static_ltree[L_CODES+2]; -/* The static literal tree. Since the bit lengths are imposed, there is no - * need for the L_CODES extra codes used during heap construction. However - * The codes 286 and 287 are needed to build a canonical tree (see _tr_init - * below). - */ - -local ct_data static_dtree[D_CODES]; -/* The static distance tree. (Actually a trivial tree since all codes use - * 5 bits.) - */ - -uch _dist_code[DIST_CODE_LEN]; -/* Distance codes. The first 256 values correspond to the distances - * 3 .. 258, the last 256 values correspond to the top 8 bits of - * the 15 bit distances. - */ - -uch _length_code[MAX_MATCH-MIN_MATCH+1]; -/* length code for each normalized match length (0 == MIN_MATCH) */ - -local int base_length[LENGTH_CODES]; -/* First normalized length for each code (0 = MIN_MATCH) */ - -local int base_dist[D_CODES]; -/* First normalized distance for each code (0 = distance of 1) */ - -#else -# include "trees.h" -#endif /* GEN_TREES_H */ - -struct static_tree_desc_s { - const ct_data *static_tree; /* static tree or NULL */ - const intf *extra_bits; /* extra bits for each code or NULL */ - int extra_base; /* base index for extra_bits */ - int elems; /* max number of elements in the tree */ - int max_length; /* max bit length for the codes */ -}; - -local static_tree_desc static_l_desc = -{static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS}; - -local static_tree_desc static_d_desc = -{static_dtree, extra_dbits, 0, D_CODES, MAX_BITS}; - -local static_tree_desc static_bl_desc = -{(const ct_data *)0, extra_blbits, 0, BL_CODES, MAX_BL_BITS}; - -/* =========================================================================== - * Local (static) routines in this file. - */ - -local void tr_static_init OF((void)); -local void init_block OF((deflate_state *s)); -local void pqdownheap OF((deflate_state *s, ct_data *tree, int k)); -local void gen_bitlen OF((deflate_state *s, tree_desc *desc)); -local void gen_codes OF((ct_data *tree, int max_code, ushf *bl_count)); -local void build_tree OF((deflate_state *s, tree_desc *desc)); -local void scan_tree OF((deflate_state *s, ct_data *tree, int max_code)); -local void send_tree OF((deflate_state *s, ct_data *tree, int max_code)); -local int build_bl_tree OF((deflate_state *s)); -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 unsigned bi_reverse OF((unsigned value, int length)); -local void bi_windup OF((deflate_state *s)); -local void bi_flush OF((deflate_state *s)); -local void copy_block OF((deflate_state *s, charf *buf, unsigned len, - int header)); - -#ifdef GEN_TREES_H -local void gen_trees_header OF((void)); -#endif - -#ifndef DEBUG -# define send_code(s, c, tree) send_bits(s, tree[c].Code, tree[c].Len) - /* Send a code of the given tree. c and tree must not have side effects */ - -#else /* DEBUG */ -# define send_code(s, c, tree) \ - { if (z_verbose>2) fprintf(stderr,"\ncd %3d ",(c)); \ - send_bits(s, tree[c].Code, tree[c].Len); } -#endif - -/* =========================================================================== - * Output a short LSB first on the stream. - * IN assertion: there is enough room in pendingBuf. - */ -#define put_short(s, w) { \ - put_byte(s, (uch)((w) & 0xff)); \ - put_byte(s, (uch)((ush)(w) >> 8)); \ -} - -/* =========================================================================== - * Send a value on a given number of bits. - * IN assertion: length <= 16 and value fits in length bits. - */ -#ifdef DEBUG -local void send_bits OF((deflate_state *s, int value, int length)); - -local void send_bits(s, value, length) - deflate_state *s; - int value; /* value to send */ - int length; /* number of bits */ -{ - Tracevv((stderr," l %2d v %4x ", length, value)); - Assert(length > 0 && length <= 15, "invalid length"); - s->bits_sent += (ulg)length; - - /* If not enough room in bi_buf, use (valid) bits from bi_buf and - * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid)) - * unused bits in value. - */ - if (s->bi_valid > (int)Buf_size - length) { - s->bi_buf |= (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_valid += length; - } -} -#else /* !DEBUG */ - -#define 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);\ - put_short(s, s->bi_buf);\ - 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_valid += len;\ - }\ -} -#endif /* DEBUG */ - - -#define MAX(a,b) (a >= b ? a : b) -/* the arguments must not have side effects */ - -/* =========================================================================== - * Initialize the various 'constant' tables. - */ -local void tr_static_init() -{ -#if defined(GEN_TREES_H) || !defined(STDC) - static int static_init_done = 0; - int n; /* iterates over tree elements */ - int bits; /* bit counter */ - int length; /* length value */ - int code; /* code value */ - int dist; /* distance index */ - ush bl_count[MAX_BITS+1]; - /* number of codes at each bit length for an optimal tree */ - - if (static_init_done) return; - - /* For some embedded targets, global variables are not initialized: */ - 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; - - /* Initialize the mapping length (0..255) -> length code (0..28) */ - length = 0; - for (code = 0; code < LENGTH_CODES-1; code++) { - base_length[code] = length; - for (n = 0; n < (1< dist code (0..29) */ - dist = 0; - for (code = 0 ; code < 16; code++) { - base_dist[code] = dist; - for (n = 0; n < (1<>= 7; /* from now on, all distances are divided by 128 */ - for ( ; code < D_CODES; code++) { - base_dist[code] = dist << 7; - for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) { - _dist_code[256 + dist++] = (uch)code; - } - } - Assert (dist == 256, "tr_static_init: 256+dist != 512"); - - /* Construct the codes of the static literal tree */ - for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0; - n = 0; - while (n <= 143) static_ltree[n++].Len = 8, bl_count[8]++; - while (n <= 255) static_ltree[n++].Len = 9, bl_count[9]++; - while (n <= 279) static_ltree[n++].Len = 7, bl_count[7]++; - while (n <= 287) static_ltree[n++].Len = 8, bl_count[8]++; - /* Codes 286 and 287 do not exist, but we must include them in the - * tree construction to get a canonical Huffman tree (longest code - * all ones) - */ - gen_codes((ct_data *)static_ltree, L_CODES+1, bl_count); - - /* The static distance tree is trivial: */ - for (n = 0; n < D_CODES; n++) { - static_dtree[n].Len = 5; - static_dtree[n].Code = bi_reverse((unsigned)n, 5); - } - static_init_done = 1; - -# ifdef GEN_TREES_H - gen_trees_header(); -# endif -#endif /* defined(GEN_TREES_H) || !defined(STDC) */ -} - -/* =========================================================================== - * Genererate the file trees.h describing the static trees. - */ -#ifdef GEN_TREES_H -# ifndef DEBUG -# include -# endif - -# define SEPARATOR(i, last, width) \ - ((i) == (last)? "\n};\n\n" : \ - ((i) % (width) == (width)-1 ? ",\n" : ", ")) - -void gen_trees_header() -{ - FILE *header = fopen("trees.h", "w"); - int i; - - Assert (header != NULL, "Can't open trees.h"); - fprintf(header, - "/* header created automatically with -DGEN_TREES_H */\n\n"); - - fprintf(header, "local const ct_data static_ltree[L_CODES+2] = {\n"); - for (i = 0; i < L_CODES+2; i++) { - fprintf(header, "{{%3u},{%3u}}%s", static_ltree[i].Code, - static_ltree[i].Len, SEPARATOR(i, L_CODES+1, 5)); - } - - fprintf(header, "local const ct_data static_dtree[D_CODES] = {\n"); - for (i = 0; i < D_CODES; i++) { - fprintf(header, "{{%2u},{%2u}}%s", static_dtree[i].Code, - static_dtree[i].Len, SEPARATOR(i, D_CODES-1, 5)); - } - - fprintf(header, "const uch _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"); - for (i = 0; i < MAX_MATCH-MIN_MATCH+1; i++) { - fprintf(header, "%2u%s", _length_code[i], - SEPARATOR(i, MAX_MATCH-MIN_MATCH, 20)); - } - - fprintf(header, "local const int base_length[LENGTH_CODES] = {\n"); - for (i = 0; i < LENGTH_CODES; i++) { - fprintf(header, "%1u%s", base_length[i], - SEPARATOR(i, LENGTH_CODES-1, 20)); - } - - fprintf(header, "local const int base_dist[D_CODES] = {\n"); - for (i = 0; i < D_CODES; i++) { - fprintf(header, "%5u%s", base_dist[i], - SEPARATOR(i, D_CODES-1, 10)); - } - - fclose(header); -} -#endif /* GEN_TREES_H */ - -/* =========================================================================== - * Initialize the tree data structures for a new zlib stream. - */ -void _tr_init(s) - deflate_state *s; -{ - tr_static_init(); - - s->l_desc.dyn_tree = s->dyn_ltree; - s->l_desc.stat_desc = &static_l_desc; - - s->d_desc.dyn_tree = s->dyn_dtree; - s->d_desc.stat_desc = &static_d_desc; - - s->bl_desc.dyn_tree = s->bl_tree; - s->bl_desc.stat_desc = &static_bl_desc; - - 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; -#endif - - /* Initialize the first block of the first file: */ - init_block(s); -} - -/* =========================================================================== - * Initialize a new block. - */ -local void init_block(s) - deflate_state *s; -{ - int n; /* iterates over tree elements */ - - /* Initialize the trees. */ - for (n = 0; n < L_CODES; n++) s->dyn_ltree[n].Freq = 0; - for (n = 0; n < D_CODES; n++) s->dyn_dtree[n].Freq = 0; - for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0; - - s->dyn_ltree[END_BLOCK].Freq = 1; - s->opt_len = s->static_len = 0L; - s->last_lit = s->matches = 0; -} - -#define SMALLEST 1 -/* Index within the heap array of least frequent node in the Huffman tree */ - - -/* =========================================================================== - * Remove the smallest element from the heap and recreate the heap with - * one less element. Updates heap and heap_len. - */ -#define pqremove(s, tree, top) \ -{\ - top = s->heap[SMALLEST]; \ - s->heap[SMALLEST] = s->heap[s->heap_len--]; \ - pqdownheap(s, tree, SMALLEST); \ -} - -/* =========================================================================== - * Compares to subtrees, using the tree depth as tie breaker when - * the subtrees have equal frequency. This minimizes the worst case length. - */ -#define smaller(tree, n, m, depth) \ - (tree[n].Freq < tree[m].Freq || \ - (tree[n].Freq == tree[m].Freq && depth[n] <= depth[m])) - -/* =========================================================================== - * Restore the heap property by moving down the tree starting at node k, - * exchanging a node with the smallest of its two sons if necessary, stopping - * when the heap property is re-established (each father smaller than its - * two sons). - */ -local void pqdownheap(s, tree, k) - deflate_state *s; - ct_data *tree; /* the tree to restore */ - int k; /* node to move down */ -{ - int v = s->heap[k]; - int j = k << 1; /* left son of k */ - while (j <= s->heap_len) { - /* Set j to the smallest of the two sons: */ - if (j < s->heap_len && - smaller(tree, s->heap[j+1], s->heap[j], s->depth)) { - j++; - } - /* Exit if v is smaller than both sons */ - if (smaller(tree, v, s->heap[j], s->depth)) break; - - /* Exchange v with the smallest son */ - s->heap[k] = s->heap[j]; k = j; - - /* And continue down the tree, setting j to the left son of k */ - j <<= 1; - } - s->heap[k] = v; -} - -/* =========================================================================== - * Compute the optimal bit lengths for a tree and update the total bit length - * for the current block. - * IN assertion: the fields freq and dad are set, heap[heap_max] and - * above are the tree nodes sorted by increasing frequency. - * OUT assertions: the field len is set to the optimal bit length, the - * array bl_count contains the frequencies for each bit length. - * The length opt_len is updated; static_len is also updated if stree is - * not null. - */ -local void gen_bitlen(s, desc) - deflate_state *s; - tree_desc *desc; /* the tree descriptor */ -{ - ct_data *tree = desc->dyn_tree; - int max_code = desc->max_code; - const ct_data *stree = desc->stat_desc->static_tree; - const intf *extra = desc->stat_desc->extra_bits; - int base = desc->stat_desc->extra_base; - int max_length = desc->stat_desc->max_length; - int h; /* heap index */ - int n, m; /* iterate over the tree elements */ - int bits; /* bit length */ - int xbits; /* extra bits */ - ush f; /* frequency */ - int overflow = 0; /* number of elements with bit length too large */ - - for (bits = 0; bits <= MAX_BITS; bits++) s->bl_count[bits] = 0; - - /* In a first pass, compute the optimal bit lengths (which may - * overflow in the case of the bit length tree). - */ - tree[s->heap[s->heap_max]].Len = 0; /* root of the heap */ - - for (h = s->heap_max+1; h < HEAP_SIZE; h++) { - n = s->heap[h]; - bits = tree[tree[n].Dad].Len + 1; - if (bits > max_length) bits = max_length, overflow++; - tree[n].Len = (ush)bits; - /* We overwrite tree[n].Dad which is no longer needed */ - - if (n > max_code) continue; /* not a leaf node */ - - s->bl_count[bits]++; - xbits = 0; - if (n >= base) xbits = extra[n-base]; - f = tree[n].Freq; - s->opt_len += (ulg)f * (bits + xbits); - if (stree) s->static_len += (ulg)f * (stree[n].Len + xbits); - } - if (overflow == 0) return; - - Trace((stderr,"\nbit length overflow\n")); - /* This happens for example on obj2 and pic of the Calgary corpus */ - - /* Find the first bit length which could increase: */ - do { - bits = max_length-1; - while (s->bl_count[bits] == 0) bits--; - s->bl_count[bits]--; /* move one leaf down the tree */ - s->bl_count[bits+1] += 2; /* move one overflow item as its brother */ - s->bl_count[max_length]--; - /* The brother of the overflow item also moves one step up, - * but this does not affect bl_count[max_length] - */ - overflow -= 2; - } while (overflow > 0); - - /* Now recompute all bit lengths, scanning in increasing frequency. - * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all - * lengths instead of fixing only the wrong ones. This idea is taken - * from 'ar' written by Haruhiko Okumura.) - */ - for (bits = max_length; bits != 0; bits--) { - n = s->bl_count[bits]; - while (n != 0) { - m = s->heap[--h]; - if (m > max_code) continue; - if (tree[m].Len != (unsigned) bits) { - Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); - s->opt_len += ((long)bits - (long)tree[m].Len) - *(long)tree[m].Freq; - tree[m].Len = (ush)bits; - } - n--; - } - } -} - -/* =========================================================================== - * Generate the codes for a given tree and bit counts (which need not be - * optimal). - * IN assertion: the array bl_count contains the bit length statistics for - * the given tree and the field len is set for all tree elements. - * OUT assertion: the field code is set for all tree elements of non - * zero code length. - */ -local void gen_codes (tree, max_code, bl_count) - ct_data *tree; /* the tree to decorate */ - int max_code; /* largest code with non zero frequency */ - ushf *bl_count; /* number of codes at each bit length */ -{ - ush next_code[MAX_BITS+1]; /* next code value for each bit length */ - ush code = 0; /* running code value */ - int bits; /* bit index */ - int n; /* code index */ - - /* The distribution counts are first used to generate the code values - * without bit reversal. - */ - for (bits = 1; bits <= MAX_BITS; bits++) { - next_code[bits] = code = (code + bl_count[bits-1]) << 1; - } - /* Check that the bit counts in bl_count are consistent. The last code - * must be all ones. - */ - Assert (code + bl_count[MAX_BITS]-1 == (1<dyn_tree; - const ct_data *stree = desc->stat_desc->static_tree; - int elems = desc->stat_desc->elems; - int n, m; /* iterate over heap elements */ - int max_code = -1; /* largest code with non zero frequency */ - int node; /* new node being created */ - - /* Construct the initial heap, with least frequent element in - * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. - * heap[0] is not used. - */ - s->heap_len = 0, s->heap_max = HEAP_SIZE; - - for (n = 0; n < elems; n++) { - if (tree[n].Freq != 0) { - s->heap[++(s->heap_len)] = max_code = n; - s->depth[n] = 0; - } else { - tree[n].Len = 0; - } - } - - /* The pkzip format requires that at least one distance code exists, - * and that at least one bit should be sent even if there is only one - * possible code. So to avoid special checks later on we force at least - * two codes of non zero frequency. - */ - while (s->heap_len < 2) { - node = s->heap[++(s->heap_len)] = (max_code < 2 ? ++max_code : 0); - tree[node].Freq = 1; - s->depth[node] = 0; - s->opt_len--; if (stree) s->static_len -= stree[node].Len; - /* node is 0 or 1 so it does not have extra bits */ - } - desc->max_code = max_code; - - /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, - * establish sub-heaps of increasing lengths: - */ - for (n = s->heap_len/2; n >= 1; n--) pqdownheap(s, tree, n); - - /* Construct the Huffman tree by repeatedly combining the least two - * frequent nodes. - */ - node = elems; /* next internal node of the tree */ - do { - pqremove(s, tree, n); /* n = node of least frequency */ - m = s->heap[SMALLEST]; /* m = node of next least frequency */ - - s->heap[--(s->heap_max)] = n; /* keep the nodes sorted by frequency */ - s->heap[--(s->heap_max)] = m; - - /* Create a new node father of n and m */ - tree[node].Freq = tree[n].Freq + tree[m].Freq; - s->depth[node] = (uch) (MAX(s->depth[n], s->depth[m]) + 1); - tree[n].Dad = tree[m].Dad = (ush)node; -#ifdef DUMP_BL_TREE - if (tree == s->bl_tree) { - fprintf(stderr,"\nnode %d(%d), sons %d(%d) %d(%d)", - node, tree[node].Freq, n, tree[n].Freq, m, tree[m].Freq); - } -#endif - /* and insert the new node in the heap */ - s->heap[SMALLEST] = node++; - pqdownheap(s, tree, SMALLEST); - - } while (s->heap_len >= 2); - - s->heap[--(s->heap_max)] = s->heap[SMALLEST]; - - /* At this point, the fields freq and dad are set. We can now - * generate the bit lengths. - */ - gen_bitlen(s, (tree_desc *)desc); - - /* The field len is now set, we can generate the bit codes */ - gen_codes ((ct_data *)tree, max_code, s->bl_count); -} - -/* =========================================================================== - * Scan a literal or distance tree to determine the frequencies of the codes - * in the bit length tree. - */ -local void scan_tree (s, tree, max_code) - deflate_state *s; - ct_data *tree; /* the tree to be scanned */ - int max_code; /* and its largest code of non zero frequency */ -{ - int n; /* iterates over all tree elements */ - int prevlen = -1; /* last emitted length */ - int curlen; /* length of current code */ - int nextlen = tree[0].Len; /* length of next code */ - int count = 0; /* repeat count of the current code */ - int max_count = 7; /* max repeat count */ - int min_count = 4; /* min repeat count */ - - if (nextlen == 0) max_count = 138, min_count = 3; - tree[max_code+1].Len = (ush)0xffff; /* guard */ - - for (n = 0; n <= max_code; n++) { - curlen = nextlen; nextlen = tree[n+1].Len; - if (++count < max_count && curlen == nextlen) { - continue; - } else if (count < min_count) { - s->bl_tree[curlen].Freq += count; - } else if (curlen != 0) { - if (curlen != prevlen) s->bl_tree[curlen].Freq++; - s->bl_tree[REP_3_6].Freq++; - } else if (count <= 10) { - s->bl_tree[REPZ_3_10].Freq++; - } else { - s->bl_tree[REPZ_11_138].Freq++; - } - count = 0; prevlen = curlen; - if (nextlen == 0) { - max_count = 138, min_count = 3; - } else if (curlen == nextlen) { - max_count = 6, min_count = 3; - } else { - max_count = 7, min_count = 4; - } - } -} - -/* =========================================================================== - * Send a literal or distance tree in compressed form, using the codes in - * bl_tree. - */ -local void send_tree (s, tree, max_code) - deflate_state *s; - ct_data *tree; /* the tree to be scanned */ - int max_code; /* and its largest code of non zero frequency */ -{ - int n; /* iterates over all tree elements */ - int prevlen = -1; /* last emitted length */ - int curlen; /* length of current code */ - int nextlen = tree[0].Len; /* length of next code */ - int count = 0; /* repeat count of the current code */ - int max_count = 7; /* max repeat count */ - int min_count = 4; /* min repeat count */ - - /* tree[max_code+1].Len = -1; */ /* guard already set */ - if (nextlen == 0) max_count = 138, min_count = 3; - - for (n = 0; n <= max_code; n++) { - curlen = nextlen; nextlen = tree[n+1].Len; - if (++count < max_count && curlen == nextlen) { - continue; - } else if (count < min_count) { - do { send_code(s, curlen, s->bl_tree); } while (--count != 0); - - } else if (curlen != 0) { - if (curlen != prevlen) { - send_code(s, curlen, s->bl_tree); count--; - } - Assert(count >= 3 && count <= 6, " 3_6?"); - send_code(s, REP_3_6, s->bl_tree); send_bits(s, count-3, 2); - - } else if (count <= 10) { - send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count-3, 3); - - } else { - send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count-11, 7); - } - count = 0; prevlen = curlen; - if (nextlen == 0) { - max_count = 138, min_count = 3; - } else if (curlen == nextlen) { - max_count = 6, min_count = 3; - } else { - max_count = 7, min_count = 4; - } - } -} - -/* =========================================================================== - * Construct the Huffman tree for the bit lengths and return the index in - * bl_order of the last bit length code to send. - */ -local int build_bl_tree(s) - deflate_state *s; -{ - int max_blindex; /* index of last bit length code of non zero freq */ - - /* Determine the bit length frequencies for literal and distance trees */ - scan_tree(s, (ct_data *)s->dyn_ltree, s->l_desc.max_code); - scan_tree(s, (ct_data *)s->dyn_dtree, s->d_desc.max_code); - - /* Build the bit length tree: */ - build_tree(s, (tree_desc *)(&(s->bl_desc))); - /* opt_len now includes the length of the tree representations, except - * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. - */ - - /* Determine the number of bit length codes to send. The pkzip format - * requires that at least 4 bit length codes be sent. (appnote.txt says - * 3 but the actual value used is 4.) - */ - for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) { - if (s->bl_tree[bl_order[max_blindex]].Len != 0) break; - } - /* Update opt_len to include the bit length tree and counts */ - s->opt_len += 3*(max_blindex+1) + 5+5+4; - Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", - s->opt_len, s->static_len)); - - return max_blindex; -} - -/* =========================================================================== - * Send the header for a block using dynamic Huffman trees: the counts, the - * lengths of the bit length codes, the literal tree and the distance tree. - * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. - */ -local void send_all_trees(s, lcodes, dcodes, blcodes) - deflate_state *s; - int lcodes, dcodes, blcodes; /* number of codes for each tree */ -{ - int rank; /* index in bl_order */ - - Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); - Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, - "too many codes"); - Tracev((stderr, "\nbl counts: ")); - send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */ - send_bits(s, dcodes-1, 5); - send_bits(s, blcodes-4, 4); /* not -3 as stated in appnote.txt */ - for (rank = 0; rank < blcodes; rank++) { - Tracev((stderr, "\nbl code %2d ", bl_order[rank])); - send_bits(s, s->bl_tree[bl_order[rank]].Len, 3); - } - Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); - - send_tree(s, (ct_data *)s->dyn_ltree, lcodes-1); /* literal tree */ - Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); - - send_tree(s, (ct_data *)s->dyn_dtree, dcodes-1); /* distance tree */ - Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); -} - -/* =========================================================================== - * Send a stored block - */ -void _tr_stored_block(s, buf, stored_len, eof) - 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 */ -{ - send_bits(s, (STORED_BLOCK<<1)+eof, 3); /* send block type */ -#ifdef DEBUG - s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L; - s->compressed_len += (stored_len + 4) << 3; -#endif - copy_block(s, buf, (unsigned)stored_len, 1); /* with header */ -} - -/* =========================================================================== - * 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) - deflate_state *s; -{ - send_bits(s, STATIC_TREES<<1, 3); - send_code(s, END_BLOCK, static_ltree); -#ifdef DEBUG - 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) - 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 */ -{ - 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 */ - - /* Build the Huffman trees unless a stored block is forced */ - if (s->level > 0) { - - /* Check if the file is ascii or binary */ - if (s->data_type == Z_UNKNOWN) set_data_type(s); - - /* Construct the literal and distance trees */ - build_tree(s, (tree_desc *)(&(s->l_desc))); - Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, - s->static_len)); - - build_tree(s, (tree_desc *)(&(s->d_desc))); - Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, - s->static_len)); - /* At this point, opt_len and static_len are the total bit lengths of - * the compressed block data, excluding the tree representations. - */ - - /* Build the bit length tree for the above two trees, and get the index - * in bl_order of the last bit length code to send. - */ - max_blindex = build_bl_tree(s); - - /* Determine the best encoding. Compute first the block length in bytes*/ - opt_lenb = (s->opt_len+3+7)>>3; - static_lenb = (s->static_len+3+7)>>3; - - Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", - opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, - s->last_lit)); - - if (static_lenb <= opt_lenb) opt_lenb = static_lenb; - - } else { - Assert(buf != (char*)0, "lost buf"); - opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ - } - -#ifdef FORCE_STORED - if (buf != (char*)0) { /* force stored block */ -#else - if (stored_len+4 <= opt_lenb && buf != (char*)0) { - /* 4: two words for the lengths */ -#endif - /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. - * Otherwise we can't have processed more than WSIZE input bytes since - * the last block flush, because compression would have been - * 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); - -#ifdef FORCE_STATIC - } else if (static_lenb >= 0) { /* force static trees */ -#else - } else if (static_lenb == opt_lenb) { -#endif - send_bits(s, (STATIC_TREES<<1)+eof, 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_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); -#ifdef DEBUG - s->compressed_len += 3 + s->opt_len; -#endif - } - Assert (s->compressed_len == s->bits_sent, "bad compressed size"); - /* The above check is made mod 2^32, for files larger than 512 MB - * and uLong implemented on 32 bits. - */ - init_block(s); - - if (eof) { - 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)); -} - -/* =========================================================================== - * Save the match info and tally the frequency counts. Return true if - * the current block must be flushed. - */ -int _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) */ -{ - s->d_buf[s->last_lit] = (ush)dist; - s->l_buf[s->last_lit++] = (uch)lc; - if (dist == 0) { - /* lc is the unmatched char */ - s->dyn_ltree[lc].Freq++; - } else { - s->matches++; - /* Here, lc is the match length - MIN_MATCH */ - dist--; /* dist = match distance - 1 */ - Assert((ush)dist < (ush)MAX_DIST(s) && - (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && - (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); - - s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++; - s->dyn_dtree[d_code(dist)].Freq++; - } - -#ifdef TRUNCATE_BLOCK - /* Try to guess if it is profitable to stop the current block here */ - if ((s->last_lit & 0x1fff) == 0 && s->level > 2) { - /* Compute an upper bound for the compressed length */ - ulg out_length = (ulg)s->last_lit*8L; - ulg in_length = (ulg)((long)s->strstart - s->block_start); - int dcode; - for (dcode = 0; dcode < D_CODES; dcode++) { - out_length += (ulg)s->dyn_dtree[dcode].Freq * - (5L+extra_dbits[dcode]); - } - out_length >>= 3; - Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", - s->last_lit, in_length, out_length, - 100L - out_length*100L/in_length)); - if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1; - } -#endif - return (s->last_lit == s->lit_bufsize-1); - /* We avoid equality with lit_bufsize because of wraparound at 64K - * on 16 bit machines and because stored blocks are restricted to - * 64K-1 bytes. - */ -} - -/* =========================================================================== - * Send the block data compressed using the given Huffman trees - */ -local void compress_block(s, ltree, dtree) - deflate_state *s; - ct_data *ltree; /* literal tree */ - ct_data *dtree; /* distance tree */ -{ - unsigned dist; /* distance of matched string */ - int lc; /* match length or unmatched char (if dist == 0) */ - unsigned lx = 0; /* running index in l_buf */ - unsigned code; /* the code to send */ - int extra; /* number of extra bits to send */ - - if (s->last_lit != 0) do { - dist = s->d_buf[lx]; - lc = s->l_buf[lx++]; - if (dist == 0) { - send_code(s, lc, ltree); /* send a literal byte */ - Tracecv(isgraph(lc), (stderr," '%c' ", lc)); - } else { - /* Here, lc is the match length - MIN_MATCH */ - code = _length_code[lc]; - send_code(s, code+LITERALS+1, ltree); /* send the length code */ - extra = extra_lbits[code]; - if (extra != 0) { - lc -= base_length[code]; - send_bits(s, lc, extra); /* send the extra length bits */ - } - dist--; /* dist is now the match distance - 1 */ - code = d_code(dist); - Assert (code < D_CODES, "bad d_code"); - - send_code(s, code, dtree); /* send the distance code */ - extra = extra_dbits[code]; - if (extra != 0) { - dist -= base_dist[code]; - send_bits(s, dist, extra); /* send the extra distance bits */ - } - } /* literal or match pair ? */ - - /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ - Assert(s->pending < s->lit_bufsize + 2*lx, "pendingBuf overflow"); - - } while (lx < s->last_lit); - - send_code(s, END_BLOCK, ltree); - s->last_eob_len = ltree[END_BLOCK].Len; -} - -/* =========================================================================== - * Set the data type to ASCII or BINARY, using a crude approximation: - * binary if more than 20% of the bytes are <= 6 or >= 128, ascii otherwise. - * IN assertion: the fields freq of dyn_ltree are set and the total of all - * frequencies does not exceed 64K (to fit in an int on 16 bit machines). - */ -local void set_data_type(s) - deflate_state *s; -{ - int n = 0; - unsigned ascii_freq = 0; - unsigned bin_freq = 0; - while (n < 7) bin_freq += s->dyn_ltree[n++].Freq; - while (n < 128) ascii_freq += s->dyn_ltree[n++].Freq; - while (n < LITERALS) bin_freq += s->dyn_ltree[n++].Freq; - s->data_type = (Byte)(bin_freq > (ascii_freq >> 2) ? Z_BINARY : Z_ASCII); -} - -/* =========================================================================== - * Reverse the first len bits of a code, using straightforward code (a faster - * method would use a table) - * IN assertion: 1 <= len <= 15 - */ -local unsigned bi_reverse(code, len) - unsigned code; /* the value to invert */ - int len; /* its bit length */ -{ - register unsigned res = 0; - do { - res |= code & 1; - code >>= 1, res <<= 1; - } while (--len > 0); - return res >> 1; -} - -/* =========================================================================== - * Flush the bit buffer, keeping at most 7 bits in it. - */ -local void bi_flush(s) - deflate_state *s; -{ - if (s->bi_valid == 16) { - put_short(s, s->bi_buf); - s->bi_buf = 0; - s->bi_valid = 0; - } else if (s->bi_valid >= 8) { - put_byte(s, (Byte)s->bi_buf); - s->bi_buf >>= 8; - s->bi_valid -= 8; - } -} - -/* =========================================================================== - * Flush the bit buffer and align the output on a byte boundary - */ -local void bi_windup(s) - deflate_state *s; -{ - if (s->bi_valid > 8) { - put_short(s, s->bi_buf); - } else if (s->bi_valid > 0) { - put_byte(s, (Byte)s->bi_buf); - } - s->bi_buf = 0; - s->bi_valid = 0; -#ifdef DEBUG - s->bits_sent = (s->bits_sent+7) & ~7; -#endif -} - -/* =========================================================================== - * Copy a stored block, storing first the length and its - * one's complement if requested. - */ -local void copy_block(s, buf, len, header) - deflate_state *s; - charf *buf; /* the input data */ - unsigned len; /* its length */ - 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); - put_short(s, (ush)~len); -#ifdef DEBUG - s->bits_sent += 2*16; -#endif - } -#ifdef DEBUG - s->bits_sent += (ulg)len<<3; -#endif - while (len--) { - put_byte(s, *buf++); - } -} diff --git a/zlib/trees.h b/zlib/trees.h deleted file mode 100644 index 72facf90..00000000 --- a/zlib/trees.h +++ /dev/null @@ -1,128 +0,0 @@ -/* header created automatically with -DGEN_TREES_H */ - -local const ct_data static_ltree[L_CODES+2] = { -{{ 12},{ 8}}, {{140},{ 8}}, {{ 76},{ 8}}, {{204},{ 8}}, {{ 44},{ 8}}, -{{172},{ 8}}, {{108},{ 8}}, {{236},{ 8}}, {{ 28},{ 8}}, {{156},{ 8}}, -{{ 92},{ 8}}, {{220},{ 8}}, {{ 60},{ 8}}, {{188},{ 8}}, {{124},{ 8}}, -{{252},{ 8}}, {{ 2},{ 8}}, {{130},{ 8}}, {{ 66},{ 8}}, {{194},{ 8}}, -{{ 34},{ 8}}, {{162},{ 8}}, {{ 98},{ 8}}, {{226},{ 8}}, {{ 18},{ 8}}, -{{146},{ 8}}, {{ 82},{ 8}}, {{210},{ 8}}, {{ 50},{ 8}}, {{178},{ 8}}, -{{114},{ 8}}, {{242},{ 8}}, {{ 10},{ 8}}, {{138},{ 8}}, {{ 74},{ 8}}, -{{202},{ 8}}, {{ 42},{ 8}}, {{170},{ 8}}, {{106},{ 8}}, {{234},{ 8}}, -{{ 26},{ 8}}, {{154},{ 8}}, {{ 90},{ 8}}, {{218},{ 8}}, {{ 58},{ 8}}, -{{186},{ 8}}, {{122},{ 8}}, {{250},{ 8}}, {{ 6},{ 8}}, {{134},{ 8}}, -{{ 70},{ 8}}, {{198},{ 8}}, {{ 38},{ 8}}, {{166},{ 8}}, {{102},{ 8}}, -{{230},{ 8}}, {{ 22},{ 8}}, {{150},{ 8}}, {{ 86},{ 8}}, {{214},{ 8}}, -{{ 54},{ 8}}, {{182},{ 8}}, {{118},{ 8}}, {{246},{ 8}}, {{ 14},{ 8}}, -{{142},{ 8}}, {{ 78},{ 8}}, {{206},{ 8}}, {{ 46},{ 8}}, {{174},{ 8}}, -{{110},{ 8}}, {{238},{ 8}}, {{ 30},{ 8}}, {{158},{ 8}}, {{ 94},{ 8}}, -{{222},{ 8}}, {{ 62},{ 8}}, {{190},{ 8}}, {{126},{ 8}}, {{254},{ 8}}, -{{ 1},{ 8}}, {{129},{ 8}}, {{ 65},{ 8}}, {{193},{ 8}}, {{ 33},{ 8}}, -{{161},{ 8}}, {{ 97},{ 8}}, {{225},{ 8}}, {{ 17},{ 8}}, {{145},{ 8}}, -{{ 81},{ 8}}, {{209},{ 8}}, {{ 49},{ 8}}, {{177},{ 8}}, {{113},{ 8}}, -{{241},{ 8}}, {{ 9},{ 8}}, {{137},{ 8}}, {{ 73},{ 8}}, {{201},{ 8}}, -{{ 41},{ 8}}, {{169},{ 8}}, {{105},{ 8}}, {{233},{ 8}}, {{ 25},{ 8}}, -{{153},{ 8}}, {{ 89},{ 8}}, {{217},{ 8}}, {{ 57},{ 8}}, {{185},{ 8}}, -{{121},{ 8}}, {{249},{ 8}}, {{ 5},{ 8}}, {{133},{ 8}}, {{ 69},{ 8}}, -{{197},{ 8}}, {{ 37},{ 8}}, {{165},{ 8}}, {{101},{ 8}}, {{229},{ 8}}, -{{ 21},{ 8}}, {{149},{ 8}}, {{ 85},{ 8}}, {{213},{ 8}}, {{ 53},{ 8}}, -{{181},{ 8}}, {{117},{ 8}}, {{245},{ 8}}, {{ 13},{ 8}}, {{141},{ 8}}, -{{ 77},{ 8}}, {{205},{ 8}}, {{ 45},{ 8}}, {{173},{ 8}}, {{109},{ 8}}, -{{237},{ 8}}, {{ 29},{ 8}}, {{157},{ 8}}, {{ 93},{ 8}}, {{221},{ 8}}, -{{ 61},{ 8}}, {{189},{ 8}}, {{125},{ 8}}, {{253},{ 8}}, {{ 19},{ 9}}, -{{275},{ 9}}, {{147},{ 9}}, {{403},{ 9}}, {{ 83},{ 9}}, {{339},{ 9}}, -{{211},{ 9}}, {{467},{ 9}}, {{ 51},{ 9}}, {{307},{ 9}}, {{179},{ 9}}, -{{435},{ 9}}, {{115},{ 9}}, {{371},{ 9}}, {{243},{ 9}}, {{499},{ 9}}, -{{ 11},{ 9}}, {{267},{ 9}}, {{139},{ 9}}, {{395},{ 9}}, {{ 75},{ 9}}, -{{331},{ 9}}, {{203},{ 9}}, {{459},{ 9}}, {{ 43},{ 9}}, {{299},{ 9}}, -{{171},{ 9}}, {{427},{ 9}}, {{107},{ 9}}, {{363},{ 9}}, {{235},{ 9}}, -{{491},{ 9}}, {{ 27},{ 9}}, {{283},{ 9}}, {{155},{ 9}}, {{411},{ 9}}, -{{ 91},{ 9}}, {{347},{ 9}}, {{219},{ 9}}, {{475},{ 9}}, {{ 59},{ 9}}, -{{315},{ 9}}, {{187},{ 9}}, {{443},{ 9}}, {{123},{ 9}}, {{379},{ 9}}, -{{251},{ 9}}, {{507},{ 9}}, {{ 7},{ 9}}, {{263},{ 9}}, {{135},{ 9}}, -{{391},{ 9}}, {{ 71},{ 9}}, {{327},{ 9}}, {{199},{ 9}}, {{455},{ 9}}, -{{ 39},{ 9}}, {{295},{ 9}}, {{167},{ 9}}, {{423},{ 9}}, {{103},{ 9}}, -{{359},{ 9}}, {{231},{ 9}}, {{487},{ 9}}, {{ 23},{ 9}}, {{279},{ 9}}, -{{151},{ 9}}, {{407},{ 9}}, {{ 87},{ 9}}, {{343},{ 9}}, {{215},{ 9}}, -{{471},{ 9}}, {{ 55},{ 9}}, {{311},{ 9}}, {{183},{ 9}}, {{439},{ 9}}, -{{119},{ 9}}, {{375},{ 9}}, {{247},{ 9}}, {{503},{ 9}}, {{ 15},{ 9}}, -{{271},{ 9}}, {{143},{ 9}}, {{399},{ 9}}, {{ 79},{ 9}}, {{335},{ 9}}, -{{207},{ 9}}, {{463},{ 9}}, {{ 47},{ 9}}, {{303},{ 9}}, {{175},{ 9}}, -{{431},{ 9}}, {{111},{ 9}}, {{367},{ 9}}, {{239},{ 9}}, {{495},{ 9}}, -{{ 31},{ 9}}, {{287},{ 9}}, {{159},{ 9}}, {{415},{ 9}}, {{ 95},{ 9}}, -{{351},{ 9}}, {{223},{ 9}}, {{479},{ 9}}, {{ 63},{ 9}}, {{319},{ 9}}, -{{191},{ 9}}, {{447},{ 9}}, {{127},{ 9}}, {{383},{ 9}}, {{255},{ 9}}, -{{511},{ 9}}, {{ 0},{ 7}}, {{ 64},{ 7}}, {{ 32},{ 7}}, {{ 96},{ 7}}, -{{ 16},{ 7}}, {{ 80},{ 7}}, {{ 48},{ 7}}, {{112},{ 7}}, {{ 8},{ 7}}, -{{ 72},{ 7}}, {{ 40},{ 7}}, {{104},{ 7}}, {{ 24},{ 7}}, {{ 88},{ 7}}, -{{ 56},{ 7}}, {{120},{ 7}}, {{ 4},{ 7}}, {{ 68},{ 7}}, {{ 36},{ 7}}, -{{100},{ 7}}, {{ 20},{ 7}}, {{ 84},{ 7}}, {{ 52},{ 7}}, {{116},{ 7}}, -{{ 3},{ 8}}, {{131},{ 8}}, {{ 67},{ 8}}, {{195},{ 8}}, {{ 35},{ 8}}, -{{163},{ 8}}, {{ 99},{ 8}}, {{227},{ 8}} -}; - -local const ct_data static_dtree[D_CODES] = { -{{ 0},{ 5}}, {{16},{ 5}}, {{ 8},{ 5}}, {{24},{ 5}}, {{ 4},{ 5}}, -{{20},{ 5}}, {{12},{ 5}}, {{28},{ 5}}, {{ 2},{ 5}}, {{18},{ 5}}, -{{10},{ 5}}, {{26},{ 5}}, {{ 6},{ 5}}, {{22},{ 5}}, {{14},{ 5}}, -{{30},{ 5}}, {{ 1},{ 5}}, {{17},{ 5}}, {{ 9},{ 5}}, {{25},{ 5}}, -{{ 5},{ 5}}, {{21},{ 5}}, {{13},{ 5}}, {{29},{ 5}}, {{ 3},{ 5}}, -{{19},{ 5}}, {{11},{ 5}}, {{27},{ 5}}, {{ 7},{ 5}}, {{23},{ 5}} -}; - -const uch _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, -11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, -12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, -13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, -13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, -14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, -14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, -14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, -15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, -15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, -15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 16, 17, -18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, -23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, -24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, -26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, -26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, -27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, -27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, -28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, -28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, -28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, -29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, -29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, -29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29 -}; - -const uch _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, -19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, -21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, -22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, -23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, -24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, -25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, -25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, -26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, -26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, -27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28 -}; - -local const int base_length[LENGTH_CODES] = { -0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56, -64, 80, 96, 112, 128, 160, 192, 224, 0 -}; - -local const int base_dist[D_CODES] = { - 0, 1, 2, 3, 4, 6, 8, 12, 16, 24, - 32, 48, 64, 96, 128, 192, 256, 384, 512, 768, - 1024, 1536, 2048, 3072, 4096, 6144, 8192, 12288, 16384, 24576 -}; - diff --git a/zlib/uncompr.c b/zlib/uncompr.c deleted file mode 100644 index d1033213..00000000 --- a/zlib/uncompr.c +++ /dev/null @@ -1,58 +0,0 @@ -/* uncompr.c -- decompress a memory buffer - * Copyright (C) 1995-1998 Jean-loup Gailly. - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* @(#) $Id$ */ - -#include "zlib.h" - -/* =========================================================================== - 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. - - 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. -*/ -int ZEXPORT uncompress (dest, destLen, source, sourceLen) - Bytef *dest; - uLongf *destLen; - const Bytef *source; - uLong sourceLen; -{ - z_stream stream; - int err; - - stream.next_in = (Bytef*)source; - stream.avail_in = (uInt)sourceLen; - /* Check for source > 64K on 16-bit machine: */ - if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; - - stream.next_out = dest; - stream.avail_out = (uInt)*destLen; - if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; - - stream.zalloc = (alloc_func)0; - stream.zfree = (free_func)0; - - err = inflateInit(&stream); - if (err != Z_OK) return err; - - err = inflate(&stream, Z_FINISH); - if (err != Z_STREAM_END) { - inflateEnd(&stream); - return err == Z_OK ? Z_BUF_ERROR : err; - } - *destLen = stream.total_out; - - err = inflateEnd(&stream); - return err; -} diff --git a/zlib/zconf.h b/zlib/zconf.h deleted file mode 100644 index 6d450fc7..00000000 --- a/zlib/zconf.h +++ /dev/null @@ -1,279 +0,0 @@ -/* zconf.h -- configuration of the zlib compression library - * Copyright (C) 1995-1998 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. - */ -#ifdef Z_PREFIX -# define deflateInit_ z_deflateInit_ -# 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 inflateInit2_ z_inflateInit2_ -# define inflateSetDictionary z_inflateSetDictionary -# define inflateSync z_inflateSync -# define inflateSyncPoint z_inflateSyncPoint -# define inflateReset z_inflateReset -# define compress z_compress -# define compress2 z_compress2 -# define uncompress z_uncompress -# define adler32 z_adler32 -# define crc32 z_crc32 -# define get_crc_table z_get_crc_table - -# define Byte z_Byte -# define uInt z_uInt -# define uLong z_uLong -# define Bytef z_Bytef -# define charf z_charf -# define intf z_intf -# define uIntf z_uIntf -# define uLongf z_uLongf -# define voidpf z_voidpf -# define voidp z_voidp -#endif - -#if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32) -# define WIN32 -#endif -#if defined(__GNUC__) || defined(WIN32) || defined(__386__) || defined(i386) -# ifndef __32BIT__ -# define __32BIT__ -# endif -#endif -#if defined(__MSDOS__) && !defined(MSDOS) -# define MSDOS -#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). - */ -#if defined(MSDOS) && !defined(__32BIT__) -# define MAXSEG_64K -#endif -#ifdef MSDOS -# define UNALIGNED_OK -#endif - -#if (defined(MSDOS) || defined(_WINDOWS) || defined(WIN32)) && !defined(STDC) -# define STDC -#endif -#if defined(__STDC__) || defined(__cplusplus) || defined(__OS2__) -# ifndef STDC -# define STDC -# endif -#endif - -#ifndef STDC -# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ -# define const -# endif -#endif - -/* Some Mac compilers merge all .h files incorrectly: */ -#if defined(__MWERKS__) || defined(applec) ||defined(THINK_C) ||defined(__SC__) -# define NO_DUMMY_DECL -#endif - -/* Old Borland C incorrectly complains about missing returns: */ -#if defined(__BORLANDC__) && (__BORLANDC__ < 0x500) -# define NEED_DUMMY_RETURN -#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 - -/* 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. - */ -#if (defined(M_I86SM) || defined(M_I86MM)) && !defined(__32BIT__) - /* MSC small or medium model */ -# define SMALL_MEDIUM -# ifdef _MSC_VER -# define FAR _far -# else -# define FAR far -# endif -#endif -#if defined(__BORLANDC__) && (defined(__SMALL__) || defined(__MEDIUM__)) -# ifndef __32BIT__ -# define SMALL_MEDIUM -# define FAR _far -# endif -#endif - -/* Compile with -DZLIB_DLL for Windows DLL support */ -#if defined(ZLIB_DLL) -# if defined(_WINDOWS) || defined(WINDOWS) -# ifdef FAR -# undef FAR -# endif -# include -# define ZEXPORT WINAPI -# ifdef WIN32 -# define ZEXPORTVA WINAPIV -# else -# define ZEXPORTVA FAR _cdecl _export -# endif -# endif -# if defined (__BORLANDC__) -# if (__BORLANDC__ >= 0x0500) && defined (WIN32) -# include -# define ZEXPORT __declspec(dllexport) WINAPI -# define ZEXPORTRVA __declspec(dllexport) WINAPIV -# else -# if defined (_Windows) && defined (__DLL__) -# define ZEXPORT _export -# define ZEXPORTVA _export -# endif -# endif -# endif -#endif - -#if defined (__BEOS__) -# if defined (ZLIB_DLL) -# define ZEXTERN extern __declspec(dllexport) -# else -# define ZEXTERN extern __declspec(dllimport) -# endif -#endif - -#ifndef ZEXPORT -# define ZEXPORT -#endif -#ifndef ZEXPORTVA -# define ZEXPORTVA -#endif -#ifndef ZEXTERN -# define ZEXTERN extern -#endif - -#ifndef FAR -# define FAR -#endif - -#if !defined(MACOS) && !defined(TARGET_OS_MAC) -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 FAR *voidpf; - typedef void *voidp; -#else - typedef Byte FAR *voidpf; - typedef Byte *voidp; -#endif - -#ifdef HAVE_UNISTD_H -# include /* for off_t */ -# include /* for SEEK_* and off_t */ -# define z_off_t off_t -#endif -#ifndef SEEK_SET -# 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 - -/* 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(inflateInit_,"ININ") -# pragma map(inflateInit2_,"ININ2") -# pragma map(inflateEnd,"INEND") -# pragma map(inflateSync,"INSY") -# pragma map(inflateSetDictionary,"INSEDI") -# pragma map(inflate_blocks,"INBL") -# pragma map(inflate_blocks_new,"INBLNE") -# pragma map(inflate_blocks_free,"INBLFR") -# pragma map(inflate_blocks_reset,"INBLRE") -# pragma map(inflate_codes_free,"INCOFR") -# pragma map(inflate_codes,"INCO") -# pragma map(inflate_fast,"INFA") -# pragma map(inflate_flush,"INFLU") -# pragma map(inflate_mask,"INMA") -# pragma map(inflate_set_dictionary,"INSEDI2") -# pragma map(inflate_copyright,"INCOPY") -# pragma map(inflate_trees_bits,"INTRBI") -# pragma map(inflate_trees_dynamic,"INTRDY") -# pragma map(inflate_trees_fixed,"INTRFI") -# pragma map(inflate_trees_free,"INTRFR") -#endif - -#endif /* _ZCONF_H */ diff --git a/zlib/zlib.3 b/zlib/zlib.3 deleted file mode 100644 index 25c8495d..00000000 --- a/zlib/zlib.3 +++ /dev/null @@ -1,107 +0,0 @@ -.TH ZLIB 3 "9 July 1998" -.SH NAME -zlib \- compression/decompression library -.SH SYNOPSIS -[see -.I zlib.h -for full description] -.SH DESCRIPTION -The -.I zlib -library is a general purpose data compression library. -The code is thread safe. -It 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. -.LP -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 -(providing more output space) before each call. -.LP -The library also supports reading and writing files in -.I gzip -(.gz) format -with an interface similar to that of stdio. -.LP -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. -.LP -All functions of the compression library are documented in the file -.IR zlib.h. -The distribution source includes examples of use of the library -the files -.I example.c -and -.IR minigzip.c . -.LP -A Java implementation of -.IR zlib -is available in the Java Development Kit 1.1 -.IP -http://www.javasoft.com/products/JDK/1.1/docs/api/Package-java.util.zip.html -.LP -A Perl interface to -.IR zlib , -written by Paul Marquess (pmarquess@bfsec.bt.co.uk) -is available at CPAN (Comprehensive Perl Archive Network) sites, -such as: -.IP -ftp://ftp.cis.ufl.edu/pub/perl/CPAN/modules/by-module/Compress/Compress-Zlib* -.LP -A Python interface to -.IR zlib -written by A.M. Kuchling -is available from the Python Software Association sites, such as: -.IP -ftp://ftp.python.org/pub/python/contrib/Encoding/zlib*.tar.gz -.SH "SEE ALSO" -Questions about zlib should be sent to: -.IP -zlib@quest.jpl.nasa.gov -or, if this fails, to the author addresses given below. -The zlib home page is: -.IP -http://www.cdrom.com/pub/infozip/zlib/ -.LP -The data format used by the zlib library is described by RFC -(Request for Comments) 1950 to 1952 in the files: -.IP -ftp://ds.internic.net/rfc/rfc1950.txt (zlib format) -.br -rfc1951.txt (deflate format) -.br -rfc1952.txt (gzip format) -.LP -These documents are also available in other formats from: -.IP -ftp://ftp.uu.net/graphics/png/documents/zlib/zdoc-index.html -.SH AUTHORS -Version 1.1.3 -Copyright (C) 1995-1998 Jean-loup Gailly (jloup@gzip.org) -and Mark Adler (madler@alumni.caltech.edu). -.LP -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. -See the distribution directory with respect to requirements -governing redistribution. -The deflate format used by -.I zlib -was defined by Phil Katz. -The deflate and -.I zlib -specifications were written by L. Peter Deutsch. -Thanks to all the people who reported problems and suggested various -improvements in -.IR zlib ; -who are too numerous to cite here. -.LP -UNIX manual page by R. P. C. Rodgers, -U.S. National Library of Medicine (rodgers@nlm.nih.gov). -.\" end of man page diff --git a/zlib/zlib.h b/zlib/zlib.h deleted file mode 100644 index 49f56b43..00000000 --- a/zlib/zlib.h +++ /dev/null @@ -1,893 +0,0 @@ -/* zlib.h -- interface of the 'zlib' general purpose compression library - version 1.1.3, July 9th, 1998 - - Copyright (C) 1995-1998 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 - 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. - - Jean-loup Gailly Mark Adler - jloup@gzip.org madler@alumni.caltech.edu - - - The data format used by the zlib library is described by RFCs (Request for - Comments) 1950 to 1952 in the files ftp://ds.internic.net/rfc/rfc1950.txt - (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format). -*/ - -#ifndef _ZLIB_H -#define _ZLIB_H - -#include "zconf.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define ZLIB_VERSION "1.1.3" - -/* - 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 - (providing more output space) before each call. - - The library also supports reading and writing files in gzip (.gz) format - with an interface similar to that of stdio. - - 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)); -typedef void (*free_func) OF((voidpf opaque, voidpf address)); - -struct internal_state; - -typedef struct z_stream_s { - 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 */ - - 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 */ - - 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 */ - free_func zfree; /* used to free the internal state */ - voidpf opaque; /* private data object passed to zalloc and zfree */ - - int data_type; /* best guess about the data type: ascii or binary */ - uLong adler; /* adler32 value of the uncompressed data */ - uLong reserved; /* reserved for future use */ -} z_stream; - -typedef z_stream FAR *z_streamp; - -/* - 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 - opaque value. - - 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). - - 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_SYNC_FLUSH 2 -#define Z_FULL_FLUSH 3 -#define Z_FINISH 4 -/* Allowed flush values; see deflate() below for details */ - -#define Z_OK 0 -#define Z_STREAM_END 1 -#define Z_NEED_DICT 2 -#define Z_ERRNO (-1) -#define Z_STREAM_ERROR (-2) -#define Z_DATA_ERROR (-3) -#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. - */ - -#define Z_NO_COMPRESSION 0 -#define Z_BEST_SPEED 1 -#define Z_BEST_COMPRESSION 9 -#define Z_DEFAULT_COMPRESSION (-1) -/* compression levels */ - -#define Z_FILTERED 1 -#define Z_HUFFMAN_ONLY 2 -#define Z_DEFAULT_STRATEGY 0 -/* compression strategy; see deflateInit2() below for details */ - -#define Z_BINARY 0 -#define Z_ASCII 1 -#define Z_UNKNOWN 2 -/* Possible values of the data_type field */ - -#define Z_DEFLATED 8 -/* The deflate compression method (the only one supported in this version) */ - -#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ - -#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. - */ - -/* -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. - - 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). - - 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, - 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(). -*/ - - -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 - forced to flush. - - 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 - 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. - 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. - - 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. - - 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. - - 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 - the 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). - - 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 - 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. - - 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 - 0.1% larger than avail_in plus 12 bytes. If deflate does not return - Z_STREAM_END, then 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 data_type if it can make a good guess about - the input data type (Z_ASCII or Z_BINARY). 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). -*/ - - -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. - - 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 - deallocated). -*/ - - -/* -ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); - - 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 - 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 - use default allocation functions. - - 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.) -*/ - - -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 some - 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 - 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(). - - - 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). - - 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. - - If the parameter flush is set to Z_SYNC_FLUSH, inflate flushes as much - output as possible to the output buffer. The flushing behavior of inflate is - not specified for values of the flush parameter other than Z_SYNC_FLUSH - and Z_FINISH, but the current implementation actually flushes as much output - as possible anyway. - - 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 routine - may be used for the single inflate() call. - - If a preset dictionary is needed at this point (see inflateSetDictionary - below), inflate sets strm-adler to the adler32 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, 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 checksum is equal to that saved by the - compressor and returns Z_STREAM_END only if the checksum is correct. - - 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 - been reached and all uncompressed output has been produced, Z_NEED_DICT if a - 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 - adler32 checksum), 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, Z_BUF_ERROR if no progress is possible or if there was not - enough room in the output buffer when Z_FINISH is used. In the Z_DATA_ERROR - case, the application may then call inflateSync to look for a good - compression block. -*/ - - -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. - - 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 - static string (which must not be deallocated). -*/ - - /* Advanced functions */ - -/* - The following functions are needed only in some special applications. -*/ - -/* -ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, - int level, - int method, - int windowBits, - 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. - - 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 - deflateInit is used instead. - - 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. - - 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), or Z_HUFFMAN_ONLY to force Huffman encoding only (no - string match). 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. The strategy parameter only affects - the compression ratio but not the correctness of the compressed output even - if it is not set appropriately. - - 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(). -*/ - -ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, - const Bytef *dictionary, - 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). - - 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 - 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. - - 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 - applies to the whole dictionary even if only a subset of the dictionary is - actually used by the compressor.) - - deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a - parameter is invalid (such as NULL dictionary) 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(). -*/ - -ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, - z_streamp source)); -/* - Sets the destination stream as a complete copy of the source stream. - - 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 - 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. - - 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 - 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. - - deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent (such as zalloc or state being NULL). -*/ - -ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, - int level, - int strategy)); -/* - 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(). - - 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. - - 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. -*/ - -/* -ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, - int windowBits)); - - 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. 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. - - 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 negative - memLevel). 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.) -*/ - -ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, - const Bytef *dictionary, - uInt dictLength)); -/* - Initializes the decompression dictionary from the given uncompressed byte - sequence. This function must be called immediately after a call of inflate - if this call returned Z_NEED_DICT. The dictionary chosen by the compressor - can be determined from the Adler32 value returned by this call of - inflate. The compressor and decompressor must use exactly the same - dictionary (see deflateSetDictionary). - - inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a - parameter is invalid (such as NULL dictionary) 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 - 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. - - 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. -*/ - -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. - - inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent (such as zalloc or state being NULL). -*/ - - - /* 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. -*/ - -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 0.1% larger than - sourceLen plus 12 bytes. 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. -*/ - -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 - 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 - destination buffer, which must be at least 0.1% larger than sourceLen plus - 12 bytes. 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 - memory, Z_BUF_ERROR if there was not enough room in the output buffer, - Z_STREAM_ERROR if the level parameter is invalid. -*/ - -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. - - 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. -*/ - - -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". (See the description - of deflateInit2 for more information about the strategy parameter.) - - 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. - - 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). */ - -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. -*/ - -ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); -/* - 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)); -/* - 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). */ - -ZEXTERN int ZEXPORT gzwrite OF((gzFile file, - const voidp 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). -*/ - -ZEXTERN int ZEXPORTVA gzprintf OF((gzFile file, const char *format, ...)); -/* - 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). -*/ - -ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); -/* - 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. -*/ - -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. -*/ - -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. -*/ - -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. -*/ - -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. -*/ - -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 - 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 - 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. -*/ - -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) -*/ - -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. - - gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) -*/ - -ZEXTERN int ZEXPORT gzeof OF((gzFile file)); -/* - Returns 1 when EOF has previously been detected reading the given - input stream, otherwise zero. -*/ - -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). -*/ - -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. -*/ - - /* checksum functions */ - -/* - These functions are not related to compression but are exported - 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: - - uLong adler = adler32(0L, Z_NULL, 0); - - while (read_buffer(buffer, length) != EOF) { - adler = adler32(adler, buffer, length); - } - if (adler != original_adler) error(); -*/ - -ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); -/* - Update a running crc with the bytes buf[0..len-1] and return the updated - crc. If buf is 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); - - while (read_buffer(buffer, length) != EOF) { - crc = crc32(crc, buffer, length); - } - if (crc != original_crc) error(); -*/ - - - /* various hacks, don't look :) */ - -/* deflateInit and inflateInit are macros to allow checking the zlib version - * and the compiler's view of z_stream: - */ -ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level, - const char *version, int stream_size)); -ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm, - const char *version, int stream_size)); -ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method, - int windowBits, int memLevel, - int strategy, const char *version, - int stream_size)); -ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits, - const char *version, int stream_size)); -#define deflateInit(strm, level) \ - deflateInit_((strm), (level), ZLIB_VERSION, sizeof(z_stream)) -#define inflateInit(strm) \ - inflateInit_((strm), ZLIB_VERSION, sizeof(z_stream)) -#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ - deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ - (strategy), ZLIB_VERSION, sizeof(z_stream)) -#define inflateInit2(strm, windowBits) \ - inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream)) - - -#if !defined(_Z_UTIL_H) && !defined(NO_DUMMY_DECL) - struct internal_state {int dummy;}; /* hack for buggy compilers */ -#endif - -ZEXTERN const char * ZEXPORT zError OF((int err)); -ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp z)); -ZEXTERN const uLongf * ZEXPORT get_crc_table OF((void)); - -#ifdef __cplusplus -} -#endif - -#endif /* _ZLIB_H */ diff --git a/zlib/zutil.c b/zlib/zutil.c deleted file mode 100644 index b3de4e88..00000000 --- a/zlib/zutil.c +++ /dev/null @@ -1,225 +0,0 @@ -/* zutil.c -- target dependent utility functions for the compression library - * Copyright (C) 1995-1998 Jean-loup Gailly. - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* @(#) $Id$ */ - -#include "zutil.h" - -struct internal_state {int dummy;}; /* for buggy compilers */ - -#ifndef STDC -extern void exit OF((int)); -#endif - -const char *z_errmsg[10] = { -"need dictionary", /* Z_NEED_DICT 2 */ -"stream end", /* Z_STREAM_END 1 */ -"", /* Z_OK 0 */ -"file error", /* Z_ERRNO (-1) */ -"stream error", /* Z_STREAM_ERROR (-2) */ -"data error", /* Z_DATA_ERROR (-3) */ -"insufficient memory", /* Z_MEM_ERROR (-4) */ -"buffer error", /* Z_BUF_ERROR (-5) */ -"incompatible version",/* Z_VERSION_ERROR (-6) */ -""}; - - -const char * ZEXPORT zlibVersion() -{ - return ZLIB_VERSION; -} - -#ifdef DEBUG - -# ifndef verbose -# define verbose 0 -# endif -int z_verbose = verbose; - -void z_error (m) - char *m; -{ - fprintf(stderr, "%s\n", m); - exit(1); -} -#endif - -/* exported to allow conversion of error code to string for compress() and - * uncompress() - */ -const char * ZEXPORT zError(err) - int err; -{ - return ERR_MSG(err); -} - - -#ifndef HAVE_MEMCPY - -void zmemcpy(dest, source, len) - Bytef* dest; - const Bytef* source; - uInt len; -{ - if (len == 0) return; - do { - *dest++ = *source++; /* ??? to be unrolled */ - } while (--len != 0); -} - -int zmemcmp(s1, s2, len) - const Bytef* s1; - const Bytef* s2; - uInt len; -{ - uInt j; - - for (j = 0; j < len; j++) { - if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1; - } - return 0; -} - -void zmemzero(dest, len) - Bytef* dest; - uInt len; -{ - if (len == 0) return; - do { - *dest++ = 0; /* ??? to be unrolled */ - } while (--len != 0); -} -#endif - -#ifdef __TURBOC__ -#if (defined( __BORLANDC__) || !defined(SMALL_MEDIUM)) && !defined(__32BIT__) -/* Small and medium model in Turbo C are for now limited to near allocation - * with reduced MAX_WBITS and MAX_MEM_LEVEL - */ -# define MY_ZCALLOC - -/* Turbo C malloc() does not allow dynamic allocation of 64K bytes - * and farmalloc(64K) returns a pointer with an offset of 8, so we - * must fix the pointer. Warning: the pointer must be put back to its - * original form in order to free it, use zcfree(). - */ - -#define MAX_PTR 10 -/* 10*64K = 640K */ - -local int next_ptr = 0; - -typedef struct ptr_table_s { - voidpf org_ptr; - voidpf new_ptr; -} ptr_table; - -local ptr_table table[MAX_PTR]; -/* This table is used to remember the original form of pointers - * to large buffers (64K). Such pointers are normalized with a zero offset. - * Since MSDOS is not a preemptive multitasking OS, this table is not - * protected from concurrent access. This hack doesn't work anyway on - * a protected system like OS/2. Use Microsoft C instead. - */ - -voidpf zcalloc (voidpf opaque, unsigned items, unsigned size) -{ - voidpf buf = opaque; /* just to make some compilers happy */ - ulg bsize = (ulg)items*size; - - /* If we allocate less than 65520 bytes, we assume that farmalloc - * will return a usable pointer which doesn't have to be normalized. - */ - if (bsize < 65520L) { - buf = farmalloc(bsize); - if (*(ush*)&buf != 0) return buf; - } else { - buf = farmalloc(bsize + 16L); - } - if (buf == NULL || next_ptr >= MAX_PTR) return NULL; - table[next_ptr].org_ptr = buf; - - /* Normalize the pointer to seg:0 */ - *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4; - *(ush*)&buf = 0; - table[next_ptr++].new_ptr = buf; - return buf; -} - -void zcfree (voidpf opaque, voidpf ptr) -{ - int n; - if (*(ush*)&ptr != 0) { /* object < 64K */ - farfree(ptr); - return; - } - /* Find the original pointer */ - for (n = 0; n < next_ptr; n++) { - if (ptr != table[n].new_ptr) continue; - - farfree(table[n].org_ptr); - while (++n < next_ptr) { - table[n-1] = table[n]; - } - next_ptr--; - return; - } - ptr = opaque; /* just to make some compilers happy */ - Assert(0, "zcfree: ptr not found"); -} -#endif -#endif /* __TURBOC__ */ - - -#if defined(M_I86) && !defined(__32BIT__) -/* Microsoft C in 16-bit mode */ - -# define MY_ZCALLOC - -#if (!defined(_MSC_VER) || (_MSC_VER <= 600)) -# define _halloc halloc -# define _hfree hfree -#endif - -voidpf zcalloc (voidpf opaque, unsigned items, unsigned size) -{ - if (opaque) opaque = 0; /* to make compiler happy */ - return _halloc((long)items, size); -} - -void zcfree (voidpf opaque, voidpf ptr) -{ - if (opaque) opaque = 0; /* to make compiler happy */ - _hfree(ptr); -} - -#endif /* MSC */ - - -#ifndef MY_ZCALLOC /* Any system without a special alloc function */ - -#ifndef STDC -extern voidp calloc OF((uInt items, uInt size)); -extern void free OF((voidpf ptr)); -#endif - -voidpf zcalloc (opaque, items, size) - voidpf opaque; - unsigned items; - unsigned size; -{ - if (opaque) items += size - size; /* make compiler happy */ - return (voidpf)calloc(items, size); -} - -void zcfree (opaque, ptr) - voidpf opaque; - voidpf ptr; -{ - free(ptr); - if (opaque) return; /* make compiler happy */ -} - -#endif /* MY_ZCALLOC */ diff --git a/zlib/zutil.h b/zlib/zutil.h deleted file mode 100644 index 6f2cb97c..00000000 --- a/zlib/zutil.h +++ /dev/null @@ -1,220 +0,0 @@ -/* zutil.h -- internal interface and configuration of the compression library - * Copyright (C) 1995-1998 Jean-loup Gailly. - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* 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. - */ - -/* @(#) $Id$ */ - -#ifndef _Z_UTIL_H -#define _Z_UTIL_H - -#include "zlib.h" - -#ifdef STDC -# include -# include -# include -#endif -#ifdef NO_ERRNO_H - extern int errno; -#else -# include -#endif - -#ifndef local -# define local static -#endif -/* compile with -Dlocal if your debugger can't find static symbols */ - -typedef unsigned char uch; -typedef uch FAR uchf; -typedef unsigned short ush; -typedef ush FAR ushf; -typedef unsigned long ulg; - -extern const char *z_errmsg[10]; /* indexed by 2-zlib_error */ -/* (size given to avoid silly warnings with Visual C++) */ - -#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)] - -#define ERR_RETURN(strm,err) \ - return (strm->msg = (char*)ERR_MSG(err), (err)) -/* To be used only when the state is known to be valid */ - - /* common constants */ - -#ifndef DEF_WBITS -# define DEF_WBITS MAX_WBITS -#endif -/* default windowBits for decompression. MAX_WBITS is for compression only */ - -#if MAX_MEM_LEVEL >= 8 -# define DEF_MEM_LEVEL 8 -#else -# define DEF_MEM_LEVEL MAX_MEM_LEVEL -#endif -/* default memLevel */ - -#define STORED_BLOCK 0 -#define STATIC_TREES 1 -#define DYN_TREES 2 -/* The three kinds of block type */ - -#define MIN_MATCH 3 -#define MAX_MATCH 258 -/* The minimum and maximum match lengths */ - -#define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */ - - /* target dependencies */ - -#ifdef MSDOS -# 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 -# endif -# else /* MSC or DJGPP */ -# include -# endif -#endif - -#ifdef OS2 -# define OS_CODE 0x06 -#endif - -#ifdef WIN32 /* Window 95 & Windows NT */ -# define OS_CODE 0x0b -#endif - -#if defined(VAXC) || defined(VMS) -# define OS_CODE 0x02 -# define F_OPEN(name, mode) \ - fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512") -#endif - -#ifdef AMIGA -# define OS_CODE 0x01 -#endif - -#if defined(ATARI) || defined(atarist) -# define OS_CODE 0x05 -#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() */ -# endif -# endif -#endif - -#ifdef __50SERIES /* Prime/PRIMOS */ -# define OS_CODE 0x0F -#endif - -#ifdef TOPS20 -# define OS_CODE 0x0a -#endif - -#if defined(_BEOS_) || defined(RISCOS) -# define fdopen(fd,mode) NULL /* No fdopen() */ -#endif - -#if (defined(_MSC_VER) && (_MSC_VER > 600)) -# define fdopen(fd,type) _fdopen(fd,type) -#endif - - - /* Common defaults */ - -#ifndef OS_CODE -# define OS_CODE 0x03 /* assume Unix */ -#endif - -#ifndef F_OPEN -# define F_OPEN(name, mode) fopen((name), (mode)) -#endif - - /* functions */ - -#ifdef HAVE_STRERROR - extern char *strerror OF((int)); -# define zstrerror(errnum) strerror(errnum) -#else -# define zstrerror(errnum) "" -#endif - -#if defined(pyr) -# define NO_MEMCPY -#endif -#if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__) - /* Use our own functions for small and medium model with MSC <= 5.0. - * You may have to use the same strategy for Borland C (untested). - * The __SC__ check is for Symantec. - */ -# define NO_MEMCPY -#endif -#if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY) -# define HAVE_MEMCPY -#endif -#ifdef HAVE_MEMCPY -# ifdef SMALL_MEDIUM /* MSDOS small or medium model */ -# define zmemcpy _fmemcpy -# define zmemcmp _fmemcmp -# define zmemzero(dest, len) _fmemset(dest, 0, len) -# else -# define zmemcpy memcpy -# define zmemcmp memcmp -# 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)); -#endif - -/* Diagnostic functions */ -#ifdef DEBUG -# include - extern int z_verbose; - extern void 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 ;} -# define Tracevv(x) {if (z_verbose>1) fprintf x ;} -# define Tracec(c,x) {if (z_verbose>0 && (c)) fprintf x ;} -# define Tracecv(c,x) {if (z_verbose>1 && (c)) fprintf x ;} -#else -# define Assert(cond,msg) -# define Trace(x) -# define Tracev(x) -# define Tracevv(x) -# define Tracec(c,x) -# define Tracecv(c,x) -#endif - - -typedef uLong (ZEXPORT *check_func) OF((uLong check, const Bytef *buf, - uInt len)); -voidpf zcalloc OF((voidpf opaque, unsigned items, unsigned size)); -void zcfree OF((voidpf opaque, voidpf ptr)); - -#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);} - -#endif /* _Z_UTIL_H */ -- 2.39.5