shithub: aacdec

Download patch

ref: 99bd519a4df4601f868f2bd601d958f6f631d1d2
parent: ca6c484158cf560424d7eb68e12e1814cc8dab0c
author: menno <menno>
date: Thu Jul 25 08:22:13 EDT 2002

Update to newest version of libsndfile library
(Somebody please check linux compilation)

--- a/common/libsndfile/AUTHORS
+++ b/common/libsndfile/AUTHORS
@@ -1,10 +1,9 @@
-The main author of libsndfile is Erik de Castro Lopo <erikd AT zip DOT com DOT au>.
+The main author of libsndfile is Erik de Castro Lopo <[email protected]>.
 
 The code in the src/GSM610 directory was written by Jutta Degener 
-<jutta AT cs DOT tu-berlin DOT de> and Carsten Bormann 
-<cabo AT cs DOT tu-berlin DOT de>. They should not be contacted in relation to 
-libsndfile or the GSM 6.10 code that is part of libsndfile. Their original code 
-can be found at:
+<[email protected]> and Carsten Bormann <[email protected]>.
+They should not be contacted in relation to libsndfile or the GSM 6.10 code 
+that is part of libsndfile. Their original code can be found at:
 
     http://kbs.cs.tu-berlin.de/~jutta/toast.html
 
@@ -11,7 +10,5 @@
 Code in the src/G72x directory was released by Sun Microsystems, Inc. to the 
 public domain. Minor modifications were required to integrate these files 
 into libsndfile. The changes are listed in src/G72x/ChangeLog.
-
-
 
 
--- a/common/libsndfile/ChangeLog
+++ b/common/libsndfile/ChangeLog
@@ -1,89 +1,936 @@
-2001-11-11  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2002-06-25  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
-	* examples/sfplay_beos.cpp
-	Added BeOS version of sfplay.c. This needs to be compiled using a C++
-	compiler so is therefore not built by default. Thanks to Marcus Overhagen
-	for providing this.
+    * Win32/libsndfile.def
+    Removed definition for sf_signal_max().
 
-2001-11-11  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+    * configure.in
+    Bumped version to 1.0.0rc2.
 
-	* src/*.[ch]
-	Removed all usage of off_t which is not part of the ISO C standard. All places 
-	which were using it are now using type long which is the type of the offset 
-	parameter for the fseek function.
-	This should fix problems on BeOS, MacOS and *BSD like systems which were failing
-	"make check" because sizeof (long) != sizeof (off_t).
+2002-06-24  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
-2001-11-10  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+    * src/common.h
+    Test for Win32 before testing SIZEOF_OFF_T so that it works correctly
+    on Win32..
+    
+    * src/file_io.c
+    Win32 fixes to ensure O_BINARY is used for file open.
+    
+    * doc/win32.html
+    New file documenting the building libsndfile on Win32.
+    
+    * doc/*.html
+    Updating of documentation.
+    
+2002-06-23  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
-	* examples/sfplay.c
-	New example file showing how libsndfile can be used to read and play a sound file.
-	At the moment on Linux is supported. Others will follow in the near future.
+    * tests/pcm_test.c
+    Minor changes to allow easier determination of test file name.
+    
+    * src/sndfile.[ch]
+    Removed function sf_signal_max().
+    
+    * examples/sndfile-play.c
+    Changed call to sf_signal_max() to a call to sf_command().
 
-2001-11-08  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2002-06-22  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
-    * src/au.c src/sndfile.au
-	Added support for 32 bit float data in big and little endian AU files.
-	
-	* tests/write_read_test.c
-	Added tests for 32 bit float data in AU files.
+    * src/format.c src/command.c
+    Renamed format.c to command.c which will now include code for sf_command()
+    calls to perform operations other than format commands.
 
-2001-11-06  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+    * src/sndfile.c src/sndfile.h
+    Removed function sf_get_signal_max() which is replaced by commands passed
+    to sf_command().
+    
+    * src/command.c 
+    Implement commands SFC_CALC_SIGNAL_MAX. 
+    
+    * doc/command.html
+    Documented SFC_CALC_SIGNAL_MAX.
 
+2002-06-21  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * examples/sndfile-play.c
+    Mods to make sndfile-play work on Solaris. The program sndfile-play now
+    runs on Linux, MaxOSX and Solaris. Win32 to come.
+
+    * src/format.c
+    Added SF_FORMAT_DWVW_* to subtype_formats array. 
+    
+    * src/nist.c
+    Added support for 8 bit NIST Sphere files. Example file supplied by Anand
+    Kumria.
+
+2002-06-20  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * examples/sndfile-info.c
+    Tidy up of output format.
+
+    * examnples/sndfile-play.c
+    Mods to make sndfile-play work on MacOSX using Apple's CoreAudio API.
+
+    * configure.in
+    Add new variables OS_SPECIFIC_INCLUDES and OS_SPECIFIC_LINKS which were
+    required to supply extra include paths and link parameters to get
+    sndfile-play working on MacOSX.
+
+    * examples/Makefile.am
+    Use OS_SPOECIFIC_INCLUDES and OS_SPECIFIC_LINKS to build commands for
+    sndfile-play.
+
+2002-06-19  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * src/nist.c
+    Added ability to read/write new NIST Sphere file types (A-law, u-law).
+    Header parser was re-written from scratch. Example files supplied by Anand
+    Kumria.
+
+    * src/sndfile.c
+    Support for A-law and u-law NIST files.
+
+    * tests/Makefile.am tests/lossy_comp_test.c
+    Tests for A-law and u-law NIST files.
+
+2002-06-18  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * tests/utils.c
+    Fixed an error in error string.
+
+2002-06-17  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * acinclude.m4
+    Removed exit command to allow cross-compiling.
+
+    * Win32/unistd.h src/file_io.c
+    Moved contents of first file into the second file (enclosed in #ifdef).
+    Win32/unistd.h is now an empty file but still must be there for libsndfile 
+    to compile on Win32.
+
+    * src/sd2.c, src/sndfile.c:
+    Fixes for Sound Designer II files on big endian systems.
+
+2002-06-16  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * configure.in
+    Modified to work around problems with crappy MacOSX version of sed.
+    Added sanity check for proper values for CFLAGS.
+
+2002-06-14  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * src/sndfile.c
+    Code clean up in sf_open ().
+
+    * Win32/Makefile.msvc
+    Michael Fink's contributed MSVC++ makefile was hacked to bits and put back
+    together in a new improved form.
+
+    * src/file_io.c
+    Fixes for Win32; _lseeki64() returns an invalid argument for calls like
+    _lseeki64(fd, 0, SEEK_CUR) so need to use _telli64 (fd) instead.
+
+    * src/common.h src/sndfile.c src/wav.c src/aiff.c
+    Added SFE_LOG_OVERRUN error.
+    Added termination for potential infinite loop when parsing file headers.
+
+    * src/wav.c src/w64.c
+    Fixed bug casuing incorrect header generation when opening file read/write.
+
+2002-06-12  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * doc/api.html
+    Improved the documentation to make it clearer that the file read method
+    and the underlying file format are completely disconnected. Suggested
+    by Josh Green.
+
+    * doc/command.html
+    Started correcting docs to take into account changes made to the
+    operations of the sf_command () function. Not complete yet.
+
+    * src/sndfile.c
+    Reverted some changes which had broken the partially working SDII header
+    parsing. Now have access to an iBook with OS X so reading and writing SDII
+    files on all platforms should be a reality in the near future. On Mac this
+    will involve reading the resource fork via the standard MacOS API. To move
+    a file from Mac to another OS, the resource and data forks will need to be
+    combined before transfer. The combined file will be read on both Mac and
+    other OSes like any other file.
+
+2002-06-08  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * ltmain.sh
+    Applied a patch from http://fink.sourceforge.net/doc/porting/libtool.php
+    which allows libsndfile to compile on MacOSX 10.1. This patch should not
+    interfere with compiling on other OSes.
+
+    * src/GSM610/private.h
+    Changes to fix compile problems on MacOSX (see src/GSM610/ChangeLog).
+
+    * src/float_cast.h
+    Added MacOSX replacements for lrint() and lrintf().
+
+2002-06-05  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * src/sndfile.c
+    Replaced the code to print the filename to the log buffer when a file is
+    opened. This code seems to have been left out during the merge of
+    sf_open_read() and sf_open_write() to make a single  functions sf_open().
+
+2002-06-01  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * src/wav.c
+    Fixed a bug where the WAV header parser was going into an infinite loop
+    on a badly formed LIST chunk. File supplied by David Viens.
+
+2002-05-25  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * configure.in
+    Added a message at the end of the configuration process to warn about the
+    need for the use of pkg-config when linking programs against version 1 of
+    libsndfile.
+
+    * doc/pkg-config.html
+    New documentation file containing details of how to use pkg-config to
+    retrieve settings for CFLAGS and library locations for linking files
+    against version 1 of libsndfile.
+
+2002-05-17  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * src/wav.c
+    Fixed minor bug in handling of so-called ACIDized WAV files.
+
+2002-05-16  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * Win32/libsndfile.def Win32/Makefile.msvc
+    Two new files contributed by Michael Fink (from the winLAME project)
+    which allows libsndfile to be built on windows in a MSDOS box by doing
+    "nmake -f Makefile.msvc". Way cool!
+
+2002-05-15  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * configure.in
+    MacOSX is SSSOOOOOOO screwed up!!! I can't believe how hard it is to
+    generate a tarball which will configure and compile on that platform.
+    Joined the libtool mailing list to try and get some answers.
+
+2002-05-13  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * configure.in
+    Changed to autoconf version 2.50. MacOSX uses autoconf version 2.53 which
+    is incompatible with with version 2.13 which had been using until now.
+    The AC_SYS_LARGE_FILE macro distributed withe autoconf 2.50 is missing a
+    few features so AC_SYS_EXTRA_LARGE file was defined to replace it.
+
+    * configure.in
+    Changed to automake version 1.5 to try and make a tarball which will
+    work on MacOSX.
+
+2002-05-12  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * src/wav_gsm610.c
+    Changed name to gsm610.c. Added reading/writing of headerless files.
+
+    * src/sndfile.c src/raw.c
+    Added ability to read/write headerless (SF_FORMAT_RAW) GSM 6.10 files.
+
+2002-05-11  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
     * tests/lossy_comp_test.c
-	Finalised testing of stereo files where possible.
+    Clean up in preparation for Autogen-ing this file.
 
-2001-11-05  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+    * src/GSM610/*.[ch]
+    Code cleanup and prepartion forgetting file seek working. Details in
+    src/GSM610/ChangeLog.
 
-    * src/wav_ms_adpcm.c
-	Fixed bug in writing stereo MS ADPCM WAV files. Thanks to Xu Xin for pointing
-	out this problem.
+    * sndfile.pc.in
+    Testing complete. Is sndfile.m4 still needed?
 
-2001-10-24  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2002-05-09  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
-    * src/wav_ms_adpcm.c
-	Modified function srate2blocksize () to handle 44k1Hz stereo files.
+    * tests/write_read_test.tpl tests/rdwr_test.tpl
+    Merged tests from these two programs into write_read_test.tpl and deleted
+    rdwr_test.tpl.
+
+2002-05-08  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * src/w64.c src/svx.c src/paf.c
+    Fixed bugs in read/write mode.
+
+2002-05-07  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * examples/Makefile.am
+    Renamed sfplay.c to sndfile-play.c and sndfile_info.c to sndfile-info.c for
+    consistency when these programs become part of the Debian package
+    sndfile-programs.
+
+    * sndfile.pc.in
+    New file to replace sndfile-config.in. Libsndfile now uses the pkg-config
+    model for providing installation parameters to dependant programs.
+
+    * src/sndfile.c
+    Cleanup of code in sf_open().
+
+2002-05-06  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * tests/utils.tpl tests/write_read_test.tpl
+    More conversion to Autogen fixes and enchancements.
+
+    * src/*.c
+    Read/write mode is now working for 16, 24 and 32 bit PCM as well as 32
+    bit float and 64 bit double data. More tests still required.
+
+    * src/Makefile.am
+    Added DISTCLEANFILES target to remove config.status and config.last.
+
+    * Win32/Makefile.am MacOS/Makefile.am
+    Added DISTCLEANFILES target to remove Makefile.
+
+2002-05-05  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * src/*.[ch] tests/rdwr_test.c
+    More verifying workings of read/write mode. Fixing bugs found.
+
+    * tests/utils.[ch]
+    Made these files Autogen generated files.
+
+    * tests/util.tpl tests/util.def
+    New Autogen files to generate utils.[ch]. Moved some generic test functions
+    into this file. Autogen is such a great tool!
+
+2002-05-03  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * src/pcm.c src/float_cast.h Win32/config.h
+    Fixed a couple of Win32 specific bugs pointed out by Michael Fink
+    (maintainer of WinLAME) and David Viens.
+
+    * tests/check_log_buffer.[ch] tests/utils.[ch]
+    Moved check_log_buffer() to utils.[ch] and deleted old file.
+
+2002-05-02  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * src/common.[ch] src/sndfile.c
+    New function psf_default_seek() which will be the default seek function
+    for things like PCM and floating point data. This default is set for
+    both read and write in sf_open() but can be over-ridden by any codec
+    during it's initialisation.
+
+2002-05-01  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * src/au.c
+    AU files use a data size value of -1 to mean unknown. Fixed au_open_read()
+    to allow opening files like this.
+
+    * tests/rdwr_test .c
+    Added more tests.
+
+    * src/sndfile.c
+    Fixed bugs in read/write mode found due to improvements in the test
+    program.
+
+2002-04-30  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * tests/rdwr_test .c
+    New file for testing read/write mode.
+
+2002-04-29  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * m4/*
+    Removed all m4 macros from this directory as they get concatenated to form
+    the file aclocal.m4 anyway.
+
+    * sndfile.m4
+    Moved this from the m4 directory to the root directory asn this is part of
+    the distribution and is installed during "make install".
+
+2002-04-29  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * src/float32.c
+    Removed logging of peaks for all file formats other than AIFF and WAV.
+
+    * tests/write_read_test.tpl tests/write_read_test.def
+    New files which autogen uses to generate write_read_test.c. Doing it this
+    way makes write_read_test.c far easier to maintain. Other test programs
+    will be converted to autogen in the near future.
+
+    * src/*.c
+    Fixed a few bugs found when testing on Sparc (bug endian) Solaris.
+
+2002-04-28  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * doc/*.html
+    Fixed documention versioning.
+
+    * configure.in
+    Fixed a bug in the routines which search for Large File Support on systems
+    which have large file support by defualt.
+
+2002-04-27  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * src/*.[ch]
+    Found and fixed an issue which can cause a bug in other software (I was
+    porting Conrad Parker's Sweep program from version 0 of the library to
+    version 1). When opening a file for write, the libsndfile code would
+    set the sfinfo.samples field to a maximum value.
+
+    * tests/write_read_test.c
+    Added tests to detect the above problem.
+
+2002-04-25  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * src/*.[ch]
+    Finished base implementation of read/write mode. Much more testing still
+    needed.
+
+    * m4/largefile.m4
+    Macro for detecting Large File Standard capabilities. This macro was ripped
+    out of the aclocal.m4 file of GNU tar-1.13.
+
+    * configure.in
+    Added detection of large file support. Files larger than 2 Gigabytes should
+    now be supported on 64 bit platforms and many 32 bit platforms including
+    Linux (2.4 kernel, glibc-2.2), *BSD, MacOS, Win32.
+
+    * libsndfile_convert_version.py
+    A Python script which attempts to autoconvert code written to use version 0
+    to version 1.
+
+2002-04-24  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * src/*.[ch]
+    Finished base implementation of read/write mode. Much more testing still
+    needed.
+
+    * tests/write_read_test.c
+    Preliminary tests for read/write mode added. More needed.
+
+2002-04-20  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * src/sndfile.[ch]
+    Removed sf_open_read() and sf_open_write() functions,replacting them with
+    sf_open() which takes an extra mode parameter (SF_OPEN_READ, SF_OPEN_WRITE,
+    or SF_OPEN_RDWR). This new function sf_open can now be modified to allow
+    opening a file formodification (RDWR).
+
+2002-04-19  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * src/*.c
+    Completed merging of separate xxx_open_read() and xxx_open_write()
+    functions. All tests pass.
+
+2002-04-18  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * src/au.c
+    Massive refactoring required to merge au_open_read() with au_open_write()
+    to create au_open().
+
+2002-04-17  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * src/*.c
+    Started changes required to allow a sound file to be opened in read/write
+    mode, with separate file pointers for read and write. This involves merging
+    of encoder/decoder functions like pcm_read_init() and pcm_write_init()
+    int a new function pcm_init() as well as doing something similar for all
+    the file type specific functions ie aiff_open_read() and aiff_open_write()
+    were merged to make the function aiff_open().
+
+2002-04-15  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * src/file_io.c
+    New file containing psf_fopen(), psf_fread(), psf_fwrite(), psf_fseek() and
+    psf_ftell() functions. These function will replace use of fopen/fread/fwrite
+    etc and allow access to files larger than 2 gigabytes on a number of 32 bit
+    OSes (Linux on x86, 32 bit Solaris user space apps, Win32 and MacOS).
+
+    * src/*.c
+    Replaced all instances of fopen with psf_open, fread with psd_read, fwrite
+    with psf_write and so on.
+
+2002-03-11  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * src/dwvw.c
+    Finally fixed all known problems with 12, 16 and 24 bit DWVW encoding.
+
+    * tests/floating_point_test.c
+    Added tests for 12, 16 and 24 bit DWVW encoding.
+
+2002-03-03  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * m4/endian.m4
+    Defines a new m4 macro AC_C_FIND_ENDIAN, for determining the endian-ness of
+    the target CPU. It first checks for the definition of BYTE_ORDER in
+    <endian.h>, then in <sys/types.h> and <sys/param.h>. If none of these work
+    and the C compiler is not a cross compiler it compiles and runs a program
+    to test for endian-ness. If the compiler is a cross compiler it makes a
+    guess based on $target_cpu.
+
+    * configure.in
+    Modified to use AC_C_FIND_ENDIAN.
+
+    * src/sfendian.h
+    Simplified.
+
+2002-02-23  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * tests/floating_point_test.c
+    Tests completely rewritten using the dft_cmp function. Now able to
+    calculate a quick guesstimate of the Signal to Noise Ratio of the encoder.
+
+2002-02-15  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * tests/dft_cmp.[ch]
+    New files containing functions for comparing pre and post lossily
+    compressed data using a quickly hacked DFT.
+
+    * tests/utils.[ch]
+    New files containing functions for saving pre and post encoded data in a
+    file readable by the GNU Octave package.
+
+2002-02-13  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * m4/lrint.m4 m4/lrintf.m4
+    Fixed m4 macros to define HAVE_LRINT and HAVE_LRINTF even when the test
+    is cached.
+
+2002-02-12  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * tests/floating_point_test.c
+    Fixed improper use of strncat ().
+
+2002-02-11  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * tests/headerless_test.c
+    New test program to test the ability to open and read a known file type as a
+    RAW header-less file.
+
+2002-02-07  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * tests/losy_comp_test.c
+    Added a test to ensure that the data read from a file is not all zeros.
+
+    * examples/sfconvert.c
+    Added "-gsm610" encoding types.
+
+2002-01-29  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * examples/sfconvert.c
+    Added "-dwvw12", "-dwvw16" and "-dwvw24" encoding types.
+
+    * tests/dwvw_test.c
+    New file for testing DWVW encoder/decoder.
+
+2002-01-28  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * src/dwvw.c
+    Implemented writing of DWVW. 12 bit seems to work, 16 and 24 bit still broken.
+
+    * src/aiff.c
+    Improved reporting of encoding types.
+
+    * src/voc.c
+    Clean up.
+
+2002-01-27  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * src/dwvw.c
+    New file implementing lossless Delta Word Variable Width (DWVW) encoding.
+    Reading 12 bit DWVW is now working.
+
+    * src/aiff.c common.h sndfile.c
+    Added hooks for DWVW encoded AIFF and RAW files.
+
+2002-01-15  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * src/w64.c
+    Robustify header parsing.
+
+    * src/wav_w64.h
+    Header file wav.h was renamed to wav_w64.h to signify sharing of
+    definitions across the two file types.
+
+    * src/wav.c src/w64.c src/wav_w64.c
+    Refactoring.
+    Modified and moved functions with a high degree of similarity between
+    wav.c and w64.c to wav_w64.c.
+
+2002-01-14  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * src/w64.c
+    Completed work on getting read and write working.
+
+    * examples/sfplay.c
+    Added code to scale floating point data so it plays at a reasonable volume.
+
+    * tests/Makefile.am tests/write_read_test.c
+    Added tests for W64 files.
+
+2002-01-13  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * src/*.c
+    Modded all code in file header writing routines to use
+    psf_new_binheader_writef().
+    Removed psf_binheader_writef() from src/common.c.
+    Globally replaced psf_new_binheader_writef with psf_binheader_writef.
+
+2002-01-12  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * src/*.c
+    Modded all code in file parsing routines to use psf_new_binheader_readf().
+    Removed psf_binheader_readf() from src/common.c.
+    Globally replaced psf_new_binheader_readf with psf_binheader_readf.
+
+    * src/common.[ch]
+    Added new function psf_new_binheader_writef () which will soon replace
+    psf_binheader_writef (). The new function has basically the same function
+    as the original but has a more flexible and capable interface. It also
+    allows the writing of 64 bit integer values for files contains 64 bit file
+    offsets.
+
+2002-01-11  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * src/formats.c src/sndfile.c src/sndfile.h
+    Added code allowing full enumeration of supported file formats via the
+    sf_command () interface.
+    This feature will allow applications to avoid needing recompilation when
+    support for new file formats are added to libsndfile.
+
+    * tests/command_test.c
+    Added test code for the above feature.
+
+    * examples/list_formats.c
+    New file. An example of the use of the supported file enumeration
+    interface. This program lists all the major formats and for each major
+    format the supported subformats.
+
+2002-01-10  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * src/*.[ch] tests/*.c
+    Changed command parameter of sf_command () function from a test string to
+    an int. The valid values for the command parameter begin with SFC_ and are
+    listed in src/sndfile.h.
+
+2001-12-20  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * src/formats.c src/sndfile.c
+    Added an way of enumerating a set of common file formats using the
+    sf_command () interface. This interface was suggested by Dominic Mazzoni,
+    one of the main authors of Audacity (http://audacity.sourceforge.net/).
+
+2001-12-26  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * src/sndfile.c
+    Added checking of filename parameter in sf_open_read (). Previousy, if a
+    NULL pointer was passed the library would segfault.
+
+2001-12-18  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * src/common.c src/common.h
+    Changed the len parameter of the endswap_*_array () functions from type
+    int to type long.
+
+    * src/pcm.c
+    Fixed a problem which
+
+2001-12-15  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * src/sndfile.c
+    Added conditional #include <sys/types.h> for EMX/gcc on OS/2. Thanks to
+    Paul Hartman for pointing this out.
+
+    * tests/lossy_comp_test.c tests/floating_point_test.c
+    Added definitions for M_PI for when it isn't defined in <math.h>.
+
+2001-11-30  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * src/ircam.c
+    Re-implemented the header reader. Old version was making incorrect
+    assumptions about the endian-ness of the file from the magic number at the
+    start of the file. The new code looks at the integer which holds the
+    number of channels and determines the endian-ness from that.
+
+2001-11-30  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * src/aiff.c
+    Added support for other AIFC types ('raw ', 'in32', '23ni').
+    Further work on IMA ADPCM encoding.
+
+2001-11-29  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * src/ima_adpcm.c
+    Renamed from wav_ima_adpcm.c. This file will soon handle IMA ADPCM
+    encodings for both WAV and AIFF files.
+
+    * src/aiff.c
+    Started adding IMA ADPCM support.
+
+2001-11-28  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * src/double.c
+    New file for handling double precision floating point (SF_FORMAT_DOUBLE)
+    data.
+
+    * src/wav.c src/aiff.c src/au.c src/raw.c
+    Added support for SF_FORMAT_DOUBLE data.
+
+    * src/common.[ch]
+    Addition of endswap_long_array () for endian swapping 64 bit integers. This
+    function will work correctly on processors with 32 bit and 64 bit longs.
+    Optimised endswap_short_array () and endswap_int_array ().
+
+    * tests/pcm_test.c
+    Added and extra check. After the first file of each type is written to disk
+    a checksum is performed of the first 64 bytes and checked against a pre-
+    calculated value. This will work whatever the endian-ness of the host
+    machine.
+
+2001-11-27  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * src/aiff.c
+    Added handling of u-law, A-law encoded AIFF files. Thanks to Tom Erbe for
+    supplying example files.
 
-2001-10-24  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+    * tests/lossy_comp_test.c
+    Added tests for above.
 
+    * src/common.h src/*.c
+    Removed function typedefs from common.h and function pointer casting in all
+    the other files. This allows the compiler to perform proper type checking.
+    Hopefully this will prevernt problems like the sf_seek bug for OpenBSD,
+    BeOS etc.
+
+    * src/common.[ch]
+    Added new function psf_new_binheader_readf () which will eventually replace
+    psf_binheader_readf (). The new function has basically the same function as
+    the original but has a more flexible and capable interface. It also allows
+    the reading of 64 bit integer values for files contains 64 bit file
+    offsets.
+
+2001-11-26  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * src/voc.c
+    Completed implementation of VOC file handling. Can now handle 8 and 16 bit
+    PCM, u-law and A-law files with one or two channels.
+
+    * src/write_read_test.c tests/lossy_comp_test.c
+    Added tests for VOC files.
+
+2001-11-22  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * src/float_cast.h
+    Added inline asm version of lrint/lrintf for MacOS. Solution provided by
+    Stephane Letz.
+
+    * src/voc.c
+    More work on this braindamaged format. The VOC files produced by SoX also
+    have a number of inconsistencies.
+
+2001-11-19  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * src/paf.c
+    Added support for 8 bit PCM PAF files.
+
+    * tests/write_read_test.c
+    Added tests for 8 bit PAF files.
+
+2001-11-18  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * tests/pcm_test.c
+    New test program to test for correct scaling of integer values between
+    different sized integer containers (ie short -> int).
+    The new specs for libsndfile state that when the source and destination
+    containers are of a different size, the most significant bit of the source
+    value becomes the most significant bit of the destination container.
+
+    * src/pcm.c src/paf.c
+    Modified to pass the above test program.
+
+    * tests/write_read_test.c tests/lossy_comp_test.c
+    Modified to work with the new scaling rules.
+
+2001-11-17  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * src/raw.c tests/write_read_test.c tests/write_read_test.c
+    Added ability to do raw reads/writes of float, u-law and A-law files.
+
+    * src/*.[ch] examples/*.[ch] tests/*.[ch]
+    Removed dependance on pcmbitwidth field of SF_INFO struct and moved to new
+    SF_FORMAT_* types and use of SF_ENDIAN_BIG/LITTLE/CPU.
+
+2001-11-12  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * src/*.[ch]
+    Started implmentation of major changes documented in doc/version1.html.
+
+    Removed all usage of off_t which is not part of the ISO C standard. All
+    places which were using it are now using type long which is the type of
+    the offset parameter for the fseek function.
+    This should fix problems on BeOS, MacOS and *BSD like systems which were
+    failing "make check" because sizeof (long) != sizeof (off_t).
+
+--------------------------------------------------------------------------------
+This is the boundary between version 1 of the library above and version 0 below.
+--------------------------------------------------------------------------------
+
+2001-11-11  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * examples/sfplay_beos.cpp
+    Added BeOS version of sfplay.c. This needs to be compiled using a C++
+    compiler so is therefore not built by default. Thanks to Marcus Overhagen
+    for providing this.
+
+2001-11-10  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * examples/sfplay.c
+    New example file showing how libsndfile can be used to read and play a
+    sound file.
+    At the moment on Linux is supported. Others will follow in the near future.
+
+2001-11-09  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * src/pcm.c
+    Fixed problem with normalisation code where a value of 1.0 could map to
+    a value greater than MAX_SHORT or MAX_INT. Thanks to Roger Dannenberg for
+    pointing this out.
+
+2001-11-08  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * src/pcm.c
+    Fixed scaling issue when reading/writing 8 bit files using
+    sf_read/sf_write_short ().
+    On read, values are scaled so that the most significant bit in the char
+    ends up in the most significant bit of the short. On write, values are
+    scaled so that most significant bit in the short ends up as the most
+    significant bit in the char.
+
+2001-11-07  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * src/au.c src/sndfile.c
+    Added support for 32 bit float data in big and little endian AU files.
+
+    * tests/write_read_test.c
+    Added tests for 32 bit float data in AU files.
+
+2001-11-06  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
     * tests/lossy_comp_test.c
-	Modified this test program so that for stereo capable files, test stereo mode 
-	instead of mono.
+    Finalised testing of stereo files where possible.
 
-2001-10-06  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2001-11-05  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
-    * src/common.h 
-    Win32 has _snprintf and _vsnprintf but not snprintf and vsnprintf. Added a
-	conditional #define to fix this.
+    * src/wav_ms_adpcm.c
+    Fixed bug in writing stereo MS ADPCM WAV files. Thanks to Xu Xin for
+    pointing out this problem.
 
-2001-10-04  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2001-10-24  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
+    * src/wav_ms_adpcm.c
+    Modified function srate2blocksize () to handle 44k1Hz stereo files.
+
+2001-10-21  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * src/w64.c
+    Added support for Sonic Foundry 64 bit WAV format. As Linux (my main
+    development platform) does not yet support 64 bit file offsets by default,
+    current handling of this file format treats everything as 32 bit and fails
+    openning the file, if it finds anything that goes beyond 32 bit values.
+
+    * src/sndfile.[hc] src/common.h src/Makefile.am
+    Added hooks for W64 support.
+
+2001-10-21  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * configure.in
+    Added more warnings options to CFLAGS when the gcc compiler is detected.
+
+    * src/*.[ch] tests/*.c examples/*.c
+    Started fixing the warning messages due to the new CFLASG.
+
     * src/voc.c
+    More work on VOC file read/writing.
+
+    * src/paf.c
+    Found that PAF files were not checking the normalisation flag when reading
+    or writing floats and doubles. Fixed it.
+
+    * tests/floating_point_test.c
+    Added specific test for the above problem.
+
+    * src/float_cast.h src/pcm.c
+    Added a section for Win32 to define lrint () and lrintf () in the header
+    and implement it in the pcm.c
+
+2001-10-20  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * sndfile-config.in m4/sndfile.m4
+    These files were donated by Conrad Parker who also provided instructions
+    on how to install them using autoconf/automake.
+
+    * src/float_cast.h
+    Fiddled around with this file some more. On Linux and other gcc supported
+    OSes use the C99 functions lrintf() and lrint() for casting from floating
+    point to int without incurring the huge perfromance penalty (particularly
+    on the i386 family) caused by the regular C cast from float to int.
+    These new C99 functions replace the FLOAT_TO_* and DOUBLE_TO_* macros which
+    I had been playing with.
+
+    * configure.in m4/lrint.m4 m4/lrintf.m4
+    Add detection of these functions.
+
+2001-10-17  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * src/voc.c
+    Completed code for reading VOC files containing a single audio data
+    segment.
+    Started implementing code to handle files with multiple VOC_SOUND_DATA
+    segments but couldn't be bothered finishing it. Multiple segment files can
+    have different sample rates for different sections and other nasties like
+    silence and repeat segments.
+
+2001-10-16  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * src/common.h src/*.c
+    Removed SF_PRIVATE struct field fdata and replaced it with extra_data.
+
+    * src/voc.c
+    Further development of the read part of this woefult file format.
+
+2001-10-04  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * src/float_cast.h
+    Implemented gcc and i386 floating point to int cast macros. Standard cast
+    will be used when not on gcc for i385.
+
+    * src/pcm.c
+    Modified all uses of FLOAT/DOUBLE_TO_INT and FLOAT/DOUBLE_TO_SHORT casts to
+    comply with macros in float_cast.h.
+
+2001-10-04  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * src/voc.c
     Changed the TYPE_xxx enum names to VOC_TYPE_xxx to prevent name clashes
     on MacOS with CodeWarrior 6.0.
 
-    * MacOS/MacOS-readme.txt 
+    * MacOS/MacOS-readme.txt
     Updated the compile instructions. Probably still need work as I don't have
     access to a Mac.
 
-2001-10-01  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2001-10-01  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/wav.c src/aiff.c common.c
-    Changed all references to snprintf to LSF_SNPRINTF and all vsnprintf to 
+    Changed all references to snprintf to LSF_SNPRINTF and all vsnprintf to
     LSF_VSNPRINTF. LSF_VSNPRINTF and LSF_VSNPRINTF are defined in common.h.
 
     * src/common.h
-    Added checking of HAVE_SNPRINTF and HAVE_VSNPRINTF and defining LSF_VSNPRINTF 
-    and LSF_VSNPRINTF to appropriate values.
+    Added checking of HAVE_SNPRINTF and HAVE_VSNPRINTF and defining
+    LSF_VSNPRINTF and LSF_VSNPRINTF to appropriate values.
 
     * src/missing.c
-    New file containing a minimal implementation of snprintf and vsnprintf functions 
-    named missing_snprintf and missing_vsnprintf respectively. These are only 
-    compliled into the binary if snprintf and/or vsnprintf are not available.
+    New file containing a minimal implementation of snprintf and vsnprintf
+    functions named missing_snprintf and missing_vsnprintf respectively. These
+    are only compliled into the binary if snprintf and/or vsnprintf are not
+    available.
 
-2001-09-29  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2001-09-29  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
-    * src/ircam.c 
+    * src/ircam.c
     New file to handle Berkeley/IRCAM/CARL files.
 
     * src/sndfile.c src/common.h
@@ -92,130 +939,133 @@
     * tests/*.c
     Added tests for IRCAM files.
 
-2001-09-27  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2001-09-27  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/wav.c
-    Apparently microsoft windows (tm) doesn't like ulaw and Alaw WAV files with 
-    20 byte format chunks (contrary to ms's own documentation). Fixed the WAV 
-    header writing code to generate smaller ms compliant ulaw and Alaw WAV files.
+    Apparently microsoft windows (tm) doesn't like ulaw and Alaw WAV files with
+    20 byte format chunks (contrary to ms's own documentation). Fixed the WAV
+    header writing code to generate smaller ms compliant ulaw and Alaw WAV
+    files.
 
-2001-09-17  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2001-09-17  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * tests/stdio_test.sh tests/stdio_test.c
-    Shell script was rewritten as a C program due to incompatibilities of the sh
-    shell on Linux and Solaris.
+    Shell script was rewritten as a C program due to incompatibilities of the
+    sh shell on Linux and Solaris.
 
-2001-09-16  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2001-09-16  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * tests/stdio_test.sh tests/stdout_test.c tests/stdin_test.c
-    New test programs to verify the correct operation of reading from stdin and 
+    New test programs to verify the correct operation of reading from stdin and
     writing to stdout.
 
     * src/sndfile.c wav.c au.c nist.c paf.c
     Fixed a bugs uncovered by the new test programs above.
 
-2001-09-15  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2001-09-15  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/sndfile.c wav.c
     Fixed a bug preventing reading a file from stdin. Found by T. Narita.
 
-2001-09-12  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2001-09-12  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/common.h
-    Fixed a problem on OpenBSD 2.9 which was causing sf_seek() to fail on IMA WAV
-    files. Root cause was the declaration of the func_seek typedef not matching the 
-    functions it was actually being used to point to. In OpenBSD sizeof (off_t) != 
-    sizeof (int). Thanks to Heikki Korpela for allowing me to log into his OpenBSD
-    machine to debug this problem.
+    Fixed a problem on OpenBSD 2.9 which was causing sf_seek() to fail on IMA
+    WAV files. Root cause was the declaration of the func_seek typedef not
+    matching the functions it was actually being used to point to. In OpenBSD
+    sizeof (off_t) != sizeof (int). Thanks to Heikki Korpela for allowing me
+    to log into his OpenBSD machine to debug this problem.
 
-2001-09-03  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2001-09-03  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
-    * src/sndfile.c 
+    * src/sndfile.c
     Implemented sf_command ("norm float").
 
     * src/*.c
-    Implemented handling of sf_command ("norm float"). Float normalization can now
-    be turned on and off.
+    Implemented handling of sf_command ("set-norm-float"). Float normalization
+    can now be turned on and off.
 
     * tests/double_test.c
-    Renamed to floating_point_test.c. Modified to include tests for all scaled reads 
-    and writes of floats and doubles.
+    Renamed to floating_point_test.c. Modified to include tests for all scaled
+    reads and writes of floats and doubles.
 
     * src/au_g72x.c
-    Fixed bug in normalization code found with improved floating_point_test program.
+    Fixed bug in normalization code found with improved floating_point_test
+    program.
 
     * src/wav.c
-    Added code for parsing 'INFO' and 'LIST' chunks. Will be used for extract text 
-    annotations from WAV files.
+    Added code for parsing 'INFO' and 'LIST' chunks. Will be used for extract
+    text annotations from WAV files.
 
     * src/aiff.c
-    Added code for parsing '(c) ' and 'ANNO' chunks. Will be used for extract text 
-    annotations from WAV files.
+    Added code for parsing '(c) ' and 'ANNO' chunks. Will be used for extract
+    text annotations from WAV files.
 
-2001-09-02  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2001-09-02  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * examples/sf_info.c example/Makefile.am
-    Renamed to sndfile_info.c. The program sndfile_info will now be installed when the 
-    library is installed.
+    Renamed to sndfile_info.c. The program sndfile_info will now be installed
+    when the library is installed.
 
-    * src/floatcast.h
+    * src/float_cast.h
     New file defining floating point to short and int casts. These casts will
-    eventually replace all flot and double casts to short and int. See comments at
-    the top of the file for the reasoning.
-    
+    eventually replace all flot and double casts to short and int. See comments
+    at the top of the file for the reasoning.
+
     * src/*.c
-    Changed all default float and double casts to short or int with macros defined
-    in floatcast.h. At the moment these casts do nothing. They will be replaced 
-    with faster float to int cast operations in the near future.
+    Changed all default float and double casts to short or int with macros
+    defined in floatcast.h. At the moment these casts do nothing. They will be
+    replaced with faster float to int cast operations in the near future.
 
-2001-08-31  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
-    
+2001-08-31  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
     * tests/command_test.c
     New file for testing sf_command () functionality.
 
     * src/sndfile.c
     Revisiting of error return values of some functions.
-    Started implementing sf_command () a new function will allow on-the-fly modification
-    of library behaviour, or instance, sample value scaling.
+    Started implementing sf_command () a new function will allow on-the-fly
+    modification of library behaviour, or instance, sample value scaling.
 
     * src/common.h
     Added hook for format specific sf_command () calls to SNDFILE struct.
-    
+
     * doc/api.html
     Updated and errors corrected.
-    
+
     * doc/command.html
     New documentation file explaining new sf_command () function.
 
-2001-08-11  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
-    
+2001-08-11  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
     * src/sndfile.c
-    Fixed error return values from sf_read*() and sf_write*(). There were numerous
-    instances of -1 being returned through size_t. These now all set error int the
-    SF_PRIVATE struct and return 0. Thanks to David Viens for spotting this.
+    Fixed error return values from sf_read*() and sf_write*(). There were
+    numerous instances of -1 being returned through size_t. These now all set
+    error int the SF_PRIVATE struct and return 0. Thanks to David Viens for
+    spotting this.
 
-2001-08-01  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
-    
+2001-08-01  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
     * src/common.c
-    Fixed use of va_arg() calls that were causing warning messages with the latest
-    version of gcc (thanks Maurizio Umberto Puxeddu).
+    Fixed use of va_arg() calls that were causing warning messages with the
+    latest version of gcc (thanks Maurizio Umberto Puxeddu).
 
-2001-07-25  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
-    
-    * src/*.c src/sfendian.h 
+2001-07-25  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+    * src/*.c src/sfendian.h
     Moved definition of MAKE_MARKER macro to sfendian.h
 
-2001-07-23  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
-    
+2001-07-23  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
     * src/sndfile.c
-    Modified sf_get_lib_version () so that version string will be visible using the
-    Unix strings command.
+    Modified sf_get_lib_version () so that version string will be visible using
+    the Unix strings command.
 
     * examples/Makefile.am examples/sfinfo.c
-    Renamed sfinfo program and source code to sf_info. This prevents a name clash
-    with the program included with libaudiofile.
+    Renamed sfinfo program and source code to sf_info. This prevents a name
+    clash with the program included with libaudiofile.
 
-2001-07-22  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2001-07-22  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * tests/read_seek_test.c tests/lossy_comp_test.c
     Added tests for sf_read_float () and sf_readf_float ().
@@ -225,30 +1075,30 @@
 
     * src/samplitude.c
     New files for handling Samplitude files (not complete).
- 
-2001-07-21  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
 
+2001-07-21  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
     * src/aiff.c src/au.c src/paf.c src/svx.c src/wav.c
-    Converted these files to using psf_binheader_readf() function. Will soon be ready
-    to make reading writing from pipes work reliably.
+    Converted these files to using psf_binheader_readf() function. Will soon be
+    ready to attempt to make reading writing from pipes work reliably.
 
     * src/*.[ch]
-    Added code for sf_read_float () and sf_readf_float () methods of accessing 
+    Added code for sf_read_float () and sf_readf_float () methods of accessing
     file data.
-    
-2001-07-20  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
 
+2001-07-20  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
     * src/paf.c src/wav_gsm610.c
-    Removed two printf()s which had escaped notice for some time (thanks Sigbj�rn 
-    Skj�ret).
+    Removed two printf()s which had escaped notice for some time (thanks
+    Sigbj�rn Skj�ret).
 
-2001-07-19  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2001-07-19  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/wav_gsm610.c
-    Fixed a bug which prevented GSM 6.10 encoded WAV files generated by libsndfile from 
-    being played in Windoze (thanks klay).
+    Fixed a bug which prevented GSM 6.10 encoded WAV files generated by
+    libsndfile from being played in Windoze (thanks klay).
 
-2001-07-18  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2001-07-18  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/common.[ch]
     Implemented psf_binheader_readf() which will do for file header reading what
@@ -255,106 +1105,109 @@
     psf_binheader_writef() did for writing headers. Will eventually allow
     libsndfile to read and write from pipes, including named pipes.
 
-2001-07-16  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2001-07-16  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * MacOS/config.h Win32/config.h
-    Attempted to bring these two files uptodate with src/config.h. As I don't have
-    access to either of these systems support for them may be completely broken.
+    Attempted to bring these two files uptodate with src/config.h. As I don't
+    have access to either of these systems support for them may be completely
+    broken.
 
-2001-06-18  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2001-06-18  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/float32.c
-    Fixed bug for big endian processors that can't read 32 bit IEEE floats. Now tested 
-    on Intel x86 and UltraSparc processors.
+    Fixed bug for big endian processors that can't read 32 bit IEEE floats. Now
+    tested on Intel x86 and UltraSparc processors.
 
-2001-06-13  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2001-06-13  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/aiff.c
-    Modified to allow REX files (from Propellorhead's Recycle and Reason programs) to 
-    be read.
-    REX files are basically an AIFF file with slightly unusual sequence of chunks
-    (AIFF files are supposed to allow any sequence) and some extra  application 
-    specific information. 
+    Modified to allow REX files (from Propellorhead's Recycle and Reason
+    programs) to be read.
+    REX files are basically an AIFF file with slightly unusual sequence of
+    chunks (AIFF files are supposed to allow any sequence) and some extra
+    application specific information.
     Not yet able to write a REX file as the details of the application specific
     data is unknown.
 
-2001-06-12  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2001-06-12  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/wav.c
     Fixed endian bug when reading PEAK chunk on big endian machines.
 
     * src/common.c
-    Fixed endian bug when reading PEAK chunk on big endian machines with 
+    Fixed endian bug when reading PEAK chunk on big endian machines with
     --enable-force-broken-float configure option.
     Fix psf_binheader_writef for (FORCE_BROKEN_FLOAT ||______)
 
-2001-06-07  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2001-06-07  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * configure.in src/config.h.in
-    Removed old CAN_READ_WRITE_x86_IEEE configure variable now that float capabilities
-    are detected at run time.
-    Added FORCE_BROKEN_FLOAT to allow testing of broken float code on machines where
-    the processor can in fact handle floats correctly. 
-    
+    Removed old CAN_READ_WRITE_x86_IEEE configure variable now that float
+    capabilities are detected at run time.
+    Added FORCE_BROKEN_FLOAT to allow testing of broken float code on machines
+    where the processor can in fact handle floats correctly.
+
     * src/float32.c
     Rejigged code reading and writing of floats on broken processors.
-    
+
     * m4/
     Removed this directory and all its files as they are no longer needed.
 
-2001-06-05  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2001-06-05  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * tests/peak_chunk_test.c
     New test to validate reading and writing of peak chunk.
-    
+
     * examples/sfconvert
     Added -float32 option.
 
     * src/*.c
-    Changed all error return values to negative values (ie the negative of what they
-    were). 
-    
+    Changed all error return values to negative values (ie the negative of what
+    they were).
+
     * src/sndfile.c tests/error_test.c
     Modified to take account of the previous change.
 
-2001-06-04  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2001-06-04  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/float32.c
-    File renamed from wav_float.c and renamed function to something more general.
-    Added runtime detection of floating point capabilities. 
-    Added recording of peaks during write for generation of PEAK chunk. 
-    
+    File renamed from wav_float.c and renamed function to something more
+    general.
+    Added runtime detection of floating point capabilities.
+    Added recording of peaks during write for generation of PEAK chunk.
+
     * src/wav.c src/aiff.c
     Added handing for PEAK chunk for floating point files. PEAK is read when the
-    file headers are read and generated when the file is closed. Logic is in place
-    for adding PEAK chunk to end of file when writing to a pipe (reading and writing 
-    from/to pipe to be implemented soon).
+    file headers are read and generated when the file is closed. Logic is in
+    place for adding PEAK chunk to end of file when writing to a pipe (reading
+    and writing from/to pipe to be implemented soon).
 
     * src/sndfile.c
     Modified sf_signal_max () to use PEAK values if present.
 
-2001-06-03  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2001-06-03  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/*.c
-    Added pcm_read_init () and pcm_write_init () to src/pcm.c and removed all other calls
-    to functions in this file from the filetype specific files.
-    
+    Added pcm_read_init () and pcm_write_init () to src/pcm.c and removed all
+    other calls to functions in this file from the filetype specific files.
+
     * src/*.c
-    Added alaw_read_init (), alaw_write_int (), ulaw_read_init () and ulaw_write_init () 
-    and removed all other calls to functions in alaw.c and ulaw.c from the filetype 
-    specific files.
-    
+    Added alaw_read_init (), alaw_write_int (), ulaw_read_init () and
+    ulaw_write_init () and removed all other calls to functions in alaw.c and
+    ulaw.c from the filetype specific files.
+
     * tests/write_read_test.c
     Added tests to validate sf_seek () on all file types.
 
     * src/raw.c
-    Implemented raw_seek () function to fix a bug where sf_seek (file, 0, SEEK_SET) on a 
-    RAW file failed.
+    Implemented raw_seek () function to fix a bug where
+    sf_seek (file, 0, SEEK_SET) on a RAW file failed.
 
     * src/paf.c
-    Fixed a bug in paf24_seek () found due to added seeks tests in tests/write_read_test.c
+    Fixed a bug in paf24_seek () found due to added seeks tests in
+    tests/write_read_test.c
 
-2001-06-01  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2001-06-01  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * tests/read_seek_test.c
     Fixed a couple of broken binary files.
@@ -362,13 +1215,13 @@
     * src/aiff.c src/wav.c
     Added handling of PEAK chunks on file read.
 
-2001-05-31  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2001-05-31  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * check_libsndfile.py
-    New file for the regression testing of libsndfile. 
-    check_libsndfile.py is a Python script which reads in a file containing 
-    filenames of audio files. Each file is checked by running the examples/sfinfo 
-    program on them and checking for error or warning messages in the libsndfile 
+    New file for the regression testing of libsndfile.
+    check_libsndfile.py is a Python script which reads in a file containing
+    filenames of audio files. Each file is checked by running the examples/sfinfo
+    program on them and checking for error or warning messages in the libsndfile
     log buffer.
 
     * check_libsndfile.list
@@ -376,35 +1229,36 @@
 
     * tests/lossy_comp_test.c
     Changed the defined value of M_PI for math header files which don't have it.
-    This fixed validation test failures on MetroWerks compilers. Thanks to Lord 
+    This fixed validation test failures on MetroWerks compilers. Thanks to Lord
     Praetor Satanus of Acheron for bringing this to my attention.
 
-2001-05-30  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2001-05-30  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/common.[ch]
     Removed psf_header_setf () which was no longer required after refactoring
     and simplification of header writing.
-    Added 'z' format specifier to psf_binheader_writef () for zero filling header 
+    Added 'z' format specifier to psf_binheader_writef () for zero filling header
     with N bytes. Used by paf.c and nist.c
 
     * tests/check_log_buffer.c
-    New file implementing check_log_buffer () which reads the log buffer of a SNDFILE*
-    object and searches for error and warning messages. Calls exit () if any are found.
+    New file implementing check_log_buffer () which reads the log buffer of a
+    SNDFILE* object and searches for error and warning messages. Calls exit ()
+    if any are found.
 
-    * tests/*.c 
+    * tests/*.c
     Added calls to check_log_buffer () after each call to sf_open_XXX ().
 
-2001-05-29  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2001-05-29  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/wav.c src/wav_ms_adpcm.c src/wav_gsm610.c
     Major rehack of header writing using psf_binheader_writef ().
 
-2001-05-28  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2001-05-28  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/wav.c src/wav_ima_adpcm.c
     Major rehack of header writing using psf_binheader_writef ().
 
-2001-05-27  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2001-05-27  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/wav.c
     Changed return type of get_encoding_str () to prevent compiler warnings on
@@ -413,7 +1267,7 @@
     * src/aiff.c src/au.c
     Major rehack of header writing using psf_binheader_writef ().
 
-2001-05-25  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2001-05-25  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/common.h src/common.c
     Added comments.
@@ -421,39 +1275,42 @@
     Name of log buffer index variable changed from strindex to logindex.
 
     * src/*.[ch]
-    Changed name of internal logging function from psf_sprintf () to psf_log_printf ().
-    Changed name of internal header generation functions from psf_[ab]h_printf () to 
-    psf_asciiheader_printf () and psf_binheader_writef ().
-    Changed name of internal header manipulation function psf_hsetf () to 
-    psf_header_setf (). 
+    Changed name of internal logging function from psf_sprintf () to
+    psf_log_printf ().
+    Changed name of internal header generation functions from
+    psf_[ab]h_printf () to psf_asciiheader_printf () and
+    psf_binheader_writef ().
+    Changed name of internal header manipulation function psf_hsetf () to
+    psf_header_setf ().
 
-2001-05-24  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2001-05-24  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/nist.c
-    Fixed reading and writing of sample_byte_format header. "01" means little endian 
-    and "10" means big endian regardless of bit width.
+    Fixed reading and writing of sample_byte_format header. "01" means little
+    endian and "10" means big endian regardless of bit width.
 
     * configure.in
-    Detect Mac OSX and disable -Wall and -pedantic gcc options. Mac OSX is way screwed
-    up and spews out buckets of warning messages from the system headers.
-    Added --disable-gcc-opt configure option (sets gcc optimisation to -O0 ) for 
+    Detect Mac OSX and disable -Wall and -pedantic gcc options. Mac OSX is
+    way screwed up and spews out buckets of warning messages from the system
+    headers.
+    Added --disable-gcc-opt configure option (sets gcc optimisation to -O0 ) for
     easier debugging.
-    Made decision to harmonise source code version number and .so library version
-    number. Future releases will stick to this rule.
+    Made decision to harmonise source code version number and .so library
+    version number. Future releases will stick to this rule.
 
     * doc/new_file_type.HOWTO
     New file to document the addition of new file types to libsndfile.
 
-2001-05-23  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2001-05-23  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/nist.c
     New file for reading/writing Sphere NIST audio file format.
-    Originally requested by Elis Pomales in 1999. 
+    Originally requested by Elis Pomales in 1999.
     Retrieved from unstable (and untouched for 18 months) branch of libsndfile.
-    Some vital information gleaned from the source code to Bill Schottstaedt's sndlib 
-    library : ftp://ccrma-ftp.stanford.edu/pub/Lisp/sndlib.tar.gz
-    Currently reading and writing 16, 24 and 32 bit, big-endian and little endian, 
-    stereo and mono files. 
+    Some vital information gleaned from the source code to Bill Schottstaedt's
+    sndlib library : ftp://ccrma-ftp.stanford.edu/pub/Lisp/sndlib.tar.gz
+    Currently reading and writing 16, 24 and 32 bit, big-endian and little
+    endian, stereo and mono files.
 
     * src/common.h src/common.c
     Added psf_ah_printf () function to help construction of ASCII headers (ie NIST).
@@ -464,7 +1321,7 @@
     * tests/write_read_test.c
     Added tests for supported NIST files.
 
-2001-05-22  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2001-05-22  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * tests/write_read_test.c
     Added tests for little endian AIFC files.
@@ -473,58 +1330,52 @@
     Minor re-working of aiff_open_write ().
     Added write support for little endian PCM encoded AIFC files.
 
-2001-05-13  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2001-05-13  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/aiff.c
     Minor re-working of aiff_open_read ().
-    Added read support for little endian PCM encoded AIFC files from the Mac OSX CD ripper 
-    program. Guillaume Lessard provided a couple of sample files and a working patch. 
-    The patch was not used as is but gave a good guide as to what to do. 
+    Added read support for little endian PCM encoded AIFC files from the Mac
+    OSX CD ripper program. Guillaume Lessard provided a couple of sample files
+    and a working patch.
+    The patch was not used as is but gave a good guide as to what to do.
 
-2001-05-13  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2001-05-11  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
-    * src/aiff.c
-    Added support for little endian encoded AIFC files. Guillaume Lessard provided a couple
-    of sample files and a working patch. The patch was not used as is but gave a good guide
-    as to what to do. 
-
-2001-05-11  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
-
     * src/sndfile.h
-    Fixed comments about endian-ness of WAV and AIFF files. Guillaume Lessard pointed 
-    out the error.
+    Fixed comments about endian-ness of WAV and AIFF files. Guillaume Lessard
+    pointed out the error.
 
-2001-04-23  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2001-04-23  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * examples/make_sine.c
     Re-write of this example using sample rate and required frequency in Hz.
 
-2001-02-11  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2001-02-11  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/sndfile.c
     Fixed bug that prevented known file types from being read as RAW PCM data.
 
-2000-12-16  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2000-12-16  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/aiff.c
     Added handing of COMT chunk.
 
-2000-11-16  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2000-11-16  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * examples/sfconvert.c
     Fixed bug in normalisatio code. Pointed out by Johnny Wu.
 
-2000-11-08  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2000-11-08  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * Win32/config.h
     Fixed the incorrect setting of HAVE_ENDIAN_H parameter. Win32 only issue.
 
-2000-10-27  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2000-10-27  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * tests/Makefile.am
     Added -lm for write_read_test_LDADD.
 
-2000-10-16  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2000-10-16  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/sndfile.c src/au.c
     Fixed bug which prevented writing of G723 24kbps AU files.
@@ -533,15 +1384,15 @@
     Corrrection to options for G723 tests.
 
     * configure.in
-    Added --disable-gcc-pipe option for DJGPP compiler (gcc on MS-DOS) which 
+    Added --disable-gcc-pipe option for DJGPP compiler (gcc on MS-DOS) which
     doesn't allow gcc -pipe option.
 
-2000-09-03  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2000-09-03  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/ulaw.c src/alaw.c src/wav_imaadpcm.c src/msadpcm.c src/wav_gsm610.c
     Fixed normailsation bugs shown up by new double_test program.
 
-2000-08-31  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2000-08-31  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/pcm.c
     Fixed bug in normalisation code (spotted by Steve Lhomme).
@@ -550,36 +1401,30 @@
     New file to test scaled and unscaled sf_read_double() and sf_write_double()
     functions.
 
-2000-08-28  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2000-08-28  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * COPYING
     Changed to the LGPL COPYING file (spotted by H. S. Teoh).
 
-2000-08-21  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2000-08-21  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/sndfile.h
-    Removed prototype of unimplemented function sf_get_info(). Added prototype for
-    sf_error_number() Thanks to Sigbj�rn Skj�ret for spotting these.
+    Removed prototype of unimplemented function sf_get_info(). Added prototype
+    for sf_error_number() Thanks to Sigbj�rn Skj�ret for spotting these.
 
-2000-08-18  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2000-08-18  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/newpcm.h
     New file to contain a complete rewrite of the PCM data handling.
 
-2000-08-15  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2000-08-15  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/sndfile.c
-    Fixed a leak of FILE* pointers in sf_open_write(). Thanks to Sigbj�rn Skj�ret
-    for spotting this one.
+    Fixed a leak of FILE* pointers in sf_open_write(). Thanks to Sigbj�rn
+    Skj�ret for spotting this one.
 
-2000-08-15  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2000-08-13  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
-    * src/sndfile.c
-    Fixed a leak of FILE* pointers in sf_open_read(). Thanks to Sigbj�rn Skj�ret
-    for spotting this one.
-
-2000-08-13  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
-
     * src/au_g72x.c src/G72x/g72x.c
     Added G723 encoded AU file support.
 
@@ -586,15 +1431,15 @@
     * tests/lossy_comp_test.c
     Added tests for G721 and G723 encoded AU files.
 
-2000-08-06  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2000-08-06  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * all files
-    Changed the license to LGPL. Albert Faber who had copyright on Win32/unistd.h
-    gave his permission to change the license on that file. All other files were
-    either copyright erikd AT zip DOT com DOT au or copyright under a GPL/LGPL compatible
-    license.
+    Changed the license to LGPL. Albert Faber who had copyright on
+    Win32/unistd.h gave his permission to change the license on that file. All
+    other files were either copyright erikd AT zipworld DOT com DOT au or copyright
+    under a GPL/LGPL compatible license.
 
-2000-08-06  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2000-08-06  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * tests/lossy_comp_test.c
     Fixed incorrect error message.
@@ -606,7 +1451,7 @@
     Replaced this file with a new one which gives a full explanation
     of how to build libsndfile under Win32. Thanks to Mike Ricos.
 
-2000-08-05  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2000-08-05  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/*.[ch]
     Removed double leading underscores from the start of all variable and
@@ -616,11 +1461,11 @@
     * src/au_g72x.c src/G72x/*
     Continued work on G721 encoded AU files.
 
-2000-07-12  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2000-07-12  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/G72x/*
-    New files for reading/writing G721 and G723 ADPCM audio. These files 
-    are from a Sun Microsystems reference implementation released under a 
+    New files for reading/writing G721 and G723 ADPCM audio. These files
+    are from a Sun Microsystems reference implementation released under a
     free software licence.
     Extensive changes to this code to make it fit in with libsndfile.
     See the ChangeLog in this directory for details.
@@ -628,12 +1473,12 @@
     * src/au_g72x.c
     New file for G721 encoded AU files.
 
-2000-07-08  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2000-07-08  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * libsndfile.spec.in
     Added a spec file for making RPMs. Thanks to Josh Green for supplying this.
 
-2000-06-28  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2000-06-28  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/sndfile.c src/sndfile.h
     Add checking for and handling of header-less u-law encoded AU/SND files.
@@ -643,21 +1488,21 @@
     * src/au.h
     New function for opening a headerless u-law encoded file for read.
 
-2000-06-04  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2000-06-04  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/paf.c
     Add checking for files shorter than minimal PAF file header length.
 
-2000-06-02  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2000-06-02  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * tests/write_read_test.c
     Added extra sf_perror() calls when sf_write_XXXX fails.
 
-2000-05-29  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2000-05-29  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/common.c
-    Modified usage of va_arg() macro to work correctly on PowerPC 
-    Linux. Thanks to Kyle Wheeler for giving me ssh access to his 
+    Modified usage of va_arg() macro to work correctly on PowerPC
+    Linux. Thanks to Kyle Wheeler for giving me ssh access to his
     machine while I was trying to track this down.
 
     * configure.in src/*.[ch]
@@ -666,80 +1511,80 @@
     * tests/read_seek_test.c
     Added extra debugging for when tests fail.
 
-2000-05-18  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2000-05-18  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/wav.c
     Fixed bug in GSM 6.10 handling for big-endian machines. Thanks
     to Sigbj�rn Skj�ret for reporting this.
 
-2000-04-25  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2000-04-25  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/sndfile.c src/wav.c src/wav_gsm610.c
     Finallised writing of GSM 6.10 WAV files.
 
     * tests/lossy_comp_test.c
-    Wrote new test code for GSM 6.10 files. 
+    Wrote new test code for GSM 6.10 files.
 
     * examples/sfinfo.c
     Fixed incorrect format in printf() statement.
 
-2000-04-06  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2000-04-06  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/sndfile.h.in
     Fixed comments about sf_perror () and sf_error_str ().
 
-2000-03-14  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2000-03-14  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * configure.in
     Fixed --enable-justsrc option.
 
-2000-03-07  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2000-03-07  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * wav.c
     Fixed checking of bytespersec field of header. Still some weirdness
     with some files.
 
-2000-03-05  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2000-03-05  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * tests/lossy_comp_test.c
     Added option to test PCM WAV files (sanity check).
     Fixed bug in sf_seek() tests.
 
-2000-02-29  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2000-02-29  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/sndfile.c src/wav.c
     Minor changes to allow writing of GSM 6.10 WAV files.
 
-2000-02-28  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2000-02-28  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * configure.in Makefile.am src/Makefile.am
-    Finally got around to figuring out how to build a single library from 
+    Finally got around to figuring out how to build a single library from
     multiple source directories.
     Reading GSM 6.10 files now seems to work.
 
-2000-01-03  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2000-01-03  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/wav.c
     Added more error reporting in read_fmt_chunk().
 
-1999-12-21  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+1999-12-21  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * examples/sfinfo.c
     Modified program to accept multiple filenames from the command line.
 
-1999-11-27  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+1999-11-27  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/wav_ima_adpcm.c
     Moved code around in preparation to adding ability to read/write IMA ADPCM
     encoded AIFF files.
 
-1999-11-16  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+1999-11-16  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/common.c
-    Fixed put_int() and put_short() macros used by _psf_hprintf() which were 
+    Fixed put_int() and put_short() macros used by _psf_hprintf() which were
     causing seg. faults on Sparc Solaris.
 
-1999-11-15  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+1999-11-15  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/common.c
     Added string.h to includes. Thanks to Sigbjxrn Skjfret.
@@ -748,20 +1593,20 @@
     Fixed __svx_close() function to ensure FORM and BODY chunks are correctly
     set.
 
-1999-10-01  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+1999-10-01  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/au.c
-    Fixed handling of incorrect size field in AU header on read. Thanks to 
+    Fixed handling of incorrect size field in AU header on read. Thanks to
     Christoph Lauer for finding this problem.
 
-1999-09-28  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+1999-09-28  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/aiff.c
     Fixed a bug with incorrect SSND chunk length being written. This also lead
-    to finding an minor error in AIFF header parsing. Thanks to Dan Timis for 
+    to finding an minor error in AIFF header parsing. Thanks to Dan Timis for
     pointing this out.
 
-1999-09-24  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+1999-09-24  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/paf.c
     Fixed a bug with reading and writing 24 bit stereo PAF files. This problem
@@ -768,28 +1613,29 @@
     came to light when implementing tests for the new functions which operate
     in terms of frames rather than items.
 
-1999-09-23  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+1999-09-23  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/sndfile.c
-    Modified file type detection to use first 12 bytes of file rather than 
-    file name extension. Required this because NIST files use the same 
+    Modified file type detection to use first 12 bytes of file rather than
+    file name extension. Required this because NIST files use the same
     filename extension as Microsoft WAV files.
 
     * src/sndfile.c src/sndfile.h
-    Added short, int and double read/write functions which work in frames rather 
-    than items. This was originally suggested by Maurizio Umberto Puxeddu
+    Added short, int and double read/write functions which work in frames
+    rather than items. This was originally suggested by Maurizio Umberto
+    Puxeddu.
 
-1999-09-22  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+1999-09-22  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/svx.c
     Finished off implementation of write using __psf_hprintf().
 
-1999-09-21  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+1999-09-21  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/common.h
     Added a buffer to SF_PRIVATE for writing the header. This is required
     to make generating headers for IFF/SVX files easier as well as making
-    it easier to do re-write the headers which will be required when 
+    it easier to do re-write the headers which will be required when
     sf_rewrite_header() is implemented.
 
     * src/common.c
@@ -796,11 +1642,11 @@
     Implemented __psf_hprintf() function. This is an internal function
     which is documented briefly just above the code.
 
-1999-09-05  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+1999-09-05  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/sndfile.c
     Fixed a bug in sf_write_raw() where it was returning incorrect values
-    (thanks to Richard Dobson for finding this one). Must put in a test 
+    (thanks to Richard Dobson for finding this one). Must put in a test
     routine for sf_read_raw and sf_write_raw.
 
     * src/aiff.c
@@ -807,7 +1653,7 @@
     Fixed default FORMsize in __aiff_open_write ().
 
     * src/sndfile.c
-    Added copy of filename to internal data structure. IFF/SVX files 
+    Added copy of filename to internal data structure. IFF/SVX files
     contain a NAME header chunk. Both sf_open_read() and sf_open_write()
     copy the file name (less the leading path information) to the
     filename field.
@@ -815,7 +1661,7 @@
     * src/svx.c
     Started implementing writing of files.
 
-1999-08-04  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+1999-08-04  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/svx.c
     New file for reading/writing 8SVX and 16SVX files.
@@ -826,7 +1672,7 @@
     * src/aiff.c
     Fixed header parsing when unknown chunk is found.
 
-1999-08-01  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+1999-08-01  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/paf.c
     New file for reading/writing Ensoniq PARIS audio file format.
@@ -838,12 +1684,12 @@
     Added stuff for sf_get_lib_version() function.
 
 
-1999-07-31  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+1999-07-31  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/sndfile.h MacOS/config.h
     Fixed minor MacOS configuration issues.
 
-1999-07-30  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+1999-07-30  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * MacOS/
     Added a new directory for the MacOS config.h file and the
@@ -853,16 +1699,16 @@
     Fixed calculation of datalength when reading SSND chunk. Thanks to
     Sigbj�rn Skj�ret for pointing out this error.
 
-1999-07-29  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+1999-07-29  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/sndfile.c src/sndfile.h src/raw.c
     Further fixing of #includes for MacOS.
 
-1999-07-25  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+1999-07-25  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/wav.c src/aiff.c
     Added call to ferror () in main header parsing loop of __XXX_open_read
-    functions. This should fix problems on platforms (MacOS, AmigaOS) where 
+    functions. This should fix problems on platforms (MacOS, AmigaOS) where
     fseek()ing or fread()ing beyond the end of the file puts the FILE*
     stream in an error state until clearerr() is called.
 
@@ -893,7 +1739,7 @@
     New file with instructions for building libsndfile under MacOS. Thanks
     to Ben "Jacobs" for supplying these instructions.
 
-1999-07-24  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+1999-07-24  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * configure.in
     Removed sndfile.h from generated file list as there were no longer
@@ -905,14 +1751,14 @@
     SF_INFO struct when calling sf_open_read ().
 
     * src/sndfile.c
-    Added support for raw header-less PCM files.    
+    Added support for raw header-less PCM files.
 
-1999-07-22  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+1999-07-22  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * examples/sfinfo.c
     Removed options so the sfinfo program always prints out all the information.
 
-1999-07-19  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+1999-07-19  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/alaw.c
     New file for A-law encoding (similar to u-law).
@@ -923,18 +1769,18 @@
     * tests/lossy_comp_test.c
     Added tests for a-law encoded WAV, AU and AULE files.
 
-1999-07-18  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+1999-07-18  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/sndfile.c src/au.c
     Removed second "#include <unistd.h>". Thanks to Ben "Jacobs" for pointing
     this out.
 
-1999-07-18  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+1999-07-18  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * tests/ulaw_test.c
     New test program to test the u-law encode/decode lookup tables.
 
-1999-07-16  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+1999-07-16  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/sndfile.h
     Made corrections to comments on the return values from sf_seek ().
@@ -942,7 +1788,7 @@
     * src/sndfile.c
     Fixed boundary condition checking bug and accounting bug in sf_read_raw ().
 
-1999-07-15  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+1999-07-15  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/au.c src/ulaw.c
     Finished implementation of u-law encoded AU files.
@@ -955,15 +1801,15 @@
     will now be used to test Ulaw and Alaw encoding as well as APDCM.
     Added tests for Ulaw encoded WAV files.
 
-1999-07-14  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+1999-07-14  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * tests/adpcm_test.c
     Initialised amp variable in gen_signal() to remove compiler warning.
 
-1999-07-12  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+1999-07-12  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/aiff.c
-    In __aiff_open_read () prevented fseek()ing beyond end of file which 
+    In __aiff_open_read () prevented fseek()ing beyond end of file which
     was causing trouble on MacOS with the MetroWerks compiler. Thanks to
     Ben "Jacobs" for pointing this out.
 
@@ -970,7 +1816,7 @@
     *src/wav.c
     Fixed as above in __wav_open_read ().
 
-1999-07-01    Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+1999-07-01    Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/wav_ms_adpcm.c
     Implemented MS ADPCM encoding. Code cleanup of decoder.
@@ -982,23 +1828,23 @@
     Fixed incorrect parameter in call to srate2blocksize () from
     __ima_writer_init ().
 
-1999-06-23  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+1999-06-23  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * tests/read_seek_test.c
     Added test for 8 bit AIFF files.
 
-1999-06-18  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+1999-06-18  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * tests/write_read_test.c
     Removed test for IMA ADPCM WAV files which is now done in adpcm_test.c
 
     * configure.in
-    Added -Wconversion to CFLAGS. 
+    Added -Wconversion to CFLAGS.
 
     * src/*.c tests/*.c examples/*.c
-    Fixed all warnings resulting from use of -Wconversion. 
+    Fixed all warnings resulting from use of -Wconversion.
 
-1999-06-17  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+1999-06-17  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/wav.c
     Added fact chunk handling on read and write for all non WAVE_FORMAT_PCM
@@ -1010,16 +1856,17 @@
     players.
 
     * tests/adpcm_test.c
-    Reimplemented adpcm_test_short and implemented adpcm_test_int and adpcm_test_double.
+    Reimplemented adpcm_test_short and implemented adpcm_test_int and
+    adpcm_test_double.
     Now have full testing of IMA ADPCM WAV file read, write and seek.
 
-1999-06-15  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+1999-06-15  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/wav_float.c
-    Fixed function prototype for x86f2d_array () which was causing ocassional 
+    Fixed function prototype for x86f2d_array () which was causing ocassional
     seg. faults on Sparc Solaris machines.
 
-1999-06-14  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+1999-06-14  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/aiff.c
     Fixed bug in __aiff_close where the length fields in the header were
@@ -1028,7 +1875,7 @@
     * tests/write_read_test.c
     Modified to detect the above bug in WAV, AIFF and AU files.
 
-1999-06-12    Erik de Castro Lopo     <erikd AT zip DOT com DOT au>
+1999-06-12    Erik de Castro Lopo     <erikd AT zipworld DOT com DOT au>
 
     * Win32/*
     Added a contribution from Albert Faber to allow libsndfile to compile
@@ -1035,7 +1882,7 @@
     under Win32 systems. libsndfile will now be used as part of LAME the
     the MPEG 1 Layer 3 encoder (http://internet.roadrunner.com/~mt/mp3/).
 
-1999-06-11    Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+1999-06-11    Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * configure.in
     Changed to reflect previous changes.
@@ -1043,13 +1890,13 @@
     * src/wav_ima_adpcm.c
     Fixed incorrect calculation of bytespersec header field (IMA ADPCM only).
 
-    Fixed bug when writing from int or double data to IMA ADPCM file. Will need 
+    Fixed bug when writing from int or double data to IMA ADPCM file. Will need
     to write test code for this.
 
-    Fixed bug in __ima_write () whereby the length of the current block was 
+    Fixed bug in __ima_write () whereby the length of the current block was
     calculated incorrectly. Thanks to Jongcheon Park for pointing this out.
 
-1999-03-27  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+1999-03-27  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/*.c
     Changed all read/write/lseek function calls to fread/fwrite/
@@ -1063,22 +1910,22 @@
     Add new test to check all error values have an associated error
     string. This will avoid embarrassing real world core dumps.
 
-1999-03-23  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+1999-03-23  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/wav.c src/aiff.c
-    Added handling for unknown chunk markers in the file. 
+    Added handling for unknown chunk markers in the file.
 
-1999-03-22  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+1999-03-22  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/sndfile.c
-    Filled in missing error strings in SndfileErrors array. Missing entries 
-    can cause core dumps when calling sf_error-str (). Thanks to Sam 
+    Filled in missing error strings in SndfileErrors array. Missing entries
+    can cause core dumps when calling sf_error-str (). Thanks to Sam
     <mrsam at-sign geocities.com> for finding this problem.
 
-1999-03-21  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+1999-03-21  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/wav_ima_adpcm.c
-    Work on wav_ms_adpcm.c uncovered a bug in __ima_read () when reading 
+    Work on wav_ms_adpcm.c uncovered a bug in __ima_read () when reading
     stereo files. Caused by not adjusting offset into buffer of decoded
     samples for 2 channels. A similar bug existed in __ima_write ().
     Need a test for stereo ADPCM files.
@@ -1086,7 +1933,7 @@
     * src/wav_ms_adpcm.c
     Decoder working correctly.
 
-1999-03-18  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+1999-03-18  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * configure.in Makefile.am
     Added --enable-justsrc configuration variable sent by Sam
@@ -1095,18 +1942,18 @@
     * src/wav_ima_adpcm.c
     Fixed bug when reading beyond end of data section due to not
     checking pima->blockcount.
-    This uncovered __ima_seek () bug due to pima->blockcount being set 
+    This uncovered __ima_seek () bug due to pima->blockcount being set
     before calling __ima_init_block ().
 
-1999-03-17  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+1999-03-17  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/wav.c
-    Started implementing MS ADPCM decoder. 
+    Started implementing MS ADPCM decoder.
     If file is WAVE_FORMAT_ADPCM and length of data chunk is odd, this
     encoder seems to add an extra byte. Why not just give an even data
-    length? 
+    length?
 
-1999-03-16  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+1999-03-16  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/wav.c
     Split code out of wav.c to create wav_float.c and wav_ima_adpcm.c.
@@ -1113,7 +1960,7 @@
     This will make it easier to add and debug other kinds of WAV files
     in future.
 
-1999-03-14  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+1999-03-14  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * tests/
     Added adpcm_test.c which implements test functions for
@@ -1120,22 +1967,22 @@
     IMA ADPCM reading/writing/seeking etc.
 
     * src/wav.c
-    Fixed many bugs in IMA ADPCM encoder and decoder. 
+    Fixed many bugs in IMA ADPCM encoder and decoder.
 
-1999-03-11  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+1999-03-11  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/wav.c
-    Finished implementing IMA ADPCM encoder and decoder (what a bitch!). 
+    Finished implementing IMA ADPCM encoder and decoder (what a bitch!).
 
-1999-03-03  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+1999-03-03  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/wav.c
-    Started implementing IMA ADPCM decoder. 
+    Started implementing IMA ADPCM decoder.
 
-1999-03-02  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+1999-03-02  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/sndfile.c
-    Fixed bug where the sf_read_XXX functions were returning a 
+    Fixed bug where the sf_read_XXX functions were returning a
     incorrect read count when reading past end of file.
     Fixed bug in sf_seek () when seeking backwards from end of file.
 
@@ -1145,7 +1992,7 @@
     Added extra chunk to all test WAV files to test that reading
     stops at end of 'data' chunk.
 
-1999-02-21  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+1999-02-21  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * tests/write_read_test.c
     Added tests for little DEC endian AU files.
@@ -1153,7 +2000,7 @@
     * src/au.c
     Add handling for DEC format little endian AU files.
 
-1999-02-20  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+1999-02-20  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/aiff.c src/au.c src/wav.c
     Add __psf_sprintf calls during header parsing.
@@ -1170,7 +2017,7 @@
     * src/aiff.c
     On write, set blocksize in SSND chunk to zero like everybody else.
 
-1999-02-16  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+1999-02-16  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/pcm.c:
     Fixed bug in let2s_array (cptr was not being initialised).
@@ -1179,13 +2026,13 @@
     Fixed bug in sf_read_raw and sf_write_raw. sf_seek should
     now work when using these functions.
 
-1999-02-15  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+1999-02-15  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * tests/write_read_test.c:
     Force test_buffer array to be double aligned. Sparc Solaris
     requires this.
 
-1999-02-14  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+1999-02-14  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/pcm.c:
     Fixed a bug which was causing errors in the reading
@@ -1194,7 +2041,7 @@
     * doc/api.html
     Finished of preliminary documentaion.
 
-1999-02-13  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+1999-02-13  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * src/aiff.c:
     Changed reading of 'COMM' chunk to avoid reading an int
--- a/common/libsndfile/MacOS/MacOS-readme.txt
+++ b/common/libsndfile/MacOS/MacOS-readme.txt
@@ -64,19 +64,3 @@
 information about libsndfile.
 
 
-CONTACTS
---------
-
-libsndfile was written by Erik de Castro Lopo ([email protected]).  
-The libsndfile home page is at :
-
-        http://www.zip.com.au/~erikd/libsndfile/
-
-MacOS-specific questions, and issues specific to the instructions
-contained in this document should be directed to Ben "Jacobs" at the
-address below.
-
-
-Good luck,
-
--Ben "Jacobs" <[email protected]>
--- a/common/libsndfile/MacOS/Makefile.am
+++ b/common/libsndfile/MacOS/Makefile.am
@@ -1,1 +1,3 @@
-EXTRA_DIST = 	config.h MacOS-readme.txt
+EXTRA_DIST = config.h MacOS-readme.txt
+
+DISTCLEANFILES = Makefile
--- a/common/libsndfile/MacOS/Makefile.in
+++ b/common/libsndfile/MacOS/Makefile.in
@@ -66,17 +66,28 @@
 AS = @AS@
 CC = @CC@
 DLLTOOL = @DLLTOOL@
+ECHO = @ECHO@
+EXEEXT = @EXEEXT@
+GETCONF = @GETCONF@
 LIBTOOL = @LIBTOOL@
 LN_S = @LN_S@
 MAKEINFO = @MAKEINFO@
 OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OS_SPECIFIC_INCLUDES = @OS_SPECIFIC_INCLUDES@
+OS_SPECIFIC_LINKS = @OS_SPECIFIC_LINKS@
 PACKAGE = @PACKAGE@
 RANLIB = @RANLIB@
 SHARED_VERSION_INFO = @SHARED_VERSION_INFO@
+STRIP = @STRIP@
 VERSION = @VERSION@
+ac_cv_sys_largefile_CFLAGS = @ac_cv_sys_largefile_CFLAGS@
+autogen = @autogen@
 subdirs = @subdirs@
 
 EXTRA_DIST = config.h MacOS-readme.txt
+
+DISTCLEANFILES = Makefile
 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
 CONFIG_HEADER = ../src/config.h
 CONFIG_CLEAN_FILES = 
@@ -90,7 +101,7 @@
 all: all-redirect
 .SUFFIXES:
 $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
-	cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps MacOS/Makefile
+	cd $(top_srcdir) && $(AUTOMAKE) --foreign --include-deps MacOS/Makefile
 
 Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
 	cd $(top_builddir) \
@@ -148,6 +159,7 @@
 distclean-generic:
 	-rm -f Makefile $(CONFIG_CLEAN_FILES)
 	-rm -f config.cache config.log stamp-h stamp-h[0-9]*
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
 mostlyclean-am:  mostlyclean-generic
--- a/common/libsndfile/MacOS/config.h
+++ b/common/libsndfile/MacOS/config.h
@@ -1,39 +1,9 @@
 /* src/config.h.  Generated automatically by configure.  */
-/* src/config.h.in.  Generated automatically from configure.in by autoheader.  */
+/* src/config.h.in.  Generated automatically from configure.in by autoheader 2.13.  */
 
-/* Define to `long' if <sys/types.h> doesn't define.  */
-/* #undef off_t */
-
-/* Define to `unsigned' if <sys/types.h> doesn't define.  */
-/* #undef size_t */
-
 /* Define if you have the ANSI C header files.  */
 #define STDC_HEADERS 1
 
-/* Define to `long' if <sys/types.h> doesn't define.  */
-/* #undef off_t */
-
-/* Define to `unsigned' if <sys/types.h> doesn't define.  */
-/* #undef size_t */
-
-/* Define if you have the ANSI C header files.  */
-#define STDC_HEADERS 1
-
-/* Set to 1 if the processor is big endian, otherwise set to 0.  */
-#ifdef __MWERKS__
-#ifdef _WIN32
-#define GUESS_BIG_ENDIAN 0
-#define GUESS_LITTLE_ENDIAN 1
-#else
-#define GUESS_BIG_ENDIAN 1
-#define GUESS_LITTLE_ENDIAN 0
-#endif
-#endif
-
-/* Set to 1 to force the use of code for processors with broken floats */
-/* Otherwise set it to 0.  */
-#define	FORCE_BROKEN_FLOAT 0
-
 /* The number of bytes in a double.  */
 #define SIZEOF_DOUBLE 8
 
@@ -46,6 +16,9 @@
 /* The number of bytes in a long.  */
 #define SIZEOF_LONG 4
 
+/* The number of bytes in a off_t.  */
+#define SIZEOF_OFF_T 4
+
 /* The number of bytes in a short.  */
 #define SIZEOF_SHORT 2
 
@@ -52,30 +25,24 @@
 /* The number of bytes in a void*.  */
 #define SIZEOF_VOIDP 4
 
-/* Define if you have the fclose function.  */
-#define HAVE_FCLOSE 1
-
-/* Define if you have the fopen function.  */
-#define HAVE_FOPEN 1
-
-/* Define if you have the fread function.  */
-#define HAVE_FREAD 1
-
 /* Define if you have the free function.  */
 #define HAVE_FREE 1
 
-/* Define if you have the fseek function.  */
-#define HAVE_FSEEK 1
+/* Define if you have the fstat function.  */
+#define HAVE_FSTAT 1
 
-/* Define if you have the ftell function.  */
-#define HAVE_FTELL 1
+/* Define if you have the lseek function.  */
+#define HAVE_LSEEK 1
 
-/* Define if you have the fwrite function.  */
-#define HAVE_FWRITE 1
-
 /* Define if you have the malloc function.  */
 #define HAVE_MALLOC 1
 
+/* Define if you have the open function.  */
+#define HAVE_OPEN 1
+
+/* Define if you have the read function.  */
+#define HAVE_READ 1
+
 /* Define if you have the snprintf function.  */
 #define HAVE_SNPRINTF 1
 
@@ -82,6 +49,12 @@
 /* Define if you have the vsnprintf function.  */
 #define HAVE_VSNPRINTF 1
 
+/* Define if you have the write function.  */
+#define HAVE_WRITE 1
+
+/* Define if you have the <dlfcn.h> header file.  */
+#define HAVE_DLFCN_H 1
+
 /* Define if you have the <endian.h> header file.  */
 #define HAVE_ENDIAN_H 1
 
@@ -89,5 +62,35 @@
 #define PACKAGE "libsndfile"
 
 /* Version number of package */
-#define VERSION "0.0.26"
+#define VERSION "1.0.0rc2"
+
+/* Number of bits in a file offset, on hosts where this is settable. */
+/* #undef _FILE_OFFSET_BITS 64 */
+
+/* Define to make fseeko etc. visible, on some hosts. */
+/* #undef _LARGEFILE_SOURCE */
+
+/* Define for large files, on AIX-style hosts. */
+/* #undef _LARGE_FILES */
+
+/* Target processor is big endian. */
+#define CPU_IS_BIG_ENDIAN 1
+
+/* Target processor is little endian. */
+#define CPU_IS_LITTLE_ENDIAN 0
+
+/* Define if you have C99's lrint function. */
+#define HAVE_LRINT 1
+
+/* Define if you have C99's lrintf function. */
+#define HAVE_LRINTF 1
+
+/* Set to 1 to force the use of code for processors with broken floats */
+#define FORCE_BROKEN_FLOAT 0
+
+/* Set to 1 to force the use of code for processors with broken floats */
+#define FORCE_BROKEN_FLOAT 0
+
+/* Set to 1 if compiling for Win32 */
+#define OS_IS_WIN32 0
 
--- a/common/libsndfile/Makefile.am
+++ b/common/libsndfile/Makefile.am
@@ -1,5 +1,10 @@
 DIST_SUBDIRS = src examples doc tests Win32 MacOS
 SUBDIRS = @subdirs@
-EXTRA_DIST = reconf acconfig.h libsndfile.spec.in libsndfile.spec \
-			 check_libsndfile.py
+EXTRA_DIST = reconf acinclude.m4 libsndfile.spec.in sndfile.pc.in \
+			check_libsndfile.py libsndfile_version_convert.py
+			
+			 
+pkgconfigdir = $(libdir)/pkgconfig
+pkgconfig_DATA = sndfile.pc
 
+m4datadir = $(datadir)/aclocal
--- a/common/libsndfile/Makefile.in
+++ b/common/libsndfile/Makefile.in
@@ -66,28 +66,44 @@
 AS = @AS@
 CC = @CC@
 DLLTOOL = @DLLTOOL@
+ECHO = @ECHO@
+EXEEXT = @EXEEXT@
+GETCONF = @GETCONF@
 LIBTOOL = @LIBTOOL@
 LN_S = @LN_S@
 MAKEINFO = @MAKEINFO@
 OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OS_SPECIFIC_INCLUDES = @OS_SPECIFIC_INCLUDES@
+OS_SPECIFIC_LINKS = @OS_SPECIFIC_LINKS@
 PACKAGE = @PACKAGE@
 RANLIB = @RANLIB@
 SHARED_VERSION_INFO = @SHARED_VERSION_INFO@
+STRIP = @STRIP@
 VERSION = @VERSION@
+ac_cv_sys_largefile_CFLAGS = @ac_cv_sys_largefile_CFLAGS@
+autogen = @autogen@
 subdirs = @subdirs@
 
 DIST_SUBDIRS = src examples doc tests Win32 MacOS
 SUBDIRS = @subdirs@
-EXTRA_DIST = reconf acconfig.h libsndfile.spec.in libsndfile.spec 			 check_libsndfile.py
+EXTRA_DIST = reconf acinclude.m4 libsndfile.spec.in sndfile.pc.in 			check_libsndfile.py libsndfile_version_convert.py
 
+
+pkgconfigdir = $(libdir)/pkgconfig
+pkgconfig_DATA = sndfile.pc
+
+m4datadir = $(datadir)/aclocal
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
 CONFIG_HEADER = ./src/config.h
-CONFIG_CLEAN_FILES =  libsndfile.spec
+CONFIG_CLEAN_FILES =  libsndfile.spec sndfile.pc
+DATA =  $(pkgconfig_DATA)
+
 DIST_COMMON =  README AUTHORS COPYING ChangeLog INSTALL Makefile.am \
-Makefile.in NEWS TODO acconfig.h aclocal.m4 config.guess config.sub \
+Makefile.in NEWS TODO acinclude.m4 aclocal.m4 config.guess config.sub \
 configure configure.in install-sh libsndfile.spec.in ltconfig ltmain.sh \
-missing mkinstalldirs src/config.h.in src/stamp-h.in
+missing mkinstalldirs sndfile.pc.in
 
 
 DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
@@ -97,13 +113,13 @@
 all: all-redirect
 .SUFFIXES:
 $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
-	cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps Makefile
+	cd $(top_srcdir) && $(AUTOMAKE) --foreign --include-deps Makefile
 
 Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
 	cd $(top_builddir) \
 	  && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status
 
-$(ACLOCAL_M4):  configure.in 
+$(ACLOCAL_M4):  configure.in  acinclude.m4
 	cd $(srcdir) && $(ACLOCAL)
 
 config.status: $(srcdir)/configure.in $(CONFIG_STATUS_DEPENDENCIES)
@@ -110,37 +126,30 @@
 	$(SHELL) ./config.status --recheck
 $(srcdir)/configure: $(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES)
 	cd $(srcdir) && $(AUTOCONF)
-
-src/config.h: src/stamp-h
-	@if test ! -f $@; then \
-		rm -f src/stamp-h; \
-		$(MAKE) src/stamp-h; \
-	else :; fi
-src/stamp-h: $(srcdir)/src/config.h.in $(top_builddir)/config.status
-	cd $(top_builddir) \
-	  && CONFIG_FILES= CONFIG_HEADERS=src/config.h \
-	     $(SHELL) ./config.status
-	@echo timestamp > src/stamp-h 2> /dev/null
-$(srcdir)/src/config.h.in: $(srcdir)/src/stamp-h.in
-	@if test ! -f $@; then \
-		rm -f $(srcdir)/src/stamp-h.in; \
-		$(MAKE) $(srcdir)/src/stamp-h.in; \
-	else :; fi
-$(srcdir)/src/stamp-h.in: $(top_srcdir)/configure.in $(ACLOCAL_M4) acconfig.h
-	cd $(top_srcdir) && $(AUTOHEADER)
-	@echo timestamp > $(srcdir)/src/stamp-h.in 2> /dev/null
-
-mostlyclean-hdr:
-
-clean-hdr:
-
-distclean-hdr:
-	-rm -f src/config.h
-
-maintainer-clean-hdr:
 libsndfile.spec: $(top_builddir)/config.status libsndfile.spec.in
 	cd $(top_builddir) && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status
+sndfile.pc: $(top_builddir)/config.status sndfile.pc.in
+	cd $(top_builddir) && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status
 
+install-pkgconfigDATA: $(pkgconfig_DATA)
+	@$(NORMAL_INSTALL)
+	$(mkinstalldirs) $(DESTDIR)$(pkgconfigdir)
+	@list='$(pkgconfig_DATA)'; for p in $$list; do \
+	  if test -f $(srcdir)/$$p; then \
+	    echo " $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(pkgconfigdir)/$$p"; \
+	    $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(pkgconfigdir)/$$p; \
+	  else if test -f $$p; then \
+	    echo " $(INSTALL_DATA) $$p $(DESTDIR)$(pkgconfigdir)/$$p"; \
+	    $(INSTALL_DATA) $$p $(DESTDIR)$(pkgconfigdir)/$$p; \
+	  fi; fi; \
+	done
+
+uninstall-pkgconfigDATA:
+	@$(NORMAL_UNINSTALL)
+	list='$(pkgconfig_DATA)'; for p in $$list; do \
+	  rm -f $(DESTDIR)$(pkgconfigdir)/$$p; \
+	done
+
 # This directory's subdirectories are mostly independent; you can cd
 # into them and run `make' without going through this Makefile.
 # To change the values of `make' variables: instead of editing Makefiles,
@@ -299,20 +308,21 @@
 install-exec-am:
 install-exec: install-exec-recursive
 
-install-data-am:
+install-data-am: install-pkgconfigDATA
 install-data: install-data-recursive
 
 install-am: all-am
 	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
 install: install-recursive
-uninstall-am:
+uninstall-am: uninstall-pkgconfigDATA
 uninstall: uninstall-recursive
-all-am: Makefile
+all-am: Makefile $(DATA)
 all-redirect: all-recursive
 install-strip:
 	$(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
 installdirs: installdirs-recursive
 installdirs-am:
+	$(mkinstalldirs)  $(DESTDIR)$(pkgconfigdir)
 
 
 mostlyclean-generic:
@@ -324,22 +334,22 @@
 	-rm -f config.cache config.log stamp-h stamp-h[0-9]*
 
 maintainer-clean-generic:
-mostlyclean-am:  mostlyclean-hdr mostlyclean-tags mostlyclean-generic
+mostlyclean-am:  mostlyclean-tags mostlyclean-generic
 
 mostlyclean: mostlyclean-recursive
 
-clean-am:  clean-hdr clean-tags clean-generic mostlyclean-am
+clean-am:  clean-tags clean-generic mostlyclean-am
 
 clean: clean-recursive
 
-distclean-am:  distclean-hdr distclean-tags distclean-generic clean-am
+distclean-am:  distclean-tags distclean-generic clean-am
 	-rm -f libtool
 
 distclean: distclean-recursive
 	-rm -f config.status
 
-maintainer-clean-am:  maintainer-clean-hdr maintainer-clean-tags \
-		maintainer-clean-generic distclean-am
+maintainer-clean-am:  maintainer-clean-tags maintainer-clean-generic \
+		distclean-am
 	@echo "This command is intended for maintainers to use;"
 	@echo "it deletes files that may require special tools to rebuild."
 
@@ -346,7 +356,7 @@
 maintainer-clean: maintainer-clean-recursive
 	-rm -f config.status
 
-.PHONY: mostlyclean-hdr distclean-hdr clean-hdr maintainer-clean-hdr \
+.PHONY: uninstall-pkgconfigDATA install-pkgconfigDATA \
 install-data-recursive uninstall-data-recursive install-exec-recursive \
 uninstall-exec-recursive installdirs-recursive uninstalldirs-recursive \
 all-recursive check-recursive installcheck-recursive info-recursive \
--- a/common/libsndfile/NEWS
+++ b/common/libsndfile/NEWS
@@ -1,95 +1,12 @@
-Version 0.0.26 (2001-09-30)
-  * Offical release.
-  * Changed how A-law and u-law WAV file headers are written to allow files generated
-    by libsndfile to be read by M$ windoze.
-  * Added IRCAM file support.
-  * Minor bug fixes.
-  * This will be the last release in the 0.0.X development stream apart from bug fixes.
-    A new deveopement stream with minor interface changes in already in development.
+Version 1.0.0rc2 (2002-06-24)
+  * Release candidate 2 for the 1.0.0 series.
+  * Fix compile problem for Win32.
 
-Version 0.0.25 (2001-09-24)
-  * Offical release.
-  * Added sf_command () interface which allows switching normalisation on and off for
-    sf_read/write_float () methods.  
-  * Minor bug fixes.
-  * This will be the last release in the 0.0.X development stream apart from bug fixes.
-    A new deveopement stream with minor interface changes in already in development.
+Version 1.0.0rc1 (2002-06-24)
+  * Release candidate 1 for the 1.0.0 series.
 
-Version 0.0.24 (2001-08-19)
-  * Offical release.
-  * Massive refactoring of header reading code for all file formats.
-  * Added sf_read_float () and sf_write_float () interfaces.
-  * Minor bug fixes.
+Version 0.0.28 (2002-04-27)
+  * Last offical release of 0.0.X series of the library.
 
-Version 0.0.23 (2001-07-06)
-  * Offical release.
-  * Massive refactoring of header writing code for all file formats.
-  * Added support for Sphere NIST.
-  * Added support for 32 bit float AIFF and little endian AIFF files (Mac OSX).
-  * Added read and write support for the PEAK chunk in 32 bit float AIFF and WAV files.
-  * Added support for REX files (Propellorheads Reason).
-  * Minor bug fixes.
-
-Version 0.0.22 (2000-10-17)
-  * Offical release.
-  * Bug fix in G723 AU file handling.
-
-Version 0.0.21 (2000-08-16)
-  * Offical release.
-  * AU files without the normal AU file header are now recognised as headerless
-    8kHz 8 bit ulaw encoded files.
-  * Added handling for G721 4bit APDCM encoded AU files.
-  * Added handling for G723 3bit APDCM encoded AU files.
-  * Improved Win32 compiling and use instructions from Mike Ricos.
-  * License change from GPL to LGPL.
-
-Version 0.0.20 (2000-05-30)
-  * Offical release.
-  * Minor bug fix for LinuxPPC (endian issues).
-
-Version 0.0.19 (2000-05-20)
-  * Offical release.
-  * Minor bug fix for handling GSM 6.10 encoded WAV files on big endian machines.
-
-Version 0.0.18 (2000-04-25)
-  * Offical release.
-  * Added handling for GSM 6.10 encoded WAV files.
-  * Minor bug fixes.
-
-Version 0.0.17 (1999-11-16)
-  * Offical release.
-  * New file formats (SVX and PAF).
-  * Minor bug fixes.
-
-Version 0.0.16 (1999-07-31)
-  * Offical release.
-  * Fixed minor MacOS configuration issues.
-
-Version 0.0.15 (1999-07-30)
-  * Offical release.
-  * Added MS ADPCM WAV file write.
-  * Added WAV and AU file A-law and u-law encoding.
-  * Added RAW header-less PCM file handling.
-  * Added MacOS support (thanks to Ben "Jacobs").
-
-Version 0.0.12 (1999-06-19)
-  * Offical release.
-  * Code cleanup to remove compiler warning messages.
-
-Version 0.0.10 (1999-06-12)
-  * Unoffical release.
-  * Changes to low level code which improve error detection and handling.
-  * Added read-only handling of Microsoft ADPCM WAV files.
-  * Added Win32 support (almost exclusively due to Albert Faber, thanks).
-  * Fixed bug in IMA ADPCM file writing.
-
-Version 0.0.9 (1999-03-14)
-  * Add handling of IMA ADPCM WAV files.
-  * Add new function sf_get_header_info and add example program sfinfo.
-  * Implemented 8 bit PCM data formats for AIFF, AU and WAV.
-  
 Version 0.0.8 (1999-02-16)
   * First offical release.
-
-Version 0.0.7 (1999-02-13)
-  * First unoffical release.
--- a/common/libsndfile/README
+++ b/common/libsndfile/README
@@ -1,4 +1,4 @@
-This is libsndfile, 0.0.26
+This is libsndfile, 1.0.1rc2 (Release Candidate 2)
 
 libsndfile is a library of C routines for reading and writing 
 files containing sampled audio data. 
@@ -29,12 +29,24 @@
 Bormann. Their original code can be found at :
     http://kbs.cs.tu-berlin.de/~jutta/toast.html
 
-The src/G72x directory contains code written and released by Sum Microsystems
+The src/G72x directory contains code written and released by Sun Microsystems
 under a suitably free license.
 
+
+Win32
+-----
+There are detailed instructions for building libsndfile on Win32 in the file
+
+	doc/win32.html
+	
+
+MacOSX
+------
+Building on MacOSX should be the same as building it on any other Unix.
+
+
 OTHER PLATFORMS
 ---------------
-
 To compile libsndfile on platforms which have a Bourne Shell compatible
 shell, an ANSI C compiler and a make utility should require no more that
 the following three commands :
@@ -55,7 +67,7 @@
 CONTACTS
 --------
 
-libsndfile was written by Erik de Castro Lopo (erikd AT zip DOT com DOT au).  
+libsndfile was written by Erik de Castro Lopo (erikd AT zipworld DOT com DOT au).  
 The libsndfile home page is at :
 
 	http://www.zip.com.au/~erikd/libsndfile/
--- a/common/libsndfile/TODO
+++ b/common/libsndfile/TODO
@@ -16,10 +16,6 @@
 
   o Test sf_seek function on write???
 
-  o Get hold of a couple of Sun/Next AU files containing 32 and 64 bit 
-    floating point data write code to read and write them (well at least
-    the 32 bit ones).
-
   o Add more sound file formats. People should contact me with their
     requirements. 
 
--- a/common/libsndfile/Win32/Makefile.am
+++ b/common/libsndfile/Win32/Makefile.am
@@ -1,3 +1,3 @@
-EXTRA_DIST = 	README-Win32.txt README-Win32.txt.old	\
-				config.h unistd.h
+EXTRA_DIST = README-Win32.txt config.h unistd.h libsndfile.def Makefile.msvc
+
 				
--- a/common/libsndfile/Win32/Makefile.in
+++ b/common/libsndfile/Win32/Makefile.in
@@ -66,18 +66,26 @@
 AS = @AS@
 CC = @CC@
 DLLTOOL = @DLLTOOL@
+ECHO = @ECHO@
+EXEEXT = @EXEEXT@
+GETCONF = @GETCONF@
 LIBTOOL = @LIBTOOL@
 LN_S = @LN_S@
 MAKEINFO = @MAKEINFO@
 OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OS_SPECIFIC_INCLUDES = @OS_SPECIFIC_INCLUDES@
+OS_SPECIFIC_LINKS = @OS_SPECIFIC_LINKS@
 PACKAGE = @PACKAGE@
 RANLIB = @RANLIB@
 SHARED_VERSION_INFO = @SHARED_VERSION_INFO@
+STRIP = @STRIP@
 VERSION = @VERSION@
+ac_cv_sys_largefile_CFLAGS = @ac_cv_sys_largefile_CFLAGS@
+autogen = @autogen@
 subdirs = @subdirs@
 
-EXTRA_DIST = README-Win32.txt README-Win32.txt.old					config.h unistd.h
-
+EXTRA_DIST = README-Win32.txt config.h unistd.h libsndfile.def Makefile.msvc
 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
 CONFIG_HEADER = ../src/config.h
 CONFIG_CLEAN_FILES = 
@@ -91,7 +99,7 @@
 all: all-redirect
 .SUFFIXES:
 $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
-	cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps Win32/Makefile
+	cd $(top_srcdir) && $(AUTOMAKE) --foreign --include-deps Win32/Makefile
 
 Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
 	cd $(top_builddir) \
--- /dev/null
+++ b/common/libsndfile/Win32/Makefile.msvc
@@ -1,0 +1,401 @@
+
+# Set the value of $(MSVCDir) for your installation. 
+
+MSVCDir="C:\Progra~1\Micros~1\VC98"
+
+CPP=cl.exe
+LINK32=link.exe
+DLL_LINK_FLAGS=/nologo /dll /incremental:no /libpath:"$(MSVCDir)\Lib" /pdb:"libsndfile.pdb" /implib:".\libsndfile.lib" /machine:I386 /out:"libsndfile.dll" 
+PROG_LINK_FLAGS=/nologo /incremental:no /libpath:"$(MSVCDir)\Lib" /pdb:"libsndfile.pdb" /machine:I386 /exetype:dynamic
+
+CFLAGS=/nologo /MD /W1 /GX /O2 /I "src" /I "Win32" /I "$(MSVCDir)\Include" /D "WIN32" /D "_USRDLL" /YX /FD 
+
+#====================================================================
+# Targets
+
+ALL : libsndfile.dll ".\examples\sndfile-info.exe"
+
+CLEAN :
+    -@erase "src\*.obj"
+    -@erase "src\G72x\*.obj"
+    -@erase "src\GSM610\*.obj"
+    -@erase "tests\*.exe"
+
+#====================================================================
+
+LINK32_OBJS= \
+	".\src\GSM610\add.obj" \
+	".\src\GSM610\code.obj" \
+	".\src\GSM610\decode.obj" \
+	".\src\GSM610\gsm_create.obj" \
+	".\src\GSM610\gsm_decode.obj" \
+	".\src\GSM610\gsm_destroy.obj" \
+	".\src\GSM610\gsm_encode.obj" \
+	".\src\GSM610\gsm_option.obj" \
+	".\src\GSM610\long_term.obj" \
+	".\src\GSM610\lpc.obj" \
+	".\src\GSM610\preprocess.obj" \
+	".\src\GSM610\rpe.obj" \
+	".\src\GSM610\short_term.obj" \
+	".\src\GSM610\table.obj" \
+	".\src\G72x\g721.obj" \
+	".\src\G72x\g723_16.obj" \
+	".\src\G72x\g723_24.obj" \
+	".\src\G72x\g723_40.obj" \
+	".\src\G72x\g72x.obj" \
+	".\src\aiff.obj" \
+	".\src\alaw.obj" \
+	".\src\au.obj" \
+	".\src\au_g72x.obj" \
+	".\src\common.obj" \
+	".\src\double64.obj" \
+	".\src\dwvw.obj" \
+	".\src\file_io.obj" \
+	".\src\float32.obj" \
+	".\src\command.obj" \
+	".\src\ima_adpcm.obj" \
+	".\src\ircam.obj" \
+	".\src\ms_adpcm.obj" \
+	".\src\nist.obj" \
+	".\src\paf.obj" \
+	".\src\pcm.obj" \
+	".\src\raw.obj" \
+	".\src\rx2.obj" \
+	".\src\samplitude.obj" \
+	".\src\sd2.obj" \
+	".\src\sndfile.obj" \
+	".\src\svx.obj" \
+	".\src\txw.obj" \
+	".\src\ulaw.obj" \
+	".\src\voc.obj" \
+	".\src\w64.obj" \
+	".\src\wav.obj" \
+	".\src\gsm610.obj" \
+	".\src\wav_w64.obj"
+
+libsndfile.dll : $(LINK32_OBJS) ".\Win32\libsndfile.def"
+    $(LINK32) $(DLL_LINK_FLAGS) /def:".\Win32\libsndfile.def" $(LINK32_OBJS)
+
+".\examples\sndfile-info.exe" : ".\examples\sndfile-info.c"
+    $(CPP) $(CFLAGS) /Fo".\examples\sndfile-info.obj" /c ".\examples\sndfile-info.c"
+    $(LINK32) $(PROG_LINK_FLAGS) /out:".\examples\sndfile-info.exe" ".\examples\sndfile-info.obj" libsndfile.lib
+
+TEST_PROGS= \
+     ".\tests\sfversion.exe" \
+     ".\tests\error_test.exe" \
+     ".\tests\pcm_test.exe" \
+     ".\tests\ulaw_test.exe" \
+     ".\tests\alaw_test.exe" \
+     ".\tests\dwvw_test.exe" \
+     ".\tests\command_test.exe" \
+     ".\tests\floating_point_test.exe" \
+     ".\tests\headerless_test.exe" \
+     ".\tests\write_read_test.exe" \
+     ".\tests\lossy_comp_test.exe" \
+     ".\tests\peak_chunk_test.exe" 
+
+CHECK: $(TEST_PROGS)
+    ".\tests\error_test.exe"
+    ".\tests\pcm_test.exe"
+    ".\tests\ulaw_test.exe"
+    ".\tests\alaw_test.exe"
+    ".\tests\dwvw_test.exe"
+    ".\tests\command_test.exe" ver
+    ".\tests\command_test.exe" norm
+    ".\tests\command_test.exe" format
+    ".\tests\floating_point_test.exe"
+    ".\tests\headerless_test.exe"
+    -@echo ----------------------------------------------------------------------
+    -@".\tests\sfversion.exe"
+    -@echo passed common tests
+    -@echo ----------------------------------------------------------------------
+    ".\tests\write_read_test" wav
+    ".\tests\lossy_comp_test" wav_ima
+    ".\tests\lossy_comp_test" wav_msadpcm
+    ".\tests\lossy_comp_test" wav_ulaw
+    ".\tests\lossy_comp_test" wav_alaw
+    ".\tests\lossy_comp_test" wav_gsm610
+    ".\tests\peak_chunk_test" wav
+    -@echo ----------------------------------------------------------------------
+    -@".\tests\sfversion.exe"
+    -@echo "passed tests on WAV files.
+    -@echo ----------------------------------------------------------------------
+    ".\tests\write_read_test" aiff
+    ".\tests\lossy_comp_test" aiff_ulaw
+    ".\tests\lossy_comp_test" aiff_alaw
+    ".\tests\peak_chunk_test" aiff
+    -@echo ----------------------------------------------------------------------
+    -@".\tests\sfversion.exe"
+    -@echo " passed tests on AIFF files."
+    -@echo ----------------------------------------------------------------------
+    ".\tests\write_read_test" au
+    ".\tests\lossy_comp_test" au_ulaw
+    ".\tests\lossy_comp_test" au_alaw
+    ".\tests\lossy_comp_test" au_g721
+    ".\tests\lossy_comp_test" au_g723
+    -@echo ----------------------------------------------------------------------
+    -@".\tests\sfversion.exe"
+    -@echo " passed tests on AU files."
+    -@echo ----------------------------------------------------------------------
+    ".\tests\write_read_test" raw
+    ".\tests\lossy_comp_test" raw_ulaw
+    ".\tests\lossy_comp_test" raw_alaw
+    -@echo ----------------------------------------------------------------------
+    -@".\tests\sfversion.exe"
+    -@echo " passed tests on RAW (header-less) files."
+    -@echo ----------------------------------------------------------------------
+    ".\tests\write_read_test" paf
+    -@echo ----------------------------------------------------------------------
+    -@".\tests\sfversion.exe"
+    -@echo " passed tests on PAF files."
+    -@echo ----------------------------------------------------------------------
+    ".\tests\write_read_test" svx
+    -@echo ----------------------------------------------------------------------
+    -@".\tests\sfversion.exe"
+    -@echo " passed tests on SVX files."
+    -@echo ----------------------------------------------------------------------
+    ".\tests\write_read_test" nist
+    -@echo ----------------------------------------------------------------------
+    -@".\tests\sfversion.exe"
+    -@echo " passed tests on NIST files."
+    -@echo ----------------------------------------------------------------------
+    ".\tests\write_read_test" ircam
+    ".\tests\lossy_comp_test" ircam_ulaw
+    ".\tests\lossy_comp_test" ircam_alaw
+    -@echo ----------------------------------------------------------------------
+    -@".\tests\sfversion.exe"
+    -@echo " passed tests on IRCAM files."
+    -@echo ----------------------------------------------------------------------
+    ".\tests\write_read_test" voc
+    ".\tests\lossy_comp_test" voc_ulaw
+    ".\tests\lossy_comp_test" voc_alaw
+    -@echo ----------------------------------------------------------------------
+    -@".\tests\sfversion.exe"
+    -@echo " passed tests on VOC files."
+    -@echo ----------------------------------------------------------------------
+    ".\tests\write_read_test" w64
+    ".\tests\lossy_comp_test" w64_ima
+    ".\tests\lossy_comp_test" w64_msadpcm
+    ".\tests\lossy_comp_test" w64_ulaw
+    ".\tests\lossy_comp_test" w64_alaw
+    ".\tests\lossy_comp_test" w64_gsm610
+    -@echo ----------------------------------------------------------------------
+    -@".\tests\sfversion.exe"
+    -@echo " passed tests on W64 files."
+    -@echo ----------------------------------------------------------------------
+
+#====================================================================
+# C files in src\GSM610.
+
+".\src\GSM610\add.obj" : ".\src\Gsm610\add.c"
+    $(CPP) $(CFLAGS) /Fo".\src\Gsm610\add.obj" /c ".\src\Gsm610\add.c" 
+
+".\src\GSM610\code.obj" : ".\src\Gsm610\code.c"
+    $(CPP) $(CFLAGS) /Fo".\src\Gsm610\code.obj" /c ".\src\Gsm610\code.c" 
+
+".\src\GSM610\decode.obj" : ".\src\Gsm610\decode.c"
+    $(CPP) $(CFLAGS) /Fo".\src\Gsm610\decode.obj" /c ".\src\Gsm610\decode.c" 
+
+".\src\GSM610\gsm_create.obj" : ".\src\Gsm610\gsm_create.c"
+    $(CPP) $(CFLAGS) /Fo".\src\Gsm610\gsm_create.obj" /c ".\src\Gsm610\gsm_create.c" 
+
+".\src\GSM610\gsm_decode.obj" : ".\src\Gsm610\gsm_decode.c"
+    $(CPP) $(CFLAGS) /Fo".\src\Gsm610\gsm_decode.obj" /c ".\src\Gsm610\gsm_decode.c" 
+
+".\src\GSM610\gsm_destroy.obj" : ".\src\Gsm610\gsm_destroy.c"
+    $(CPP) $(CFLAGS) /Fo".\src\Gsm610\gsm_destroy.obj" /c ".\src\Gsm610\gsm_destroy.c" 
+
+".\src\GSM610\gsm_encode.obj" : ".\src\Gsm610\gsm_encode.c"
+    $(CPP) $(CFLAGS) /Fo".\src\Gsm610\gsm_encode.obj" /c ".\src\Gsm610\gsm_encode.c" 
+
+".\src\GSM610\gsm_option.obj" : ".\src\Gsm610\gsm_option.c"
+    $(CPP) $(CFLAGS) /Fo".\src\Gsm610\gsm_option.obj" /c ".\src\Gsm610\gsm_option.c" 
+
+".\src\GSM610\long_term.obj" : ".\src\Gsm610\long_term.c"
+    $(CPP) $(CFLAGS) /Fo".\src\Gsm610\long_term.obj" /c ".\src\Gsm610\long_term.c" 
+
+".\src\GSM610\lpc.obj" : ".\src\Gsm610\lpc.c"
+    $(CPP) $(CFLAGS) /Fo".\src\Gsm610\lpc.obj" /c ".\src\Gsm610\lpc.c" 
+
+".\src\GSM610\preprocess.obj" : ".\src\Gsm610\preprocess.c"
+    $(CPP) $(CFLAGS) /Fo".\src\Gsm610\preprocess.obj" /c ".\src\Gsm610\preprocess.c" 
+
+".\src\GSM610\rpe.obj" : ".\src\Gsm610\rpe.c"
+    $(CPP) $(CFLAGS) /Fo".\src\Gsm610\rpe.obj" /c ".\src\Gsm610\rpe.c" 
+
+".\src\GSM610\short_term.obj" : ".\src\Gsm610\short_term.c"
+    $(CPP) $(CFLAGS) /Fo".\src\Gsm610\short_term.obj" /c ".\src\Gsm610\short_term.c" 
+
+".\src\GSM610\table.obj" : ".\src\Gsm610\table.c"
+    $(CPP) $(CFLAGS) /Fo".\src\Gsm610\table.obj" /c ".\src\Gsm610\table.c" 
+
+#====================================================================
+# C files in src\G72x.
+
+".\src\G72x\g721.obj" : ".\src\G72x\g721.c"
+    $(CPP) $(CFLAGS) /Fo".\src\G72x\g721.obj" /c ".\src\G72x\g721.c"
+
+".\src\G72x\g723_16.obj" : ".\src\G72x\g723_16.c" 
+    $(CPP) $(CFLAGS) /Fo".\src\G72x\g723_16.obj" /c ".\src\G72x\g723_16.c"
+
+".\src\G72x\g723_24.obj" : ".\src\G72x\g723_24.c" 
+    $(CPP) $(CFLAGS) /Fo".\src\G72x\g723_24.obj" /c ".\src\G72x\g723_24.c"
+
+".\src\G72x\g723_40.obj" : ".\src\G72x\g723_40.c" 
+    $(CPP) $(CFLAGS) /Fo".\src\G72x\g723_40.obj" /c ".\src\G72x\g723_40.c"
+
+".\src\G72x\g72x.obj" : ".\src\G72x\g72x.c" 
+    $(CPP) $(CFLAGS) /Fo".\src\G72x\g72x.obj" /c ".\src\G72x\g72x.c"
+
+#====================================================================
+# C files in src.
+
+".\src\aiff.obj" : ".\src\aiff.c" 
+    $(CPP) $(CFLAGS) /Fo".\src\aiff.obj" /c ".\src\aiff.c"
+
+".\src\alaw.obj" : ".\src\alaw.c" 
+    $(CPP) $(CFLAGS) /Fo".\src\alaw.obj" /c ".\src\alaw.c"
+
+".\src\au.obj" : ".\src\au.c" 
+    $(CPP) $(CFLAGS) /Fo".\src\au.obj" /c ".\src\au.c"
+
+".\src\au_g72x.obj" : ".\src\au_g72x.c" 
+    $(CPP) $(CFLAGS) /Fo".\src\au_g72x.obj" /c ".\src\au_g72x.c"
+
+".\src\common.obj" : ".\src\common.c" 
+    $(CPP) $(CFLAGS) /Fo".\src\common.obj" /c ".\src\common.c"
+
+".\src\double64.obj" : ".\src\double64.c" 
+    $(CPP) $(CFLAGS) /Fo".\src\double64.obj" /c ".\src\double64.c"
+
+".\src\dwvw.obj" : ".\src\dwvw.c" 
+    $(CPP) $(CFLAGS) /Fo".\src\dwvw.obj" /c ".\src\dwvw.c"
+
+".\src\file_io.obj" : ".\src\file_io.c" 
+    $(CPP) $(CFLAGS) /Fo".\src\file_io.obj" /c ".\src\file_io.c"
+
+".\src\float32.obj" : ".\src\float32.c" 
+    $(CPP) $(CFLAGS) /Fo".\src\float32.obj" /c ".\src\float32.c"
+
+".\src\command.obj" : ".\src\command.c" 
+    $(CPP) $(CFLAGS) /Fo".\src\command.obj" /c ".\src\command.c"
+
+".\src\ima_adpcm.obj" : ".\src\ima_adpcm.c" 
+    $(CPP) $(CFLAGS) /Fo".\src\ima_adpcm.obj" /c ".\src\ima_adpcm.c"
+
+".\src\ircam.obj" : ".\src\ircam.c" 
+    $(CPP) $(CFLAGS) /Fo".\src\ircam.obj" /c ".\src\ircam.c"
+
+".\src\ms_adpcm.obj" : ".\src\ms_adpcm.c" 
+    $(CPP) $(CFLAGS) /Fo".\src\ms_adpcm.obj" /c ".\src\ms_adpcm.c"
+
+".\src\nist.obj" : ".\src\nist.c" 
+    $(CPP) $(CFLAGS) /Fo".\src\nist.obj" /c ".\src\nist.c"
+
+".\src\paf.obj" : ".\src\paf.c" 
+    $(CPP) $(CFLAGS) /Fo".\src\paf.obj" /c ".\src\paf.c"
+
+".\src\pcm.obj" : ".\src\pcm.c" 
+    $(CPP) $(CFLAGS) /Fo".\src\pcm.obj" /c ".\src\pcm.c"
+
+".\src\raw.obj" : ".\src\raw.c" 
+    $(CPP) $(CFLAGS) /Fo".\src\raw.obj" /c ".\src\raw.c"
+
+".\src\rx2.obj" : ".\src\rx2.c" 
+    $(CPP) $(CFLAGS) /Fo".\src\rx2.obj" /c ".\src\rx2.c"
+
+".\src\samplitude.obj" : ".\src\samplitude.c" 
+    $(CPP) $(CFLAGS) /Fo".\src\samplitude.obj" /c ".\src\samplitude.c"
+
+".\src\sd2.obj" : ".\src\sd2.c" 
+    $(CPP) $(CFLAGS) /Fo".\src\sd2.obj" /c ".\src\sd2.c"
+
+".\src\sndfile.obj" : ".\src\sndfile.c" 
+    $(CPP) $(CFLAGS) /Fo".\src\sndfile.obj" /c ".\src\sndfile.c"
+
+".\src\svx.obj" : ".\src\svx.c" 
+    $(CPP) $(CFLAGS) /Fo".\src\svx.obj" /c ".\src\svx.c"
+
+".\src\txw.obj" : ".\src\txw.c" 
+    $(CPP) $(CFLAGS) /Fo".\src\txw.obj" /c ".\src\txw.c"
+
+".\src\ulaw.obj" : ".\src\ulaw.c" 
+    $(CPP) $(CFLAGS) /Fo".\src\ulaw.obj" /c ".\src\ulaw.c"
+
+".\src\voc.obj" : ".\src\voc.c" 
+    $(CPP) $(CFLAGS) /Fo".\src\voc.obj" /c ".\src\voc.c"
+
+".\src\w64.obj" : ".\src\w64.c" 
+    $(CPP) $(CFLAGS) /Fo".\src\w64.obj" /c ".\src\w64.c"
+
+".\src\wav.obj" : ".\src\wav.c" 
+    $(CPP) $(CFLAGS) /Fo".\src\wav.obj" /c ".\src\wav.c"
+
+".\src\gsm610.obj" : ".\src\gsm610.c" 
+    $(CPP) $(CFLAGS) /Fo".\src\gsm610.obj" /c ".\src\gsm610.c"
+
+".\src\wav_w64.obj" : ".\src\wav_w64.c" 
+    $(CPP) $(CFLAGS) /Fo".\src\wav_w64.obj" /c ".\src\wav_w64.c"
+
+#====================================================================
+# Object files for test programs.
+
+".\tests\utils.obj" : ".\tests\utils.c" 
+    $(CPP) $(CFLAGS) /Fo".\tests\utils.obj" /c ".\tests\utils.c"
+
+".\tests\dft_cmp.obj" : ".\tests\dft_cmp.c" 
+    $(CPP) $(CFLAGS) /Fo".\tests\dft_cmp.obj" /c ".\tests\dft_cmp.c"
+
+#====================================================================
+# Test programs.
+
+".\tests\sfversion.exe" : ".\tests\sfversion.c"
+    $(CPP) $(CFLAGS) /Fo".\tests\sfversion.obj" /c ".\tests\sfversion.c" 
+    $(LINK32) $(PROG_LINK_FLAGS) /out:".\tests\sfversion.exe" ".\tests\sfversion.obj" libsndfile.lib
+	
+".\tests\error_test.exe" : ".\tests\error_test.c"
+    $(CPP) $(CFLAGS) /Fo".\tests\error_test.obj" /c ".\tests\error_test.c" 
+    $(LINK32) $(PROG_LINK_FLAGS) /out:".\tests\error_test.exe" ".\tests\error_test.obj" libsndfile.lib
+
+".\tests\pcm_test.exe" : ".\tests\pcm_test.c" ".\tests\utils.obj"
+    $(CPP) $(CFLAGS) /Fo".\tests\pcm_test.obj" /c ".\tests\pcm_test.c" 
+    $(LINK32) $(PROG_LINK_FLAGS) /out:".\tests\pcm_test.exe" ".\tests\pcm_test.obj" ".\tests\utils.obj" libsndfile.lib
+
+".\tests\ulaw_test.exe" : ".\tests\ulaw_test.c" ".\tests\utils.obj"
+    $(CPP) $(CFLAGS) /Fo".\tests\ulaw_test.obj" /c ".\tests\ulaw_test.c" 
+    $(LINK32) $(PROG_LINK_FLAGS) /out:".\tests\ulaw_test.exe" ".\tests\ulaw_test.obj" ".\tests\utils.obj" libsndfile.lib
+
+".\tests\alaw_test.exe" : ".\tests\alaw_test.c" ".\tests\utils.obj"
+    $(CPP) $(CFLAGS) /Fo".\tests\alaw_test.obj" /c ".\tests\alaw_test.c" 
+    $(LINK32) $(PROG_LINK_FLAGS) /out:".\tests\alaw_test.exe" ".\tests\alaw_test.obj" ".\tests\utils.obj" libsndfile.lib
+
+".\tests\dwvw_test.exe" : ".\tests\dwvw_test.c" ".\tests\utils.obj"
+    $(CPP) $(CFLAGS) /Fo".\tests\dwvw_test.obj" /c ".\tests\dwvw_test.c" 
+    $(LINK32) $(PROG_LINK_FLAGS) /out:".\tests\dwvw_test.exe" ".\tests\dwvw_test.obj" ".\tests\utils.obj" libsndfile.lib
+
+".\tests\command_test.exe" : ".\tests\command_test.c"
+    $(CPP) $(CFLAGS) /Fo".\tests\command_test.obj" /c ".\tests\command_test.c" 
+    $(LINK32) $(PROG_LINK_FLAGS) /out:".\tests\command_test.exe" ".\tests\command_test.obj" libsndfile.lib
+
+".\tests\floating_point_test.exe" : ".\tests\floating_point_test.c" ".\tests\utils.obj" ".\tests\dft_cmp.obj"
+    $(CPP) $(CFLAGS) /Fo".\tests\floating_point_test.obj" /c ".\tests\floating_point_test.c" 
+    $(LINK32) $(PROG_LINK_FLAGS) /out:".\tests\floating_point_test.exe" ".\tests\floating_point_test.obj" ".\tests\utils.obj" ".\tests\dft_cmp.obj" libsndfile.lib
+
+".\tests\headerless_test.exe" : ".\tests\headerless_test.c" ".\tests\utils.obj"
+    $(CPP) $(CFLAGS) /Fo".\tests\headerless_test.obj" /c ".\tests\headerless_test.c" 
+    $(LINK32) $(PROG_LINK_FLAGS) /out:".\tests\headerless_test.exe" ".\tests\headerless_test.obj" ".\tests\utils.obj" libsndfile.lib
+
+".\tests\write_read_test.exe" : ".\tests\write_read_test.c" ".\tests\utils.obj"
+    $(CPP) $(CFLAGS) /Fo".\tests\write_read_test.obj" /c ".\tests\write_read_test.c" 
+    $(LINK32) $(PROG_LINK_FLAGS) /out:".\tests\write_read_test.exe" ".\tests\write_read_test.obj" ".\tests\utils.obj" libsndfile.lib
+
+".\tests\lossy_comp_test.exe" : ".\tests\lossy_comp_test.c" ".\tests\utils.obj"
+    $(CPP) $(CFLAGS) /Fo".\tests\lossy_comp_test.obj" /c ".\tests\lossy_comp_test.c" 
+    $(LINK32) $(PROG_LINK_FLAGS) /out:".\tests\lossy_comp_test.exe" ".\tests\lossy_comp_test.obj" ".\tests\utils.obj" libsndfile.lib
+
+".\tests\peak_chunk_test.exe" : ".\tests\peak_chunk_test.c" ".\tests\utils.obj"
+    $(CPP) $(CFLAGS) /Fo".\tests\peak_chunk_test.obj" /c ".\tests\peak_chunk_test.c" 
+    $(LINK32) $(PROG_LINK_FLAGS) /out:".\tests\peak_chunk_test.exe" ".\tests\peak_chunk_test.obj" ".\tests\utils.obj" libsndfile.lib
+
+# End of Makefile
+#====================================================================
--- a/common/libsndfile/Win32/README-Win32.txt.old
+++ /dev/null
@@ -1,32 +1,0 @@
-The MSCV++ workspace and project files have been broken for some time and I 
-have not found anyone willing to fix them or provide new ones. I hope the
-following instructions will be sufficient for Win32 to users to build, test
-and use this library.
-
-It is assumed that when you unzip the source code package you will keep the
-directory structure of the archive.
-
-The source code for the library it self is in following directories under 
-the main libsndfile directory:
-
-		src/
-		src/GSM610/
-
-To build the library you need to create a project containing all the *.c files 
-in these two directories. In addition, you should copy the two header files
-in the Win32/ directory (config.h and unistd.h) to the src/ directory. In the
-case of config.h you will be overwriting the existing config.h file.
-
-The test programs are all in the directory tests/ which contains one .c file
-for each test program. To create all the test programs you will need to 
-compile each of these test programs and link it to the library.
-
-Finally, there is also a directory examples/, which contains a number of small
-example programs. These can be compiled and linked much like the files in the
-tests/ directory.
-
-Anybody who can add to or clarify these instructions should should send me 
-email at <[email protected]>.
-
-Erik de Castro Lopo
-May 30th, 2000
--- a/common/libsndfile/Win32/config.h
+++ b/common/libsndfile/Win32/config.h
@@ -1,34 +1,9 @@
 /* src/config.h.  Generated automatically by configure.  */
-/* src/config.h.in.  Generated automatically from configure.in by autoheader.  */
+/* src/config.h.in.  Generated automatically from configure.in by autoheader 2.13.  */
 
-/* Define to `long' if <sys/types.h> doesn't define.  */
-/* #undef off_t */
-
-/* Define to `unsigned' if <sys/types.h> doesn't define.  */
-/* #undef size_t */
-
 /* Define if you have the ANSI C header files.  */
 #define STDC_HEADERS 1
 
-/* Define to `long' if <sys/types.h> doesn't define.  */
-/* #undef off_t */
-
-/* Define to `unsigned' if <sys/types.h> doesn't define.  */
-/* #undef size_t */
-
-/* Define if you have the ANSI C header files.  */
-#define STDC_HEADERS 1
-
-/* Set to 1 if the processor is big endian, otherwise set to 0.  */
-#define GUESS_BIG_ENDIAN 0
-
-/* Set to 1 if the processor is little endian, otherwise set to 0.  */
-#define GUESS_LITTLE_ENDIAN 1
-
-/* Set to 1 to force the use of code for processors with broken floats */
-/* Otherwise set it to 0.  */
-#define FORCE_BROKEN_FLOAT 0
-
 /* The number of bytes in a double.  */
 #define SIZEOF_DOUBLE 8
 
@@ -41,6 +16,9 @@
 /* The number of bytes in a long.  */
 #define SIZEOF_LONG 4
 
+/* The number of bytes in a off_t.  */
+#define SIZEOF_OFF_T 8
+
 /* The number of bytes in a short.  */
 #define SIZEOF_SHORT 2
 
@@ -47,36 +25,36 @@
 /* The number of bytes in a void*.  */
 #define SIZEOF_VOIDP 4
 
-/* Define if you have the fclose function.  */
-#define HAVE_FCLOSE 1
-
-/* Define if you have the fopen function.  */
-#define HAVE_FOPEN 1
-
-/* Define if you have the fread function.  */
-#define HAVE_FREAD 1
-
 /* Define if you have the free function.  */
 #define HAVE_FREE 1
 
-/* Define if you have the fseek function.  */
-#define HAVE_FSEEK 1
+/* Define if you have the fstat function.  */
+#define HAVE_FSTAT 1
 
-/* Define if you have the ftell function.  */
-#define HAVE_FTELL 1
+/* Define if you have the lseek function.  */
+#define HAVE_LSEEK 1
 
-/* Define if you have the fwrite function.  */
-#define HAVE_FWRITE 1
-
 /* Define if you have the malloc function.  */
 #define HAVE_MALLOC 1
 
+/* Define if you have the open function.  */
+#define HAVE_OPEN 1
+
+/* Define if you have the read function.  */
+#define HAVE_READ 1
+
 /* Define if you have the snprintf function.  */
-#define HAVE_SNPRINTF 0
+#define HAVE_SNPRINTF 1
 
 /* Define if you have the vsnprintf function.  */
-#define HAVE_VSNPRINTF 0
+#define HAVE_VSNPRINTF 1
 
+/* Define if you have the write function.  */
+#define HAVE_WRITE 1
+
+/* Define if you have the <dlfcn.h> header file.  */
+#define HAVE_DLFCN_H 1
+
 /* Define if you have the <endian.h> header file.  */
 #define HAVE_ENDIAN_H 0
 
@@ -84,5 +62,35 @@
 #define PACKAGE "libsndfile"
 
 /* Version number of package */
-#define VERSION "0.0.26"
+#define VERSION "1.0.0rc2"
+
+/* Number of bits in a file offset, on hosts where this is settable. */
+#define _FILE_OFFSET_BITS 64
+
+/* Define to make fseeko etc. visible, on some hosts. */
+/* #undef _LARGEFILE_SOURCE */
+
+/* Define for large files, on AIX-style hosts. */
+/* #undef _LARGE_FILES */
+
+/* Target processor is big endian. */
+#define CPU_IS_BIG_ENDIAN 0
+
+/* Target processor is little endian. */
+#define CPU_IS_LITTLE_ENDIAN 1
+
+/* Define if you have C99's lrint function. */
+#define HAVE_LRINT 0
+
+/* Define if you have C99's lrintf function. */
+#define HAVE_LRINTF 0
+
+/* Set to 1 to force the use of code for processors with broken floats */
+#define FORCE_BROKEN_FLOAT 0
+
+/* Set to 1 to force the use of code for processors with broken floats */
+#define FORCE_BROKEN_FLOAT 0
+
+/* Set to 1 if compiling for Win32 */
+#define OS_IS_WIN32 1
 
--- /dev/null
+++ b/common/libsndfile/Win32/libsndfile.def
@@ -1,0 +1,57 @@
+LIBRARY  libsndfile.dll
+EXPORTS
+
+;
+; open, close, command
+;
+sf_command        @1
+sf_open           @2
+sf_close          @3
+
+;
+; seeking
+;
+sf_seek           @4
+
+;
+; error functions
+;
+sf_error          @7
+sf_perror         @8
+sf_error_str      @9
+sf_error_number   @10
+
+;
+; misc stuff
+;
+sf_format_check   @11
+
+;
+; reading
+;
+sf_read_raw       @16
+
+sf_readf_short    @17
+sf_readf_int      @18
+sf_readf_float    @19
+sf_readf_double   @20
+
+sf_read_short     @21
+sf_read_int       @22
+sf_read_float     @23
+sf_read_double    @24
+
+;
+; writing
+;
+sf_write_raw      @32
+
+sf_writef_short   @33
+sf_writef_int     @34
+sf_writef_float   @35
+sf_writef_double  @36
+
+sf_write_short    @37
+sf_write_int      @38
+sf_write_float    @39
+sf_write_double   @40
--- a/common/libsndfile/Win32/libsndfile.dsp
+++ b/common/libsndfile/Win32/libsndfile.dsp
@@ -41,7 +41,7 @@
 # PROP Intermediate_Dir "Release"
 # PROP Target_Dir ""
 # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
-# ADD CPP /nologo /W3 /GX /O2 /I "..\win32" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /I ".\\" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
 # ADD BASE RSC /l 0x413 /d "NDEBUG"
 # ADD RSC /l 0x413 /d "NDEBUG"
 BSC32=bscmake.exe
@@ -64,7 +64,7 @@
 # PROP Intermediate_Dir "Debug"
 # PROP Target_Dir ""
 # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /GZ /c
-# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "..\win32" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /GZ /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I ".\\" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /GZ /c
 # ADD BASE RSC /l 0x413 /d "_DEBUG"
 # ADD RSC /l 0x413 /d "_DEBUG"
 BSC32=bscmake.exe
@@ -85,124 +85,204 @@
 # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
 # Begin Source File
 
+SOURCE=..\src\GSM610\add.c
+# End Source File
+# Begin Source File
+
 SOURCE=..\src\aiff.c
 # End Source File
 # Begin Source File
 
+SOURCE=..\src\alaw.c
+# End Source File
+# Begin Source File
+
 SOURCE=..\src\au.c
 # End Source File
 # Begin Source File
 
+SOURCE=..\src\au_g72x.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\GSM610\code.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\command.c
+# End Source File
+# Begin Source File
+
 SOURCE=..\src\common.c
 # End Source File
 # Begin Source File
 
+SOURCE=..\src\GSM610\decode.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\double64.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\dwvw.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\file_io.c
+# End Source File
+# Begin Source File
+
 SOURCE=..\src\float32.c
 # End Source File
 # Begin Source File
 
-SOURCE=..\src\ircam.c
+SOURCE=..\src\G72x\g721.c
 # End Source File
 # Begin Source File
 
-SOURCE=..\src\nist.c
+SOURCE=..\src\G72x\g723_16.c
 # End Source File
 # Begin Source File
 
-SOURCE=..\src\paf.c
+SOURCE=..\src\G72x\g723_24.c
 # End Source File
 # Begin Source File
 
-SOURCE=..\src\pcm.c
+SOURCE=..\src\G72x\g723_40.c
 # End Source File
 # Begin Source File
 
-SOURCE=..\src\raw.c
+SOURCE=..\src\G72x\g72x.c
 # End Source File
 # Begin Source File
 
-SOURCE=..\src\samplitude.c
+SOURCE=..\src\G72x\g72x_test.c
 # End Source File
 # Begin Source File
 
-SOURCE=..\src\sndfile.c
+SOURCE=..\src\gsm610.c
 # End Source File
 # Begin Source File
 
-SOURCE=..\src\svx.c
+SOURCE=..\src\GSM610\gsm_create.c
 # End Source File
 # Begin Source File
 
-SOURCE=..\src\voc.c
+SOURCE=..\src\GSM610\gsm_decode.c
 # End Source File
 # Begin Source File
 
-SOURCE=..\src\wav.c
+SOURCE=..\src\GSM610\gsm_destroy.c
 # End Source File
-# End Group
-# Begin Group "Header Files"
+# Begin Source File
 
-# PROP Default_Filter "h;hpp;hxx;hm;inl"
+SOURCE=..\src\GSM610\gsm_encode.c
+# End Source File
 # Begin Source File
 
-SOURCE=..\src\au.h
+SOURCE=..\src\GSM610\gsm_option.c
 # End Source File
 # Begin Source File
 
-SOURCE=..\src\common.h
+SOURCE=..\src\ima_adpcm.c
 # End Source File
 # Begin Source File
 
-SOURCE=..\src\GSM610\config.h
+SOURCE=..\src\ircam.c
 # End Source File
 # Begin Source File
 
-SOURCE=.\config.h
+SOURCE=..\src\GSM610\long_term.c
 # End Source File
 # Begin Source File
 
-SOURCE=..\src\floatcast.h
+SOURCE=..\src\GSM610\lpc.c
 # End Source File
 # Begin Source File
 
-SOURCE=..\src\G72x\g72x.h
+SOURCE=..\src\ms_adpcm.c
 # End Source File
 # Begin Source File
 
-SOURCE=..\src\GSM610\gsm.h
+SOURCE=..\src\nist.c
 # End Source File
 # Begin Source File
 
-SOURCE=..\src\G72x\private.h
+SOURCE=..\src\paf.c
 # End Source File
 # Begin Source File
 
-SOURCE=..\src\GSM610\private.h
+SOURCE=..\src\pcm.c
 # End Source File
 # Begin Source File
 
-SOURCE=..\src\GSM610\proto.h
+SOURCE=..\src\GSM610\preprocess.c
 # End Source File
 # Begin Source File
 
-SOURCE=..\src\sfendian.h
+SOURCE=..\src\raw.c
 # End Source File
 # Begin Source File
 
-SOURCE=..\src\sndfile.h
+SOURCE=..\src\GSM610\rpe.c
 # End Source File
 # Begin Source File
 
-SOURCE=.\unistd.h
+SOURCE=..\src\rx2.c
 # End Source File
 # Begin Source File
 
-SOURCE=..\src\GSM610\unproto.h
+SOURCE=..\src\samplitude.c
 # End Source File
 # Begin Source File
 
-SOURCE=..\src\wav.h
+SOURCE=..\src\sd2.c
 # End Source File
+# Begin Source File
+
+SOURCE=..\src\GSM610\short_term.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\sndfile.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\svx.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\GSM610\table.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\txw.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\ulaw.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\voc.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\w64.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\wav.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\wav_w64.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
 # End Group
 # End Target
 # End Project
--- a/common/libsndfile/Win32/unistd.h
+++ b/common/libsndfile/Win32/unistd.h
@@ -1,44 +1,22 @@
 /*
-** Copyright (C) 1999 Albert Faber
+** Copyright (C) 2002 Erik de Castro Lopo <[email protected]>
 **  
 ** This program is free software; you can redistribute it and/or modify
-** it under the terms of the GNU General Public License as published by
-** the Free Software Foundation; either version 2 of the License, or
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
 ** (at your option) any later version.
 ** 
 ** This program is distributed in the hope that it will be useful,
 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-** GNU General Public License for more details.
+** GNU Lesser General Public License for more details.
 ** 
-** You should have received a copy of the GNU General Public License
+** You should have received a copy of the GNU Lesser General Public License
 ** along with this program; if not, write to the Free Software 
 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 */
 
-/* A hack file in order to compile the libsndfile package for win32 systems 
-** Define the things that Bill and his fellows forgot to define
+/*
+** Emtpy file to prevent Win32 compiler from complaining that the
+** file doesn't exist.
 */
-
-#ifdef _WIN32
-#include <direct.h>
-
-#define	_IFMT		_S_IFMT
-#define _IFREG		_S_IFREG
-
-#define	S_ISREG(m)	((m) & _S_IFREG)
-
-#define	S_IRWXU 	0000700	/* rwx, owner */
-#define		S_IRUSR	0000400	/* read permission, owner */
-#define		S_IWUSR	0000200	/* write permission, owner */
-#define		S_IXUSR	0000100	/* execute/search permission, owner */
-#define	S_IRWXG		0000070	/* rwx, group */
-#define		S_IRGRP	0000040	/* read permission, group */
-#define		S_IWGRP	0000020	/* write permission, grougroup */
-#define		S_IXGRP	0000010	/* execute/search permission, group */
-#define	S_IRWXO		0000007	/* rwx, other */
-#define		S_IROTH	0000004	/* read permission, other */
-#define		S_IWOTH	0000002	/* write permission, other */
-#define		S_IXOTH	0000001	/* execute/search permission, other */
-
-#endif
\ No newline at end of file
--- a/common/libsndfile/acconfig.h
+++ /dev/null
@@ -1,288 +1,0 @@
-/* acconfig.h
-   This file is in the public domain.
-
-   Descriptive text for the C preprocessor macros that
-   the distributed Autoconf macros can define.
-   No software package will use all of them; autoheader copies the ones
-   your configure.in uses into your configuration header file templates.
-
-   The entries are in sort -df order: alphabetical, case insensitive,
-   ignoring punctuation (such as underscores).  Although this order
-   can split up related entries, it makes it easier to check whether
-   a given entry is in the file.
-
-   Leave the following blank line there!!  Autoheader needs it.  */
-
-
-/* Define if on AIX 3.
-   System headers sometimes define this.
-   We just want to avoid a redefinition error message.  */
-#ifndef _ALL_SOURCE
-#undef _ALL_SOURCE
-#endif
-
-/* Define if using alloca.c.  */
-#undef C_ALLOCA
-
-/* Define if type char is unsigned and you are not using gcc.  */
-#ifndef __CHAR_UNSIGNED__
-#undef __CHAR_UNSIGNED__
-#endif
-
-/* Define if the closedir function returns void instead of int.  */
-#undef CLOSEDIR_VOID
-
-/* Define to empty if the keyword does not work.  */
-#undef const
-
-/* Define to one of _getb67, GETB67, getb67 for Cray-2 and Cray-YMP systems.
-   This function is required for alloca.c support on those systems.  */
-#undef CRAY_STACKSEG_END
-
-/* Define for DGUX with <sys/dg_sys_info.h>.  */
-#undef DGUX
-
-/* Define if you have <dirent.h>.  */
-#undef DIRENT
-
-/* Define to the type of elements in the array set by `getgroups'.
-   Usually this is either `int' or `gid_t'.  */
-#undef GETGROUPS_T
-
-/* Define if the `getloadavg' function needs to be run setuid or setgid.  */
-#undef GETLOADAVG_PRIVILEGED
-
-/* Define if the `getpgrp' function takes no argument.  */
-#undef GETPGRP_VOID
-
-/* Define to `int' if <sys/types.h> doesn't define.  */
-#undef gid_t
-
-/* Define if you have alloca, as a function or macro.  */
-#undef HAVE_ALLOCA
-
-/* Define if you have <alloca.h> and it should be used (not on Ultrix).  */
-#undef HAVE_ALLOCA_H
-
-/* Define if you don't have vprintf but do have _doprnt.  */
-#undef HAVE_DOPRNT
-
-/* Define if your system has a working fnmatch function.  */
-#undef HAVE_FNMATCH
-
-/* Define if your system has its own `getloadavg' function.  */
-#undef HAVE_GETLOADAVG
-
-/* Define if you have the getmntent function.  */
-#undef HAVE_GETMNTENT
-
-/* Define if the `long double' type works.  */
-#undef HAVE_LONG_DOUBLE
-
-/* Define if you support file names longer than 14 characters.  */
-#undef HAVE_LONG_FILE_NAMES
-
-/* Define if you have a working `mmap' system call.  */
-#undef HAVE_MMAP
-
-/* Define if system calls automatically restart after interruption
-   by a signal.  */
-#undef HAVE_RESTARTABLE_SYSCALLS
-
-/* Define if your struct stat has st_blksize.  */
-#undef HAVE_ST_BLKSIZE
-
-/* Define if your struct stat has st_blocks.  */
-#undef HAVE_ST_BLOCKS
-
-/* Define if you have the strcoll function and it is properly defined.  */
-#undef HAVE_STRCOLL
-
-/* Define if your struct stat has st_rdev.  */
-#undef HAVE_ST_RDEV
-
-/* Define if you have the strftime function.  */
-#undef HAVE_STRFTIME
-
-/* Define if you have the ANSI # stringizing operator in cpp. */
-#undef HAVE_STRINGIZE
-
-/* Define if you have <sys/wait.h> that is POSIX.1 compatible.  */
-#undef HAVE_SYS_WAIT_H
-
-/* Define if your struct tm has tm_zone.  */
-#undef HAVE_TM_ZONE
-
-/* Define if you don't have tm_zone but do have the external array
-   tzname.  */
-#undef HAVE_TZNAME
-
-/* Define if you have <unistd.h>.  */
-#undef HAVE_UNISTD_H
-
-/* Define if utime(file, NULL) sets file's timestamp to the present.  */
-#undef HAVE_UTIME_NULL
-
-/* Define if you have <vfork.h>.  */
-#undef HAVE_VFORK_H
-
-/* Define if you have the vprintf function.  */
-#undef HAVE_VPRINTF
-
-/* Define if you have the wait3 system call.  */
-#undef HAVE_WAIT3
-
-/* Define as __inline if that's what the C compiler calls it.  */
-#undef inline
-
-/* Define if int is 16 bits instead of 32.  */
-#undef INT_16_BITS
-
-/* Define if long int is 64 bits.  */
-#undef LONG_64_BITS
-
-/* Define if major, minor, and makedev are declared in <mkdev.h>.  */
-#undef MAJOR_IN_MKDEV
-
-/* Define if major, minor, and makedev are declared in <sysmacros.h>.  */
-#undef MAJOR_IN_SYSMACROS
-
-/* Define if on MINIX.  */
-#undef _MINIX
-
-/* Define to `int' if <sys/types.h> doesn't define.  */
-#undef mode_t
-
-/* Define if you don't have <dirent.h>, but have <ndir.h>.  */
-#undef NDIR
-
-/* Define if you have <memory.h>, and <string.h> doesn't declare the
-   mem* functions.  */
-#undef NEED_MEMORY_H
-
-/* Define if your struct nlist has an n_un member.  */
-#undef NLIST_NAME_UNION
-
-/* Define if you have <nlist.h>.  */
-#undef NLIST_STRUCT
-
-/* Define if your C compiler doesn't accept -c and -o together.  */
-#undef NO_MINUS_C_MINUS_O
-
-/* Define if your Fortran 77 compiler doesn't accept -c and -o together. */
-#undef F77_NO_MINUS_C_MINUS_O
-
-/* Define to `long' if <sys/types.h> doesn't define.  */
-#undef off_t
-
-/* Define to `int' if <sys/types.h> doesn't define.  */
-#undef pid_t
-
-/* Define if the system does not provide POSIX.1 features except
-   with this defined.  */
-#undef _POSIX_1_SOURCE
-
-/* Define if you need to in order for stat and other things to work.  */
-#undef _POSIX_SOURCE
-
-/* Define as the return type of signal handlers (int or void).  */
-#undef RETSIGTYPE
-
-/* Define to the type of arg1 for select(). */
-#undef SELECT_TYPE_ARG1
-
-/* Define to the type of args 2, 3 and 4 for select(). */
-#undef SELECT_TYPE_ARG234
-
-/* Define to the type of arg5 for select(). */
-#undef SELECT_TYPE_ARG5
-
-/* Define if the `setpgrp' function takes no argument.  */
-#undef SETPGRP_VOID
-
-/* Define if the setvbuf function takes the buffering type as its second
-   argument and the buffer pointer as the third, as on System V
-   before release 3.  */
-#undef SETVBUF_REVERSED
-
-/* Define to `unsigned' if <sys/types.h> doesn't define.  */
-#undef size_t
-
-/* If using the C implementation of alloca, define if you know the
-   direction of stack growth for your system; otherwise it will be
-   automatically deduced at run-time.
-	STACK_DIRECTION > 0 => grows toward higher addresses
-	STACK_DIRECTION < 0 => grows toward lower addresses
-	STACK_DIRECTION = 0 => direction of growth unknown
- */
-#undef STACK_DIRECTION
-
-/* Define if the `S_IS*' macros in <sys/stat.h> do not work properly.  */
-#undef STAT_MACROS_BROKEN
-
-/* Define if you have the ANSI C header files.  */
-#undef STDC_HEADERS
-
-/* Define on System V Release 4.  */
-#undef SVR4
-
-/* Define if you don't have <dirent.h>, but have <sys/dir.h>.  */
-#undef SYSDIR
-
-/* Define if you don't have <dirent.h>, but have <sys/ndir.h>.  */
-#undef SYSNDIR
-
-/* Define if `sys_siglist' is declared by <signal.h>.  */
-#undef SYS_SIGLIST_DECLARED
-
-/* Define if you can safely include both <sys/time.h> and <time.h>.  */
-#undef TIME_WITH_SYS_TIME
-
-/* Define if your <sys/time.h> declares struct tm.  */
-#undef TM_IN_SYS_TIME
-
-/* Define to `int' if <sys/types.h> doesn't define.  */
-#undef uid_t
-
-/* Define for Encore UMAX.  */
-#undef UMAX
-
-/* Define for Encore UMAX 4.3 that has <inq_status/cpustats.h>
-   instead of <sys/cpustats.h>.  */
-#undef UMAX4_3
-
-/* Define if you do not have <strings.h>, index, bzero, etc..  */
-#undef USG
-
-/* Define vfork as fork if vfork does not work.  */
-#undef vfork
-
-/* Define if the closedir function returns void instead of int.  */
-#undef VOID_CLOSEDIR
-
-/* Define if your processor stores words with the most significant
-   byte first (like Motorola and SPARC, unlike Intel and VAX).  */
-#undef WORDS_BIGENDIAN
-
-/* Define if the X Window System is missing or not being used.  */
-#undef X_DISPLAY_MISSING
-
-/* Define if lex declares yytext as a char * by default, not a char[].  */
-#undef YYTEXT_POINTER
-
-
-/* Leave that blank line there!!  Autoheader needs it.
-   If you're adding to this file, keep in mind:
-   The entries are in sort -df order: alphabetical, case insensitive,
-   ignoring punctuation (such as underscores).  */
-
-/* Set to 1 if the processor is big endian, otherwise set to 0.  */
-#undef	GUESS_BIG_ENDIAN
-
-/* Set to 1 if the processor is little endian, otherwise set to 0.  */
-#undef	GUESS_LITTLE_ENDIAN
-
-/* Set to 1 to force the use of code for processors with broken floats */
-/* Otherwise set it to 0.  */
-#undef	FORCE_BROKEN_FLOAT
-
--- /dev/null
+++ b/common/libsndfile/acinclude.m4
@@ -1,0 +1,343 @@
+dnl By default, many hosts won't let programs access large files;
+dnl one must use special compiler options to get large-file access to work.
+dnl For more details about this brain damage please see:
+dnl http://www.sas.com/standards/large.file/x_open.20Mar96.html
+
+dnl Written by Paul Eggert <[email protected]>.
+
+dnl Internal subroutine of AC_SYS_EXTRA_LARGEFILE.
+dnl AC_SYS_EXTRA_LARGEFILE_FLAGS(FLAGSNAME)
+AC_DEFUN(AC_SYS_EXTRA_LARGEFILE_FLAGS,
+  [AC_CACHE_CHECK([for $1 value to request large file support],
+     ac_cv_sys_largefile_$1,
+     [ac_cv_sys_largefile_$1=`($GETCONF LFS_$1) 2>/dev/null` || {
+	ac_cv_sys_largefile_$1=no
+	ifelse($1, CFLAGS,
+	  [case "$host_os" in
+	   # IRIX 6.2 and later require cc -n32.
+changequote(, )dnl
+	   irix6.[2-9]* | irix6.1[0-9]* | irix[7-9].* | irix[1-9][0-9]*)
+changequote([, ])dnl
+	     if test "$GCC" != yes; then
+	       ac_cv_sys_largefile_CFLAGS=-n32
+	     fi
+	     ac_save_CC="$CC"
+	     CC="$CC $ac_cv_sys_largefile_CFLAGS"
+	     AC_TRY_LINK(, , , ac_cv_sys_largefile_CFLAGS=no)
+	     CC="$ac_save_CC"
+	   esac])
+      }])])
+
+dnl Internal subroutine of AC_SYS_EXTRA_LARGEFILE.
+dnl AC_SYS_EXTRA_LARGEFILE_SPACE_APPEND(VAR, VAL)
+AC_DEFUN(AC_SYS_EXTRA_LARGEFILE_SPACE_APPEND,
+  [case $2 in
+   no) ;;
+   ?*)
+     case "[$]$1" in
+     '') $1=$2 ;;
+     *) $1=[$]$1' '$2 ;;
+     esac ;;
+   esac])
+
+dnl Internal subroutine of AC_SYS_EXTRA_LARGEFILE.
+dnl AC_SYS_EXTRA_LARGEFILE_MACRO_VALUE(C-MACRO, CACHE-VAR, COMMENT, CODE-TO-SET-DEFAULT)
+AC_DEFUN(AC_SYS_EXTRA_LARGEFILE_MACRO_VALUE,
+  [AC_CACHE_CHECK([for $1], $2,
+     [$2=no
+changequote(, )dnl
+      $4
+      for ac_flag in $ac_cv_sys_largefile_CFLAGS no; do
+	case "$ac_flag" in
+	-D$1)
+	  $2=1 ;;
+	-D$1=*)
+	  $2=`expr " $ac_flag" : '[^=]*=\(.*\)'` ;;
+	esac
+      done
+changequote([, ])dnl
+      ])
+   if test "[$]$2" != no; then
+     AC_DEFINE_UNQUOTED([$1], [$]$2, [$3])
+   fi])
+
+AC_DEFUN(AC_SYS_EXTRA_LARGEFILE,
+  [AC_REQUIRE([AC_CANONICAL_HOST])
+   AC_ARG_ENABLE(largefile,
+     [  --disable-largefile     omit support for large files])
+   if test "$enable_largefile" != no; then
+     AC_CHECK_TOOL(GETCONF, getconf)
+     AC_SYS_EXTRA_LARGEFILE_FLAGS(CFLAGS)
+     AC_SYS_EXTRA_LARGEFILE_FLAGS(LDFLAGS)
+     AC_SYS_EXTRA_LARGEFILE_FLAGS(LIBS)
+	
+     for ac_flag in $ac_cv_sys_largefile_CFLAGS no; do
+       case "$ac_flag" in
+       no) ;;
+       -D_FILE_OFFSET_BITS=*) ;;
+       -D_LARGEFILE_SOURCE | -D_LARGEFILE_SOURCE=*) ;;
+       -D_LARGE_FILES | -D_LARGE_FILES=*) ;;
+       -D?* | -I?*)
+	 AC_SYS_EXTRA_LARGEFILE_SPACE_APPEND(CPPFLAGS, "$ac_flag") ;;
+       *)
+	 AC_SYS_EXTRA_LARGEFILE_SPACE_APPEND(CFLAGS, "$ac_flag") ;;
+       esac
+     done
+     AC_SYS_EXTRA_LARGEFILE_SPACE_APPEND(LDFLAGS, "$ac_cv_sys_largefile_LDFLAGS")
+     AC_SYS_EXTRA_LARGEFILE_SPACE_APPEND(LIBS, "$ac_cv_sys_largefile_LIBS")
+     AC_SYS_EXTRA_LARGEFILE_MACRO_VALUE(_FILE_OFFSET_BITS,
+       ac_cv_sys_file_offset_bits,
+       [[Number of bits in a file offset, on hosts where this is settable.]])
+       [case "$host_os" in
+	# HP-UX 10.20 and later
+	hpux10.[2-9][0-9]* | hpux1[1-9]* | hpux[2-9][0-9]*)
+	  ac_cv_sys_file_offset_bits=64 ;;
+	esac]
+     AC_SYS_EXTRA_LARGEFILE_MACRO_VALUE(_LARGEFILE_SOURCE,
+       ac_cv_sys_largefile_source,
+       [Define to make fseeko etc. visible, on some hosts.],
+       [case "$host_os" in
+	# HP-UX 10.20 and later
+	hpux10.[2-9][0-9]* | hpux1[1-9]* | hpux[2-9][0-9]*)
+	  ac_cv_sys_largefile_source=1 ;;
+	esac])
+     AC_SYS_EXTRA_LARGEFILE_MACRO_VALUE(_LARGE_FILES,
+       ac_cv_sys_large_files,
+       [Define for large files, on AIX-style hosts.],
+       [case "$host_os" in
+	# AIX 4.2 and later
+	aix4.[2-9]* | aix4.1[0-9]* | aix[5-9].* | aix[1-9][0-9]*)
+	  ac_cv_sys_large_files=1 ;;
+	esac])
+   fi
+  ])
+dnl @synopsis AC_C_FIND_ENDIAN
+dnl
+dnl Determined endian-ness of target processor.
+dnl @version 1.1	Mar 03 2002
+dnl @author Erik de Castro Lopo <erikd AT mega-nerd DOT com>
+dnl
+dnl Majority written from scratch to replace the standard autoconf macro 
+dnl AC_C_BIGENDIAN. Only part remaining from the original it the invocation
+dnl of the AC_TRY_RUN macro.
+dnl
+dnl Permission to use, copy, modify, distribute, and sell this file for any 
+dnl purpose is hereby granted without fee, provided that the above copyright 
+dnl and this permission notice appear in all copies.  No representations are
+dnl made about the suitability of this software for any purpose.  It is 
+dnl provided "as is" without express or implied warranty.
+
+dnl Find endian-ness in the following way:
+dnl    1) Look in <endian.h>.
+dnl    2) If 1) fails, look in <sys/types.h> and <sys/param.h>.
+dnl    3) If 1) and 2) fails and not cross compiling run a test program.
+dnl    4) If 1) and 2) fails and cross compiling then guess based on target.
+
+AC_DEFUN([AC_C_FIND_ENDIAN],
+[AC_CACHE_CHECK(determining processor byte ordering, 
+	ac_cv_c_byte_order,
+
+# Initialize to unknown
+ac_cv_c_byte_order=unknown
+
+if test $ac_cv_header_endian_h = yes ; then
+
+	# First try <endian.h> which should set BYTE_ORDER.
+
+	[AC_TRY_LINK([
+		#include <endian.h>
+		#if BYTE_ORDER != LITTLE_ENDIAN
+			not big endian
+		#endif
+		], return 0 ;, 
+			ac_cv_c_byte_order=little
+		)]
+				
+	[AC_TRY_LINK([
+		#include <endian.h>
+		#if BYTE_ORDER != BIG_ENDIAN
+			not big endian
+		#endif
+		], return 0 ;, 
+			ac_cv_c_byte_order=big
+		)]
+
+	fi
+
+if test $ac_cv_c_byte_order = unknown ; then
+
+	[AC_TRY_LINK([
+		#include <sys/types.h>
+		#include <sys/param.h>
+		#if !BYTE_ORDER || !BIG_ENDIAN || !LITTLE_ENDIAN
+			bogus endian macros
+		#endif
+		], return 0 ;, 
+
+		[AC_TRY_LINK([
+			#include <sys/types.h>
+			#include <sys/param.h>
+			#if BYTE_ORDER != LITTLE_ENDIAN
+				not big endian
+			#endif
+			], return 0 ;, 
+				ac_cv_c_byte_order=little
+			)]
+				
+		[AC_TRY_LINK([
+			#include <sys/types.h>
+			#include <sys/param.h>
+			#if BYTE_ORDER != LITTLE_ENDIAN
+				not big endian
+			#endif
+			], return 0 ;, 
+				ac_cv_c_byte_order=little
+			)]
+
+		)]
+
+ 	fi
+
+if test $ac_cv_c_byte_order = unknown ; then
+	if test $cross_compiling = yes ; then
+		# This is the last resort. Try to guess the target processor endian-ness
+		# by looking at the target CPU type.	
+		[
+		case "$target_cpu" in
+			alpha* | i?86* | mipsel* | ia64*)
+				ac_cv_c_big_endian=0
+				ac_cv_c_little_endian=1
+				;;
+			
+			m68* | mips* | powerpc* | hppa* | sparc*)
+				ac_cv_c_big_endian=1
+				ac_cv_c_little_endian=0
+				;;
+	
+			esac
+		]
+	else
+		AC_TRY_RUN(
+		[[
+		int main (void) 
+		{	/* Are we little or big endian?  From Harbison&Steele.  */
+			union
+			{	long l ;
+				char c [sizeof (long)] ;
+			} u ;
+			u.l = 1 ;
+			return (u.c [sizeof (long) - 1] == 1);
+			}
+			]], , ac_cv_c_byte_order=big, 
+			ac_cv_c_byte_order=unknown
+			)
+
+		AC_TRY_RUN(
+		[[int main (void) 
+		{	/* Are we little or big endian?  From Harbison&Steele.  */
+			union
+			{	long l ;
+				char c [sizeof (long)] ;
+			} u ;
+			u.l = 1 ;
+			return (u.c [0] == 1);
+			}]], , ac_cv_c_byte_order=little, 
+			ac_cv_c_byte_order=unknown
+			)
+		fi	
+	fi
+
+)
+]
+
+if test $ac_cv_c_byte_order = big ; then
+	ac_cv_c_big_endian=1
+	ac_cv_c_little_endian=0
+elif test $ac_cv_c_byte_order = little ; then
+	ac_cv_c_big_endian=0
+	ac_cv_c_little_endian=1
+else
+	ac_cv_c_big_endian=0
+	ac_cv_c_little_endian=0
+
+	AC_MSG_WARN([[*****************************************************************]])
+	AC_MSG_WARN([[*** Not able to determine endian-ness of target processor.       ]])
+	AC_MSG_WARN([[*** The constants CPU_IS_BIG_ENDIAN and CPU_IS_LITTLE_ENDIAN in  ]])
+	AC_MSG_WARN([[*** src/config.h may need to be hand editied.                    ]])
+	AC_MSG_WARN([[*****************************************************************]])
+	fi
+
+)# AC_C_FIND_ENDIAN
+
+dnl @synopsis AC_C99_FUNC_LRINT
+dnl
+dnl Check whether C99's lrint function is available.
+dnl @version 1.3	Feb 12 2002
+dnl @author Erik de Castro Lopo <erikd AT mega-nerd DOT com>
+dnl
+dnl Permission to use, copy, modify, distribute, and sell this file for any 
+dnl purpose is hereby granted without fee, provided that the above copyright 
+dnl and this permission notice appear in all copies.  No representations are
+dnl made about the suitability of this software for any purpose.  It is 
+dnl provided "as is" without express or implied warranty.
+dnl
+AC_DEFUN([AC_C99_FUNC_LRINT],
+[AC_CACHE_CHECK(for lrint,
+  ac_cv_c99_lrint,
+[
+lrint_save_CFLAGS=$CFLAGS
+CFLAGS="-O2"
+AC_TRY_LINK([
+#define		_ISOC9X_SOURCE	1
+#define 	_ISOC99_SOURCE	1
+#define		__USE_ISOC99	1
+#define 	__USE_ISOC9X	1
+
+#include <math.h>
+], if (!lrint(3.14159)) lrint(2.7183);, ac_cv_c99_lrint=yes, ac_cv_c99_lrint=no)
+
+CFLAGS=$lrint_save_CFLAGS
+
+])
+
+if test "$ac_cv_c99_lrint" = yes; then
+  AC_DEFINE(HAVE_LRINT, 1,
+            [Define if you have C99's lrint function.])
+fi
+])# AC_C99_LRINT
+dnl @synopsis AC_C99_FUNC_LRINTF
+dnl
+dnl Check whether C99's lrintf function is available.
+dnl @version 1.3	Feb 12 2002
+dnl @author Erik de Castro Lopo <erikd AT mega-nerd DOT com>
+dnl
+dnl Permission to use, copy, modify, distribute, and sell this file for any 
+dnl purpose is hereby granted without fee, provided that the above copyright 
+dnl and this permission notice appear in all copies.  No representations are
+dnl made about the suitability of this software for any purpose.  It is 
+dnl provided "as is" without express or implied warranty.
+dnl
+AC_DEFUN([AC_C99_FUNC_LRINTF],
+[AC_CACHE_CHECK(for lrintf,
+  ac_cv_c99_lrintf,
+[
+lrintf_save_CFLAGS=$CFLAGS
+CFLAGS="-O2"
+AC_TRY_LINK([
+#define		_ISOC9X_SOURCE	1
+#define 	_ISOC99_SOURCE	1
+#define		__USE_ISOC99	1
+#define 	__USE_ISOC9X	1
+
+#include <math.h>
+], if (!lrintf(3.14159)) lrintf(2.7183);, ac_cv_c99_lrintf=yes, ac_cv_c99_lrintf=no)
+
+CFLAGS=$lrintf_save_CFLAGS
+
+])
+
+if test "$ac_cv_c99_lrintf" = yes; then
+  AC_DEFINE(HAVE_LRINTF, 1,
+            [Define if you have C99's lrintf function.])
+fi
+])# AC_C99_LRINTF
--- a/common/libsndfile/aclocal.m4
+++ b/common/libsndfile/aclocal.m4
@@ -10,6 +10,350 @@
 dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A
 dnl PARTICULAR PURPOSE.
 
+dnl By default, many hosts won't let programs access large files;
+dnl one must use special compiler options to get large-file access to work.
+dnl For more details about this brain damage please see:
+dnl http://www.sas.com/standards/large.file/x_open.20Mar96.html
+
+dnl Written by Paul Eggert <[email protected]>.
+
+dnl Internal subroutine of AC_SYS_EXTRA_LARGEFILE.
+dnl AC_SYS_EXTRA_LARGEFILE_FLAGS(FLAGSNAME)
+AC_DEFUN(AC_SYS_EXTRA_LARGEFILE_FLAGS,
+  [AC_CACHE_CHECK([for $1 value to request large file support],
+     ac_cv_sys_largefile_$1,
+     [ac_cv_sys_largefile_$1=`($GETCONF LFS_$1) 2>/dev/null` || {
+	ac_cv_sys_largefile_$1=no
+	ifelse($1, CFLAGS,
+	  [case "$host_os" in
+	   # IRIX 6.2 and later require cc -n32.
+changequote(, )dnl
+	   irix6.[2-9]* | irix6.1[0-9]* | irix[7-9].* | irix[1-9][0-9]*)
+changequote([, ])dnl
+	     if test "$GCC" != yes; then
+	       ac_cv_sys_largefile_CFLAGS=-n32
+	     fi
+	     ac_save_CC="$CC"
+	     CC="$CC $ac_cv_sys_largefile_CFLAGS"
+	     AC_TRY_LINK(, , , ac_cv_sys_largefile_CFLAGS=no)
+	     CC="$ac_save_CC"
+	   esac])
+      }])])
+
+dnl Internal subroutine of AC_SYS_EXTRA_LARGEFILE.
+dnl AC_SYS_EXTRA_LARGEFILE_SPACE_APPEND(VAR, VAL)
+AC_DEFUN(AC_SYS_EXTRA_LARGEFILE_SPACE_APPEND,
+  [case $2 in
+   no) ;;
+   ?*)
+     case "[$]$1" in
+     '') $1=$2 ;;
+     *) $1=[$]$1' '$2 ;;
+     esac ;;
+   esac])
+
+dnl Internal subroutine of AC_SYS_EXTRA_LARGEFILE.
+dnl AC_SYS_EXTRA_LARGEFILE_MACRO_VALUE(C-MACRO, CACHE-VAR, COMMENT, CODE-TO-SET-DEFAULT)
+AC_DEFUN(AC_SYS_EXTRA_LARGEFILE_MACRO_VALUE,
+  [AC_CACHE_CHECK([for $1], $2,
+     [$2=no
+changequote(, )dnl
+      $4
+      for ac_flag in $ac_cv_sys_largefile_CFLAGS no; do
+	case "$ac_flag" in
+	-D$1)
+	  $2=1 ;;
+	-D$1=*)
+	  $2=`expr " $ac_flag" : '[^=]*=\(.*\)'` ;;
+	esac
+      done
+changequote([, ])dnl
+      ])
+   if test "[$]$2" != no; then
+     AC_DEFINE_UNQUOTED([$1], [$]$2, [$3])
+   fi])
+
+AC_DEFUN(AC_SYS_EXTRA_LARGEFILE,
+  [AC_REQUIRE([AC_CANONICAL_HOST])
+   AC_ARG_ENABLE(largefile,
+     [  --disable-largefile     omit support for large files])
+   if test "$enable_largefile" != no; then
+     AC_CHECK_TOOL(GETCONF, getconf)
+     AC_SYS_EXTRA_LARGEFILE_FLAGS(CFLAGS)
+     AC_SYS_EXTRA_LARGEFILE_FLAGS(LDFLAGS)
+     AC_SYS_EXTRA_LARGEFILE_FLAGS(LIBS)
+	
+     for ac_flag in $ac_cv_sys_largefile_CFLAGS no; do
+       case "$ac_flag" in
+       no) ;;
+       -D_FILE_OFFSET_BITS=*) ;;
+       -D_LARGEFILE_SOURCE | -D_LARGEFILE_SOURCE=*) ;;
+       -D_LARGE_FILES | -D_LARGE_FILES=*) ;;
+       -D?* | -I?*)
+	 AC_SYS_EXTRA_LARGEFILE_SPACE_APPEND(CPPFLAGS, "$ac_flag") ;;
+       *)
+	 AC_SYS_EXTRA_LARGEFILE_SPACE_APPEND(CFLAGS, "$ac_flag") ;;
+       esac
+     done
+     AC_SYS_EXTRA_LARGEFILE_SPACE_APPEND(LDFLAGS, "$ac_cv_sys_largefile_LDFLAGS")
+     AC_SYS_EXTRA_LARGEFILE_SPACE_APPEND(LIBS, "$ac_cv_sys_largefile_LIBS")
+     AC_SYS_EXTRA_LARGEFILE_MACRO_VALUE(_FILE_OFFSET_BITS,
+       ac_cv_sys_file_offset_bits,
+       [[Number of bits in a file offset, on hosts where this is settable.]])
+       [case "$host_os" in
+	# HP-UX 10.20 and later
+	hpux10.[2-9][0-9]* | hpux1[1-9]* | hpux[2-9][0-9]*)
+	  ac_cv_sys_file_offset_bits=64 ;;
+	esac]
+     AC_SYS_EXTRA_LARGEFILE_MACRO_VALUE(_LARGEFILE_SOURCE,
+       ac_cv_sys_largefile_source,
+       [Define to make fseeko etc. visible, on some hosts.],
+       [case "$host_os" in
+	# HP-UX 10.20 and later
+	hpux10.[2-9][0-9]* | hpux1[1-9]* | hpux[2-9][0-9]*)
+	  ac_cv_sys_largefile_source=1 ;;
+	esac])
+     AC_SYS_EXTRA_LARGEFILE_MACRO_VALUE(_LARGE_FILES,
+       ac_cv_sys_large_files,
+       [Define for large files, on AIX-style hosts.],
+       [case "$host_os" in
+	# AIX 4.2 and later
+	aix4.[2-9]* | aix4.1[0-9]* | aix[5-9].* | aix[1-9][0-9]*)
+	  ac_cv_sys_large_files=1 ;;
+	esac])
+   fi
+  ])
+dnl @synopsis AC_C_FIND_ENDIAN
+dnl
+dnl Determined endian-ness of target processor.
+dnl @version 1.1	Mar 03 2002
+dnl @author Erik de Castro Lopo <erikd AT mega-nerd DOT com>
+dnl
+dnl Majority written from scratch to replace the standard autoconf macro 
+dnl AC_C_BIGENDIAN. Only part remaining from the original it the invocation
+dnl of the AC_TRY_RUN macro.
+dnl
+dnl Permission to use, copy, modify, distribute, and sell this file for any 
+dnl purpose is hereby granted without fee, provided that the above copyright 
+dnl and this permission notice appear in all copies.  No representations are
+dnl made about the suitability of this software for any purpose.  It is 
+dnl provided "as is" without express or implied warranty.
+
+dnl Find endian-ness in the following way:
+dnl    1) Look in <endian.h>.
+dnl    2) If 1) fails, look in <sys/types.h> and <sys/param.h>.
+dnl    3) If 1) and 2) fails and not cross compiling run a test program.
+dnl    4) If 1) and 2) fails and cross compiling then guess based on target.
+
+AC_DEFUN([AC_C_FIND_ENDIAN],
+[AC_CACHE_CHECK(determining processor byte ordering, 
+	ac_cv_c_byte_order,
+
+# Initialize to unknown
+ac_cv_c_byte_order=unknown
+
+if test $ac_cv_header_endian_h = yes ; then
+
+	# First try <endian.h> which should set BYTE_ORDER.
+
+	[AC_TRY_LINK([
+		#include <endian.h>
+		#if BYTE_ORDER != LITTLE_ENDIAN
+			not big endian
+		#endif
+		], return 0 ;, 
+			ac_cv_c_byte_order=little
+		)]
+				
+	[AC_TRY_LINK([
+		#include <endian.h>
+		#if BYTE_ORDER != BIG_ENDIAN
+			not big endian
+		#endif
+		], return 0 ;, 
+			ac_cv_c_byte_order=big
+		)]
+
+	fi
+
+if test $ac_cv_c_byte_order = unknown ; then
+
+	[AC_TRY_LINK([
+		#include <sys/types.h>
+		#include <sys/param.h>
+		#if !BYTE_ORDER || !BIG_ENDIAN || !LITTLE_ENDIAN
+			bogus endian macros
+		#endif
+		], return 0 ;, 
+
+		[AC_TRY_LINK([
+			#include <sys/types.h>
+			#include <sys/param.h>
+			#if BYTE_ORDER != LITTLE_ENDIAN
+				not big endian
+			#endif
+			], return 0 ;, 
+				ac_cv_c_byte_order=little
+			)]
+				
+		[AC_TRY_LINK([
+			#include <sys/types.h>
+			#include <sys/param.h>
+			#if BYTE_ORDER != LITTLE_ENDIAN
+				not big endian
+			#endif
+			], return 0 ;, 
+				ac_cv_c_byte_order=little
+			)]
+
+		)]
+
+ 	fi
+
+if test $ac_cv_c_byte_order = unknown ; then
+	if test $cross_compiling = yes ; then
+		# This is the last resort. Try to guess the target processor endian-ness
+		# by looking at the target CPU type.	
+		[
+		case "$target_cpu" in
+			alpha* | i?86* | mipsel* | ia64*)
+				ac_cv_c_big_endian=0
+				ac_cv_c_little_endian=1
+				;;
+			
+			m68* | mips* | powerpc* | hppa* | sparc*)
+				ac_cv_c_big_endian=1
+				ac_cv_c_little_endian=0
+				;;
+	
+			esac
+		]
+	else
+		AC_TRY_RUN(
+		[[
+		int main (void) 
+		{	/* Are we little or big endian?  From Harbison&Steele.  */
+			union
+			{	long l ;
+				char c [sizeof (long)] ;
+			} u ;
+			u.l = 1 ;
+			return (u.c [sizeof (long) - 1] == 1);
+			}
+			]], , ac_cv_c_byte_order=big, 
+			ac_cv_c_byte_order=unknown
+			)
+
+		AC_TRY_RUN(
+		[[int main (void) 
+		{	/* Are we little or big endian?  From Harbison&Steele.  */
+			union
+			{	long l ;
+				char c [sizeof (long)] ;
+			} u ;
+			u.l = 1 ;
+			return (u.c [0] == 1);
+			}]], , ac_cv_c_byte_order=little, 
+			ac_cv_c_byte_order=unknown
+			)
+		fi	
+	fi
+
+)
+]
+
+if test $ac_cv_c_byte_order = big ; then
+	ac_cv_c_big_endian=1
+	ac_cv_c_little_endian=0
+elif test $ac_cv_c_byte_order = little ; then
+	ac_cv_c_big_endian=0
+	ac_cv_c_little_endian=1
+else
+	ac_cv_c_big_endian=0
+	ac_cv_c_little_endian=0
+
+	AC_MSG_WARN([[*****************************************************************]])
+	AC_MSG_WARN([[*** Not able to determine endian-ness of target processor.       ]])
+	AC_MSG_WARN([[*** The constants CPU_IS_BIG_ENDIAN and CPU_IS_LITTLE_ENDIAN in  ]])
+	AC_MSG_WARN([[*** src/config.h may need to be hand editied.                    ]])
+	AC_MSG_WARN([[*****************************************************************]])
+	fi
+
+)# AC_C_FIND_ENDIAN
+
+dnl @synopsis AC_C99_FUNC_LRINT
+dnl
+dnl Check whether C99's lrint function is available.
+dnl @version 1.3	Feb 12 2002
+dnl @author Erik de Castro Lopo <erikd AT mega-nerd DOT com>
+dnl
+dnl Permission to use, copy, modify, distribute, and sell this file for any 
+dnl purpose is hereby granted without fee, provided that the above copyright 
+dnl and this permission notice appear in all copies.  No representations are
+dnl made about the suitability of this software for any purpose.  It is 
+dnl provided "as is" without express or implied warranty.
+dnl
+AC_DEFUN([AC_C99_FUNC_LRINT],
+[AC_CACHE_CHECK(for lrint,
+  ac_cv_c99_lrint,
+[
+lrint_save_CFLAGS=$CFLAGS
+CFLAGS="-O2"
+AC_TRY_LINK([
+#define		_ISOC9X_SOURCE	1
+#define 	_ISOC99_SOURCE	1
+#define		__USE_ISOC99	1
+#define 	__USE_ISOC9X	1
+
+#include <math.h>
+], if (!lrint(3.14159)) lrint(2.7183);, ac_cv_c99_lrint=yes, ac_cv_c99_lrint=no)
+
+CFLAGS=$lrint_save_CFLAGS
+
+])
+
+if test "$ac_cv_c99_lrint" = yes; then
+  AC_DEFINE(HAVE_LRINT, 1,
+            [Define if you have C99's lrint function.])
+fi
+])# AC_C99_LRINT
+dnl @synopsis AC_C99_FUNC_LRINTF
+dnl
+dnl Check whether C99's lrintf function is available.
+dnl @version 1.3	Feb 12 2002
+dnl @author Erik de Castro Lopo <erikd AT mega-nerd DOT com>
+dnl
+dnl Permission to use, copy, modify, distribute, and sell this file for any 
+dnl purpose is hereby granted without fee, provided that the above copyright 
+dnl and this permission notice appear in all copies.  No representations are
+dnl made about the suitability of this software for any purpose.  It is 
+dnl provided "as is" without express or implied warranty.
+dnl
+AC_DEFUN([AC_C99_FUNC_LRINTF],
+[AC_CACHE_CHECK(for lrintf,
+  ac_cv_c99_lrintf,
+[
+lrintf_save_CFLAGS=$CFLAGS
+CFLAGS="-O2"
+AC_TRY_LINK([
+#define		_ISOC9X_SOURCE	1
+#define 	_ISOC99_SOURCE	1
+#define		__USE_ISOC99	1
+#define 	__USE_ISOC9X	1
+
+#include <math.h>
+], if (!lrintf(3.14159)) lrintf(2.7183);, ac_cv_c99_lrintf=yes, ac_cv_c99_lrintf=no)
+
+CFLAGS=$lrintf_save_CFLAGS
+
+])
+
+if test "$ac_cv_c99_lrintf" = yes; then
+  AC_DEFINE(HAVE_LRINTF, 1,
+            [Define if you have C99's lrintf function.])
+fi
+])# AC_C99_LRINTF
+
 # Do all the work for Automake.  This macro actually does too much --
 # some checks are only needed if your package does certain things.
 # But this isn't really a big deal.
@@ -125,39 +469,25 @@
 done<<>>dnl>>)
 changequote([,]))])
 
+# libtool.m4 - Configure libtool for the host system. -*-Shell-script-*-
 
-# serial 40 AC_PROG_LIBTOOL
-AC_DEFUN(AC_PROG_LIBTOOL,
+# serial 46 AC_PROG_LIBTOOL
+
+AC_DEFUN([AC_PROG_LIBTOOL],
 [AC_REQUIRE([AC_LIBTOOL_SETUP])dnl
 
-# Save cache, so that ltconfig can load it
-AC_CACHE_SAVE
-
-# Actually configure libtool.  ac_aux_dir is where install-sh is found.
-CC="$CC" CFLAGS="$CFLAGS" CPPFLAGS="$CPPFLAGS" \
-LD="$LD" LDFLAGS="$LDFLAGS" LIBS="$LIBS" \
-LN_S="$LN_S" NM="$NM" RANLIB="$RANLIB" \
-DLLTOOL="$DLLTOOL" AS="$AS" OBJDUMP="$OBJDUMP" \
-${CONFIG_SHELL-/bin/sh} $ac_aux_dir/ltconfig --no-reexec \
-$libtool_flags --no-verify $ac_aux_dir/ltmain.sh $lt_target \
-|| AC_MSG_ERROR([libtool configure failed])
-
-# Reload cache, that may have been modified by ltconfig
-AC_CACHE_LOAD
-
 # This can be used to rebuild libtool when needed
-LIBTOOL_DEPS="$ac_aux_dir/ltconfig $ac_aux_dir/ltmain.sh"
+LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh"
 
 # Always use our own libtool.
 LIBTOOL='$(SHELL) $(top_builddir)/libtool'
 AC_SUBST(LIBTOOL)dnl
 
-# Redirect the config.log output again, so that the ltconfig log is not
-# clobbered by the next message.
-exec 5>>./config.log
+# Prevent multiple expansion
+define([AC_PROG_LIBTOOL], [])
 ])
 
-AC_DEFUN(AC_LIBTOOL_SETUP,
+AC_DEFUN([AC_LIBTOOL_SETUP],
 [AC_PREREQ(2.13)dnl
 AC_REQUIRE([AC_ENABLE_SHARED])dnl
 AC_REQUIRE([AC_ENABLE_STATIC])dnl
@@ -164,42 +494,45 @@
 AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl
 AC_REQUIRE([AC_CANONICAL_HOST])dnl
 AC_REQUIRE([AC_CANONICAL_BUILD])dnl
-AC_REQUIRE([AC_PROG_RANLIB])dnl
 AC_REQUIRE([AC_PROG_CC])dnl
 AC_REQUIRE([AC_PROG_LD])dnl
+AC_REQUIRE([AC_PROG_LD_RELOAD_FLAG])dnl
 AC_REQUIRE([AC_PROG_NM])dnl
 AC_REQUIRE([AC_PROG_LN_S])dnl
+AC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl
+AC_REQUIRE([AC_OBJEXT])dnl
+AC_REQUIRE([AC_EXEEXT])dnl
 dnl
 
-case "$target" in
-NONE) lt_target="$host" ;;
-*) lt_target="$target" ;;
+_LT_AC_PROG_ECHO_BACKSLASH
+# Only perform the check for file, if the check method requires it
+case $deplibs_check_method in
+file_magic*)
+  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+    AC_PATH_MAGIC
+  fi
+  ;;
 esac
 
-# Check for any special flags to pass to ltconfig.
-libtool_flags="--cache-file=$cache_file"
-test "$enable_shared" = no && libtool_flags="$libtool_flags --disable-shared"
-test "$enable_static" = no && libtool_flags="$libtool_flags --disable-static"
-test "$enable_fast_install" = no && libtool_flags="$libtool_flags --disable-fast-install"
-test "$ac_cv_prog_gcc" = yes && libtool_flags="$libtool_flags --with-gcc"
-test "$ac_cv_prog_gnu_ld" = yes && libtool_flags="$libtool_flags --with-gnu-ld"
-ifdef([AC_PROVIDE_AC_LIBTOOL_DLOPEN],
-[libtool_flags="$libtool_flags --enable-dlopen"])
+AC_CHECK_TOOL(RANLIB, ranlib, :)
+AC_CHECK_TOOL(STRIP, strip, :)
+
+ifdef([AC_PROVIDE_AC_LIBTOOL_DLOPEN], enable_dlopen=yes, enable_dlopen=no)
 ifdef([AC_PROVIDE_AC_LIBTOOL_WIN32_DLL],
-[libtool_flags="$libtool_flags --enable-win32-dll"])
+enable_win32_dll=yes, enable_win32_dll=no)
+
 AC_ARG_ENABLE(libtool-lock,
   [  --disable-libtool-lock  avoid locking (might break parallel builds)])
-test "x$enable_libtool_lock" = xno && libtool_flags="$libtool_flags --disable-lock"
-test x"$silent" = xyes && libtool_flags="$libtool_flags --silent"
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
 
 # Some flags need to be propagated to the compiler or linker for good
 # libtool support.
-case "$lt_target" in
+case $host in
 *-*-irix6*)
   # Find out which ABI we are using.
   echo '[#]line __oline__ "configure"' > conftest.$ac_ext
   if AC_TRY_EVAL(ac_compile); then
-    case "`/usr/bin/file conftest.o`" in
+    case `/usr/bin/file conftest.$ac_objext` in
     *32-bit*)
       LD="${LD-ld} -32"
       ;;
@@ -219,7 +552,10 @@
   SAVE_CFLAGS="$CFLAGS"
   CFLAGS="$CFLAGS -belf"
   AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,
-    [AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])])
+    [AC_LANG_SAVE
+     AC_LANG_C
+     AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])
+     AC_LANG_RESTORE])
   if test x"$lt_cv_cc_needs_belf" != x"yes"; then
     # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
     CFLAGS="$SAVE_CFLAGS"
@@ -227,33 +563,2834 @@
   ;;
 
 ifdef([AC_PROVIDE_AC_LIBTOOL_WIN32_DLL],
-[*-*-cygwin* | *-*-mingw*)
+[*-*-cygwin* | *-*-mingw* | *-*-pw32*)
   AC_CHECK_TOOL(DLLTOOL, dlltool, false)
   AC_CHECK_TOOL(AS, as, false)
   AC_CHECK_TOOL(OBJDUMP, objdump, false)
+
+  # recent cygwin and mingw systems supply a stub DllMain which the user
+  # can override, but on older systems we have to supply one
+  AC_CACHE_CHECK([if libtool should supply DllMain function], lt_cv_need_dllmain,
+    [AC_TRY_LINK([],
+      [extern int __attribute__((__stdcall__)) DllMain(void*, int, void*);
+      DllMain (0, 0, 0);],
+      [lt_cv_need_dllmain=no],[lt_cv_need_dllmain=yes])])
+
+  case $host/$CC in
+  *-*-cygwin*/gcc*-mno-cygwin*|*-*-mingw*)
+    # old mingw systems require "-dll" to link a DLL, while more recent ones
+    # require "-mdll"
+    SAVE_CFLAGS="$CFLAGS"
+    CFLAGS="$CFLAGS -mdll"
+    AC_CACHE_CHECK([how to link DLLs], lt_cv_cc_dll_switch,
+      [AC_TRY_LINK([], [], [lt_cv_cc_dll_switch=-mdll],[lt_cv_cc_dll_switch=-dll])])
+    CFLAGS="$SAVE_CFLAGS" ;;
+  *-*-cygwin* | *-*-pw32*)
+    # cygwin systems need to pass --dll to the linker, and not link
+    # crt.o which will require a WinMain@16 definition.
+    lt_cv_cc_dll_switch="-Wl,--dll -nostartfiles" ;;
+  esac
   ;;
+  ])
+esac
+
+_LT_AC_LTCONFIG_HACK
+
 ])
+
+# AC_LIBTOOL_HEADER_ASSERT
+# ------------------------
+AC_DEFUN([AC_LIBTOOL_HEADER_ASSERT],
+[AC_CACHE_CHECK([whether $CC supports assert without backlinking],
+    [lt_cv_func_assert_works],
+    [case $host in
+    *-*-solaris*)
+      if test "$GCC" = yes && test "$with_gnu_ld" != yes; then
+        case `$CC --version 2>/dev/null` in
+        [[12]].*) lt_cv_func_assert_works=no ;;
+        *)        lt_cv_func_assert_works=yes ;;
+        esac
+      fi
+      ;;
+    esac])
+
+if test "x$lt_cv_func_assert_works" = xyes; then
+  AC_CHECK_HEADERS(assert.h)
+fi
+])# AC_LIBTOOL_HEADER_ASSERT
+
+# _LT_AC_CHECK_DLFCN
+# --------------------
+AC_DEFUN([_LT_AC_CHECK_DLFCN],
+[AC_CHECK_HEADERS(dlfcn.h)
+])# _LT_AC_CHECK_DLFCN
+
+# AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE
+# ---------------------------------
+AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE],
+[AC_REQUIRE([AC_CANONICAL_HOST])
+AC_REQUIRE([AC_PROG_NM])
+AC_REQUIRE([AC_OBJEXT])
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+AC_MSG_CHECKING([command to parse $NM output])
+AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [dnl
+
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[[BCDEGRST]]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)'
+
+# Transform the above into a raw symbol and a C symbol.
+symxfrm='\1 \2\3 \3'
+
+# Transform an extracted symbol line into a proper C declaration
+lt_cv_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern char \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/  {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([[^ ]]*\) \([[^ ]]*\)$/  {\"\2\", (lt_ptr) \&\2},/p'"
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+  symcode='[[BCDT]]'
+  ;;
+cygwin* | mingw* | pw32*)
+  symcode='[[ABCDGISTW]]'
+  ;;
+hpux*) # Its linker distinguishes data from code symbols
+  lt_cv_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern char \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+  lt_cv_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/  {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"\2\", (lt_ptr) \&\2},/p'"
+  ;;
+irix* | nonstopux*)
+  symcode='[[BCDEGRST]]'
+  ;;
+solaris* | sysv5*)
+  symcode='[[BDT]]'
+  ;;
+sysv4)
+  symcode='[[DFNSTU]]'
+  ;;
 esac
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $host_os in
+mingw*)
+  opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+  ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+if $NM -V 2>&1 | egrep '(GNU|with BFD)' > /dev/null; then
+  symcode='[[ABCDGISTW]]'
+fi
+
+# Try without a prefix undercore, then with it.
+for ac_symprfx in "" "_"; do
+
+  # Write the raw and C identifiers.
+lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ 	]]\($symcode$symcode*\)[[ 	]][[ 	]]*\($ac_symprfx\)$sympat$opt_cr$/$symxfrm/p'"
+
+  # Check to see that the pipe works correctly.
+  pipe_works=no
+  rm -f conftest*
+  cat > conftest.$ac_ext <<EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+EOF
+
+  if AC_TRY_EVAL(ac_compile); then
+    # Now try to grab the symbols.
+    nlist=conftest.nm
+    if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) && test -s "$nlist"; then
+      # Try sorting and uniquifying the output.
+      if sort "$nlist" | uniq > "$nlist"T; then
+	mv -f "$nlist"T "$nlist"
+      else
+	rm -f "$nlist"T
+      fi
+
+      # Make sure that we snagged all the symbols we need.
+      if egrep ' nm_test_var$' "$nlist" >/dev/null; then
+	if egrep ' nm_test_func$' "$nlist" >/dev/null; then
+	  cat <<EOF > conftest.$ac_ext
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+EOF
+	  # Now generate the symbol file.
+	  eval "$lt_cv_global_symbol_to_cdecl"' < "$nlist" >> conftest.$ac_ext'
+
+	  cat <<EOF >> conftest.$ac_ext
+#if defined (__STDC__) && __STDC__
+# define lt_ptr void *
+#else
+# define lt_ptr char *
+# define const
+#endif
+
+/* The mapping between symbol names and symbols. */
+const struct {
+  const char *name;
+  lt_ptr address;
+}
+lt_preloaded_symbols[[]] =
+{
+EOF
+	  sed "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (lt_ptr) \&\2},/" < "$nlist" >> conftest.$ac_ext
+	  cat <<\EOF >> conftest.$ac_ext
+  {0, (lt_ptr) 0}
+};
+
+#ifdef __cplusplus
+}
+#endif
+EOF
+	  # Now try linking the two files.
+	  mv conftest.$ac_objext conftstm.$ac_objext
+	  save_LIBS="$LIBS"
+	  save_CFLAGS="$CFLAGS"
+	  LIBS="conftstm.$ac_objext"
+	  CFLAGS="$CFLAGS$no_builtin_flag"
+	  if AC_TRY_EVAL(ac_link) && test -s conftest; then
+	    pipe_works=yes
+	  fi
+	  LIBS="$save_LIBS"
+	  CFLAGS="$save_CFLAGS"
+	else
+	  echo "cannot find nm_test_func in $nlist" >&AC_FD_CC
+	fi
+      else
+	echo "cannot find nm_test_var in $nlist" >&AC_FD_CC
+      fi
+    else
+      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AC_FD_CC
+    fi
+  else
+    echo "$progname: failed program was:" >&AC_FD_CC
+    cat conftest.$ac_ext >&5
+  fi
+  rm -f conftest* conftst*
+
+  # Do not use the global_symbol_pipe unless it works.
+  if test "$pipe_works" = yes; then
+    break
+  else
+    lt_cv_sys_global_symbol_pipe=
+  fi
+done
 ])
+global_symbol_pipe="$lt_cv_sys_global_symbol_pipe"
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+  global_symbol_to_cdecl=
+  global_symbol_to_c_name_address=
+else
+  global_symbol_to_cdecl="$lt_cv_global_symbol_to_cdecl"
+  global_symbol_to_c_name_address="$lt_cv_global_symbol_to_c_name_address"
+fi
+if test -z "$global_symbol_pipe$global_symbol_to_cdec$global_symbol_to_c_name_address";
+then
+  AC_MSG_RESULT(failed)
+else
+  AC_MSG_RESULT(ok)
+fi
+]) # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE
 
+# _LT_AC_LIBTOOL_SYS_PATH_SEPARATOR
+# ---------------------------------
+AC_DEFUN([_LT_AC_LIBTOOL_SYS_PATH_SEPARATOR],
+[# Find the correct PATH separator.  Usually this is `:', but
+# DJGPP uses `;' like DOS.
+if test "X${PATH_SEPARATOR+set}" != Xset; then
+  UNAME=${UNAME-`uname 2>/dev/null`}
+  case X$UNAME in
+    *-DOS) lt_cv_sys_path_separator=';' ;;
+    *)     lt_cv_sys_path_separator=':' ;;
+  esac
+  PATH_SEPARATOR=$lt_cv_sys_path_separator
+fi
+])# _LT_AC_LIBTOOL_SYS_PATH_SEPARATOR
+
+# _LT_AC_PROG_ECHO_BACKSLASH
+# --------------------------
+# Add some code to the start of the generated configure script which
+# will find an echo command which doesn't interpret backslashes.
+AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH],
+[ifdef([AC_DIVERSION_NOTICE], [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)],
+			      [AC_DIVERT_PUSH(NOTICE)])
+_LT_AC_LIBTOOL_SYS_PATH_SEPARATOR
+
+# Check that we are running under the correct shell.
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+case X$ECHO in
+X*--fallback-echo)
+  # Remove one level of quotation (which was required for Make).
+  ECHO=`echo "$ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','`
+  ;;
+esac
+
+echo=${ECHO-echo}
+if test "X[$]1" = X--no-reexec; then
+  # Discard the --no-reexec flag, and continue.
+  shift
+elif test "X[$]1" = X--fallback-echo; then
+  # Avoid inline document here, it may be left over
+  :
+elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then
+  # Yippee, $echo works!
+  :
+else
+  # Restart under the correct shell.
+  exec $SHELL "[$]0" --no-reexec ${1+"[$]@"}
+fi
+
+if test "X[$]1" = X--fallback-echo; then
+  # used as fallback echo
+  shift
+  cat <<EOF
+$*
+EOF
+  exit 0
+fi
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+if test "X${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi
+
+if test -z "$ECHO"; then
+if test "X${echo_test_string+set}" != Xset; then
+# find a string as large as possible, as long as the shell can cope with it
+  for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do
+    # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
+    if (echo_test_string="`eval $cmd`") 2>/dev/null &&
+       echo_test_string="`eval $cmd`" &&
+       (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null
+    then
+      break
+    fi
+  done
+fi
+
+if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
+   echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
+   test "X$echo_testing_string" = "X$echo_test_string"; then
+  :
+else
+  # The Solaris, AIX, and Digital Unix default echo programs unquote
+  # backslashes.  This makes it impossible to quote backslashes using
+  #   echo "$something" | sed 's/\\/\\\\/g'
+  #
+  # So, first we look for a working echo in the user's PATH.
+
+  IFS="${IFS= 	}"; save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for dir in $PATH /usr/ucb; do
+    if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
+       test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
+       echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` &&
+       test "X$echo_testing_string" = "X$echo_test_string"; then
+      echo="$dir/echo"
+      break
+    fi
+  done
+  IFS="$save_ifs"
+
+  if test "X$echo" = Xecho; then
+    # We didn't find a better echo, so look for alternatives.
+    if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' &&
+       echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` &&
+       test "X$echo_testing_string" = "X$echo_test_string"; then
+      # This shell has a builtin print -r that does the trick.
+      echo='print -r'
+    elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) &&
+	 test "X$CONFIG_SHELL" != X/bin/ksh; then
+      # If we have ksh, try running configure again with it.
+      ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
+      export ORIGINAL_CONFIG_SHELL
+      CONFIG_SHELL=/bin/ksh
+      export CONFIG_SHELL
+      exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"}
+    else
+      # Try using printf.
+      echo='printf %s\n'
+      if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
+	 echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
+	 test "X$echo_testing_string" = "X$echo_test_string"; then
+	# Cool, printf works
+	:
+      elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
+	   test "X$echo_testing_string" = 'X\t' &&
+	   echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+	   test "X$echo_testing_string" = "X$echo_test_string"; then
+	CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL
+	export CONFIG_SHELL
+	SHELL="$CONFIG_SHELL"
+	export SHELL
+	echo="$CONFIG_SHELL [$]0 --fallback-echo"
+      elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
+	   test "X$echo_testing_string" = 'X\t' &&
+	   echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+	   test "X$echo_testing_string" = "X$echo_test_string"; then
+	echo="$CONFIG_SHELL [$]0 --fallback-echo"
+      else
+	# maybe with a smaller string...
+	prev=:
+
+	for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do
+	  if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null
+	  then
+	    break
+	  fi
+	  prev="$cmd"
+	done
+
+	if test "$prev" != 'sed 50q "[$]0"'; then
+	  echo_test_string=`eval $prev`
+	  export echo_test_string
+	  exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"}
+	else
+	  # Oops.  We lost completely, so just stick with echo.
+	  echo=echo
+	fi
+      fi
+    fi
+  fi
+fi
+fi
+
+# Copy echo and quote the copy suitably for passing to libtool from
+# the Makefile, instead of quoting the original, which is used later.
+ECHO=$echo
+if test "X$ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then
+   ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo"
+fi
+
+AC_SUBST(ECHO)
+AC_DIVERT_POP
+])# _LT_AC_PROG_ECHO_BACKSLASH
+
+# _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE,
+#                           ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING)
+# ------------------------------------------------------------------
+AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF],
+[if test "$cross_compiling" = yes; then :
+  [$4]
+else
+  AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<EOF
+[#line __oline__ "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL		RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL		DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL		0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW		DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW	RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW	DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW	0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+#ifdef __cplusplus
+extern "C" void exit (int);
+#endif
+
+void fnord() { int i=42;}
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+      /* dlclose (self); */
+    }
+
+    exit (status);
+}]
+EOF
+  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then
+    (./conftest; exit; ) 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) $1 ;;
+      x$lt_dlneed_uscore) $2 ;;
+      x$lt_unknown|x*) $3 ;;
+    esac
+  else :
+    # compilation failed
+    $3
+  fi
+fi
+rm -fr conftest*
+])# _LT_AC_TRY_DLOPEN_SELF
+
+# AC_LIBTOOL_DLOPEN_SELF
+# -------------------
+AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF],
+[if test "x$enable_dlopen" != xyes; then
+  enable_dlopen=unknown
+  enable_dlopen_self=unknown
+  enable_dlopen_self_static=unknown
+else
+  lt_cv_dlopen=no
+  lt_cv_dlopen_libs=
+
+  case $host_os in
+  beos*)
+    lt_cv_dlopen="load_add_on"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ;;
+
+  cygwin* | mingw* | pw32*)
+    lt_cv_dlopen="LoadLibrary"
+    lt_cv_dlopen_libs=
+   ;;
+
+  *)
+    AC_CHECK_FUNC([shl_load],
+          [lt_cv_dlopen="shl_load"],
+      [AC_CHECK_LIB([dld], [shl_load],
+            [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld"],
+	[AC_CHECK_FUNC([dlopen],
+	      [lt_cv_dlopen="dlopen"],
+	  [AC_CHECK_LIB([dl], [dlopen],
+	        [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],
+	    [AC_CHECK_LIB([svld], [dlopen],
+	          [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"],
+	      [AC_CHECK_LIB([dld], [dld_link],
+	            [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"])
+	      ])
+	    ])
+	  ])
+	])
+      ])
+    ;;
+  esac
+
+  if test "x$lt_cv_dlopen" != xno; then
+    enable_dlopen=yes
+  else
+    enable_dlopen=no
+  fi
+
+  case $lt_cv_dlopen in
+  dlopen)
+    save_CPPFLAGS="$CPPFLAGS"
+    AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl
+    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+    save_LDFLAGS="$LDFLAGS"
+    eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+    save_LIBS="$LIBS"
+    LIBS="$lt_cv_dlopen_libs $LIBS"
+
+    AC_CACHE_CHECK([whether a program can dlopen itself],
+	  lt_cv_dlopen_self, [dnl
+	  _LT_AC_TRY_DLOPEN_SELF(
+	    lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes,
+	    lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)
+    ])
+
+    if test "x$lt_cv_dlopen_self" = xyes; then
+      LDFLAGS="$LDFLAGS $link_static_flag"
+      AC_CACHE_CHECK([whether a statically linked program can dlopen itself],
+    	  lt_cv_dlopen_self_static, [dnl
+	  _LT_AC_TRY_DLOPEN_SELF(
+	    lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes,
+	    lt_cv_dlopen_self_static=no,  lt_cv_dlopen_self_static=cross)
+      ])
+    fi
+
+    CPPFLAGS="$save_CPPFLAGS"
+    LDFLAGS="$save_LDFLAGS"
+    LIBS="$save_LIBS"
+    ;;
+  esac
+
+  case $lt_cv_dlopen_self in
+  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+  *) enable_dlopen_self=unknown ;;
+  esac
+
+  case $lt_cv_dlopen_self_static in
+  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+  *) enable_dlopen_self_static=unknown ;;
+  esac
+fi
+])# AC_LIBTOOL_DLOPEN_SELF
+
+AC_DEFUN([_LT_AC_LTCONFIG_HACK],
+[AC_REQUIRE([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])dnl
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed='sed -e s/^X//'
+sed_quote_subst='s/\([[\\"\\`$\\\\]]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\([[\\"\\`\\\\]]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Constants:
+rm="rm -f"
+
+# Global variables:
+default_ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a `.a' archive for static linking (except M$VC,
+# which needs '.lib').
+libext=a
+ltmain="$ac_aux_dir/ltmain.sh"
+ofile="$default_ofile"
+with_gnu_ld="$lt_cv_prog_gnu_ld"
+need_locks="$enable_libtool_lock"
+
+old_CC="$CC"
+old_CFLAGS="$CFLAGS"
+
+# Set sane defaults for various variables
+test -z "$AR" && AR=ar
+test -z "$AR_FLAGS" && AR_FLAGS=cru
+test -z "$AS" && AS=as
+test -z "$CC" && CC=cc
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+test -z "$LD" && LD=ld
+test -z "$LN_S" && LN_S="ln -s"
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+test -z "$NM" && NM=nm
+test -z "$OBJDUMP" && OBJDUMP=objdump
+test -z "$RANLIB" && RANLIB=:
+test -z "$STRIP" && STRIP=:
+test -z "$ac_objext" && ac_objext=o
+
+if test x"$host" != x"$build"; then
+  ac_tool_prefix=${host_alias}-
+else
+  ac_tool_prefix=
+fi
+
+# Transform linux* to *-*-linux-gnu*, to support old configure scripts.
+case $host_os in
+linux-gnu*) ;;
+linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'`
+esac
+
+case $host_os in
+aix3*)
+  # AIX sometimes has problems with the GCC collect2 program.  For some
+  # reason, if we set the COLLECT_NAMES environment variable, the problems
+  # vanish in a puff of smoke.
+  if test "X${COLLECT_NAMES+set}" != Xset; then
+    COLLECT_NAMES=
+    export COLLECT_NAMES
+  fi
+  ;;
+esac
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+  case $host_os in
+  openbsd*)
+    old_postinstall_cmds="\$RANLIB -t \$oldlib~$old_postinstall_cmds"
+    ;;
+  *)
+    old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds"
+    ;;
+  esac
+  old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
+fi
+
+# Allow CC to be a program name with arguments.
+set dummy $CC
+compiler="[$]2"
+
+AC_MSG_CHECKING([for objdir])
+rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+  objdir=.libs
+else
+  # MS-DOS does not allow filenames that begin with a dot.
+  objdir=_libs
+fi
+rmdir .libs 2>/dev/null
+AC_MSG_RESULT($objdir)
+
+
+AC_ARG_WITH(pic,
+[  --with-pic              try to use only PIC/non-PIC objects [default=use both]],
+pic_mode="$withval", pic_mode=default)
+test -z "$pic_mode" && pic_mode=default
+
+# We assume here that the value for lt_cv_prog_cc_pic will not be cached
+# in isolation, and that seeing it set (from the cache) indicates that
+# the associated values are set (in the cache) correctly too.
+AC_MSG_CHECKING([for $compiler option to produce PIC])
+AC_CACHE_VAL(lt_cv_prog_cc_pic,
+[ lt_cv_prog_cc_pic=
+  lt_cv_prog_cc_shlib=
+  lt_cv_prog_cc_wl=
+  lt_cv_prog_cc_static=
+  lt_cv_prog_cc_no_builtin=
+  lt_cv_prog_cc_can_build_shared=$can_build_shared
+
+  if test "$GCC" = yes; then
+    lt_cv_prog_cc_wl='-Wl,'
+    lt_cv_prog_cc_static='-static'
+
+    case $host_os in
+    aix*)
+      # Below there is a dirty hack to force normal static linking with -ldl
+      # The problem is because libdl dynamically linked with both libc and
+      # libC (AIX C++ library), which obviously doesn't included in libraries
+      # list by gcc. This cause undefined symbols with -static flags.
+      # This hack allows C programs to be linked with "-static -ldl", but
+      # not sure about C++ programs.
+      lt_cv_prog_cc_static="$lt_cv_prog_cc_static ${lt_cv_prog_cc_wl}-lC"
+      ;;
+    amigaos*)
+      # FIXME: we need at least 68020 code to build shared libraries, but
+      # adding the `-m68020' flag to GCC prevents building anything better,
+      # like `-m68040'.
+      lt_cv_prog_cc_pic='-m68020 -resident32 -malways-restore-a4'
+      ;;
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      lt_cv_prog_cc_pic='-fno-common'
+      ;;
+    cygwin* | mingw* | pw32* | os2*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      lt_cv_prog_cc_pic='-DDLL_EXPORT'
+      ;;
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	 lt_cv_prog_cc_pic=-Kconform_pic
+      fi
+      ;;
+    *)
+      lt_cv_prog_cc_pic='-fPIC'
+      ;;
+    esac
+  else
+    # PORTME Check for PIC flags for the system compiler.
+    case $host_os in
+    aix3* | aix4* | aix5*)
+      lt_cv_prog_cc_wl='-Wl,'
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	lt_cv_prog_cc_static='-Bstatic'
+      else
+	lt_cv_prog_cc_static='-bnso -bI:/lib/syscalls.exp'
+      fi
+      ;;
+
+    hpux9* | hpux10* | hpux11*)
+      # Is there a better lt_cv_prog_cc_static that works with the bundled CC?
+      lt_cv_prog_cc_wl='-Wl,'
+      lt_cv_prog_cc_static="${lt_cv_prog_cc_wl}-a ${lt_cv_prog_cc_wl}archive"
+      lt_cv_prog_cc_pic='+Z'
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      lt_cv_prog_cc_wl='-Wl,'
+      lt_cv_prog_cc_static='-non_shared'
+      # PIC (with -KPIC) is the default.
+      ;;
+
+    cygwin* | mingw* | pw32* | os2*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      lt_cv_prog_cc_pic='-DDLL_EXPORT'
+      ;;
+
+    newsos6)
+      lt_cv_prog_cc_pic='-KPIC'
+      lt_cv_prog_cc_static='-Bstatic'
+      ;;
+
+    osf3* | osf4* | osf5*)
+      # All OSF/1 code is PIC.
+      lt_cv_prog_cc_wl='-Wl,'
+      lt_cv_prog_cc_static='-non_shared'
+      ;;
+
+    sco3.2v5*)
+      lt_cv_prog_cc_pic='-Kpic'
+      lt_cv_prog_cc_static='-dn'
+      lt_cv_prog_cc_shlib='-belf'
+      ;;
+
+    solaris*)
+      lt_cv_prog_cc_pic='-KPIC'
+      lt_cv_prog_cc_static='-Bstatic'
+      lt_cv_prog_cc_wl='-Wl,'
+      ;;
+
+    sunos4*)
+      lt_cv_prog_cc_pic='-PIC'
+      lt_cv_prog_cc_static='-Bstatic'
+      lt_cv_prog_cc_wl='-Qoption ld '
+      ;;
+
+    sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+      lt_cv_prog_cc_pic='-KPIC'
+      lt_cv_prog_cc_static='-Bstatic'
+      if test "x$host_vendor" = xsni; then
+	lt_cv_prog_cc_wl='-LD'
+      else
+	lt_cv_prog_cc_wl='-Wl,'
+      fi
+      ;;
+
+    uts4*)
+      lt_cv_prog_cc_pic='-pic'
+      lt_cv_prog_cc_static='-Bstatic'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec ;then
+	lt_cv_prog_cc_pic='-Kconform_pic'
+	lt_cv_prog_cc_static='-Bstatic'
+      fi
+      ;;
+
+    *)
+      lt_cv_prog_cc_can_build_shared=no
+      ;;
+    esac
+  fi
+])
+if test -z "$lt_cv_prog_cc_pic"; then
+  AC_MSG_RESULT([none])
+else
+  AC_MSG_RESULT([$lt_cv_prog_cc_pic])
+
+  # Check to make sure the pic_flag actually works.
+  AC_MSG_CHECKING([if $compiler PIC flag $lt_cv_prog_cc_pic works])
+  AC_CACHE_VAL(lt_cv_prog_cc_pic_works, [dnl
+    save_CFLAGS="$CFLAGS"
+    CFLAGS="$CFLAGS $lt_cv_prog_cc_pic -DPIC"
+    AC_TRY_COMPILE([], [], [dnl
+      case $host_os in
+      hpux9* | hpux10* | hpux11*)
+	# On HP-UX, both CC and GCC only warn that PIC is supported... then
+	# they create non-PIC objects.  So, if there were any warnings, we
+	# assume that PIC is not supported.
+	if test -s conftest.err; then
+	  lt_cv_prog_cc_pic_works=no
+	else
+	  lt_cv_prog_cc_pic_works=yes
+	fi
+	;;
+      *)
+	lt_cv_prog_cc_pic_works=yes
+	;;
+      esac
+    ], [dnl
+      lt_cv_prog_cc_pic_works=no
+    ])
+    CFLAGS="$save_CFLAGS"
+  ])
+
+  if test "X$lt_cv_prog_cc_pic_works" = Xno; then
+    lt_cv_prog_cc_pic=
+    lt_cv_prog_cc_can_build_shared=no
+  else
+    lt_cv_prog_cc_pic=" $lt_cv_prog_cc_pic"
+  fi
+
+  AC_MSG_RESULT([$lt_cv_prog_cc_pic_works])
+fi
+
+# Check for any special shared library compilation flags.
+if test -n "$lt_cv_prog_cc_shlib"; then
+  AC_MSG_WARN([\`$CC' requires \`$lt_cv_prog_cc_shlib' to build shared libraries])
+  if echo "$old_CC $old_CFLAGS " | egrep -e "[[ 	]]$lt_cv_prog_cc_shlib[[ 	]]" >/dev/null; then :
+  else
+   AC_MSG_WARN([add \`$lt_cv_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure])
+    lt_cv_prog_cc_can_build_shared=no
+  fi
+fi
+
+AC_MSG_CHECKING([if $compiler static flag $lt_cv_prog_cc_static works])
+AC_CACHE_VAL([lt_cv_prog_cc_static_works], [dnl
+  lt_cv_prog_cc_static_works=no
+  save_LDFLAGS="$LDFLAGS"
+  LDFLAGS="$LDFLAGS $lt_cv_prog_cc_static"
+  AC_TRY_LINK([], [], [lt_cv_prog_cc_static_works=yes])
+  LDFLAGS="$save_LDFLAGS"
+])
+
+# Belt *and* braces to stop my trousers falling down:
+test "X$lt_cv_prog_cc_static_works" = Xno && lt_cv_prog_cc_static=
+AC_MSG_RESULT([$lt_cv_prog_cc_static_works])
+
+pic_flag="$lt_cv_prog_cc_pic"
+special_shlib_compile_flags="$lt_cv_prog_cc_shlib"
+wl="$lt_cv_prog_cc_wl"
+link_static_flag="$lt_cv_prog_cc_static"
+no_builtin_flag="$lt_cv_prog_cc_no_builtin"
+can_build_shared="$lt_cv_prog_cc_can_build_shared"
+
+
+# Check to see if options -o and -c are simultaneously supported by compiler
+AC_MSG_CHECKING([if $compiler supports -c -o file.$ac_objext])
+AC_CACHE_VAL([lt_cv_compiler_c_o], [
+$rm -r conftest 2>/dev/null
+mkdir conftest
+cd conftest
+echo "int some_variable = 0;" > conftest.$ac_ext
+mkdir out
+# According to Tom Tromey, Ian Lance Taylor reported there are C compilers
+# that will create temporary files in the current directory regardless of
+# the output directory.  Thus, making CWD read-only will cause this test
+# to fail, enabling locking or at least warning the user not to do parallel
+# builds.
+chmod -w .
+save_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS -o out/conftest2.$ac_objext"
+compiler_c_o=no
+if { (eval echo configure:__oline__: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>out/conftest.err; } && test -s out/conftest2.$ac_objext; then
+  # The compiler can only warn and ignore the option if not recognized
+  # So say no if there are warnings
+  if test -s out/conftest.err; then
+    lt_cv_compiler_c_o=no
+  else
+    lt_cv_compiler_c_o=yes
+  fi
+else
+  # Append any errors to the config.log.
+  cat out/conftest.err 1>&AC_FD_CC
+  lt_cv_compiler_c_o=no
+fi
+CFLAGS="$save_CFLAGS"
+chmod u+w .
+$rm conftest* out/*
+rmdir out
+cd ..
+rmdir conftest
+$rm -r conftest 2>/dev/null
+])
+compiler_c_o=$lt_cv_compiler_c_o
+AC_MSG_RESULT([$compiler_c_o])
+
+if test x"$compiler_c_o" = x"yes"; then
+  # Check to see if we can write to a .lo
+  AC_MSG_CHECKING([if $compiler supports -c -o file.lo])
+  AC_CACHE_VAL([lt_cv_compiler_o_lo], [
+  lt_cv_compiler_o_lo=no
+  save_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS -c -o conftest.lo"
+  save_objext="$ac_objext"
+  ac_objext=lo
+  AC_TRY_COMPILE([], [int some_variable = 0;], [dnl
+    # The compiler can only warn and ignore the option if not recognized
+    # So say no if there are warnings
+    if test -s conftest.err; then
+      lt_cv_compiler_o_lo=no
+    else
+      lt_cv_compiler_o_lo=yes
+    fi
+  ])
+  ac_objext="$save_objext"
+  CFLAGS="$save_CFLAGS"
+  ])
+  compiler_o_lo=$lt_cv_compiler_o_lo
+  AC_MSG_RESULT([$compiler_o_lo])
+else
+  compiler_o_lo=no
+fi
+
+# Check to see if we can do hard links to lock some files if needed
+hard_links="nottested"
+if test "$compiler_c_o" = no && test "$need_locks" != no; then
+  # do not overwrite the value of need_locks provided by the user
+  AC_MSG_CHECKING([if we can lock with hard links])
+  hard_links=yes
+  $rm conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  AC_MSG_RESULT([$hard_links])
+  if test "$hard_links" = no; then
+    AC_MSG_WARN([\`$CC' does not support \`-c -o', so \`make -j' may be unsafe])
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+
+if test "$GCC" = yes; then
+  # Check to see if options -fno-rtti -fno-exceptions are supported by compiler
+  AC_MSG_CHECKING([if $compiler supports -fno-rtti -fno-exceptions])
+  echo "int some_variable = 0;" > conftest.$ac_ext
+  save_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS -fno-rtti -fno-exceptions -c conftest.$ac_ext"
+  compiler_rtti_exceptions=no
+  AC_TRY_COMPILE([], [int some_variable = 0;], [dnl
+    # The compiler can only warn and ignore the option if not recognized
+    # So say no if there are warnings
+    if test -s conftest.err; then
+      compiler_rtti_exceptions=no
+    else
+      compiler_rtti_exceptions=yes
+    fi
+  ])
+  CFLAGS="$save_CFLAGS"
+  AC_MSG_RESULT([$compiler_rtti_exceptions])
+
+  if test "$compiler_rtti_exceptions" = "yes"; then
+    no_builtin_flag=' -fno-builtin -fno-rtti -fno-exceptions'
+  else
+    no_builtin_flag=' -fno-builtin'
+  fi
+fi
+
+# See if the linker supports building shared libraries.
+AC_MSG_CHECKING([whether the linker ($LD) supports shared libraries])
+
+allow_undefined_flag=
+no_undefined_flag=
+need_lib_prefix=unknown
+need_version=unknown
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+archive_cmds=
+archive_expsym_cmds=
+old_archive_from_new_cmds=
+old_archive_from_expsyms_cmds=
+export_dynamic_flag_spec=
+whole_archive_flag_spec=
+thread_safe_flag_spec=
+hardcode_into_libs=no
+hardcode_libdir_flag_spec=
+hardcode_libdir_separator=
+hardcode_direct=no
+hardcode_minus_L=no
+hardcode_shlibpath_var=unsupported
+runpath_var=
+link_all_deplibs=unknown
+always_export_symbols=no
+export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | sed '\''s/.* //'\'' | sort | uniq > $export_symbols'
+# include_expsyms should be a list of space-separated symbols to be *always*
+# included in the symbol list
+include_expsyms=
+# exclude_expsyms can be an egrep regular expression of symbols to exclude
+# it will be wrapped by ` (' and `)$', so one must not match beginning or
+# end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+# as well as any symbol that contains `d'.
+exclude_expsyms="_GLOBAL_OFFSET_TABLE_"
+# Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+# platforms (ab)use it in PIC code, but their linkers get confused if
+# the symbol is explicitly referenced.  Since portable code cannot
+# rely on this symbol name, it's probably fine to never include it in
+# preloaded symbol tables.
+extract_expsyms_cmds=
+
+case $host_os in
+cygwin* | mingw* | pw32*)
+  # FIXME: the MSVC++ port hasn't been tested in a loooong time
+  # When not using gcc, we currently assume that we are using
+  # Microsoft Visual C++.
+  if test "$GCC" != yes; then
+    with_gnu_ld=no
+  fi
+  ;;
+openbsd*)
+  with_gnu_ld=no
+  ;;
+esac
+
+ld_shlibs=yes
+if test "$with_gnu_ld" = yes; then
+  # If archive_cmds runs LD, not CC, wlarc should be empty
+  wlarc='${wl}'
+
+  # See if GNU ld supports shared libraries.
+  case $host_os in
+  aix3* | aix4* | aix5*)
+    # On AIX, the GNU linker is very broken
+    # Note:Check GNU linker on AIX 5-IA64 when/if it becomes available.
+    ld_shlibs=no
+    cat <<EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.9.1, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support.  If you
+*** really care for shared libraries, you may want to modify your PATH
+*** so that a non-GNU linker is found, and then restart.
+
+EOF
+    ;;
+
+  amigaos*)
+    archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+    hardcode_libdir_flag_spec='-L$libdir'
+    hardcode_minus_L=yes
+
+    # Samuel A. Falvo II <[email protected]> reports
+    # that the semantics of dynamic libraries on AmigaOS, at least up
+    # to version 4, is to share data among multiple programs linked
+    # with the same dynamic library.  Since this doesn't match the
+    # behavior of shared libraries on other platforms, we can use
+    # them.
+    ld_shlibs=no
+    ;;
+
+  beos*)
+    if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then
+      allow_undefined_flag=unsupported
+      # Joseph Beckenbach <[email protected]> says some releases of gcc
+      # support --undefined.  This deserves some investigation.  FIXME
+      archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+    else
+      ld_shlibs=no
+    fi
+    ;;
+
+  cygwin* | mingw* | pw32*)
+    # hardcode_libdir_flag_spec is actually meaningless, as there is
+    # no search path for DLLs.
+    hardcode_libdir_flag_spec='-L$libdir'
+    allow_undefined_flag=unsupported
+    always_export_symbols=yes
+
+    extract_expsyms_cmds='test -f $output_objdir/impgen.c || \
+      sed -e "/^# \/\* impgen\.c starts here \*\//,/^# \/\* impgen.c ends here \*\// { s/^# //;s/^# *$//; p; }" -e d < $''0 > $output_objdir/impgen.c~
+      test -f $output_objdir/impgen.exe || (cd $output_objdir && \
+      if test "x$HOST_CC" != "x" ; then $HOST_CC -o impgen impgen.c ; \
+      else $CC -o impgen impgen.c ; fi)~
+      $output_objdir/impgen $dir/$soroot > $output_objdir/$soname-def'
+
+    old_archive_from_expsyms_cmds='$DLLTOOL --as=$AS --dllname $soname --def $output_objdir/$soname-def --output-lib $output_objdir/$newlib'
+
+    # cygwin and mingw dlls have different entry points and sets of symbols
+    # to exclude.
+    # FIXME: what about values for MSVC?
+    dll_entry=__cygwin_dll_entry@12
+    dll_exclude_symbols=DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12~
+    case $host_os in
+    mingw*)
+      # mingw values
+      dll_entry=_DllMainCRTStartup@12
+      dll_exclude_symbols=DllMain@12,DllMainCRTStartup@12,DllEntryPoint@12~
+      ;;
+    esac
+
+    # mingw and cygwin differ, and it's simplest to just exclude the union
+    # of the two symbol sets.
+    dll_exclude_symbols=DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12,DllMainCRTStartup@12,DllEntryPoint@12
+
+    # recent cygwin and mingw systems supply a stub DllMain which the user
+    # can override, but on older systems we have to supply one (in ltdll.c)
+    if test "x$lt_cv_need_dllmain" = "xyes"; then
+      ltdll_obj='$output_objdir/$soname-ltdll.'"$ac_objext "
+      ltdll_cmds='test -f $output_objdir/$soname-ltdll.c || sed -e "/^# \/\* ltdll\.c starts here \*\//,/^# \/\* ltdll.c ends here \*\// { s/^# //; p; }" -e d < $''0 > $output_objdir/$soname-ltdll.c~
+	test -f $output_objdir/$soname-ltdll.$ac_objext || (cd $output_objdir && $CC -c $soname-ltdll.c)~'
+    else
+      ltdll_obj=
+      ltdll_cmds=
+    fi
+
+    # Extract the symbol export list from an `--export-all' def file,
+    # then regenerate the def file from the symbol export list, so that
+    # the compiled dll only exports the symbol export list.
+    # Be careful not to strip the DATA tag left be newer dlltools.
+    export_symbols_cmds="$ltdll_cmds"'
+      $DLLTOOL --export-all --exclude-symbols '$dll_exclude_symbols' --output-def $output_objdir/$soname-def '$ltdll_obj'$libobjs $convenience~
+      sed -e "1,/EXPORTS/d" -e "s/ @ [[0-9]]*//" -e "s/ *;.*$//" < $output_objdir/$soname-def > $export_symbols'
+
+    # If the export-symbols file already is a .def file (1st line
+    # is EXPORTS), use it as is.
+    # If DATA tags from a recent dlltool are present, honour them!
+    archive_expsym_cmds='if test "x`head -1 $export_symbols`" = xEXPORTS; then
+	cp $export_symbols $output_objdir/$soname-def;
+      else
+	echo EXPORTS > $output_objdir/$soname-def;
+	_lt_hint=1;
+	cat $export_symbols | while read symbol; do
+	 set dummy \$symbol;
+	 case \[$]# in
+	   2) echo "   \[$]2 @ \$_lt_hint ; " >> $output_objdir/$soname-def;;
+	   *) echo "     \[$]2 @ \$_lt_hint \[$]3 ; " >> $output_objdir/$soname-def;;
+	 esac;
+	 _lt_hint=`expr 1 + \$_lt_hint`;
+	done;
+      fi~
+      '"$ltdll_cmds"'
+      $CC -Wl,--base-file,$output_objdir/$soname-base '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags~
+      $DLLTOOL --as=$AS --dllname $soname --exclude-symbols '$dll_exclude_symbols' --def $output_objdir/$soname-def --base-file $output_objdir/$soname-base --output-exp $output_objdir/$soname-exp~
+      $CC -Wl,--base-file,$output_objdir/$soname-base $output_objdir/$soname-exp '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags~
+      $DLLTOOL --as=$AS --dllname $soname --exclude-symbols '$dll_exclude_symbols' --def $output_objdir/$soname-def --base-file $output_objdir/$soname-base --output-exp $output_objdir/$soname-exp --output-lib $output_objdir/$libname.dll.a~
+      $CC $output_objdir/$soname-exp '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags'
+    ;;
+
+  netbsd*)
+    if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+      archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+      wlarc=
+    else
+      archive_cmds='$CC -shared -nodefaultlibs $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      archive_expsym_cmds='$CC -shared -nodefaultlibs $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+    fi
+    ;;
+
+  solaris* | sysv5*)
+    if $LD -v 2>&1 | egrep 'BFD 2\.8' > /dev/null; then
+      ld_shlibs=no
+      cat <<EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+EOF
+    elif $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then
+      archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+    else
+      ld_shlibs=no
+    fi
+    ;;
+
+  sunos4*)
+    archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+    wlarc=
+    hardcode_direct=yes
+    hardcode_shlibpath_var=no
+    ;;
+
+  *)
+    if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then
+      archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+    else
+      ld_shlibs=no
+    fi
+    ;;
+  esac
+
+  if test "$ld_shlibs" = yes; then
+    runpath_var=LD_RUN_PATH
+    hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir'
+    export_dynamic_flag_spec='${wl}--export-dynamic'
+    case $host_os in
+    cygwin* | mingw* | pw32*)
+      # dlltool doesn't understand --whole-archive et. al.
+      whole_archive_flag_spec=
+      ;;
+    *)
+      # ancient GNU ld didn't support --whole-archive et. al.
+      if $LD --help 2>&1 | egrep 'no-whole-archive' > /dev/null; then
+	whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+      else
+	whole_archive_flag_spec=
+      fi
+      ;;
+    esac
+  fi
+else
+  # PORTME fill in a description of your system's linker (not GNU ld)
+  case $host_os in
+  aix3*)
+    allow_undefined_flag=unsupported
+    always_export_symbols=yes
+    archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+    # Note: this linker hardcodes the directories in LIBPATH if there
+    # are no directories specified by -L.
+    hardcode_minus_L=yes
+    if test "$GCC" = yes && test -z "$link_static_flag"; then
+      # Neither direct hardcoding nor static linking is supported with a
+      # broken collect2.
+      hardcode_direct=unsupported
+    fi
+    ;;
+
+  aix4* | aix5*)
+    if test "$host_cpu" = ia64; then
+      # On IA64, the linker does run time linking by default, so we don't
+      # have to do anything special.
+      aix_use_runtimelinking=no
+      exp_sym_flag='-Bexport'
+      no_entry_flag=""
+    else
+      aix_use_runtimelinking=no
+
+      # Test if we are trying to use run time linking or normal
+      # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+      # need to do runtime linking.
+      case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*)
+	for ld_flag in $LDFLAGS; do
+	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+	    aix_use_runtimelinking=yes
+	    break
+	  fi
+	done
+      esac
+
+      exp_sym_flag='-bexport'
+      no_entry_flag='-bnoentry'
+    fi
+
+    # When large executables or shared objects are built, AIX ld can
+    # have problems creating the table of contents.  If linking a library
+    # or program results in "error TOC overflow" add -mminimal-toc to
+    # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+    # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+    hardcode_direct=yes
+    archive_cmds=''
+    hardcode_libdir_separator=':'
+    if test "$GCC" = yes; then
+      case $host_os in aix4.[[012]]|aix4.[[012]].*)
+	collect2name=`${CC} -print-prog-name=collect2`
+	if test -f "$collect2name" && \
+	  strings "$collect2name" | grep resolve_lib_name >/dev/null
+	then
+	  # We have reworked collect2
+	  hardcode_direct=yes
+	else
+	  # We have old collect2
+	  hardcode_direct=unsupported
+	  # It fails to find uninstalled libraries when the uninstalled
+	  # path is not listed in the libpath.  Setting hardcode_minus_L
+	  # to unsupported forces relinking
+	  hardcode_minus_L=yes
+	  hardcode_libdir_flag_spec='-L$libdir'
+	  hardcode_libdir_separator=
+	fi
+      esac
+
+      shared_flag='-shared'
+    else
+      # not using gcc
+      if test "$host_cpu" = ia64; then
+	shared_flag='${wl}-G'
+      else
+	if test "$aix_use_runtimelinking" = yes; then
+	  shared_flag='${wl}-G'
+	else
+	  shared_flag='${wl}-bM:SRE'
+	fi
+      fi
+    fi
+
+    # It seems that -bexpall can do strange things, so it is better to
+    # generate a list of symbols to export.
+    always_export_symbols=yes
+    if test "$aix_use_runtimelinking" = yes; then
+      # Warning - without using the other runtime loading flags (-brtl),
+      # -berok will link without error, but may produce a broken library.
+      allow_undefined_flag='-berok'
+      hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:/usr/lib:/lib'
+      archive_expsym_cmds="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+    else
+      if test "$host_cpu" = ia64; then
+	hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
+	allow_undefined_flag="-z nodefs"
+	archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname ${wl}-h$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols"
+      else
+	hardcode_libdir_flag_spec='${wl}-bnolibpath ${wl}-blibpath:$libdir:/usr/lib:/lib'
+	# Warning - without using the other run time loading flags,
+	# -berok will link without error, but may produce a broken library.
+	allow_undefined_flag='${wl}-berok'
+	# This is a bit strange, but is similar to how AIX traditionally builds
+	# it's shared libraries.
+	archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols"' ~$AR -crlo $objdir/$libname$release.a $objdir/$soname'
+      fi
+    fi
+    ;;
+
+  amigaos*)
+    archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+    hardcode_libdir_flag_spec='-L$libdir'
+    hardcode_minus_L=yes
+    # see comment about different semantics on the GNU ld section
+    ld_shlibs=no
+    ;;
+
+  cygwin* | mingw* | pw32*)
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    # hardcode_libdir_flag_spec is actually meaningless, as there is
+    # no search path for DLLs.
+    hardcode_libdir_flag_spec=' '
+    allow_undefined_flag=unsupported
+    # Tell ltmain to make .lib files, not .a files.
+    libext=lib
+    # FIXME: Setting linknames here is a bad hack.
+    archive_cmds='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | sed -e '\''s/ -lc$//'\''` -link -dll~linknames='
+    # The linker will automatically build a .lib file if we build a DLL.
+    old_archive_from_new_cmds='true'
+    # FIXME: Should let the user specify the lib program.
+    old_archive_cmds='lib /OUT:$oldlib$oldobjs$old_deplibs'
+    fix_srcfile_path='`cygpath -w "$srcfile"`'
+    ;;
+
+  darwin* | rhapsody*)
+    case "$host_os" in
+    rhapsody* | darwin1.[[012]])
+      allow_undefined_flag='-undefined suppress'
+      ;;
+    *) # Darwin 1.3 on
+      allow_undefined_flag='-flat_namespace -undefined suppress'
+      ;;
+    esac
+    # FIXME: Relying on posixy $() will cause problems for
+    #        cross-compilation, but unfortunately the echo tests do not
+    #        yet detect zsh echo's removal of \ escapes.  Also zsh mangles
+    #	     `"' quotes if we put them in here... so don't!
+    archive_cmds='$nonopt $(test .$module = .yes && echo -bundle || echo -dynamiclib) $allow_undefined_flag -o $lib $libobjs $deplibs$linker_flags -install_name $rpath/$soname $verstring'
+    # We need to add '_' to the symbols in $export_symbols first
+    #archive_expsym_cmds="$archive_cmds"' && strip -s $export_symbols'
+    hardcode_direct=yes
+    hardcode_shlibpath_var=no
+    whole_archive_flag_spec='-all_load $convenience'
+    ;;
+
+  freebsd1*)
+    ld_shlibs=no
+    ;;
+
+  # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+  # support.  Future versions do this automatically, but an explicit c++rt0.o
+  # does not break anything, and helps significantly (at the cost of a little
+  # extra space).
+  freebsd2.2*)
+    archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+    hardcode_libdir_flag_spec='-R$libdir'
+    hardcode_direct=yes
+    hardcode_shlibpath_var=no
+    ;;
+
+  # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+  freebsd2*)
+    archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+    hardcode_direct=yes
+    hardcode_minus_L=yes
+    hardcode_shlibpath_var=no
+    ;;
+
+  # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+  freebsd*)
+    archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
+    hardcode_libdir_flag_spec='-R$libdir'
+    hardcode_direct=yes
+    hardcode_shlibpath_var=no
+    ;;
+
+  hpux9* | hpux10* | hpux11*)
+    case $host_os in
+    hpux9*) archive_cmds='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' ;;
+    *) archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' ;;
+    esac
+    hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+    hardcode_libdir_separator=:
+    hardcode_direct=yes
+    hardcode_minus_L=yes # Not in the search PATH, but as the default
+			 # location of the library.
+    export_dynamic_flag_spec='${wl}-E'
+    ;;
+
+  irix5* | irix6* | nonstopux*)
+    if test "$GCC" = yes; then
+      archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+    else
+      archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+    fi
+    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+    hardcode_libdir_separator=:
+    link_all_deplibs=yes
+    ;;
+
+  netbsd*)
+    if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
+    else
+      archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
+    fi
+    hardcode_libdir_flag_spec='-R$libdir'
+    hardcode_direct=yes
+    hardcode_shlibpath_var=no
+    ;;
+
+  newsos6)
+    archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+    hardcode_direct=yes
+    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+    hardcode_libdir_separator=:
+    hardcode_shlibpath_var=no
+    ;;
+
+  openbsd*)
+    hardcode_direct=yes
+    hardcode_shlibpath_var=no
+    if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+      archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+      export_dynamic_flag_spec='${wl}-E'
+    else
+      case "$host_os" in
+      openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*)
+	archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+	hardcode_libdir_flag_spec='-R$libdir'
+        ;;
+      *)
+        archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $linker_flags'
+        hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+        ;;
+      esac
+    fi
+    ;;
+
+  os2*)
+    hardcode_libdir_flag_spec='-L$libdir'
+    hardcode_minus_L=yes
+    allow_undefined_flag=unsupported
+    archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+    old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+    ;;
+
+  osf3*)
+    if test "$GCC" = yes; then
+      allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
+      archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+    else
+      allow_undefined_flag=' -expect_unresolved \*'
+      archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+    fi
+    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+    hardcode_libdir_separator=:
+    ;;
+
+  osf4* | osf5*)	# as osf3* with the addition of -msym flag
+    if test "$GCC" = yes; then
+      allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
+      archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+    else
+      allow_undefined_flag=' -expect_unresolved \*'
+      archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+      archive_expsym_cmds='for i in `cat $export_symbols`; do printf "-exported_symbol " >> $lib.exp; echo "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~
+      $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp'
+
+      #Both c and cxx compiler support -rpath directly
+      hardcode_libdir_flag_spec='-rpath $libdir'
+    fi
+    hardcode_libdir_separator=:
+    ;;
+
+  sco3.2v5*)
+    archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+    hardcode_shlibpath_var=no
+    runpath_var=LD_RUN_PATH
+    hardcode_runpath_var=yes
+    export_dynamic_flag_spec='${wl}-Bexport'
+    ;;
+
+  solaris*)
+    # gcc --version < 3.0 without binutils cannot create self contained
+    # shared libraries reliably, requiring libgcc.a to resolve some of
+    # the object symbols generated in some cases.  Libraries that use
+    # assert need libgcc.a to resolve __eprintf, for example.  Linking
+    # a copy of libgcc.a into every shared library to guarantee resolving
+    # such symbols causes other problems:  According to Tim Van Holder
+    # <[email protected]>, C++ libraries end up with a separate
+    # (to the application) exception stack for one thing.
+    no_undefined_flag=' -z defs'
+    if test "$GCC" = yes; then
+      case `$CC --version 2>/dev/null` in
+      [[12]].*)
+	cat <<EOF 1>&2
+
+*** Warning: Releases of GCC earlier than version 3.0 cannot reliably
+*** create self contained shared libraries on Solaris systems, without
+*** introducing a dependency on libgcc.a.  Therefore, libtool is disabling
+*** -no-undefined support, which will at least allow you to build shared
+*** libraries.  However, you may find that when you link such libraries
+*** into an application without using GCC, you have to manually add
+*** \`gcc --print-libgcc-file-name\` to the link command.  We urge you to
+*** upgrade to a newer version of GCC.  Another option is to rebuild your
+*** current GCC to use the GNU linker from GNU binutils 2.9.1 or newer.
+
+EOF
+        no_undefined_flag=
+	;;
+      esac
+    fi
+    # $CC -shared without GNU ld will not create a library from C++
+    # object files and a static libstdc++, better avoid it by now
+    archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+    archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+		$LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
+    hardcode_libdir_flag_spec='-R$libdir'
+    hardcode_shlibpath_var=no
+    case $host_os in
+    solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+    *) # Supported since Solaris 2.6 (maybe 2.5.1?)
+      whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;;
+    esac
+    link_all_deplibs=yes
+    ;;
+
+  sunos4*)
+    if test "x$host_vendor" = xsequent; then
+      # Use $CC to link under sequent, because it throws in some extra .o
+      # files that make .init and .fini sections work.
+      archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+    else
+      archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+    fi
+    hardcode_libdir_flag_spec='-L$libdir'
+    hardcode_direct=yes
+    hardcode_minus_L=yes
+    hardcode_shlibpath_var=no
+    ;;
+
+  sysv4)
+    if test "x$host_vendor" = xsno; then
+      archive_cmds='$LD -G -Bsymbolic -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct=yes # is this really true???
+    else
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct=no #Motorola manual says yes, but my tests say they lie
+    fi
+    runpath_var='LD_RUN_PATH'
+    hardcode_shlibpath_var=no
+    ;;
+
+  sysv4.3*)
+    archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+    hardcode_shlibpath_var=no
+    export_dynamic_flag_spec='-Bexport'
+    ;;
+
+  sysv5*)
+    no_undefined_flag=' -z text'
+    # $CC -shared without GNU ld will not create a library from C++
+    # object files and a static libstdc++, better avoid it by now
+    archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+    archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+		$LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
+    hardcode_libdir_flag_spec=
+    hardcode_shlibpath_var=no
+    runpath_var='LD_RUN_PATH'
+    ;;
+
+  uts4*)
+    archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+    hardcode_libdir_flag_spec='-L$libdir'
+    hardcode_shlibpath_var=no
+    ;;
+
+  dgux*)
+    archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+    hardcode_libdir_flag_spec='-L$libdir'
+    hardcode_shlibpath_var=no
+    ;;
+
+  sysv4*MP*)
+    if test -d /usr/nec; then
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_shlibpath_var=no
+      runpath_var=LD_RUN_PATH
+      hardcode_runpath_var=yes
+      ld_shlibs=yes
+    fi
+    ;;
+
+  sysv4.2uw2*)
+    archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+    hardcode_direct=yes
+    hardcode_minus_L=no
+    hardcode_shlibpath_var=no
+    hardcode_runpath_var=yes
+    runpath_var=LD_RUN_PATH
+    ;;
+
+  sysv5uw7* | unixware7*)
+    no_undefined_flag='${wl}-z ${wl}text'
+    if test "$GCC" = yes; then
+      archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+    else
+      archive_cmds='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+    fi
+    runpath_var='LD_RUN_PATH'
+    hardcode_shlibpath_var=no
+    ;;
+
+  *)
+    ld_shlibs=no
+    ;;
+  esac
+fi
+AC_MSG_RESULT([$ld_shlibs])
+test "$ld_shlibs" = no && can_build_shared=no
+
+# Check hardcoding attributes.
+AC_MSG_CHECKING([how to hardcode library paths into programs])
+hardcode_action=
+if test -n "$hardcode_libdir_flag_spec" || \
+   test -n "$runpath_var"; then
+
+  # We can hardcode non-existant directories.
+  if test "$hardcode_direct" != no &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test "$hardcode_shlibpath_var" != no &&
+     test "$hardcode_minus_L" != no; then
+    # Linking always hardcodes the temporary library directory.
+    hardcode_action=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    hardcode_action=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  hardcode_action=unsupported
+fi
+AC_MSG_RESULT([$hardcode_action])
+
+striplib=
+old_striplib=
+AC_MSG_CHECKING([whether stripping libraries is possible])
+if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then
+  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+  AC_MSG_RESULT([yes])
+else
+  AC_MSG_RESULT([no])
+fi
+
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+# PORTME Fill in your ld.so characteristics
+AC_MSG_CHECKING([dynamic linker characteristics])
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+
+case $host_os in
+aix3*)
+  version_type=linux
+  library_names_spec='${libname}${release}.so$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX has no versioning support, so we append a major version to the name.
+  soname_spec='${libname}${release}.so$major'
+  ;;
+
+aix4* | aix5*)
+  version_type=linux
+  if test "$host_cpu" = ia64; then
+    # AIX 5 supports IA64
+    library_names_spec='${libname}${release}.so$major ${libname}${release}.so$versuffix $libname.so'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line `#! .'.  This would cause the generated library to
+    # depend on `.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[[01]] | aix4.[[01]].*)
+	if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+	     echo ' yes '
+	     echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then
+	  :
+	else
+	  can_build_shared=no
+	fi
+	;;
+    esac
+    # AIX (on Power*) has no versioning support, so currently we can
+    # not hardcode correct soname into executable. Probably we can
+    # add versioning support to collect2, so additional links can
+    # be useful in future.
+    if test "$aix_use_runtimelinking" = yes; then
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+    else
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='${libname}${release}.a $libname.a'
+      soname_spec='${libname}${release}.so$major'
+    fi
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  library_names_spec='$libname.ixlibrary $libname.a'
+  # Create ${libname}_ixlibrary.a entries in /sys/libs.
+  finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "(cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a)"; (cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a) || exit 1; done'
+  ;;
+
+beos*)
+  library_names_spec='${libname}.so'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi4*)
+  version_type=linux
+  need_version=no
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+  soname_spec='${libname}${release}.so$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  export_dynamic_flag_spec=-rdynamic
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32*)
+  version_type=windows
+  need_version=no
+  need_lib_prefix=no
+  case $GCC,$host_os in
+  yes,cygwin*)
+    library_names_spec='$libname.dll.a'
+    soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | sed -e 's/[[.]]/-/g'`${versuffix}.dll'
+    postinstall_cmds='dlpath=`bash 2>&1 -c '\''. $dir/${file}i;echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog .libs/$dlname \$dldir/$dlname'
+    postuninstall_cmds='dldll=`bash 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $rm \$dlpath'
+    ;;
+  yes,mingw*)
+    library_names_spec='${libname}`echo ${release} | sed -e 's/[[.]]/-/g'`${versuffix}.dll'
+    sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | sed -e "s/^libraries://" -e "s/;/ /g"`
+    ;;
+  yes,pw32*)
+    library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll'
+    ;;
+  *)
+    library_names_spec='${libname}`echo ${release} | sed -e 's/[[.]]/-/g'`${versuffix}.dll $libname.lib'
+    ;;
+  esac
+  dynamic_linker='Win32 ld.exe'
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  # FIXME: Relying on posixy $() will cause problems for
+  #        cross-compilation, but unfortunately the echo tests do not
+  #        yet detect zsh echo's removal of \ escapes.
+  library_names_spec='${libname}${release}${versuffix}.$(test .$module = .yes && echo so || echo dylib) ${libname}${release}${major}.$(test .$module = .yes && echo so || echo dylib) ${libname}.$(test .$module = .yes && echo so || echo dylib)'
+  soname_spec='${libname}${release}${major}.$(test .$module = .yes && echo so || echo dylib)'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  ;;
+
+freebsd1*)
+  dynamic_linker=no
+  ;;
+
+freebsd*)
+  objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout`
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='${libname}${release}.so$versuffix $libname.so$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  *)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+gnu*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so${major} ${libname}.so'
+  soname_spec='${libname}${release}.so$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  dynamic_linker="$host_os dld.sl"
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  shlibpath_var=SHLIB_PATH
+  shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+  library_names_spec='${libname}${release}.sl$versuffix ${libname}${release}.sl$major $libname.sl'
+  soname_spec='${libname}${release}.sl$major'
+  # HP-UX runs *really* slowly unless shared libraries are mode 555.
+  postinstall_cmds='chmod 555 $lib'
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)          version_type=irix ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}.so$major'
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so $libname.so'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 ") libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 ") libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 ") libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux-gnuoldld* | linux-gnuaout* | linux-gnucoff*)
+  dynamic_linker=no
+  ;;
+
+# This must be Linux ELF.
+linux-gnu*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+  soname_spec='${libname}${release}.so$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+    library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so ${libname}.so'
+    soname_spec='${libname}${release}.so$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+openbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    case "$host_os" in
+    openbsd2.[[89]] | openbsd2.[[89]].*)
+      shlibpath_overrides_runpath=no
+      ;;
+    *)
+      shlibpath_overrides_runpath=yes
+      ;;
+    esac
+  else
+    shlibpath_overrides_runpath=yes
+  fi
+  library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+os2*)
+  libname_spec='$name'
+  need_lib_prefix=no
+  library_names_spec='$libname.dll $libname.a'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=LIBPATH
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_version=no
+  need_lib_prefix=no
+  soname_spec='${libname}${release}.so'
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  ;;
+
+sco3.2v5*)
+  version_type=osf
+  soname_spec='${libname}${release}.so$major'
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+solaris*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+  soname_spec='${libname}${release}.so$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test "$with_gnu_ld" = yes; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+  version_type=linux
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+  soname_spec='${libname}${release}.so$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+uts4*)
+  version_type=linux
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+  soname_spec='${libname}${release}.so$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+dgux*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+  soname_spec='${libname}${release}.so$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec ;then
+    version_type=linux
+    library_names_spec='$libname.so.$versuffix $libname.so.$major $libname.so'
+    soname_spec='$libname.so.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+AC_MSG_RESULT([$dynamic_linker])
+test "$dynamic_linker" = no && can_build_shared=no
+
+# Report the final consequences.
+AC_MSG_CHECKING([if libtool supports shared libraries])
+AC_MSG_RESULT([$can_build_shared])
+
+AC_MSG_CHECKING([whether to build shared libraries])
+test "$can_build_shared" = "no" && enable_shared=no
+
+# On AIX, shared libraries and static libraries use the same namespace, and
+# are all built from PIC.
+case "$host_os" in
+aix3*)
+  test "$enable_shared" = yes && enable_static=no
+  if test -n "$RANLIB"; then
+    archive_cmds="$archive_cmds~\$RANLIB \$lib"
+    postinstall_cmds='$RANLIB $lib'
+  fi
+  ;;
+
+aix4*)
+  if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+    test "$enable_shared" = yes && enable_static=no
+  fi
+  ;;
+esac
+AC_MSG_RESULT([$enable_shared])
+
+AC_MSG_CHECKING([whether to build static libraries])
+# Make sure either enable_shared or enable_static is yes.
+test "$enable_shared" = yes || enable_static=yes
+AC_MSG_RESULT([$enable_static])
+
+if test "$hardcode_action" = relink; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+     test "$enable_shared" = no; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+AC_LIBTOOL_DLOPEN_SELF
+
+if test "$enable_shared" = yes && test "$GCC" = yes; then
+  case $archive_cmds in
+  *'~'*)
+    # FIXME: we may have to deal with multi-command sequences.
+    ;;
+  '$CC '*)
+    # Test whether the compiler implicitly links with -lc since on some
+    # systems, -lgcc has to come before -lc. If gcc already passes -lc
+    # to ld, don't add -lc before -lgcc.
+    AC_MSG_CHECKING([whether -lc should be explicitly linked in])
+    AC_CACHE_VAL([lt_cv_archive_cmds_need_lc],
+    [$rm conftest*
+    echo 'static int dummy;' > conftest.$ac_ext
+
+    if AC_TRY_EVAL(ac_compile); then
+      soname=conftest
+      lib=conftest
+      libobjs=conftest.$ac_objext
+      deplibs=
+      wl=$lt_cv_prog_cc_wl
+      compiler_flags=-v
+      linker_flags=-v
+      verstring=
+      output_objdir=.
+      libname=conftest
+      save_allow_undefined_flag=$allow_undefined_flag
+      allow_undefined_flag=
+      if AC_TRY_EVAL(archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1)
+      then
+	lt_cv_archive_cmds_need_lc=no
+      else
+	lt_cv_archive_cmds_need_lc=yes
+      fi
+      allow_undefined_flag=$save_allow_undefined_flag
+    else
+      cat conftest.err 1>&5
+    fi])
+    AC_MSG_RESULT([$lt_cv_archive_cmds_need_lc])
+    ;;
+  esac
+fi
+need_lc=${lt_cv_archive_cmds_need_lc-yes}
+
+# The second clause should only fire when bootstrapping the
+# libtool distribution, otherwise you forgot to ship ltmain.sh
+# with your package, and you will get complaints that there are
+# no rules to generate ltmain.sh.
+if test -f "$ltmain"; then
+  :
+else
+  # If there is no Makefile yet, we rely on a make rule to execute
+  # `config.status --recheck' to rerun these tests and create the
+  # libtool script then.
+  test -f Makefile && make "$ltmain"
+fi
+
+if test -f "$ltmain"; then
+  trap "$rm \"${ofile}T\"; exit 1" 1 2 15
+  $rm -f "${ofile}T"
+
+  echo creating $ofile
+
+  # Now quote all the things that may contain metacharacters while being
+  # careful not to overquote the AC_SUBSTed values.  We take copies of the
+  # variables and quote the copies for generation of the libtool script.
+  for var in echo old_CC old_CFLAGS \
+    AR AR_FLAGS CC LD LN_S NM SHELL \
+    reload_flag reload_cmds wl \
+    pic_flag link_static_flag no_builtin_flag export_dynamic_flag_spec \
+    thread_safe_flag_spec whole_archive_flag_spec libname_spec \
+    library_names_spec soname_spec \
+    RANLIB old_archive_cmds old_archive_from_new_cmds old_postinstall_cmds \
+    old_postuninstall_cmds archive_cmds archive_expsym_cmds postinstall_cmds \
+    postuninstall_cmds extract_expsyms_cmds old_archive_from_expsyms_cmds \
+    old_striplib striplib file_magic_cmd export_symbols_cmds \
+    deplibs_check_method allow_undefined_flag no_undefined_flag \
+    finish_cmds finish_eval global_symbol_pipe global_symbol_to_cdecl \
+    global_symbol_to_c_name_address \
+    hardcode_libdir_flag_spec hardcode_libdir_separator  \
+    sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
+    compiler_c_o compiler_o_lo need_locks exclude_expsyms include_expsyms; do
+
+    case $var in
+    reload_cmds | old_archive_cmds | old_archive_from_new_cmds | \
+    old_postinstall_cmds | old_postuninstall_cmds | \
+    export_symbols_cmds | archive_cmds | archive_expsym_cmds | \
+    extract_expsyms_cmds | old_archive_from_expsyms_cmds | \
+    postinstall_cmds | postuninstall_cmds | \
+    finish_cmds | sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
+      # Double-quote double-evaled strings.
+      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
+      ;;
+    *)
+      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
+      ;;
+    esac
+  done
+
+  cat <<__EOF__ > "${ofile}T"
+#! $SHELL
+
+# `$echo "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
+# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP)
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+#
+# Copyright (C) 1996-2000 Free Software Foundation, Inc.
+# Originally by Gordon Matzigkeit <[email protected]>, 1996
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Sed that helps us avoid accidentally triggering echo(1) options like -n.
+Xsed="sed -e s/^X//"
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+if test "X\${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi
+
+# ### BEGIN LIBTOOL CONFIG
+
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$need_lc
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# The host system.
+host_alias=$host_alias
+host=$host
+
+# An echo program that does not interpret backslashes.
+echo=$lt_echo
+
+# The archiver.
+AR=$lt_AR
+AR_FLAGS=$lt_AR_FLAGS
+
+# The default C compiler.
+CC=$lt_CC
+
+# Is the compiler the GNU C compiler?
+with_gcc=$GCC
+
+# The linker used to build libraries.
+LD=$lt_LD
+
+# Whether we need hard or soft links.
+LN_S=$lt_LN_S
+
+# A BSD-compatible nm program.
+NM=$lt_NM
+
+# A symbol stripping program
+STRIP=$STRIP
+
+# Used to examine libraries when file_magic_cmd begins "file"
+MAGIC_CMD=$MAGIC_CMD
+
+# Used on cygwin: DLL creation program.
+DLLTOOL="$DLLTOOL"
+
+# Used on cygwin: object dumper.
+OBJDUMP="$OBJDUMP"
+
+# Used on cygwin: assembler.
+AS="$AS"
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# How to pass a linker flag through the compiler.
+wl=$lt_wl
+
+# Object file suffix (normally "o").
+objext="$ac_objext"
+
+# Old archive suffix (normally "a").
+libext="$libext"
+
+# Executable file suffix (normally "").
+exeext="$exeext"
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_pic_flag
+pic_mode=$pic_mode
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_compiler_c_o
+
+# Can we write directly to a .lo ?
+compiler_o_lo=$lt_compiler_o_lo
+
+# Must we lock files when doing compilation ?
+need_locks=$lt_need_locks
+
+# Do we need the lib prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_link_static_flag
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_no_builtin_flag
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec
+
+# Compiler flag to generate thread-safe objects.
+thread_safe_flag_spec=$lt_thread_safe_flag_spec
+
+# Library versioning type.
+version_type=$version_type
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names.  First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME.
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Commands used to build and install an old-style archive.
+RANLIB=$lt_RANLIB
+old_archive_cmds=$lt_old_archive_cmds
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
+
+# Commands used to build and install a shared archive.
+archive_cmds=$lt_archive_cmds
+archive_expsym_cmds=$lt_archive_expsym_cmds
+postinstall_cmds=$lt_postinstall_cmds
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method == file_magic.
+file_magic_cmd=$lt_file_magic_cmd
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag
+
+# Flag that forces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# Same as above, but a single script fragment to be evaled but not shown.
+finish_eval=$lt_finish_eval
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration
+global_symbol_to_cdecl=$lt_global_symbol_to_cdecl
+
+# Transform the output of nm in a C name address pair
+global_symbol_to_c_name_address=$lt_global_symbol_to_c_name_address
+
+# This is the shared library runtime path variable.
+runpath_var=$runpath_var
+
+# This is the shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator
+
+# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct=$hardcode_direct
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L=$hardcode_minus_L
+
+# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
+# the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at relink time.
+variables_saved_for_relink="$variables_saved_for_relink"
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs
+
+# Compile-time system search path for libraries
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Run-time system search path for libraries
+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path="$fix_srcfile_path"
+
+# Set to yes if exported symbols are required.
+always_export_symbols=$always_export_symbols
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms
+
+# ### END LIBTOOL CONFIG
+
+__EOF__
+
+  case $host_os in
+  aix3*)
+    cat <<\EOF >> "${ofile}T"
+
+# AIX sometimes has problems with the GCC collect2 program.  For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test "X${COLLECT_NAMES+set}" != Xset; then
+  COLLECT_NAMES=
+  export COLLECT_NAMES
+fi
+EOF
+    ;;
+  esac
+
+  case $host_os in
+  cygwin* | mingw* | pw32* | os2*)
+    cat <<'EOF' >> "${ofile}T"
+      # This is a source program that is used to create dlls on Windows
+      # Don't remove nor modify the starting and closing comments
+# /* ltdll.c starts here */
+# #define WIN32_LEAN_AND_MEAN
+# #include <windows.h>
+# #undef WIN32_LEAN_AND_MEAN
+# #include <stdio.h>
+#
+# #ifndef __CYGWIN__
+# #  ifdef __CYGWIN32__
+# #    define __CYGWIN__ __CYGWIN32__
+# #  endif
+# #endif
+#
+# #ifdef __cplusplus
+# extern "C" {
+# #endif
+# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved);
+# #ifdef __cplusplus
+# }
+# #endif
+#
+# #ifdef __CYGWIN__
+# #include <cygwin/cygwin_dll.h>
+# DECLARE_CYGWIN_DLL( DllMain );
+# #endif
+# HINSTANCE __hDllInstance_base;
+#
+# BOOL APIENTRY
+# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved)
+# {
+#   __hDllInstance_base = hInst;
+#   return TRUE;
+# }
+# /* ltdll.c ends here */
+	# This is a source program that is used to create import libraries
+	# on Windows for dlls which lack them. Don't remove nor modify the
+	# starting and closing comments
+# /* impgen.c starts here */
+# /*   Copyright (C) 1999-2000 Free Software Foundation, Inc.
+#
+#  This file is part of GNU libtool.
+#
+#  This program is free software; you can redistribute it and/or modify
+#  it under the terms of the GNU General Public License as published by
+#  the Free Software Foundation; either version 2 of the License, or
+#  (at your option) any later version.
+#
+#  This program is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#  GNU General Public License for more details.
+#
+#  You should have received a copy of the GNU General Public License
+#  along with this program; if not, write to the Free Software
+#  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#  */
+#
+# #include <stdio.h>		/* for printf() */
+# #include <unistd.h>		/* for open(), lseek(), read() */
+# #include <fcntl.h>		/* for O_RDONLY, O_BINARY */
+# #include <string.h>		/* for strdup() */
+#
+# /* O_BINARY isn't required (or even defined sometimes) under Unix */
+# #ifndef O_BINARY
+# #define O_BINARY 0
+# #endif
+#
+# static unsigned int
+# pe_get16 (fd, offset)
+#      int fd;
+#      int offset;
+# {
+#   unsigned char b[2];
+#   lseek (fd, offset, SEEK_SET);
+#   read (fd, b, 2);
+#   return b[0] + (b[1]<<8);
+# }
+#
+# static unsigned int
+# pe_get32 (fd, offset)
+#     int fd;
+#     int offset;
+# {
+#   unsigned char b[4];
+#   lseek (fd, offset, SEEK_SET);
+#   read (fd, b, 4);
+#   return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24);
+# }
+#
+# static unsigned int
+# pe_as32 (ptr)
+#      void *ptr;
+# {
+#   unsigned char *b = ptr;
+#   return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24);
+# }
+#
+# int
+# main (argc, argv)
+#     int argc;
+#     char *argv[];
+# {
+#     int dll;
+#     unsigned long pe_header_offset, opthdr_ofs, num_entries, i;
+#     unsigned long export_rva, export_size, nsections, secptr, expptr;
+#     unsigned long name_rvas, nexp;
+#     unsigned char *expdata, *erva;
+#     char *filename, *dll_name;
+#
+#     filename = argv[1];
+#
+#     dll = open(filename, O_RDONLY|O_BINARY);
+#     if (dll < 1)
+# 	return 1;
+#
+#     dll_name = filename;
+#
+#     for (i=0; filename[i]; i++)
+# 	if (filename[i] == '/' || filename[i] == '\\'  || filename[i] == ':')
+# 	    dll_name = filename + i +1;
+#
+#     pe_header_offset = pe_get32 (dll, 0x3c);
+#     opthdr_ofs = pe_header_offset + 4 + 20;
+#     num_entries = pe_get32 (dll, opthdr_ofs + 92);
+#
+#     if (num_entries < 1) /* no exports */
+# 	return 1;
+#
+#     export_rva = pe_get32 (dll, opthdr_ofs + 96);
+#     export_size = pe_get32 (dll, opthdr_ofs + 100);
+#     nsections = pe_get16 (dll, pe_header_offset + 4 +2);
+#     secptr = (pe_header_offset + 4 + 20 +
+# 	      pe_get16 (dll, pe_header_offset + 4 + 16));
+#
+#     expptr = 0;
+#     for (i = 0; i < nsections; i++)
+#     {
+# 	char sname[8];
+# 	unsigned long secptr1 = secptr + 40 * i;
+# 	unsigned long vaddr = pe_get32 (dll, secptr1 + 12);
+# 	unsigned long vsize = pe_get32 (dll, secptr1 + 16);
+# 	unsigned long fptr = pe_get32 (dll, secptr1 + 20);
+# 	lseek(dll, secptr1, SEEK_SET);
+# 	read(dll, sname, 8);
+# 	if (vaddr <= export_rva && vaddr+vsize > export_rva)
+# 	{
+# 	    expptr = fptr + (export_rva - vaddr);
+# 	    if (export_rva + export_size > vaddr + vsize)
+# 		export_size = vsize - (export_rva - vaddr);
+# 	    break;
+# 	}
+#     }
+#
+#     expdata = (unsigned char*)malloc(export_size);
+#     lseek (dll, expptr, SEEK_SET);
+#     read (dll, expdata, export_size);
+#     erva = expdata - export_rva;
+#
+#     nexp = pe_as32 (expdata+24);
+#     name_rvas = pe_as32 (expdata+32);
+#
+#     printf ("EXPORTS\n");
+#     for (i = 0; i<nexp; i++)
+#     {
+# 	unsigned long name_rva = pe_as32 (erva+name_rvas+i*4);
+# 	printf ("\t%s @ %ld ;\n", erva+name_rva, 1+ i);
+#     }
+#
+#     return 0;
+# }
+# /* impgen.c ends here */
+
+EOF
+    ;;
+  esac
+
+  # We use sed instead of cat because bash on DJGPP gets confused if
+  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
+  # text mode, it properly converts lines to CR/LF.  This bash problem
+  # is reportedly fixed, but why not run on old versions too?
+  sed '$q' "$ltmain" >> "${ofile}T" || (rm -f "${ofile}T"; exit 1)
+
+  mv -f "${ofile}T" "$ofile" || \
+    (rm -f "$ofile" && cp "${ofile}T" "$ofile" && rm -f "${ofile}T")
+  chmod +x "$ofile"
+fi
+
+])# _LT_AC_LTCONFIG_HACK
+
 # AC_LIBTOOL_DLOPEN - enable checks for dlopen support
-AC_DEFUN(AC_LIBTOOL_DLOPEN, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])])
+AC_DEFUN([AC_LIBTOOL_DLOPEN], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])])
 
 # AC_LIBTOOL_WIN32_DLL - declare package support for building win32 dll's
-AC_DEFUN(AC_LIBTOOL_WIN32_DLL, [AC_BEFORE([$0], [AC_LIBTOOL_SETUP])])
+AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_BEFORE([$0], [AC_LIBTOOL_SETUP])])
 
 # AC_ENABLE_SHARED - implement the --enable-shared flag
 # Usage: AC_ENABLE_SHARED[(DEFAULT)]
 #   Where DEFAULT is either `yes' or `no'.  If omitted, it defaults to
 #   `yes'.
-AC_DEFUN(AC_ENABLE_SHARED, [dnl
-define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl
+AC_DEFUN([AC_ENABLE_SHARED],
+[define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl
 AC_ARG_ENABLE(shared,
 changequote(<<, >>)dnl
 <<  --enable-shared[=PKGS]  build shared libraries [default=>>AC_ENABLE_SHARED_DEFAULT],
 changequote([, ])dnl
 [p=${PACKAGE-default}
-case "$enableval" in
+case $enableval in
 yes) enable_shared=yes ;;
 no) enable_shared=no ;;
 *)
@@ -272,7 +3409,8 @@
 ])
 
 # AC_DISABLE_SHARED - set the default shared flag to --disable-shared
-AC_DEFUN(AC_DISABLE_SHARED, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+AC_DEFUN([AC_DISABLE_SHARED],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
 AC_ENABLE_SHARED(no)])
 
 # AC_ENABLE_STATIC - implement the --enable-static flag
@@ -279,14 +3417,14 @@
 # Usage: AC_ENABLE_STATIC[(DEFAULT)]
 #   Where DEFAULT is either `yes' or `no'.  If omitted, it defaults to
 #   `yes'.
-AC_DEFUN(AC_ENABLE_STATIC, [dnl
-define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl
+AC_DEFUN([AC_ENABLE_STATIC],
+[define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl
 AC_ARG_ENABLE(static,
 changequote(<<, >>)dnl
 <<  --enable-static[=PKGS]  build static libraries [default=>>AC_ENABLE_STATIC_DEFAULT],
 changequote([, ])dnl
 [p=${PACKAGE-default}
-case "$enableval" in
+case $enableval in
 yes) enable_static=yes ;;
 no) enable_static=no ;;
 *)
@@ -305,7 +3443,8 @@
 ])
 
 # AC_DISABLE_STATIC - set the default static flag to --disable-static
-AC_DEFUN(AC_DISABLE_STATIC, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+AC_DEFUN([AC_DISABLE_STATIC],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
 AC_ENABLE_STATIC(no)])
 
 
@@ -313,14 +3452,14 @@
 # Usage: AC_ENABLE_FAST_INSTALL[(DEFAULT)]
 #   Where DEFAULT is either `yes' or `no'.  If omitted, it defaults to
 #   `yes'.
-AC_DEFUN(AC_ENABLE_FAST_INSTALL, [dnl
-define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl
+AC_DEFUN([AC_ENABLE_FAST_INSTALL],
+[define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl
 AC_ARG_ENABLE(fast-install,
 changequote(<<, >>)dnl
 <<  --enable-fast-install[=PKGS]  optimize for fast installation [default=>>AC_ENABLE_FAST_INSTALL_DEFAULT],
 changequote([, ])dnl
 [p=${PACKAGE-default}
-case "$enableval" in
+case $enableval in
 yes) enable_fast_install=yes ;;
 no) enable_fast_install=no ;;
 *)
@@ -338,12 +3477,98 @@
 enable_fast_install=AC_ENABLE_FAST_INSTALL_DEFAULT)dnl
 ])
 
-# AC_ENABLE_FAST_INSTALL - set the default to --disable-fast-install
-AC_DEFUN(AC_DISABLE_FAST_INSTALL, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+# AC_DISABLE_FAST_INSTALL - set the default to --disable-fast-install
+AC_DEFUN([AC_DISABLE_FAST_INSTALL],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
 AC_ENABLE_FAST_INSTALL(no)])
 
+# AC_LIBTOOL_PICMODE - implement the --with-pic flag
+# Usage: AC_LIBTOOL_PICMODE[(MODE)]
+#   Where MODE is either `yes' or `no'.  If omitted, it defaults to
+#   `both'.
+AC_DEFUN([AC_LIBTOOL_PICMODE],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+pic_mode=ifelse($#,1,$1,default)])
+
+
+# AC_PATH_TOOL_PREFIX - find a file program which can recognise shared library
+AC_DEFUN([AC_PATH_TOOL_PREFIX],
+[AC_MSG_CHECKING([for $1])
+AC_CACHE_VAL(lt_cv_path_MAGIC_CMD,
+[case $MAGIC_CMD in
+  /*)
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  ;;
+  ?:/*)
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a dos path.
+  ;;
+  *)
+  ac_save_MAGIC_CMD="$MAGIC_CMD"
+  IFS="${IFS=   }"; ac_save_ifs="$IFS"; IFS=":"
+dnl $ac_dummy forces splitting on constant user-supplied paths.
+dnl POSIX.2 word splitting is done only on the output of word expansions,
+dnl not every word.  This closes a longstanding sh security hole.
+  ac_dummy="ifelse([$2], , $PATH, [$2])"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$1; then
+      lt_cv_path_MAGIC_CMD="$ac_dir/$1"
+      if test -n "$file_magic_test_file"; then
+	case $deplibs_check_method in
+	"file_magic "*)
+	  file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`"
+	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+	    egrep "$file_magic_regex" > /dev/null; then
+	    :
+	  else
+	    cat <<EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** [email protected]
+
+EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  MAGIC_CMD="$ac_save_MAGIC_CMD"
+  ;;
+esac])
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+  AC_MSG_RESULT($MAGIC_CMD)
+else
+  AC_MSG_RESULT(no)
+fi
+])
+
+
+# AC_PATH_MAGIC - find a file program which can recognise a shared library
+AC_DEFUN([AC_PATH_MAGIC],
+[AC_REQUIRE([AC_CHECK_TOOL_PREFIX])dnl
+AC_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin:$PATH)
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+  if test -n "$ac_tool_prefix"; then
+    AC_PATH_TOOL_PREFIX(file, /usr/bin:$PATH)
+  else
+    MAGIC_CMD=:
+  fi
+fi
+])
+
+
 # AC_PROG_LD - find the path to the GNU or non-GNU linker
-AC_DEFUN(AC_PROG_LD,
+AC_DEFUN([AC_PROG_LD],
 [AC_ARG_WITH(gnu-ld,
 [  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]],
 test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no)
@@ -350,17 +3575,22 @@
 AC_REQUIRE([AC_PROG_CC])dnl
 AC_REQUIRE([AC_CANONICAL_HOST])dnl
 AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+AC_REQUIRE([_LT_AC_LIBTOOL_SYS_PATH_SEPARATOR])dnl
 ac_prog=ld
-if test "$ac_cv_prog_gcc" = yes; then
+if test "$GCC" = yes; then
   # Check if gcc -print-prog-name=ld gives a path.
   AC_MSG_CHECKING([for ld used by GCC])
-  ac_prog=`($CC -print-prog-name=ld) 2>&5`
-  case "$ac_prog" in
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
     # Accept absolute paths.
-changequote(,)dnl
-    [\\/]* | [A-Za-z]:[\\/]*)
-      re_direlt='/[^/][^/]*/\.\./'
-changequote([,])dnl
+    [[\\/]]* | [[A-Za-z]]:[[\\/]]*)
+      re_direlt='/[[^/]][[^/]]*/\.\./'
       # Canonicalize the path of ld
       ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'`
       while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
@@ -382,17 +3612,17 @@
 else
   AC_MSG_CHECKING([for non-GNU ld])
 fi
-AC_CACHE_VAL(ac_cv_path_LD,
+AC_CACHE_VAL(lt_cv_path_LD,
 [if test -z "$LD"; then
-  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}"
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
   for ac_dir in $PATH; do
     test -z "$ac_dir" && ac_dir=.
     if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
-      ac_cv_path_LD="$ac_dir/$ac_prog"
+      lt_cv_path_LD="$ac_dir/$ac_prog"
       # Check to see if the program is GNU ld.  I'd rather use --version,
       # but apparently some GNU ld's only accept -v.
       # Break only if it was the GNU/non-GNU ld that we prefer.
-      if "$ac_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then
+      if "$lt_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then
 	test "$with_gnu_ld" != no && break
       else
 	test "$with_gnu_ld" != yes && break
@@ -401,9 +3631,9 @@
   done
   IFS="$ac_save_ifs"
 else
-  ac_cv_path_LD="$LD" # Let the user override the test with a path.
+  lt_cv_path_LD="$LD" # Let the user override the test with a path.
 fi])
-LD="$ac_cv_path_LD"
+LD="$lt_cv_path_LD"
 if test -n "$LD"; then
   AC_MSG_RESULT($LD)
 else
@@ -413,56 +3643,246 @@
 AC_PROG_LD_GNU
 ])
 
-AC_DEFUN(AC_PROG_LD_GNU,
-[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], ac_cv_prog_gnu_ld,
+# AC_PROG_LD_GNU -
+AC_DEFUN([AC_PROG_LD_GNU],
+[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld,
 [# I'd rather use --version here, but apparently some GNU ld's only accept -v.
 if $LD -v 2>&1 </dev/null | egrep '(GNU|with BFD)' 1>&5; then
-  ac_cv_prog_gnu_ld=yes
+  lt_cv_prog_gnu_ld=yes
 else
-  ac_cv_prog_gnu_ld=no
+  lt_cv_prog_gnu_ld=no
 fi])
+with_gnu_ld=$lt_cv_prog_gnu_ld
 ])
 
+# AC_PROG_LD_RELOAD_FLAG - find reload flag for linker
+#   -- PORTME Some linkers may need a different reload flag.
+AC_DEFUN([AC_PROG_LD_RELOAD_FLAG],
+[AC_CACHE_CHECK([for $LD option to reload object files], lt_cv_ld_reload_flag,
+[lt_cv_ld_reload_flag='-r'])
+reload_flag=$lt_cv_ld_reload_flag
+test -n "$reload_flag" && reload_flag=" $reload_flag"
+])
+
+# AC_DEPLIBS_CHECK_METHOD - how to check for library dependencies
+#  -- PORTME fill in with the dynamic library characteristics
+AC_DEFUN([AC_DEPLIBS_CHECK_METHOD],
+[AC_CACHE_CHECK([how to recognise dependant libraries],
+lt_cv_deplibs_check_method,
+[lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# `unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# which responds to the $file_magic_cmd with a given egrep regex.
+# If you have `file' or equivalent on your system and you're not sure
+# whether `pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix4* | aix5*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+beos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+bsdi4*)
+  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)'
+  lt_cv_file_magic_cmd='/usr/bin/file -L'
+  lt_cv_file_magic_test_file=/shlib/libc.so
+  ;;
+
+cygwin* | mingw* | pw32*)
+  lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
+  lt_cv_file_magic_cmd='$OBJDUMP -f'
+  ;;
+
+darwin* | rhapsody*)
+  lt_cv_deplibs_check_method='file_magic Mach-O dynamically linked shared library'
+  lt_cv_file_magic_cmd='/usr/bin/file -L'
+  case "$host_os" in
+  rhapsody* | darwin1.[[012]])
+    lt_cv_file_magic_test_file=`echo /System/Library/Frameworks/System.framework/Versions/*/System | head -1`
+    ;;
+  *) # Darwin 1.3 on
+    lt_cv_file_magic_test_file='/usr/lib/libSystem.dylib'
+    ;;
+  esac
+  ;;
+
+freebsd*)
+  if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+    case $host_cpu in
+    i*86 )
+      # Not sure whether the presence of OpenBSD here was a mistake.
+      # Let's accept both of them until this is cleared up.
+      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD)/i[[3-9]]86 (compact )?demand paged shared library'
+      lt_cv_file_magic_cmd=/usr/bin/file
+      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+      ;;
+    esac
+  else
+    lt_cv_deplibs_check_method=pass_all
+  fi
+  ;;
+
+gnu*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+hpux10.20*|hpux11*)
+  lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library'
+  lt_cv_file_magic_cmd=/usr/bin/file
+  lt_cv_file_magic_test_file=/usr/lib/libc.sl
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+  irix5* | nonstopux*)
+    # this will be overridden with pass_all, but let us keep it just in case
+    lt_cv_deplibs_check_method="file_magic ELF 32-bit MSB dynamic lib MIPS - version 1"
+    ;;
+  *)
+    case $LD in
+    *-32|*"-32 ") libmagic=32-bit;;
+    *-n32|*"-n32 ") libmagic=N32;;
+    *-64|*"-64 ") libmagic=64-bit;;
+    *) libmagic=never-match;;
+    esac
+    # this will be overridden with pass_all, but let us keep it just in case
+    lt_cv_deplibs_check_method="file_magic ELF ${libmagic} MSB mips-[[1234]] dynamic lib MIPS - version 1"
+    ;;
+  esac
+  lt_cv_file_magic_test_file=`echo /lib${libsuff}/libc.so*`
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+# This must be Linux ELF.
+linux-gnu*)
+  lt_cv_deplibs_check_method=pass_all
+  lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so`
+  ;;
+
+netbsd*)
+  if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/\.]]+\.so\.[[0-9]]+\.[[0-9]]+$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/\.]]+\.so$'
+  fi
+  ;;
+
+newos6*)
+  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)'
+  lt_cv_file_magic_cmd=/usr/bin/file
+  lt_cv_file_magic_test_file=/usr/lib/libnls.so
+  ;;
+
+openbsd*)
+  lt_cv_file_magic_cmd=/usr/bin/file
+  lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB shared object'
+  else
+    lt_cv_deplibs_check_method='file_magic OpenBSD.* shared library'
+  fi
+  ;;
+
+osf3* | osf4* | osf5*)
+  # this will be overridden with pass_all, but let us keep it just in case
+  lt_cv_deplibs_check_method='file_magic COFF format alpha shared library'
+  lt_cv_file_magic_test_file=/shlib/libc.so
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sco3.2v5*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+solaris*)
+  lt_cv_deplibs_check_method=pass_all
+  lt_cv_file_magic_test_file=/lib/libc.so
+  ;;
+
+sysv5uw[[78]]* | sysv4*uw2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+  case $host_vendor in
+  motorola)
+    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]'
+    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+    ;;
+  ncr)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  sequent)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )'
+    ;;
+  sni)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib"
+    lt_cv_file_magic_test_file=/lib/libc.so
+    ;;
+  esac
+  ;;
+esac
+])
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+])
+
+
 # AC_PROG_NM - find the path to a BSD-compatible name lister
-AC_DEFUN(AC_PROG_NM,
-[AC_MSG_CHECKING([for BSD-compatible nm])
-AC_CACHE_VAL(ac_cv_path_NM,
+AC_DEFUN([AC_PROG_NM],
+[AC_REQUIRE([_LT_AC_LIBTOOL_SYS_PATH_SEPARATOR])dnl
+AC_MSG_CHECKING([for BSD-compatible nm])
+AC_CACHE_VAL(lt_cv_path_NM,
 [if test -n "$NM"; then
   # Let the user override the test.
-  ac_cv_path_NM="$NM"
+  lt_cv_path_NM="$NM"
 else
-  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}"
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
   for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do
     test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/nm || test -f $ac_dir/nm$ac_exeext ; then
+    tmp_nm=$ac_dir/${ac_tool_prefix}nm
+    if test -f $tmp_nm || test -f $tmp_nm$ac_exeext ; then
       # Check to see if the nm accepts a BSD-compat flag.
       # Adding the `sed 1q' prevents false positives on HP-UX, which says:
       #   nm: unknown option "B" ignored
-      if ($ac_dir/nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then
-	ac_cv_path_NM="$ac_dir/nm -B"
+      # Tru64's nm complains that /dev/null is an invalid object file
+      if ($tmp_nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep '(/dev/null|Invalid file or object type)' >/dev/null; then
+	lt_cv_path_NM="$tmp_nm -B"
 	break
-      elif ($ac_dir/nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then
-	ac_cv_path_NM="$ac_dir/nm -p"
+      elif ($tmp_nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then
+	lt_cv_path_NM="$tmp_nm -p"
 	break
       else
-	ac_cv_path_NM=${ac_cv_path_NM="$ac_dir/nm"} # keep the first match, but
+	lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
 	continue # so that we can try to find one that supports BSD flags
       fi
     fi
   done
   IFS="$ac_save_ifs"
-  test -z "$ac_cv_path_NM" && ac_cv_path_NM=nm
+  test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm
 fi])
-NM="$ac_cv_path_NM"
+NM="$lt_cv_path_NM"
 AC_MSG_RESULT([$NM])
 ])
 
 # AC_CHECK_LIBM - check for math library
-AC_DEFUN(AC_CHECK_LIBM,
+AC_DEFUN([AC_CHECK_LIBM],
 [AC_REQUIRE([AC_CANONICAL_HOST])dnl
 LIBM=
-case "$lt_target" in
-*-*-beos* | *-*-cygwin*)
+case $host in
+*-*-beos* | *-*-cygwin* | *-*-pw32*)
   # These system don't have libm
   ;;
 *-ncr-sysv4.3*)
@@ -476,37 +3896,41 @@
 ])
 
 # AC_LIBLTDL_CONVENIENCE[(dir)] - sets LIBLTDL to the link flags for
-# the libltdl convenience library and INCLTDL to the include flags for
+# the libltdl convenience library and LTDLINCL to the include flags for
 # the libltdl header and adds --enable-ltdl-convenience to the
-# configure arguments.  Note that LIBLTDL and INCLTDL are not
+# configure arguments.  Note that LIBLTDL and LTDLINCL are not
 # AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called.  If DIR is not
 # provided, it is assumed to be `libltdl'.  LIBLTDL will be prefixed
-# with '${top_builddir}/' and INCLTDL will be prefixed with
+# with '${top_builddir}/' and LTDLINCL will be prefixed with
 # '${top_srcdir}/' (note the single quotes!).  If your package is not
 # flat and you're not using automake, define top_builddir and
 # top_srcdir appropriately in the Makefiles.
-AC_DEFUN(AC_LIBLTDL_CONVENIENCE, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
-  case "$enable_ltdl_convenience" in
+AC_DEFUN([AC_LIBLTDL_CONVENIENCE],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+  case $enable_ltdl_convenience in
   no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;;
   "") enable_ltdl_convenience=yes
       ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;;
   esac
   LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdlc.la
-  INCLTDL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl'])
+  LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl'])
+  # For backwards non-gettext consistent compatibility...
+  INCLTDL="$LTDLINCL"
 ])
 
 # AC_LIBLTDL_INSTALLABLE[(dir)] - sets LIBLTDL to the link flags for
-# the libltdl installable library and INCLTDL to the include flags for
+# the libltdl installable library and LTDLINCL to the include flags for
 # the libltdl header and adds --enable-ltdl-install to the configure
-# arguments.  Note that LIBLTDL and INCLTDL are not AC_SUBSTed, nor is
+# arguments.  Note that LIBLTDL and LTDLINCL are not AC_SUBSTed, nor is
 # AC_CONFIG_SUBDIRS called.  If DIR is not provided and an installed
 # libltdl is not found, it is assumed to be `libltdl'.  LIBLTDL will
-# be prefixed with '${top_builddir}/' and INCLTDL will be prefixed
+# be prefixed with '${top_builddir}/' and LTDLINCL will be prefixed
 # with '${top_srcdir}/' (note the single quotes!).  If your package is
 # not flat and you're not using automake, define top_builddir and
 # top_srcdir appropriately in the Makefiles.
 # In the future, this macro may have to be called after AC_PROG_LIBTOOL.
-AC_DEFUN(AC_LIBLTDL_INSTALLABLE, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+AC_DEFUN([AC_LIBLTDL_INSTALLABLE],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
   AC_CHECK_LIB(ltdl, main,
   [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no],
   [if test x"$enable_ltdl_install" = xno; then
@@ -518,23 +3942,25 @@
   if test x"$enable_ltdl_install" = x"yes"; then
     ac_configure_args="$ac_configure_args --enable-ltdl-install"
     LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdl.la
-    INCLTDL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl'])
+    LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl'])
   else
     ac_configure_args="$ac_configure_args --enable-ltdl-install=no"
     LIBLTDL="-lltdl"
-    INCLTDL=
+    LTDLINCL=
   fi
+  # For backwards non-gettext consistent compatibility...
+  INCLTDL="$LTDLINCL"
 ])
 
-dnl old names
-AC_DEFUN(AM_PROG_LIBTOOL, [indir([AC_PROG_LIBTOOL])])dnl
-AC_DEFUN(AM_ENABLE_SHARED, [indir([AC_ENABLE_SHARED], $@)])dnl
-AC_DEFUN(AM_ENABLE_STATIC, [indir([AC_ENABLE_STATIC], $@)])dnl
-AC_DEFUN(AM_DISABLE_SHARED, [indir([AC_DISABLE_SHARED], $@)])dnl
-AC_DEFUN(AM_DISABLE_STATIC, [indir([AC_DISABLE_STATIC], $@)])dnl
-AC_DEFUN(AM_PROG_LD, [indir([AC_PROG_LD])])dnl
-AC_DEFUN(AM_PROG_NM, [indir([AC_PROG_NM])])dnl
+# old names
+AC_DEFUN([AM_PROG_LIBTOOL],   [AC_PROG_LIBTOOL])
+AC_DEFUN([AM_ENABLE_SHARED],  [AC_ENABLE_SHARED($@)])
+AC_DEFUN([AM_ENABLE_STATIC],  [AC_ENABLE_STATIC($@)])
+AC_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])
+AC_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])
+AC_DEFUN([AM_PROG_LD],        [AC_PROG_LD])
+AC_DEFUN([AM_PROG_NM],        [AC_PROG_NM])
 
-dnl This is just to silence aclocal about the macro not being used
-ifelse([AC_DISABLE_FAST_INSTALL])dnl
+# This is just to silence aclocal about the macro not being used
+ifelse([AC_DISABLE_FAST_INSTALL])
 
--- a/common/libsndfile/check_libsndfile.py
+++ b/common/libsndfile/check_libsndfile.py
@@ -6,7 +6,7 @@
 # The list is provided as a text file. 
 # 
 
-_EXE_NAME = 'examples/sndfile_info'
+_EXE_NAME = 'examples/sndfile-info'
 
 
 def dump_status_output_exit (status, output, msg = None): 
@@ -56,8 +56,8 @@
 	if line [0] == '#':
 		continue 
 	print line
-	if os.path.isfile (line): 
-		sfinfo_check_ok (line) 
+	if os.path.isfile ('/home/erikd/' + line): 
+		sfinfo_check_ok ('/home/erikd/' + line) 
 	else: 
 		print "Bad file name : ", line 
 		sys.exit (0) 
--- a/common/libsndfile/config.guess
+++ b/common/libsndfile/config.guess
@@ -1,8 +1,10 @@
 #! /bin/sh
 # Attempt to guess a canonical system name.
-#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
 #   Free Software Foundation, Inc.
-#
+
+timestamp='2001-09-04'
+
 # This file is free software; you can redistribute it and/or modify it
 # under the terms of the GNU General Public License as published by
 # the Free Software Foundation; either version 2 of the License, or
@@ -30,28 +32,88 @@
 # exits with 0.  Otherwise, it exits with 1.
 #
 # The plan is that this can be called by configure scripts if you
-# don't specify an explicit system type (host/target name).
-#
-# Only a few systems have been added to this list; please add others
-# (but try to keep the structure clean).
-#
+# don't specify an explicit build system type.
 
-# Use $HOST_CC if defined. $CC may point to a cross-compiler
-if test x"$CC_FOR_BUILD" = x; then
-  if test x"$HOST_CC" != x; then
-    CC_FOR_BUILD="$HOST_CC"
-  else
-    if test x"$CC" != x; then
-      CC_FOR_BUILD="$CC"
-    else
-      CC_FOR_BUILD=cc
-    fi
-  fi
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <[email protected]>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit 0 ;;
+    --version | -v )
+       echo "$version" ; exit 0 ;;
+    --help | --h* | -h )
+       echo "$usage"; exit 0 ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help" >&2
+       exit 1 ;;
+    * )
+       break ;;
+  esac
+done
+
+if test $# != 0; then
+  echo "$me: too many arguments$help" >&2
+  exit 1
 fi
 
 
+dummy=dummy-$$
+trap 'rm -f $dummy.c $dummy.o $dummy.rel $dummy; exit 1' 1 2 15
+
+# CC_FOR_BUILD -- compiler used by this script.
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+set_cc_for_build='case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,)    echo "int dummy(){}" > $dummy.c ;
+	for c in cc gcc c89 ; do
+	  ($c $dummy.c -c -o $dummy.o) >/dev/null 2>&1 ;
+	  if test $? = 0 ; then
+	     CC_FOR_BUILD="$c"; break ;
+	  fi ;
+	done ;
+	rm -f $dummy.c $dummy.o $dummy.rel ;
+	if test x"$CC_FOR_BUILD" = x ; then
+	  CC_FOR_BUILD=no_compiler_found ;
+	fi
+	;;
+ ,,*)   CC_FOR_BUILD=$CC ;;
+ ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
+esac'
+
 # This is needed to find uname on a Pyramid OSx when run in the BSD universe.
-# ([email protected] 8/24/94.)
+# ([email protected] 1994-08-24)
 if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
 	PATH=$PATH:/.attbin ; export PATH
 fi
@@ -58,12 +120,9 @@
 
 UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
 UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
-UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
 UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
 
-dummy=dummy-$$
-trap 'rm -f $dummy.c $dummy.o $dummy; exit 1' 1 2 15
-
 # Note: order is significant - the case branches are not exclusive.
 
 case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
@@ -77,7 +136,7 @@
 	# object file format.
 	# Determine the machine/vendor (is the vendor relevant).
 	case "${UNAME_MACHINE}" in
-	    amiga) machine=m68k-cbm ;;
+	    amiga) machine=m68k-unknown ;;
 	    arm32) machine=arm-unknown ;;
 	    atari*) machine=m68k-atari ;;
 	    sun3*) machine=m68k-sun ;;
@@ -87,16 +146,25 @@
 	    ibmrt|romp-ibm) machine=romp-ibm ;;
 	    *) machine=${UNAME_MACHINE}-unknown ;;
 	esac
-	# The Operating System including object format.
-	if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
-		| grep __ELF__ >/dev/null
-	then
-	    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
-	    # Return netbsd for either.  FIX?
-	    os=netbsd
-	else
-	    os=netbsdelf
-	fi
+	# The Operating System including object format, if it has switched
+	# to ELF recently, or will in the future.
+	case "${UNAME_MACHINE}" in
+	    i386|sparc|amiga|arm*|hp300|mvme68k|vax|atari|luna68k|mac68k|news68k|next68k|pc532|sun3*|x68k)
+		eval $set_cc_for_build
+		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+			| grep __ELF__ >/dev/null
+		then
+		    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+		    # Return netbsd for either.  FIX?
+		    os=netbsd
+		else
+		    os=netbsdelf
+		fi
+		;;
+	    *)
+	        os=netbsd
+		;;
+	esac
 	# The OS release
 	release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
 	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
@@ -137,6 +205,7 @@
 	jsr \$26,exit
 	.end main
 EOF
+	eval $set_cc_for_build
 	$CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null
 	if test "$?" = 0 ; then
 		case `./$dummy` in
@@ -158,6 +227,9 @@
 			2-307)
 				UNAME_MACHINE="alphaev67"
 				;;
+			2-1307)
+				UNAME_MACHINE="alphaev68"
+				;;
 		esac
 	fi
 	rm -f $dummy.s $dummy
@@ -173,7 +245,7 @@
 	echo alpha-dec-winnt3.5
 	exit 0 ;;
     Amiga*:UNIX_System_V:4.0:*)
-	echo m68k-cbm-sysv4
+	echo m68k-unknown-sysv4
 	exit 0;;
     amiga:OpenBSD:*:*)
 	echo m68k-unknown-openbsd${UNAME_RELEASE}
@@ -205,7 +277,7 @@
     arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
 	echo arm-acorn-riscix${UNAME_RELEASE}
 	exit 0;;
-    SR2?01:HI-UX/MPP:*:*)
+    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
 	echo hppa1.1-hitachi-hiuxmpp
 	exit 0;;
     Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
@@ -261,6 +333,9 @@
     aushp:SunOS:*:*)
 	echo sparc-auspex-sunos${UNAME_RELEASE}
 	exit 0 ;;
+    sparc*:NetBSD:*)
+	echo `uname -p`-unknown-netbsd${UNAME_RELEASE}
+	exit 0 ;;
     atari*:OpenBSD:*:*)
 	echo m68k-unknown-openbsd${UNAME_RELEASE}
 	exit 0 ;;
@@ -318,6 +393,7 @@
 	echo clipper-intergraph-clix${UNAME_RELEASE}
 	exit 0 ;;
     mips:*:*:UMIPS | mips:*:*:RISCos)
+	eval $set_cc_for_build
 	sed 's/^	//' << EOF >$dummy.c
 #ifdef __cplusplus
 #include <stdio.h>  /* for printf() prototype */
@@ -341,10 +417,13 @@
 EOF
 	$CC_FOR_BUILD $dummy.c -o $dummy \
 	  && ./$dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \
-	  && rm $dummy.c $dummy && exit 0
+	  && rm -f $dummy.c $dummy && exit 0
 	rm -f $dummy.c $dummy
 	echo mips-mips-riscos${UNAME_RELEASE}
 	exit 0 ;;
+    Motorola:PowerMAX_OS:*:*)
+	echo powerpc-motorola-powermax
+	exit 0 ;;
     Night_Hawk:Power_UNIX:*:*)
 	echo powerpc-harris-powerunix
 	exit 0 ;;
@@ -392,11 +471,20 @@
     ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
 	echo romp-ibm-aix      # uname -m gives an 8 hex-code CPU id
 	exit 0 ;;              # Note that: echo "'`uname -s`'" gives 'AIX '
-    i?86:AIX:*:*)
+    i*86:AIX:*:*)
 	echo i386-ibm-aix
 	exit 0 ;;
+    ia64:AIX:*:*)
+	if [ -x /usr/bin/oslevel ] ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+	fi
+	echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
+	exit 0 ;;
     *:AIX:2:3)
 	if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+		eval $set_cc_for_build
 		sed 's/^		//' << EOF >$dummy.c
 		#include <sys/systemcfg.h>
 
@@ -408,7 +496,7 @@
 			exit(0);
 			}
 EOF
-		$CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm $dummy.c $dummy && exit 0
+		$CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0
 		rm -f $dummy.c $dummy
 		echo rs6000-ibm-aix3.2.5
 	elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
@@ -417,9 +505,9 @@
 		echo rs6000-ibm-aix3.2
 	fi
 	exit 0 ;;
-    *:AIX:*:4)
+    *:AIX:*:[45])
 	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | head -1 | awk '{ print $1 }'`
-	if /usr/sbin/lsattr -EHl ${IBM_CPU_ID} | grep POWER >/dev/null 2>&1; then
+	if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
 		IBM_ARCH=rs6000
 	else
 		IBM_ARCH=powerpc
@@ -427,7 +515,7 @@
 	if [ -x /usr/bin/oslevel ] ; then
 		IBM_REV=`/usr/bin/oslevel`
 	else
-		IBM_REV=4.${UNAME_RELEASE}
+		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
 	fi
 	echo ${IBM_ARCH}-ibm-aix${IBM_REV}
 	exit 0 ;;
@@ -453,10 +541,29 @@
 	echo m68k-hp-bsd4.4
 	exit 0 ;;
     9000/[34678]??:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
 	case "${UNAME_MACHINE}" in
 	    9000/31? )            HP_ARCH=m68000 ;;
 	    9000/[34]?? )         HP_ARCH=m68k ;;
 	    9000/[678][0-9][0-9])
+              case "${HPUX_REV}" in
+                11.[0-9][0-9])
+                  if [ -x /usr/bin/getconf ]; then
+                    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+                    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+                    case "${sc_cpu_version}" in
+                      523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+                      528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+                      532)                      # CPU_PA_RISC2_0
+                        case "${sc_kernel_bits}" in
+                          32) HP_ARCH="hppa2.0n" ;;
+                          64) HP_ARCH="hppa2.0w" ;;
+                        esac ;;
+                    esac
+                  fi ;;
+              esac
+              if [ "${HP_ARCH}" = "" ]; then
+	      eval $set_cc_for_build
               sed 's/^              //' << EOF >$dummy.c
 
               #define _HPUX_SOURCE
@@ -490,13 +597,19 @@
                   exit (0);
               }
 EOF
-	(CCOPTS= $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null ) && HP_ARCH=`./$dummy`
-	rm -f $dummy.c $dummy
+	    (CCOPTS= $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null ) && HP_ARCH=`./$dummy`
+	    if test -z "$HP_ARCH"; then HP_ARCH=hppa; fi
+	    rm -f $dummy.c $dummy
+	fi ;;
 	esac
-	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
 	echo ${HP_ARCH}-hp-hpux${HPUX_REV}
 	exit 0 ;;
+    ia64:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	echo ia64-hp-hpux${HPUX_REV}
+	exit 0 ;;
     3050*:HI-UX:*:*)
+	eval $set_cc_for_build
 	sed 's/^	//' << EOF >$dummy.c
 	#include <unistd.h>
 	int
@@ -522,7 +635,7 @@
 	  exit (0);
 	}
 EOF
-	$CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm $dummy.c $dummy && exit 0
+	$CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0
 	rm -f $dummy.c $dummy
 	echo unknown-hitachi-hiuxwe2
 	exit 0 ;;
@@ -532,7 +645,7 @@
     9000/8??:4.3bsd:*:*)
 	echo hppa1.0-hp-bsd
 	exit 0 ;;
-    *9??*:MPE/iX:*:*)
+    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
 	echo hppa1.0-hp-mpeix
 	exit 0 ;;
     hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
@@ -541,7 +654,7 @@
     hp8??:OSF1:*:*)
 	echo hppa1.0-hp-osf
 	exit 0 ;;
-    i?86:OSF1:*:*)
+    i*86:OSF1:*:*)
 	if [ -x /usr/sbin/sysversion ] ; then
 	    echo ${UNAME_MACHINE}-unknown-osf1mk
 	else
@@ -576,19 +689,23 @@
 	echo xmp-cray-unicos
         exit 0 ;;
     CRAY*Y-MP:*:*:*)
-	echo ymp-cray-unicos${UNAME_RELEASE}
+	echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
 	exit 0 ;;
     CRAY*[A-Z]90:*:*:*)
 	echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
 	| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
-	      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
+	      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+	      -e 's/\.[^.]*$/.X/'
 	exit 0 ;;
     CRAY*TS:*:*:*)
 	echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
 	exit 0 ;;
-    CRAY*T3E:*:*:*)
+    CRAY*T3D:*:*:*)
 	echo alpha-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
 	exit 0 ;;
+    CRAY*T3E:*:*:*)
+	echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit 0 ;;
     CRAY*SV1:*:*:*)
 	echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
 	exit 0 ;;
@@ -595,18 +712,16 @@
     CRAY-2:*:*:*)
 	echo cray2-cray-unicos
         exit 0 ;;
-    F300:UNIX_System_V:*:*)
+    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+	FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
         FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
         FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
-        echo "f300-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+        echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
         exit 0 ;;
-    F301:UNIX_System_V:*:*)
-       echo f301-fujitsu-uxpv`echo $UNAME_RELEASE | sed 's/ .*//'`
-       exit 0 ;;
     hp300:OpenBSD:*:*)
 	echo m68k-unknown-openbsd${UNAME_RELEASE}
 	exit 0 ;;
-    i?86:BSD/386:*:* | i?86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
 	echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
 	exit 0 ;;
     sparc*:BSD/OS:*:*)
@@ -627,6 +742,9 @@
     i*:MINGW*:*)
 	echo ${UNAME_MACHINE}-pc-mingw32
 	exit 0 ;;
+    i*:PW*:*)
+	echo ${UNAME_MACHINE}-pc-pw32
+	exit 0 ;;
     i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
 	# How do we know it's Interix rather than the generic POSIX subsystem?
 	# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
@@ -645,187 +763,96 @@
     *:GNU:*:*)
 	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
 	exit 0 ;;
-    *:Linux:*:*)
-
+    i*86:Minix:*:*)
+	echo ${UNAME_MACHINE}-pc-minix
+	exit 0 ;;
+    arm*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit 0 ;;
+    ia64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux
+	exit 0 ;;
+    m68*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit 0 ;;
+    mips:Linux:*:*)
+	case `sed -n '/^byte/s/^.*: \(.*\) endian/\1/p' < /proc/cpuinfo` in
+	  big)    echo mips-unknown-linux-gnu && exit 0 ;;
+	  little) echo mipsel-unknown-linux-gnu && exit 0 ;;
+	esac
+	;;
+    ppc:Linux:*:*)
+	echo powerpc-unknown-linux-gnu
+	exit 0 ;;
+    ppc64:Linux:*:*)
+	echo powerpc64-unknown-linux-gnu
+	exit 0 ;;
+    alpha:Linux:*:*)
+	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+	  EV5)   UNAME_MACHINE=alphaev5 ;;
+	  EV56)  UNAME_MACHINE=alphaev56 ;;
+	  PCA56) UNAME_MACHINE=alphapca56 ;;
+	  PCA57) UNAME_MACHINE=alphapca56 ;;
+	  EV6)   UNAME_MACHINE=alphaev6 ;;
+	  EV67)  UNAME_MACHINE=alphaev67 ;;
+	  EV68*) UNAME_MACHINE=alphaev68 ;;
+        esac
+	objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
+	if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
+	echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
+	exit 0 ;;
+    parisc:Linux:*:* | hppa:Linux:*:*)
+	# Look for CPU level
+	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+	  PA7*) echo hppa1.1-unknown-linux-gnu ;;
+	  PA8*) echo hppa2.0-unknown-linux-gnu ;;
+	  *)    echo hppa-unknown-linux-gnu ;;
+	esac
+	exit 0 ;;
+    parisc64:Linux:*:* | hppa64:Linux:*:*)
+	echo hppa64-unknown-linux-gnu
+	exit 0 ;;
+    s390:Linux:*:* | s390x:Linux:*:*)
+	echo ${UNAME_MACHINE}-ibm-linux
+	exit 0 ;;
+    sh*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit 0 ;;
+    sparc:Linux:*:* | sparc64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit 0 ;;
+    x86_64:Linux:*:*)
+	echo x86_64-unknown-linux-gnu
+	exit 0 ;;
+    i*86:Linux:*:*)
 	# The BFD linker knows what the default object file format is, so
 	# first see if it will tell us. cd to the root directory to prevent
 	# problems with other programs or directories called `ld' in the path.
-	ld_help_string=`cd /; ld --help 2>&1`
-	ld_supported_emulations=`echo $ld_help_string \
-			 | sed -ne '/supported emulations:/!d
+	ld_supported_targets=`cd /; ld --help 2>&1 \
+			 | sed -ne '/supported targets:/!d
 				    s/[ 	][ 	]*/ /g
-				    s/.*supported emulations: *//
+				    s/.*supported targets: *//
 				    s/ .*//
 				    p'`
-        case "$ld_supported_emulations" in
-	  *ia64)
-		echo "${UNAME_MACHINE}-unknown-linux"
-		exit 0
+        case "$ld_supported_targets" in
+	  elf32-i386)
+		TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
 		;;
-	  i?86linux)
+	  a.out-i386-linux)
 		echo "${UNAME_MACHINE}-pc-linux-gnuaout"
-		exit 0
-		;;
-	  elf_i?86)
-		echo "${UNAME_MACHINE}-pc-linux"
-		exit 0
-		;;
-	  i?86coff)
+		exit 0 ;;		
+	  coff-i386)
 		echo "${UNAME_MACHINE}-pc-linux-gnucoff"
-		exit 0
-		;;
-	  sparclinux)
-		echo "${UNAME_MACHINE}-unknown-linux-gnuaout"
-		exit 0
-		;;
-	  armlinux)
-		echo "${UNAME_MACHINE}-unknown-linux-gnuaout"
-		exit 0
-		;;
-	  elf32arm*)
-		echo "${UNAME_MACHINE}-unknown-linux-gnuoldld"
-		exit 0
-		;;
-	  armelf_linux*)
-		echo "${UNAME_MACHINE}-unknown-linux-gnu"
-		exit 0
-		;;
-	  m68klinux)
-		echo "${UNAME_MACHINE}-unknown-linux-gnuaout"
-		exit 0
-		;;
-	  elf32ppc | elf32ppclinux)
-		# Determine Lib Version
-		cat >$dummy.c <<EOF
-#include <features.h>
-#if defined(__GLIBC__)
-extern char __libc_version[];
-extern char __libc_release[];
-#endif
-main(argc, argv)
-     int argc;
-     char *argv[];
-{
-#if defined(__GLIBC__)
-  printf("%s %s\n", __libc_version, __libc_release);
-#else
-  printf("unkown\n");
-#endif
-  return 0;
-}
-EOF
-		LIBC=""
-		$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null
-		if test "$?" = 0 ; then
-			./$dummy | grep 1\.99 > /dev/null
-			if test "$?" = 0 ; then
-				LIBC="libc1"
-			fi
-		fi
-		rm -f $dummy.c $dummy
-		echo powerpc-unknown-linux-gnu${LIBC}
-		exit 0
-		;;
+		exit 0 ;;
+	  "")
+		# Either a pre-BFD a.out linker (linux-gnuoldld) or
+		# one that does not give us useful --help.
+		echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
+		exit 0 ;;
 	esac
-
-	if test "${UNAME_MACHINE}" = "alpha" ; then
-		cat <<EOF >$dummy.s
-			.data
-		\$Lformat:
-			.byte 37,100,45,37,120,10,0	# "%d-%x\n"
-
-			.text
-			.globl main
-			.align 4
-			.ent main
-		main:
-			.frame \$30,16,\$26,0
-			ldgp \$29,0(\$27)
-			.prologue 1
-			.long 0x47e03d80 # implver \$0
-			lda \$2,-1
-			.long 0x47e20c21 # amask \$2,\$1
-			lda \$16,\$Lformat
-			mov \$0,\$17
-			not \$1,\$18
-			jsr \$26,printf
-			ldgp \$29,0(\$26)
-			mov 0,\$16
-			jsr \$26,exit
-			.end main
-EOF
-		LIBC=""
-		$CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null
-		if test "$?" = 0 ; then
-			case `./$dummy` in
-			0-0)
-				UNAME_MACHINE="alpha"
-				;;
-			1-0)
-				UNAME_MACHINE="alphaev5"
-				;;
-			1-1)
-				UNAME_MACHINE="alphaev56"
-				;;
-			1-101)
-				UNAME_MACHINE="alphapca56"
-				;;
-			2-303)
-				UNAME_MACHINE="alphaev6"
-				;;
-			2-307)
-				UNAME_MACHINE="alphaev67"
-				;;
-			esac
-
-			objdump --private-headers $dummy | \
-			  grep ld.so.1 > /dev/null
-			if test "$?" = 0 ; then
-				LIBC="libc1"
-			fi
-		fi
-		rm -f $dummy.s $dummy
-		echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} ; exit 0
-	elif test "${UNAME_MACHINE}" = "mips" ; then
-	  cat >$dummy.c <<EOF
-#ifdef __cplusplus
-#include <stdio.h>  /* for printf() prototype */
-	int main (int argc, char *argv[]) {
-#else
-	int main (argc, argv) int argc; char *argv[]; {
-#endif
-#ifdef __MIPSEB__
-  printf ("%s-unknown-linux-gnu\n", argv[1]);
-#endif
-#ifdef __MIPSEL__
-  printf ("%sel-unknown-linux-gnu\n", argv[1]);
-#endif
-  return 0;
-}
-EOF
-	  $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm $dummy.c $dummy && exit 0
-	  rm -f $dummy.c $dummy
-	elif test "${UNAME_MACHINE}" = "s390"; then
-	  echo s390-ibm-linux && exit 0
-	else
-	  # Either a pre-BFD a.out linker (linux-gnuoldld)
-	  # or one that does not give us useful --help.
-	  # GCC wants to distinguish between linux-gnuoldld and linux-gnuaout.
-	  # If ld does not provide *any* "supported emulations:"
-	  # that means it is gnuoldld.
-	  echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations:"
-	  test $? != 0 && echo "${UNAME_MACHINE}-pc-linux-gnuoldld" && exit 0
-
-	  case "${UNAME_MACHINE}" in
-	  i?86)
-	    VENDOR=pc;
-	    ;;
-	  *)
-	    VENDOR=unknown;
-	    ;;
-	  esac
-	  # Determine whether the default compiler is a.out or elf
-	  cat >$dummy.c <<EOF
+	# Determine whether the default compiler is a.out or elf
+	eval $set_cc_for_build
+	cat >$dummy.c <<EOF
 #include <features.h>
 #ifdef __cplusplus
 #include <stdio.h>  /* for printf() prototype */
@@ -836,28 +863,30 @@
 #ifdef __ELF__
 # ifdef __GLIBC__
 #  if __GLIBC__ >= 2
-    printf ("%s-${VENDOR}-linux-gnu\n", argv[1]);
+    printf ("%s-pc-linux-gnu\n", argv[1]);
 #  else
-    printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]);
+    printf ("%s-pc-linux-gnulibc1\n", argv[1]);
 #  endif
 # else
-   printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]);
+   printf ("%s-pc-linux-gnulibc1\n", argv[1]);
 # endif
 #else
-  printf ("%s-${VENDOR}-linux-gnuaout\n", argv[1]);
+  printf ("%s-pc-linux-gnuaout\n", argv[1]);
 #endif
   return 0;
 }
 EOF
-	  $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm $dummy.c $dummy && exit 0
-	  rm -f $dummy.c $dummy
-	fi ;;
-# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.  earlier versions
-# are messed up and put the nodename in both sysname and nodename.
-    i?86:DYNIX/ptx:4*:*)
+	$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm -f $dummy.c $dummy && exit 0
+	rm -f $dummy.c $dummy
+	test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0
+	;;
+    i*86:DYNIX/ptx:4*:*)
+	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+	# earlier versions are messed up and put the nodename in both
+	# sysname and nodename.
 	echo i386-sequent-sysv4
 	exit 0 ;;
-    i?86:UNIX_SV:4.2MP:2.*)
+    i*86:UNIX_SV:4.2MP:2.*)
         # Unixware is an offshoot of SVR4, but it has its own version
         # number series starting with 2...
         # I am not positive that other SVR4 systems won't match this,
@@ -865,7 +894,7 @@
         # Use sysv4.2uw... so that sysv4* matches it.
 	echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
 	exit 0 ;;
-    i?86:*:4.*:* | i?86:SYSTEM_V:4.*:*)
+    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
 	UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
 	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
 		echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
@@ -873,16 +902,15 @@
 		echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
 	fi
 	exit 0 ;;
-    i?86:*:5:7*)
-        # Fixed at (any) Pentium or better
-        UNAME_MACHINE=i586
-        if [ ${UNAME_SYSTEM} = "UnixWare" ] ; then
-	    echo ${UNAME_MACHINE}-sco-sysv${UNAME_RELEASE}uw${UNAME_VERSION}
-	else
-	    echo ${UNAME_MACHINE}-pc-sysv${UNAME_RELEASE}
-	fi
+    i*86:*:5:[78]*)
+	case `/bin/uname -X | grep "^Machine"` in
+	    *486*)	     UNAME_MACHINE=i486 ;;
+	    *Pentium)	     UNAME_MACHINE=i586 ;;
+	    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+	esac
+	echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
 	exit 0 ;;
-    i?86:*:3.2:*)
+    i*86:*:3.2:*)
 	if test -f /usr/options/cb.name; then
 		UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
 		echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
@@ -900,7 +928,7 @@
 		echo ${UNAME_MACHINE}-pc-sysv32
 	fi
 	exit 0 ;;
-    i?86:*DOS:*:*)
+    i*86:*DOS:*:*)
 	echo ${UNAME_MACHINE}-pc-msdosdjgpp
 	exit 0 ;;
     pc:*:*:*)
@@ -928,7 +956,7 @@
 	exit 0 ;;
     M68*:*:R3V[567]*:*)
 	test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
-    3[34]??:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*:4.0:3.0)
+    3[34]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*:4.0:3.0)
 	OS_REL=''
 	test -r /etc/.relid \
 	&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
@@ -939,21 +967,24 @@
     3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
         /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
           && echo i486-ncr-sysv4 && exit 0 ;;
-    m68*:LynxOS:2.*:*)
+    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
 	echo m68k-unknown-lynxos${UNAME_RELEASE}
 	exit 0 ;;
     mc68030:UNIX_System_V:4.*:*)
 	echo m68k-atari-sysv4
 	exit 0 ;;
-    i?86:LynxOS:2.*:* | i?86:LynxOS:3.[01]*:*)
+    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
 	echo i386-unknown-lynxos${UNAME_RELEASE}
 	exit 0 ;;
     TSUNAMI:LynxOS:2.*:*)
 	echo sparc-unknown-lynxos${UNAME_RELEASE}
 	exit 0 ;;
-    rs6000:LynxOS:2.*:* | PowerPC:LynxOS:2.*:*)
+    rs6000:LynxOS:2.*:*)
 	echo rs6000-unknown-lynxos${UNAME_RELEASE}
 	exit 0 ;;
+    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)
+	echo powerpc-unknown-lynxos${UNAME_RELEASE}
+	exit 0 ;;
     SM[BE]S:UNIX_SV:*:*)
 	echo mips-dde-sysv${UNAME_RELEASE}
 	exit 0 ;;
@@ -971,8 +1002,8 @@
 		echo ns32k-sni-sysv
 	fi
 	exit 0 ;;
-    PENTIUM:CPunix:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
-                           # says <[email protected]>
+    PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+                      # says <[email protected]>
         echo i586-unisys-sysv4
         exit 0 ;;
     *:UNIX_System_V:4*:FTX*)
@@ -984,10 +1015,14 @@
 	# From [email protected].
 	echo i860-stratus-sysv4
 	exit 0 ;;
+    *:VOS:*:*)
+	# From [email protected].
+	echo hppa1.1-stratus-vos
+	exit 0 ;;
     mc68*:A/UX:*:*)
 	echo m68k-apple-aux${UNAME_RELEASE}
 	exit 0 ;;
-    news*:NEWS-OS:*:6*)
+    news*:NEWS-OS:6*:*)
 	echo mips-sony-newsos6
 	exit 0 ;;
     R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
@@ -1030,9 +1065,12 @@
     *:QNX:*:4*)
 	echo i386-pc-qnx
 	exit 0 ;;
-    NSR-W:NONSTOP_KERNEL:*:*)
+    NSR-[KW]:NONSTOP_KERNEL:*:*)
 	echo nsr-tandem-nsk${UNAME_RELEASE}
 	exit 0 ;;
+    *:NonStop-UX:*:*)
+	echo mips-compaq-nonstopux
+	exit 0 ;;
     BS2000:POSIX*:*:*)
 	echo bs2000-siemens-sysv
 	exit 0 ;;
@@ -1039,11 +1077,52 @@
     DS/*:UNIX_System_V:*:*)
 	echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
 	exit 0 ;;
+    *:Plan9:*:*)
+	# "uname -m" is not consistent, so use $cputype instead. 386
+	# is converted to i386 for consistency with other x86
+	# operating systems.
+	if test "$cputype" = "386"; then
+	    UNAME_MACHINE=i386
+	else
+	    UNAME_MACHINE="$cputype"
+	fi
+	echo ${UNAME_MACHINE}-unknown-plan9
+	exit 0 ;;
+    i*86:OS/2:*:*)
+	# If we were able to find `uname', then EMX Unix compatibility
+	# is probably installed.
+	echo ${UNAME_MACHINE}-pc-os2-emx
+	exit 0 ;;
+    *:TOPS-10:*:*)
+	echo pdp10-unknown-tops10
+	exit 0 ;;
+    *:TENEX:*:*)
+	echo pdp10-unknown-tenex
+	exit 0 ;;
+    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+	echo pdp10-dec-tops20
+	exit 0 ;;
+    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+	echo pdp10-xkl-tops20
+	exit 0 ;;
+    *:TOPS-20:*:*)
+	echo pdp10-unknown-tops20
+	exit 0 ;;
+    *:ITS:*:*)
+	echo pdp10-unknown-its
+	exit 0 ;;
+    i*86:XTS-300:*:STOP)
+	echo ${UNAME_MACHINE}-unknown-stop
+	exit 0 ;;
+    i*86:atheos:*:*)
+	echo ${UNAME_MACHINE}-unknown-atheos
+	exit 0 ;;
 esac
 
 #echo '(No uname command or uname output not recognized.)' 1>&2
 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
 
+eval $set_cc_for_build
 cat >$dummy.c <<EOF
 #ifdef _SEQUENT_
 # include <sys/types.h>
@@ -1130,12 +1209,25 @@
 #endif
 
 #if defined (vax)
-#if !defined (ultrix)
-  printf ("vax-dec-bsd\n"); exit (0);
-#else
-  printf ("vax-dec-ultrix\n"); exit (0);
+# if !defined (ultrix)
+#  include <sys/param.h>
+#  if defined (BSD)
+#   if BSD == 43
+      printf ("vax-dec-bsd4.3\n"); exit (0);
+#   else
+#    if BSD == 199006
+      printf ("vax-dec-bsd4.3reno\n"); exit (0);
+#    else
+      printf ("vax-dec-bsd\n"); exit (0);
+#    endif
+#   endif
+#  else
+    printf ("vax-dec-bsd\n"); exit (0);
+#  endif
+# else
+    printf ("vax-dec-ultrix\n"); exit (0);
+# endif
 #endif
-#endif
 
 #if defined (alliant) && defined (i860)
   printf ("i860-alliant-bsd\n"); exit (0);
@@ -1145,7 +1237,7 @@
 }
 EOF
 
-$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm $dummy.c $dummy && exit 0
+$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm -f $dummy.c $dummy && exit 0
 rm -f $dummy.c $dummy
 
 # Apollos put the system type in the environment.
@@ -1178,6 +1270,48 @@
     esac
 fi
 
-#echo '(Unable to guess system type)' 1>&2
+cat >&2 <<EOF
+$0: unable to guess system type
 
+This script, last modified $timestamp, has failed to recognize
+the operating system you are using. It is advised that you
+download the most up to date version of the config scripts from
+
+    ftp://ftp.gnu.org/pub/gnu/config/
+
+If the version you run ($0) is already up to date, please
+send the following data and any information you think might be
+pertinent to <[email protected]> in order to provide the needed
+information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo               = `(hostinfo) 2>/dev/null`
+/bin/universe          = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch              = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = ${UNAME_MACHINE}
+UNAME_RELEASE = ${UNAME_RELEASE}
+UNAME_SYSTEM  = ${UNAME_SYSTEM}
+UNAME_VERSION = ${UNAME_VERSION}
+EOF
+
 exit 1
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
--- a/common/libsndfile/config.sub
+++ b/common/libsndfile/config.sub
@@ -1,8 +1,10 @@
 #! /bin/sh
-# Configuration validation subroutine script, version 1.1.
-#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000
+# Configuration validation subroutine script.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
 #   Free Software Foundation, Inc.
-#
+
+timestamp='2001-09-07'
+
 # This file is (in principle) common to ALL GNU software.
 # The presence of a machine in this file suggests that SOME GNU software
 # can handle that machine.  It does not imply ALL GNU software can.
@@ -27,7 +29,6 @@
 # configuration script generated by Autoconf, you may include it under
 # the same distribution terms that you use for the rest of that program.
 
-# Written by Per Bothner <[email protected]>.
 # Please send patches to <[email protected]>.
 #
 # Configuration subroutine to validate and canonicalize a configuration type.
@@ -50,23 +51,66 @@
 #	CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
 # It is wrong to echo any other type of specification.
 
-if [ x$1 = x ]
-then
-	echo Configuration name missing. 1>&2
-	echo "Usage: $0 CPU-MFR-OPSYS" 1>&2
-	echo "or     $0 ALIAS" 1>&2
-	echo where ALIAS is a recognized configuration type. 1>&2
-	exit 1
-fi
+me=`echo "$0" | sed -e 's,.*/,,'`
 
-# First pass through any local machine types.
-case $1 in
-	*local*)
-		echo $1
-		exit 0
-		;;
-	*)
-	;;
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS
+       $0 [OPTION] ALIAS
+
+Canonicalize a configuration name.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <[email protected]>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit 0 ;;
+    --version | -v )
+       echo "$version" ; exit 0 ;;
+    --help | --h* | -h )
+       echo "$usage"; exit 0 ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help"
+       exit 1 ;;
+
+    *local*)
+       # First pass through any local machine types.
+       echo $1
+       exit 0;;
+
+    * )
+       break ;;
+  esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+    exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+    exit 1;;
 esac
 
 # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
@@ -73,7 +117,7 @@
 # Here we must recognize all the valid KERNEL-OS combinations.
 maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
 case $maybe_os in
-  nto-qnx* | linux-gnu*)
+  nto-qnx* | linux-gnu* | storm-chaos* | os2-emx* | windows32-*)
     os=-$maybe_os
     basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
     ;;
@@ -99,7 +143,7 @@
 	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
 	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
 	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
-	-apple)
+	-apple | -axis)
 		os=
 		basic_machine=$1
 		;;
@@ -113,6 +157,14 @@
 		os=-vxworks
 		basic_machine=$1
 		;;
+	-chorusos*)
+		os=-chorusos
+		basic_machine=$1
+		;;
+ 	-chorusrdb)
+ 		os=-chorusrdb
+		basic_machine=$1
+ 		;;
 	-hiux*)
 		os=-hiuxwe2
 		;;
@@ -171,30 +223,50 @@
 case $basic_machine in
 	# Recognize the basic CPU types without company name.
 	# Some are omitted here because they have special meanings below.
-	tahoe | i860 | ia64 | m32r | m68k | m68000 | m88k | ns32k | arc | arm \
-		| arme[lb] | pyramid | mn10200 | mn10300 | tron | a29k \
-		| 580 | i960 | h8300 \
-		| x86 | ppcbe | mipsbe | mipsle | shbe | shle | armbe | armle \
-		| hppa | hppa1.0 | hppa1.1 | hppa2.0 | hppa2.0w | hppa2.0n \
-		| hppa64 \
-		| alpha | alphaev[4-8] | alphaev56 | alphapca5[67] \
-		| alphaev6[78] \
-		| we32k | ns16k | clipper | i370 | sh | powerpc | powerpcle \
-		| 1750a | dsp16xx | pdp11 | mips16 | mips64 | mipsel | mips64el \
-		| mips64orion | mips64orionel | mipstx39 | mipstx39el \
-		| mips64vr4300 | mips64vr4300el | mips64vr4100 | mips64vr4100el \
-		| mips64vr5000 | miprs64vr5000el | mcore \
-		| sparc | sparclet | sparclite | sparc64 | sparcv9 | v850 | c4x \
-		| thumb | d10v | fr30 | avr)
+	1750a | 580 \
+	| a29k \
+	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
+	| c4x | clipper \
+	| d10v | d30v | dsp16xx \
+	| fr30 \
+	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+	| i370 | i860 | i960 | ia64 \
+	| m32r | m68000 | m68k | m88k | mcore \
+	| mips16 | mips64 | mips64el | mips64orion | mips64orionel \
+	| mips64vr4100 | mips64vr4100el | mips64vr4300 \
+	| mips64vr4300el | mips64vr5000 | mips64vr5000el \
+	| mipsbe | mipseb | mipsel | mipsle | mipstx39 | mipstx39el \
+	| mipsisa32 \
+	| mn10200 | mn10300 \
+	| ns16k | ns32k \
+	| openrisc \
+	| pdp10 | pdp11 | pj | pjl \
+	| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
+	| pyramid \
+	| s390 | s390x \
+	| sh | sh[34] | sh[34]eb | shbe | shle \
+	| sparc | sparc64 | sparclet | sparclite | sparcv9 | sparcv9b \
+	| stormy16 | strongarm \
+	| tahoe | thumb | tic80 | tron \
+	| v850 \
+	| we32k \
+	| x86 | xscale \
+	| z8k)
 		basic_machine=$basic_machine-unknown
 		;;
-	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | z8k | v70 | h8500 | w65 | pj | pjl)
+	m6811 | m68hc11 | m6812 | m68hc12)
+		# Motorola 68HC11/12.
+		basic_machine=$basic_machine-unknown
+		os=-none
 		;;
+	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+		;;
 
 	# We use `pc' rather than `unknown'
 	# because (1) that's what they normally are, and
 	# (2) the word "unknown" tends to confuse beginning users.
-	i[34567]86)
+	i*86 | x86_64)
 	  basic_machine=$basic_machine-pc
 	  ;;
 	# Object if more than one company name word.
@@ -203,28 +275,43 @@
 		exit 1
 		;;
 	# Recognize the basic CPU types with company name.
-	# FIXME: clean up the formatting here.
-	vax-* | tahoe-* | i[34567]86-* | i860-* | ia64-* | m32r-* | m68k-* | m68000-* \
-	      | m88k-* | sparc-* | ns32k-* | fx80-* | arc-* | arm-* | c[123]* \
-	      | mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* \
-	      | power-* | none-* | 580-* | cray2-* | h8300-* | h8500-* | i960-* \
-	      | xmp-* | ymp-* \
-	      | x86-* | ppcbe-* | mipsbe-* | mipsle-* | shbe-* | shle-* | armbe-* | armle-* \
-	      | hppa-* | hppa1.0-* | hppa1.1-* | hppa2.0-* | hppa2.0w-* \
-	      | hppa2.0n-* | hppa64-* \
-	      | alpha-* | alphaev[4-8]-* | alphaev56-* | alphapca5[67]-* \
-	      | alphaev6[78]-* \
-	      | we32k-* | cydra-* | ns16k-* | pn-* | np1-* | xps100-* \
-	      | clipper-* | orion-* \
-	      | sparclite-* | pdp11-* | sh-* | powerpc-* | powerpcle-* \
-	      | sparc64-* | sparcv9-* | sparc86x-* | mips16-* | mips64-* | mipsel-* \
-	      | mips64el-* | mips64orion-* | mips64orionel-* \
-	      | mips64vr4100-* | mips64vr4100el-* | mips64vr4300-* | mips64vr4300el-* \
-	      | mipstx39-* | mipstx39el-* | mcore-* \
-	      | f301-* | armv*-* | s390-* | sv1-* | t3e-* \
-	      | m88110-* | m680[01234]0-* | m683?2-* | m68360-* | z8k-* | d10v-* \
-	      | thumb-* | v850-* | d30v-* | tic30-* | c30-* | fr30-* \
-	      | bs2000-*)
+	580-* \
+	| a29k-* \
+	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+	| alphapca5[67]-* | arc-* \
+	| arm-*  | armbe-* | armle-* | armv*-* \
+	| bs2000-* \
+	| c[123]* | c30-* | [cjt]90-* | c54x-* \
+	| clipper-* | cray2-* | cydra-* \
+	| d10v-* | d30v-* \
+	| elxsi-* \
+	| f30[01]-* | f700-* | fr30-* | fx80-* \
+	| h8300-* | h8500-* \
+	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+	| i*86-* | i860-* | i960-* | ia64-* \
+	| m32r-* \
+	| m68000-* | m680[01234]0-* | m68360-* | m683?2-* | m68k-* \
+	| m88110-* | m88k-* | mcore-* \
+	| mips-* | mips16-* | mips64-* | mips64el-* | mips64orion-* \
+	| mips64orionel-* | mips64vr4100-* | mips64vr4100el-* \
+	| mips64vr4300-* | mips64vr4300el-* | mipsbe-* | mipseb-* \
+	| mipsle-* | mipsel-* | mipstx39-* | mipstx39el-* \
+	| none-* | np1-* | ns16k-* | ns32k-* \
+	| orion-* \
+	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
+	| pyramid-* \
+	| romp-* | rs6000-* \
+	| s390-* | s390x-* \
+	| sh-* | sh[34]-* | sh[34]eb-* | shbe-* | shle-* \
+	| sparc-* | sparc64-* | sparc86x-* | sparclite-* \
+	| sparcv9-* | sparcv9b-* | stormy16-* | strongarm-* | sv1-* \
+	| t3e-* | tahoe-* | thumb-* | tic30-* | tic54x-* | tic80-* | tron-* \
+	| v850-* | vax-* \
+	| we32k-* \
+	| x86-* | x86_64-* | xmp-* | xps100-* | xscale-* \
+	| ymp-* \
+	| z8k-*)
 		;;
 	# Recognize the various machine names and aliases which stand
 	# for a CPU type and a company and sometimes even an OS.
@@ -261,14 +348,14 @@
 		os=-sysv
 		;;
 	amiga | amiga-*)
-		basic_machine=m68k-cbm
+		basic_machine=m68k-unknown
 		;;
 	amigaos | amigados)
-		basic_machine=m68k-cbm
+		basic_machine=m68k-unknown
 		os=-amigaos
 		;;
 	amigaunix | amix)
-		basic_machine=m68k-cbm
+		basic_machine=m68k-unknown
 		os=-sysv4
 		;;
 	apollo68)
@@ -315,13 +402,16 @@
 		basic_machine=cray2-cray
 		os=-unicos
 		;;
-	[ctj]90-cray)
-		basic_machine=c90-cray
+	[cjt]90)
+		basic_machine=${basic_machine}-cray
 		os=-unicos
 		;;
 	crds | unos)
 		basic_machine=m68k-crds
 		;;
+	cris | cris-* | etrax*)
+		basic_machine=cris-axis
+		;;
 	da30 | da30-*)
 		basic_machine=m68k-da30
 		;;
@@ -369,6 +459,10 @@
 		basic_machine=tron-gmicro
 		os=-sysv
 		;;
+	go32)
+		basic_machine=i386-pc
+		os=-go32
+		;;
 	h3050r* | hiux*)
 		basic_machine=hppa1.1-hitachi
 		os=-hiuxwe2
@@ -444,19 +538,19 @@
 		basic_machine=i370-ibm
 		;;
 # I'm not sure what "Sysv32" means.  Should this be sysv3.2?
-	i[34567]86v32)
+	i*86v32)
 		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
 		os=-sysv32
 		;;
-	i[34567]86v4*)
+	i*86v4*)
 		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
 		os=-sysv4
 		;;
-	i[34567]86v)
+	i*86v)
 		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
 		os=-sysv
 		;;
-	i[34567]86sol2)
+	i*86sol2)
 		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
 		os=-solaris2
 		;;
@@ -468,14 +562,6 @@
 		basic_machine=i386-unknown
 		os=-vsta
 		;;
-	i386-go32 | go32)
-		basic_machine=i386-unknown
-		os=-go32
-		;;
-	i386-mingw32 | mingw32)
-		basic_machine=i386-unknown
-		os=-mingw32
-		;;
 	iris | iris4d)
 		basic_machine=mips-sgi
 		case $os in
@@ -501,6 +587,10 @@
 		basic_machine=ns32k-utek
 		os=-sysv
 		;;
+	mingw32)
+		basic_machine=i386-pc
+		os=-mingw32
+		;;
 	miniframe)
 		basic_machine=m68000-convergent
 		;;
@@ -531,7 +621,7 @@
 		os=-coff
 		;;
 	msdos)
-		basic_machine=i386-unknown
+		basic_machine=i386-pc
 		os=-msdos
 		;;
 	mvs)
@@ -595,6 +685,10 @@
 		basic_machine=i960-intel
 		os=-mon960
 		;;
+	nonstopux)
+		basic_machine=mips-compaq
+		os=-nonstopux
+		;;
 	np1)
 		basic_machine=np1-gould
 		;;
@@ -630,28 +724,28 @@
         pc532 | pc532-*)
 		basic_machine=ns32k-pc532
 		;;
-	pentium | p5 | k5 | k6 | nexen)
+	pentium | p5 | k5 | k6 | nexgen)
 		basic_machine=i586-pc
 		;;
-	pentiumpro | p6 | 6x86)
+	pentiumpro | p6 | 6x86 | athlon)
 		basic_machine=i686-pc
 		;;
 	pentiumii | pentium2)
-		basic_machine=i786-pc
+		basic_machine=i686-pc
 		;;
-	pentium-* | p5-* | k5-* | k6-* | nexen-*)
+	pentium-* | p5-* | k5-* | k6-* | nexgen-*)
 		basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
 		;;
-	pentiumpro-* | p6-* | 6x86-*)
+	pentiumpro-* | p6-* | 6x86-* | athlon-*)
 		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
 		;;
 	pentiumii-* | pentium2-*)
-		basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
 		;;
 	pn)
 		basic_machine=pn-gould
 		;;
-	power)	basic_machine=rs6000-ibm
+	power)	basic_machine=power-ibm
 		;;
 	ppc)	basic_machine=powerpc-unknown
 	        ;;
@@ -663,9 +757,23 @@
 	ppcle-* | powerpclittle-*)
 		basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
 		;;
+	ppc64)	basic_machine=powerpc64-unknown
+	        ;;
+	ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+		basic_machine=powerpc64le-unknown
+	        ;;
+	ppc64le-* | powerpc64little-*)
+		basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
 	ps2)
 		basic_machine=i386-ibm
 		;;
+	pw32)
+		basic_machine=i586-unknown
+		os=-pw32
+		;;
 	rom68k)
 		basic_machine=m68k-rom68k
 		os=-coff
@@ -757,6 +865,10 @@
 		basic_machine=t3e-cray
 		os=-unicos
 		;;
+	tic54x | c54x*)
+		basic_machine=tic54x-unknown
+		os=-coff
+		;;
 	tx39)
 		basic_machine=mipstx39-unknown
 		;;
@@ -809,6 +921,10 @@
 		basic_machine=hppa1.1-winbond
 		os=-proelf
 		;;
+	windows32)
+		basic_machine=i386-pc
+		os=-windows32-msvcrt
+		;;
 	xmp)
 		basic_machine=xmp-cray
 		os=-unicos
@@ -852,6 +968,10 @@
 	vax)
 		basic_machine=vax-dec
 		;;
+	pdp10)
+		# there are many clones, so DEC is not a safe bet
+		basic_machine=pdp10-unknown
+		;;
 	pdp11)
 		basic_machine=pdp11-dec
 		;;
@@ -858,7 +978,10 @@
 	we32k)
 		basic_machine=we32k-att
 		;;
-	sparc | sparcv9)
+	sh3 | sh4 | sh3eb | sh4eb)
+		basic_machine=sh-unknown
+		;;
+	sparc | sparcv9 | sparcv9b)
 		basic_machine=sparc-sun
 		;;
         cydra)
@@ -880,6 +1003,9 @@
 		basic_machine=c4x-none
 		os=-coff
 		;;
+	*-unknown)
+		# Make sure to match an already-canonicalized machine name.
+		;;
 	*)
 		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
 		exit 1
@@ -936,15 +1062,18 @@
 	      | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
 	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
 	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+	      | -chorusos* | -chorusrdb* \
 	      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
 	      | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \
 	      | -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \
-	      | -openstep* | -oskit*)
+	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+	      | -os2* | -vos*)
 	# Remember, each alternative MUST END IN *, to match a version number.
 		;;
 	-qnx*)
 		case $basic_machine in
-		    x86-* | i[34567]86-*)
+		    x86-* | i*86-*)
 			;;
 		    *)
 			os=-nto$os
@@ -1000,7 +1129,7 @@
 	-ns2 )
 	        os=-nextstep2
 		;;
-	-nsk)
+	-nsk*)
 		os=-nsk
 		;;
 	# Preserve the version number of sinix5.
@@ -1037,7 +1166,7 @@
 	-xenix)
 		os=-xenix
 		;;
-        -*mint | -*MiNT)
+        -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
 	        os=-mint
 		;;
 	-none)
@@ -1071,6 +1200,9 @@
 	arm*-semi)
 		os=-aout
 		;;
+	pdp10-*)
+		os=-tops20
+		;;
         pdp11-*)
 		os=-none
 		;;
@@ -1179,7 +1311,7 @@
 	*-masscomp)
 		os=-rtu
 		;;
-	f301-fujitsu)
+	f30[01]-fujitsu | f700-fujitsu)
 		os=-uxpv
 		;;
 	*-rom68k)
@@ -1257,9 +1389,12 @@
 			-mpw* | -macos*)
 				vendor=apple
 				;;
-			-*mint | -*MiNT)
+			-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
 				vendor=atari
 				;;
+			-vos*)
+				vendor=stratus
+				;;
 		esac
 		basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
 		;;
@@ -1266,3 +1401,11 @@
 esac
 
 echo $basic_machine$os
+exit 0
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
--- a/common/libsndfile/configure
+++ b/common/libsndfile/configure
@@ -19,9 +19,170 @@
   --enable-fast-install[=PKGS]  optimize for fast installation [default=yes]"
 ac_help="$ac_help
   --with-gnu-ld           assume the C compiler uses GNU ld [default=no]"
+
+# Find the correct PATH separator.  Usually this is `:', but
+# DJGPP uses `;' like DOS.
+if test "X${PATH_SEPARATOR+set}" != Xset; then
+  UNAME=${UNAME-`uname 2>/dev/null`}
+  case X$UNAME in
+    *-DOS) lt_cv_sys_path_separator=';' ;;
+    *)     lt_cv_sys_path_separator=':' ;;
+  esac
+  PATH_SEPARATOR=$lt_cv_sys_path_separator
+fi
+
+
+# Check that we are running under the correct shell.
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+case X$ECHO in
+X*--fallback-echo)
+  # Remove one level of quotation (which was required for Make).
+  ECHO=`echo "$ECHO" | sed 's,\\\\\$\\$0,'$0','`
+  ;;
+esac
+
+echo=${ECHO-echo}
+if test "X$1" = X--no-reexec; then
+  # Discard the --no-reexec flag, and continue.
+  shift
+elif test "X$1" = X--fallback-echo; then
+  # Avoid inline document here, it may be left over
+  :
+elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then
+  # Yippee, $echo works!
+  :
+else
+  # Restart under the correct shell.
+  exec $SHELL "$0" --no-reexec ${1+"$@"}
+fi
+
+if test "X$1" = X--fallback-echo; then
+  # used as fallback echo
+  shift
+  cat <<EOF
+
+EOF
+  exit 0
+fi
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+if test "X${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi
+
+if test -z "$ECHO"; then
+if test "X${echo_test_string+set}" != Xset; then
+# find a string as large as possible, as long as the shell can cope with it
+  for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do
+    # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
+    if (echo_test_string="`eval $cmd`") 2>/dev/null &&
+       echo_test_string="`eval $cmd`" &&
+       (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null
+    then
+      break
+    fi
+  done
+fi
+
+if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
+   echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
+   test "X$echo_testing_string" = "X$echo_test_string"; then
+  :
+else
+  # The Solaris, AIX, and Digital Unix default echo programs unquote
+  # backslashes.  This makes it impossible to quote backslashes using
+  #   echo "$something" | sed 's/\\/\\\\/g'
+  #
+  # So, first we look for a working echo in the user's PATH.
+
+  IFS="${IFS= 	}"; save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for dir in $PATH /usr/ucb; do
+    if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
+       test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
+       echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` &&
+       test "X$echo_testing_string" = "X$echo_test_string"; then
+      echo="$dir/echo"
+      break
+    fi
+  done
+  IFS="$save_ifs"
+
+  if test "X$echo" = Xecho; then
+    # We didn't find a better echo, so look for alternatives.
+    if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' &&
+       echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` &&
+       test "X$echo_testing_string" = "X$echo_test_string"; then
+      # This shell has a builtin print -r that does the trick.
+      echo='print -r'
+    elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) &&
+	 test "X$CONFIG_SHELL" != X/bin/ksh; then
+      # If we have ksh, try running configure again with it.
+      ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
+      export ORIGINAL_CONFIG_SHELL
+      CONFIG_SHELL=/bin/ksh
+      export CONFIG_SHELL
+      exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"}
+    else
+      # Try using printf.
+      echo='printf %s\n'
+      if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
+	 echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
+	 test "X$echo_testing_string" = "X$echo_test_string"; then
+	# Cool, printf works
+	:
+      elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` &&
+	   test "X$echo_testing_string" = 'X\t' &&
+	   echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+	   test "X$echo_testing_string" = "X$echo_test_string"; then
+	CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL
+	export CONFIG_SHELL
+	SHELL="$CONFIG_SHELL"
+	export SHELL
+	echo="$CONFIG_SHELL $0 --fallback-echo"
+      elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` &&
+	   test "X$echo_testing_string" = 'X\t' &&
+	   echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+	   test "X$echo_testing_string" = "X$echo_test_string"; then
+	echo="$CONFIG_SHELL $0 --fallback-echo"
+      else
+	# maybe with a smaller string...
+	prev=:
+
+	for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do
+	  if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null
+	  then
+	    break
+	  fi
+	  prev="$cmd"
+	done
+
+	if test "$prev" != 'sed 50q "$0"'; then
+	  echo_test_string=`eval $prev`
+	  export echo_test_string
+	  exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"}
+	else
+	  # Oops.  We lost completely, so just stick with echo.
+	  echo=echo
+	fi
+      fi
+    fi
+  fi
+fi
+fi
+
+# Copy echo and quote the copy suitably for passing to libtool from
+# the Makefile, instead of quoting the original, which is used later.
+ECHO=$echo
+if test "X$ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then
+   ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo"
+fi
+
+
 ac_help="$ac_help
   --disable-libtool-lock  avoid locking (might break parallel builds)"
 ac_help="$ac_help
+  --with-pic              try to use only PIC/non-PIC objects [default=use both]"
+ac_help="$ac_help
   --enable-justsrc             only compile library sources "
 ac_help="$ac_help
   --disable-gcc-pipe           disable gcc -pipe option "
@@ -29,6 +190,8 @@
   --disable-gcc-opt            disable gcc optimisations "
 ac_help="$ac_help
   --enable-force-broken-float  force use of broken float code "
+ac_help="$ac_help
+  --disable-largefile     omit support for large files"
 
 # Initialize some variables set by options.
 # The variables have the same names as the options, with
@@ -586,7 +749,7 @@
 fi
 
 echo $ac_n "checking host system type""... $ac_c" 1>&6
-echo "configure:590: checking host system type" >&5
+echo "configure:753: checking host system type" >&5
 
 host_alias=$host
 case "$host_alias" in
@@ -607,7 +770,7 @@
 echo "$ac_t""$host" 1>&6
 
 echo $ac_n "checking target system type""... $ac_c" 1>&6
-echo "configure:611: checking target system type" >&5
+echo "configure:774: checking target system type" >&5
 
 target_alias=$target
 case "$target_alias" in
@@ -625,7 +788,7 @@
 echo "$ac_t""$target" 1>&6
 
 echo $ac_n "checking build system type""... $ac_c" 1>&6
-echo "configure:629: checking build system type" >&5
+echo "configure:792: checking build system type" >&5
 
 build_alias=$build
 case "$build_alias" in
@@ -647,7 +810,6 @@
     NONENONEs,x,x, &&
   program_prefix=${target_alias}-
 
-
 # Find a good install program.  We prefer a C program (faster),
 # so one script is as good as another.  But avoid the broken or
 # incompatible versions:
@@ -660,7 +822,7 @@
 # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
 # ./install, which can be erroneously created by make from ./install.sh.
 echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
-echo "configure:664: checking for a BSD compatible install" >&5
+echo "configure:826: checking for a BSD compatible install" >&5
 if test -z "$INSTALL"; then
 if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -713,7 +875,7 @@
 test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
 
 echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6
-echo "configure:717: checking whether build environment is sane" >&5
+echo "configure:879: checking whether build environment is sane" >&5
 # Just in case
 sleep 1
 echo timestamp > conftestfile
@@ -770,7 +932,7 @@
 test "$program_transform_name" = "" && program_transform_name="s,x,x,"
 
 echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
-echo "configure:774: checking whether ${MAKE-make} sets \${MAKE}" >&5
+echo "configure:936: checking whether ${MAKE-make} sets \${MAKE}" >&5
 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -799,7 +961,7 @@
 
 PACKAGE=libsndfile
 
-VERSION=0.0.27
+VERSION=1.0.0rc2
 
 if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then
   { echo "configure: error: source directory already configured; run "make distclean" there first" 1>&2; exit 1; }
@@ -816,7 +978,7 @@
 
 missing_dir=`cd $ac_aux_dir && pwd`
 echo $ac_n "checking for working aclocal""... $ac_c" 1>&6
-echo "configure:820: checking for working aclocal" >&5
+echo "configure:982: checking for working aclocal" >&5
 # Run test in a subshell; some versions of sh will print an error if
 # an executable is not found, even if stderr is redirected.
 # Redirect stdin to placate older versions of autoconf.  Sigh.
@@ -829,7 +991,7 @@
 fi
 
 echo $ac_n "checking for working autoconf""... $ac_c" 1>&6
-echo "configure:833: checking for working autoconf" >&5
+echo "configure:995: checking for working autoconf" >&5
 # Run test in a subshell; some versions of sh will print an error if
 # an executable is not found, even if stderr is redirected.
 # Redirect stdin to placate older versions of autoconf.  Sigh.
@@ -842,7 +1004,7 @@
 fi
 
 echo $ac_n "checking for working automake""... $ac_c" 1>&6
-echo "configure:846: checking for working automake" >&5
+echo "configure:1008: checking for working automake" >&5
 # Run test in a subshell; some versions of sh will print an error if
 # an executable is not found, even if stderr is redirected.
 # Redirect stdin to placate older versions of autoconf.  Sigh.
@@ -855,7 +1017,7 @@
 fi
 
 echo $ac_n "checking for working autoheader""... $ac_c" 1>&6
-echo "configure:859: checking for working autoheader" >&5
+echo "configure:1021: checking for working autoheader" >&5
 # Run test in a subshell; some versions of sh will print an error if
 # an executable is not found, even if stderr is redirected.
 # Redirect stdin to placate older versions of autoconf.  Sigh.
@@ -868,7 +1030,7 @@
 fi
 
 echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6
-echo "configure:872: checking for working makeinfo" >&5
+echo "configure:1034: checking for working makeinfo" >&5
 # Run test in a subshell; some versions of sh will print an error if
 # an executable is not found, even if stderr is redirected.
 # Redirect stdin to placate older versions of autoconf.  Sigh.
@@ -883,17 +1045,71 @@
 
 
 
-SHARED_VERSION_INFO="0:27:0"
 
 
+##---------------------------------------------------------------------
+## Allow configure to save its options and optionally rerun itself with
+## the same options.
+#
+#AC_ARG_WITH(last-config,  [  --with-last-config      re-run configure script with last config options ],
+#  	ac_with_last_config=yes, ac_with_last_config=no)
+#
+#if test $ac_with_last_config = yes ; then
+#	if test -f "$srcdir/config.last" ; then
+#		mv $srcdir/config.last $srcdir/config.last.bak
+#		sed "s/--no-create --no-recursion//" $srcdir/config.last.bak >$srcdir/config.last
+#		rm $srcdir/config.last.bak
+#		echo "re-running configure script with last config : `cat $srcdir/config.last`"
+#		./configure `cat $srcdir/config.last`
+#		exit
+#	else
+#		AC_MSG_ERROR([[*** No previous config options found.]])
+#		fi
+#else
+#	# Save current config options
+#	echo "$@" >config.last 
+#	fi
 
+#---------------------------------------------------------------------
+# This is the version info according to the libtool versioning system.
 
+SHARED_VERSION_INFO="1:0:0"
 
+# Extract the first word of "autogen", so it can be a program name with args.
+set dummy autogen; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1082: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_autogen'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$autogen"; then
+  ac_cv_prog_autogen="$autogen" # Let the user override the test.
+else
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_autogen="yes"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  test -z "$ac_cv_prog_autogen" && ac_cv_prog_autogen="no"
+fi
+fi
+autogen="$ac_cv_prog_autogen"
+if test -n "$autogen"; then
+  echo "$ac_t""$autogen" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
 
+
 # Extract the first word of "gcc", so it can be a program name with args.
 set dummy gcc; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:897: checking for $ac_word" >&5
+echo "configure:1113: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -923,7 +1139,7 @@
   # Extract the first word of "cc", so it can be a program name with args.
 set dummy cc; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:927: checking for $ac_word" >&5
+echo "configure:1143: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -974,7 +1190,7 @@
       # Extract the first word of "cl", so it can be a program name with args.
 set dummy cl; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:978: checking for $ac_word" >&5
+echo "configure:1194: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1006,7 +1222,7 @@
 fi
 
 echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
-echo "configure:1010: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+echo "configure:1226: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
 
 ac_ext=c
 # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
@@ -1017,12 +1233,12 @@
 
 cat > conftest.$ac_ext << EOF
 
-#line 1021 "configure"
+#line 1237 "configure"
 #include "confdefs.h"
 
 main(){return(0);}
 EOF
-if { (eval echo configure:1026: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1242: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   ac_cv_prog_cc_works=yes
   # If we can't run a trivial program, we are probably using a cross compiler.
   if (./conftest; exit) 2>/dev/null; then
@@ -1048,12 +1264,12 @@
   { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
 fi
 echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
-echo "configure:1052: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "configure:1268: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
 echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
 cross_compiling=$ac_cv_prog_cc_cross
 
 echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
-echo "configure:1057: checking whether we are using GNU C" >&5
+echo "configure:1273: checking whether we are using GNU C" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1062,7 +1278,7 @@
   yes;
 #endif
 EOF
-if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1066: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1282: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
   ac_cv_prog_gcc=yes
 else
   ac_cv_prog_gcc=no
@@ -1081,7 +1297,7 @@
 ac_save_CFLAGS="$CFLAGS"
 CFLAGS=
 echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
-echo "configure:1085: checking whether ${CC-cc} accepts -g" >&5
+echo "configure:1301: checking whether ${CC-cc} accepts -g" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1124,7 +1340,7 @@
 # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
 # ./install, which can be erroneously created by make from ./install.sh.
 echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
-echo "configure:1128: checking for a BSD compatible install" >&5
+echo "configure:1344: checking for a BSD compatible install" >&5
 if test -z "$INSTALL"; then
 if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -1178,7 +1394,7 @@
 
 
 echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
-echo "configure:1182: checking whether ${MAKE-make} sets \${MAKE}" >&5
+echo "configure:1398: checking whether ${MAKE-make} sets \${MAKE}" >&5
 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -1205,7 +1421,7 @@
 fi
 
 echo $ac_n "checking whether ln -s works""... $ac_c" 1>&6
-echo "configure:1209: checking whether ln -s works" >&5
+echo "configure:1425: checking whether ln -s works" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_LN_S'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1225,11 +1441,164 @@
   echo "$ac_t""no" 1>&6
 fi
 
+# Find the correct PATH separator.  Usually this is `:', but
+# DJGPP uses `;' like DOS.
+if test "X${PATH_SEPARATOR+set}" != Xset; then
+  UNAME=${UNAME-`uname 2>/dev/null`}
+  case X$UNAME in
+    *-DOS) lt_cv_sys_path_separator=';' ;;
+    *)     lt_cv_sys_path_separator=':' ;;
+  esac
+  PATH_SEPARATOR=$lt_cv_sys_path_separator
+fi
+
+echo $ac_n "checking for Cygwin environment""... $ac_c" 1>&6
+echo "configure:1457: checking for Cygwin environment" >&5
+if eval "test \"`echo '$''{'ac_cv_cygwin'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1462 "configure"
+#include "confdefs.h"
+
+int main() {
+
+#ifndef __CYGWIN__
+#define __CYGWIN__ __CYGWIN32__
+#endif
+return __CYGWIN__;
+; return 0; }
+EOF
+if { (eval echo configure:1473: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_cygwin=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_cygwin=no
+fi
+rm -f conftest*
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_cygwin" 1>&6
+CYGWIN=
+test "$ac_cv_cygwin" = yes && CYGWIN=yes
+echo $ac_n "checking for mingw32 environment""... $ac_c" 1>&6
+echo "configure:1490: checking for mingw32 environment" >&5
+if eval "test \"`echo '$''{'ac_cv_mingw32'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1495 "configure"
+#include "confdefs.h"
+
+int main() {
+return __MINGW32__;
+; return 0; }
+EOF
+if { (eval echo configure:1502: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_mingw32=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_mingw32=no
+fi
+rm -f conftest*
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_mingw32" 1>&6
+MINGW32=
+test "$ac_cv_mingw32" = yes && MINGW32=yes
+echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
+echo "configure:1519: checking how to run the C preprocessor" >&5
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+    # This must be in double quotes, not single quotes, because CPP may get
+  # substituted into the Makefile and "${CC-cc}" will confuse make.
+  CPP="${CC-cc} -E"
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp.
+  cat > conftest.$ac_ext <<EOF
+#line 1534 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1540: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  :
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  CPP="${CC-cc} -E -traditional-cpp"
+  cat > conftest.$ac_ext <<EOF
+#line 1551 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1557: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  :
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  CPP="${CC-cc} -nologo -E"
+  cat > conftest.$ac_ext <<EOF
+#line 1568 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1574: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  :
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  CPP=/lib/cpp
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+  ac_cv_prog_CPP="$CPP"
+fi
+  CPP="$ac_cv_prog_CPP"
+else
+  ac_cv_prog_CPP="$CPP"
+fi
+echo "$ac_t""$CPP" 1>&6
+
 # Check whether --enable-shared or --disable-shared was given.
 if test "${enable_shared+set}" = set; then
   enableval="$enable_shared"
   p=${PACKAGE-default}
-case "$enableval" in
+case $enableval in
 yes) enable_shared=yes ;;
 no) enable_shared=no ;;
 *)
@@ -1252,7 +1621,7 @@
 if test "${enable_static+set}" = set; then
   enableval="$enable_static"
   p=${PACKAGE-default}
-case "$enableval" in
+case $enableval in
 yes) enable_static=yes ;;
 no) enable_static=no ;;
 *)
@@ -1275,7 +1644,7 @@
 if test "${enable_fast_install+set}" = set; then
   enableval="$enable_fast_install"
   p=${PACKAGE-default}
-case "$enableval" in
+case $enableval in
 yes) enable_fast_install=yes ;;
 no) enable_fast_install=no ;;
 *)
@@ -1294,36 +1663,6 @@
   enable_fast_install=yes
 fi
 
-# Extract the first word of "ranlib", so it can be a program name with args.
-set dummy ranlib; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1301: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  if test -n "$RANLIB"; then
-  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
-else
-  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
-  ac_dummy="$PATH"
-  for ac_dir in $ac_dummy; do
-    test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/$ac_word; then
-      ac_cv_prog_RANLIB="ranlib"
-      break
-    fi
-  done
-  IFS="$ac_save_ifs"
-  test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":"
-fi
-fi
-RANLIB="$ac_cv_prog_RANLIB"
-if test -n "$RANLIB"; then
-  echo "$ac_t""$RANLIB" 1>&6
-else
-  echo "$ac_t""no" 1>&6
-fi
-
 # Check whether --with-gnu-ld or --without-gnu-ld was given.
 if test "${with_gnu_ld+set}" = set; then
   withval="$with_gnu_ld"
@@ -1333,12 +1672,18 @@
 fi
 
 ac_prog=ld
-if test "$ac_cv_prog_gcc" = yes; then
+if test "$GCC" = yes; then
   # Check if gcc -print-prog-name=ld gives a path.
   echo $ac_n "checking for ld used by GCC""... $ac_c" 1>&6
-echo "configure:1340: checking for ld used by GCC" >&5
-  ac_prog=`($CC -print-prog-name=ld) 2>&5`
-  case "$ac_prog" in
+echo "configure:1679: checking for ld used by GCC" >&5
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
     # Accept absolute paths.
     [\\/]* | [A-Za-z]:[\\/]*)
       re_direlt='/[^/][^/]*/\.\./'
@@ -1360,24 +1705,24 @@
   esac
 elif test "$with_gnu_ld" = yes; then
   echo $ac_n "checking for GNU ld""... $ac_c" 1>&6
-echo "configure:1364: checking for GNU ld" >&5
+echo "configure:1709: checking for GNU ld" >&5
 else
   echo $ac_n "checking for non-GNU ld""... $ac_c" 1>&6
-echo "configure:1367: checking for non-GNU ld" >&5
+echo "configure:1712: checking for non-GNU ld" >&5
 fi
-if eval "test \"`echo '$''{'ac_cv_path_LD'+set}'`\" = set"; then
+if eval "test \"`echo '$''{'lt_cv_path_LD'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   if test -z "$LD"; then
-  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}"
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
   for ac_dir in $PATH; do
     test -z "$ac_dir" && ac_dir=.
     if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
-      ac_cv_path_LD="$ac_dir/$ac_prog"
+      lt_cv_path_LD="$ac_dir/$ac_prog"
       # Check to see if the program is GNU ld.  I'd rather use --version,
       # but apparently some GNU ld's only accept -v.
       # Break only if it was the GNU/non-GNU ld that we prefer.
-      if "$ac_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then
+      if "$lt_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then
 	test "$with_gnu_ld" != no && break
       else
 	test "$with_gnu_ld" != yes && break
@@ -1386,11 +1731,11 @@
   done
   IFS="$ac_save_ifs"
 else
-  ac_cv_path_LD="$LD" # Let the user override the test with a path.
+  lt_cv_path_LD="$LD" # Let the user override the test with a path.
 fi
 fi
 
-LD="$ac_cv_path_LD"
+LD="$lt_cv_path_LD"
 if test -n "$LD"; then
   echo "$ac_t""$LD" 1>&6
 else
@@ -1398,72 +1743,813 @@
 fi
 test -z "$LD" && { echo "configure: error: no acceptable ld found in \$PATH" 1>&2; exit 1; }
 echo $ac_n "checking if the linker ($LD) is GNU ld""... $ac_c" 1>&6
-echo "configure:1402: checking if the linker ($LD) is GNU ld" >&5
-if eval "test \"`echo '$''{'ac_cv_prog_gnu_ld'+set}'`\" = set"; then
+echo "configure:1747: checking if the linker ($LD) is GNU ld" >&5
+if eval "test \"`echo '$''{'lt_cv_prog_gnu_ld'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   # I'd rather use --version here, but apparently some GNU ld's only accept -v.
 if $LD -v 2>&1 </dev/null | egrep '(GNU|with BFD)' 1>&5; then
-  ac_cv_prog_gnu_ld=yes
+  lt_cv_prog_gnu_ld=yes
 else
-  ac_cv_prog_gnu_ld=no
+  lt_cv_prog_gnu_ld=no
 fi
 fi
 
-echo "$ac_t""$ac_cv_prog_gnu_ld" 1>&6
+echo "$ac_t""$lt_cv_prog_gnu_ld" 1>&6
+with_gnu_ld=$lt_cv_prog_gnu_ld
 
 
+echo $ac_n "checking for $LD option to reload object files""... $ac_c" 1>&6
+echo "configure:1764: checking for $LD option to reload object files" >&5
+if eval "test \"`echo '$''{'lt_cv_ld_reload_flag'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  lt_cv_ld_reload_flag='-r'
+fi
+
+echo "$ac_t""$lt_cv_ld_reload_flag" 1>&6
+reload_flag=$lt_cv_ld_reload_flag
+test -n "$reload_flag" && reload_flag=" $reload_flag"
+
 echo $ac_n "checking for BSD-compatible nm""... $ac_c" 1>&6
-echo "configure:1418: checking for BSD-compatible nm" >&5
-if eval "test \"`echo '$''{'ac_cv_path_NM'+set}'`\" = set"; then
+echo "configure:1776: checking for BSD-compatible nm" >&5
+if eval "test \"`echo '$''{'lt_cv_path_NM'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   if test -n "$NM"; then
   # Let the user override the test.
-  ac_cv_path_NM="$NM"
+  lt_cv_path_NM="$NM"
 else
-  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}"
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
   for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do
     test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/nm || test -f $ac_dir/nm$ac_exeext ; then
+    tmp_nm=$ac_dir/${ac_tool_prefix}nm
+    if test -f $tmp_nm || test -f $tmp_nm$ac_exeext ; then
       # Check to see if the nm accepts a BSD-compat flag.
       # Adding the `sed 1q' prevents false positives on HP-UX, which says:
       #   nm: unknown option "B" ignored
-      if ($ac_dir/nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then
-	ac_cv_path_NM="$ac_dir/nm -B"
+      # Tru64's nm complains that /dev/null is an invalid object file
+      if ($tmp_nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep '(/dev/null|Invalid file or object type)' >/dev/null; then
+	lt_cv_path_NM="$tmp_nm -B"
 	break
-      elif ($ac_dir/nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then
-	ac_cv_path_NM="$ac_dir/nm -p"
+      elif ($tmp_nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then
+	lt_cv_path_NM="$tmp_nm -p"
 	break
       else
-	ac_cv_path_NM=${ac_cv_path_NM="$ac_dir/nm"} # keep the first match, but
+	lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
 	continue # so that we can try to find one that supports BSD flags
       fi
     fi
   done
   IFS="$ac_save_ifs"
-  test -z "$ac_cv_path_NM" && ac_cv_path_NM=nm
+  test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm
 fi
 fi
 
-NM="$ac_cv_path_NM"
+NM="$lt_cv_path_NM"
 echo "$ac_t""$NM" 1>&6
 
+echo $ac_n "checking how to recognise dependant libraries""... $ac_c" 1>&6
+echo "configure:1814: checking how to recognise dependant libraries" >&5
+if eval "test \"`echo '$''{'lt_cv_deplibs_check_method'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# `unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# which responds to the $file_magic_cmd with a given egrep regex.
+# If you have `file' or equivalent on your system and you're not sure
+# whether `pass_all' will *always* work, you probably want this one.
 
-case "$target" in
-NONE) lt_target="$host" ;;
-*) lt_target="$target" ;;
+case $host_os in
+aix4* | aix5*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+beos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+bsdi4*)
+  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
+  lt_cv_file_magic_cmd='/usr/bin/file -L'
+  lt_cv_file_magic_test_file=/shlib/libc.so
+  ;;
+
+cygwin* | mingw* | pw32*)
+  lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
+  lt_cv_file_magic_cmd='$OBJDUMP -f'
+  ;;
+
+darwin* | rhapsody*)
+  lt_cv_deplibs_check_method='file_magic Mach-O dynamically linked shared library'
+  lt_cv_file_magic_cmd='/usr/bin/file -L'
+  case "$host_os" in
+  rhapsody* | darwin1.[012])
+    lt_cv_file_magic_test_file=`echo /System/Library/Frameworks/System.framework/Versions/*/System | head -1`
+    ;;
+  *) # Darwin 1.3 on
+    lt_cv_file_magic_test_file='/usr/lib/libSystem.dylib'
+    ;;
+  esac
+  ;;
+
+freebsd*)
+  if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+    case $host_cpu in
+    i*86 )
+      # Not sure whether the presence of OpenBSD here was a mistake.
+      # Let's accept both of them until this is cleared up.
+      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD)/i[3-9]86 (compact )?demand paged shared library'
+      lt_cv_file_magic_cmd=/usr/bin/file
+      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+      ;;
+    esac
+  else
+    lt_cv_deplibs_check_method=pass_all
+  fi
+  ;;
+
+gnu*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+hpux10.20*|hpux11*)
+  lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library'
+  lt_cv_file_magic_cmd=/usr/bin/file
+  lt_cv_file_magic_test_file=/usr/lib/libc.sl
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+  irix5* | nonstopux*)
+    # this will be overridden with pass_all, but let us keep it just in case
+    lt_cv_deplibs_check_method="file_magic ELF 32-bit MSB dynamic lib MIPS - version 1"
+    ;;
+  *)
+    case $LD in
+    *-32|*"-32 ") libmagic=32-bit;;
+    *-n32|*"-n32 ") libmagic=N32;;
+    *-64|*"-64 ") libmagic=64-bit;;
+    *) libmagic=never-match;;
+    esac
+    # this will be overridden with pass_all, but let us keep it just in case
+    lt_cv_deplibs_check_method="file_magic ELF ${libmagic} MSB mips-[1234] dynamic lib MIPS - version 1"
+    ;;
+  esac
+  lt_cv_file_magic_test_file=`echo /lib${libsuff}/libc.so*`
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+# This must be Linux ELF.
+linux-gnu*)
+  lt_cv_deplibs_check_method=pass_all
+  lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so`
+  ;;
+
+netbsd*)
+  if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+    lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so$'
+  fi
+  ;;
+
+newos6*)
+  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
+  lt_cv_file_magic_cmd=/usr/bin/file
+  lt_cv_file_magic_test_file=/usr/lib/libnls.so
+  ;;
+
+openbsd*)
+  lt_cv_file_magic_cmd=/usr/bin/file
+  lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB shared object'
+  else
+    lt_cv_deplibs_check_method='file_magic OpenBSD.* shared library'
+  fi
+  ;;
+
+osf3* | osf4* | osf5*)
+  # this will be overridden with pass_all, but let us keep it just in case
+  lt_cv_deplibs_check_method='file_magic COFF format alpha shared library'
+  lt_cv_file_magic_test_file=/shlib/libc.so
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sco3.2v5*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+solaris*)
+  lt_cv_deplibs_check_method=pass_all
+  lt_cv_file_magic_test_file=/lib/libc.so
+  ;;
+
+sysv5uw[78]* | sysv4*uw2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+  case $host_vendor in
+  motorola)
+    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
+    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+    ;;
+  ncr)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  sequent)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
+    ;;
+  sni)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib"
+    lt_cv_file_magic_test_file=/lib/libc.so
+    ;;
+  esac
+  ;;
 esac
 
-# Check for any special flags to pass to ltconfig.
-libtool_flags="--cache-file=$cache_file"
-test "$enable_shared" = no && libtool_flags="$libtool_flags --disable-shared"
-test "$enable_static" = no && libtool_flags="$libtool_flags --disable-static"
-test "$enable_fast_install" = no && libtool_flags="$libtool_flags --disable-fast-install"
-test "$ac_cv_prog_gcc" = yes && libtool_flags="$libtool_flags --with-gcc"
-test "$ac_cv_prog_gnu_ld" = yes && libtool_flags="$libtool_flags --with-gnu-ld"
+fi
 
+echo "$ac_t""$lt_cv_deplibs_check_method" 1>&6
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
 
+echo $ac_n "checking for object suffix""... $ac_c" 1>&6
+echo "configure:1991: checking for object suffix" >&5
+if eval "test \"`echo '$''{'ac_cv_objext'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  rm -f conftest*
+echo 'int i = 1;' > conftest.$ac_ext
+if { (eval echo configure:1997: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  for ac_file in conftest.*; do
+    case $ac_file in
+    *.c) ;;
+    *) ac_cv_objext=`echo $ac_file | sed -e s/conftest.//` ;;
+    esac
+  done
+else
+  { echo "configure: error: installation or configuration problem; compiler does not work" 1>&2; exit 1; }
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_objext" 1>&6
+OBJEXT=$ac_cv_objext
+ac_objext=$ac_cv_objext
+
+
+
+echo $ac_n "checking for executable suffix""... $ac_c" 1>&6
+echo "configure:2017: checking for executable suffix" >&5
+if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test "$CYGWIN" = yes || test "$MINGW32" = yes; then
+  ac_cv_exeext=.exe
+else
+  rm -f conftest*
+  echo 'int main () { return 0; }' > conftest.$ac_ext
+  ac_cv_exeext=
+  if { (eval echo configure:2027: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
+    for file in conftest.*; do
+      case $file in
+      *.$ac_ext | *.c | *.o | *.obj) ;;
+      *) ac_cv_exeext=`echo $file | sed -e s/conftest//` ;;
+      esac
+    done
+  else
+    { echo "configure: error: installation or configuration problem: compiler cannot create executables." 1>&2; exit 1; }
+  fi
+  rm -f conftest*
+  test x"${ac_cv_exeext}" = x && ac_cv_exeext=no
+fi
+fi
+
+EXEEXT=""
+test x"${ac_cv_exeext}" != xno && EXEEXT=${ac_cv_exeext}
+echo "$ac_t""${ac_cv_exeext}" 1>&6
+ac_exeext=$EXEEXT
+
+if test $host != $build; then
+  ac_tool_prefix=${host_alias}-
+else
+  ac_tool_prefix=
+fi
+
+
+
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+echo $ac_n "checking command to parse $NM output""... $ac_c" 1>&6
+echo "configure:2058: checking command to parse $NM output" >&5
+if eval "test \"`echo '$''{'lt_cv_sys_global_symbol_pipe'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[BCDEGRST]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
+
+# Transform the above into a raw symbol and a C symbol.
+symxfrm='\1 \2\3 \3'
+
+# Transform an extracted symbol line into a proper C declaration
+lt_cv_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern char \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/  {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([^ ]*\) \([^ ]*\)$/  {\"\2\", (lt_ptr) \&\2},/p'"
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+  symcode='[BCDT]'
+  ;;
+cygwin* | mingw* | pw32*)
+  symcode='[ABCDGISTW]'
+  ;;
+hpux*) # Its linker distinguishes data from code symbols
+  lt_cv_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern char \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+  lt_cv_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/  {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"\2\", (lt_ptr) \&\2},/p'"
+  ;;
+irix* | nonstopux*)
+  symcode='[BCDEGRST]'
+  ;;
+solaris* | sysv5*)
+  symcode='[BDT]'
+  ;;
+sysv4)
+  symcode='[DFNSTU]'
+  ;;
+esac
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $host_os in
+mingw*)
+  opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+  ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+if $NM -V 2>&1 | egrep '(GNU|with BFD)' > /dev/null; then
+  symcode='[ABCDGISTW]'
+fi
+
+# Try without a prefix undercore, then with it.
+for ac_symprfx in "" "_"; do
+
+  # Write the raw and C identifiers.
+lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ 	]\($symcode$symcode*\)[ 	][ 	]*\($ac_symprfx\)$sympat$opt_cr$/$symxfrm/p'"
+
+  # Check to see that the pipe works correctly.
+  pipe_works=no
+  rm -f conftest*
+  cat > conftest.$ac_ext <<EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+EOF
+
+  if { (eval echo configure:2138: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+    # Now try to grab the symbols.
+    nlist=conftest.nm
+    if { (eval echo configure:2141: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\") 1>&5; (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5; } && test -s "$nlist"; then
+      # Try sorting and uniquifying the output.
+      if sort "$nlist" | uniq > "$nlist"T; then
+	mv -f "$nlist"T "$nlist"
+      else
+	rm -f "$nlist"T
+      fi
+
+      # Make sure that we snagged all the symbols we need.
+      if egrep ' nm_test_var$' "$nlist" >/dev/null; then
+	if egrep ' nm_test_func$' "$nlist" >/dev/null; then
+	  cat <<EOF > conftest.$ac_ext
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+EOF
+	  # Now generate the symbol file.
+	  eval "$lt_cv_global_symbol_to_cdecl"' < "$nlist" >> conftest.$ac_ext'
+
+	  cat <<EOF >> conftest.$ac_ext
+#if defined (__STDC__) && __STDC__
+# define lt_ptr void *
+#else
+# define lt_ptr char *
+# define const
+#endif
+
+/* The mapping between symbol names and symbols. */
+const struct {
+  const char *name;
+  lt_ptr address;
+}
+lt_preloaded_symbols[] =
+{
+EOF
+	  sed "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (lt_ptr) \&\2},/" < "$nlist" >> conftest.$ac_ext
+	  cat <<\EOF >> conftest.$ac_ext
+  {0, (lt_ptr) 0}
+};
+
+#ifdef __cplusplus
+}
+#endif
+EOF
+	  # Now try linking the two files.
+	  mv conftest.$ac_objext conftstm.$ac_objext
+	  save_LIBS="$LIBS"
+	  save_CFLAGS="$CFLAGS"
+	  LIBS="conftstm.$ac_objext"
+	  CFLAGS="$CFLAGS$no_builtin_flag"
+	  if { (eval echo configure:2192: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+	    pipe_works=yes
+	  fi
+	  LIBS="$save_LIBS"
+	  CFLAGS="$save_CFLAGS"
+	else
+	  echo "cannot find nm_test_func in $nlist" >&5
+	fi
+      else
+	echo "cannot find nm_test_var in $nlist" >&5
+      fi
+    else
+      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5
+    fi
+  else
+    echo "$progname: failed program was:" >&5
+    cat conftest.$ac_ext >&5
+  fi
+  rm -f conftest* conftst*
+
+  # Do not use the global_symbol_pipe unless it works.
+  if test "$pipe_works" = yes; then
+    break
+  else
+    lt_cv_sys_global_symbol_pipe=
+  fi
+done
+
+fi
+
+global_symbol_pipe="$lt_cv_sys_global_symbol_pipe"
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+  global_symbol_to_cdecl=
+  global_symbol_to_c_name_address=
+else
+  global_symbol_to_cdecl="$lt_cv_global_symbol_to_cdecl"
+  global_symbol_to_c_name_address="$lt_cv_global_symbol_to_c_name_address"
+fi
+if test -z "$global_symbol_pipe$global_symbol_to_cdec$global_symbol_to_c_name_address";
+then
+  echo "$ac_t""failed" 1>&6
+else
+  echo "$ac_t""ok" 1>&6
+fi
+
+for ac_hdr in dlfcn.h
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "configure:2241: checking for $ac_hdr" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2246 "configure"
+#include "confdefs.h"
+#include <$ac_hdr>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:2251: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=yes"
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+    ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_hdr 1
+EOF
+ 
+else
+  echo "$ac_t""no" 1>&6
+fi
+done
+
+
+
+
+
+# Only perform the check for file, if the check method requires it
+case $deplibs_check_method in
+file_magic*)
+  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+    echo $ac_n "checking for ${ac_tool_prefix}file""... $ac_c" 1>&6
+echo "configure:2286: checking for ${ac_tool_prefix}file" >&5
+if eval "test \"`echo '$''{'lt_cv_path_MAGIC_CMD'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  case $MAGIC_CMD in
+  /*)
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  ;;
+  ?:/*)
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a dos path.
+  ;;
+  *)
+  ac_save_MAGIC_CMD="$MAGIC_CMD"
+  IFS="${IFS=   }"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="/usr/bin:$PATH"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/${ac_tool_prefix}file; then
+      lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file"
+      if test -n "$file_magic_test_file"; then
+	case $deplibs_check_method in
+	"file_magic "*)
+	  file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`"
+	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+	    egrep "$file_magic_regex" > /dev/null; then
+	    :
+	  else
+	    cat <<EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** [email protected]
+
+EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  MAGIC_CMD="$ac_save_MAGIC_CMD"
+  ;;
+esac
+fi
+
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+  echo "$ac_t""$MAGIC_CMD" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+  if test -n "$ac_tool_prefix"; then
+    echo $ac_n "checking for file""... $ac_c" 1>&6
+echo "configure:2348: checking for file" >&5
+if eval "test \"`echo '$''{'lt_cv_path_MAGIC_CMD'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  case $MAGIC_CMD in
+  /*)
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  ;;
+  ?:/*)
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a dos path.
+  ;;
+  *)
+  ac_save_MAGIC_CMD="$MAGIC_CMD"
+  IFS="${IFS=   }"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="/usr/bin:$PATH"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/file; then
+      lt_cv_path_MAGIC_CMD="$ac_dir/file"
+      if test -n "$file_magic_test_file"; then
+	case $deplibs_check_method in
+	"file_magic "*)
+	  file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`"
+	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+	    egrep "$file_magic_regex" > /dev/null; then
+	    :
+	  else
+	    cat <<EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** [email protected]
+
+EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  MAGIC_CMD="$ac_save_MAGIC_CMD"
+  ;;
+esac
+fi
+
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+  echo "$ac_t""$MAGIC_CMD" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+  else
+    MAGIC_CMD=:
+  fi
+fi
+
+  fi
+  ;;
+esac
+
+# Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:2419: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$RANLIB"; then
+  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+fi
+fi
+RANLIB="$ac_cv_prog_RANLIB"
+if test -n "$RANLIB"; then
+  echo "$ac_t""$RANLIB" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+
+if test -z "$ac_cv_prog_RANLIB"; then
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:2451: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$RANLIB"; then
+  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_RANLIB="ranlib"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":"
+fi
+fi
+RANLIB="$ac_cv_prog_RANLIB"
+if test -n "$RANLIB"; then
+  echo "$ac_t""$RANLIB" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+else
+  RANLIB=":"
+fi
+fi
+
+# Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:2486: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_STRIP'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+fi
+fi
+STRIP="$ac_cv_prog_STRIP"
+if test -n "$STRIP"; then
+  echo "$ac_t""$STRIP" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+
+if test -z "$ac_cv_prog_STRIP"; then
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:2518: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_STRIP'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_STRIP="strip"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  test -z "$ac_cv_prog_STRIP" && ac_cv_prog_STRIP=":"
+fi
+fi
+STRIP="$ac_cv_prog_STRIP"
+if test -n "$STRIP"; then
+  echo "$ac_t""$STRIP" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+else
+  STRIP=":"
+fi
+fi
+
+
+enable_dlopen=no
+enable_win32_dll=no
+
 # Check whether --enable-libtool-lock or --disable-libtool-lock was given.
 if test "${enable_libtool_lock+set}" = set; then
   enableval="$enable_libtool_lock"
@@ -1470,17 +2556,16 @@
   :
 fi
 
-test "x$enable_libtool_lock" = xno && libtool_flags="$libtool_flags --disable-lock"
-test x"$silent" = xyes && libtool_flags="$libtool_flags --silent"
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
 
 # Some flags need to be propagated to the compiler or linker for good
 # libtool support.
-case "$lt_target" in
+case $host in
 *-*-irix6*)
   # Find out which ABI we are using.
-  echo '#line 1482 "configure"' > conftest.$ac_ext
-  if { (eval echo configure:1483: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
-    case "`/usr/bin/file conftest.o`" in
+  echo '#line 2567 "configure"' > conftest.$ac_ext
+  if { (eval echo configure:2568: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+    case `/usr/bin/file conftest.$ac_objext` in
     *32-bit*)
       LD="${LD-ld} -32"
       ;;
@@ -1500,12 +2585,20 @@
   SAVE_CFLAGS="$CFLAGS"
   CFLAGS="$CFLAGS -belf"
   echo $ac_n "checking whether the C compiler needs -belf""... $ac_c" 1>&6
-echo "configure:1504: checking whether the C compiler needs -belf" >&5
+echo "configure:2589: checking whether the C compiler needs -belf" >&5
 if eval "test \"`echo '$''{'lt_cv_cc_needs_belf'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
-  cat > conftest.$ac_ext <<EOF
-#line 1509 "configure"
+  
+     ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+     cat > conftest.$ac_ext <<EOF
+#line 2602 "configure"
 #include "confdefs.h"
 
 int main() {
@@ -1512,7 +2605,7 @@
 
 ; return 0; }
 EOF
-if { (eval echo configure:1516: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2609: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   lt_cv_cc_needs_belf=yes
 else
@@ -1522,6 +2615,13 @@
   lt_cv_cc_needs_belf=no
 fi
 rm -f conftest*
+     ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
 fi
 
 echo "$ac_t""$lt_cv_cc_needs_belf" 1>&6
@@ -1534,173 +2634,2840 @@
 
 esac
 
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed='sed -e s/^X//'
+sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g'
 
-# Save cache, so that ltconfig can load it
-cat > confcache <<\EOF
-# This file is a shell script that caches the results of configure
-# tests run on this system so they can be shared between configure
-# scripts and configure runs.  It is not useful on other systems.
-# If it contains results you don't want to keep, you may remove or edit it.
-#
-# By default, configure uses ./config.cache as the cache file,
-# creating it if it does not exist already.  You can give configure
-# the --cache-file=FILE option to use a different cache file; that is
-# what configure does when it calls configure scripts in
-# subdirectories, so they share the cache.
-# Giving --cache-file=/dev/null disables caching, for debugging configure.
-# config.status only pays attention to the cache file if you give it the
-# --recheck option to rerun configure.
-#
-EOF
-# The following way of writing the cache mishandles newlines in values,
-# but we know of no workaround that is simple, portable, and efficient.
-# So, don't put newlines in cache variables' values.
-# Ultrix sh set writes to stderr and can't be redirected directly,
-# and sets the high bit in the cache file unless we assign to the vars.
-(set) 2>&1 |
-  case `(ac_space=' '; set | grep ac_space) 2>&1` in
-  *ac_space=\ *)
-    # `set' does not quote correctly, so add quotes (double-quote substitution
-    # turns \\\\ into \\, and sed turns \\ into \).
-    sed -n \
-      -e "s/'/'\\\\''/g" \
-      -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Constants:
+rm="rm -f"
+
+# Global variables:
+default_ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a `.a' archive for static linking (except M$VC,
+# which needs '.lib').
+libext=a
+ltmain="$ac_aux_dir/ltmain.sh"
+ofile="$default_ofile"
+with_gnu_ld="$lt_cv_prog_gnu_ld"
+need_locks="$enable_libtool_lock"
+
+old_CC="$CC"
+old_CFLAGS="$CFLAGS"
+
+# Set sane defaults for various variables
+test -z "$AR" && AR=ar
+test -z "$AR_FLAGS" && AR_FLAGS=cru
+test -z "$AS" && AS=as
+test -z "$CC" && CC=cc
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+test -z "$LD" && LD=ld
+test -z "$LN_S" && LN_S="ln -s"
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+test -z "$NM" && NM=nm
+test -z "$OBJDUMP" && OBJDUMP=objdump
+test -z "$RANLIB" && RANLIB=:
+test -z "$STRIP" && STRIP=:
+test -z "$ac_objext" && ac_objext=o
+
+if test x"$host" != x"$build"; then
+  ac_tool_prefix=${host_alias}-
+else
+  ac_tool_prefix=
+fi
+
+# Transform linux* to *-*-linux-gnu*, to support old configure scripts.
+case $host_os in
+linux-gnu*) ;;
+linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'`
+esac
+
+case $host_os in
+aix3*)
+  # AIX sometimes has problems with the GCC collect2 program.  For some
+  # reason, if we set the COLLECT_NAMES environment variable, the problems
+  # vanish in a puff of smoke.
+  if test "X${COLLECT_NAMES+set}" != Xset; then
+    COLLECT_NAMES=
+    export COLLECT_NAMES
+  fi
+  ;;
+esac
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+  case $host_os in
+  openbsd*)
+    old_postinstall_cmds="\$RANLIB -t \$oldlib~$old_postinstall_cmds"
     ;;
   *)
-    # `set' quotes correctly as required by POSIX, so do not add quotes.
-    sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
+    old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds"
     ;;
-  esac >> confcache
-if cmp -s $cache_file confcache; then
-  :
+  esac
+  old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
+fi
+
+# Allow CC to be a program name with arguments.
+set dummy $CC
+compiler="$2"
+
+echo $ac_n "checking for objdir""... $ac_c" 1>&6
+echo "configure:2729: checking for objdir" >&5
+rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+  objdir=.libs
 else
-  if test -w $cache_file; then
-    echo "updating cache $cache_file"
-    cat confcache > $cache_file
+  # MS-DOS does not allow filenames that begin with a dot.
+  objdir=_libs
+fi
+rmdir .libs 2>/dev/null
+echo "$ac_t""$objdir" 1>&6
+
+
+# Check whether --with-pic or --without-pic was given.
+if test "${with_pic+set}" = set; then
+  withval="$with_pic"
+  pic_mode="$withval"
+else
+  pic_mode=default
+fi
+
+test -z "$pic_mode" && pic_mode=default
+
+# We assume here that the value for lt_cv_prog_cc_pic will not be cached
+# in isolation, and that seeing it set (from the cache) indicates that
+# the associated values are set (in the cache) correctly too.
+echo $ac_n "checking for $compiler option to produce PIC""... $ac_c" 1>&6
+echo "configure:2756: checking for $compiler option to produce PIC" >&5
+if eval "test \"`echo '$''{'lt_cv_prog_cc_pic'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+   lt_cv_prog_cc_pic=
+  lt_cv_prog_cc_shlib=
+  lt_cv_prog_cc_wl=
+  lt_cv_prog_cc_static=
+  lt_cv_prog_cc_no_builtin=
+  lt_cv_prog_cc_can_build_shared=$can_build_shared
+
+  if test "$GCC" = yes; then
+    lt_cv_prog_cc_wl='-Wl,'
+    lt_cv_prog_cc_static='-static'
+
+    case $host_os in
+    aix*)
+      # Below there is a dirty hack to force normal static linking with -ldl
+      # The problem is because libdl dynamically linked with both libc and
+      # libC (AIX C++ library), which obviously doesn't included in libraries
+      # list by gcc. This cause undefined symbols with -static flags.
+      # This hack allows C programs to be linked with "-static -ldl", but
+      # not sure about C++ programs.
+      lt_cv_prog_cc_static="$lt_cv_prog_cc_static ${lt_cv_prog_cc_wl}-lC"
+      ;;
+    amigaos*)
+      # FIXME: we need at least 68020 code to build shared libraries, but
+      # adding the `-m68020' flag to GCC prevents building anything better,
+      # like `-m68040'.
+      lt_cv_prog_cc_pic='-m68020 -resident32 -malways-restore-a4'
+      ;;
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      lt_cv_prog_cc_pic='-fno-common'
+      ;;
+    cygwin* | mingw* | pw32* | os2*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      lt_cv_prog_cc_pic='-DDLL_EXPORT'
+      ;;
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	 lt_cv_prog_cc_pic=-Kconform_pic
+      fi
+      ;;
+    *)
+      lt_cv_prog_cc_pic='-fPIC'
+      ;;
+    esac
   else
-    echo "not updating unwritable cache $cache_file"
+    # PORTME Check for PIC flags for the system compiler.
+    case $host_os in
+    aix3* | aix4* | aix5*)
+      lt_cv_prog_cc_wl='-Wl,'
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	lt_cv_prog_cc_static='-Bstatic'
+      else
+	lt_cv_prog_cc_static='-bnso -bI:/lib/syscalls.exp'
+      fi
+      ;;
+
+    hpux9* | hpux10* | hpux11*)
+      # Is there a better lt_cv_prog_cc_static that works with the bundled CC?
+      lt_cv_prog_cc_wl='-Wl,'
+      lt_cv_prog_cc_static="${lt_cv_prog_cc_wl}-a ${lt_cv_prog_cc_wl}archive"
+      lt_cv_prog_cc_pic='+Z'
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      lt_cv_prog_cc_wl='-Wl,'
+      lt_cv_prog_cc_static='-non_shared'
+      # PIC (with -KPIC) is the default.
+      ;;
+
+    cygwin* | mingw* | pw32* | os2*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      lt_cv_prog_cc_pic='-DDLL_EXPORT'
+      ;;
+
+    newsos6)
+      lt_cv_prog_cc_pic='-KPIC'
+      lt_cv_prog_cc_static='-Bstatic'
+      ;;
+
+    osf3* | osf4* | osf5*)
+      # All OSF/1 code is PIC.
+      lt_cv_prog_cc_wl='-Wl,'
+      lt_cv_prog_cc_static='-non_shared'
+      ;;
+
+    sco3.2v5*)
+      lt_cv_prog_cc_pic='-Kpic'
+      lt_cv_prog_cc_static='-dn'
+      lt_cv_prog_cc_shlib='-belf'
+      ;;
+
+    solaris*)
+      lt_cv_prog_cc_pic='-KPIC'
+      lt_cv_prog_cc_static='-Bstatic'
+      lt_cv_prog_cc_wl='-Wl,'
+      ;;
+
+    sunos4*)
+      lt_cv_prog_cc_pic='-PIC'
+      lt_cv_prog_cc_static='-Bstatic'
+      lt_cv_prog_cc_wl='-Qoption ld '
+      ;;
+
+    sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+      lt_cv_prog_cc_pic='-KPIC'
+      lt_cv_prog_cc_static='-Bstatic'
+      if test "x$host_vendor" = xsni; then
+	lt_cv_prog_cc_wl='-LD'
+      else
+	lt_cv_prog_cc_wl='-Wl,'
+      fi
+      ;;
+
+    uts4*)
+      lt_cv_prog_cc_pic='-pic'
+      lt_cv_prog_cc_static='-Bstatic'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec ;then
+	lt_cv_prog_cc_pic='-Kconform_pic'
+	lt_cv_prog_cc_static='-Bstatic'
+      fi
+      ;;
+
+    *)
+      lt_cv_prog_cc_can_build_shared=no
+      ;;
+    esac
   fi
+
 fi
-rm -f confcache
 
+if test -z "$lt_cv_prog_cc_pic"; then
+  echo "$ac_t""none" 1>&6
+else
+  echo "$ac_t""$lt_cv_prog_cc_pic" 1>&6
 
-# Actually configure libtool.  ac_aux_dir is where install-sh is found.
-CC="$CC" CFLAGS="$CFLAGS" CPPFLAGS="$CPPFLAGS" \
-LD="$LD" LDFLAGS="$LDFLAGS" LIBS="$LIBS" \
-LN_S="$LN_S" NM="$NM" RANLIB="$RANLIB" \
-DLLTOOL="$DLLTOOL" AS="$AS" OBJDUMP="$OBJDUMP" \
-${CONFIG_SHELL-/bin/sh} $ac_aux_dir/ltconfig --no-reexec \
-$libtool_flags --no-verify $ac_aux_dir/ltmain.sh $lt_target \
-|| { echo "configure: error: libtool configure failed" 1>&2; exit 1; }
+  # Check to make sure the pic_flag actually works.
+  echo $ac_n "checking if $compiler PIC flag $lt_cv_prog_cc_pic works""... $ac_c" 1>&6
+echo "configure:2908: checking if $compiler PIC flag $lt_cv_prog_cc_pic works" >&5
+  if eval "test \"`echo '$''{'lt_cv_prog_cc_pic_works'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+      save_CFLAGS="$CFLAGS"
+    CFLAGS="$CFLAGS $lt_cv_prog_cc_pic -DPIC"
+    cat > conftest.$ac_ext <<EOF
+#line 2915 "configure"
+#include "confdefs.h"
 
-# Reload cache, that may have been modified by ltconfig
-if test -r "$cache_file"; then
-  echo "loading cache $cache_file"
-  . $cache_file
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:2922: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+        case $host_os in
+      hpux9* | hpux10* | hpux11*)
+	# On HP-UX, both CC and GCC only warn that PIC is supported... then
+	# they create non-PIC objects.  So, if there were any warnings, we
+	# assume that PIC is not supported.
+	if test -s conftest.err; then
+	  lt_cv_prog_cc_pic_works=no
+	else
+	  lt_cv_prog_cc_pic_works=yes
+	fi
+	;;
+      *)
+	lt_cv_prog_cc_pic_works=yes
+	;;
+      esac
+    
 else
-  echo "creating cache $cache_file"
-  > $cache_file
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+        lt_cv_prog_cc_pic_works=no
+    
 fi
+rm -f conftest*
+    CFLAGS="$save_CFLAGS"
+  
+fi
 
 
-# This can be used to rebuild libtool when needed
-LIBTOOL_DEPS="$ac_aux_dir/ltconfig $ac_aux_dir/ltmain.sh"
+  if test "X$lt_cv_prog_cc_pic_works" = Xno; then
+    lt_cv_prog_cc_pic=
+    lt_cv_prog_cc_can_build_shared=no
+  else
+    lt_cv_prog_cc_pic=" $lt_cv_prog_cc_pic"
+  fi
 
-# Always use our own libtool.
-LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+  echo "$ac_t""$lt_cv_prog_cc_pic_works" 1>&6
+fi
 
-# Redirect the config.log output again, so that the ltconfig log is not
-# clobbered by the next message.
-exec 5>>./config.log
+# Check for any special shared library compilation flags.
+if test -n "$lt_cv_prog_cc_shlib"; then
+  echo "configure: warning: \`$CC' requires \`$lt_cv_prog_cc_shlib' to build shared libraries" 1>&2
+  if echo "$old_CC $old_CFLAGS " | egrep -e "[ 	]$lt_cv_prog_cc_shlib[ 	]" >/dev/null; then :
+  else
+   echo "configure: warning: add \`$lt_cv_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure" 1>&2
+    lt_cv_prog_cc_can_build_shared=no
+  fi
+fi
 
+echo $ac_n "checking if $compiler static flag $lt_cv_prog_cc_static works""... $ac_c" 1>&6
+echo "configure:2974: checking if $compiler static flag $lt_cv_prog_cc_static works" >&5
+if eval "test \"`echo '$''{'lt_cv_prog_cc_static_works'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+    lt_cv_prog_cc_static_works=no
+  save_LDFLAGS="$LDFLAGS"
+  LDFLAGS="$LDFLAGS $lt_cv_prog_cc_static"
+  cat > conftest.$ac_ext <<EOF
+#line 2982 "configure"
+#include "confdefs.h"
 
-echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
-echo "configure:1619: checking how to run the C preprocessor" >&5
-# On Suns, sometimes $CPP names a directory.
-if test -n "$CPP" && test -d "$CPP"; then
-  CPP=
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:2989: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  lt_cv_prog_cc_static_works=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
 fi
-if test -z "$CPP"; then
-if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then
+rm -f conftest*
+  LDFLAGS="$save_LDFLAGS"
+
+fi
+
+
+# Belt *and* braces to stop my trousers falling down:
+test "X$lt_cv_prog_cc_static_works" = Xno && lt_cv_prog_cc_static=
+echo "$ac_t""$lt_cv_prog_cc_static_works" 1>&6
+
+pic_flag="$lt_cv_prog_cc_pic"
+special_shlib_compile_flags="$lt_cv_prog_cc_shlib"
+wl="$lt_cv_prog_cc_wl"
+link_static_flag="$lt_cv_prog_cc_static"
+no_builtin_flag="$lt_cv_prog_cc_no_builtin"
+can_build_shared="$lt_cv_prog_cc_can_build_shared"
+
+
+# Check to see if options -o and -c are simultaneously supported by compiler
+echo $ac_n "checking if $compiler supports -c -o file.$ac_objext""... $ac_c" 1>&6
+echo "configure:3016: checking if $compiler supports -c -o file.$ac_objext" >&5
+if eval "test \"`echo '$''{'lt_cv_compiler_c_o'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
-    # This must be in double quotes, not single quotes, because CPP may get
-  # substituted into the Makefile and "${CC-cc}" will confuse make.
-  CPP="${CC-cc} -E"
-  # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp.
+  
+$rm -r conftest 2>/dev/null
+mkdir conftest
+cd conftest
+echo "int some_variable = 0;" > conftest.$ac_ext
+mkdir out
+# According to Tom Tromey, Ian Lance Taylor reported there are C compilers
+# that will create temporary files in the current directory regardless of
+# the output directory.  Thus, making CWD read-only will cause this test
+# to fail, enabling locking or at least warning the user not to do parallel
+# builds.
+chmod -w .
+save_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS -o out/conftest2.$ac_objext"
+compiler_c_o=no
+if { (eval echo configure:3035: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>out/conftest.err; } && test -s out/conftest2.$ac_objext; then
+  # The compiler can only warn and ignore the option if not recognized
+  # So say no if there are warnings
+  if test -s out/conftest.err; then
+    lt_cv_compiler_c_o=no
+  else
+    lt_cv_compiler_c_o=yes
+  fi
+else
+  # Append any errors to the config.log.
+  cat out/conftest.err 1>&5
+  lt_cv_compiler_c_o=no
+fi
+CFLAGS="$save_CFLAGS"
+chmod u+w .
+$rm conftest* out/*
+rmdir out
+cd ..
+rmdir conftest
+$rm -r conftest 2>/dev/null
+
+fi
+
+compiler_c_o=$lt_cv_compiler_c_o
+echo "$ac_t""$compiler_c_o" 1>&6
+
+if test x"$compiler_c_o" = x"yes"; then
+  # Check to see if we can write to a .lo
+  echo $ac_n "checking if $compiler supports -c -o file.lo""... $ac_c" 1>&6
+echo "configure:3064: checking if $compiler supports -c -o file.lo" >&5
+  if eval "test \"`echo '$''{'lt_cv_compiler_o_lo'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  
+  lt_cv_compiler_o_lo=no
+  save_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS -c -o conftest.lo"
+  save_objext="$ac_objext"
+  ac_objext=lo
   cat > conftest.$ac_ext <<EOF
-#line 1634 "configure"
+#line 3075 "configure"
 #include "confdefs.h"
-#include <assert.h>
-Syntax Error
+
+int main() {
+int some_variable = 0;
+; return 0; }
 EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1640: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
-if test -z "$ac_err"; then
-  :
+if { (eval echo configure:3082: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+      # The compiler can only warn and ignore the option if not recognized
+    # So say no if there are warnings
+    if test -s conftest.err; then
+      lt_cv_compiler_o_lo=no
+    else
+      lt_cv_compiler_o_lo=yes
+    fi
+  
 else
-  echo "$ac_err" >&5
   echo "configure: failed program was:" >&5
   cat conftest.$ac_ext >&5
+fi
+rm -f conftest*
+  ac_objext="$save_objext"
+  CFLAGS="$save_CFLAGS"
+  
+fi
+
+  compiler_o_lo=$lt_cv_compiler_o_lo
+  echo "$ac_t""$compiler_o_lo" 1>&6
+else
+  compiler_o_lo=no
+fi
+
+# Check to see if we can do hard links to lock some files if needed
+hard_links="nottested"
+if test "$compiler_c_o" = no && test "$need_locks" != no; then
+  # do not overwrite the value of need_locks provided by the user
+  echo $ac_n "checking if we can lock with hard links""... $ac_c" 1>&6
+echo "configure:3113: checking if we can lock with hard links" >&5
+  hard_links=yes
+  $rm conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  echo "$ac_t""$hard_links" 1>&6
+  if test "$hard_links" = no; then
+    echo "configure: warning: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" 1>&2
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+
+if test "$GCC" = yes; then
+  # Check to see if options -fno-rtti -fno-exceptions are supported by compiler
+  echo $ac_n "checking if $compiler supports -fno-rtti -fno-exceptions""... $ac_c" 1>&6
+echo "configure:3132: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
+  echo "int some_variable = 0;" > conftest.$ac_ext
+  save_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS -fno-rtti -fno-exceptions -c conftest.$ac_ext"
+  compiler_rtti_exceptions=no
+  cat > conftest.$ac_ext <<EOF
+#line 3138 "configure"
+#include "confdefs.h"
+
+int main() {
+int some_variable = 0;
+; return 0; }
+EOF
+if { (eval echo configure:3145: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
-  CPP="${CC-cc} -E -traditional-cpp"
+      # The compiler can only warn and ignore the option if not recognized
+    # So say no if there are warnings
+    if test -s conftest.err; then
+      compiler_rtti_exceptions=no
+    else
+      compiler_rtti_exceptions=yes
+    fi
+  
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+fi
+rm -f conftest*
+  CFLAGS="$save_CFLAGS"
+  echo "$ac_t""$compiler_rtti_exceptions" 1>&6
+
+  if test "$compiler_rtti_exceptions" = "yes"; then
+    no_builtin_flag=' -fno-builtin -fno-rtti -fno-exceptions'
+  else
+    no_builtin_flag=' -fno-builtin'
+  fi
+fi
+
+# See if the linker supports building shared libraries.
+echo $ac_n "checking whether the linker ($LD) supports shared libraries""... $ac_c" 1>&6
+echo "configure:3172: checking whether the linker ($LD) supports shared libraries" >&5
+
+allow_undefined_flag=
+no_undefined_flag=
+need_lib_prefix=unknown
+need_version=unknown
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+archive_cmds=
+archive_expsym_cmds=
+old_archive_from_new_cmds=
+old_archive_from_expsyms_cmds=
+export_dynamic_flag_spec=
+whole_archive_flag_spec=
+thread_safe_flag_spec=
+hardcode_into_libs=no
+hardcode_libdir_flag_spec=
+hardcode_libdir_separator=
+hardcode_direct=no
+hardcode_minus_L=no
+hardcode_shlibpath_var=unsupported
+runpath_var=
+link_all_deplibs=unknown
+always_export_symbols=no
+export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | sed '\''s/.* //'\'' | sort | uniq > $export_symbols'
+# include_expsyms should be a list of space-separated symbols to be *always*
+# included in the symbol list
+include_expsyms=
+# exclude_expsyms can be an egrep regular expression of symbols to exclude
+# it will be wrapped by ` (' and `)$', so one must not match beginning or
+# end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+# as well as any symbol that contains `d'.
+exclude_expsyms="_GLOBAL_OFFSET_TABLE_"
+# Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+# platforms (ab)use it in PIC code, but their linkers get confused if
+# the symbol is explicitly referenced.  Since portable code cannot
+# rely on this symbol name, it's probably fine to never include it in
+# preloaded symbol tables.
+extract_expsyms_cmds=
+
+case $host_os in
+cygwin* | mingw* | pw32*)
+  # FIXME: the MSVC++ port hasn't been tested in a loooong time
+  # When not using gcc, we currently assume that we are using
+  # Microsoft Visual C++.
+  if test "$GCC" != yes; then
+    with_gnu_ld=no
+  fi
+  ;;
+openbsd*)
+  with_gnu_ld=no
+  ;;
+esac
+
+ld_shlibs=yes
+if test "$with_gnu_ld" = yes; then
+  # If archive_cmds runs LD, not CC, wlarc should be empty
+  wlarc='${wl}'
+
+  # See if GNU ld supports shared libraries.
+  case $host_os in
+  aix3* | aix4* | aix5*)
+    # On AIX, the GNU linker is very broken
+    # Note:Check GNU linker on AIX 5-IA64 when/if it becomes available.
+    ld_shlibs=no
+    cat <<EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.9.1, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support.  If you
+*** really care for shared libraries, you may want to modify your PATH
+*** so that a non-GNU linker is found, and then restart.
+
+EOF
+    ;;
+
+  amigaos*)
+    archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+    hardcode_libdir_flag_spec='-L$libdir'
+    hardcode_minus_L=yes
+
+    # Samuel A. Falvo II <[email protected]> reports
+    # that the semantics of dynamic libraries on AmigaOS, at least up
+    # to version 4, is to share data among multiple programs linked
+    # with the same dynamic library.  Since this doesn't match the
+    # behavior of shared libraries on other platforms, we can use
+    # them.
+    ld_shlibs=no
+    ;;
+
+  beos*)
+    if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then
+      allow_undefined_flag=unsupported
+      # Joseph Beckenbach <[email protected]> says some releases of gcc
+      # support --undefined.  This deserves some investigation.  FIXME
+      archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+    else
+      ld_shlibs=no
+    fi
+    ;;
+
+  cygwin* | mingw* | pw32*)
+    # hardcode_libdir_flag_spec is actually meaningless, as there is
+    # no search path for DLLs.
+    hardcode_libdir_flag_spec='-L$libdir'
+    allow_undefined_flag=unsupported
+    always_export_symbols=yes
+
+    extract_expsyms_cmds='test -f $output_objdir/impgen.c || \
+      sed -e "/^# \/\* impgen\.c starts here \*\//,/^# \/\* impgen.c ends here \*\// { s/^# //;s/^# *$//; p; }" -e d < $''0 > $output_objdir/impgen.c~
+      test -f $output_objdir/impgen.exe || (cd $output_objdir && \
+      if test "x$HOST_CC" != "x" ; then $HOST_CC -o impgen impgen.c ; \
+      else $CC -o impgen impgen.c ; fi)~
+      $output_objdir/impgen $dir/$soroot > $output_objdir/$soname-def'
+
+    old_archive_from_expsyms_cmds='$DLLTOOL --as=$AS --dllname $soname --def $output_objdir/$soname-def --output-lib $output_objdir/$newlib'
+
+    # cygwin and mingw dlls have different entry points and sets of symbols
+    # to exclude.
+    # FIXME: what about values for MSVC?
+    dll_entry=__cygwin_dll_entry@12
+    dll_exclude_symbols=DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12~
+    case $host_os in
+    mingw*)
+      # mingw values
+      dll_entry=_DllMainCRTStartup@12
+      dll_exclude_symbols=DllMain@12,DllMainCRTStartup@12,DllEntryPoint@12~
+      ;;
+    esac
+
+    # mingw and cygwin differ, and it's simplest to just exclude the union
+    # of the two symbol sets.
+    dll_exclude_symbols=DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12,DllMainCRTStartup@12,DllEntryPoint@12
+
+    # recent cygwin and mingw systems supply a stub DllMain which the user
+    # can override, but on older systems we have to supply one (in ltdll.c)
+    if test "x$lt_cv_need_dllmain" = "xyes"; then
+      ltdll_obj='$output_objdir/$soname-ltdll.'"$ac_objext "
+      ltdll_cmds='test -f $output_objdir/$soname-ltdll.c || sed -e "/^# \/\* ltdll\.c starts here \*\//,/^# \/\* ltdll.c ends here \*\// { s/^# //; p; }" -e d < $''0 > $output_objdir/$soname-ltdll.c~
+	test -f $output_objdir/$soname-ltdll.$ac_objext || (cd $output_objdir && $CC -c $soname-ltdll.c)~'
+    else
+      ltdll_obj=
+      ltdll_cmds=
+    fi
+
+    # Extract the symbol export list from an `--export-all' def file,
+    # then regenerate the def file from the symbol export list, so that
+    # the compiled dll only exports the symbol export list.
+    # Be careful not to strip the DATA tag left be newer dlltools.
+    export_symbols_cmds="$ltdll_cmds"'
+      $DLLTOOL --export-all --exclude-symbols '$dll_exclude_symbols' --output-def $output_objdir/$soname-def '$ltdll_obj'$libobjs $convenience~
+      sed -e "1,/EXPORTS/d" -e "s/ @ [0-9]*//" -e "s/ *;.*$//" < $output_objdir/$soname-def > $export_symbols'
+
+    # If the export-symbols file already is a .def file (1st line
+    # is EXPORTS), use it as is.
+    # If DATA tags from a recent dlltool are present, honour them!
+    archive_expsym_cmds='if test "x`head -1 $export_symbols`" = xEXPORTS; then
+	cp $export_symbols $output_objdir/$soname-def;
+      else
+	echo EXPORTS > $output_objdir/$soname-def;
+	_lt_hint=1;
+	cat $export_symbols | while read symbol; do
+	 set dummy \$symbol;
+	 case \$# in
+	   2) echo "   \$2 @ \$_lt_hint ; " >> $output_objdir/$soname-def;;
+	   *) echo "     \$2 @ \$_lt_hint \$3 ; " >> $output_objdir/$soname-def;;
+	 esac;
+	 _lt_hint=`expr 1 + \$_lt_hint`;
+	done;
+      fi~
+      '"$ltdll_cmds"'
+      $CC -Wl,--base-file,$output_objdir/$soname-base '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags~
+      $DLLTOOL --as=$AS --dllname $soname --exclude-symbols '$dll_exclude_symbols' --def $output_objdir/$soname-def --base-file $output_objdir/$soname-base --output-exp $output_objdir/$soname-exp~
+      $CC -Wl,--base-file,$output_objdir/$soname-base $output_objdir/$soname-exp '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags~
+      $DLLTOOL --as=$AS --dllname $soname --exclude-symbols '$dll_exclude_symbols' --def $output_objdir/$soname-def --base-file $output_objdir/$soname-base --output-exp $output_objdir/$soname-exp --output-lib $output_objdir/$libname.dll.a~
+      $CC $output_objdir/$soname-exp '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags'
+    ;;
+
+  netbsd*)
+    if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+      archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+      wlarc=
+    else
+      archive_cmds='$CC -shared -nodefaultlibs $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      archive_expsym_cmds='$CC -shared -nodefaultlibs $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+    fi
+    ;;
+
+  solaris* | sysv5*)
+    if $LD -v 2>&1 | egrep 'BFD 2\.8' > /dev/null; then
+      ld_shlibs=no
+      cat <<EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+EOF
+    elif $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then
+      archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+    else
+      ld_shlibs=no
+    fi
+    ;;
+
+  sunos4*)
+    archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+    wlarc=
+    hardcode_direct=yes
+    hardcode_shlibpath_var=no
+    ;;
+
+  *)
+    if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then
+      archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+    else
+      ld_shlibs=no
+    fi
+    ;;
+  esac
+
+  if test "$ld_shlibs" = yes; then
+    runpath_var=LD_RUN_PATH
+    hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir'
+    export_dynamic_flag_spec='${wl}--export-dynamic'
+    case $host_os in
+    cygwin* | mingw* | pw32*)
+      # dlltool doesn't understand --whole-archive et. al.
+      whole_archive_flag_spec=
+      ;;
+    *)
+      # ancient GNU ld didn't support --whole-archive et. al.
+      if $LD --help 2>&1 | egrep 'no-whole-archive' > /dev/null; then
+	whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+      else
+	whole_archive_flag_spec=
+      fi
+      ;;
+    esac
+  fi
+else
+  # PORTME fill in a description of your system's linker (not GNU ld)
+  case $host_os in
+  aix3*)
+    allow_undefined_flag=unsupported
+    always_export_symbols=yes
+    archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+    # Note: this linker hardcodes the directories in LIBPATH if there
+    # are no directories specified by -L.
+    hardcode_minus_L=yes
+    if test "$GCC" = yes && test -z "$link_static_flag"; then
+      # Neither direct hardcoding nor static linking is supported with a
+      # broken collect2.
+      hardcode_direct=unsupported
+    fi
+    ;;
+
+  aix4* | aix5*)
+    if test "$host_cpu" = ia64; then
+      # On IA64, the linker does run time linking by default, so we don't
+      # have to do anything special.
+      aix_use_runtimelinking=no
+      exp_sym_flag='-Bexport'
+      no_entry_flag=""
+    else
+      aix_use_runtimelinking=no
+
+      # Test if we are trying to use run time linking or normal
+      # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+      # need to do runtime linking.
+      case $host_os in aix4.[23]|aix4.[23].*|aix5*)
+	for ld_flag in $LDFLAGS; do
+	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+	    aix_use_runtimelinking=yes
+	    break
+	  fi
+	done
+      esac
+
+      exp_sym_flag='-bexport'
+      no_entry_flag='-bnoentry'
+    fi
+
+    # When large executables or shared objects are built, AIX ld can
+    # have problems creating the table of contents.  If linking a library
+    # or program results in "error TOC overflow" add -mminimal-toc to
+    # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+    # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+    hardcode_direct=yes
+    archive_cmds=''
+    hardcode_libdir_separator=':'
+    if test "$GCC" = yes; then
+      case $host_os in aix4.[012]|aix4.[012].*)
+	collect2name=`${CC} -print-prog-name=collect2`
+	if test -f "$collect2name" && \
+	  strings "$collect2name" | grep resolve_lib_name >/dev/null
+	then
+	  # We have reworked collect2
+	  hardcode_direct=yes
+	else
+	  # We have old collect2
+	  hardcode_direct=unsupported
+	  # It fails to find uninstalled libraries when the uninstalled
+	  # path is not listed in the libpath.  Setting hardcode_minus_L
+	  # to unsupported forces relinking
+	  hardcode_minus_L=yes
+	  hardcode_libdir_flag_spec='-L$libdir'
+	  hardcode_libdir_separator=
+	fi
+      esac
+
+      shared_flag='-shared'
+    else
+      # not using gcc
+      if test "$host_cpu" = ia64; then
+	shared_flag='${wl}-G'
+      else
+	if test "$aix_use_runtimelinking" = yes; then
+	  shared_flag='${wl}-G'
+	else
+	  shared_flag='${wl}-bM:SRE'
+	fi
+      fi
+    fi
+
+    # It seems that -bexpall can do strange things, so it is better to
+    # generate a list of symbols to export.
+    always_export_symbols=yes
+    if test "$aix_use_runtimelinking" = yes; then
+      # Warning - without using the other runtime loading flags (-brtl),
+      # -berok will link without error, but may produce a broken library.
+      allow_undefined_flag='-berok'
+      hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:/usr/lib:/lib'
+      archive_expsym_cmds="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+    else
+      if test "$host_cpu" = ia64; then
+	hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
+	allow_undefined_flag="-z nodefs"
+	archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname ${wl}-h$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols"
+      else
+	hardcode_libdir_flag_spec='${wl}-bnolibpath ${wl}-blibpath:$libdir:/usr/lib:/lib'
+	# Warning - without using the other run time loading flags,
+	# -berok will link without error, but may produce a broken library.
+	allow_undefined_flag='${wl}-berok'
+	# This is a bit strange, but is similar to how AIX traditionally builds
+	# it's shared libraries.
+	archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols"' ~$AR -crlo $objdir/$libname$release.a $objdir/$soname'
+      fi
+    fi
+    ;;
+
+  amigaos*)
+    archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+    hardcode_libdir_flag_spec='-L$libdir'
+    hardcode_minus_L=yes
+    # see comment about different semantics on the GNU ld section
+    ld_shlibs=no
+    ;;
+
+  cygwin* | mingw* | pw32*)
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    # hardcode_libdir_flag_spec is actually meaningless, as there is
+    # no search path for DLLs.
+    hardcode_libdir_flag_spec=' '
+    allow_undefined_flag=unsupported
+    # Tell ltmain to make .lib files, not .a files.
+    libext=lib
+    # FIXME: Setting linknames here is a bad hack.
+    archive_cmds='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | sed -e '\''s/ -lc$//'\''` -link -dll~linknames='
+    # The linker will automatically build a .lib file if we build a DLL.
+    old_archive_from_new_cmds='true'
+    # FIXME: Should let the user specify the lib program.
+    old_archive_cmds='lib /OUT:$oldlib$oldobjs$old_deplibs'
+    fix_srcfile_path='`cygpath -w "$srcfile"`'
+    ;;
+
+  darwin* | rhapsody*)
+    case "$host_os" in
+    rhapsody* | darwin1.[012])
+      allow_undefined_flag='-undefined suppress'
+      ;;
+    *) # Darwin 1.3 on
+      allow_undefined_flag='-flat_namespace -undefined suppress'
+      ;;
+    esac
+    # FIXME: Relying on posixy $() will cause problems for
+    #        cross-compilation, but unfortunately the echo tests do not
+    #        yet detect zsh echo's removal of \ escapes.  Also zsh mangles
+    #	     `"' quotes if we put them in here... so don't!
+    archive_cmds='$nonopt $(test .$module = .yes && echo -bundle || echo -dynamiclib) $allow_undefined_flag -o $lib $libobjs $deplibs$linker_flags -install_name $rpath/$soname $verstring'
+    # We need to add '_' to the symbols in $export_symbols first
+    #archive_expsym_cmds="$archive_cmds"' && strip -s $export_symbols'
+    hardcode_direct=yes
+    hardcode_shlibpath_var=no
+    whole_archive_flag_spec='-all_load $convenience'
+    ;;
+
+  freebsd1*)
+    ld_shlibs=no
+    ;;
+
+  # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+  # support.  Future versions do this automatically, but an explicit c++rt0.o
+  # does not break anything, and helps significantly (at the cost of a little
+  # extra space).
+  freebsd2.2*)
+    archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+    hardcode_libdir_flag_spec='-R$libdir'
+    hardcode_direct=yes
+    hardcode_shlibpath_var=no
+    ;;
+
+  # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+  freebsd2*)
+    archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+    hardcode_direct=yes
+    hardcode_minus_L=yes
+    hardcode_shlibpath_var=no
+    ;;
+
+  # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+  freebsd*)
+    archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
+    hardcode_libdir_flag_spec='-R$libdir'
+    hardcode_direct=yes
+    hardcode_shlibpath_var=no
+    ;;
+
+  hpux9* | hpux10* | hpux11*)
+    case $host_os in
+    hpux9*) archive_cmds='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' ;;
+    *) archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' ;;
+    esac
+    hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+    hardcode_libdir_separator=:
+    hardcode_direct=yes
+    hardcode_minus_L=yes # Not in the search PATH, but as the default
+			 # location of the library.
+    export_dynamic_flag_spec='${wl}-E'
+    ;;
+
+  irix5* | irix6* | nonstopux*)
+    if test "$GCC" = yes; then
+      archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+    else
+      archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+    fi
+    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+    hardcode_libdir_separator=:
+    link_all_deplibs=yes
+    ;;
+
+  netbsd*)
+    if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
+    else
+      archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
+    fi
+    hardcode_libdir_flag_spec='-R$libdir'
+    hardcode_direct=yes
+    hardcode_shlibpath_var=no
+    ;;
+
+  newsos6)
+    archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+    hardcode_direct=yes
+    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+    hardcode_libdir_separator=:
+    hardcode_shlibpath_var=no
+    ;;
+
+  openbsd*)
+    hardcode_direct=yes
+    hardcode_shlibpath_var=no
+    if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+      archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+      export_dynamic_flag_spec='${wl}-E'
+    else
+      case "$host_os" in
+      openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
+	archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+	hardcode_libdir_flag_spec='-R$libdir'
+        ;;
+      *)
+        archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $linker_flags'
+        hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+        ;;
+      esac
+    fi
+    ;;
+
+  os2*)
+    hardcode_libdir_flag_spec='-L$libdir'
+    hardcode_minus_L=yes
+    allow_undefined_flag=unsupported
+    archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+    old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+    ;;
+
+  osf3*)
+    if test "$GCC" = yes; then
+      allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
+      archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+    else
+      allow_undefined_flag=' -expect_unresolved \*'
+      archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+    fi
+    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+    hardcode_libdir_separator=:
+    ;;
+
+  osf4* | osf5*)	# as osf3* with the addition of -msym flag
+    if test "$GCC" = yes; then
+      allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
+      archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+    else
+      allow_undefined_flag=' -expect_unresolved \*'
+      archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+      archive_expsym_cmds='for i in `cat $export_symbols`; do printf "-exported_symbol " >> $lib.exp; echo "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~
+      $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp'
+
+      #Both c and cxx compiler support -rpath directly
+      hardcode_libdir_flag_spec='-rpath $libdir'
+    fi
+    hardcode_libdir_separator=:
+    ;;
+
+  sco3.2v5*)
+    archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+    hardcode_shlibpath_var=no
+    runpath_var=LD_RUN_PATH
+    hardcode_runpath_var=yes
+    export_dynamic_flag_spec='${wl}-Bexport'
+    ;;
+
+  solaris*)
+    # gcc --version < 3.0 without binutils cannot create self contained
+    # shared libraries reliably, requiring libgcc.a to resolve some of
+    # the object symbols generated in some cases.  Libraries that use
+    # assert need libgcc.a to resolve __eprintf, for example.  Linking
+    # a copy of libgcc.a into every shared library to guarantee resolving
+    # such symbols causes other problems:  According to Tim Van Holder
+    # <[email protected]>, C++ libraries end up with a separate
+    # (to the application) exception stack for one thing.
+    no_undefined_flag=' -z defs'
+    if test "$GCC" = yes; then
+      case `$CC --version 2>/dev/null` in
+      [12].*)
+	cat <<EOF 1>&2
+
+*** Warning: Releases of GCC earlier than version 3.0 cannot reliably
+*** create self contained shared libraries on Solaris systems, without
+*** introducing a dependency on libgcc.a.  Therefore, libtool is disabling
+*** -no-undefined support, which will at least allow you to build shared
+*** libraries.  However, you may find that when you link such libraries
+*** into an application without using GCC, you have to manually add
+*** \`gcc --print-libgcc-file-name\` to the link command.  We urge you to
+*** upgrade to a newer version of GCC.  Another option is to rebuild your
+*** current GCC to use the GNU linker from GNU binutils 2.9.1 or newer.
+
+EOF
+        no_undefined_flag=
+	;;
+      esac
+    fi
+    # $CC -shared without GNU ld will not create a library from C++
+    # object files and a static libstdc++, better avoid it by now
+    archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+    archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+		$LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
+    hardcode_libdir_flag_spec='-R$libdir'
+    hardcode_shlibpath_var=no
+    case $host_os in
+    solaris2.[0-5] | solaris2.[0-5].*) ;;
+    *) # Supported since Solaris 2.6 (maybe 2.5.1?)
+      whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;;
+    esac
+    link_all_deplibs=yes
+    ;;
+
+  sunos4*)
+    if test "x$host_vendor" = xsequent; then
+      # Use $CC to link under sequent, because it throws in some extra .o
+      # files that make .init and .fini sections work.
+      archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+    else
+      archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+    fi
+    hardcode_libdir_flag_spec='-L$libdir'
+    hardcode_direct=yes
+    hardcode_minus_L=yes
+    hardcode_shlibpath_var=no
+    ;;
+
+  sysv4)
+    if test "x$host_vendor" = xsno; then
+      archive_cmds='$LD -G -Bsymbolic -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct=yes # is this really true???
+    else
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct=no #Motorola manual says yes, but my tests say they lie
+    fi
+    runpath_var='LD_RUN_PATH'
+    hardcode_shlibpath_var=no
+    ;;
+
+  sysv4.3*)
+    archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+    hardcode_shlibpath_var=no
+    export_dynamic_flag_spec='-Bexport'
+    ;;
+
+  sysv5*)
+    no_undefined_flag=' -z text'
+    # $CC -shared without GNU ld will not create a library from C++
+    # object files and a static libstdc++, better avoid it by now
+    archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+    archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+		$LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
+    hardcode_libdir_flag_spec=
+    hardcode_shlibpath_var=no
+    runpath_var='LD_RUN_PATH'
+    ;;
+
+  uts4*)
+    archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+    hardcode_libdir_flag_spec='-L$libdir'
+    hardcode_shlibpath_var=no
+    ;;
+
+  dgux*)
+    archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+    hardcode_libdir_flag_spec='-L$libdir'
+    hardcode_shlibpath_var=no
+    ;;
+
+  sysv4*MP*)
+    if test -d /usr/nec; then
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_shlibpath_var=no
+      runpath_var=LD_RUN_PATH
+      hardcode_runpath_var=yes
+      ld_shlibs=yes
+    fi
+    ;;
+
+  sysv4.2uw2*)
+    archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+    hardcode_direct=yes
+    hardcode_minus_L=no
+    hardcode_shlibpath_var=no
+    hardcode_runpath_var=yes
+    runpath_var=LD_RUN_PATH
+    ;;
+
+  sysv5uw7* | unixware7*)
+    no_undefined_flag='${wl}-z ${wl}text'
+    if test "$GCC" = yes; then
+      archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+    else
+      archive_cmds='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+    fi
+    runpath_var='LD_RUN_PATH'
+    hardcode_shlibpath_var=no
+    ;;
+
+  *)
+    ld_shlibs=no
+    ;;
+  esac
+fi
+echo "$ac_t""$ld_shlibs" 1>&6
+test "$ld_shlibs" = no && can_build_shared=no
+
+# Check hardcoding attributes.
+echo $ac_n "checking how to hardcode library paths into programs""... $ac_c" 1>&6
+echo "configure:3857: checking how to hardcode library paths into programs" >&5
+hardcode_action=
+if test -n "$hardcode_libdir_flag_spec" || \
+   test -n "$runpath_var"; then
+
+  # We can hardcode non-existant directories.
+  if test "$hardcode_direct" != no &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test "$hardcode_shlibpath_var" != no &&
+     test "$hardcode_minus_L" != no; then
+    # Linking always hardcodes the temporary library directory.
+    hardcode_action=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    hardcode_action=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  hardcode_action=unsupported
+fi
+echo "$ac_t""$hardcode_action" 1>&6
+
+striplib=
+old_striplib=
+echo $ac_n "checking whether stripping libraries is possible""... $ac_c" 1>&6
+echo "configure:3885: checking whether stripping libraries is possible" >&5
+if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then
+  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+  echo "$ac_t""yes" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+# PORTME Fill in your ld.so characteristics
+echo $ac_n "checking dynamic linker characteristics""... $ac_c" 1>&6
+echo "configure:3899: checking dynamic linker characteristics" >&5
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+
+case $host_os in
+aix3*)
+  version_type=linux
+  library_names_spec='${libname}${release}.so$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX has no versioning support, so we append a major version to the name.
+  soname_spec='${libname}${release}.so$major'
+  ;;
+
+aix4* | aix5*)
+  version_type=linux
+  if test "$host_cpu" = ia64; then
+    # AIX 5 supports IA64
+    library_names_spec='${libname}${release}.so$major ${libname}${release}.so$versuffix $libname.so'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line `#! .'.  This would cause the generated library to
+    # depend on `.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[01] | aix4.[01].*)
+	if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+	     echo ' yes '
+	     echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then
+	  :
+	else
+	  can_build_shared=no
+	fi
+	;;
+    esac
+    # AIX (on Power*) has no versioning support, so currently we can
+    # not hardcode correct soname into executable. Probably we can
+    # add versioning support to collect2, so additional links can
+    # be useful in future.
+    if test "$aix_use_runtimelinking" = yes; then
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+    else
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='${libname}${release}.a $libname.a'
+      soname_spec='${libname}${release}.so$major'
+    fi
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  library_names_spec='$libname.ixlibrary $libname.a'
+  # Create ${libname}_ixlibrary.a entries in /sys/libs.
+  finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "(cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a)"; (cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a) || exit 1; done'
+  ;;
+
+beos*)
+  library_names_spec='${libname}.so'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi4*)
+  version_type=linux
+  need_version=no
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+  soname_spec='${libname}${release}.so$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  export_dynamic_flag_spec=-rdynamic
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32*)
+  version_type=windows
+  need_version=no
+  need_lib_prefix=no
+  case $GCC,$host_os in
+  yes,cygwin*)
+    library_names_spec='$libname.dll.a'
+    soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll'
+    postinstall_cmds='dlpath=`bash 2>&1 -c '\''. $dir/${file}i;echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog .libs/$dlname \$dldir/$dlname'
+    postuninstall_cmds='dldll=`bash 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $rm \$dlpath'
+    ;;
+  yes,mingw*)
+    library_names_spec='${libname}`echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll'
+    sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | sed -e "s/^libraries://" -e "s/;/ /g"`
+    ;;
+  yes,pw32*)
+    library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | sed -e 's/./-/g'`${versuffix}.dll'
+    ;;
+  *)
+    library_names_spec='${libname}`echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll $libname.lib'
+    ;;
+  esac
+  dynamic_linker='Win32 ld.exe'
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  # FIXME: Relying on posixy $() will cause problems for
+  #        cross-compilation, but unfortunately the echo tests do not
+  #        yet detect zsh echo's removal of \ escapes.
+  library_names_spec='${libname}${release}${versuffix}.$(test .$module = .yes && echo so || echo dylib) ${libname}${release}${major}.$(test .$module = .yes && echo so || echo dylib) ${libname}.$(test .$module = .yes && echo so || echo dylib)'
+  soname_spec='${libname}${release}${major}.$(test .$module = .yes && echo so || echo dylib)'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  ;;
+
+freebsd1*)
+  dynamic_linker=no
+  ;;
+
+freebsd*)
+  objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout`
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='${libname}${release}.so$versuffix $libname.so$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  *)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+gnu*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so${major} ${libname}.so'
+  soname_spec='${libname}${release}.so$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  dynamic_linker="$host_os dld.sl"
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  shlibpath_var=SHLIB_PATH
+  shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+  library_names_spec='${libname}${release}.sl$versuffix ${libname}${release}.sl$major $libname.sl'
+  soname_spec='${libname}${release}.sl$major'
+  # HP-UX runs *really* slowly unless shared libraries are mode 555.
+  postinstall_cmds='chmod 555 $lib'
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)          version_type=irix ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}.so$major'
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so $libname.so'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 ") libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 ") libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 ") libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux-gnuoldld* | linux-gnuaout* | linux-gnucoff*)
+  dynamic_linker=no
+  ;;
+
+# This must be Linux ELF.
+linux-gnu*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+  soname_spec='${libname}${release}.so$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+    library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so ${libname}.so'
+    soname_spec='${libname}${release}.so$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+openbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    case "$host_os" in
+    openbsd2.[89] | openbsd2.[89].*)
+      shlibpath_overrides_runpath=no
+      ;;
+    *)
+      shlibpath_overrides_runpath=yes
+      ;;
+    esac
+  else
+    shlibpath_overrides_runpath=yes
+  fi
+  library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+os2*)
+  libname_spec='$name'
+  need_lib_prefix=no
+  library_names_spec='$libname.dll $libname.a'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=LIBPATH
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_version=no
+  need_lib_prefix=no
+  soname_spec='${libname}${release}.so'
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  ;;
+
+sco3.2v5*)
+  version_type=osf
+  soname_spec='${libname}${release}.so$major'
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+solaris*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+  soname_spec='${libname}${release}.so$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test "$with_gnu_ld" = yes; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+  version_type=linux
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+  soname_spec='${libname}${release}.so$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+uts4*)
+  version_type=linux
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+  soname_spec='${libname}${release}.so$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+dgux*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+  soname_spec='${libname}${release}.so$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec ;then
+    version_type=linux
+    library_names_spec='$libname.so.$versuffix $libname.so.$major $libname.so'
+    soname_spec='$libname.so.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+echo "$ac_t""$dynamic_linker" 1>&6
+test "$dynamic_linker" = no && can_build_shared=no
+
+# Report the final consequences.
+echo $ac_n "checking if libtool supports shared libraries""... $ac_c" 1>&6
+echo "configure:4300: checking if libtool supports shared libraries" >&5
+echo "$ac_t""$can_build_shared" 1>&6
+
+echo $ac_n "checking whether to build shared libraries""... $ac_c" 1>&6
+echo "configure:4304: checking whether to build shared libraries" >&5
+test "$can_build_shared" = "no" && enable_shared=no
+
+# On AIX, shared libraries and static libraries use the same namespace, and
+# are all built from PIC.
+case "$host_os" in
+aix3*)
+  test "$enable_shared" = yes && enable_static=no
+  if test -n "$RANLIB"; then
+    archive_cmds="$archive_cmds~\$RANLIB \$lib"
+    postinstall_cmds='$RANLIB $lib'
+  fi
+  ;;
+
+aix4*)
+  if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+    test "$enable_shared" = yes && enable_static=no
+  fi
+  ;;
+esac
+echo "$ac_t""$enable_shared" 1>&6
+
+echo $ac_n "checking whether to build static libraries""... $ac_c" 1>&6
+echo "configure:4327: checking whether to build static libraries" >&5
+# Make sure either enable_shared or enable_static is yes.
+test "$enable_shared" = yes || enable_static=yes
+echo "$ac_t""$enable_static" 1>&6
+
+if test "$hardcode_action" = relink; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+     test "$enable_shared" = no; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test "x$enable_dlopen" != xyes; then
+  enable_dlopen=unknown
+  enable_dlopen_self=unknown
+  enable_dlopen_self_static=unknown
+else
+  lt_cv_dlopen=no
+  lt_cv_dlopen_libs=
+
+  case $host_os in
+  beos*)
+    lt_cv_dlopen="load_add_on"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ;;
+
+  cygwin* | mingw* | pw32*)
+    lt_cv_dlopen="LoadLibrary"
+    lt_cv_dlopen_libs=
+   ;;
+
+  *)
+    echo $ac_n "checking for shl_load""... $ac_c" 1>&6
+echo "configure:4368: checking for shl_load" >&5
+if eval "test \"`echo '$''{'ac_cv_func_shl_load'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
   cat > conftest.$ac_ext <<EOF
-#line 1651 "configure"
+#line 4373 "configure"
 #include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char shl_load(); below.  */
 #include <assert.h>
-Syntax Error
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char shl_load();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_shl_load) || defined (__stub___shl_load)
+choke me
+#else
+shl_load();
+#endif
+
+; return 0; }
 EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1657: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
-if test -z "$ac_err"; then
-  :
+if { (eval echo configure:4396: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_func_shl_load=yes"
 else
-  echo "$ac_err" >&5
   echo "configure: failed program was:" >&5
   cat conftest.$ac_ext >&5
   rm -rf conftest*
-  CPP="${CC-cc} -nologo -E"
+  eval "ac_cv_func_shl_load=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'shl_load`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  lt_cv_dlopen="shl_load"
+else
+  echo "$ac_t""no" 1>&6
+echo $ac_n "checking for shl_load in -ldld""... $ac_c" 1>&6
+echo "configure:4414: checking for shl_load in -ldld" >&5
+ac_lib_var=`echo dld'_'shl_load | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-ldld  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 4422 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char shl_load();
+
+int main() {
+shl_load()
+; return 0; }
+EOF
+if { (eval echo configure:4433: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld"
+else
+  echo "$ac_t""no" 1>&6
+echo $ac_n "checking for dlopen""... $ac_c" 1>&6
+echo "configure:4452: checking for dlopen" >&5
+if eval "test \"`echo '$''{'ac_cv_func_dlopen'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
   cat > conftest.$ac_ext <<EOF
-#line 1668 "configure"
+#line 4457 "configure"
 #include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char dlopen(); below.  */
 #include <assert.h>
-Syntax Error
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char dlopen();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_dlopen) || defined (__stub___dlopen)
+choke me
+#else
+dlopen();
+#endif
+
+; return 0; }
 EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1674: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
-if test -z "$ac_err"; then
-  :
+if { (eval echo configure:4480: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_func_dlopen=yes"
 else
-  echo "$ac_err" >&5
   echo "configure: failed program was:" >&5
   cat conftest.$ac_ext >&5
   rm -rf conftest*
-  CPP=/lib/cpp
+  eval "ac_cv_func_dlopen=no"
 fi
 rm -f conftest*
 fi
+
+if eval "test \"`echo '$ac_cv_func_'dlopen`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  lt_cv_dlopen="dlopen"
+else
+  echo "$ac_t""no" 1>&6
+echo $ac_n "checking for dlopen in -ldl""... $ac_c" 1>&6
+echo "configure:4498: checking for dlopen in -ldl" >&5
+ac_lib_var=`echo dl'_'dlopen | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-ldl  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 4506 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char dlopen();
+
+int main() {
+dlopen()
+; return 0; }
+EOF
+if { (eval echo configure:4517: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
 rm -f conftest*
+LIBS="$ac_save_LIBS"
+
 fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+else
+  echo "$ac_t""no" 1>&6
+echo $ac_n "checking for dlopen in -lsvld""... $ac_c" 1>&6
+echo "configure:4536: checking for dlopen in -lsvld" >&5
+ac_lib_var=`echo svld'_'dlopen | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-lsvld  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 4544 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char dlopen();
+
+int main() {
+dlopen()
+; return 0; }
+EOF
+if { (eval echo configure:4555: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
 rm -f conftest*
-  ac_cv_prog_CPP="$CPP"
+LIBS="$ac_save_LIBS"
+
 fi
-  CPP="$ac_cv_prog_CPP"
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"
 else
-  ac_cv_prog_CPP="$CPP"
+  echo "$ac_t""no" 1>&6
+echo $ac_n "checking for dld_link in -ldld""... $ac_c" 1>&6
+echo "configure:4574: checking for dld_link in -ldld" >&5
+ac_lib_var=`echo dld'_'dld_link | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-ldld  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 4582 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char dld_link();
+
+int main() {
+dld_link()
+; return 0; }
+EOF
+if { (eval echo configure:4593: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
 fi
-echo "$ac_t""$CPP" 1>&6
+rm -f conftest*
+LIBS="$ac_save_LIBS"
 
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+	      
+fi
+
+	    
+fi
+
+	  
+fi
+
+	
+fi
+
+      
+fi
+
+    ;;
+  esac
+
+  if test "x$lt_cv_dlopen" != xno; then
+    enable_dlopen=yes
+  else
+    enable_dlopen=no
+  fi
+
+  case $lt_cv_dlopen in
+  dlopen)
+    save_CPPFLAGS="$CPPFLAGS"
+        test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+    save_LDFLAGS="$LDFLAGS"
+    eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+    save_LIBS="$LIBS"
+    LIBS="$lt_cv_dlopen_libs $LIBS"
+
+    echo $ac_n "checking whether a program can dlopen itself""... $ac_c" 1>&6
+echo "configure:4649: checking whether a program can dlopen itself" >&5
+if eval "test \"`echo '$''{'lt_cv_dlopen_self'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  	  if test "$cross_compiling" = yes; then :
+  lt_cv_dlopen_self=cross
+else
+    lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<EOF
+#line 4659 "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL		RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL		DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL		0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW		DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW	RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW	DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW	0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+#ifdef __cplusplus
+extern "C" void exit (int);
+#endif
+
+void fnord() { int i=42;}
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+      /* dlclose (self); */
+    }
+
+    exit (status);
+}
+EOF
+  if { (eval echo configure:4720: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} 2>/dev/null; then
+    (./conftest; exit; ) 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;
+      x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;
+      x$lt_unknown|x*) lt_cv_dlopen_self=no ;;
+    esac
+  else :
+    # compilation failed
+    lt_cv_dlopen_self=no
+  fi
+fi
+rm -fr conftest*
+
+    
+fi
+
+echo "$ac_t""$lt_cv_dlopen_self" 1>&6
+
+    if test "x$lt_cv_dlopen_self" = xyes; then
+      LDFLAGS="$LDFLAGS $link_static_flag"
+      echo $ac_n "checking whether a statically linked program can dlopen itself""... $ac_c" 1>&6
+echo "configure:4743: checking whether a statically linked program can dlopen itself" >&5
+if eval "test \"`echo '$''{'lt_cv_dlopen_self_static'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  	  if test "$cross_compiling" = yes; then :
+  lt_cv_dlopen_self_static=cross
+else
+    lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<EOF
+#line 4753 "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL		RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL		DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL		0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW		DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW	RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW	DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW	0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+#ifdef __cplusplus
+extern "C" void exit (int);
+#endif
+
+void fnord() { int i=42;}
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+      /* dlclose (self); */
+    }
+
+    exit (status);
+}
+EOF
+  if { (eval echo configure:4814: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} 2>/dev/null; then
+    (./conftest; exit; ) 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;
+      x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;
+      x$lt_unknown|x*) lt_cv_dlopen_self_static=no ;;
+    esac
+  else :
+    # compilation failed
+    lt_cv_dlopen_self_static=no
+  fi
+fi
+rm -fr conftest*
+
+      
+fi
+
+echo "$ac_t""$lt_cv_dlopen_self_static" 1>&6
+    fi
+
+    CPPFLAGS="$save_CPPFLAGS"
+    LDFLAGS="$save_LDFLAGS"
+    LIBS="$save_LIBS"
+    ;;
+  esac
+
+  case $lt_cv_dlopen_self in
+  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+  *) enable_dlopen_self=unknown ;;
+  esac
+
+  case $lt_cv_dlopen_self_static in
+  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+  *) enable_dlopen_self_static=unknown ;;
+  esac
+fi
+
+
+if test "$enable_shared" = yes && test "$GCC" = yes; then
+  case $archive_cmds in
+  *'~'*)
+    # FIXME: we may have to deal with multi-command sequences.
+    ;;
+  '$CC '*)
+    # Test whether the compiler implicitly links with -lc since on some
+    # systems, -lgcc has to come before -lc. If gcc already passes -lc
+    # to ld, don't add -lc before -lgcc.
+    echo $ac_n "checking whether -lc should be explicitly linked in""... $ac_c" 1>&6
+echo "configure:4863: checking whether -lc should be explicitly linked in" >&5
+    if eval "test \"`echo '$''{'lt_cv_archive_cmds_need_lc'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  $rm conftest*
+    echo 'static int dummy;' > conftest.$ac_ext
+
+    if { (eval echo configure:4870: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+      soname=conftest
+      lib=conftest
+      libobjs=conftest.$ac_objext
+      deplibs=
+      wl=$lt_cv_prog_cc_wl
+      compiler_flags=-v
+      linker_flags=-v
+      verstring=
+      output_objdir=.
+      libname=conftest
+      save_allow_undefined_flag=$allow_undefined_flag
+      allow_undefined_flag=
+      if { (eval echo configure:4883: \"$archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\") 1>&5; (eval $archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5; }
+      then
+	lt_cv_archive_cmds_need_lc=no
+      else
+	lt_cv_archive_cmds_need_lc=yes
+      fi
+      allow_undefined_flag=$save_allow_undefined_flag
+    else
+      cat conftest.err 1>&5
+    fi
+fi
+
+    echo "$ac_t""$lt_cv_archive_cmds_need_lc" 1>&6
+    ;;
+  esac
+fi
+need_lc=${lt_cv_archive_cmds_need_lc-yes}
+
+# The second clause should only fire when bootstrapping the
+# libtool distribution, otherwise you forgot to ship ltmain.sh
+# with your package, and you will get complaints that there are
+# no rules to generate ltmain.sh.
+if test -f "$ltmain"; then
+  :
+else
+  # If there is no Makefile yet, we rely on a make rule to execute
+  # `config.status --recheck' to rerun these tests and create the
+  # libtool script then.
+  test -f Makefile && make "$ltmain"
+fi
+
+if test -f "$ltmain"; then
+  trap "$rm \"${ofile}T\"; exit 1" 1 2 15
+  $rm -f "${ofile}T"
+
+  echo creating $ofile
+
+  # Now quote all the things that may contain metacharacters while being
+  # careful not to overquote the AC_SUBSTed values.  We take copies of the
+  # variables and quote the copies for generation of the libtool script.
+  for var in echo old_CC old_CFLAGS \
+    AR AR_FLAGS CC LD LN_S NM SHELL \
+    reload_flag reload_cmds wl \
+    pic_flag link_static_flag no_builtin_flag export_dynamic_flag_spec \
+    thread_safe_flag_spec whole_archive_flag_spec libname_spec \
+    library_names_spec soname_spec \
+    RANLIB old_archive_cmds old_archive_from_new_cmds old_postinstall_cmds \
+    old_postuninstall_cmds archive_cmds archive_expsym_cmds postinstall_cmds \
+    postuninstall_cmds extract_expsyms_cmds old_archive_from_expsyms_cmds \
+    old_striplib striplib file_magic_cmd export_symbols_cmds \
+    deplibs_check_method allow_undefined_flag no_undefined_flag \
+    finish_cmds finish_eval global_symbol_pipe global_symbol_to_cdecl \
+    global_symbol_to_c_name_address \
+    hardcode_libdir_flag_spec hardcode_libdir_separator  \
+    sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
+    compiler_c_o compiler_o_lo need_locks exclude_expsyms include_expsyms; do
+
+    case $var in
+    reload_cmds | old_archive_cmds | old_archive_from_new_cmds | \
+    old_postinstall_cmds | old_postuninstall_cmds | \
+    export_symbols_cmds | archive_cmds | archive_expsym_cmds | \
+    extract_expsyms_cmds | old_archive_from_expsyms_cmds | \
+    postinstall_cmds | postuninstall_cmds | \
+    finish_cmds | sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
+      # Double-quote double-evaled strings.
+      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
+      ;;
+    *)
+      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
+      ;;
+    esac
+  done
+
+  cat <<__EOF__ > "${ofile}T"
+#! $SHELL
+
+# `$echo "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
+# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP)
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+#
+# Copyright (C) 1996-2000 Free Software Foundation, Inc.
+# Originally by Gordon Matzigkeit <[email protected]>, 1996
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Sed that helps us avoid accidentally triggering echo(1) options like -n.
+Xsed="sed -e s/^X//"
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+if test "X\${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi
+
+# ### BEGIN LIBTOOL CONFIG
+
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$need_lc
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# The host system.
+host_alias=$host_alias
+host=$host
+
+# An echo program that does not interpret backslashes.
+echo=$lt_echo
+
+# The archiver.
+AR=$lt_AR
+AR_FLAGS=$lt_AR_FLAGS
+
+# The default C compiler.
+CC=$lt_CC
+
+# Is the compiler the GNU C compiler?
+with_gcc=$GCC
+
+# The linker used to build libraries.
+LD=$lt_LD
+
+# Whether we need hard or soft links.
+LN_S=$lt_LN_S
+
+# A BSD-compatible nm program.
+NM=$lt_NM
+
+# A symbol stripping program
+STRIP=$STRIP
+
+# Used to examine libraries when file_magic_cmd begins "file"
+MAGIC_CMD=$MAGIC_CMD
+
+# Used on cygwin: DLL creation program.
+DLLTOOL="$DLLTOOL"
+
+# Used on cygwin: object dumper.
+OBJDUMP="$OBJDUMP"
+
+# Used on cygwin: assembler.
+AS="$AS"
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# How to pass a linker flag through the compiler.
+wl=$lt_wl
+
+# Object file suffix (normally "o").
+objext="$ac_objext"
+
+# Old archive suffix (normally "a").
+libext="$libext"
+
+# Executable file suffix (normally "").
+exeext="$exeext"
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_pic_flag
+pic_mode=$pic_mode
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_compiler_c_o
+
+# Can we write directly to a .lo ?
+compiler_o_lo=$lt_compiler_o_lo
+
+# Must we lock files when doing compilation ?
+need_locks=$lt_need_locks
+
+# Do we need the lib prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_link_static_flag
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_no_builtin_flag
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec
+
+# Compiler flag to generate thread-safe objects.
+thread_safe_flag_spec=$lt_thread_safe_flag_spec
+
+# Library versioning type.
+version_type=$version_type
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names.  First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME.
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Commands used to build and install an old-style archive.
+RANLIB=$lt_RANLIB
+old_archive_cmds=$lt_old_archive_cmds
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
+
+# Commands used to build and install a shared archive.
+archive_cmds=$lt_archive_cmds
+archive_expsym_cmds=$lt_archive_expsym_cmds
+postinstall_cmds=$lt_postinstall_cmds
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method == file_magic.
+file_magic_cmd=$lt_file_magic_cmd
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag
+
+# Flag that forces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# Same as above, but a single script fragment to be evaled but not shown.
+finish_eval=$lt_finish_eval
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration
+global_symbol_to_cdecl=$lt_global_symbol_to_cdecl
+
+# Transform the output of nm in a C name address pair
+global_symbol_to_c_name_address=$lt_global_symbol_to_c_name_address
+
+# This is the shared library runtime path variable.
+runpath_var=$runpath_var
+
+# This is the shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator
+
+# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct=$hardcode_direct
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L=$hardcode_minus_L
+
+# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
+# the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at relink time.
+variables_saved_for_relink="$variables_saved_for_relink"
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs
+
+# Compile-time system search path for libraries
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Run-time system search path for libraries
+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path="$fix_srcfile_path"
+
+# Set to yes if exported symbols are required.
+always_export_symbols=$always_export_symbols
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms
+
+# ### END LIBTOOL CONFIG
+
+__EOF__
+
+  case $host_os in
+  aix3*)
+    cat <<\EOF >> "${ofile}T"
+
+# AIX sometimes has problems with the GCC collect2 program.  For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test "X${COLLECT_NAMES+set}" != Xset; then
+  COLLECT_NAMES=
+  export COLLECT_NAMES
+fi
+EOF
+    ;;
+  esac
+
+  case $host_os in
+  cygwin* | mingw* | pw32* | os2*)
+    cat <<'EOF' >> "${ofile}T"
+      # This is a source program that is used to create dlls on Windows
+      # Don't remove nor modify the starting and closing comments
+# /* ltdll.c starts here */
+# #define WIN32_LEAN_AND_MEAN
+# #include <windows.h>
+# #undef WIN32_LEAN_AND_MEAN
+# #include <stdio.h>
+#
+# #ifndef __CYGWIN__
+# #  ifdef __CYGWIN32__
+# #    define __CYGWIN__ __CYGWIN32__
+# #  endif
+# #endif
+#
+# #ifdef __cplusplus
+# extern "C" {
+# #endif
+# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved);
+# #ifdef __cplusplus
+# }
+# #endif
+#
+# #ifdef __CYGWIN__
+# #include <cygwin/cygwin_dll.h>
+# DECLARE_CYGWIN_DLL( DllMain );
+# #endif
+# HINSTANCE __hDllInstance_base;
+#
+# BOOL APIENTRY
+# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved)
+# {
+#   __hDllInstance_base = hInst;
+#   return TRUE;
+# }
+# /* ltdll.c ends here */
+	# This is a source program that is used to create import libraries
+	# on Windows for dlls which lack them. Don't remove nor modify the
+	# starting and closing comments
+# /* impgen.c starts here */
+# /*   Copyright (C) 1999-2000 Free Software Foundation, Inc.
+#
+#  This file is part of GNU libtool.
+#
+#  This program is free software; you can redistribute it and/or modify
+#  it under the terms of the GNU General Public License as published by
+#  the Free Software Foundation; either version 2 of the License, or
+#  (at your option) any later version.
+#
+#  This program is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#  GNU General Public License for more details.
+#
+#  You should have received a copy of the GNU General Public License
+#  along with this program; if not, write to the Free Software
+#  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#  */
+#
+# #include <stdio.h>		/* for printf() */
+# #include <unistd.h>		/* for open(), lseek(), read() */
+# #include <fcntl.h>		/* for O_RDONLY, O_BINARY */
+# #include <string.h>		/* for strdup() */
+#
+# /* O_BINARY isn't required (or even defined sometimes) under Unix */
+# #ifndef O_BINARY
+# #define O_BINARY 0
+# #endif
+#
+# static unsigned int
+# pe_get16 (fd, offset)
+#      int fd;
+#      int offset;
+# {
+#   unsigned char b[2];
+#   lseek (fd, offset, SEEK_SET);
+#   read (fd, b, 2);
+#   return b[0] + (b[1]<<8);
+# }
+#
+# static unsigned int
+# pe_get32 (fd, offset)
+#     int fd;
+#     int offset;
+# {
+#   unsigned char b[4];
+#   lseek (fd, offset, SEEK_SET);
+#   read (fd, b, 4);
+#   return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24);
+# }
+#
+# static unsigned int
+# pe_as32 (ptr)
+#      void *ptr;
+# {
+#   unsigned char *b = ptr;
+#   return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24);
+# }
+#
+# int
+# main (argc, argv)
+#     int argc;
+#     char *argv[];
+# {
+#     int dll;
+#     unsigned long pe_header_offset, opthdr_ofs, num_entries, i;
+#     unsigned long export_rva, export_size, nsections, secptr, expptr;
+#     unsigned long name_rvas, nexp;
+#     unsigned char *expdata, *erva;
+#     char *filename, *dll_name;
+#
+#     filename = argv[1];
+#
+#     dll = open(filename, O_RDONLY|O_BINARY);
+#     if (dll < 1)
+# 	return 1;
+#
+#     dll_name = filename;
+#
+#     for (i=0; filename[i]; i++)
+# 	if (filename[i] == '/' || filename[i] == '\\'  || filename[i] == ':')
+# 	    dll_name = filename + i +1;
+#
+#     pe_header_offset = pe_get32 (dll, 0x3c);
+#     opthdr_ofs = pe_header_offset + 4 + 20;
+#     num_entries = pe_get32 (dll, opthdr_ofs + 92);
+#
+#     if (num_entries < 1) /* no exports */
+# 	return 1;
+#
+#     export_rva = pe_get32 (dll, opthdr_ofs + 96);
+#     export_size = pe_get32 (dll, opthdr_ofs + 100);
+#     nsections = pe_get16 (dll, pe_header_offset + 4 +2);
+#     secptr = (pe_header_offset + 4 + 20 +
+# 	      pe_get16 (dll, pe_header_offset + 4 + 16));
+#
+#     expptr = 0;
+#     for (i = 0; i < nsections; i++)
+#     {
+# 	char sname[8];
+# 	unsigned long secptr1 = secptr + 40 * i;
+# 	unsigned long vaddr = pe_get32 (dll, secptr1 + 12);
+# 	unsigned long vsize = pe_get32 (dll, secptr1 + 16);
+# 	unsigned long fptr = pe_get32 (dll, secptr1 + 20);
+# 	lseek(dll, secptr1, SEEK_SET);
+# 	read(dll, sname, 8);
+# 	if (vaddr <= export_rva && vaddr+vsize > export_rva)
+# 	{
+# 	    expptr = fptr + (export_rva - vaddr);
+# 	    if (export_rva + export_size > vaddr + vsize)
+# 		export_size = vsize - (export_rva - vaddr);
+# 	    break;
+# 	}
+#     }
+#
+#     expdata = (unsigned char*)malloc(export_size);
+#     lseek (dll, expptr, SEEK_SET);
+#     read (dll, expdata, export_size);
+#     erva = expdata - export_rva;
+#
+#     nexp = pe_as32 (expdata+24);
+#     name_rvas = pe_as32 (expdata+32);
+#
+#     printf ("EXPORTS\n");
+#     for (i = 0; i<nexp; i++)
+#     {
+# 	unsigned long name_rva = pe_as32 (erva+name_rvas+i*4);
+# 	printf ("\t%s @ %ld ;\n", erva+name_rva, 1+ i);
+#     }
+#
+#     return 0;
+# }
+# /* impgen.c ends here */
+
+EOF
+    ;;
+  esac
+
+  # We use sed instead of cat because bash on DJGPP gets confused if
+  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
+  # text mode, it properly converts lines to CR/LF.  This bash problem
+  # is reportedly fixed, but why not run on old versions too?
+  sed '$q' "$ltmain" >> "${ofile}T" || (rm -f "${ofile}T"; exit 1)
+
+  mv -f "${ofile}T" "$ofile" || \
+    (rm -f "$ofile" && cp "${ofile}T" "$ofile" && rm -f "${ofile}T")
+  chmod +x "$ofile"
+fi
+
+
+
+
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+
+# Prevent multiple expansion
+
+
+
 echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
-echo "configure:1699: checking for ANSI C header files" >&5
+echo "configure:5466: checking for ANSI C header files" >&5
 if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1704 "configure"
+#line 5471 "configure"
 #include "confdefs.h"
 #include <stdlib.h>
 #include <stdarg.h>
@@ -1708,7 +5475,7 @@
 #include <float.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1712: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:5479: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -1725,7 +5492,7 @@
 if test $ac_cv_header_stdc = yes; then
   # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
 cat > conftest.$ac_ext <<EOF
-#line 1729 "configure"
+#line 5496 "configure"
 #include "confdefs.h"
 #include <string.h>
 EOF
@@ -1743,7 +5510,7 @@
 if test $ac_cv_header_stdc = yes; then
   # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
 cat > conftest.$ac_ext <<EOF
-#line 1747 "configure"
+#line 5514 "configure"
 #include "confdefs.h"
 #include <stdlib.h>
 EOF
@@ -1764,7 +5531,7 @@
   :
 else
   cat > conftest.$ac_ext <<EOF
-#line 1768 "configure"
+#line 5535 "configure"
 #include "confdefs.h"
 #include <ctype.h>
 #define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
@@ -1775,7 +5542,7 @@
 exit (0); }
 
 EOF
-if { (eval echo configure:1779: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:5546: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   :
 else
@@ -1799,21 +5566,339 @@
 fi
 
 
+#====================================================================================
+# Finished checking, hande options.
+
+# Check whether --enable-justsrc or --disable-justsrc was given.
+if test "${enable_justsrc+set}" = set; then
+  enableval="$enable_justsrc"
+  ac_arg_justsrc="Y"
+else
+  ac_arg_justsrc="N"
+fi
+
+
+# Check whether --enable-gcc-pipe or --disable-gcc-pipe was given.
+if test "${enable_gcc_pipe+set}" = set; then
+  enableval="$enable_gcc_pipe"
+  ac_arg_gcc_pipe="N"
+else
+  ac_arg_gcc_pipe="Y"
+fi
+
+
+# Check whether --enable-gcc-opt or --disable-gcc-opt was given.
+if test "${enable_gcc_opt+set}" = set; then
+  enableval="$enable_gcc_opt"
+  ac_arg_gcc_opt="N"
+else
+  ac_arg_gcc_opt="Y"
+fi
+
+
+# Check whether --enable-force-broken-float or --disable-force-broken-float was given.
+if test "${enable_force_broken_float+set}" = set; then
+  enableval="$enable_force_broken_float"
+  ac_arg_broken_float="Y"
+else
+  ac_arg_broken_float="N"
+fi
+
+
+if test $ac_cv_prog_gcc = yes ; then
+	CFLAGS="$CFLAGS -W -Wstrict-prototypes -Wmissing-prototypes -Wall -pedantic"
+	if test "$ac_arg_gcc_opt" = "N" ; then
+		temp_CFLAGS=`echo $CFLAGS | sed "s/O2/O0/"`
+		CFLAGS=$temp_CFLAGS
+		echo "configure: warning: *** Compiler optimisations switched off. ***" 1>&2
+		fi
+
+	# Disable -Wall and -pedantic for Apple Darwin/Rhapsody.
+	# System headers on these systems are broken.
+	case "$target_os" in 
+		darwin* | rhapsody*)
+			temp_CFLAGS=`echo $CFLAGS | sed "s/-Wall -pedantic//"`
+		CFLAGS=$temp_CFLAGS
+			;;
+		*)
+			;;
+		esac
+	if test $ac_arg_gcc_pipe != "N" ; then
+	 	CFLAGS="$CFLAGS -pipe"
+	 	fi
+	fi
+	
+#====================================================================================
+# Large file support can be disabled.
+
+
+   # Check whether --enable-largefile or --disable-largefile was given.
+if test "${enable_largefile+set}" = set; then
+  enableval="$enable_largefile"
+  :
+fi
+
+   if test "$enable_largefile" != no; then
+     # Extract the first word of "${ac_tool_prefix}getconf", so it can be a program name with args.
+set dummy ${ac_tool_prefix}getconf; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:5646: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_GETCONF'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$GETCONF"; then
+  ac_cv_prog_GETCONF="$GETCONF" # Let the user override the test.
+else
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_GETCONF="${ac_tool_prefix}getconf"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  test -z "$ac_cv_prog_GETCONF" && ac_cv_prog_GETCONF="getconf"
+fi
+fi
+GETCONF="$ac_cv_prog_GETCONF"
+if test -n "$GETCONF"; then
+  echo "$ac_t""$GETCONF" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+
+
+     echo $ac_n "checking for CFLAGS value to request large file support""... $ac_c" 1>&6
+echo "configure:5676: checking for CFLAGS value to request large file support" >&5
+if eval "test \"`echo '$''{'ac_cv_sys_largefile_CFLAGS'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_cv_sys_largefile_CFLAGS=`($GETCONF LFS_CFLAGS) 2>/dev/null` || {
+	ac_cv_sys_largefile_CFLAGS=no
+	case "$host_os" in
+	   # IRIX 6.2 and later require cc -n32.
+	   irix6.[2-9]* | irix6.1[0-9]* | irix[7-9].* | irix[1-9][0-9]*)
+	     if test "$GCC" != yes; then
+	       ac_cv_sys_largefile_CFLAGS=-n32
+	     fi
+	     ac_save_CC="$CC"
+	     CC="$CC $ac_cv_sys_largefile_CFLAGS"
+	     cat > conftest.$ac_ext <<EOF
+#line 5691 "configure"
+#include "confdefs.h"
+
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:5698: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  :
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_sys_largefile_CFLAGS=no
+fi
+rm -f conftest*
+	     CC="$ac_save_CC"
+	   esac
+      }
+fi
+
+echo "$ac_t""$ac_cv_sys_largefile_CFLAGS" 1>&6
+     echo $ac_n "checking for LDFLAGS value to request large file support""... $ac_c" 1>&6
+echo "configure:5714: checking for LDFLAGS value to request large file support" >&5
+if eval "test \"`echo '$''{'ac_cv_sys_largefile_LDFLAGS'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_cv_sys_largefile_LDFLAGS=`($GETCONF LFS_LDFLAGS) 2>/dev/null` || {
+	ac_cv_sys_largefile_LDFLAGS=no
+	
+      }
+fi
+
+echo "$ac_t""$ac_cv_sys_largefile_LDFLAGS" 1>&6
+     echo $ac_n "checking for LIBS value to request large file support""... $ac_c" 1>&6
+echo "configure:5726: checking for LIBS value to request large file support" >&5
+if eval "test \"`echo '$''{'ac_cv_sys_largefile_LIBS'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_cv_sys_largefile_LIBS=`($GETCONF LFS_LIBS) 2>/dev/null` || {
+	ac_cv_sys_largefile_LIBS=no
+	
+      }
+fi
+
+echo "$ac_t""$ac_cv_sys_largefile_LIBS" 1>&6
+	
+     for ac_flag in $ac_cv_sys_largefile_CFLAGS no; do
+       case "$ac_flag" in
+       no) ;;
+       -D_FILE_OFFSET_BITS=*) ;;
+       -D_LARGEFILE_SOURCE | -D_LARGEFILE_SOURCE=*) ;;
+       -D_LARGE_FILES | -D_LARGE_FILES=*) ;;
+       -D?* | -I?*)
+	 case "$ac_flag" in
+   no) ;;
+   ?*)
+     case "$CPPFLAGS" in
+     '') CPPFLAGS="$ac_flag" ;;
+     *) CPPFLAGS=$CPPFLAGS' '"$ac_flag" ;;
+     esac ;;
+   esac ;;
+       *)
+	 case "$ac_flag" in
+   no) ;;
+   ?*)
+     case "$CFLAGS" in
+     '') CFLAGS="$ac_flag" ;;
+     *) CFLAGS=$CFLAGS' '"$ac_flag" ;;
+     esac ;;
+   esac ;;
+       esac
+     done
+     case "$ac_cv_sys_largefile_LDFLAGS" in
+   no) ;;
+   ?*)
+     case "$LDFLAGS" in
+     '') LDFLAGS="$ac_cv_sys_largefile_LDFLAGS" ;;
+     *) LDFLAGS=$LDFLAGS' '"$ac_cv_sys_largefile_LDFLAGS" ;;
+     esac ;;
+   esac
+     case "$ac_cv_sys_largefile_LIBS" in
+   no) ;;
+   ?*)
+     case "$LIBS" in
+     '') LIBS="$ac_cv_sys_largefile_LIBS" ;;
+     *) LIBS=$LIBS' '"$ac_cv_sys_largefile_LIBS" ;;
+     esac ;;
+   esac
+     echo $ac_n "checking for _FILE_OFFSET_BITS""... $ac_c" 1>&6
+echo "configure:5781: checking for _FILE_OFFSET_BITS" >&5
+if eval "test \"`echo '$''{'ac_cv_sys_file_offset_bits'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_cv_sys_file_offset_bits=no
+      
+      for ac_flag in $ac_cv_sys_largefile_CFLAGS no; do
+	case "$ac_flag" in
+	-D_FILE_OFFSET_BITS)
+	  ac_cv_sys_file_offset_bits=1 ;;
+	-D_FILE_OFFSET_BITS=*)
+	  ac_cv_sys_file_offset_bits=`expr " $ac_flag" : '[^=]*=\(.*\)'` ;;
+	esac
+      done
+      
+fi
+
+echo "$ac_t""$ac_cv_sys_file_offset_bits" 1>&6
+   if test "$ac_cv_sys_file_offset_bits" != no; then
+     cat >> confdefs.h <<EOF
+#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits
+EOF
+
+   fi
+       case "$host_os" in
+	# HP-UX 10.20 and later
+	hpux10.[2-9][0-9]* | hpux1[1-9]* | hpux[2-9][0-9]*)
+	  ac_cv_sys_file_offset_bits=64 ;;
+	esac
+     echo $ac_n "checking for _LARGEFILE_SOURCE""... $ac_c" 1>&6
+echo "configure:5811: checking for _LARGEFILE_SOURCE" >&5
+if eval "test \"`echo '$''{'ac_cv_sys_largefile_source'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_cv_sys_largefile_source=no
+      case "$host_os" in
+	# HP-UX 10.20 and later
+	hpux10.[2-9][0-9]* | hpux1[1-9]* | hpux[2-9][0-9]*)
+	  ac_cv_sys_largefile_source=1 ;;
+	esac
+      for ac_flag in $ac_cv_sys_largefile_CFLAGS no; do
+	case "$ac_flag" in
+	-D_LARGEFILE_SOURCE)
+	  ac_cv_sys_largefile_source=1 ;;
+	-D_LARGEFILE_SOURCE=*)
+	  ac_cv_sys_largefile_source=`expr " $ac_flag" : '[^=]*=\(.*\)'` ;;
+	esac
+      done
+      
+fi
+
+echo "$ac_t""$ac_cv_sys_largefile_source" 1>&6
+   if test "$ac_cv_sys_largefile_source" != no; then
+     cat >> confdefs.h <<EOF
+#define _LARGEFILE_SOURCE $ac_cv_sys_largefile_source
+EOF
+
+   fi
+     echo $ac_n "checking for _LARGE_FILES""... $ac_c" 1>&6
+echo "configure:5840: checking for _LARGE_FILES" >&5
+if eval "test \"`echo '$''{'ac_cv_sys_large_files'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_cv_sys_large_files=no
+      case "$host_os" in
+	# AIX 4.2 and later
+	aix4.[2-9]* | aix4.1[0-9]* | aix[5-9].* | aix[1-9][0-9]*)
+	  ac_cv_sys_large_files=1 ;;
+	esac
+      for ac_flag in $ac_cv_sys_largefile_CFLAGS no; do
+	case "$ac_flag" in
+	-D_LARGE_FILES)
+	  ac_cv_sys_large_files=1 ;;
+	-D_LARGE_FILES=*)
+	  ac_cv_sys_large_files=`expr " $ac_flag" : '[^=]*=\(.*\)'` ;;
+	esac
+      done
+      
+fi
+
+echo "$ac_t""$ac_cv_sys_large_files" 1>&6
+   if test "$ac_cv_sys_large_files" != no; then
+     cat >> confdefs.h <<EOF
+#define _LARGE_FILES $ac_cv_sys_large_files
+EOF
+
+   fi
+   fi
+  
+
+if test "$enable_largefile" != yes; then
+	if test x"$ac_cv_sys_largefile_CFLAGS" != xno ; then
+		CFLAGS="$CFLAGS $ac_cv_sys_largefile_CFLAGS"
+		fi
+	if test x"$ac_cv_sys_largefile_LDFLAGS" != xno ; then
+		LDFLAGS="$LDFLAGS $ac_cv_sys_largefile_LDFLAGS"
+		fi
+	if test x"$ac_cv_sys_largefile_LIBS" != xno ; then
+		LIBS="$LIBS $ac_cv_sys_largefile_LIBS"
+		fi
+else
+	echo "configure: warning: *** Disabling large file support." 1>&2
+	fi
+	
+#====================================================================================
+# Determine endian-ness of target processor.
+
 for ac_hdr in endian.h
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:1807: checking for $ac_hdr" >&5
+echo "configure:5892: checking for $ac_hdr" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1812 "configure"
+#line 5897 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1817: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:5902: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -1840,131 +5925,263 @@
 done
 
 
-for ac_func in fopen fread fwrite fclose fseek ftell malloc free snprintf vsnprintf
-do
-echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:1847: checking for $ac_func" >&5
-if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+echo $ac_n "checking determining processor byte ordering""... $ac_c" 1>&6
+echo "configure:5930: checking determining processor byte ordering" >&5
+if eval "test \"`echo '$''{'ac_cv_c_byte_order'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
-  cat > conftest.$ac_ext <<EOF
-#line 1852 "configure"
-#include "confdefs.h"
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char $ac_func(); below.  */
-#include <assert.h>
-/* Override any gcc2 internal prototype to avoid an error.  */
-/* We use char because int might match the return type of a gcc2
-    builtin and then its argument prototype would still apply.  */
-char $ac_func();
+  # Initialize to unknown
+ac_cv_c_byte_order=unknown
 
-int main() {
+if test $ac_cv_header_endian_h = yes ; then
 
-/* The GNU C library defines this for functions which it implements
-    to always fail with ENOSYS.  Some functions are actually named
-    something starting with __ and the normal name is an alias.  */
-#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
-choke me
-#else
-$ac_func();
-#endif
+	# First try <endian.h> which should set BYTE_ORDER.
 
+	cat > conftest.$ac_ext <<EOF
+#line 5942 "configure"
+#include "confdefs.h"
+
+		#include <endian.h>
+		#if BYTE_ORDER != LITTLE_ENDIAN
+			not big endian
+		#endif
+		
+int main() {
+return 0 ;
 ; return 0; }
 EOF
-if { (eval echo configure:1875: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5954: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
-  eval "ac_cv_func_$ac_func=yes"
+  ac_cv_c_byte_order=little
+		
 else
   echo "configure: failed program was:" >&5
   cat conftest.$ac_ext >&5
-  rm -rf conftest*
-  eval "ac_cv_func_$ac_func=no"
 fi
 rm -f conftest*
-fi
+				
+	cat > conftest.$ac_ext <<EOF
+#line 5965 "configure"
+#include "confdefs.h"
 
-if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
-  echo "$ac_t""yes" 1>&6
-    ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
-  cat >> confdefs.h <<EOF
-#define $ac_tr_func 1
+		#include <endian.h>
+		#if BYTE_ORDER != BIG_ENDIAN
+			not big endian
+		#endif
+		
+int main() {
+return 0 ;
+; return 0; }
 EOF
- 
+if { (eval echo configure:5977: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  ac_cv_c_byte_order=big
+		
 else
-  echo "$ac_t""no" 1>&6
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
 fi
-done
+rm -f conftest*
 
+	fi
 
-echo $ac_n "checking for size_t""... $ac_c" 1>&6
-echo "configure:1901: checking for size_t" >&5
-if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
+if test $ac_cv_c_byte_order = unknown ; then
+
+	cat > conftest.$ac_ext <<EOF
+#line 5992 "configure"
+#include "confdefs.h"
+
+		#include <sys/types.h>
+		#include <sys/param.h>
+		#if !BYTE_ORDER || !BIG_ENDIAN || !LITTLE_ENDIAN
+			bogus endian macros
+		#endif
+		
+int main() {
+return 0 ;
+; return 0; }
+EOF
+if { (eval echo configure:6005: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
   cat > conftest.$ac_ext <<EOF
-#line 1906 "configure"
+#line 6008 "configure"
 #include "confdefs.h"
-#include <sys/types.h>
-#if STDC_HEADERS
-#include <stdlib.h>
-#include <stddef.h>
-#endif
+
+			#include <sys/types.h>
+			#include <sys/param.h>
+			#if BYTE_ORDER != LITTLE_ENDIAN
+				not big endian
+			#endif
+			
+int main() {
+return 0 ;
+; return 0; }
 EOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  egrep "(^|[^a-zA-Z_0-9])size_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
+if { (eval echo configure:6021: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
-  ac_cv_type_size_t=yes
+  ac_cv_c_byte_order=little
+			
 else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+fi
+rm -f conftest*
+				
+		cat > conftest.$ac_ext <<EOF
+#line 6032 "configure"
+#include "confdefs.h"
+
+			#include <sys/types.h>
+			#include <sys/param.h>
+			#if BYTE_ORDER != LITTLE_ENDIAN
+				not big endian
+			#endif
+			
+int main() {
+return 0 ;
+; return 0; }
+EOF
+if { (eval echo configure:6045: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
-  ac_cv_type_size_t=no
+  ac_cv_c_byte_order=little
+			
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
 fi
 rm -f conftest*
 
+		
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
 fi
-echo "$ac_t""$ac_cv_type_size_t" 1>&6
-if test $ac_cv_type_size_t = no; then
-  cat >> confdefs.h <<\EOF
-#define size_t unsigned
-EOF
+rm -f conftest*
 
+ 	fi
+
+if test $ac_cv_c_byte_order = unknown ; then
+	if test $cross_compiling = yes ; then
+		# This is the last resort. Try to guess the target processor endian-ness
+		# by looking at the target CPU type.	
+		
+		case "$target_cpu" in
+			alpha* | i?86* | mipsel* | ia64*)
+				ac_cv_c_big_endian=0
+				ac_cv_c_little_endian=1
+				;;
+			
+			m68* | mips* | powerpc* | hppa* | sparc*)
+				ac_cv_c_big_endian=1
+				ac_cv_c_little_endian=0
+				;;
+	
+			esac
+		
+	else
+		if test "$cross_compiling" = yes; then
+  ac_cv_c_byte_order=unknown
+			
+else
+  cat > conftest.$ac_ext <<EOF
+#line 6088 "configure"
+#include "confdefs.h"
+
+		int main (void) 
+		{	/* Are we little or big endian?  From Harbison&Steele.  */
+			union
+			{	long l ;
+				char c [sizeof (long)] ;
+			} u ;
+			u.l = 1 ;
+			return (u.c [sizeof (long) - 1] == 1);
+			}
+			
+EOF
+if { (eval echo configure:6102: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+  :
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -fr conftest*
+  ac_cv_c_byte_order=big
 fi
+rm -fr conftest*
+fi
 
-echo $ac_n "checking for off_t""... $ac_c" 1>&6
-echo "configure:1934: checking for off_t" >&5
-if eval "test \"`echo '$''{'ac_cv_type_off_t'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
+
+		if test "$cross_compiling" = yes; then
+  ac_cv_c_byte_order=unknown
+			
 else
   cat > conftest.$ac_ext <<EOF
-#line 1939 "configure"
+#line 6120 "configure"
 #include "confdefs.h"
-#include <sys/types.h>
-#if STDC_HEADERS
-#include <stdlib.h>
-#include <stddef.h>
-#endif
+int main (void) 
+		{	/* Are we little or big endian?  From Harbison&Steele.  */
+			union
+			{	long l ;
+				char c [sizeof (long)] ;
+			} u ;
+			u.l = 1 ;
+			return (u.c [0] == 1);
+			}
 EOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  egrep "(^|[^a-zA-Z_0-9])off_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
-  rm -rf conftest*
-  ac_cv_type_off_t=yes
+if { (eval echo configure:6132: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+  :
 else
-  rm -rf conftest*
-  ac_cv_type_off_t=no
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -fr conftest*
+  ac_cv_c_byte_order=little
 fi
-rm -f conftest*
+rm -fr conftest*
+fi
 
+		fi	
+	fi
+
+
 fi
-echo "$ac_t""$ac_cv_type_off_t" 1>&6
-if test $ac_cv_type_off_t = no; then
-  cat >> confdefs.h <<\EOF
-#define off_t long
+
+echo "$ac_t""$ac_cv_c_byte_order" 1>&6
+
+
+if test $ac_cv_c_byte_order = big ; then
+	ac_cv_c_big_endian=1
+	ac_cv_c_little_endian=0
+elif test $ac_cv_c_byte_order = little ; then
+	ac_cv_c_big_endian=0
+	ac_cv_c_little_endian=1
+else
+	ac_cv_c_big_endian=0
+	ac_cv_c_little_endian=0
+
+	echo "configure: warning: *****************************************************************" 1>&2
+	echo "configure: warning: *** Not able to determine endian-ness of target processor.       " 1>&2
+	echo "configure: warning: *** The constants CPU_IS_BIG_ENDIAN and CPU_IS_LITTLE_ENDIAN in  " 1>&2
+	echo "configure: warning: *** src/config.h may need to be hand editied.                    " 1>&2
+	echo "configure: warning: *****************************************************************" 1>&2
+	fi
+
+
+
+cat >> confdefs.h <<EOF
+#define CPU_IS_BIG_ENDIAN ${ac_cv_c_big_endian}
 EOF
 
-fi
+cat >> confdefs.h <<EOF
+#define CPU_IS_LITTLE_ENDIAN ${ac_cv_c_little_endian}
+EOF
 
+	
+#====================================================================================
+# Check types and their sizes.
 
 echo $ac_n "checking size of short""... $ac_c" 1>&6
-echo "configure:1968: checking size of short" >&5
+echo "configure:6185: checking size of short" >&5
 if eval "test \"`echo '$''{'ac_cv_sizeof_short'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1972,7 +6189,7 @@
   ac_cv_sizeof_short=2
 else
   cat > conftest.$ac_ext <<EOF
-#line 1976 "configure"
+#line 6193 "configure"
 #include "confdefs.h"
 #include <stdio.h>
 #include <sys/types.h>
@@ -1984,7 +6201,7 @@
   exit(0);
 }
 EOF
-if { (eval echo configure:1988: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:6205: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   ac_cv_sizeof_short=`cat conftestval`
 else
@@ -2004,7 +6221,7 @@
 
 
 echo $ac_n "checking size of int""... $ac_c" 1>&6
-echo "configure:2008: checking size of int" >&5
+echo "configure:6225: checking size of int" >&5
 if eval "test \"`echo '$''{'ac_cv_sizeof_int'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -2012,7 +6229,7 @@
   ac_cv_sizeof_int=4
 else
   cat > conftest.$ac_ext <<EOF
-#line 2016 "configure"
+#line 6233 "configure"
 #include "confdefs.h"
 #include <stdio.h>
 #include <sys/types.h>
@@ -2024,7 +6241,7 @@
   exit(0);
 }
 EOF
-if { (eval echo configure:2028: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:6245: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   ac_cv_sizeof_int=`cat conftestval`
 else
@@ -2044,7 +6261,7 @@
 
 
 echo $ac_n "checking size of long""... $ac_c" 1>&6
-echo "configure:2048: checking size of long" >&5
+echo "configure:6265: checking size of long" >&5
 if eval "test \"`echo '$''{'ac_cv_sizeof_long'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -2052,7 +6269,7 @@
   ac_cv_sizeof_long=8
 else
   cat > conftest.$ac_ext <<EOF
-#line 2056 "configure"
+#line 6273 "configure"
 #include "confdefs.h"
 #include <stdio.h>
 #include <sys/types.h>
@@ -2064,7 +6281,7 @@
   exit(0);
 }
 EOF
-if { (eval echo configure:2068: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:6285: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   ac_cv_sizeof_long=`cat conftestval`
 else
@@ -2084,7 +6301,7 @@
 
 
 echo $ac_n "checking size of float""... $ac_c" 1>&6
-echo "configure:2088: checking size of float" >&5
+echo "configure:6305: checking size of float" >&5
 if eval "test \"`echo '$''{'ac_cv_sizeof_float'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -2092,7 +6309,7 @@
   ac_cv_sizeof_float=4
 else
   cat > conftest.$ac_ext <<EOF
-#line 2096 "configure"
+#line 6313 "configure"
 #include "confdefs.h"
 #include <stdio.h>
 #include <sys/types.h>
@@ -2104,7 +6321,7 @@
   exit(0);
 }
 EOF
-if { (eval echo configure:2108: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:6325: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   ac_cv_sizeof_float=`cat conftestval`
 else
@@ -2124,7 +6341,7 @@
 
 
 echo $ac_n "checking size of double""... $ac_c" 1>&6
-echo "configure:2128: checking size of double" >&5
+echo "configure:6345: checking size of double" >&5
 if eval "test \"`echo '$''{'ac_cv_sizeof_double'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -2132,7 +6349,7 @@
   ac_cv_sizeof_double=4
 else
   cat > conftest.$ac_ext <<EOF
-#line 2136 "configure"
+#line 6353 "configure"
 #include "confdefs.h"
 #include <stdio.h>
 #include <sys/types.h>
@@ -2144,7 +6361,7 @@
   exit(0);
 }
 EOF
-if { (eval echo configure:2148: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:6365: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   ac_cv_sizeof_double=`cat conftestval`
 else
@@ -2164,7 +6381,7 @@
 
 
 echo $ac_n "checking size of void*""... $ac_c" 1>&6
-echo "configure:2168: checking size of void*" >&5
+echo "configure:6385: checking size of void*" >&5
 if eval "test \"`echo '$''{'ac_cv_sizeof_voidp'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -2172,7 +6389,7 @@
   ac_cv_sizeof_voidp=8
 else
   cat > conftest.$ac_ext <<EOF
-#line 2176 "configure"
+#line 6393 "configure"
 #include "confdefs.h"
 #include <stdio.h>
 #include <sys/types.h>
@@ -2184,7 +6401,7 @@
   exit(0);
 }
 EOF
-if { (eval echo configure:2188: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:6405: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   ac_cv_sizeof_voidp=`cat conftestval`
 else
@@ -2203,61 +6420,337 @@
 EOF
 
 
+echo $ac_n "checking size of off_t""... $ac_c" 1>&6
+echo "configure:6425: checking size of off_t" >&5
+if eval "test \"`echo '$''{'ac_cv_sizeof_off_t'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test "$cross_compiling" = yes; then
+  ac_cv_sizeof_off_t=8
+else
+  cat > conftest.$ac_ext <<EOF
+#line 6433 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+#include <sys/types.h>
+main()
+{
+  FILE *f=fopen("conftestval", "w");
+  if (!f) exit(1);
+  fprintf(f, "%d\n", sizeof(off_t));
+  exit(0);
+}
+EOF
+if { (eval echo configure:6445: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+  ac_cv_sizeof_off_t=`cat conftestval`
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -fr conftest*
+  ac_cv_sizeof_off_t=0
+fi
+rm -fr conftest*
+fi
 
-# Check whether --enable-justsrc or --disable-justsrc was given.
-if test "${enable_justsrc+set}" = set; then
-  enableval="$enable_justsrc"
-  ac_arg_justsrc="Y"
+fi
+echo "$ac_t""$ac_cv_sizeof_off_t" 1>&6
+cat >> confdefs.h <<EOF
+#define SIZEOF_OFF_T $ac_cv_sizeof_off_t
+EOF
+
+
+
+#====================================================================================
+# Check for functions.
+
+for ac_func in malloc free
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:6471: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
 else
-  ac_arg_justsrc="N"
+  cat > conftest.$ac_ext <<EOF
+#line 6476 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func(); below.  */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:6499: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_func_$ac_func=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_func_$ac_func=no"
 fi
+rm -f conftest*
+fi
 
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+    ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+ 
+else
+  echo "$ac_t""no" 1>&6
+fi
+done
 
-# Check whether --enable-gcc-pipe or --disable-gcc-pipe was given.
-if test "${enable_gcc_pipe+set}" = set; then
-  enableval="$enable_gcc_pipe"
-  ac_arg_gcc_pipe="N"
+for ac_func in open read write lseek fstat
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:6526: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
 else
-  ac_arg_gcc_pipe="Y"
+  cat > conftest.$ac_ext <<EOF
+#line 6531 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func(); below.  */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:6554: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_func_$ac_func=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_func_$ac_func=no"
 fi
+rm -f conftest*
+fi
 
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+    ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+ 
+else
+  echo "$ac_t""no" 1>&6
+fi
+done
 
-# Check whether --enable-gcc-opt or --disable-gcc-opt was given.
-if test "${enable_gcc_opt+set}" = set; then
-  enableval="$enable_gcc_opt"
-  ac_arg_gcc_opt="N"
+for ac_func in snprintf vsnprintf
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:6581: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
 else
-  ac_arg_gcc_opt="Y"
+  cat > conftest.$ac_ext <<EOF
+#line 6586 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func(); below.  */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:6609: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_func_$ac_func=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_func_$ac_func=no"
 fi
+rm -f conftest*
+fi
 
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+    ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+ 
+else
+  echo "$ac_t""no" 1>&6
+fi
+done
 
-# Check whether --enable-force-broken-float or --disable-force-broken-float was given.
-if test "${enable_force_broken_float+set}" = set; then
-  enableval="$enable_force_broken_float"
-  ac_arg_broken_float="Y"
+
+echo $ac_n "checking for lrint""... $ac_c" 1>&6
+echo "configure:6635: checking for lrint" >&5
+if eval "test \"`echo '$''{'ac_cv_c99_lrint'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
 else
-  ac_arg_broken_float="N"
+  
+lrint_save_CFLAGS=$CFLAGS
+CFLAGS="-O2"
+cat > conftest.$ac_ext <<EOF
+#line 6643 "configure"
+#include "confdefs.h"
+
+#define		_ISOC9X_SOURCE	1
+#define 	_ISOC99_SOURCE	1
+#define		__USE_ISOC99	1
+#define 	__USE_ISOC9X	1
+
+#include <math.h>
+
+int main() {
+if (!lrint(3.14159)) lrint(2.7183);
+; return 0; }
+EOF
+if { (eval echo configure:6657: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  ac_cv_c99_lrint=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_c99_lrint=no
 fi
+rm -f conftest*
 
+CFLAGS=$lrint_save_CFLAGS
 
-if test $ac_cv_prog_gcc = yes ; then
-	CFLAGS="$CFLAGS -g -O2 -Wstrict-prototypes"
-	if test "$ac_arg_gcc_opt" = "N" ; then
-		CFLAGS="$CFLAGS -g -O0 -Wstrict-prototypes"
-		echo "configure: warning: *** Compiler optimisations switched off. ***" 1>&2
-		fi
-			case "$target_os" in 
-		darwin* | rhapsody*)
-			;;
-		*)
-			CFLAGS="$CFLAGS -Wall -pedantic"
-			;;
-		esac
-	if test $ac_arg_gcc_pipe != "N" ; then
-	 	CFLAGS="$CFLAGS -pipe"
-	 	fi
+
+fi
+
+echo "$ac_t""$ac_cv_c99_lrint" 1>&6
+
+if test "$ac_cv_c99_lrint" = yes; then
+  cat >> confdefs.h <<\EOF
+#define HAVE_LRINT 1
+EOF
+
+fi
+
+echo $ac_n "checking for lrintf""... $ac_c" 1>&6
+echo "configure:6683: checking for lrintf" >&5
+if eval "test \"`echo '$''{'ac_cv_c99_lrintf'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  
+lrintf_save_CFLAGS=$CFLAGS
+CFLAGS="-O2"
+cat > conftest.$ac_ext <<EOF
+#line 6691 "configure"
+#include "confdefs.h"
+
+#define		_ISOC9X_SOURCE	1
+#define 	_ISOC99_SOURCE	1
+#define		__USE_ISOC99	1
+#define 	__USE_ISOC9X	1
+
+#include <math.h>
+
+int main() {
+if (!lrintf(3.14159)) lrintf(2.7183);
+; return 0; }
+EOF
+if { (eval echo configure:6705: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  ac_cv_c99_lrintf=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_c99_lrintf=no
+fi
+rm -f conftest*
+
+CFLAGS=$lrintf_save_CFLAGS
+
+
+fi
+
+echo "$ac_t""$ac_cv_c99_lrintf" 1>&6
+
+if test "$ac_cv_c99_lrintf" = yes; then
+  cat >> confdefs.h <<\EOF
+#define HAVE_LRINTF 1
+EOF
+
+fi
+
+
+if test $ac_cv_c99_lrint = no || test $ac_cv_c99_lrintf = no ; then
+	echo "configure: warning: *** Missing C99 standard functions lrint() and lrintf()." 1>&2
+	echo "configure: warning: *** This may cause benign compiler warnings on some systems (ie Solaris)." 1>&2
 	fi
-	
+
+#====================================================================================
+# Find known target OS.
+
+OS_SPECIFIC_INCLUDES=""
+
+case "$target_os" in 
+	darwin* | rhapsody*)
+		OS_SPECIFIC_INCLUDES="-fpascal-strings -I/Developer/Headers/FlatCarbon"
+		OS_SPECIFIC_LINKS="-framework CoreAudio"
+		;;
+	*)
+		OS_SPECIFIC_INCLUDES=""
+		OS_SPECIFIC_LINKS=""
+		;;
+	esac
+
+#====================================================================================
+# Test for sanity when cross-compiling.
+
 if test $cross_compiling = yes ; then
 	echo "configure: warning: ******************************************************************" 1>&2
 	echo "configure: warning: *** We are cross-compiling, so have to assume sizeof (short) == 2 " 1>&2
@@ -2266,12 +6759,6 @@
 	echo "configure: warning: ******************************************************************" 1>&2
 	fi
 	
-if test $ac_cv_sizeof_int != 4 ; then
-	echo "configure: warning: ******************************************************************" 1>&2
-	echo "configure: warning: *** sizeof (int) != 4                                             " 1>&2
-	echo "configure: warning: ******************************************************************" 1>&2
-	fi
-
 if test $ac_cv_sizeof_short != 2 ; then
 	echo "configure: warning: ******************************************************************" 1>&2
 	echo "configure: warning: *** sizeof (short) != 2.                                          " 1>&2
@@ -2278,6 +6765,12 @@
 	echo "configure: warning: ******************************************************************" 1>&2
 	fi
 	
+if test $ac_cv_sizeof_int != 4 ; then
+	echo "configure: warning: ******************************************************************" 1>&2
+	echo "configure: warning: *** sizeof (int) != 4                                             " 1>&2
+	echo "configure: warning: ******************************************************************" 1>&2
+	fi
+
 if test $ac_cv_sizeof_float != 4 ; then
 	echo "configure: warning: ******************************************************************" 1>&2
 	echo "configure: warning: *** sizeof (float) != 4.                                          " 1>&2
@@ -2290,38 +6783,10 @@
 	echo "configure: warning: ******************************************************************" 1>&2
 	fi
 
-case "$target_cpu" in
-	alpha* | i?86 )
-		cat >> confdefs.h <<\EOF
-#define GUESS_LITTLE_ENDIAN 1
-EOF
+#====================================================================================
+# Now use the information from the checking stage.
 
-		cat >> confdefs.h <<\EOF
-#define GUESS_BIG_ENDIAN 0
-EOF
-
-		;;
-		
-	hppa* | m68* | mips* | powerpc* | hppa* | sparc*)
-		cat >> confdefs.h <<\EOF
-#define GUESS_LITTLE_ENDIAN 0
-EOF
-
-		cat >> confdefs.h <<\EOF
-#define GUESS_BIG_ENDIAN 1
-EOF
-
-		;;
-
-	*)
-		echo "configure: warning: *****************************************************************" 1>&2
-		echo "configure: warning: *** Not able to determine endian-ness of processor.              " 1>&2
-		echo "configure: warning: *** You will need to edit src/config.h before compiling.         " 1>&2
-		echo "configure: warning: *****************************************************************" 1>&2
-		;;
-esac
-
-subdirs="src/GSM610 src/G72x src"
+subdirs="src Win32 MacOS"    		# Do not add src/GSM610 or src/G72x here.
 if test $ac_arg_justsrc = "N" ; then
 	subdirs="$subdirs examples doc tests"
 	fi
@@ -2338,10 +6803,23 @@
 EOF
 
 	fi
- 
 
+cat >> confdefs.h <<\EOF
+#define OS_IS_WIN32 0
+EOF
 
 
+if test x"$CFLAGS" = x ; then
+	echo "Error in configure script. CFLAGS has been screwed up."
+	exit
+	fi
+
+
+
+
+
+
+
 trap '' 1 2 15
 cat > confcache <<\EOF
 # This file is a shell script that caches the results of configure
@@ -2445,7 +6923,7 @@
 
 trap 'rm -fr `echo "Makefile src/Makefile src/GSM610/Makefile src/G72x/Makefile \
 			examples/Makefile tests/Makefile doc/Makefile Win32/Makefile \
-			MacOS/Makefile libsndfile.spec src/config.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
+			MacOS/Makefile libsndfile.spec sndfile.pc src/config.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
 EOF
 cat >> $CONFIG_STATUS <<EOF
 
@@ -2503,13 +6981,22 @@
 s%@AUTOHEADER@%$AUTOHEADER%g
 s%@MAKEINFO@%$MAKEINFO%g
 s%@SET_MAKE@%$SET_MAKE%g
+s%@autogen@%$autogen%g
 s%@CC@%$CC%g
 s%@LN_S@%$LN_S%g
+s%@OBJEXT@%$OBJEXT%g
+s%@EXEEXT@%$EXEEXT%g
+s%@ECHO@%$ECHO%g
 s%@RANLIB@%$RANLIB%g
-s%@LIBTOOL@%$LIBTOOL%g
+s%@STRIP@%$STRIP%g
 s%@CPP@%$CPP%g
+s%@LIBTOOL@%$LIBTOOL%g
+s%@GETCONF@%$GETCONF%g
 s%@subdirs@%$subdirs%g
+s%@ac_cv_sys_largefile_CFLAGS@%$ac_cv_sys_largefile_CFLAGS%g
 s%@SHARED_VERSION_INFO@%$SHARED_VERSION_INFO%g
+s%@OS_SPECIFIC_INCLUDES@%$OS_SPECIFIC_INCLUDES%g
+s%@OS_SPECIFIC_LINKS@%$OS_SPECIFIC_LINKS%g
 
 CEOF
 EOF
@@ -2553,7 +7040,7 @@
 
 CONFIG_FILES=\${CONFIG_FILES-"Makefile src/Makefile src/GSM610/Makefile src/G72x/Makefile \
 			examples/Makefile tests/Makefile doc/Makefile Win32/Makefile \
-			MacOS/Makefile libsndfile.spec"}
+			MacOS/Makefile libsndfile.spec sndfile.pc"}
 EOF
 cat >> $CONFIG_STATUS <<\EOF
 for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
@@ -2732,4 +7219,30 @@
 chmod +x $CONFIG_STATUS
 rm -fr confdefs* $ac_clean_files
 test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1
+
+
+#====================================================================================
+
+echo
+echo "            -=-=-=-= Configuration Complete. =-=-=-"
+
+if test $prefix != "/usr" ; then
+	my_pkg_config_dir="$prefix/lib/pkgconfig"
+	echo 
+	echo "The pkg-config file is being installed in '$my_pkg_config_dir'."
+	echo "This means that you should set the PKG_CONFIG_PATH variable ie:"
+	echo 
+	echo "     export PKG_CONFIG_PATH=$my_pkg_config_dir"
+	echo 
+	echo "if you intend to use pkg-config to retrieve the recommended CFLAGS and"
+	echo "library locations to compile programs which link against libsndfile."
+	echo
+	echo "Using pkg-config is highly recommended as libsndfile version 1 has large"
+	echo "file support (ie files > 2Gig) and software linking to libsndfile will "
+	echo "require special values for CFLAGS to compile correctly."
+	echo
+	echo "For details see : doc/pkgconfig.html"
+	echo
+	fi
+
 
--- a/common/libsndfile/configure.in
+++ b/common/libsndfile/configure.in
@@ -1,23 +1,43 @@
-# Configure `libsndfile'.
-# Copyright (C) 1999-2001 Erik de Castro Lopo ([email protected]).
+# Copyright (C) 1999-2002 Erik de Castro Lopo (erikd AT zip DOT com DOT au).
 
-dnl Require autoconf version >= 2.12
+dnl Require autoconf version >= 2.13)
+AC_PREREQ(2.13)
 
-AC_PREREQ(2.12)			
 AC_INIT(src/sndfile.c)
 AC_CANONICAL_SYSTEM
+AM_INIT_AUTOMAKE(libsndfile,1.0.0rc2)
+AM_CONFIG_HEADER(src/config.h)
 
-AM_INIT_AUTOMAKE(libsndfile,0.0.27)
+##---------------------------------------------------------------------
+## Allow configure to save its options and optionally rerun itself with
+## the same options.
+#
+#AC_ARG_WITH(last-config,  [  --with-last-config      re-run configure script with last config options ],
+#  	ac_with_last_config=yes, ac_with_last_config=no)
+#
+#if test $ac_with_last_config = yes ; then
+#	if test -f "$srcdir/config.last" ; then
+#		mv $srcdir/config.last $srcdir/config.last.bak
+#		sed "s/--no-create --no-recursion//" $srcdir/config.last.bak >$srcdir/config.last
+#		rm $srcdir/config.last.bak
+#		echo "re-running configure script with last config : `cat $srcdir/config.last`"
+#		./configure `cat $srcdir/config.last`
+#		exit
+#	else
+#		AC_MSG_ERROR([[*** No previous config options found.]])
+#		fi
+#else
+#	# Save current config options
+#	echo "$@" >config.last 
+#	fi
 
-dnl This is the version info according to the libtool versioning system.
-dnl It does *not* correspond to the release number.
+#---------------------------------------------------------------------
+# This is the version info according to the libtool versioning system.
 
-SHARED_VERSION_INFO="0:27:0"
+SHARED_VERSION_INFO="1:0:0"
 
-dnl Process this file with autoconf to produce a configure script.
+AC_CHECK_PROG(autogen, autogen, yes, no)
 
-AM_CONFIG_HEADER(src/config.h)
-
 AC_PROG_CC
 AC_PROG_INSTALL
 
@@ -27,20 +47,9 @@
 
 AC_HEADER_STDC
 
-AC_CHECK_HEADERS(endian.h)
+#====================================================================================
+# Finished checking, hande options.
 
-AC_CHECK_FUNCS(fopen fread fwrite fclose fseek ftell malloc free snprintf vsnprintf)
-
-AC_TYPE_SIZE_T
-AC_TYPE_OFF_T
-
-AC_CHECK_SIZEOF(short,2)
-AC_CHECK_SIZEOF(int,4)
-AC_CHECK_SIZEOF(long,8)
-AC_CHECK_SIZEOF(float,4)
-AC_CHECK_SIZEOF(double,4)
-AC_CHECK_SIZEOF(void*,8)
-
 AC_ARG_ENABLE(justsrc,  [  --enable-justsrc             only compile library sources ],
 	ac_arg_justsrc="Y", ac_arg_justsrc="N")
 
@@ -55,18 +64,21 @@
 	ac_arg_broken_float="Y", ac_arg_broken_float="N")
 
 if test $ac_cv_prog_gcc = yes ; then
-	CFLAGS="$CFLAGS -g -O2 -Wstrict-prototypes"
+	CFLAGS="$CFLAGS -W -Wstrict-prototypes -Wmissing-prototypes -Wall -pedantic"
 	if test "$ac_arg_gcc_opt" = "N" ; then
-		CFLAGS="$CFLAGS -g -O0 -Wstrict-prototypes"
+		temp_CFLAGS=`echo $CFLAGS | sed "s/O2/O0/"`
+		CFLAGS=$temp_CFLAGS
 		AC_MSG_WARN([[*** Compiler optimisations switched off. ***]])
 		fi
-	dnl Disable -Wall and -pedantic for Apple Darwin/Rhapsody.
-	dnl System headers on these systems are broken.
+
+	# Disable -Wall and -pedantic for Apple Darwin/Rhapsody.
+	# System headers on these systems are broken.
 	case "$target_os" in 
 		darwin* | rhapsody*)
+			temp_CFLAGS=`echo $CFLAGS | sed "s/-Wall -pedantic//"`
+		CFLAGS=$temp_CFLAGS
 			;;
 		*)
-			CFLAGS="$CFLAGS -Wall -pedantic"
 			;;
 		esac
 	if test $ac_arg_gcc_pipe != "N" ; then
@@ -74,6 +86,82 @@
 	 	fi
 	fi
 	
+#====================================================================================
+# Large file support can be disabled.
+
+AC_SYS_EXTRA_LARGEFILE
+
+if test "$enable_largefile" != yes; then
+	if test x"$ac_cv_sys_largefile_CFLAGS" != xno ; then
+		CFLAGS="$CFLAGS $ac_cv_sys_largefile_CFLAGS"
+		fi
+	if test x"$ac_cv_sys_largefile_LDFLAGS" != xno ; then
+		LDFLAGS="$LDFLAGS $ac_cv_sys_largefile_LDFLAGS"
+		fi
+	if test x"$ac_cv_sys_largefile_LIBS" != xno ; then
+		LIBS="$LIBS $ac_cv_sys_largefile_LIBS"
+		fi
+else
+	AC_MSG_WARN([[*** Disabling large file support.]])
+	fi
+	
+#====================================================================================
+# Determine endian-ness of target processor.
+
+AC_CHECK_HEADERS(endian.h)
+
+AC_C_FIND_ENDIAN
+
+AC_DEFINE_UNQUOTED(CPU_IS_BIG_ENDIAN, ${ac_cv_c_big_endian}, 
+	[Target processor is big endian.])
+AC_DEFINE_UNQUOTED(CPU_IS_LITTLE_ENDIAN, ${ac_cv_c_little_endian}, 
+	[Target processor is little endian.])
+	
+#====================================================================================
+# Check types and their sizes.
+
+AC_CHECK_SIZEOF(short,2)
+AC_CHECK_SIZEOF(int,4)
+AC_CHECK_SIZEOF(long,8)
+AC_CHECK_SIZEOF(float,4)
+AC_CHECK_SIZEOF(double,4)
+AC_CHECK_SIZEOF(void*,8)
+AC_CHECK_SIZEOF(off_t,8)
+
+#====================================================================================
+# Check for functions.
+
+AC_CHECK_FUNCS(malloc free)
+AC_CHECK_FUNCS(open read write lseek fstat)
+AC_CHECK_FUNCS(snprintf vsnprintf)
+
+AC_C99_FUNC_LRINT
+AC_C99_FUNC_LRINTF
+
+if test $ac_cv_c99_lrint = no || test $ac_cv_c99_lrintf = no ; then
+	AC_MSG_WARN([[*** Missing C99 standard functions lrint() and lrintf().]])
+	AC_MSG_WARN([[*** This may cause benign compiler warnings on some systems (ie Solaris).]])
+	fi
+
+#====================================================================================
+# Find known target OS.
+
+OS_SPECIFIC_INCLUDES=""
+
+case "$target_os" in 
+	darwin* | rhapsody*)
+		OS_SPECIFIC_INCLUDES="-fpascal-strings -I/Developer/Headers/FlatCarbon"
+		OS_SPECIFIC_LINKS="-framework CoreAudio"
+		;;
+	*)
+		OS_SPECIFIC_INCLUDES=""
+		OS_SPECIFIC_LINKS=""
+		;;
+	esac
+
+#====================================================================================
+# Test for sanity when cross-compiling.
+
 if test $cross_compiling = yes ; then
 	AC_MSG_WARN([[******************************************************************]])
 	AC_MSG_WARN([[*** We are cross-compiling, so have to assume sizeof (short) == 2 ]])
@@ -82,12 +170,6 @@
 	AC_MSG_WARN([[******************************************************************]])
 	fi
 	
-if test $ac_cv_sizeof_int != 4 ; then
-	AC_MSG_WARN([[******************************************************************]])
-	AC_MSG_WARN([[*** sizeof (int) != 4                                             ]])
-	AC_MSG_WARN([[******************************************************************]])
-	fi
-
 if test $ac_cv_sizeof_short != 2 ; then
 	AC_MSG_WARN([[******************************************************************]])
 	AC_MSG_WARN([[*** sizeof (short) != 2.                                          ]])
@@ -94,6 +176,12 @@
 	AC_MSG_WARN([[******************************************************************]])
 	fi
 	
+if test $ac_cv_sizeof_int != 4 ; then
+	AC_MSG_WARN([[******************************************************************]])
+	AC_MSG_WARN([[*** sizeof (int) != 4                                             ]])
+	AC_MSG_WARN([[******************************************************************]])
+	fi
+
 if test $ac_cv_sizeof_float != 4 ; then
 	AC_MSG_WARN([[******************************************************************]])
 	AC_MSG_WARN([[*** sizeof (float) != 4.                                          ]])
@@ -106,40 +194,62 @@
 	AC_MSG_WARN([[******************************************************************]])
 	fi
 
-case "$target_cpu" in
-	alpha* | i?86 )
-		AC_DEFINE(GUESS_LITTLE_ENDIAN,1)
-		AC_DEFINE(GUESS_BIG_ENDIAN,0)
-		;;
-		
-	hppa* | m68* | mips* | powerpc* | hppa* | sparc*)
-		AC_DEFINE(GUESS_LITTLE_ENDIAN,0)
-		AC_DEFINE(GUESS_BIG_ENDIAN,1)
-		;;
+#====================================================================================
+# Now use the information from the checking stage.
 
-	*)
-		AC_MSG_WARN([[*****************************************************************]])
-		AC_MSG_WARN([[*** Not able to determine endian-ness of processor.              ]])
-		AC_MSG_WARN([[*** You will need to edit src/config.h before compiling.         ]])
-		AC_MSG_WARN([[*****************************************************************]])
-		;;
-esac
-
-subdirs="src/GSM610 src/G72x src"
+subdirs="src Win32 MacOS"    		# Do not add src/GSM610 or src/G72x here.
 if test $ac_arg_justsrc = "N" ; then
 	subdirs="$subdirs examples doc tests"
 	fi
 
 if test $ac_arg_broken_float = "Y" ; then
-	AC_DEFINE(FORCE_BROKEN_FLOAT,1)
+	AC_DEFINE([FORCE_BROKEN_FLOAT],1,
+		[Set to 1 to force the use of code for processors with broken floats])
 	AC_MSG_WARN([[*** Testing code for processors that can't read/write IEEE floats.]])
 else
-	AC_DEFINE(FORCE_BROKEN_FLOAT,0)
+	AC_DEFINE([FORCE_BROKEN_FLOAT],0,
+		[Set to 1 to force the use of code for processors with broken floats])
 	fi
- 
+
+AC_DEFINE([OS_IS_WIN32],0, [Set to 1 if compiling for Win32])
+
+if test x"$CFLAGS" = x ; then
+	echo "Error in configure script. CFLAGS has been screwed up."
+	exit
+	fi
+
 AC_SUBST(subdirs)
+AC_SUBST(ac_cv_sys_largefile_CFLAGS)
 AC_SUBST(SHARED_VERSION_INFO)
+AC_SUBST(OS_SPECIFIC_INCLUDES)
+AC_SUBST(OS_SPECIFIC_LINKS)
 
 AC_OUTPUT(Makefile src/Makefile src/GSM610/Makefile src/G72x/Makefile \
 			examples/Makefile tests/Makefile doc/Makefile Win32/Makefile \
-			MacOS/Makefile libsndfile.spec)
+			MacOS/Makefile libsndfile.spec sndfile.pc)
+
+#====================================================================================
+
+echo
+echo "            -=-=-=-= Configuration Complete. =-=-=-"
+
+if test $prefix != "/usr" ; then
+	my_pkg_config_dir="$prefix/lib/pkgconfig"
+	echo 
+	echo "The pkg-config file is being installed in '$my_pkg_config_dir'."
+	echo "This means that you should set the PKG_CONFIG_PATH variable ie:"
+	echo 
+	echo "     export PKG_CONFIG_PATH=$my_pkg_config_dir"
+	echo 
+	echo "if you intend to use pkg-config to retrieve the recommended CFLAGS and"
+	echo "library locations to compile programs which link against libsndfile."
+	echo
+	echo "Using pkg-config is highly recommended as libsndfile version 1 has large"
+	echo "file support (ie files > 2Gig) and software linking to libsndfile will "
+	echo "require special values for CFLAGS to compile correctly."
+	echo
+	echo "For details see : doc/pkgconfig.html"
+	echo
+	fi
+
+
--- a/common/libsndfile/libsndfile.spec
+++ /dev/null
@@ -1,60 +1,0 @@
-
-%define name    libsndfile
-%define version 0.0.27
-%define release 1
-%define prefix  /usr
-
-Summary: A library to handle various audio file formats.
-Name: %{name}
-Version: %{version}
-Release: %{release}
-Prefix: %{prefix}
-Copyright: LGPL
-Group: Libraries/Sound
-Source: http://www.zip.com.au/~erikd/libsndfile/libsndfile-%{version}.tar.gz
-URL: http://www.zip.com.au/~erikd/libsndfile/
-BuildRoot: /var/tmp/%{name}-%{version}
-
-%description
-libsndfile is a C library for reading and writing sound files such as
-AIFF, AU and WAV files through one standard interface. It can currently
-read/write 8, 16, 24 and 32-bit PCM files as well as 32-bit floating
-point WAV files and a number of compressed formats.
-
-%package devel
-Summary: Libraries, includes, etc to develop libsndfile applications
-Group: Libraries
-
-%description devel
-Libraries, include files, etc you can use to develop libsndfile applications.
-
-%prep
-%setup
-
-%build
-./configure --prefix=%{prefix}
-make
-
-%install
-if [ -d $RPM_BUILD_ROOT ]; then rm -rf $RPM_BUILD_ROOT; fi
-mkdir -p $RPM_BUILD_ROOT
-make prefix=$RPM_BUILD_ROOT%{prefix} install
-
-%clean
-if [ -d $RPM_BUILD_ROOT ]; then rm -rf $RPM_BUILD_ROOT; fi
-
-%files
-%defattr(-,root,root)
-%doc AUTHORS COPYING ChangeLog INSTALL NEWS README TODO doc
-%prefix/lib/libsndfile.so.*
-
-%files devel
-%defattr(-,root,root)
-%{prefix}/lib/libsndfile.a
-%{prefix}/lib/libsndfile.la
-%{prefix}/lib/libsndfile.so
-%{prefix}/include/sndfile.h
-
-%changelog
-* Thu Jul 6 2000 Josh Green <[email protected]>
-- Created libsndfile.spec.in
--- /dev/null
+++ b/common/libsndfile/libsndfile_version_convert.py
@@ -1,0 +1,245 @@
+#!/usr/bin/python
+
+import os, re, string, sys
+
+#----------------------------------------------------------------------------------------------
+#  Version 0:
+#		SNDFILE*  sf_open_read  (const char *path, SF_INFO *sfinfo) ;
+#		SNDFILE*  sf_open_write (const char *path, SF_INFO *sfinfo) ;
+#  Version 1:
+#		SNDFILE*  sf_open  (const char *path, int mode, SF_INFO *sfinfo) ;
+
+
+def modify_sf_open (program_text):
+	sf_open_re = re.compile ("(sf_open_([readwit]{4,5})\s*\(([^),]+),([^),]+)\))", re.MULTILINE)
+	
+	while 1:
+		found = sf_open_re.search (program_text)
+		if not found:
+			break
+
+		found = found.groups ()
+
+		if len (found) != 4:
+			print "***** Conversion may not be complete. *****"
+			break
+			
+		print "    ", found [0]
+
+		found = list (found)
+
+		if found [1] == "read":
+			found [1] = "SFM_READ"
+		elif found [1] == "write":
+			found [1] = "SFM_WRITE"
+		else:
+			found [1] = "SFM_" + found [1]
+			
+		replacement = "sf_open (%s, %s,%s) " % (found [2], found [1], found [3])
+			
+		print "         =>", replacement
+			
+		program_text = string.replace (program_text, found [0], replacement)
+		print
+
+	return program_text
+
+#----------------------------------------------------------------------------------------------
+#  Version 0:
+#		size_t  sf_write_double  (SNDFILE *sndfile, double *ptr, size_t items, int normalize) ;
+#		size_t  sf_writef_double (SNDFILE *sndfile, double *ptr, size_t frames, int normalize) ;
+#
+#  Version 1:
+#        sf_count_t    sf_read_double   (SNDFILE *sndfile, double *ptr, sf_count_t items) ;
+#        sf_count_t    sf_readf_double  (SNDFILE *sndfile, double *ptr, sf_count_t frames) ;
+# 
+# Notice that in version 1 there is no normailize parameter. Remove it.
+	
+def modify_sf_double (program_text):
+	sf_double_re = re.compile ("(sf_([readwitf]{4,5})_double\s*\(([^),]+),([^),]+),([^),]+),([^),]+)\))", re.MULTILINE)
+	
+	while 1:
+		found = sf_double_re.search (program_text)
+		if not found:
+			break
+
+		found = found.groups ()
+		if len (found) != 6:
+			print "***** Conversion may not be complete. *****"
+			break
+			
+		print "    ", found [0]
+		replacement = "sf_%s_double (%s,%s,%s " % found [1:-1] + "/* FIXME_NORM_MODE " + found [-1] + " */)"
+			
+		print "         =>", replacement
+			
+		program_text = string.replace (program_text, found [0], replacement, 1)
+		print
+
+	return program_text
+
+#----------------------------------------------------------------------------------------------
+
+
+def modify_pcmbitwidth (program_text):
+	sf_pcmbitwidth_re = re.compile ("(([_a-zA-Z0-9]+\s*[\.->]{1,2}\s*)(pcmbitwidth)\s+=\s+([_a-zA-Z0-9]+)\s+;)", re.MULTILINE)
+	
+	while 1:
+		found = sf_pcmbitwidth_re.search (program_text)
+
+		if not found:
+			break
+
+		found = found.groups ()
+
+		print "    ", found [0]
+
+		if len (found) != 4:
+			print "***** Conversion may not be complete. *****"
+			break
+
+		replacement = "/* %sold_field_PCM_BIT_WIDTH = %s */" % (found [1], found [3])
+		print "         =>", replacement
+			
+		program_text = string.replace (program_text, found [0], replacement, 1)
+		print
+
+	return program_text
+
+
+#----------------------------------------------------------------------------------------------
+# SF_FORMAT_PCM has been dropped and one of these should be used instead:
+#      SF_FORMAT_PCM_S8
+#      SF_FORMAT_PCM_U8
+#      SF_FORMAT_PCM_16
+#      SF_FORMAT_PCM_24
+#      SF_FORMAT_PCM_32
+
+def modify_sf_format_pcm (program_text):
+	sf_format_pcm_re = re.compile ("(SF_FORMAT_PCM([^_]))")
+	
+	while 1:
+		found = sf_format_pcm_re.search (program_text)
+
+		if not found:
+			break
+
+		found = found.groups ()
+
+		print "    ", found [0]
+		
+		if len (found) != 2:
+			print "***** Conversion may not be complete. *****"
+			break
+
+		replacement = "SF_FORMAT_PCM_FIXME" + found [1]
+		print "         =>", replacement
+			
+		program_text = string.replace (program_text, found [0], replacement, 1)
+		print
+
+	return program_text
+
+
+#----------------------------------------------------------------------------------------------
+# The sf_command interface has also changed.
+
+
+def modify_sf_command (program_text):
+	sf_command_re = re.compile ('(sf_command\s*\(([^),]+),([ a-z\"]+),([^),]+),([^)(,]+)\))', re.MULTILINE)
+	
+	while 1:
+		found = sf_command_re.search (program_text)
+
+		if not found:
+			break
+
+		found = found.groups ()
+
+		print "    ", found [0]
+		print "    ", found
+		
+		if len (found) != 5:
+			print "***** Conversion may not be complete. *****"
+			break
+			
+		found = list (found)
+		found [2] = string.strip (found [2])
+		found [3] = string.strip (found [3])
+		
+		if found [3] == '"on"':
+			found [3] = " NULL"
+			found [4] = " SF_TRUE"
+		elif found [3] == '"off"':
+			found [3] = " NULL"
+			found [4] = " SF_FALSE"
+			
+		if found [2] == '"lib version"':
+			replacement = "sf_command (%s, SFC_GET_LIB_VERSION,%s,%s)" % (found [1], found [3], found [4])
+		elif found [2] == '"norm float"':
+			replacement = "sf_command (%s, SFC_SET_NORM_FLOAT,%s,%s)" % (found [1], found [3], found [4])
+		elif found [2] == '"norm double"':
+			replacement = "sf_command (%s, SFC_SET_NORM_FLOAT,%s,%s)" % (found [1], found [3], found [4])
+		elif found [2] == '"read text"':
+			replacement = "/* sf_invalid_command (%s,%s,%s,%s) */" % (found [1], found [2], found [3], found [4])
+		elif found [2] == '"write text"':
+			replacement = "/* sf_invalid_command (%s,%s,%s,%s) */" % (found [1], found [2], found [3], found [4])
+		else:
+			replacement = "xxxxxxxxxxxxxxxxxxx"
+			
+		print "         =>", replacement
+			
+		program_text = string.replace (program_text, found [0], replacement, 1)
+		print
+
+	return program_text
+
+
+#---------------------------------------------------------------------------------
+# Crunch the file and do the conversions.
+
+def convert_functions (filename, bak_filename):
+	program_text = open (filename, "r").read ()
+	os.rename (filename, bak_filename)
+	
+#	program_text = modify_sf_open (program_text)
+#	program_text = modify_sf_double (program_text)
+#	program_text = modify_pcmbitwidth (program_text)
+#	program_text = modify_sf_format_pcm (program_text)
+	program_text = modify_sf_command (program_text)
+
+	open (filename, "w").write (program_text)
+	return
+
+#============================================================================
+# Main program starts here.
+
+
+
+print 
+
+print """
+    This conversion program *SHOULD* make source code which worked when 
+    compiled against libsndfile-0.0.X compile and link against 
+    libsndfile-1.0.X and then work as before. Unfortunately I cannot 
+    make any guarantees. If it breaks, you get to keep both pieces.
+
+    Original files will be renamed from <filename> to <filename>.orig<pid>
+    where <pid> will be the process id of this conversion program when it
+    does the conversion.
+    """
+	
+if len (sys.argv) < 2:
+	progname = re.sub (".*/", "", sys.argv [0])
+	print "    Usage : \n\t%s <file>\n" % progname
+	print "    Multiple files allowed, ie :\n\t%s *.c\n" % progname
+	sys.exit (0)
+	
+	
+for filename in sys.argv [1:]:
+	if os.access (filename, os.R_OK | os.W_OK) != 1:
+		print "Error: not able to access '%s'\n" % filename
+		sys.exit (1) ;
+	print "%s :" % filename
+	convert_functions (filename, "%s.orig%d" % (filename, os.getpid ()))
+	print
--- a/common/libsndfile/ltconfig
+++ b/common/libsndfile/ltconfig
@@ -1922,6 +1922,7 @@
   library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so${major} ${libname}.so'
   soname_spec='${libname}${release}.so$major'
   shlibpath_var=LD_LIBRARY_PATH
+  deplibs_check_method=pass_all
   ;;
 
 hpux9* | hpux10* | hpux11*)
--- a/common/libsndfile/ltmain.sh
+++ b/common/libsndfile/ltmain.sh
@@ -1,7 +1,8 @@
 # ltmain.sh - Provide generalized library-building support services.
-# NOTE: Changing this file will not affect anything until you rerun ltconfig.
+# NOTE: Changing this file will not affect anything until you rerun configure.
 #
-# Copyright (C) 1996-1999 Free Software Foundation, Inc.
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001
+# Free Software Foundation, Inc.
 # Originally by Gordon Matzigkeit <[email protected]>, 1996
 #
 # This program is free software; you can redistribute it and/or modify
@@ -54,8 +55,8 @@
 # Constants.
 PROGRAM=ltmain.sh
 PACKAGE=libtool
-VERSION=1.3.5
-TIMESTAMP=" (1.385.2.206 2000/05/27 11:12:27)"
+VERSION=1.4.2
+TIMESTAMP=" (1.922.2.53 2001/09/11 03:18:52)"
 
 default_mode=
 help="Try \`$progname --help' for more information."
@@ -83,11 +84,8 @@
   save_LANG="$LANG"; LANG=C; export LANG
 fi
 
-if test "$LTCONFIG_VERSION" != "$VERSION"; then
-  echo "$modename: ltconfig version \`$LTCONFIG_VERSION' does not match $PROGRAM version \`$VERSION'" 1>&2
-  echo "Fatal configuration error.  See the $PACKAGE docs for more information." 1>&2
-  exit 1
-fi
+# Make sure IFS has a sensible default
+: ${IFS=" 	"}
 
 if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
   echo "$modename: not configured to build any kind of library" 1>&2
@@ -113,7 +111,7 @@
   arg="$1"
   shift
 
-  case "$arg" in
+  case $arg in
   -*=*) optarg=`$echo "X$arg" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;;
   *) optarg= ;;
   esac
@@ -120,9 +118,9 @@
 
   # If the previous option needs an argument, assign it.
   if test -n "$prev"; then
-    case "$prev" in
+    case $prev in
     execute_dlfiles)
-      eval "$prev=\"\$$prev \$arg\""
+      execute_dlfiles="$execute_dlfiles $arg"
       ;;
     *)
       eval "$prev=\$arg"
@@ -135,7 +133,7 @@
   fi
 
   # Have we seen a non-optional argument yet?
-  case "$arg" in
+  case $arg in
   --help)
     show_help=yes
     ;;
@@ -146,7 +144,7 @@
     ;;
 
   --config)
-    sed -e '1,/^### BEGIN LIBTOOL CONFIG/d' -e '/^### END LIBTOOL CONFIG/,$d' $0
+    sed -e '1,/^# ### BEGIN LIBTOOL CONFIG/d' -e '/^# ### END LIBTOOL CONFIG/,$d' $0
     exit 0
     ;;
 
@@ -207,16 +205,21 @@
   exit 1
 fi
 
+# If this variable is set in any of the actions, the command in it
+# will be execed at the end.  This prevents here-documents from being
+# left over by shells.
+exec_cmd=
+
 if test -z "$show_help"; then
 
   # Infer the operation mode.
   if test -z "$mode"; then
-    case "$nonopt" in
+    case $nonopt in
     *cc | *++ | gcc* | *-gcc*)
       mode=link
       for arg
       do
-	case "$arg" in
+	case $arg in
 	-c)
 	   mode=compile
 	   break
@@ -261,12 +264,13 @@
   help="Try \`$modename --help --mode=$mode' for more information."
 
   # These modes are in order of execution frequency so that they run quickly.
-  case "$mode" in
+  case $mode in
   # libtool compile mode
   compile)
     modename="$modename: compile"
     # Get the compilation command and the source file.
     base_compile=
+    prev=
     lastarg=
     srcfile="$nonopt"
     suppress_output=
@@ -274,8 +278,34 @@
     user_target=no
     for arg
     do
+      case $prev in
+      "") ;;
+      xcompiler)
+	# Aesthetically quote the previous argument.
+	prev=
+	lastarg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+
+	case $arg in
+	# Double-quote args containing other shell metacharacters.
+	# Many Bourne shells cannot handle close brackets correctly
+	# in scan sets, so we specify it separately.
+	*[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	  arg="\"$arg\""
+	  ;;
+	esac
+
+	# Add the previous argument to base_compile.
+	if test -z "$base_compile"; then
+	  base_compile="$lastarg"
+	else
+	  base_compile="$base_compile $lastarg"
+	fi
+	continue
+	;;
+      esac
+
       # Accept any command-line options.
-      case "$arg" in
+      case $arg in
       -o)
 	if test "$user_target" != "no"; then
 	  $echo "$modename: you cannot specify \`-o' more than once" 1>&2
@@ -288,9 +318,53 @@
 	build_old_libs=yes
 	continue
 	;;
+
+      -prefer-pic)
+	pic_mode=yes
+	continue
+	;;
+
+      -prefer-non-pic)
+	pic_mode=no
+	continue
+	;;
+
+      -Xcompiler)
+	prev=xcompiler
+	continue
+	;;
+
+      -Wc,*)
+	args=`$echo "X$arg" | $Xsed -e "s/^-Wc,//"`
+	lastarg=
+	save_ifs="$IFS"; IFS=','
+	for arg in $args; do
+	  IFS="$save_ifs"
+
+	  # Double-quote args containing other shell metacharacters.
+	  # Many Bourne shells cannot handle close brackets correctly
+	  # in scan sets, so we specify it separately.
+	  case $arg in
+	    *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	    arg="\"$arg\""
+	    ;;
+	  esac
+	  lastarg="$lastarg $arg"
+	done
+	IFS="$save_ifs"
+	lastarg=`$echo "X$lastarg" | $Xsed -e "s/^ //"`
+
+	# Add the arguments to base_compile.
+	if test -z "$base_compile"; then
+	  base_compile="$lastarg"
+	else
+	  base_compile="$base_compile $lastarg"
+	fi
+	continue
+	;;
       esac
 
-      case "$user_target" in
+      case $user_target in
       next)
 	# The next one is the -o target name
 	user_target=yes
@@ -316,10 +390,10 @@
       lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"`
 
       # Double-quote args containing other shell metacharacters.
-      # Many Bourne shells cannot handle close brackets correctly in scan
-      # sets, so we specify it separately.
-      case "$lastarg" in
-      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*)
+      # Many Bourne shells cannot handle close brackets correctly
+      # in scan sets, so we specify it separately.
+      case $lastarg in
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
 	lastarg="\"$lastarg\""
 	;;
       esac
@@ -332,7 +406,7 @@
       fi
     done
 
-    case "$user_target" in
+    case $user_target in
     set)
       ;;
     no)
@@ -348,7 +422,7 @@
     # Recognize several different file suffixes.
     # If the user specifies -o file.o, it is replaced with file.lo
     xform='[cCFSfmso]'
-    case "$libobj" in
+    case $libobj in
     *.ada) xform=ada ;;
     *.adb) xform=adb ;;
     *.ads) xform=ads ;;
@@ -363,7 +437,7 @@
 
     libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"`
 
-    case "$libobj" in
+    case $libobj in
     *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;;
     *)
       $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2
@@ -387,10 +461,21 @@
     $run $rm $removelist
     trap "$run $rm $removelist; exit 1" 1 2 15
 
+    # On Cygwin there's no "real" PIC flag so we must build both object types
+    case $host_os in
+    cygwin* | mingw* | pw32* | os2*)
+      pic_mode=default
+      ;;
+    esac
+    if test $pic_mode = no && test "$deplibs_check_method" != pass_all; then
+      # non-PIC code in shared libraries is not supported
+      pic_mode=default
+    fi
+
     # Calculate the filename of the output object if compiler does
     # not support -o with -c
     if test "$compiler_c_o" = no; then
-      output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\..*$%%'`.${objext}
+      output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext}
       lockfile="$output_obj.lock"
       removelist="$removelist $output_obj $lockfile"
       trap "$run $rm $removelist; exit 1" 1 2 15
@@ -402,7 +487,7 @@
     # Lock this critical section if it is needed
     # We use this script file to make the link, it avoids creating a new file
     if test "$need_locks" = yes; then
-      until ln "$0" "$lockfile" 2>/dev/null; do
+      until $run ln "$0" "$lockfile" 2>/dev/null; do
 	$show "Waiting for $lockfile to be removed"
 	sleep 2
       done
@@ -434,8 +519,13 @@
       # Without this assignment, base_compile gets emptied.
       fbsd_hideous_sh_bug=$base_compile
 
-      # All platforms use -DPIC, to notify preprocessed assembler code.
-      command="$base_compile $srcfile $pic_flag -DPIC"
+      if test "$pic_mode" != no; then
+	# All platforms use -DPIC, to notify preprocessed assembler code.
+	command="$base_compile $srcfile $pic_flag -DPIC"
+      else
+	# Don't build PIC code
+	command="$base_compile $srcfile"
+      fi
       if test "$build_old_libs" = yes; then
 	lo_libobj="$libobj"
 	dir=`$echo "X$libobj" | $Xsed -e 's%/[^/]*$%%'`
@@ -506,7 +596,8 @@
       fi
 
       # If we have no pic_flag, then copy the object into place and finish.
-      if test -z "$pic_flag" && test "$build_old_libs" = yes; then
+      if (test -z "$pic_flag" || test "$pic_mode" != default) &&
+	 test "$build_old_libs" = yes; then
 	# Rename the .lo from within objdir to obj
 	if test -f $obj; then
 	  $show $rm $obj
@@ -532,6 +623,10 @@
 	# Now arrange that obj and lo_libobj become the same file
 	$show "(cd $xdir && $LN_S $baseobj $libobj)"
 	if $run eval '(cd $xdir && $LN_S $baseobj $libobj)'; then
+	  # Unlock the critical section if it was locked
+	  if test "$need_locks" != no; then
+	    $run $rm "$lockfile"
+	  fi
 	  exit 0
 	else
 	  error=$?
@@ -546,7 +641,13 @@
 
     # Only build a position-dependent object if we build old libraries.
     if test "$build_old_libs" = yes; then
-      command="$base_compile $srcfile"
+      if test "$pic_mode" != yes; then
+	# Don't build PIC code
+	command="$base_compile $srcfile"
+      else
+	# All platforms use -DPIC, to notify preprocessed assembler code.
+	command="$base_compile $srcfile $pic_flag -DPIC"
+      fi
       if test "$compiler_c_o" = yes; then
 	command="$command -o $obj"
 	output_obj="$obj"
@@ -612,7 +713,7 @@
 
     # Unlock the critical section if it was locked
     if test "$need_locks" != no; then
-      $rm "$lockfile"
+      $run $rm "$lockfile"
     fi
 
     exit 0
@@ -619,10 +720,10 @@
     ;;
 
   # libtool link mode
-  link)
+  link | relink)
     modename="$modename: link"
-    case "$host" in
-    *-*-cygwin* | *-*-mingw* | *-*-os2*)
+    case $host in
+    *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
       # It is impossible to link a dll without this setting, and
       # we shouldn't force the makefile maintainer to figure out
       # which system we are compiling for in order to pass an extra
@@ -635,179 +736,12 @@
       # -no-undefined on the libtool link line when we can be certain
       # that all symbols are satisfied, otherwise we get a static library.
       allow_undefined=yes
-
-      # This is a source program that is used to create dlls on Windows
-      # Don't remove nor modify the starting and closing comments
-# /* ltdll.c starts here */
-# #define WIN32_LEAN_AND_MEAN
-# #include <windows.h>
-# #undef WIN32_LEAN_AND_MEAN
-# #include <stdio.h>
-#
-# #ifndef __CYGWIN__
-# #  ifdef __CYGWIN32__
-# #    define __CYGWIN__ __CYGWIN32__
-# #  endif
-# #endif
-#
-# #ifdef __cplusplus
-# extern "C" {
-# #endif
-# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved);
-# #ifdef __cplusplus
-# }
-# #endif
-#
-# #ifdef __CYGWIN__
-# #include <cygwin/cygwin_dll.h>
-# DECLARE_CYGWIN_DLL( DllMain );
-# #endif
-# HINSTANCE __hDllInstance_base;
-#
-# BOOL APIENTRY
-# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved)
-# {
-#   __hDllInstance_base = hInst;
-#   return TRUE;
-# }
-# /* ltdll.c ends here */
-      # This is a source program that is used to create import libraries
-      # on Windows for dlls which lack them. Don't remove nor modify the
-      # starting and closing comments
-# /* impgen.c starts here */
-# /*   Copyright (C) 1999 Free Software Foundation, Inc.
-# 
-#  This file is part of GNU libtool.
-# 
-#  This program is free software; you can redistribute it and/or modify
-#  it under the terms of the GNU General Public License as published by
-#  the Free Software Foundation; either version 2 of the License, or
-#  (at your option) any later version.
-# 
-#  This program is distributed in the hope that it will be useful,
-#  but WITHOUT ANY WARRANTY; without even the implied warranty of
-#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-#  GNU General Public License for more details.
-# 
-#  You should have received a copy of the GNU General Public License
-#  along with this program; if not, write to the Free Software
-#  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-#  */
-# 
-#  #include <stdio.h>		/* for printf() */
-#  #include <unistd.h>		/* for open(), lseek(), read() */
-#  #include <fcntl.h>		/* for O_RDONLY, O_BINARY */
-#  #include <string.h>		/* for strdup() */
-# 
-#  static unsigned int
-#  pe_get16 (fd, offset)
-#       int fd;
-#       int offset;
-#  {
-#    unsigned char b[2];
-#    lseek (fd, offset, SEEK_SET);
-#    read (fd, b, 2);
-#    return b[0] + (b[1]<<8);
-#  }
-# 
-#  static unsigned int
-#  pe_get32 (fd, offset)
-#      int fd;
-#      int offset;
-#  {
-#    unsigned char b[4];
-#    lseek (fd, offset, SEEK_SET);
-#    read (fd, b, 4);
-#    return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24);
-#  }
-# 
-#  static unsigned int
-#  pe_as32 (ptr)
-#       void *ptr;
-#  {
-#    unsigned char *b = ptr;
-#    return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24);
-#  }
-# 
-#  int
-#  main (argc, argv)
-#      int argc;
-#      char *argv[];
-#  {
-#      int dll;
-#      unsigned long pe_header_offset, opthdr_ofs, num_entries, i;
-#      unsigned long export_rva, export_size, nsections, secptr, expptr;
-#      unsigned long name_rvas, nexp;
-#      unsigned char *expdata, *erva;
-#      char *filename, *dll_name;
-# 
-#      filename = argv[1];
-# 
-#      dll = open(filename, O_RDONLY|O_BINARY);
-#      if (!dll)
-#  	return 1;
-# 
-#      dll_name = filename;
-#    
-#      for (i=0; filename[i]; i++)
-#  	if (filename[i] == '/' || filename[i] == '\\'  || filename[i] == ':')
-#  	    dll_name = filename + i +1;
-# 
-#      pe_header_offset = pe_get32 (dll, 0x3c);
-#      opthdr_ofs = pe_header_offset + 4 + 20;
-#      num_entries = pe_get32 (dll, opthdr_ofs + 92);
-# 
-#      if (num_entries < 1) /* no exports */
-#  	return 1;
-# 
-#      export_rva = pe_get32 (dll, opthdr_ofs + 96);
-#      export_size = pe_get32 (dll, opthdr_ofs + 100);
-#      nsections = pe_get16 (dll, pe_header_offset + 4 +2);
-#      secptr = (pe_header_offset + 4 + 20 +
-#  	      pe_get16 (dll, pe_header_offset + 4 + 16));
-# 
-#      expptr = 0;
-#      for (i = 0; i < nsections; i++)
-#      {
-#  	char sname[8];
-#  	unsigned long secptr1 = secptr + 40 * i;
-#  	unsigned long vaddr = pe_get32 (dll, secptr1 + 12);
-#  	unsigned long vsize = pe_get32 (dll, secptr1 + 16);
-#  	unsigned long fptr = pe_get32 (dll, secptr1 + 20);
-#  	lseek(dll, secptr1, SEEK_SET);
-#  	read(dll, sname, 8);
-#  	if (vaddr <= export_rva && vaddr+vsize > export_rva)
-#  	{
-#  	    expptr = fptr + (export_rva - vaddr);
-#  	    if (export_rva + export_size > vaddr + vsize)
-#  		export_size = vsize - (export_rva - vaddr);
-#  	    break;
-#  	}
-#      }
-# 
-#      expdata = (unsigned char*)malloc(export_size);
-#      lseek (dll, expptr, SEEK_SET);
-#      read (dll, expdata, export_size);
-#      erva = expdata - export_rva;
-# 
-#      nexp = pe_as32 (expdata+24);
-#      name_rvas = pe_as32 (expdata+32);
-# 
-#      printf ("EXPORTS\n");
-#      for (i = 0; i<nexp; i++)
-#      {
-#  	unsigned long name_rva = pe_as32 (erva+name_rvas+i*4);
-#  	printf ("\t%s @ %ld ;\n", erva+name_rva, 1+ i);
-#      }
-# 
-#      return 0;
-#  }
-# /* impgen.c ends here */
       ;;
     *)
       allow_undefined=yes
       ;;
     esac
+    libtool_args="$nonopt"
     compile_command="$nonopt"
     finalize_command="$nonopt"
 
@@ -818,18 +752,12 @@
     convenience=
     old_convenience=
     deplibs=
-    linkopts=
+    old_deplibs=
+    compiler_flags=
+    linker_flags=
+    dllsearchpath=
+    lib_search_path=`pwd`
 
-    if test -n "$shlibpath_var"; then
-      # get the directories listed in $shlibpath_var
-      eval lib_search_path=\`\$echo \"X \${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\`
-    else
-      lib_search_path=
-    fi
-    # now prepend the system-specific ones
-    eval lib_search_path=\"$sys_lib_search_path_spec\$lib_search_path\"
-    eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\"
-    
     avoid_version=no
     dlfiles=
     dlprefiles=
@@ -839,9 +767,9 @@
     export_symbols_regex=
     generated=
     libobjs=
-    link_against_libtool_libs=
     ltlibs=
     module=no
+    no_install=no
     objs=
     prefer_static_libs=no
     preload=no
@@ -858,7 +786,7 @@
     # We need to know -static, to get the right output filenames.
     for arg
     do
-      case "$arg" in
+      case $arg in
       -all-static | -static)
 	if test "X$arg" = "X-all-static"; then
 	  if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then
@@ -887,10 +815,17 @@
     while test $# -gt 0; do
       arg="$1"
       shift
+      case $arg in
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	qarg=\"`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`\" ### testsuite: skip nested quoting test
+	;;
+      *) qarg=$arg ;;
+      esac
+      libtool_args="$libtool_args $qarg"
 
       # If the previous option needs an argument, assign it.
       if test -n "$prev"; then
-	case "$prev" in
+	case $prev in
 	output)
 	  compile_command="$compile_command @OUTPUT@"
 	  finalize_command="$finalize_command @OUTPUT@"
@@ -897,7 +832,7 @@
 	  ;;
 	esac
 
-	case "$prev" in
+	case $prev in
 	dlfiles|dlprefiles)
 	  if test "$preload" = no; then
 	    # Add the symbol object into the linking commands.
@@ -905,7 +840,7 @@
 	    finalize_command="$finalize_command @SYMFILE@"
 	    preload=yes
 	  fi
-	  case "$arg" in
+	  case $arg in
 	  *.la | *.lo) ;;  # We handle these cases below.
 	  force)
 	    if test "$dlself" = no; then
@@ -934,6 +869,7 @@
 	      dlprefiles="$dlprefiles $arg"
 	    fi
 	    prev=
+	    continue
 	    ;;
 	  esac
 	  ;;
@@ -958,7 +894,7 @@
 	  ;;
 	rpath | xrpath)
 	  # We need an absolute path.
-	  case "$arg" in
+	  case $arg in
 	  [\\/]* | [A-Za-z]:[\\/]*) ;;
 	  *)
 	    $echo "$modename: only absolute run-paths are allowed" 1>&2
@@ -979,6 +915,21 @@
 	  prev=
 	  continue
 	  ;;
+	xcompiler)
+	  compiler_flags="$compiler_flags $qarg"
+	  prev=
+	  compile_command="$compile_command $qarg"
+	  finalize_command="$finalize_command $qarg"
+	  continue
+	  ;;
+	xlinker)
+	  linker_flags="$linker_flags $qarg"
+	  compiler_flags="$compiler_flags $wl$qarg"
+	  prev=
+	  compile_command="$compile_command $wl$qarg"
+	  finalize_command="$finalize_command $wl$qarg"
+	  continue
+	  ;;
 	*)
 	  eval "$prev=\"\$arg\""
 	  prev=
@@ -985,11 +936,11 @@
 	  continue
 	  ;;
 	esac
-      fi
+      fi # test -n $prev
 
       prevarg="$arg"
 
-      case "$arg" in
+      case $arg in
       -all-static)
 	if test -n "$link_static_flag"; then
 	  compile_command="$compile_command $link_static_flag"
@@ -1026,7 +977,7 @@
 
       -export-symbols | -export-symbols-regex)
 	if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
-	  $echo "$modename: not more than one -exported-symbols argument allowed"
+	  $echo "$modename: more than one -exported-symbols argument is not allowed"
 	  exit 1
 	fi
 	if test "X$arg" = "X-export-symbols"; then
@@ -1037,58 +988,76 @@
 	continue
 	;;
 
+      # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:*
+      # so, if we see these flags be careful not to treat them like -L
+      -L[A-Z][A-Z]*:*)
+	case $with_gcc/$host in
+	no/*-*-irix*)
+	  compile_command="$compile_command $arg"
+	  finalize_command="$finalize_command $arg"
+	  ;;
+	esac
+	continue
+	;;
+
       -L*)
 	dir=`$echo "X$arg" | $Xsed -e 's/^-L//'`
 	# We need an absolute path.
-	case "$dir" in
+	case $dir in
 	[\\/]* | [A-Za-z]:[\\/]*) ;;
 	*)
 	  absdir=`cd "$dir" && pwd`
 	  if test -z "$absdir"; then
-	    $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2
-	    $echo "$modename: passing it literally to the linker, although it might fail" 1>&2
-	    absdir="$dir"
+	    $echo "$modename: cannot determine absolute directory name of \`$dir'" 1>&2
+	    exit 1
 	  fi
 	  dir="$absdir"
 	  ;;
 	esac
-	case " $deplibs " in
-	*" $arg "*) ;;
-	*) deplibs="$deplibs $arg";;
+	case "$deplibs " in
+	*" -L$dir "*) ;;
+	*)
+	  deplibs="$deplibs -L$dir"
+	  lib_search_path="$lib_search_path $dir"
+	  ;;
 	esac
-	case " $lib_search_path " in
-	*" $dir "*) ;;
-	*) lib_search_path="$lib_search_path $dir";;
-	esac
-	case "$host" in
-	*-*-cygwin* | *-*-mingw* | *-*-os2*)
-	  dllsearchdir=`cd "$dir" && pwd || echo "$dir"`
-	  case ":$dllsearchpath:" in
-	  ::) dllsearchpath="$dllsearchdir";;
-	  *":$dllsearchdir:"*) ;;
-	  *) dllsearchpath="$dllsearchpath:$dllsearchdir";;
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
+	  case :$dllsearchpath: in
+	  *":$dir:"*) ;;
+	  *) dllsearchpath="$dllsearchpath:$dir";;
 	  esac
 	  ;;
 	esac
+	continue
 	;;
 
       -l*)
-	if test "$arg" = "-lc"; then
-	  case "$host" in
-	  *-*-cygwin* | *-*-mingw* | *-*-os2* | *-*-beos*)
-	    # These systems don't actually have c library (as such)
+	if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then
+	  case $host in
+	  *-*-cygwin* | *-*-pw32* | *-*-beos*)
+	    # These systems don't actually have a C or math library (as such)
 	    continue
 	    ;;
+	  *-*-mingw* | *-*-os2*)
+	    # These systems don't actually have a C library (as such)
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  *-*-openbsd*)
+	    # Do not include libc due to us having libc/libc_r.
+	    test "X$arg" = "X-lc" && continue
+	    ;;
 	  esac
-	elif test "$arg" = "-lm"; then
-	  case "$host" in
-	  *-*-cygwin* | *-*-beos*)
-	    # These systems don't actually have math library (as such)
+	 elif test "X$arg" = "X-lc_r"; then
+	  case $host in
+	  *-*-openbsd*)
+	    # Do not include libc_r directly, use -pthread flag.
 	    continue
 	    ;;
 	  esac
 	fi
 	deplibs="$deplibs $arg"
+	continue
 	;;
 
       -module)
@@ -1096,6 +1065,25 @@
 	continue
 	;;
 
+      -no-fast-install)
+	fast_install=no
+	continue
+	;;
+
+      -no-install)
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
+	  # The PATH hackery in wrapper scripts is required on Windows
+	  # in order for the loader to find any dlls it needs.
+	  $echo "$modename: warning: \`-no-install' is ignored for $host" 1>&2
+	  $echo "$modename: warning: assuming \`-no-fast-install' instead" 1>&2
+	  fast_install=no
+	  ;;
+	*) no_install=yes ;;
+	esac
+	continue
+	;;
+
       -no-undefined)
 	allow_undefined=no
 	continue
@@ -1121,7 +1109,7 @@
       -R*)
 	dir=`$echo "X$arg" | $Xsed -e 's/^-R//'`
 	# We need an absolute path.
-	case "$dir" in
+	case $dir in
 	[\\/]* | [A-Za-z]:[\\/]*) ;;
 	*)
 	  $echo "$modename: only absolute run-paths are allowed" 1>&2
@@ -1136,11 +1124,11 @@
 	;;
 
       -static)
-	# If we have no pic_flag, then this is the same as -all-static.
-	if test -z "$pic_flag" && test -n "$link_static_flag"; then
-	  compile_command="$compile_command $link_static_flag"
-	  finalize_command="$finalize_command $link_static_flag"
-	fi
+	# The effects of -static are defined in a previous loop.
+	# We used to do the same as -all-static on platforms that
+	# didn't have a PIC flag, but the assumption that the effects
+	# would be equivalent was wrong.  It would break on at least
+	# Digital Unix and AIX.
 	continue
 	;;
 
@@ -1154,28 +1142,71 @@
 	continue
 	;;
 
+      -Wc,*)
+	args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wc,//'`
+	arg=
+	save_ifs="$IFS"; IFS=','
+	for flag in $args; do
+	  IFS="$save_ifs"
+	  case $flag in
+	    *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	    flag="\"$flag\""
+	    ;;
+	  esac
+	  arg="$arg $wl$flag"
+	  compiler_flags="$compiler_flags $flag"
+	done
+	IFS="$save_ifs"
+	arg=`$echo "X$arg" | $Xsed -e "s/^ //"`
+	;;
+
+      -Wl,*)
+	args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wl,//'`
+	arg=
+	save_ifs="$IFS"; IFS=','
+	for flag in $args; do
+	  IFS="$save_ifs"
+	  case $flag in
+	    *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	    flag="\"$flag\""
+	    ;;
+	  esac
+	  arg="$arg $wl$flag"
+	  compiler_flags="$compiler_flags $wl$flag"
+	  linker_flags="$linker_flags $flag"
+	done
+	IFS="$save_ifs"
+	arg=`$echo "X$arg" | $Xsed -e "s/^ //"`
+	;;
+
+      -Xcompiler)
+	prev=xcompiler
+	continue
+	;;
+
+      -Xlinker)
+	prev=xlinker
+	continue
+	;;
+
       # Some other compiler flag.
       -* | +*)
 	# Unknown arguments in both finalize_command and compile_command need
 	# to be aesthetically quoted because they are evaled later.
 	arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
-	case "$arg" in
-	*[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*)
+	case $arg in
+	*[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
 	  arg="\"$arg\""
 	  ;;
 	esac
 	;;
 
-      *.o | *.obj | *.a | *.lib)
-	# A standard object.
-	objs="$objs $arg"
-	;;
-
-      *.lo)
-	# A library object.
+      *.lo | *.$objext)
+	# A library or standard object.
 	if test "$prev" = dlfiles; then
-	  dlfiles="$dlfiles $arg"
-	  if test "$build_libtool_libs" = yes && test "$dlopen" = yes; then
+	  # This file was specified with -dlopen.
+	  if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+	    dlfiles="$dlfiles $arg"
 	    prev=
 	    continue
 	  else
@@ -1188,357 +1219,890 @@
 	  # Preload the old-style object.
 	  dlprefiles="$dlprefiles "`$echo "X$arg" | $Xsed -e "$lo2o"`
 	  prev=
+	else
+	  case $arg in
+	  *.lo) libobjs="$libobjs $arg" ;;
+	  *) objs="$objs $arg" ;;
+	  esac
 	fi
-	libobjs="$libobjs $arg"
 	;;
 
+      *.$libext)
+	# An archive.
+	deplibs="$deplibs $arg"
+	old_deplibs="$old_deplibs $arg"
+	continue
+	;;
+
       *.la)
 	# A libtool-controlled library.
 
-	dlname=
-	libdir=
-	library_names=
-	old_library=
+	if test "$prev" = dlfiles; then
+	  # This library was specified with -dlopen.
+	  dlfiles="$dlfiles $arg"
+	  prev=
+	elif test "$prev" = dlprefiles; then
+	  # The library was specified with -dlpreopen.
+	  dlprefiles="$dlprefiles $arg"
+	  prev=
+	else
+	  deplibs="$deplibs $arg"
+	fi
+	continue
+	;;
 
+      # Some other compiler argument.
+      *)
+	# Unknown arguments in both finalize_command and compile_command need
+	# to be aesthetically quoted because they are evaled later.
+	arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+	case $arg in
+	*[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	  arg="\"$arg\""
+	  ;;
+	esac
+	;;
+      esac # arg
+
+      # Now actually substitute the argument into the commands.
+      if test -n "$arg"; then
+	compile_command="$compile_command $arg"
+	finalize_command="$finalize_command $arg"
+      fi
+    done # argument parsing loop
+
+    if test -n "$prev"; then
+      $echo "$modename: the \`$prevarg' option requires an argument" 1>&2
+      $echo "$help" 1>&2
+      exit 1
+    fi
+
+    if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then
+      eval arg=\"$export_dynamic_flag_spec\"
+      compile_command="$compile_command $arg"
+      finalize_command="$finalize_command $arg"
+    fi
+
+    # calculate the name of the file, without its directory
+    outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'`
+    libobjs_save="$libobjs"
+
+    if test -n "$shlibpath_var"; then
+      # get the directories listed in $shlibpath_var
+      eval shlib_search_path=\`\$echo \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\`
+    else
+      shlib_search_path=
+    fi
+    eval sys_lib_search_path=\"$sys_lib_search_path_spec\"
+    eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\"
+
+    output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'`
+    if test "X$output_objdir" = "X$output"; then
+      output_objdir="$objdir"
+    else
+      output_objdir="$output_objdir/$objdir"
+    fi
+    # Create the object directory.
+    if test ! -d $output_objdir; then
+      $show "$mkdir $output_objdir"
+      $run $mkdir $output_objdir
+      status=$?
+      if test $status -ne 0 && test ! -d $output_objdir; then
+	exit $status
+      fi
+    fi
+
+    # Determine the type of output
+    case $output in
+    "")
+      $echo "$modename: you must specify an output file" 1>&2
+      $echo "$help" 1>&2
+      exit 1
+      ;;
+    *.$libext) linkmode=oldlib ;;
+    *.lo | *.$objext) linkmode=obj ;;
+    *.la) linkmode=lib ;;
+    *) linkmode=prog ;; # Anything else should be a program.
+    esac
+
+    specialdeplibs=
+    libs=
+    # Find all interdependent deplibs by searching for libraries
+    # that are linked more than once (e.g. -la -lb -la)
+    for deplib in $deplibs; do
+      case "$libs " in
+      *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+      esac
+      libs="$libs $deplib"
+    done
+    deplibs=
+    newdependency_libs=
+    newlib_search_path=
+    need_relink=no # whether we're linking any uninstalled libtool libraries
+    notinst_deplibs= # not-installed libtool libraries
+    notinst_path= # paths that contain not-installed libtool libraries
+    case $linkmode in
+    lib)
+	passes="conv link"
+	for file in $dlfiles $dlprefiles; do
+	  case $file in
+	  *.la) ;;
+	  *)
+	    $echo "$modename: libraries can \`-dlopen' only libtool libraries: $file" 1>&2
+	    exit 1
+	    ;;
+	  esac
+	done
+	;;
+    prog)
+	compile_deplibs=
+	finalize_deplibs=
+	alldeplibs=no
+	newdlfiles=
+	newdlprefiles=
+	passes="conv scan dlopen dlpreopen link"
+	;;
+    *)  passes="conv"
+	;;
+    esac
+    for pass in $passes; do
+      if test $linkmode = prog; then
+	# Determine which files to process
+	case $pass in
+	dlopen)
+	  libs="$dlfiles"
+	  save_deplibs="$deplibs" # Collect dlpreopened libraries
+	  deplibs=
+	  ;;
+	dlpreopen) libs="$dlprefiles" ;;
+	link) libs="$deplibs %DEPLIBS% $dependency_libs" ;;
+	esac
+      fi
+      for deplib in $libs; do
+	lib=
+	found=no
+	case $deplib in
+	-l*)
+	  if test $linkmode = oldlib && test $linkmode = obj; then
+	    $echo "$modename: warning: \`-l' is ignored for archives/objects: $deplib" 1>&2
+	    continue
+	  fi
+	  if test $pass = conv; then
+	    deplibs="$deplib $deplibs"
+	    continue
+	  fi
+	  name=`$echo "X$deplib" | $Xsed -e 's/^-l//'`
+	  for searchdir in $newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path; do
+	    # Search the libtool library
+	    lib="$searchdir/lib${name}.la"
+	    if test -f "$lib"; then
+	      found=yes
+	      break
+	    fi
+	  done
+	  if test "$found" != yes; then
+	    # deplib doesn't seem to be a libtool library
+	    if test "$linkmode,$pass" = "prog,link"; then
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    else
+	      deplibs="$deplib $deplibs"
+	      test $linkmode = lib && newdependency_libs="$deplib $newdependency_libs"
+	    fi
+	    continue
+	  fi
+	  ;; # -l
+	-L*)
+	  case $linkmode in
+	  lib)
+	    deplibs="$deplib $deplibs"
+	    test $pass = conv && continue
+	    newdependency_libs="$deplib $newdependency_libs"
+	    newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`
+	    ;;
+	  prog)
+	    if test $pass = conv; then
+	      deplibs="$deplib $deplibs"
+	      continue
+	    fi
+	    if test $pass = scan; then
+	      deplibs="$deplib $deplibs"
+	      newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`
+	    else
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    fi
+	    ;;
+	  *)
+	    $echo "$modename: warning: \`-L' is ignored for archives/objects: $deplib" 1>&2
+	    ;;
+	  esac # linkmode
+	  continue
+	  ;; # -L
+	-R*)
+	  if test $pass = link; then
+	    dir=`$echo "X$deplib" | $Xsed -e 's/^-R//'`
+	    # Make sure the xrpath contains only unique directories.
+	    case "$xrpath " in
+	    *" $dir "*) ;;
+	    *) xrpath="$xrpath $dir" ;;
+	    esac
+	  fi
+	  deplibs="$deplib $deplibs"
+	  continue
+	  ;;
+	*.la) lib="$deplib" ;;
+	*.$libext)
+	  if test $pass = conv; then
+	    deplibs="$deplib $deplibs"
+	    continue
+	  fi
+	  case $linkmode in
+	  lib)
+	    if test "$deplibs_check_method" != pass_all; then
+	      echo
+	      echo "*** Warning: This library needs some functionality provided by $deplib."
+	      echo "*** I have the capability to make that library automatically link in when"
+	      echo "*** you link to this library.  But I can only do this if you have a"
+	      echo "*** shared version of the library, which you do not appear to have."
+	    else
+	      echo
+	      echo "*** Warning: Linking the shared library $output against the"
+	      echo "*** static library $deplib is not portable!"
+	      deplibs="$deplib $deplibs"
+	    fi
+	    continue
+	    ;;
+	  prog)
+	    if test $pass != link; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    fi
+	    continue
+	    ;;
+	  esac # linkmode
+	  ;; # *.$libext
+	*.lo | *.$objext)
+	  if test $pass = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then
+	    # If there is no dlopen support or we're linking statically,
+	    # we need to preload.
+	    newdlprefiles="$newdlprefiles $deplib"
+	    compile_deplibs="$deplib $compile_deplibs"
+	    finalize_deplibs="$deplib $finalize_deplibs"
+	  else
+	    newdlfiles="$newdlfiles $deplib"
+	  fi
+	  continue
+	  ;;
+	%DEPLIBS%)
+	  alldeplibs=yes
+	  continue
+	  ;;
+	esac # case $deplib
+	if test $found = yes || test -f "$lib"; then :
+	else
+	  $echo "$modename: cannot find the library \`$lib'" 1>&2
+	  exit 1
+	fi
+
 	# Check to see that this really is a libtool archive.
-	if (sed -e '2q' $arg | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
+	if (sed -e '2q' $lib | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
 	else
-	  $echo "$modename: \`$arg' is not a valid libtool archive" 1>&2
+	  $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
 	  exit 1
 	fi
 
+	ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'`
+	test "X$ladir" = "X$lib" && ladir="."
+
+	dlname=
+	dlopen=
+	dlpreopen=
+	libdir=
+	library_names=
+	old_library=
 	# If the library was installed with an old release of libtool,
 	# it will not redefine variable installed.
 	installed=yes
 
 	# Read the .la file
-	# If there is no directory component, then add one.
-	case "$arg" in
-	*/* | *\\*) . $arg ;;
-	*) . ./$arg ;;
+	case $lib in
+	*/* | *\\*) . $lib ;;
+	*) . ./$lib ;;
 	esac
 
+	if test "$linkmode,$pass" = "lib,link" ||
+	   test "$linkmode,$pass" = "prog,scan" ||
+	   { test $linkmode = oldlib && test $linkmode = obj; }; then
+	   # Add dl[pre]opened files of deplib
+	  test -n "$dlopen" && dlfiles="$dlfiles $dlopen"
+	  test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen"
+	fi
+
+	if test $pass = conv; then
+	  # Only check for convenience libraries
+	  deplibs="$lib $deplibs"
+	  if test -z "$libdir"; then
+	    if test -z "$old_library"; then
+	      $echo "$modename: cannot find name of link library for \`$lib'" 1>&2
+	      exit 1
+	    fi
+	    # It is a libtool convenience library, so add in its objects.
+	    convenience="$convenience $ladir/$objdir/$old_library"
+	    old_convenience="$old_convenience $ladir/$objdir/$old_library"
+	    tmp_libs=
+	    for deplib in $dependency_libs; do
+	      deplibs="$deplib $deplibs"
+	      case "$tmp_libs " in
+	      *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+	      esac
+	      tmp_libs="$tmp_libs $deplib"
+	    done
+	  elif test $linkmode != prog && test $linkmode != lib; then
+	    $echo "$modename: \`$lib' is not a convenience library" 1>&2
+	    exit 1
+	  fi
+	  continue
+	fi # $pass = conv
+
 	# Get the name of the library we link against.
 	linklib=
 	for l in $old_library $library_names; do
 	  linklib="$l"
 	done
-
 	if test -z "$linklib"; then
-	  $echo "$modename: cannot find name of link library for \`$arg'" 1>&2
+	  $echo "$modename: cannot find name of link library for \`$lib'" 1>&2
 	  exit 1
 	fi
 
-	# Find the relevant object directory and library name.
-	name=`$echo "X$arg" | $Xsed -e 's%^.*/%%' -e 's/\.la$//' -e 's/^lib//'`
-
-	if test "X$installed" = Xyes; then
-	  dir="$libdir"
-	else
-	  dir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
-	  if test "X$dir" = "X$arg"; then
-	    dir="$objdir"
+	# This library was specified with -dlopen.
+	if test $pass = dlopen; then
+	  if test -z "$libdir"; then
+	    $echo "$modename: cannot -dlopen a convenience library: \`$lib'" 1>&2
+	    exit 1
+	  fi
+	  if test -z "$dlname" || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then
+	    # If there is no dlname, no dlopen support or we're linking
+	    # statically, we need to preload.
+	    dlprefiles="$dlprefiles $lib"
 	  else
-	    dir="$dir/$objdir"
+	    newdlfiles="$newdlfiles $lib"
 	  fi
-	fi
-
-	if test -n "$dependency_libs"; then
-	  # Extract -R and -L from dependency_libs
-	  temp_deplibs=
-	  for deplib in $dependency_libs; do
-	    case "$deplib" in
-	    -R*) temp_xrpath=`$echo "X$deplib" | $Xsed -e 's/^-R//'`
-		 case " $rpath $xrpath " in
-		 *" $temp_xrpath "*) ;;
-		 *) xrpath="$xrpath $temp_xrpath";;
-		 esac;;
-	    -L*) case "$compile_command $temp_deplibs " in
-		 *" $deplib "*) ;;
-		 *) temp_deplibs="$temp_deplibs $deplib";;
-		 esac
-		 temp_dir=`$echo "X$deplib" | $Xsed -e 's/^-L//'`
-		 case " $lib_search_path " in
-		 *" $temp_dir "*) ;;
-		 *) lib_search_path="$lib_search_path $temp_dir";;
-		 esac
-		 ;;
-	    *) temp_deplibs="$temp_deplibs $deplib";;
-	    esac
-	  done
-	  dependency_libs="$temp_deplibs"
-	fi
-
-	if test -z "$libdir"; then
-	  # It is a libtool convenience library, so add in its objects.
-	  convenience="$convenience $dir/$old_library"
-	  old_convenience="$old_convenience $dir/$old_library"
-	  deplibs="$deplibs$dependency_libs"
-	  compile_command="$compile_command $dir/$old_library$dependency_libs"
-	  finalize_command="$finalize_command $dir/$old_library$dependency_libs"
 	  continue
-	fi
+	fi # $pass = dlopen
 
-	# This library was specified with -dlopen.
-	if test "$prev" = dlfiles; then
-	  dlfiles="$dlfiles $arg"
-	  if test -z "$dlname" || test "$dlopen" != yes || test "$build_libtool_libs" = no; then
-	    # If there is no dlname, no dlopen support or we're linking statically,
-	    # we need to preload.
-	    prev=dlprefiles
+	# We need an absolute path.
+	case $ladir in
+	[\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;;
+	*)
+	  abs_ladir=`cd "$ladir" && pwd`
+	  if test -z "$abs_ladir"; then
+	    $echo "$modename: warning: cannot determine absolute directory name of \`$ladir'" 1>&2
+	    $echo "$modename: passing it literally to the linker, although it might fail" 1>&2
+	    abs_ladir="$ladir"
+	  fi
+	  ;;
+	esac
+	laname=`$echo "X$lib" | $Xsed -e 's%^.*/%%'`
+
+	# Find the relevant object directory and library name.
+	if test "X$installed" = Xyes; then
+	  if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+	    $echo "$modename: warning: library \`$lib' was moved." 1>&2
+	    dir="$ladir"
+	    absdir="$abs_ladir"
+	    libdir="$abs_ladir"
 	  else
-	    # We should not create a dependency on this library, but we
-	    # may need any libraries it requires.
-	    compile_command="$compile_command$dependency_libs"
-	    finalize_command="$finalize_command$dependency_libs"
-	    prev=
-	    continue
+	    dir="$libdir"
+	    absdir="$libdir"
 	  fi
-	fi
+	else
+	  dir="$ladir/$objdir"
+	  absdir="$abs_ladir/$objdir"
+	  # Remove this search path later
+	  notinst_path="$notinst_path $abs_ladir"
+	fi # $installed = yes
+	name=`$echo "X$laname" | $Xsed -e 's/\.la$//' -e 's/^lib//'`
 
-	# The library was specified with -dlpreopen.
-	if test "$prev" = dlprefiles; then
+	# This library was specified with -dlpreopen.
+	if test $pass = dlpreopen; then
+	  if test -z "$libdir"; then
+	    $echo "$modename: cannot -dlpreopen a convenience library: \`$lib'" 1>&2
+	    exit 1
+	  fi
 	  # Prefer using a static library (so that no silly _DYNAMIC symbols
 	  # are required to link).
 	  if test -n "$old_library"; then
-	    dlprefiles="$dlprefiles $dir/$old_library"
+	    newdlprefiles="$newdlprefiles $dir/$old_library"
+	  # Otherwise, use the dlname, so that lt_dlopen finds it.
+	  elif test -n "$dlname"; then
+	    newdlprefiles="$newdlprefiles $dir/$dlname"
 	  else
-	    dlprefiles="$dlprefiles $dir/$linklib"
+	    newdlprefiles="$newdlprefiles $dir/$linklib"
 	  fi
-	  prev=
+	fi # $pass = dlpreopen
+
+	if test -z "$libdir"; then
+	  # Link the convenience library
+	  if test $linkmode = lib; then
+	    deplibs="$dir/$old_library $deplibs"
+	  elif test "$linkmode,$pass" = "prog,link"; then
+	    compile_deplibs="$dir/$old_library $compile_deplibs"
+	    finalize_deplibs="$dir/$old_library $finalize_deplibs"
+	  else
+	    deplibs="$lib $deplibs"
+	  fi
+	  continue
 	fi
 
-	if test -n "$library_names" &&
-	   { test "$prefer_static_libs" = no || test -z "$old_library"; }; then
-	  link_against_libtool_libs="$link_against_libtool_libs $arg"
-	  if test -n "$shlibpath_var"; then
-	    # Make sure the rpath contains only unique directories.
-	    case "$temp_rpath " in
-	    *" $dir "*) ;;
-	    *) temp_rpath="$temp_rpath $dir" ;;
-	    esac
+	if test $linkmode = prog && test $pass != link; then
+	  newlib_search_path="$newlib_search_path $ladir"
+	  deplibs="$lib $deplibs"
+
+	  linkalldeplibs=no
+	  if test "$link_all_deplibs" != no || test -z "$library_names" ||
+	     test "$build_libtool_libs" = no; then
+	    linkalldeplibs=yes
 	  fi
 
-	  # We need an absolute path.
-	  case "$dir" in
-	  [\\/] | [A-Za-z]:[\\/]*) absdir="$dir" ;;
-	  *)
-	    absdir=`cd "$dir" && pwd`
-	    if test -z "$absdir"; then
-	      $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2
-	      $echo "$modename: passing it literally to the linker, although it might fail" 1>&2
-	      absdir="$dir"
+	  tmp_libs=
+	  for deplib in $dependency_libs; do
+	    case $deplib in
+	    -L*) newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`;; ### testsuite: skip nested quoting test
+	    esac
+	    # Need to link against all dependency_libs?
+	    if test $linkalldeplibs = yes; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      # Need to hardcode shared library paths
+	      # or/and link against static libraries
+	      newdependency_libs="$deplib $newdependency_libs"
 	    fi
-	    ;;
-	  esac
-	  
-	  # This is the magic to use -rpath.
-	  # Skip directories that are in the system default run-time
-	  # search path, unless they have been requested with -R.
-	  case " $sys_lib_dlsearch_path " in
-	  *" $absdir "*) ;;
-	  *)
-	    case "$compile_rpath " in
-	    *" $absdir "*) ;;
-	    *) compile_rpath="$compile_rpath $absdir" 
+	    case "$tmp_libs " in
+	    *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
 	    esac
-	    ;;
-	  esac
+	    tmp_libs="$tmp_libs $deplib"
+	  done # for deplib
+	  continue
+	fi # $linkmode = prog...
 
-	  case " $sys_lib_dlsearch_path " in
-	  *" $libdir "*) ;;
-	  *)
-	    case "$finalize_rpath " in
+	link_static=no # Whether the deplib will be linked statically
+	if test -n "$library_names" &&
+	   { test "$prefer_static_libs" = no || test -z "$old_library"; }; then
+	  # Link against this shared library
+
+	  if test "$linkmode,$pass" = "prog,link" ||
+	   { test $linkmode = lib && test $hardcode_into_libs = yes; }; then
+	    # Hardcode the library path.
+	    # Skip directories that are in the system default run-time
+	    # search path.
+	    case " $sys_lib_dlsearch_path " in
+	    *" $absdir "*) ;;
+	    *)
+	      case "$compile_rpath " in
+	      *" $absdir "*) ;;
+	      *) compile_rpath="$compile_rpath $absdir"
+	      esac
+	      ;;
+	    esac
+	    case " $sys_lib_dlsearch_path " in
 	    *" $libdir "*) ;;
-	    *) finalize_rpath="$finalize_rpath $libdir"
+	    *)
+	      case "$finalize_rpath " in
+	      *" $libdir "*) ;;
+	      *) finalize_rpath="$finalize_rpath $libdir"
+	      esac
+	      ;;
 	    esac
-	    ;;
-	  esac
+	    if test $linkmode = prog; then
+	      # We need to hardcode the library path
+	      if test -n "$shlibpath_var"; then
+		# Make sure the rpath contains only unique directories.
+		case "$temp_rpath " in
+		*" $dir "*) ;;
+		*" $absdir "*) ;;
+		*) temp_rpath="$temp_rpath $dir" ;;
+		esac
+	      fi
+	    fi
+	  fi # $linkmode,$pass = prog,link...
 
-	  lib_linked=yes
-	  case "$hardcode_action" in
-	  immediate | unsupported)
-	    if test "$hardcode_direct" = no; then
-	      compile_command="$compile_command $dir/$linklib"
-	      deplibs="$deplibs $dir/$linklib"
-	      case "$host" in
-	      *-*-cygwin* | *-*-mingw* | *-*-os2*)
-		dllsearchdir=`cd "$dir" && pwd || echo "$dir"`
-		if test -n "$dllsearchpath"; then
-		  dllsearchpath="$dllsearchpath:$dllsearchdir"
-		else
-		  dllsearchpath="$dllsearchdir"
-		fi
+	  if test "$alldeplibs" = yes &&
+	     { test "$deplibs_check_method" = pass_all ||
+	       { test "$build_libtool_libs" = yes &&
+		 test -n "$library_names"; }; }; then
+	    # We only need to search for static libraries
+	    continue
+	  fi
+
+	  if test "$installed" = no; then
+	    notinst_deplibs="$notinst_deplibs $lib"
+	    need_relink=yes
+	  fi
+
+	  if test -n "$old_archive_from_expsyms_cmds"; then
+	    # figure out the soname
+	    set dummy $library_names
+	    realname="$2"
+	    shift; shift
+	    libname=`eval \\$echo \"$libname_spec\"`
+	    # use dlname if we got it. it's perfectly good, no?
+	    if test -n "$dlname"; then
+	      soname="$dlname"
+	    elif test -n "$soname_spec"; then
+	      # bleh windows
+	      case $host in
+	      *cygwin*)
+		major=`expr $current - $age`
+		versuffix="-$major"
 		;;
 	      esac
-	    elif test "$hardcode_minus_L" = no; then
-	      case "$host" in
-	      *-*-sunos*)
-		compile_shlibpath="$compile_shlibpath$dir:"
-		;;
-	      esac
-	      case "$compile_command " in
-	      *" -L$dir "*) ;;
-	      *) compile_command="$compile_command -L$dir";;
-	      esac
-	      compile_command="$compile_command -l$name"
-	      deplibs="$deplibs -L$dir -l$name"
-	    elif test "$hardcode_shlibpath_var" = no; then
-	      case ":$compile_shlibpath:" in
-	      *":$dir:"*) ;;
-	      *) compile_shlibpath="$compile_shlibpath$dir:";;
+	      eval soname=\"$soname_spec\"
+	    else
+	      soname="$realname"
+	    fi
+
+	    # Make a new name for the extract_expsyms_cmds to use
+	    soroot="$soname"
+	    soname=`echo $soroot | sed -e 's/^.*\///'`
+	    newlib="libimp-`echo $soname | sed 's/^lib//;s/\.dll$//'`.a"
+
+	    # If the library has no export list, then create one now
+	    if test -f "$output_objdir/$soname-def"; then :
+	    else
+	      $show "extracting exported symbol list from \`$soname'"
+	      save_ifs="$IFS"; IFS='~'
+	      eval cmds=\"$extract_expsyms_cmds\"
+	      for cmd in $cmds; do
+		IFS="$save_ifs"
+		$show "$cmd"
+		$run eval "$cmd" || exit $?
+	      done
+	      IFS="$save_ifs"
+	    fi
+
+	    # Create $newlib
+	    if test -f "$output_objdir/$newlib"; then :; else
+	      $show "generating import library for \`$soname'"
+	      save_ifs="$IFS"; IFS='~'
+	      eval cmds=\"$old_archive_from_expsyms_cmds\"
+	      for cmd in $cmds; do
+		IFS="$save_ifs"
+		$show "$cmd"
+		$run eval "$cmd" || exit $?
+	      done
+	      IFS="$save_ifs"
+	    fi
+	    # make sure the library variables are pointing to the new library
+	    dir=$output_objdir
+	    linklib=$newlib
+	  fi # test -n $old_archive_from_expsyms_cmds
+
+	  if test $linkmode = prog || test "$mode" != relink; then
+	    add_shlibpath=
+	    add_dir=
+	    add=
+	    lib_linked=yes
+	    case $hardcode_action in
+	    immediate | unsupported)
+	      if test "$hardcode_direct" = no; then
+		add="$dir/$linklib"
+	      elif test "$hardcode_minus_L" = no; then
+		case $host in
+		*-*-sunos*) add_shlibpath="$dir" ;;
+		esac
+		add_dir="-L$dir"
+		add="-l$name"
+	      elif test "$hardcode_shlibpath_var" = no; then
+		add_shlibpath="$dir"
+		add="-l$name"
+	      else
+		lib_linked=no
+	      fi
+	      ;;
+	    relink)
+	      if test "$hardcode_direct" = yes; then
+		add="$dir/$linklib"
+	      elif test "$hardcode_minus_L" = yes; then
+		add_dir="-L$dir"
+		add="-l$name"
+	      elif test "$hardcode_shlibpath_var" = yes; then
+		add_shlibpath="$dir"
+		add="-l$name"
+	      else
+		lib_linked=no
+	      fi
+	      ;;
+	    *) lib_linked=no ;;
+	    esac
+
+	    if test "$lib_linked" != yes; then
+	      $echo "$modename: configuration error: unsupported hardcode properties"
+	      exit 1
+	    fi
+
+	    if test -n "$add_shlibpath"; then
+	      case :$compile_shlibpath: in
+	      *":$add_shlibpath:"*) ;;
+	      *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;;
 	      esac
-	      compile_command="$compile_command -l$name"
-	      deplibs="$deplibs -l$name"
+	    fi
+	    if test $linkmode = prog; then
+	      test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs"
+	      test -n "$add" && compile_deplibs="$add $compile_deplibs"
 	    else
-	      lib_linked=no
+	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
+	      test -n "$add" && deplibs="$add $deplibs"
+	      if test "$hardcode_direct" != yes && \
+		 test "$hardcode_minus_L" != yes && \
+		 test "$hardcode_shlibpath_var" = yes; then
+		case :$finalize_shlibpath: in
+		*":$libdir:"*) ;;
+		*) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
+		esac
+	      fi
 	    fi
-	    ;;
+	  fi
 
-	  relink)
+	  if test $linkmode = prog || test "$mode" = relink; then
+	    add_shlibpath=
+	    add_dir=
+	    add=
+	    # Finalize command for both is simple: just hardcode it.
 	    if test "$hardcode_direct" = yes; then
-	      compile_command="$compile_command $absdir/$linklib"
-	      deplibs="$deplibs $absdir/$linklib"
+	      add="$libdir/$linklib"
 	    elif test "$hardcode_minus_L" = yes; then
-	      case "$compile_command " in
-	      *" -L$absdir "*) ;;
-	      *) compile_command="$compile_command -L$absdir";;
-	      esac
-	      compile_command="$compile_command -l$name"
-	      deplibs="$deplibs -L$absdir -l$name"
+	      add_dir="-L$libdir"
+	      add="-l$name"
 	    elif test "$hardcode_shlibpath_var" = yes; then
-	      case ":$compile_shlibpath:" in
-	      *":$absdir:"*) ;;
-	      *) compile_shlibpath="$compile_shlibpath$absdir:";;
+	      case :$finalize_shlibpath: in
+	      *":$libdir:"*) ;;
+	      *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
 	      esac
-	      compile_command="$compile_command -l$name"
-	      deplibs="$deplibs -l$name"
+	      add="-l$name"
 	    else
-	      lib_linked=no
+	      # We cannot seem to hardcode it, guess we'll fake it.
+	      add_dir="-L$libdir"
+	      add="-l$name"
 	    fi
-	    ;;
 
-	  *)
-	    lib_linked=no
-	    ;;
-	  esac
-
-	  if test "$lib_linked" != yes; then
-	    $echo "$modename: configuration error: unsupported hardcode properties"
-	    exit 1
+	    if test $linkmode = prog; then
+	      test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs"
+	      test -n "$add" && finalize_deplibs="$add $finalize_deplibs"
+	    else
+	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
+	      test -n "$add" && deplibs="$add $deplibs"
+	    fi
 	  fi
-
-	  # Finalize command for both is simple: just hardcode it.
-	  if test "$hardcode_direct" = yes; then
-	    finalize_command="$finalize_command $libdir/$linklib"
-	  elif test "$hardcode_minus_L" = yes; then
-	    case "$finalize_command " in
-	    *" -L$libdir "*) ;;
-	    *) finalize_command="$finalize_command -L$libdir";;
-	    esac
-	    finalize_command="$finalize_command -l$name"
-	  elif test "$hardcode_shlibpath_var" = yes; then
-	    case ":$finalize_shlibpath:" in
-	    *":$libdir:"*) ;;
-	    *) finalize_shlibpath="$finalize_shlibpath$libdir:";;
-	    esac
-	    finalize_command="$finalize_command -l$name"
-	  else
-	    # We cannot seem to hardcode it, guess we'll fake it.
-	    case "$finalize_command " in
-	    *" -L$dir "*) ;;
-	    *) finalize_command="$finalize_command -L$libdir";;
-	    esac
-	    finalize_command="$finalize_command -l$name"
+	elif test $linkmode = prog; then
+	  if test "$alldeplibs" = yes &&
+	     { test "$deplibs_check_method" = pass_all ||
+	       { test "$build_libtool_libs" = yes &&
+		 test -n "$library_names"; }; }; then
+	    # We only need to search for static libraries
+	    continue
 	  fi
-	else
-	  # Transform directly to old archives if we don't build new libraries.
-	  if test -n "$pic_flag" && test -z "$old_library"; then
-	    $echo "$modename: cannot find static library for \`$arg'" 1>&2
-	    exit 1
-	  fi
 
+	  # Try to link the static library
 	  # Here we assume that one of hardcode_direct or hardcode_minus_L
 	  # is not unsupported.  This is valid on all known static and
 	  # shared platforms.
 	  if test "$hardcode_direct" != unsupported; then
 	    test -n "$old_library" && linklib="$old_library"
-	    compile_command="$compile_command $dir/$linklib"
-	    finalize_command="$finalize_command $dir/$linklib"
+	    compile_deplibs="$dir/$linklib $compile_deplibs"
+	    finalize_deplibs="$dir/$linklib $finalize_deplibs"
 	  else
-	    case "$compile_command " in
-	    *" -L$dir "*) ;;
-	    *) compile_command="$compile_command -L$dir";;
-	    esac
-	    compile_command="$compile_command -l$name"
-	    case "$finalize_command " in
-	    *" -L$dir "*) ;;
-	    *) finalize_command="$finalize_command -L$dir";;
-	    esac
-	    finalize_command="$finalize_command -l$name"
+	    compile_deplibs="-l$name -L$dir $compile_deplibs"
+	    finalize_deplibs="-l$name -L$dir $finalize_deplibs"
 	  fi
-	fi
+	elif test "$build_libtool_libs" = yes; then
+	  # Not a shared library
+	  if test "$deplibs_check_method" != pass_all; then
+	    # We're trying link a shared library against a static one
+	    # but the system doesn't support it.
 
-	# Add in any libraries that this one depends upon.
-	compile_command="$compile_command$dependency_libs"
-	finalize_command="$finalize_command$dependency_libs"
-	continue
-	;;
+	    # Just print a warning and add the library to dependency_libs so
+	    # that the program can be linked against the static library.
+	    echo
+	    echo "*** Warning: This library needs some functionality provided by $lib."
+	    echo "*** I have the capability to make that library automatically link in when"
+	    echo "*** you link to this library.  But I can only do this if you have a"
+	    echo "*** shared version of the library, which you do not appear to have."
+	    if test "$module" = yes; then
+	      echo "*** Therefore, libtool will create a static module, that should work "
+	      echo "*** as long as the dlopening application is linked with the -dlopen flag."
+	      if test -z "$global_symbol_pipe"; then
+		echo
+		echo "*** However, this would only work if libtool was able to extract symbol"
+		echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+		echo "*** not find such a program.  So, this module is probably useless."
+		echo "*** \`nm' from GNU binutils and a full rebuild may help."
+	      fi
+	      if test "$build_old_libs" = no; then
+		build_libtool_libs=module
+		build_old_libs=yes
+	      else
+		build_libtool_libs=no
+	      fi
+	    fi
+	  else
+	    convenience="$convenience $dir/$old_library"
+	    old_convenience="$old_convenience $dir/$old_library"
+	    deplibs="$dir/$old_library $deplibs"
+	    link_static=yes
+	  fi
+	fi # link shared/static library?
 
-      # Some other compiler argument.
-      *)
-	# Unknown arguments in both finalize_command and compile_command need
-	# to be aesthetically quoted because they are evaled later.
-	arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
-	case "$arg" in
-	*[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*)
-	  arg="\"$arg\""
-	  ;;
-	esac
-	;;
-      esac
+	if test $linkmode = lib; then
+	  if test -n "$dependency_libs" &&
+	     { test $hardcode_into_libs != yes || test $build_old_libs = yes ||
+	       test $link_static = yes; }; then
+	    # Extract -R from dependency_libs
+	    temp_deplibs=
+	    for libdir in $dependency_libs; do
+	      case $libdir in
+	      -R*) temp_xrpath=`$echo "X$libdir" | $Xsed -e 's/^-R//'`
+		   case " $xrpath " in
+		   *" $temp_xrpath "*) ;;
+		   *) xrpath="$xrpath $temp_xrpath";;
+		   esac;;
+	      *) temp_deplibs="$temp_deplibs $libdir";;
+	      esac
+	    done
+	    dependency_libs="$temp_deplibs"
+	  fi
 
-      # Now actually substitute the argument into the commands.
-      if test -n "$arg"; then
-	compile_command="$compile_command $arg"
-	finalize_command="$finalize_command $arg"
-      fi
-    done
+	  newlib_search_path="$newlib_search_path $absdir"
+	  # Link against this library
+	  test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
+	  # ... and its dependency_libs
+	  tmp_libs=
+	  for deplib in $dependency_libs; do
+	    newdependency_libs="$deplib $newdependency_libs"
+	    case "$tmp_libs " in
+	    *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+	    esac
+	    tmp_libs="$tmp_libs $deplib"
+	  done
 
-    if test -n "$prev"; then
-      $echo "$modename: the \`$prevarg' option requires an argument" 1>&2
-      $echo "$help" 1>&2
-      exit 1
-    fi
-
-    if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then
-      eval arg=\"$export_dynamic_flag_spec\"
-      compile_command="$compile_command $arg"
-      finalize_command="$finalize_command $arg"
-    fi
-
-    oldlibs=
-    # calculate the name of the file, without its directory
-    outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'`
-    libobjs_save="$libobjs"
-
-    case "$output" in
-    "")
-      $echo "$modename: you must specify an output file" 1>&2
-      $echo "$help" 1>&2
-      exit 1
-      ;;
-
-    *.a | *.lib)
-      if test -n "$link_against_libtool_libs"; then
-	$echo "$modename: error: cannot link libtool libraries into archives" 1>&2
-	exit 1
+	  if test $link_all_deplibs != no; then
+	    # Add the search paths of all dependency libraries
+	    for deplib in $dependency_libs; do
+	      case $deplib in
+	      -L*) path="$deplib" ;;
+	      *.la)
+		dir=`$echo "X$deplib" | $Xsed -e 's%/[^/]*$%%'`
+		test "X$dir" = "X$deplib" && dir="."
+		# We need an absolute path.
+		case $dir in
+		[\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;;
+		*)
+		  absdir=`cd "$dir" && pwd`
+		  if test -z "$absdir"; then
+		    $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2
+		    absdir="$dir"
+		  fi
+		  ;;
+		esac
+		if grep "^installed=no" $deplib > /dev/null; then
+		  path="-L$absdir/$objdir"
+		else
+		  eval libdir=`sed -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+		  if test -z "$libdir"; then
+		    $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2
+		    exit 1
+		  fi
+		  if test "$absdir" != "$libdir"; then
+		    $echo "$modename: warning: \`$deplib' seems to be moved" 1>&2
+		  fi
+		  path="-L$absdir"
+		fi
+		;;
+	      *) continue ;;
+	      esac
+	      case " $deplibs " in
+	      *" $path "*) ;;
+	      *) deplibs="$deplibs $path" ;;
+	      esac
+	    done
+	  fi # link_all_deplibs != no
+	fi # linkmode = lib
+      done # for deplib in $libs
+      if test $pass = dlpreopen; then
+	# Link the dlpreopened libraries before other libraries
+	for deplib in $save_deplibs; do
+	  deplibs="$deplib $deplibs"
+	done
       fi
+      if test $pass != dlopen; then
+	test $pass != scan && dependency_libs="$newdependency_libs"
+	if test $pass != conv; then
+	  # Make sure lib_search_path contains only unique directories.
+	  lib_search_path=
+	  for dir in $newlib_search_path; do
+	    case "$lib_search_path " in
+	    *" $dir "*) ;;
+	    *) lib_search_path="$lib_search_path $dir" ;;
+	    esac
+	  done
+	  newlib_search_path=
+	fi
 
-      if test -n "$deplibs"; then
-	$echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2
+	if test "$linkmode,$pass" != "prog,link"; then
+	  vars="deplibs"
+	else
+	  vars="compile_deplibs finalize_deplibs"
+	fi
+	for var in $vars dependency_libs; do
+	  # Add libraries to $var in reverse order
+	  eval tmp_libs=\"\$$var\"
+	  new_libs=
+	  for deplib in $tmp_libs; do
+	    case $deplib in
+	    -L*) new_libs="$deplib $new_libs" ;;
+	    *)
+	      case " $specialdeplibs " in
+	      *" $deplib "*) new_libs="$deplib $new_libs" ;;
+	      *)
+		case " $new_libs " in
+		*" $deplib "*) ;;
+		*) new_libs="$deplib $new_libs" ;;
+		esac
+		;;
+	      esac
+	      ;;
+	    esac
+	  done
+	  tmp_libs=
+	  for deplib in $new_libs; do
+	    case $deplib in
+	    -L*)
+	      case " $tmp_libs " in
+	      *" $deplib "*) ;;
+	      *) tmp_libs="$tmp_libs $deplib" ;;
+	      esac
+	      ;;
+	    *) tmp_libs="$tmp_libs $deplib" ;;
+	    esac
+	  done
+	  eval $var=\"$tmp_libs\"
+	done # for var
       fi
+      if test "$pass" = "conv" &&
+       { test "$linkmode" = "lib" || test "$linkmode" = "prog"; }; then
+	libs="$deplibs" # reset libs
+	deplibs=
+      fi
+    done # for pass
+    if test $linkmode = prog; then
+      dlfiles="$newdlfiles"
+      dlprefiles="$newdlprefiles"
+    fi
 
+    case $linkmode in
+    oldlib)
       if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
 	$echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2
       fi
@@ -1566,11 +2130,12 @@
       # Now set the variables for building old libraries.
       build_libtool_libs=no
       oldlibs="$output"
+      objs="$objs$old_deplibs"
       ;;
 
-    *.la)
+    lib)
       # Make sure we only generate libraries of the form `libNAME.la'.
-      case "$outputname" in
+      case $outputname in
       lib*)
 	name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'`
 	eval libname=\"$libname_spec\"
@@ -1591,28 +2156,22 @@
 	;;
       esac
 
-      output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'`
-      if test "X$output_objdir" = "X$output"; then
-	output_objdir="$objdir"
-      else
-	output_objdir="$output_objdir/$objdir"
-      fi
-
       if test -n "$objs"; then
-	$echo "$modename: cannot build libtool library \`$output' from non-libtool objects:$objs" 2>&1
-	exit 1
+	if test "$deplibs_check_method" != pass_all; then
+	  $echo "$modename: cannot build libtool library \`$output' from non-libtool objects on this host:$objs" 2>&1
+	  exit 1
+	else
+	  echo
+	  echo "*** Warning: Linking the shared library $output against the non-libtool"
+	  echo "*** objects $objs is not portable!"
+	  libobjs="$libobjs $objs"
+	fi
       fi
 
-      # How the heck are we supposed to write a wrapper for a shared library?
-      if test -n "$link_against_libtool_libs"; then
-	 $echo "$modename: error: cannot link shared libraries into libtool libraries" 1>&2
-	 exit 1
+      if test "$dlself" != no; then
+	$echo "$modename: warning: \`-dlopen self' is ignored for libtool libraries" 1>&2
       fi
 
-      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
-	$echo "$modename: warning: \`-dlopen' is ignored for libtool libraries" 1>&2
-      fi
-
       set dummy $rpath
       if test $# -gt 2; then
 	$echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2
@@ -1628,7 +2187,6 @@
 	  build_libtool_libs=convenience
 	  build_old_libs=yes
 	fi
-	dependency_libs="$deplibs"
 
 	if test -n "$vinfo"; then
 	  $echo "$modename: warning: \`-version-info' is ignored for convenience libraries" 1>&2
@@ -1640,7 +2198,7 @@
       else
 
 	# Parse the version information argument.
-	IFS="${IFS= 	}"; save_ifs="$IFS"; IFS=':'
+	save_ifs="$IFS"; IFS=':'
 	set dummy $vinfo 0 0 0
 	IFS="$save_ifs"
 
@@ -1655,8 +2213,8 @@
 	age="$4"
 
 	# Check that each of the things are valid numbers.
-	case "$current" in
-	0 | [1-9] | [1-9][0-9]*) ;;
+	case $current in
+	0 | [1-9] | [1-9][0-9] | [1-9][0-9][0-9]) ;;
 	*)
 	  $echo "$modename: CURRENT \`$current' is not a nonnegative integer" 1>&2
 	  $echo "$modename: \`$vinfo' is not valid version information" 1>&2
@@ -1664,8 +2222,8 @@
 	  ;;
 	esac
 
-	case "$revision" in
-	0 | [1-9] | [1-9][0-9]*) ;;
+	case $revision in
+	0 | [1-9] | [1-9][0-9] | [1-9][0-9][0-9]) ;;
 	*)
 	  $echo "$modename: REVISION \`$revision' is not a nonnegative integer" 1>&2
 	  $echo "$modename: \`$vinfo' is not valid version information" 1>&2
@@ -1673,8 +2231,8 @@
 	  ;;
 	esac
 
-	case "$age" in
-	0 | [1-9] | [1-9][0-9]*) ;;
+	case $age in
+	0 | [1-9] | [1-9][0-9] | [1-9][0-9][0-9]) ;;
 	*)
 	  $echo "$modename: AGE \`$age' is not a nonnegative integer" 1>&2
 	  $echo "$modename: \`$vinfo' is not valid version information" 1>&2
@@ -1692,12 +2250,31 @@
 	major=
 	versuffix=
 	verstring=
-	case "$version_type" in
+	case $version_type in
 	none) ;;
 
+	darwin)
+	  # Like Linux, but with the current version available in
+	  # verstring for coding it into the library header
+	  major=.`expr $current - $age`
+	  versuffix="$major.$age.$revision"
+	  # Darwin ld doesn't like 0 for these options...
+	  minor_current=`expr $current + 1`
+	  verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
+	  ;;
+
+	freebsd-aout)
+	  major=".$current"
+	  versuffix=".$current.$revision";
+	  ;;
+
+	freebsd-elf)
+	  major=".$current"
+	  versuffix=".$current";
+	  ;;
+
 	irix)
 	  major=`expr $current - $age + 1`
-	  versuffix="$major.$revision"
 	  verstring="sgi$major.$revision"
 
 	  # Add in all the interfaces that we are compatible with.
@@ -1707,6 +2284,10 @@
 	    loop=`expr $loop - 1`
 	    verstring="sgi$major.$iface:$verstring"
 	  done
+
+	  # Before this point, $major must not contain `.'.
+	  major=.$major
+	  versuffix="$major.$revision"
 	  ;;
 
 	linux)
@@ -1736,21 +2317,11 @@
 	  versuffix=".$current.$revision"
 	  ;;
 
-	freebsd-aout)
-	  major=".$current"
-	  versuffix=".$current.$revision";
-	  ;;
-
-	freebsd-elf)
-	  major=".$current"
-	  versuffix=".$current";
-	  ;;
-
 	windows)
-	  # Like Linux, but with '-' rather than '.', since we only
-	  # want one extension on Windows 95.
+	  # Use '-' rather than '.', since we only want one
+	  # extension on DOS 8.3 filesystems.
 	  major=`expr $current - $age`
-	  versuffix="-$major-$age-$revision"
+	  versuffix="-$major"
 	  ;;
 
 	*)
@@ -1764,6 +2335,16 @@
 	if test -z "$vinfo" && test -n "$release"; then
 	  major=
 	  verstring="0.0"
+	  case $version_type in
+	  darwin)
+	    # we can't check for "0.0" in archive_cmds due to quoting
+	    # problems, so we reset it completely
+	    verstring=""
+	    ;;
+	  *)
+	    verstring="0.0"
+	    ;;
+	  esac
 	  if test "$need_version" = no; then
 	    versuffix=
 	  else
@@ -1777,7 +2358,7 @@
 	  versuffix=
 	  verstring=""
 	fi
-	
+
 	# Check to see if the archive will have undefined symbols.
 	if test "$allow_undefined" = yes; then
 	  if test "$allow_undefined_flag" = unsupported; then
@@ -1789,34 +2370,12 @@
 	  # Don't allow undefined symbols.
 	  allow_undefined_flag="$no_undefined_flag"
 	fi
-
-	dependency_libs="$deplibs"
-	case "$host" in
-	*-*-cygwin* | *-*-mingw* | *-*-os2* | *-*-beos*)
-	  # these systems don't actually have a c library (as such)!
-	  ;;
-        *-*-rhapsody*)
-	  # rhapsody is a little odd...
-	  deplibs="$deplibs -framework System"
-	  ;;
-	*)
-	  # Add libc to deplibs on all other systems.
-	  deplibs="$deplibs -lc"
-	  ;;
-	esac
       fi
 
-      # Create the output directory, or remove our outputs if we need to.
-      if test -d $output_objdir; then
+      if test "$mode" != relink; then
+	# Remove our outputs.
 	$show "${rm}r $output_objdir/$outputname $output_objdir/$libname.* $output_objdir/${libname}${release}.*"
 	$run ${rm}r $output_objdir/$outputname $output_objdir/$libname.* $output_objdir/${libname}${release}.*
-      else
-	$show "$mkdir $output_objdir"
-	$run $mkdir $output_objdir
-	status=$?
-	if test $status -ne 0 && test ! -d $output_objdir; then
-	  exit $status
-	fi
       fi
 
       # Now set the variables for building old libraries.
@@ -1827,7 +2386,73 @@
 	oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP`
       fi
 
+      # Eliminate all temporary directories.
+      for path in $notinst_path; do
+	lib_search_path=`echo "$lib_search_path " | sed -e 's% $path % %g'`
+	deplibs=`echo "$deplibs " | sed -e 's% -L$path % %g'`
+	dependency_libs=`echo "$dependency_libs " | sed -e 's% -L$path % %g'`
+      done
+
+      if test -n "$xrpath"; then
+	# If the user specified any rpath flags, then add them.
+	temp_xrpath=
+	for libdir in $xrpath; do
+	  temp_xrpath="$temp_xrpath -R$libdir"
+	  case "$finalize_rpath " in
+	  *" $libdir "*) ;;
+	  *) finalize_rpath="$finalize_rpath $libdir" ;;
+	  esac
+	done
+	if test $hardcode_into_libs != yes || test $build_old_libs = yes; then
+	  dependency_libs="$temp_xrpath $dependency_libs"
+	fi
+      fi
+
+      # Make sure dlfiles contains only unique files that won't be dlpreopened
+      old_dlfiles="$dlfiles"
+      dlfiles=
+      for lib in $old_dlfiles; do
+	case " $dlprefiles $dlfiles " in
+	*" $lib "*) ;;
+	*) dlfiles="$dlfiles $lib" ;;
+	esac
+      done
+
+      # Make sure dlprefiles contains only unique files
+      old_dlprefiles="$dlprefiles"
+      dlprefiles=
+      for lib in $old_dlprefiles; do
+	case "$dlprefiles " in
+	*" $lib "*) ;;
+	*) dlprefiles="$dlprefiles $lib" ;;
+	esac
+      done
+
       if test "$build_libtool_libs" = yes; then
+	if test -n "$rpath"; then
+	  case $host in
+	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos*)
+	    # these systems don't actually have a c library (as such)!
+	    ;;
+	  *-*-rhapsody* | *-*-darwin1.[012])
+	    # Rhapsody C library is in the System framework
+	    deplibs="$deplibs -framework System"
+	    ;;
+	  *-*-netbsd*)
+	    # Don't link with libc until the a.out ld.so is fixed.
+	    ;;
+	  *-*-openbsd*)
+	    # Do not include libc due to us having libc/libc_r.
+	    ;;
+	  *)
+	    # Add libc to deplibs on all other systems if necessary.
+	    if test $build_libtool_need_lc = "yes"; then
+	      deplibs="$deplibs -lc"
+	    fi
+	    ;;
+	  esac
+	fi
+
 	# Transform deplibs into only deplibs that can be linked in shared.
 	name_save=$name
 	libname_save=$libname
@@ -1842,7 +2467,7 @@
 	major=""
 	newdeplibs=
 	droppeddeps=no
-	case "$deplibs_check_method" in
+	case $deplibs_check_method in
 	pass_all)
 	  # Don't check for shared/static.  Everything works.
 	  # This might be a little naive.  We might want to check
@@ -1867,7 +2492,7 @@
 	    for i in $deplibs; do
 	      name="`expr $i : '-l\(.*\)'`"
 	      # If $name is empty we are operating on a -L argument.
-	      if test "$name" != "" ; then
+	      if test -n "$name" && test "$name" != "0"; then
 		libname=`eval \\$echo \"$libname_spec\"`
 		deplib_matches=`eval \\$echo \"$library_names_spec\"`
 		set dummy $deplib_matches
@@ -1892,7 +2517,7 @@
 	    for i in $deplibs; do
 	      name="`expr $i : '-l\(.*\)'`"
 	     # If $name is empty we are operating on a -L argument.
-	      if test "$name" != "" ; then
+	      if test -n "$name" && test "$name" != "0"; then
 		$rm conftest
 		$CC -o conftest conftest.c $i
 		# Did it work?
@@ -1928,19 +2553,19 @@
 	  ;;
 	file_magic*)
 	  set dummy $deplibs_check_method
-	  file_magic_regex="`expr \"$deplibs_check_method\" : \"$2 \(.*\)\"`"
+	  file_magic_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"`
 	  for a_deplib in $deplibs; do
 	    name="`expr $a_deplib : '-l\(.*\)'`"
 	    # If $name is empty we are operating on a -L argument.
-	    if test "$name" != "" ; then
+	    if test -n "$name" && test "$name" != "0"; then
 	      libname=`eval \\$echo \"$libname_spec\"`
-	      for i in $lib_search_path; do
+	      for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
 		    potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
 		    for potent_lib in $potential_libs; do
 		      # Follow soft links.
 		      if ls -lLd "$potent_lib" 2>/dev/null \
 			 | grep " -> " >/dev/null; then
-			continue 
+			continue
 		      fi
 		      # The statement above tries to avoid entering an
 		      # endless loop below, in case of cyclic links.
@@ -1950,7 +2575,7 @@
 		      potlib="$potent_lib"
 		      while test -h "$potlib" 2>/dev/null; do
 			potliblink=`ls -ld $potlib | sed 's/.* -> //'`
-			case "$potliblink" in
+			case $potliblink in
 			[\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";;
 			*) potlib=`$echo "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";;
 			esac
@@ -1978,6 +2603,40 @@
 	    fi
 	  done # Gone through all deplibs.
 	  ;;
+	match_pattern*)
+	  set dummy $deplibs_check_method
+	  match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"`
+	  for a_deplib in $deplibs; do
+	    name="`expr $a_deplib : '-l\(.*\)'`"
+	    # If $name is empty we are operating on a -L argument.
+	    if test -n "$name" && test "$name" != "0"; then
+	      libname=`eval \\$echo \"$libname_spec\"`
+	      for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+		potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
+		for potent_lib in $potential_libs; do
+		  if eval echo \"$potent_lib\" 2>/dev/null \
+		      | sed 10q \
+		      | egrep "$match_pattern_regex" > /dev/null; then
+		    newdeplibs="$newdeplibs $a_deplib"
+		    a_deplib=""
+		    break 2
+		  fi
+		done
+	      done
+	      if test -n "$a_deplib" ; then
+		droppeddeps=yes
+		echo
+		echo "*** Warning: This library needs some functionality provided by $a_deplib."
+		echo "*** I have the capability to make that library automatically link in when"
+		echo "*** you link to this library.  But I can only do this if you have a"
+		echo "*** shared version of the library, which you do not appear to have."
+	      fi
+	    else
+	      # Add a -L argument.
+	      newdeplibs="$newdeplibs $a_deplib"
+	    fi
+	  done # Gone through all deplibs.
+	  ;;
 	none | unknown | *)
 	  newdeplibs=""
 	  if $echo "X $deplibs" | $Xsed -e 's/ -lc$//' \
@@ -2000,6 +2659,13 @@
 	libname=$libname_save
 	name=$name_save
 
+	case $host in
+	*-*-rhapsody* | *-*-darwin1.[012])
+	  # On Rhapsody replace the C library is the System framework
+	  newdeplibs=`$echo "X $newdeplibs" | $Xsed -e 's/ -lc / -framework System /'`
+	  ;;
+	esac
+
 	if test "$droppeddeps" = yes; then
 	  if test "$module" = yes; then
 	    echo
@@ -2025,6 +2691,21 @@
 	    echo "*** The inter-library dependencies that have been dropped here will be"
 	    echo "*** automatically added whenever a program is linked with this library"
 	    echo "*** or is declared to -dlopen it."
+
+	    if test $allow_undefined = no; then
+	      echo
+	      echo "*** Since this library must not contain undefined symbols,"
+	      echo "*** because either the platform does not support them or"
+	      echo "*** it was explicitly requested with -no-undefined,"
+	      echo "*** libtool will only create a static version of it."
+	      if test "$build_old_libs" = no; then
+		oldlibs="$output_objdir/$libname.$libext"
+		build_libtool_libs=module
+		build_old_libs=yes
+	      else
+		build_libtool_libs=no
+	      fi
+	    fi
 	  fi
 	fi
 	# Done checking deplibs!
@@ -2035,9 +2716,64 @@
       library_names=
       old_library=
       dlname=
-      
+
       # Test again, we may have decided not to build it any more
       if test "$build_libtool_libs" = yes; then
+	if test $hardcode_into_libs = yes; then
+	  # Hardcode the library paths
+	  hardcode_libdirs=
+	  dep_rpath=
+	  rpath="$finalize_rpath"
+	  test "$mode" != relink && rpath="$compile_rpath$rpath"
+	  for libdir in $rpath; do
+	    if test -n "$hardcode_libdir_flag_spec"; then
+	      if test -n "$hardcode_libdir_separator"; then
+		if test -z "$hardcode_libdirs"; then
+		  hardcode_libdirs="$libdir"
+		else
+		  # Just accumulate the unique libdirs.
+		  case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+		  *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		    ;;
+		  *)
+		    hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+		    ;;
+		  esac
+		fi
+	      else
+		eval flag=\"$hardcode_libdir_flag_spec\"
+		dep_rpath="$dep_rpath $flag"
+	      fi
+	    elif test -n "$runpath_var"; then
+	      case "$perm_rpath " in
+	      *" $libdir "*) ;;
+	      *) perm_rpath="$perm_rpath $libdir" ;;
+	      esac
+	    fi
+	  done
+	  # Substitute the hardcoded libdirs into the rpath.
+	  if test -n "$hardcode_libdir_separator" &&
+	     test -n "$hardcode_libdirs"; then
+	    libdir="$hardcode_libdirs"
+	    eval dep_rpath=\"$hardcode_libdir_flag_spec\"
+	  fi
+	  if test -n "$runpath_var" && test -n "$perm_rpath"; then
+	    # We should set the runpath_var.
+	    rpath=
+	    for dir in $perm_rpath; do
+	      rpath="$rpath$dir:"
+	    done
+	    eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var"
+	  fi
+	  test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs"
+	fi
+
+	shlibpath="$finalize_shlibpath"
+	test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath"
+	if test -n "$shlibpath"; then
+	  eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var"
+	fi
+
 	# Get the real and link names of the library.
 	eval library_names=\"$library_names_spec\"
 	set dummy $library_names
@@ -2049,6 +2785,7 @@
 	else
 	  soname="$realname"
 	fi
+	test -z "$dlname" && dlname=$soname
 
 	lib="$output_objdir/$realname"
 	for link
@@ -2083,7 +2820,7 @@
 	    export_symbols="$output_objdir/$libname.exp"
 	    $run $rm $export_symbols
 	    eval cmds=\"$export_symbols_cmds\"
-	    IFS="${IFS= 	}"; save_ifs="$IFS"; IFS='~'
+	    save_ifs="$IFS"; IFS='~'
 	    for cmd in $cmds; do
 	      IFS="$save_ifs"
 	      $show "$cmd"
@@ -2120,7 +2857,7 @@
 
 	    for xlib in $convenience; do
 	      # Extract the objects.
-	      case "$xlib" in
+	      case $xlib in
 	      [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;;
 	      *) xabs=`pwd`"/$xlib" ;;
 	      esac
@@ -2145,16 +2882,26 @@
 
 	if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then
 	  eval flag=\"$thread_safe_flag_spec\"
-	  linkopts="$linkopts $flag"
+	  linker_flags="$linker_flags $flag"
 	fi
 
+	# Make a backup of the uninstalled library when relinking
+	if test "$mode" = relink; then
+	  $run eval '(cd $output_objdir && $rm ${realname}U && $mv $realname ${realname}U)' || exit $?
+	fi
+
 	# Do each of the archive commands.
 	if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
 	  eval cmds=\"$archive_expsym_cmds\"
 	else
-	  eval cmds=\"$archive_cmds\"
+	  save_deplibs="$deplibs"
+	  for conv in $convenience; do
+	    deplibs="${deplibs%$conv*} ${deplibs#*$conv}"
+	  done
+ 	  eval cmds=\"$archive_cmds\"
+	  deplibs="$save_deplibs"
 	fi
-	IFS="${IFS= 	}"; save_ifs="$IFS"; IFS='~'
+	save_ifs="$IFS"; IFS='~'
 	for cmd in $cmds; do
 	  IFS="$save_ifs"
 	  $show "$cmd"
@@ -2162,6 +2909,12 @@
 	done
 	IFS="$save_ifs"
 
+	# Restore the uninstalled library and exit
+	if test "$mode" = relink; then
+	  $run eval '(cd $output_objdir && $rm ${realname}T && $mv $realname ${realname}T && $mv "$realname"U $realname)' || exit $?
+	  exit 0
+	fi
+
 	# Create links to the real library.
 	for linkname in $linknames; do
 	  if test "$realname" != "$linkname"; then
@@ -2178,12 +2931,7 @@
       fi
       ;;
 
-    *.lo | *.o | *.obj)
-      if test -n "$link_against_libtool_libs"; then
-	$echo "$modename: error: cannot link libtool libraries into objects" 1>&2
-	exit 1
-      fi
-
+    obj)
       if test -n "$deplibs"; then
 	$echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2
       fi
@@ -2208,9 +2956,9 @@
 	$echo "$modename: warning: \`-release' is ignored for objects" 1>&2
       fi
 
-      case "$output" in
+      case $output in
       *.lo)
-	if test -n "$objs"; then
+	if test -n "$objs$old_deplibs"; then
 	  $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2
 	  exit 1
 	fi
@@ -2234,7 +2982,7 @@
       gentop=
       # reload_cmds runs $LD directly, so let us get rid of
       # -Wl from whole_archive_flag_spec
-      wl= 
+      wl=
 
       if test -n "$convenience"; then
 	if test -n "$whole_archive_flag_spec"; then
@@ -2253,7 +3001,7 @@
 
 	  for xlib in $convenience; do
 	    # Extract the objects.
-	    case "$xlib" in
+	    case $xlib in
 	    [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;;
 	    *) xabs=`pwd`"/$xlib" ;;
 	    esac
@@ -2277,11 +3025,11 @@
       fi
 
       # Create the old-style object.
-      reload_objs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs"
+      reload_objs="$objs$old_deplibs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test
 
       output="$obj"
       eval cmds=\"$reload_cmds\"
-      IFS="${IFS= 	}"; save_ifs="$IFS"; IFS='~'
+      save_ifs="$IFS"; IFS='~'
       for cmd in $cmds; do
 	IFS="$save_ifs"
 	$show "$cmd"
@@ -2312,12 +3060,12 @@
 	exit 0
       fi
 
-      if test -n "$pic_flag"; then
+      if test -n "$pic_flag" || test "$pic_mode" != default; then
 	# Only do commands if we really have different PIC objects.
 	reload_objs="$libobjs $reload_conv_objs"
 	output="$libobj"
 	eval cmds=\"$reload_cmds\"
-	IFS="${IFS= 	}"; save_ifs="$IFS"; IFS='~'
+	save_ifs="$IFS"; IFS='~'
 	for cmd in $cmds; do
 	  IFS="$save_ifs"
 	  $show "$cmd"
@@ -2348,8 +3096,10 @@
       exit 0
       ;;
 
-    # Anything else should be a program.
-    *)
+    prog)
+      case $host in
+	*cygwin*) output=`echo $output | sed -e 's,.exe$,,;s,$,.exe,'` ;;
+      esac
       if test -n "$vinfo"; then
 	$echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2
       fi
@@ -2359,20 +3109,27 @@
       fi
 
       if test "$preload" = yes; then
-	if test "$dlopen" = unknown && test "$dlopen_self" = unknown &&
+	if test "$dlopen_support" = unknown && test "$dlopen_self" = unknown &&
 	   test "$dlopen_self_static" = unknown; then
 	  $echo "$modename: warning: \`AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support."
-	fi 
+	fi
       fi
-    
+
+      case $host in
+      *-*-rhapsody* | *-*-darwin1.[012])
+	# On Rhapsody replace the C library is the System framework
+	compile_deplibs=`$echo "X $compile_deplibs" | $Xsed -e 's/ -lc / -framework System /'`
+	finalize_deplibs=`$echo "X $finalize_deplibs" | $Xsed -e 's/ -lc / -framework System /'`
+	;;
+      esac
+
+      compile_command="$compile_command $compile_deplibs"
+      finalize_command="$finalize_command $finalize_deplibs"
+
       if test -n "$rpath$xrpath"; then
 	# If the user specified any rpath flags, then add them.
 	for libdir in $rpath $xrpath; do
 	  # This is the magic to use -rpath.
-	  case "$compile_rpath " in
-	  *" $libdir "*) ;;
-	  *) compile_rpath="$compile_rpath $libdir" ;;
-	  esac
 	  case "$finalize_rpath " in
 	  *" $libdir "*) ;;
 	  *) finalize_rpath="$finalize_rpath $libdir" ;;
@@ -2390,7 +3147,7 @@
 	      hardcode_libdirs="$libdir"
 	    else
 	      # Just accumulate the unique libdirs.
-	      case "$hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator" in
+	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
 	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
 		;;
 	      *)
@@ -2408,6 +3165,14 @@
 	  *) perm_rpath="$perm_rpath $libdir" ;;
 	  esac
 	fi
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
+	  case :$dllsearchpath: in
+	  *":$libdir:"*) ;;
+	  *) dllsearchpath="$dllsearchpath:$libdir";;
+	  esac
+	  ;;
+	esac
       done
       # Substitute the hardcoded libdirs into the rpath.
       if test -n "$hardcode_libdir_separator" &&
@@ -2426,7 +3191,7 @@
 	      hardcode_libdirs="$libdir"
 	    else
 	      # Just accumulate the unique libdirs.
-	      case "$hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator" in
+	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
 	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
 		;;
 	      *)
@@ -2453,23 +3218,6 @@
       fi
       finalize_rpath="$rpath"
 
-      output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'`
-      if test "X$output_objdir" = "X$output"; then
-	output_objdir="$objdir"
-      else
-	output_objdir="$output_objdir/$objdir"
-      fi
-
-      # Create the binary in the object directory, then wrap it.
-      if test ! -d $output_objdir; then
-	$show "$mkdir $output_objdir"
-	$run $mkdir $output_objdir
-	status=$?
-	if test $status -ne 0 && test ! -d $output_objdir; then
-	  exit $status
-	fi
-      fi
-
       if test -n "$libobjs" && test "$build_old_libs" = yes; then
 	# Transform all the library objects into standard objects.
 	compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
@@ -2486,7 +3234,7 @@
       fi
 
       if test -n "$dlsyms"; then
-	case "$dlsyms" in
+	case $dlsyms in
 	"") ;;
 	*.c)
 	  # Discover the nlist of each of the dlfiles.
@@ -2518,7 +3266,7 @@
 	    test -z "$run" && $echo ': @PROGRAM@ ' > "$nlist"
 
 	    # Add our own program objects to the symbol list.
-	    progfiles=`$echo "X$objs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+	    progfiles=`$echo "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
 	    for arg in $progfiles; do
 	      $show "extracting global C symbols from \`$arg'"
 	      $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'"
@@ -2528,7 +3276,7 @@
 	      $run eval 'egrep -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T'
 	      $run eval '$mv "$nlist"T "$nlist"'
 	    fi
-	    
+
 	    if test -n "$export_symbols_regex"; then
 	      $run eval 'egrep -e "$export_symbols_regex" "$nlist" > "$nlist"T'
 	      $run eval '$mv "$nlist"T "$nlist"'
@@ -2580,9 +3328,9 @@
 #undef lt_preloaded_symbols
 
 #if defined (__STDC__) && __STDC__
-# define lt_ptr_t void *
+# define lt_ptr void *
 #else
-# define lt_ptr_t char *
+# define lt_ptr char *
 # define const
 #endif
 
@@ -2589,18 +3337,16 @@
 /* The mapping between symbol names and symbols. */
 const struct {
   const char *name;
-  lt_ptr_t address;
+  lt_ptr address;
 }
 lt_preloaded_symbols[] =
 {\
 "
 
-	    sed -n -e 's/^: \([^ ]*\) $/  {\"\1\", (lt_ptr_t) 0},/p' \
-		-e 's/^. \([^ ]*\) \([^ ]*\)$/  {"\2", (lt_ptr_t) \&\2},/p' \
-		  < "$nlist" >> "$output_objdir/$dlsyms"
+	    eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$dlsyms"
 
 	    $echo >> "$output_objdir/$dlsyms" "\
-  {0, (lt_ptr_t) 0}
+  {0, (lt_ptr) 0}
 };
 
 /* This works around a problem in FreeBSD linker */
@@ -2617,7 +3363,7 @@
 	  fi
 
 	  pic_flag_for_symtable=
-	  case "$host" in
+	  case $host in
 	  # compiling the symbol table file with pic_flag works around
 	  # a FreeBSD bug that causes programs to crash when -lm is
 	  # linked before any other PIC object.  But we must not use
@@ -2662,7 +3408,7 @@
 	finalize_command=`$echo "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"`
       fi
 
-      if test -z "$link_against_libtool_libs" || test "$build_libtool_libs" != yes; then
+      if test $need_relink = no || test "$build_libtool_libs" != yes; then
 	# Replace the output file specification.
 	compile_command=`$echo "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
 	link_command="$compile_command$compile_rpath"
@@ -2671,7 +3417,7 @@
 	$show "$link_command"
 	$run eval "$link_command"
 	status=$?
-	
+
 	# Delete the generated files.
 	if test -n "$dlsyms"; then
 	  $show "$rm $output_objdir/${outputname}S.${objext}"
@@ -2685,7 +3431,7 @@
 	# We should set the shlibpath_var
 	rpath=
 	for dir in $temp_rpath; do
-	  case "$dir" in
+	  case $dir in
 	  [\\/]* | [A-Za-z]:[\\/]*)
 	    # Absolute path.
 	    rpath="$rpath$dir:"
@@ -2727,11 +3473,24 @@
 	fi
       fi
 
+      if test "$no_install" = yes; then
+	# We don't need to create a wrapper script.
+	link_command="$compile_var$compile_command$compile_rpath"
+	# Replace the output file specification.
+	link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
+	# Delete the old output file.
+	$run $rm $output
+	# Link the executable and exit
+	$show "$link_command"
+	$run eval "$link_command" || exit $?
+	exit 0
+      fi
+
       if test "$hardcode_action" = relink; then
 	# Fast installation is not supported
 	link_command="$compile_var$compile_command$compile_rpath"
 	relink_command="$finalize_var$finalize_command$finalize_rpath"
-	
+
 	$echo "$modename: warning: this platform does not like uninstalled shared libraries" 1>&2
 	$echo "$modename: \`$output' will be relinked during installation" 1>&2
       else
@@ -2751,7 +3510,7 @@
 
       # Replace the output file specification.
       link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
-      
+
       # Delete the old output files.
       $run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname
 
@@ -2763,12 +3522,24 @@
 
       # Quote the relink command for shipping.
       if test -n "$relink_command"; then
+	# Preserve any variables that may affect compiler behavior
+	for var in $variables_saved_for_relink; do
+	  if eval test -z \"\${$var+set}\"; then
+	    relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command"
+	  elif eval var_value=\$$var; test -z "$var_value"; then
+	    relink_command="$var=; export $var; $relink_command"
+	  else
+	    var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"`
+	    relink_command="$var=\"$var_value\"; export $var; $relink_command"
+	  fi
+	done
+	relink_command="cd `pwd`; $relink_command"
 	relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"`
       fi
 
       # Quote $echo for shipping.
       if test "X$echo" = "X$SHELL $0 --fallback-echo"; then
-	case "$0" in
+	case $0 in
 	[\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $0 --fallback-echo";;
 	*) qecho="$SHELL `pwd`/$0 --fallback-echo";;
 	esac
@@ -2784,6 +3555,11 @@
 	case $output in
 	  *.exe) output=`echo $output|sed 's,.exe$,,'` ;;
 	esac
+	# test for cygwin because mv fails w/o .exe extensions
+	case $host in
+	  *cygwin*) exeext=.exe ;;
+	  *) exeext= ;;
+	esac
 	$rm $output
 	trap "$rm $output; exit 1" 1 2 15
 
@@ -2813,7 +3589,7 @@
 # This environment variable determines our operation mode.
 if test \"\$libtool_install_magic\" = \"$magic\"; then
   # install mode needs the following variable:
-  link_against_libtool_libs='$link_against_libtool_libs'
+  notinst_deplibs='$notinst_deplibs'
 else
   # When we are sourced in execute mode, \$file and \$echo are already set.
   if test \"\$libtool_execute_magic\" != \"$magic\"; then
@@ -2846,7 +3622,7 @@
     # If there was a directory component, then change thisdir.
     if test \"x\$destdir\" != \"x\$file\"; then
       case \"\$destdir\" in
-      [\\/]* | [A-Za-z]:[\\/]*) thisdir=\"\$destdir\" ;;
+      [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;;
       *) thisdir=\"\$thisdir/\$destdir\" ;;
       esac
     fi
@@ -2862,9 +3638,9 @@
 
 	if test "$fast_install" = yes; then
 	  echo >> $output "\
-  program=lt-'$outputname'
+  program=lt-'$outputname'$exeext
   progdir=\"\$thisdir/$objdir\"
-  
+
   if test ! -f \"\$progdir/\$program\" || \\
      { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | sed 1q\`; \\
        test \"X\$file\" != \"X\$progdir/\$program\"; }; then
@@ -2881,8 +3657,9 @@
 
     # relink executable if necessary
     if test -n \"\$relink_command\"; then
-      if (cd \"\$thisdir\" && eval \$relink_command); then :
+      if relink_command_output=\`eval \$relink_command 2>&1\`; then :
       else
+	$echo \"\$relink_command_output\" >&2
 	$rm \"\$progdir/\$file\"
 	exit 1
       fi
@@ -2931,9 +3708,9 @@
       # Run the actual program with our arguments.
 "
 	case $host in
-	  # win32 systems need to use the prog path for dll
-	  # lookup to work
-	*-*-cygwin*)
+	# win32 systems need to use the prog path for dll
+	# lookup to work
+	*-*-cygwin* | *-*-pw32*)
 	  $echo >> $output "\
       exec \$progdir/\$program \${1+\"\$@\"}
 "
@@ -2987,7 +3764,7 @@
 	  oldobjs="$libobjs_save"
 	  build_libtool_libs=no
 	else
-	  oldobjs="$objs "`$echo "X$libobjs_save" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`
+	  oldobjs="$objs$old_deplibs "`$echo "X$libobjs_save" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`
 	fi
 	addlibs="$old_convenience"
       fi
@@ -3003,11 +3780,11 @@
 	  exit $status
 	fi
 	generated="$generated $gentop"
-	  
+
 	# Add in members from convenience archives.
 	for xlib in $addlibs; do
 	  # Extract the objects.
-	  case "$xlib" in
+	  case $xlib in
 	  [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;;
 	  *) xabs=`pwd`"/$xlib" ;;
 	  esac
@@ -3053,7 +3830,7 @@
 
 	eval cmds=\"$old_archive_cmds\"
       fi
-      IFS="${IFS= 	}"; save_ifs="$IFS"; IFS='~'
+      save_ifs="$IFS"; IFS='~'
       for cmd in $cmds; do
 	IFS="$save_ifs"
 	$show "$cmd"
@@ -3068,19 +3845,26 @@
     fi
 
     # Now create the libtool archive.
-    case "$output" in
+    case $output in
     *.la)
       old_library=
       test "$build_old_libs" = yes && old_library="$libname.$libext"
       $show "creating $output"
 
-      if test -n "$xrpath"; then
-	temp_xrpath=
-	for libdir in $xrpath; do
-	  temp_xrpath="$temp_xrpath -R$libdir"
-	done
-	dependency_libs="$temp_xrpath $dependency_libs"
-      fi
+      # Preserve any variables that may affect compiler behavior
+      for var in $variables_saved_for_relink; do
+	if eval test -z \"\${$var+set}\"; then
+	  relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command"
+	elif eval var_value=\$$var; test -z "$var_value"; then
+	  relink_command="$var=; export $var; $relink_command"
+	else
+	  var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"`
+	  relink_command="$var=\"$var_value\"; export $var; $relink_command"
+	fi
+      done
+      # Quote the link command for shipping.
+      relink_command="cd `pwd`; $SHELL $0 --mode=relink $libtool_args"
+      relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"`
 
       # Only create the output if not a dry run.
       if test -z "$run"; then
@@ -3090,8 +3874,52 @@
 	      break
 	    fi
 	    output="$output_objdir/$outputname"i
+	    # Replace all uninstalled libtool libraries with the installed ones
+	    newdependency_libs=
+	    for deplib in $dependency_libs; do
+	      case $deplib in
+	      *.la)
+		name=`$echo "X$deplib" | $Xsed -e 's%^.*/%%'`
+		eval libdir=`sed -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+		if test -z "$libdir"; then
+		  $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2
+		  exit 1
+		fi
+		newdependency_libs="$newdependency_libs $libdir/$name"
+		;;
+	      *) newdependency_libs="$newdependency_libs $deplib" ;;
+	      esac
+	    done
+	    dependency_libs="$newdependency_libs"
+	    newdlfiles=
+	    for lib in $dlfiles; do
+	      name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'`
+	      eval libdir=`sed -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+	      if test -z "$libdir"; then
+		$echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
+		exit 1
+	      fi
+	      newdlfiles="$newdlfiles $libdir/$name"
+	    done
+	    dlfiles="$newdlfiles"
+	    newdlprefiles=
+	    for lib in $dlprefiles; do
+	      name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'`
+	      eval libdir=`sed -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+	      if test -z "$libdir"; then
+		$echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
+		exit 1
+	      fi
+	      newdlprefiles="$newdlprefiles $libdir/$name"
+	    done
+	    dlprefiles="$newdlprefiles"
 	  fi
 	  $rm $output
+	  # place dlname in correct position for cygwin
+	  tdlname=$dlname
+	  case $host,$output,$installed,$module,$dlname in
+	    *cygwin*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;;
+	  esac
 	  $echo > $output "\
 # $outputname - a libtool library file
 # Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
@@ -3100,7 +3928,7 @@
 # It is necessary for linking the library.
 
 # The name that we can dlopen(3).
-dlname='$dlname'
+dlname='$tdlname'
 
 # Names of this library.
 library_names='$library_names'
@@ -3119,9 +3947,16 @@
 # Is this an already installed library?
 installed=$installed
 
+# Files to dlopen/dlpreopen
+dlopen='$dlfiles'
+dlpreopen='$dlprefiles'
+
 # Directory that this library needs to be installed in:
-libdir='$install_libdir'\
-"
+libdir='$install_libdir'"
+	  if test "$installed" = no && test $need_relink = yes; then
+	    $echo >> $output "\
+relink_command=\"$relink_command\""
+	  fi
 	done
       fi
 
@@ -3128,7 +3963,7 @@
       # Do a symbolic link so that the libtool archive can be found in
       # LD_LIBRARY_PATH before the program is installed.
       $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)"
-      $run eval "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)" || exit $?
+      $run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $?
       ;;
     esac
     exit 0
@@ -3140,10 +3975,12 @@
 
     # There may be an optional sh(1) argument at the beginning of
     # install_prog (especially on Windows NT).
-    if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh; then
+    if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh ||
+       # Allow the use of GNU shtool's install command.
+       $echo "X$nonopt" | $Xsed | grep shtool > /dev/null; then
       # Aesthetically quote it.
       arg=`$echo "X$nonopt" | $Xsed -e "$sed_quote_subst"`
-      case "$arg" in
+      case $arg in
       *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*)
 	arg="\"$arg\""
 	;;
@@ -3159,7 +3996,7 @@
     # The real first argument should be the name of the installation program.
     # Aesthetically quote it.
     arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
-    case "$arg" in
+    case $arg in
     *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*)
       arg="\"$arg\""
       ;;
@@ -3182,7 +4019,7 @@
 	continue
       fi
 
-      case "$arg" in
+      case $arg in
       -d) isdir=yes ;;
       -f) prev="-f" ;;
       -g) prev="-g" ;;
@@ -3207,7 +4044,7 @@
 
       # Aesthetically quote the argument.
       arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
-      case "$arg" in
+      case $arg in
       *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*)
 	arg="\"$arg\""
 	;;
@@ -3258,11 +4095,11 @@
 	exit 1
       fi
     fi
-    case "$destdir" in
+    case $destdir in
     [\\/]* | [A-Za-z]:[\\/]*) ;;
     *)
       for file in $files; do
-	case "$file" in
+	case $file in
 	*.lo) ;;
 	*)
 	  $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2
@@ -3284,8 +4121,8 @@
     for file in $files; do
 
       # Do each installation.
-      case "$file" in
-      *.a | *.lib)
+      case $file in
+      *.$libext)
 	# Do the static libraries later.
 	staticlibs="$staticlibs $file"
 	;;
@@ -3301,8 +4138,9 @@
 
 	library_names=
 	old_library=
+	relink_command=
 	# If there is no directory component, then add one.
-	case "$file" in
+	case $file in
 	*/* | *\\*) . $file ;;
 	*) . ./$file ;;
 	esac
@@ -3321,10 +4159,20 @@
 	  esac
 	fi
 
-	dir="`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/"
+	dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/
 	test "X$dir" = "X$file/" && dir=
 	dir="$dir$objdir"
 
+	if test -n "$relink_command"; then
+	  $echo "$modename: warning: relinking \`$file'" 1>&2
+	  $show "$relink_command"
+	  if $run eval "$relink_command"; then :
+	  else
+	    $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2
+	    continue
+	  fi
+	fi
+
 	# See the names of the shared library.
 	set dummy $library_names
 	if test -n "$2"; then
@@ -3332,9 +4180,16 @@
 	  shift
 	  shift
 
+	  srcname="$realname"
+	  test -n "$relink_command" && srcname="$realname"T
+
 	  # Install the shared library and build the symlinks.
-	  $show "$install_prog $dir/$realname $destdir/$realname"
-	  $run eval "$install_prog $dir/$realname $destdir/$realname" || exit $?
+	  $show "$install_prog $dir/$srcname $destdir/$realname"
+	  $run eval "$install_prog $dir/$srcname $destdir/$realname" || exit $?
+	  if test -n "$stripme" && test -n "$striplib"; then
+	    $show "$striplib $destdir/$realname"
+	    $run eval "$striplib $destdir/$realname" || exit $?
+	  fi
 
 	  if test $# -gt 0; then
 	    # Delete the old symlinks, and create new ones.
@@ -3350,7 +4205,7 @@
 	  # Do each command in the postinstall commands.
 	  lib="$destdir/$realname"
 	  eval cmds=\"$postinstall_cmds\"
-	  IFS="${IFS= 	}"; save_ifs="$IFS"; IFS='~'
+	  save_ifs="$IFS"; IFS='~'
 	  for cmd in $cmds; do
 	    IFS="$save_ifs"
 	    $show "$cmd"
@@ -3381,11 +4236,11 @@
 	fi
 
 	# Deduce the name of the destination old-style object file.
-	case "$destfile" in
+	case $destfile in
 	*.lo)
 	  staticdest=`$echo "X$destfile" | $Xsed -e "$lo2o"`
 	  ;;
-	*.o | *.obj)
+	*.$objext)
 	  staticdest="$destfile"
 	  destfile=
 	  ;;
@@ -3424,33 +4279,33 @@
 
 	# Do a test to see if this is really a libtool program.
 	if (sed -e '4q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
-	  link_against_libtool_libs=
+	  notinst_deplibs=
 	  relink_command=
 
 	  # If there is no directory component, then add one.
-	  case "$file" in
+	  case $file in
 	  */* | *\\*) . $file ;;
 	  *) . ./$file ;;
 	  esac
 
 	  # Check the variables that should have been set.
-	  if test -z "$link_against_libtool_libs"; then
+	  if test -z "$notinst_deplibs"; then
 	    $echo "$modename: invalid libtool wrapper script \`$file'" 1>&2
 	    exit 1
 	  fi
 
 	  finalize=yes
-	  for lib in $link_against_libtool_libs; do
+	  for lib in $notinst_deplibs; do
 	    # Check to see that each library is installed.
 	    libdir=
 	    if test -f "$lib"; then
 	      # If there is no directory component, then add one.
-	      case "$lib" in
+	      case $lib in
 	      */* | *\\*) . $lib ;;
 	      *) . ./$lib ;;
 	      esac
 	    fi
-	    libfile="$libdir/`$echo "X$lib" | $Xsed -e 's%^.*/%%g'`"
+	    libfile="$libdir/"`$echo "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test
 	    if test -n "$libdir" && test ! -f "$libfile"; then
 	      $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2
 	      finalize=no
@@ -3457,6 +4312,13 @@
 	    fi
 	  done
 
+	  relink_command=
+	  # If there is no directory component, then add one.
+	  case $file in
+	  */* | *\\*) . $file ;;
+	  *) . ./$file ;;
+	  esac
+
 	  outputname=
 	  if test "$fast_install" = no && test -n "$relink_command"; then
 	    if test "$finalize" = yes && test -z "$run"; then
@@ -3468,6 +4330,7 @@
 		$echo "$modename: error: cannot create temporary directory \`$tmpdir'" 1>&2
 		continue
 	      fi
+	      file=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
 	      outputname="$tmpdir/$file"
 	      # Replace the output file specification.
 	      relink_command=`$echo "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'`
@@ -3489,6 +4352,23 @@
 	  fi
 	fi
 
+	# remove .exe since cygwin /usr/bin/install will append another
+	# one anyways
+	case $install_prog,$host in
+	/usr/bin/install*,*cygwin*)
+	  case $file:$destfile in
+	  *.exe:*.exe)
+	    # this is ok
+	    ;;
+	  *.exe:*)
+	    destfile=$destfile.exe
+	    ;;
+	  *:*.exe)
+	    destfile=`echo $destfile | sed -e 's,.exe$,,'`
+	    ;;
+	  esac
+	  ;;
+	esac
 	$show "$install_prog$stripme $file $destfile"
 	$run eval "$install_prog\$stripme \$file \$destfile" || exit $?
 	test -n "$outputname" && ${rm}r "$tmpdir"
@@ -3505,9 +4385,14 @@
       $show "$install_prog $file $oldlib"
       $run eval "$install_prog \$file \$oldlib" || exit $?
 
+      if test -n "$stripme" && test -n "$striplib"; then
+	$show "$old_striplib $oldlib"
+	$run eval "$old_striplib $oldlib" || exit $?
+      fi
+
       # Do each command in the postinstall commands.
       eval cmds=\"$old_postinstall_cmds\"
-      IFS="${IFS= 	}"; save_ifs="$IFS"; IFS='~'
+      save_ifs="$IFS"; IFS='~'
       for cmd in $cmds; do
 	IFS="$save_ifs"
 	$show "$cmd"
@@ -3523,11 +4408,10 @@
     if test -n "$current_libdirs"; then
       # Maybe just do a dry run.
       test -n "$run" && current_libdirs=" -n$current_libdirs"
-      exec $SHELL $0 --finish$current_libdirs
-      exit 1
+      exec_cmd='$SHELL $0 --finish$current_libdirs'
+    else
+      exit 0
     fi
-
-    exit 0
     ;;
 
   # libtool finish mode
@@ -3546,7 +4430,7 @@
 	if test -n "$finish_cmds"; then
 	  # Do each command in the finish commands.
 	  eval cmds=\"$finish_cmds\"
-	  IFS="${IFS= 	}"; save_ifs="$IFS"; IFS='~'
+	  save_ifs="$IFS"; IFS='~'
 	  for cmd in $cmds; do
 	    IFS="$save_ifs"
 	    $show "$cmd"
@@ -3565,7 +4449,7 @@
     fi
 
     # Exit here if they wanted silent mode.
-    test "$show" = : && exit 0
+    test "$show" = ":" && exit 0
 
     echo "----------------------------------------------------------------------"
     echo "Libraries have been installed in:"
@@ -3575,7 +4459,7 @@
     echo
     echo "If you ever happen to want to link against installed libraries"
     echo "in a given directory, LIBDIR, you must either use libtool, and"
-    echo "specify the full pathname of the library, or use \`-LLIBDIR'"
+    echo "specify the full pathname of the library, or use the \`-LLIBDIR'"
     echo "flag during linking and do at least one of the following:"
     if test -n "$shlibpath_var"; then
       echo "   - add LIBDIR to the \`$shlibpath_var' environment variable"
@@ -3625,7 +4509,7 @@
       fi
 
       dir=
-      case "$file" in
+      case $file in
       *.la)
 	# Check to see that this really is a libtool archive.
 	if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
@@ -3640,7 +4524,7 @@
 	library_names=
 
 	# If there is no directory component, then add one.
-	case "$file" in
+	case $file in
 	*/* | *\\*) . $file ;;
 	*) . ./$file ;;
 	esac
@@ -3695,13 +4579,13 @@
     args=
     for file
     do
-      case "$file" in
+      case $file in
       -*) ;;
       *)
 	# Do a test to see if this is really a libtool program.
 	if (sed -e '4q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
 	  # If there is no directory component, then add one.
-	  case "$file" in
+	  case $file in
 	  */* | *\\*) . $file ;;
 	  *) . ./$file ;;
 	  esac
@@ -3718,8 +4602,8 @@
 
     if test -z "$run"; then
       if test -n "$shlibpath_var"; then
-        # Export the shlibpath_var.
-        eval "export $shlibpath_var"
+	# Export the shlibpath_var.
+	eval "export $shlibpath_var"
       fi
 
       # Restore saved enviroment variables
@@ -3730,16 +4614,13 @@
 	LANG="$save_LANG"; export LANG
       fi
 
-      # Now actually exec the command.
-      eval "exec \$cmd$args"
-
-      $echo "$modename: cannot exec \$cmd$args"
-      exit 1
+      # Now prepare to actually exec the command.
+      exec_cmd='"$cmd"$args'
     else
       # Display what would be done.
       if test -n "$shlibpath_var"; then
-        eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\""
-        $echo "export $shlibpath_var"
+	eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\""
+	$echo "export $shlibpath_var"
       fi
       $echo "$cmd$args"
       exit 0
@@ -3746,15 +4627,22 @@
     fi
     ;;
 
-  # libtool uninstall mode
-  uninstall)
-    modename="$modename: uninstall"
+  # libtool clean and uninstall mode
+  clean | uninstall)
+    modename="$modename: $mode"
     rm="$nonopt"
     files=
+    rmforce=
+    exit_status=0
 
+    # This variable tells wrapper scripts just to set variables rather
+    # than running their programs.
+    libtool_install_magic="$magic"
+
     for arg
     do
-      case "$arg" in
+      case $arg in
+      -f) rm="$rm $arg"; rmforce=yes ;;
       -*) rm="$rm $arg" ;;
       *) files="$files $arg" ;;
       esac
@@ -3766,14 +4654,42 @@
       exit 1
     fi
 
+    rmdirs=
+
     for file in $files; do
       dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
-      test "X$dir" = "X$file" && dir=.
+      if test "X$dir" = "X$file"; then
+	dir=.
+	objdir="$objdir"
+      else
+	objdir="$dir/$objdir"
+      fi
       name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+      test $mode = uninstall && objdir="$dir"
 
+      # Remember objdir for removal later, being careful to avoid duplicates
+      if test $mode = clean; then
+	case " $rmdirs " in
+	  *" $objdir "*) ;;
+	  *) rmdirs="$rmdirs $objdir" ;;
+	esac
+      fi
+
+      # Don't error if the file doesn't exist and rm -f was used.
+      if (test -L "$file") >/dev/null 2>&1 \
+	|| (test -h "$file") >/dev/null 2>&1 \
+	|| test -f "$file"; then
+	:
+      elif test -d "$file"; then
+	exit_status=1
+	continue
+      elif test "$rmforce" = yes; then
+	continue
+      fi
+
       rmfiles="$file"
 
-      case "$name" in
+      case $name in
       *.la)
 	# Possibly a libtool archive, so verify it.
 	if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
@@ -3781,38 +4697,43 @@
 
 	  # Delete the libtool libraries and symlinks.
 	  for n in $library_names; do
-	    rmfiles="$rmfiles $dir/$n"
+	    rmfiles="$rmfiles $objdir/$n"
 	  done
-	  test -n "$old_library" && rmfiles="$rmfiles $dir/$old_library"
+	  test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library"
+	  test $mode = clean && rmfiles="$rmfiles $objdir/$name $objdir/${name}i"
 
-	  $show "$rm $rmfiles"
-	  $run $rm $rmfiles
-
-	  if test -n "$library_names"; then
-	    # Do each command in the postuninstall commands.
-	    eval cmds=\"$postuninstall_cmds\"
-	    IFS="${IFS= 	}"; save_ifs="$IFS"; IFS='~'
-	    for cmd in $cmds; do
+	  if test $mode = uninstall; then
+	    if test -n "$library_names"; then
+	      # Do each command in the postuninstall commands.
+	      eval cmds=\"$postuninstall_cmds\"
+	      save_ifs="$IFS"; IFS='~'
+	      for cmd in $cmds; do
+		IFS="$save_ifs"
+		$show "$cmd"
+		$run eval "$cmd"
+		if test $? != 0 && test "$rmforce" != yes; then
+		  exit_status=1
+		fi
+	      done
 	      IFS="$save_ifs"
-	      $show "$cmd"
-	      $run eval "$cmd"
-	    done
-	    IFS="$save_ifs"
-	  fi
+	    fi
 
-	  if test -n "$old_library"; then
-	    # Do each command in the old_postuninstall commands.
-	    eval cmds=\"$old_postuninstall_cmds\"
-	    IFS="${IFS= 	}"; save_ifs="$IFS"; IFS='~'
-	    for cmd in $cmds; do
+	    if test -n "$old_library"; then
+	      # Do each command in the old_postuninstall commands.
+	      eval cmds=\"$old_postuninstall_cmds\"
+	      save_ifs="$IFS"; IFS='~'
+	      for cmd in $cmds; do
+		IFS="$save_ifs"
+		$show "$cmd"
+		$run eval "$cmd"
+		if test $? != 0 && test "$rmforce" != yes; then
+		  exit_status=1
+		fi
+	      done
 	      IFS="$save_ifs"
-	      $show "$cmd"
-	      $run eval "$cmd"
-	    done
-	    IFS="$save_ifs"
+	    fi
+	    # FIXME: should reinstall the best remaining shared library.
 	  fi
-
-	  # FIXME: should reinstall the best remaining shared library.
 	fi
 	;;
 
@@ -3821,17 +4742,35 @@
 	  oldobj=`$echo "X$name" | $Xsed -e "$lo2o"`
 	  rmfiles="$rmfiles $dir/$oldobj"
 	fi
-	$show "$rm $rmfiles"
-	$run $rm $rmfiles
 	;;
 
       *)
-	$show "$rm $rmfiles"
-	$run $rm $rmfiles
+	# Do a test to see if this is a libtool program.
+	if test $mode = clean &&
+	   (sed -e '4q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+	  relink_command=
+	  . $dir/$file
+
+	  rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}"
+	  if test "$fast_install" = yes && test -n "$relink_command"; then
+	    rmfiles="$rmfiles $objdir/lt-$name"
+	  fi
+	fi
 	;;
       esac
+      $show "$rm $rmfiles"
+      $run $rm $rmfiles || exit_status=1
     done
-    exit 0
+
+    # Try to remove the ${objdir}s in the directories where we deleted files
+    for dir in $rmdirs; do
+      if test -d "$dir"; then
+	$show "rmdir $dir"
+	$run rmdir $dir >/dev/null 2>&1
+      fi
+    done
+
+    exit $exit_status
     ;;
 
   "")
@@ -3841,13 +4780,20 @@
     ;;
   esac
 
-  $echo "$modename: invalid operation mode \`$mode'" 1>&2
-  $echo "$generic_help" 1>&2
-  exit 1
+  if test -z "$exec_cmd"; then
+    $echo "$modename: invalid operation mode \`$mode'" 1>&2
+    $echo "$generic_help" 1>&2
+    exit 1
+  fi
 fi # test -z "$show_help"
 
+if test -n "$exec_cmd"; then
+  eval exec $exec_cmd
+  exit 1
+fi
+
 # We need to display help for each of the modes.
-case "$mode" in
+case $mode in
 "") $echo \
 "Usage: $modename [OPTION]... [MODE-ARG]...
 
@@ -3866,6 +4812,7 @@
 
 MODE must be one of the following:
 
+      clean           remove files from the build directory
       compile         compile a source file into a libtool object
       execute         automatically set library path, then run a program
       finish          complete the installation of libtool libraries
@@ -3878,6 +4825,20 @@
   exit 0
   ;;
 
+clean)
+  $echo \
+"Usage: $modename [OPTION]... --mode=clean RM [RM-OPTION]... FILE...
+
+Remove files from the build directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
+to RM.
+
+If FILE is a libtool library, object or program, all the files associated
+with it are deleted. Otherwise, only FILE itself is deleted using RM."
+  ;;
+
 compile)
   $echo \
 "Usage: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE
@@ -3887,6 +4848,8 @@
 This mode accepts the following additional options:
 
   -o OUTPUT-FILE    set the output file name to OUTPUT-FILE
+  -prefer-pic       try to building PIC objects only
+  -prefer-non-pic   try to building non-PIC objects only
   -static           always build a \`.o' file suitable for static linking
 
 COMPILE-COMMAND is a command to be used in creating a \`standard' object file
@@ -3966,6 +4929,8 @@
   -LLIBDIR          search LIBDIR for required installed libraries
   -lNAME            OUTPUT-FILE requires the installed library libNAME
   -module           build a library that can dlopened
+  -no-fast-install  disable the fast-install mode
+  -no-install       link a not-installable executable
   -no-undefined     declare that a library does not refer to external symbols
   -o OUTPUT-FILE    create OUTPUT-FILE from the specified objects
   -release RELEASE  specify package release information
--- a/common/libsndfile/mkinstalldirs
+++ b/common/libsndfile/mkinstalldirs
@@ -4,7 +4,7 @@
 # Created: 1993-05-16
 # Public domain
 
-# $Id: mkinstalldirs,v 1.1 2002/01/14 19:15:51 menno Exp $
+# $Id: mkinstalldirs,v 1.2 2002/07/25 12:22:11 menno Exp $
 
 errstatus=0
 
--- a/common/libsndfile/reconf
+++ b/common/libsndfile/reconf
@@ -2,14 +2,32 @@
 
 rm -f config.cache
 
-if [ -d m4 ]; then
-	echo "Looking in m4 directory."
-	aclocal -I m4
+if [ -d $HOME/Proj/M4 ]; then
+
+	rm -f acinclude.m4.new
+	touch acinclude.m4.new
+	cat $HOME/Proj/M4/extra_largefile.m4 >>acinclude.m4.new
+	cat $HOME/Proj/M4/endian.m4 >>acinclude.m4.new
+	cat $HOME/Proj/M4/lrint.m4 >>acinclude.m4.new
+	cat $HOME/Proj/M4/lrintf.m4 >>acinclude.m4.new
+
+	cmp_data=`cmp acinclude.m4 acinclude.m4.new`
+	if [ x"$cmp_data" = "x" ]; then
+		echo "File acinclude.m4 unchanged."
+	else
+		echo "Updating acinclude.m4"
+		mv -f acinclude.m4.new acinclude.m4
+		fi
+
+	echo "Looking in $HOME/Proj/M4 directory."
+	aclocal -I $HOME/Proj/M4
 else
 	aclocal
 	fi
-	
+
+sed s/AM_PROG_INSTALL/AC_PROG_INSTALL/ aclocal.m4 >aclocal.m4.bak   
+mv -f aclocal.m4.bak aclocal.m4
+
 autoconf
-autoheader
-automake -a
+autoreconf -i --force --foreign
 exit
--- /dev/null
+++ b/common/libsndfile/sndfile.pc.in
@@ -1,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: sndfile
+Description: A library for reading and writing audio files.
+Requires: 
+Version: @VERSION@
+Libs: -L${libdir} -lsndfile -lm
+Cflags:  @ac_cv_sys_largefile_CFLAGS@ -I${includedir} 
--- a/common/libsndfile/src/G72x/Makefile.am
+++ b/common/libsndfile/src/G72x/Makefile.am
@@ -6,9 +6,17 @@
 noinst_HEADERS = g72x.h private.h
 noinst_LTLIBRARIES = libg72x.la
 
+noinst_PROGRAMS = g72x_test
+
 CFILES = g72x.c g721.c g723_16.c g723_24.c g723_40.c
 
 libg72x_la_SOURCES = $(CFILES) $(noinst_HEADERS)
+
+g72x_test_SOURCES = g72x_test.c $(CFILES)
+g72x_test_LDADD = -lm
+
+check: g72x_test
+	./g72x_test all
 
 # Disable autoheader. 
 AUTOHEADER=echo
--- a/common/libsndfile/src/G72x/Makefile.in
+++ b/common/libsndfile/src/G72x/Makefile.in
@@ -68,14 +68,23 @@
 AS = @AS@
 CC = @CC@
 DLLTOOL = @DLLTOOL@
+ECHO = @ECHO@
+EXEEXT = @EXEEXT@
+GETCONF = @GETCONF@
 LIBTOOL = @LIBTOOL@
 LN_S = @LN_S@
 MAKEINFO = @MAKEINFO@
 OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OS_SPECIFIC_INCLUDES = @OS_SPECIFIC_INCLUDES@
+OS_SPECIFIC_LINKS = @OS_SPECIFIC_LINKS@
 PACKAGE = @PACKAGE@
 RANLIB = @RANLIB@
 SHARED_VERSION_INFO = @SHARED_VERSION_INFO@
+STRIP = @STRIP@
 VERSION = @VERSION@
+ac_cv_sys_largefile_CFLAGS = @ac_cv_sys_largefile_CFLAGS@
+autogen = @autogen@
 subdirs = @subdirs@
 
 EXTRA_DIST = README README.original ChangeLog
@@ -83,10 +92,15 @@
 noinst_HEADERS = g72x.h private.h
 noinst_LTLIBRARIES = libg72x.la
 
+noinst_PROGRAMS = g72x_test
+
 CFILES = g72x.c g721.c g723_16.c g723_24.c g723_40.c
 
 libg72x_la_SOURCES = $(CFILES) $(noinst_HEADERS)
 
+g72x_test_SOURCES = g72x_test.c $(CFILES)
+g72x_test_LDADD = -lm
+
 # Disable autoheader. 
 AUTOHEADER = echo
 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
@@ -102,6 +116,13 @@
 libg72x_la_LDFLAGS = 
 libg72x_la_LIBADD = 
 libg72x_la_OBJECTS =  g72x.lo g721.lo g723_16.lo g723_24.lo g723_40.lo
+noinst_PROGRAMS =  g72x_test$(EXEEXT)
+PROGRAMS =  $(noinst_PROGRAMS)
+
+g72x_test_OBJECTS =  g72x_test.$(OBJEXT) g72x.$(OBJEXT) g721.$(OBJEXT) \
+g723_16.$(OBJEXT) g723_24.$(OBJEXT) g723_40.$(OBJEXT)
+g72x_test_DEPENDENCIES = 
+g72x_test_LDFLAGS = 
 CFLAGS = @CFLAGS@
 COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
 LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
@@ -116,14 +137,14 @@
 
 TAR = tar
 GZIP_ENV = --best
-SOURCES = $(libg72x_la_SOURCES)
-OBJECTS = $(libg72x_la_OBJECTS)
+SOURCES = $(libg72x_la_SOURCES) $(g72x_test_SOURCES)
+OBJECTS = $(libg72x_la_OBJECTS) $(g72x_test_OBJECTS)
 
 all: all-redirect
 .SUFFIXES:
-.SUFFIXES: .S .c .lo .o .s
+.SUFFIXES: .S .c .lo .o .obj .s
 $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
-	cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps src/G72x/Makefile
+	cd $(top_srcdir) && $(AUTOMAKE) --foreign --include-deps src/G72x/Makefile
 
 Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
 	cd $(top_builddir) \
@@ -142,6 +163,11 @@
 .c.o:
 	$(COMPILE) -c $<
 
+# FIXME: We should only use cygpath when building on Windows,
+# and only if it is available.
+.c.obj:
+	$(COMPILE) -c `cygpath -w $<`
+
 .s.o:
 	$(COMPILE) -c $<
 
@@ -150,6 +176,7 @@
 
 mostlyclean-compile:
 	-rm -f *.o core *.core
+	-rm -f *.$(OBJEXT)
 
 clean-compile:
 
@@ -180,6 +207,19 @@
 libg72x.la: $(libg72x_la_OBJECTS) $(libg72x_la_DEPENDENCIES)
 	$(LINK)  $(libg72x_la_LDFLAGS) $(libg72x_la_OBJECTS) $(libg72x_la_LIBADD) $(LIBS)
 
+mostlyclean-noinstPROGRAMS:
+
+clean-noinstPROGRAMS:
+	-test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS)
+
+distclean-noinstPROGRAMS:
+
+maintainer-clean-noinstPROGRAMS:
+
+g72x_test$(EXEEXT): $(g72x_test_OBJECTS) $(g72x_test_DEPENDENCIES)
+	@rm -f g72x_test$(EXEEXT)
+	$(LINK) $(g72x_test_LDFLAGS) $(g72x_test_OBJECTS) $(g72x_test_LDADD) $(LIBS)
+
 tags: TAGS
 
 ID: $(HEADERS) $(SOURCES) $(LISP)
@@ -224,12 +264,6 @@
 	    || cp -p $$d/$$file $(distdir)/$$file || :; \
 	  fi; \
 	done
-g721.lo g721.o : g721.c g72x.h private.h
-g723_16.lo g723_16.o : g723_16.c g72x.h private.h
-g723_24.lo g723_24.o : g723_24.c g72x.h private.h
-g723_40.lo g723_40.o : g723_40.c g72x.h private.h
-g72x.lo g72x.o : g72x.c g72x.h private.h
-
 info-am:
 info: info-am
 dvi-am:
@@ -249,7 +283,7 @@
 install: install-am
 uninstall-am:
 uninstall: uninstall-am
-all-am: Makefile $(LTLIBRARIES) $(HEADERS)
+all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(HEADERS)
 all-redirect: all-am
 install-strip:
 	$(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
@@ -266,19 +300,20 @@
 
 maintainer-clean-generic:
 mostlyclean-am:  mostlyclean-noinstLTLIBRARIES mostlyclean-compile \
-		mostlyclean-libtool mostlyclean-tags \
-		mostlyclean-generic
+		mostlyclean-libtool mostlyclean-noinstPROGRAMS \
+		mostlyclean-tags mostlyclean-generic
 
 mostlyclean: mostlyclean-am
 
 clean-am:  clean-noinstLTLIBRARIES clean-compile clean-libtool \
-		clean-tags clean-generic mostlyclean-am
+		clean-noinstPROGRAMS clean-tags clean-generic \
+		mostlyclean-am
 
 clean: clean-am
 
 distclean-am:  distclean-noinstLTLIBRARIES distclean-compile \
-		distclean-libtool distclean-tags distclean-generic \
-		clean-am
+		distclean-libtool distclean-noinstPROGRAMS \
+		distclean-tags distclean-generic clean-am
 	-rm -f libtool
 
 distclean: distclean-am
@@ -285,8 +320,8 @@
 
 maintainer-clean-am:  maintainer-clean-noinstLTLIBRARIES \
 		maintainer-clean-compile maintainer-clean-libtool \
-		maintainer-clean-tags maintainer-clean-generic \
-		distclean-am
+		maintainer-clean-noinstPROGRAMS maintainer-clean-tags \
+		maintainer-clean-generic distclean-am
 	@echo "This command is intended for maintainers to use;"
 	@echo "it deletes files that may require special tools to rebuild."
 
@@ -296,14 +331,19 @@
 clean-noinstLTLIBRARIES maintainer-clean-noinstLTLIBRARIES \
 mostlyclean-compile distclean-compile clean-compile \
 maintainer-clean-compile mostlyclean-libtool distclean-libtool \
-clean-libtool maintainer-clean-libtool tags mostlyclean-tags \
-distclean-tags clean-tags maintainer-clean-tags distdir info-am info \
-dvi-am dvi check check-am installcheck-am installcheck install-exec-am \
-install-exec install-data-am install-data install-am install \
-uninstall-am uninstall all-redirect all-am all installdirs \
-mostlyclean-generic distclean-generic clean-generic \
-maintainer-clean-generic clean mostlyclean distclean maintainer-clean
+clean-libtool maintainer-clean-libtool mostlyclean-noinstPROGRAMS \
+distclean-noinstPROGRAMS clean-noinstPROGRAMS \
+maintainer-clean-noinstPROGRAMS tags mostlyclean-tags distclean-tags \
+clean-tags maintainer-clean-tags distdir info-am info dvi-am dvi check \
+check-am installcheck-am installcheck install-exec-am install-exec \
+install-data-am install-data install-am install uninstall-am uninstall \
+all-redirect all-am all installdirs mostlyclean-generic \
+distclean-generic clean-generic maintainer-clean-generic clean \
+mostlyclean distclean maintainer-clean
 
+
+check: g72x_test
+	./g72x_test all
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
--- a/common/libsndfile/src/G72x/g72x.c
+++ b/common/libsndfile/src/G72x/g72x.c
@@ -81,7 +81,15 @@
 	    (anexp >= 0) ? anmag >> anexp : anmag << -anexp;
 	wanexp = anexp + ((srn >> 6) & 0xF) - 13;
 
-	wanmant = (anmant * (srn & 077) + 0x30) >> 4;
+	/*
+	** The original was :
+	**		wanmant = (anmant * (srn & 0x37) + 0x30) >> 4 ;
+	** but could see no valid reason for the + 0x30.
+	** Removed it and it improved the SNR of the codec.
+	*/
+
+	wanmant = (anmant * (srn & 0x37)) >> 4 ;
+	
 	retval = (wanexp >= 0) ? ((wanmant << wanexp) & 0x7FFF) :
 	    (wanmant >> -wanexp);
 
@@ -95,7 +103,6 @@
  * pointed to by 'state_ptr'.
  * All the initial state values are specified in the CCITT G.721 document.
  */
-static
 void private_init_state (G72x_STATE *state_ptr)
 {
 	int		cnta;
@@ -217,7 +224,6 @@
 	return 0 ;
 }	/* g72x_writer_init */
 
-static
 int unpack_bytes (G72x_DATA *data, int bits)
 {	unsigned int    in_buffer = 0 ;
 	unsigned char	in_byte ;
@@ -252,7 +258,6 @@
 	return 0 ;
 }	/* g72x_decode_block */
 
-static
 int pack_bytes (G72x_DATA *data, int bits)
 {
 	unsigned int	out_buffer = 0 ;
@@ -617,5 +622,7 @@
 		state_ptr->ap += (0x200 - state_ptr->ap) >> 4;
 	else
 		state_ptr->ap += (-state_ptr->ap) >> 4;
-}
+		
+	return ;
+} /* update */
 
--- a/common/libsndfile/src/G72x/g72x.h
+++ b/common/libsndfile/src/G72x/g72x.h
@@ -18,7 +18,7 @@
 
 /*
 ** This file is not the same as the original file from Sun Microsystems. Nearly
-** all the original definitions and function prototypes that were in the  file 
+** all the original definitions and function prototypes that were in the file 
 ** of this name have been moved to private.h.
 */	
 
@@ -41,22 +41,13 @@
 	G723_24_BITS_PER_SAMPLE = 3, 
 	G721_32_BITS_PER_SAMPLE = 4,
 	G721_40_BITS_PER_SAMPLE = 5,
-	
-	G723_16_MIN_BYTES = 1,
-	G723_24_MIN_BYTES = 3, 
-	G721_32_MIN_BYTES = 1,
-	G721_40_MIN_BYTES = 5
-} ;
 
-enum	
-{	G723_16_SAMPLES_PER_BLOCK = G72x_BLOCK_SIZE,
+	G723_16_SAMPLES_PER_BLOCK = G72x_BLOCK_SIZE,
 	G723_24_SAMPLES_PER_BLOCK = G723_24_BITS_PER_SAMPLE * (G72x_BLOCK_SIZE / G723_24_BITS_PER_SAMPLE), 
 	G721_32_SAMPLES_PER_BLOCK = G72x_BLOCK_SIZE,
-	G721_40_SAMPLES_PER_BLOCK = G721_40_BITS_PER_SAMPLE * (G72x_BLOCK_SIZE / G721_40_BITS_PER_SAMPLE)
-} ;
+	G721_40_SAMPLES_PER_BLOCK = G721_40_BITS_PER_SAMPLE * (G72x_BLOCK_SIZE / G721_40_BITS_PER_SAMPLE),
 
-enum	
-{	G723_16_BYTES_PER_BLOCK = (G723_16_BITS_PER_SAMPLE * G72x_BLOCK_SIZE) / 8,
+	G723_16_BYTES_PER_BLOCK = (G723_16_BITS_PER_SAMPLE * G72x_BLOCK_SIZE) / 8,
 	G723_24_BYTES_PER_BLOCK = (G723_24_BITS_PER_SAMPLE * G72x_BLOCK_SIZE) / 8,
 	G721_32_BYTES_PER_BLOCK = (G721_32_BITS_PER_SAMPLE * G72x_BLOCK_SIZE) / 8,
 	G721_40_BYTES_PER_BLOCK = (G721_40_BITS_PER_SAMPLE * G72x_BLOCK_SIZE) / 8
--- /dev/null
+++ b/common/libsndfile/src/G72x/g72x_test.c
@@ -1,0 +1,215 @@
+/*
+** Copyright (C) 1999-2002 Erik de Castro Lopo <[email protected]>
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+** 
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+** 
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+ 
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+
+#include "g72x.h"
+#include "private.h"
+
+#ifndef		M_PI
+#define		M_PI		3.14159265358979323846264338
+#endif
+
+#define		BUFFER_SIZE		(1<<14) /* Should be (1<<14) */
+#define		SAMPLE_RATE		11025
+
+
+static void g721_test	(void) ;
+static void g723_test	(double margin) ;
+
+static void	gen_signal_double (double *data, double scale, int datalen) ;
+static int error_function (double data, double orig, double margin) ;
+
+static int	oct_save_short	(short *a, short *b, int len) ;
+
+static double	orig_buffer [BUFFER_SIZE] ;
+static short 	orig [BUFFER_SIZE] ;
+static short 	data [BUFFER_SIZE] ;
+
+
+int
+main (int argc, char *argv [])
+{	int		bDoAll = 0 ;
+	int		nTests = 0 ;
+
+	if (argc != 2)
+	{	printf ("Usage : %s <test>\n", argv [0]) ;
+		printf ("    Where <test> is one of the following:\n") ;
+		printf ("           g721  - test G721 encoder and decoder\n") ;
+		printf ("           g723  - test G721 encoder and decoder\n") ;
+		printf ("           all   - perform all tests\n") ;
+		exit (1) ;
+		} ;
+
+	bDoAll=!strcmp (argv [1], "all");
+
+	if (bDoAll || ! strcmp (argv [1], "g721"))
+	{	g721_test	() ;
+		nTests++ ;
+		} ;
+
+	if (bDoAll || ! strcmp (argv [1], "g723"))
+	{	g723_test	(0.53) ;
+		nTests++ ;
+		} ;
+
+	if (nTests == 0)
+	{	printf ("Mono : ************************************\n") ;
+		printf ("Mono : *  No '%s' test defined.\n", argv [1]) ;
+		printf ("Mono : ************************************\n") ;
+		return 1 ;
+		} ;
+
+	return 0 ;
+} /* main */
+
+static void 
+g721_test	(void)
+{
+	return ;
+} /* g721_test */
+
+static void 
+g723_test	(double margin)
+{	G72x_STATE encoder_state, decoder_state ;
+	
+	long	k ;
+	int 	code, position, max_err ;
+
+	private_init_state (&encoder_state) ;
+	encoder_state.encoder = g723_24_encoder ;
+	encoder_state.codec_bits = 3 ;
+
+	private_init_state (&decoder_state) ;
+	decoder_state.decoder = g723_24_decoder ;
+	decoder_state.codec_bits = 3 ;
+
+	memset (data, 0, BUFFER_SIZE * sizeof (short)) ;
+	memset (orig, 0, BUFFER_SIZE * sizeof (short)) ;
+	
+	printf ("    g723_test    : ") ;
+	fflush (stdout) ;
+	
+	gen_signal_double (orig_buffer, 32000.0, BUFFER_SIZE) ;
+	for (k = 0 ; k < BUFFER_SIZE ; k++)
+		orig [k] = (short) orig_buffer [k] ;
+
+	/* Write and read data here. */
+	position = 0 ;
+	max_err = 0 ;
+	for (k = 0 ; k < BUFFER_SIZE ; k++)
+	{	code = encoder_state.encoder (orig [k], &encoder_state) ;
+		data [k] = decoder_state.decoder (code, &decoder_state) ;
+		if (abs (orig [k] - data [k]) > max_err)
+		{	position = k ;
+			max_err = abs (orig [k] - data [k]) ;
+			} ;
+		} ;
+
+	printf ("\n\nMax error of %d at postion %d.\n", max_err, position) ;
+
+	for (k = 0 ; k < BUFFER_SIZE ; k++)
+	{	if (error_function (data [k], orig [k], margin))
+		{	printf ("Line %d: Incorrect sample A (#%ld : %d should be %d).\n", __LINE__, k, data [k], orig [k]) ;
+			oct_save_short (orig, data, BUFFER_SIZE) ;
+			exit (1) ;
+			} ;
+		} ;
+
+
+	printf ("ok\n") ;
+
+	return ;
+} /* g723_test */
+
+
+#define		SIGNAL_MAXVAL	30000.0
+#define		DECAY_COUNT		1000
+
+static void	
+gen_signal_double (double *data, double scale, int datalen)
+{	int		k, ramplen ;
+	double	amp = 0.0 ;
+	
+	ramplen = DECAY_COUNT ;
+	
+	for (k = 0 ; k < datalen ; k++)
+	{	if (k <= ramplen)
+			amp = scale * k / ((double) ramplen) ;
+		else if (k > datalen - ramplen)
+			amp = scale * (datalen - k) / ((double) ramplen) ;
+
+		data [k] = amp * (0.4 * sin (33.3 * 2.0 * M_PI * ((double) (k+1)) / ((double) SAMPLE_RATE))
+						+ 0.3 * cos (201.1 * 2.0 * M_PI * ((double) (k+1)) / ((double) SAMPLE_RATE))) ;
+		} ;
+	
+	return ;
+} /* gen_signal_double */
+
+static int 
+error_function (double data, double orig, double margin)
+{	double error ;
+
+	if (fabs (orig) <= 500.0)
+		error = fabs (fabs (data) - fabs(orig)) / 2000.0 ;
+	else if (fabs (orig) <= 1000.0)
+		error = fabs (data - orig) / 3000.0 ;
+	else
+		error = fabs (data - orig) / fabs (orig) ;
+		
+	if (error > margin)
+	{	printf ("\n\n*******************\nError : %f\n", error) ;
+		return 1 ;
+		} ;
+	return 0 ;
+} /* error_function */
+
+static int		
+oct_save_short	(short *a, short *b, int len)
+{	FILE 	*file ;
+	int		k ;
+
+	if (! (file = fopen ("error.dat", "w")))
+		return 1 ;
+		
+	fprintf (file, "# Not created by Octave\n") ;
+	
+	fprintf (file, "# name: a\n") ;
+	fprintf (file, "# type: matrix\n") ;
+	fprintf (file, "# rows: %d\n", len) ;
+	fprintf (file, "# columns: 1\n") ;
+	
+	for (k = 0 ; k < len ; k++)
+		fprintf (file, "% d\n", a [k]) ;
+
+	fprintf (file, "# name: b\n") ;
+	fprintf (file, "# type: matrix\n") ;
+	fprintf (file, "# rows: %d\n", len) ;
+	fprintf (file, "# columns: 1\n") ;
+	
+	for (k = 0 ; k < len ; k++)
+		fprintf (file, "% d\n", b [k]) ;
+
+	fclose (file) ;
+	return 0 ;
+} /* oct_save_short */
+
--- a/common/libsndfile/src/G72x/private.h
+++ b/common/libsndfile/src/G72x/private.h
@@ -79,15 +79,15 @@
 
 
 
-int	predictor_zero(G72x_STATE *state_ptr);
+int	predictor_zero (G72x_STATE *state_ptr);
 
-int	predictor_pole(G72x_STATE *state_ptr);
+int	predictor_pole (G72x_STATE *state_ptr);
 
-int	step_size(G72x_STATE *state_ptr);
+int	step_size (G72x_STATE *state_ptr);
 
-int	quantize(int d, int	y, short *table, int size);
+int	quantize (int d, int	y, short *table, int size);
 
-int	reconstruct(int sign, int dqln,	int y);
+int	reconstruct (int sign, int dqln,	int y);
 
 void update (int code_size, int y, int wi, int fi, int dq, int sr, int dqsez, G72x_STATE *state_ptr);
 
@@ -103,6 +103,9 @@
 int g723_40_encoder	(int sample, G72x_STATE *state_ptr);
 int g723_40_decoder	(int code, G72x_STATE *state_ptr);
 
+int unpack_bytes (G72x_DATA *data, int bits) ;
+int pack_bytes (G72x_DATA *data, int bits) ;
 
+void private_init_state (G72x_STATE *state_ptr) ;
 
 #endif /* G72X_PRIVATE_H */
--- a/common/libsndfile/src/GSM610/ChangeLog
+++ b/common/libsndfile/src/GSM610/ChangeLog
@@ -1,20 +1,36 @@
-2001-09-16  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2002-06-08  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
+    * private.h
+	Made declarations of gsm_A, gsm_B, gsm_MIC etc extern. This fixed a compile
+	problem on MacOSX.
+
+2002-05-10  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
+	* *.[ch]
+	Removed all pre-ANSI prototype kludges. Removed proto.h and unproto.h. 
+	Started work on making GSM 6.10 files seekable. Currently they are not.
+
+    * code.c private.h
+	Function Gsm_Coder () used a statically defined array. This was obviously
+	not re-entrant so moved it to struct gsm_state.
+
+2001-09-16  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
+
     * code.c
-    Added #includes fro string.h and stdlib.h.
+    Added #includes for string.h and stdlib.h.
 
-2000-10-27  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2000-10-27  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * config.h
     Removed some commented out #defines (ie //*efine) which were causing problems on
 	the Sun cc compiler.
 
-2000-02-29  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2000-02-29  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * private.h
     Added #defines to emulate normal compile time options.
 
-2000-02-28  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+2000-02-28  Erik de Castro Lopo  <erikd AT zipworld DOT com DOT au>
 
     * everthing
     Created this directory and copied files from libgsm.
--- a/common/libsndfile/src/GSM610/Makefile.am
+++ b/common/libsndfile/src/GSM610/Makefile.am
@@ -3,7 +3,7 @@
 
 EXTRA_DIST = README COPYRIGHT ChangeLog
 
-noinst_HEADERS = gsm.h config.h private.h proto.h unproto.h
+noinst_HEADERS = gsm.h config.h private.h
 noinst_LTLIBRARIES = libgsm.la
 
 CFILES = add.c decode.c gsm_decode.c gsm_encode.c long_term.c preprocess.c \
--- a/common/libsndfile/src/GSM610/Makefile.in
+++ b/common/libsndfile/src/GSM610/Makefile.in
@@ -68,19 +68,28 @@
 AS = @AS@
 CC = @CC@
 DLLTOOL = @DLLTOOL@
+ECHO = @ECHO@
+EXEEXT = @EXEEXT@
+GETCONF = @GETCONF@
 LIBTOOL = @LIBTOOL@
 LN_S = @LN_S@
 MAKEINFO = @MAKEINFO@
 OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OS_SPECIFIC_INCLUDES = @OS_SPECIFIC_INCLUDES@
+OS_SPECIFIC_LINKS = @OS_SPECIFIC_LINKS@
 PACKAGE = @PACKAGE@
 RANLIB = @RANLIB@
 SHARED_VERSION_INFO = @SHARED_VERSION_INFO@
+STRIP = @STRIP@
 VERSION = @VERSION@
+ac_cv_sys_largefile_CFLAGS = @ac_cv_sys_largefile_CFLAGS@
+autogen = @autogen@
 subdirs = @subdirs@
 
 EXTRA_DIST = README COPYRIGHT ChangeLog
 
-noinst_HEADERS = gsm.h config.h private.h proto.h unproto.h
+noinst_HEADERS = gsm.h config.h private.h
 noinst_LTLIBRARIES = libgsm.la
 
 CFILES = add.c decode.c gsm_decode.c gsm_encode.c long_term.c preprocess.c 	short_term.c code.c gsm_create.c gsm_destroy.c gsm_option.c lpc.c rpe.c table.c
@@ -124,9 +133,9 @@
 
 all: all-redirect
 .SUFFIXES:
-.SUFFIXES: .S .c .lo .o .s
+.SUFFIXES: .S .c .lo .o .obj .s
 $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
-	cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps src/GSM610/Makefile
+	cd $(top_srcdir) && $(AUTOMAKE) --foreign --include-deps src/GSM610/Makefile
 
 Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
 	cd $(top_builddir) \
@@ -145,6 +154,11 @@
 .c.o:
 	$(COMPILE) -c $<
 
+# FIXME: We should only use cygpath when building on Windows,
+# and only if it is available.
+.c.obj:
+	$(COMPILE) -c `cygpath -w $<`
+
 .s.o:
 	$(COMPILE) -c $<
 
@@ -153,6 +167,7 @@
 
 mostlyclean-compile:
 	-rm -f *.o core *.core
+	-rm -f *.$(OBJEXT)
 
 clean-compile:
 
@@ -227,27 +242,6 @@
 	    || cp -p $$d/$$file $(distdir)/$$file || :; \
 	  fi; \
 	done
-add.lo add.o : add.c private.h proto.h unproto.h gsm.h
-code.lo code.o : code.c config.h private.h proto.h unproto.h gsm.h
-decode.lo decode.o : decode.c private.h proto.h unproto.h gsm.h
-gsm_create.lo gsm_create.o : gsm_create.c config.h gsm.h private.h \
-	proto.h unproto.h
-gsm_decode.lo gsm_decode.o : gsm_decode.c private.h proto.h unproto.h \
-	gsm.h
-gsm_destroy.lo gsm_destroy.o : gsm_destroy.c gsm.h config.h proto.h
-gsm_encode.lo gsm_encode.o : gsm_encode.c private.h proto.h unproto.h \
-	gsm.h
-gsm_option.lo gsm_option.o : gsm_option.c private.h proto.h unproto.h \
-	gsm.h
-long_term.lo long_term.o : long_term.c private.h proto.h unproto.h gsm.h
-lpc.lo lpc.o : lpc.c private.h proto.h unproto.h gsm.h
-preprocess.lo preprocess.o : preprocess.c private.h proto.h unproto.h \
-	gsm.h
-rpe.lo rpe.o : rpe.c private.h proto.h unproto.h gsm.h
-short_term.lo short_term.o : short_term.c private.h proto.h unproto.h \
-	gsm.h
-table.lo table.o : table.c private.h proto.h unproto.h gsm.h
-
 info-am:
 info: info-am
 dvi-am:
--- a/common/libsndfile/src/GSM610/add.c
+++ b/common/libsndfile/src/GSM610/add.c
@@ -4,7 +4,7 @@
  * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
  */
 
-/* $Header: /home/cvs/f/fa/faac/faad2/common/libsndfile/src/GSM610/Attic/add.c,v 1.1 2002/01/14 19:15:54 menno Exp $ */
+/* $Header: /home/cvs/f/fa/faac/faad2/common/libsndfile/src/GSM610/Attic/add.c,v 1.2 2002/07/25 12:22:13 menno Exp $ */
 
 /*
  *  See private.h for the more commonly used macro versions.
@@ -15,30 +15,29 @@
 
 #include	"private.h"
 #include	"gsm.h"
-#include	"proto.h"
 
 #define	saturate(x) 	\
 	((x) < MIN_WORD ? MIN_WORD : (x) > MAX_WORD ? MAX_WORD: (x))
 
-word gsm_add P2((a,b), word a, word b)
+word gsm_add ( word a, word b)
 {
 	longword sum = (longword)a + (longword)b;
 	return saturate(sum);
 }
 
-word gsm_sub P2((a,b), word a, word b)
+word gsm_sub ( word a, word b)
 {
 	longword diff = (longword)a - (longword)b;
 	return saturate(diff);
 }
 
-word gsm_mult P2((a,b), word a, word b)
+word gsm_mult ( word a, word b)
 {
 	if (a == MIN_WORD && b == MIN_WORD) return MAX_WORD;
 	else return SASR( (longword)a * (longword)b, 15 );
 }
 
-word gsm_mult_r P2((a,b), word a, word b)
+word gsm_mult_r ( word a, word b)
 {
 	if (b == MIN_WORD && a == MIN_WORD) return MAX_WORD;
 	else {
@@ -48,18 +47,18 @@
 	}
 }
 
-word gsm_abs P1((a), word a)
+word gsm_abs (word a)
 {
 	return a < 0 ? (a == MIN_WORD ? MAX_WORD : -a) : a;
 }
 
-longword gsm_L_mult P2((a,b),word a, word b)
+longword gsm_L_mult (word a, word b)
 {
 	assert( a != MIN_WORD || b != MIN_WORD );
 	return ((longword)a * (longword)b) << 1;
 }
 
-longword gsm_L_add P2((a,b), longword a, longword b)
+longword gsm_L_add ( longword a, longword b)
 {
 	if (a < 0) {
 		if (b >= 0) return a + b;
@@ -75,7 +74,7 @@
 	}
 }
 
-longword gsm_L_sub P2((a,b), longword a, longword b)
+longword gsm_L_sub ( longword a, longword b)
 {
 	if (a >= 0) {
 		if (b >= 0) return a - b;
@@ -114,7 +113,7 @@
 	 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
 };
 
-word gsm_norm P1((a), longword a )
+word gsm_norm (longword a )
 /*
  * the number of left shifts needed to normalize the 32 bit
  * variable L_var1 for positive values on the interval
@@ -219,7 +218,7 @@
  *	  >= num > 0
  */
 
-word gsm_div P2((num,denum), word num, word denum)
+word gsm_div (word num, word denum)
 {
 	longword	L_num   = num;
 	longword	L_denum = denum;
--- a/common/libsndfile/src/GSM610/code.c
+++ b/common/libsndfile/src/GSM610/code.c
@@ -4,7 +4,7 @@
  * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
  */
 
-/* $Header: /home/cvs/f/fa/faac/faad2/common/libsndfile/src/GSM610/Attic/code.c,v 1.1 2002/01/14 19:15:54 menno Exp $ */
+/* $Header: /home/cvs/f/fa/faac/faad2/common/libsndfile/src/GSM610/Attic/code.c,v 1.2 2002/07/25 12:22:13 menno Exp $ */
 
 
 
@@ -16,15 +16,14 @@
 
 #include	"private.h"
 #include	"gsm.h"
-#include	"proto.h"
 
 /* 
  *  4.2 FIXED POINT IMPLEMENTATION OF THE RPE-LTP CODER 
  */
 
-void Gsm_Coder P8((S,s,LARc,Nc,bc,Mc,xmaxc,xMc),
+void Gsm_Coder (
 
-	struct gsm_state	* S,
+	struct gsm_state	* State,
 
 	word	* s,	/* [0..159] samples		  	IN	*/
 
@@ -54,29 +53,27 @@
 )
 {
 	int	k;
-	word	* dp  = S->dp0 + 120;	/* [ -120...-1 ] */
+	word	* dp  = State->dp0 + 120;	/* [ -120...-1 ] */
 	word	* dpp = dp;		/* [ 0...39 ]	 */
 
-	static word e[50];
-
 	word	so[160];
 
-	Gsm_Preprocess			(S, s, so);
-	Gsm_LPC_Analysis		(S, so, LARc);
-	Gsm_Short_Term_Analysis_Filter	(S, LARc, so);
+	Gsm_Preprocess			(State, s, so);
+	Gsm_LPC_Analysis		(State, so, LARc);
+	Gsm_Short_Term_Analysis_Filter	(State, LARc, so);
 
 	for (k = 0; k <= 3; k++, xMc += 13) {
 
-		Gsm_Long_Term_Predictor	( S,
+		Gsm_Long_Term_Predictor	( State,
 					 so+k*40, /* d      [0..39] IN	*/
 					 dp,	  /* dp  [-120..-1] IN	*/
-					e + 5,	  /* e      [0..39] OUT	*/
+					State->e + 5,	  /* e      [0..39] OUT	*/
 					dpp,	  /* dpp    [0..39] OUT */
 					 Nc++,
 					 bc++);
 
-		Gsm_RPE_Encoding	( S,
-					e + 5,	/* e	  ][0..39][ IN/OUT */
+		Gsm_RPE_Encoding	( /*-S,-*/
+					State->e + 5,	/* e	  ][0..39][ IN/OUT */
 					  xmaxc++, Mc++, xMc );
 		/*
 		 * Gsm_Update_of_reconstructed_short_time_residual_signal
@@ -86,12 +83,12 @@
 		{ register int i;
 		  register longword ltmp;
 		  for (i = 0; i <= 39; i++)
-			dp[ i ] = GSM_ADD( e[5 + i], dpp[i] );
+			dp[ i ] = GSM_ADD( State->e[5 + i], dpp[i] );
 		}
 		dp  += 40;
 		dpp += 40;
 
 	}
-	(void)memcpy( (char *)S->dp0, (char *)(S->dp0 + 160),
-		120 * sizeof(*S->dp0) );
+	(void)memcpy( (char *)State->dp0, (char *)(State->dp0 + 160),
+		120 * sizeof(*State->dp0) );
 }
--- a/common/libsndfile/src/GSM610/config.h
+++ b/common/libsndfile/src/GSM610/config.h
@@ -4,7 +4,7 @@
  * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
  */
 
-/*$Header: /home/cvs/f/fa/faac/faad2/common/libsndfile/src/GSM610/Attic/config.h,v 1.1 2002/01/14 19:15:54 menno Exp $*/
+/*$Header: /home/cvs/f/fa/faac/faad2/common/libsndfile/src/GSM610/Attic/config.h,v 1.2 2002/07/25 12:22:13 menno Exp $*/
 
 #ifndef	CONFIG_H
 #define	CONFIG_H
--- a/common/libsndfile/src/GSM610/decode.c
+++ b/common/libsndfile/src/GSM610/decode.c
@@ -4,19 +4,18 @@
  * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
  */
 
-/* $Header: /home/cvs/f/fa/faac/faad2/common/libsndfile/src/GSM610/Attic/decode.c,v 1.1 2002/01/14 19:15:54 menno Exp $ */
+/* $Header: /home/cvs/f/fa/faac/faad2/common/libsndfile/src/GSM610/Attic/decode.c,v 1.2 2002/07/25 12:22:13 menno Exp $ */
 
 #include <stdio.h>
 
 #include	"private.h"
 #include	"gsm.h"
-#include	"proto.h"
 
 /*
  *  4.3 FIXED POINT IMPLEMENTATION OF THE RPE-LTP DECODER
  */
 
-static void Postprocessing P2((S,s),
+static void Postprocessing (
 	struct gsm_state	* S,
 	register word 		* s)
 {
@@ -33,7 +32,7 @@
 	S->msr = msr;
 }
 
-void Gsm_Decoder P8((S,LARcr, Ncr,bcr,Mcr,xmaxcr,xMcr,s),
+void Gsm_Decoder (
 	struct gsm_state	* S,
 
 	word		* LARcr,	/* [0..7]		IN	*/
@@ -52,7 +51,7 @@
 
 	for (j=0; j <= 3; j++, xmaxcr++, bcr++, Ncr++, Mcr++, xMcr += 13) {
 
-		Gsm_RPE_Decoding( S, *xmaxcr, *Mcr, xMcr, erp );
+		Gsm_RPE_Decoding( /*-S,-*/ *xmaxcr, *Mcr, xMcr, erp );
 		Gsm_Long_Term_Synthesis_Filtering( S, *Ncr, *bcr, erp, drp );
 
 		for (k = 0; k <= 39; k++) wt[ j * 40 + k ] =  drp[ k ];
--- a/common/libsndfile/src/GSM610/gsm.h
+++ b/common/libsndfile/src/GSM610/gsm.h
@@ -4,48 +4,27 @@
  * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
  */
 
-/*$Header: /home/cvs/f/fa/faac/faad2/common/libsndfile/src/GSM610/Attic/gsm.h,v 1.1 2002/01/14 19:15:54 menno Exp $*/
+/*$Header: /home/cvs/f/fa/faac/faad2/common/libsndfile/src/GSM610/Attic/gsm.h,v 1.2 2002/07/25 12:22:13 menno Exp $*/
 
 #ifndef	GSM_H
 #define	GSM_H
 
-#ifdef __cplusplus
-#	define	NeedFunctionPrototypes	1
-#endif
+#include	<stdio.h>		/* for FILE * 	*/
 
-#if __STDC__
-#	define	NeedFunctionPrototypes	1
-#endif
-
-#ifdef _NO_PROTO
-#	undef	NeedFunctionPrototypes
-#endif
-
-#ifdef NeedFunctionPrototypes
-#   include	<stdio.h>		/* for FILE * 	*/
-#endif
-
-#undef GSM_P
-#if NeedFunctionPrototypes
-#	define	GSM_P( protos )	protos
-#else
-#	define  GSM_P( protos )	( /* protos */ )
-#endif
-
 /*
  *	Interface
  */
 
 typedef struct gsm_state * 	gsm;
-typedef short		   	gsm_signal;		/* signed 16 bit */
+typedef short		   		gsm_signal;		/* signed 16 bit */
 typedef unsigned char		gsm_byte;
-typedef gsm_byte 		gsm_frame[33];		/* 33 * 8 bits	 */
+typedef gsm_byte 			gsm_frame[33];		/* 33 * 8 bits	 */
 
 #define	GSM_MAGIC		0xD		  	/* 13 kbit/s RPE-LTP */
 
 #define	GSM_PATCHLEVEL		10
-#define	GSM_MINOR		0
-#define	GSM_MAJOR		1
+#define	GSM_MINOR			0
+#define	GSM_MAJOR			1
 
 #define	GSM_OPT_VERBOSE		1
 #define	GSM_OPT_FAST		2
@@ -54,18 +33,20 @@
 #define	GSM_OPT_FRAME_INDEX	5
 #define	GSM_OPT_FRAME_CHAIN	6
 
-extern gsm  gsm_create 	GSM_P((void));
-extern void gsm_destroy GSM_P((gsm));	
+gsm  gsm_create 	(void);
 
-extern int  gsm_print   GSM_P((FILE *, gsm, gsm_byte  *));
-extern int  gsm_option  GSM_P((gsm, int, int *));
+/* Added for libsndfile : May 6, 2002 */
+void gsm_init (gsm);	
 
-extern void gsm_encode  GSM_P((gsm, gsm_signal *, gsm_byte  *));
-extern int  gsm_decode  GSM_P((gsm, gsm_byte   *, gsm_signal *));
+void gsm_destroy (gsm);	
 
-extern int  gsm_explode GSM_P((gsm, gsm_byte   *, gsm_signal *));
-extern void gsm_implode GSM_P((gsm, gsm_signal *, gsm_byte   *));
+int  gsm_print   (FILE *, gsm, gsm_byte  *);
+int  gsm_option  (gsm, int, int *);
 
-#undef	GSM_P
+void gsm_encode  (gsm, gsm_signal *, gsm_byte  *);
+int  gsm_decode  (gsm, gsm_byte   *, gsm_signal *);
+
+int  gsm_explode (gsm, gsm_byte   *, gsm_signal *);
+void gsm_implode (gsm, gsm_signal *, gsm_byte   *);
 
 #endif	/* GSM_H */
--- a/common/libsndfile/src/GSM610/gsm_create.c
+++ b/common/libsndfile/src/GSM610/gsm_create.c
@@ -4,42 +4,35 @@
  * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
  */
 
-static char const	ident[] = "$Header: /home/cvs/f/fa/faac/faad2/common/libsndfile/src/GSM610/Attic/gsm_create.c,v 1.1 2002/01/14 19:15:54 menno Exp $";
+static char const	ident[] = "$Header: /home/cvs/f/fa/faac/faad2/common/libsndfile/src/GSM610/Attic/gsm_create.c,v 1.2 2002/07/25 12:22:13 menno Exp $";
 
 #include	"config.h"
 
-#ifdef	HAS_STRING_H
+#include	<stdio.h>
+#include	<stdlib.h>
 #include	<string.h>
-#else
-#	include "proto.h"
-	extern char	* memset P((char *, int, int));
-#endif
 
-#ifdef	HAS_STDLIB_H
-#	include	<stdlib.h>
-#else
-#	ifdef	HAS_MALLOC_H
-#		include 	<malloc.h>
-#	else
-		extern char * malloc();
-#	endif
-#endif
 
-#include <stdio.h>
 
 #include "gsm.h"
 #include "private.h"
-#include "proto.h"
 
-gsm gsm_create P0()
+gsm gsm_create (void)
 {
 	gsm  r;
 
-	r = (gsm)malloc(sizeof(struct gsm_state));
+	r = malloc (sizeof(struct gsm_state));
 	if (!r) return r;
-
-	memset((char *)r, 0, sizeof(*r));
+	
+	memset((char *)r, 0, sizeof (struct gsm_state));
 	r->nrp = 40;
 
 	return r;
 }
+
+/* Added for libsndfile : May 6, 2002. Not sure if it works. */
+void gsm_init (gsm state)
+{
+	memset (state, 0, sizeof (struct gsm_state)) ;
+	state->nrp = 40 ;
+} 
--- a/common/libsndfile/src/GSM610/gsm_decode.c
+++ b/common/libsndfile/src/GSM610/gsm_decode.c
@@ -4,14 +4,13 @@
  * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
  */
 
-/* $Header: /home/cvs/f/fa/faac/faad2/common/libsndfile/src/GSM610/Attic/gsm_decode.c,v 1.1 2002/01/14 19:15:54 menno Exp $ */
+/* $Header: /home/cvs/f/fa/faac/faad2/common/libsndfile/src/GSM610/Attic/gsm_decode.c,v 1.2 2002/07/25 12:22:13 menno Exp $ */
 
 #include "private.h"
 
 #include "gsm.h"
-#include "proto.h"
 
-int gsm_decode P3((s, c, target), gsm s, gsm_byte * c, gsm_signal * target)
+int gsm_decode (gsm s, gsm_byte * c, gsm_signal * target)
 {
 	word  	LARc[8], Nc[4], Mc[4], bc[4], xmaxc[4], xmc[13*4];
 
--- a/common/libsndfile/src/GSM610/gsm_destroy.c
+++ b/common/libsndfile/src/GSM610/gsm_destroy.c
@@ -4,11 +4,10 @@
  * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
  */
 
-/* $Header: /home/cvs/f/fa/faac/faad2/common/libsndfile/src/GSM610/Attic/gsm_destroy.c,v 1.1 2002/01/14 19:15:54 menno Exp $ */
+/* $Header: /home/cvs/f/fa/faac/faad2/common/libsndfile/src/GSM610/Attic/gsm_destroy.c,v 1.2 2002/07/25 12:22:13 menno Exp $ */
 
 #include "gsm.h"
 #include "config.h"
-#include "proto.h"
 
 #ifdef	HAS_STDLIB_H
 #	include	<stdlib.h>
@@ -20,7 +19,7 @@
 #	endif
 #endif
 
-void gsm_destroy P1((S), gsm S)
+void gsm_destroy (gsm S)
 {
 	if (S) free((char *)S);
 }
--- a/common/libsndfile/src/GSM610/gsm_encode.c
+++ b/common/libsndfile/src/GSM610/gsm_encode.c
@@ -4,13 +4,12 @@
  * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
  */
 
-/* $Header: /home/cvs/f/fa/faac/faad2/common/libsndfile/src/GSM610/Attic/gsm_encode.c,v 1.1 2002/01/14 19:15:54 menno Exp $ */
+/* $Header: /home/cvs/f/fa/faac/faad2/common/libsndfile/src/GSM610/Attic/gsm_encode.c,v 1.2 2002/07/25 12:22:13 menno Exp $ */
 
 #include "private.h"
 #include "gsm.h"
-#include "proto.h"
 
-void gsm_encode P3((s, source, c), gsm s, gsm_signal * source, gsm_byte * c)
+void gsm_encode (gsm s, gsm_signal * source, gsm_byte * c)
 {
 	word	 	LARc[8], Nc[4], Mc[4], bc[4], xmaxc[4], xmc[13*4];
 
--- a/common/libsndfile/src/GSM610/gsm_option.c
+++ b/common/libsndfile/src/GSM610/gsm_option.c
@@ -4,14 +4,13 @@
  * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
  */
 
-/* $Header: /home/cvs/f/fa/faac/faad2/common/libsndfile/src/GSM610/Attic/gsm_option.c,v 1.1 2002/01/14 19:15:54 menno Exp $ */
+/* $Header: /home/cvs/f/fa/faac/faad2/common/libsndfile/src/GSM610/Attic/gsm_option.c,v 1.2 2002/07/25 12:22:13 menno Exp $ */
 
 #include "private.h"
 
 #include "gsm.h"
-#include "proto.h"
 
-int gsm_option P3((r, opt, val), gsm r, int opt, int * val)
+int gsm_option (gsm r, int opt, int * val)
 {
 	int 	result = -1;
 
--- a/common/libsndfile/src/GSM610/long_term.c
+++ b/common/libsndfile/src/GSM610/long_term.c
@@ -4,7 +4,7 @@
  * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
  */
 
-/* $Header: /home/cvs/f/fa/faac/faad2/common/libsndfile/src/GSM610/Attic/long_term.c,v 1.1 2002/01/14 19:15:55 menno Exp $ */
+/* $Header: /home/cvs/f/fa/faac/faad2/common/libsndfile/src/GSM610/Attic/long_term.c,v 1.2 2002/07/25 12:22:13 menno Exp $ */
 
 #include <stdio.h>
 #include <assert.h>
@@ -12,7 +12,6 @@
 #include "private.h"
 
 #include "gsm.h"
-#include "proto.h"
 
 /*
  *  4.2.11 .. 4.2.12 LONG TERM PREDICTOR (LTP) SECTION
@@ -46,7 +45,7 @@
 
 #ifdef	LTP_CUT
 
-static void Cut_Calculation_of_the_LTP_parameters P5((st, d,dp,bc_out,Nc_out),
+static void Cut_Calculation_of_the_LTP_parameters (
 
 	struct gsm_state * st,
 
@@ -153,7 +152,7 @@
 
 #endif 	/* LTP_CUT */
 
-static void Calculation_of_the_LTP_parameters P4((d,dp,bc_out,Nc_out),
+static void Calculation_of_the_LTP_parameters (
 	register word	* d,		/* [0..39]	IN	*/
 	register word	* dp,		/* [-120..-1]	IN	*/
 	word		* bc_out,	/* 		OUT	*/
@@ -290,7 +289,7 @@
 
 #ifdef	LTP_CUT
 
-static void Cut_Calculation_of_the_LTP_parameters P5((st, d,dp,bc_out,Nc_out),
+static void Cut_Calculation_of_the_LTP_parameters (
 	struct gsm_state * st,		/*              IN 	*/
 	register word	* d,		/* [0..39]	IN	*/
 	register word	* dp,		/* [-120..-1]	IN	*/
@@ -468,7 +467,7 @@
 
 #endif /* LTP_CUT */
 
-static void Calculation_of_the_LTP_parameters P4((d,dp,bc_out,Nc_out),
+static void Calculation_of_the_LTP_parameters (
 	register word	* d,		/* [0..39]	IN	*/
 	register word	* dp,		/* [-120..-1]	IN	*/
 	word		* bc_out,	/* 		OUT	*/
@@ -634,8 +633,7 @@
 #ifdef	FAST
 #ifdef	LTP_CUT
 
-static void Cut_Fast_Calculation_of_the_LTP_parameters P5((st,
-							d,dp,bc_out,Nc_out),
+static void Cut_Fast_Calculation_of_the_LTP_parameters (
 	struct gsm_state * st,		/*              IN	*/
 	register word	* d,		/* [0..39]	IN	*/
 	register word	* dp,		/* [-120..-1]	IN	*/
@@ -709,7 +707,7 @@
 
 #endif /* LTP_CUT */
 
-static void Fast_Calculation_of_the_LTP_parameters P4((d,dp,bc_out,Nc_out),
+static void Fast_Calculation_of_the_LTP_parameters (
 	register word	* d,		/* [0..39]	IN	*/
 	register word	* dp,		/* [-120..-1]	IN	*/
 	word		* bc_out,	/* 		OUT	*/
@@ -831,7 +829,7 @@
 
 /* 4.2.12 */
 
-static void Long_term_analysis_filtering P6((bc,Nc,dp,d,dpp,e),
+static void Long_term_analysis_filtering (
 	word		bc,	/* 					IN  */
 	word		Nc,	/* 					IN  */
 	register word	* dp,	/* previous d	[-120..-1]		IN  */
@@ -864,7 +862,7 @@
 	}
 }
 
-void Gsm_Long_Term_Predictor P7((S,d,dp,e,dpp,Nc,bc), 	/* 4x for 160 samples */
+void Gsm_Long_Term_Predictor (	/* 4x for 160 samples */
 
 	struct gsm_state	* S,
 
@@ -902,7 +900,7 @@
 }
 
 /* 4.3.2 */
-void Gsm_Long_Term_Synthesis_Filtering P5((S,Ncr,bcr,erp,drp),
+void Gsm_Long_Term_Synthesis_Filtering (
 	struct gsm_state	* S,
 
 	word			Ncr,
--- a/common/libsndfile/src/GSM610/lpc.c
+++ b/common/libsndfile/src/GSM610/lpc.c
@@ -4,7 +4,7 @@
  * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
  */
 
-/* $Header: /home/cvs/f/fa/faac/faad2/common/libsndfile/src/GSM610/Attic/lpc.c,v 1.1 2002/01/14 19:15:55 menno Exp $ */
+/* $Header: /home/cvs/f/fa/faac/faad2/common/libsndfile/src/GSM610/Attic/lpc.c,v 1.2 2002/07/25 12:22:13 menno Exp $ */
 
 #include <stdio.h>
 #include <assert.h>
@@ -12,10 +12,7 @@
 #include "private.h"
 
 #include "gsm.h"
-#include "proto.h"
 
-#undef	P
-
 /*
  *  4.2.4 .. 4.2.7 LPC ANALYSIS SECTION
  */
@@ -23,7 +20,7 @@
 /* 4.2.4 */
 
 
-static void Autocorrelation P2((s, L_ACF),
+static void Autocorrelation (
 	word     * s,		/* [0..159]	IN/OUT  */
  	longword * L_ACF)	/* [0..8]	OUT     */
 /*
@@ -146,7 +143,7 @@
 
 #if defined(USE_FLOAT_MUL) && defined(FAST)
 
-static void Fast_Autocorrelation P2((s, L_ACF),
+static void Fast_Autocorrelation (
 	word * s,		/* [0..159]	IN/OUT  */
  	longword * L_ACF)	/* [0..8]	OUT     */
 {
@@ -174,7 +171,7 @@
 
 /* 4.2.5 */
 
-static void Reflection_coefficients P2( (L_ACF, r),
+static void Reflection_coefficients (
 	longword	* L_ACF,		/* 0...8	IN	*/
 	register word	* r			/* 0...7	OUT 	*/
 )
@@ -243,7 +240,7 @@
 
 /* 4.2.6 */
 
-static void Transformation_to_Log_Area_Ratios P1((r),
+static void Transformation_to_Log_Area_Ratios (
 	register word	* r 			/* 0..7	   IN/OUT */
 )
 /*
@@ -284,7 +281,7 @@
 
 /* 4.2.7 */
 
-static void Quantization_and_coding P1((LAR),
+static void Quantization_and_coding (
 	register word * LAR    	/* [0..7]	IN/OUT	*/
 )
 {
@@ -323,7 +320,7 @@
 #	undef	STEP
 }
 
-void Gsm_LPC_Analysis P3((S, s,LARc),
+void Gsm_LPC_Analysis (
 	struct gsm_state *S,
 	word 		 * s,		/* 0..159 signals	IN/OUT	*/
         word 		 * LARc)	/* 0..7   LARc's	OUT	*/
--- a/common/libsndfile/src/GSM610/preprocess.c
+++ b/common/libsndfile/src/GSM610/preprocess.c
@@ -4,7 +4,7 @@
  * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
  */
 
-/* $Header: /home/cvs/f/fa/faac/faad2/common/libsndfile/src/GSM610/Attic/preprocess.c,v 1.1 2002/01/14 19:15:55 menno Exp $ */
+/* $Header: /home/cvs/f/fa/faac/faad2/common/libsndfile/src/GSM610/Attic/preprocess.c,v 1.2 2002/07/25 12:22:13 menno Exp $ */
 
 #include	<stdio.h>
 #include	<assert.h>
@@ -12,7 +12,6 @@
 #include "private.h"
 
 #include	"gsm.h"
-#include 	"proto.h"
 
 /*	4.2.0 .. 4.2.3	PREPROCESSING SECTION
  *  
@@ -31,7 +30,7 @@
  */
 
 
-void Gsm_Preprocess P3((S, s, so),
+void Gsm_Preprocess (
 	struct gsm_state * S,
 	word		 * s,
 	word 		 * so )		/* [0..159] 	IN/OUT	*/
--- a/common/libsndfile/src/GSM610/private.h
+++ b/common/libsndfile/src/GSM610/private.h
@@ -4,13 +4,12 @@
  * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
  */
 
-/*$Header: /home/cvs/f/fa/faac/faad2/common/libsndfile/src/GSM610/Attic/private.h,v 1.1 2002/01/14 19:15:55 menno Exp $*/
+/*$Header: /home/cvs/f/fa/faac/faad2/common/libsndfile/src/GSM610/Attic/private.h,v 1.2 2002/07/25 12:22:13 menno Exp $*/
 
 #ifndef	PRIVATE_H
 #define	PRIVATE_H
 
 /* Added by Erik de Castro Lopo */
-#define	NeedFunctionPrototypes	1
 #define	SASR  
 #define	USE_FLOAT_MUL
 #define	FAST
@@ -25,32 +24,35 @@
 typedef unsigned short		uword;		/* unsigned word	*/
 typedef unsigned int		ulongword;	/* unsigned longword	*/
 
-struct gsm_state {
+struct gsm_state 
+{	word			dp0[ 280 ];
 
-	word		dp0[ 280 ];
+	word			z1;			/* preprocessing.c, Offset_com. */
+	longword		L_z2;		/*                  Offset_com. */
+	int				mp;			/*                  Preemphasis	*/
 
-	word		z1;		/* preprocessing.c, Offset_com. */
-	longword	L_z2;		/*                  Offset_com. */
-	int			mp;		/*                  Preemphasis	*/
+	word			u[8];			/* short_term_aly_filter.c	*/
+	word			LARpp[2][8]; 	/*                              */
+	word			j;				/*                              */
 
-	word		u[8];		/* short_term_aly_filter.c	*/
-	word		LARpp[2][8]; 	/*                              */
-	word		j;		/*                              */
+	word	        ltp_cut;        /* long_term.c, LTP crosscorr.  */
+	word			nrp; 			/* 40 */	/* long_term.c, synthesis	*/
+	word			v[9];			/* short_term.c, synthesis	*/
+	word			msr;			/* decoder.c,	Postprocessing	*/
 
-	word        ltp_cut;        /* long_term.c, LTP crosscorr.  */
-	word		nrp; /* 40 */	/* long_term.c, synthesis	*/
-	word		v[9];		/* short_term.c, synthesis	*/
-	word		msr;		/* decoder.c,	Postprocessing	*/
+	char			verbose;		/* only used if !NDEBUG		*/
+	char			fast;			/* only used if FAST		*/
 
-	char		verbose;	/* only used if !NDEBUG		*/
-	char		fast;		/* only used if FAST		*/
-
-	char		wav_fmt;	/* only used if WAV49 defined	*/
+	char			wav_fmt;		/* only used if WAV49 defined	*/
 	unsigned char	frame_index;	/*            odd/even chaining	*/
 	unsigned char	frame_chain;	/*   half-byte to carry forward	*/
-};
 
+	/* Moved here from code.c where it was defined as static */
+	word e[50];
+} ;
 
+typedef struct gsm_state GSM_STATE ;
+
 #define	MIN_WORD	(-32767 - 1)
 #define	MAX_WORD	  32767
 
@@ -64,32 +66,30 @@
 #define	SASR(x, by)	((x) >= 0 ? (x) >> (by) : (~(-((x) + 1) >> (by))))
 #endif	/* SASR */
 
-#include "proto.h"
-
 /*
  *	Prototypes from add.c
  */
-extern word	gsm_mult 		(word a, word b);
-extern longword gsm_L_mult 	(word a, word b);
-extern word	gsm_mult_r		(word a, word b);
+word	gsm_mult 		(word a, word b);
+longword gsm_L_mult 	(word a, word b);
+word	gsm_mult_r		(word a, word b);
 
-extern word	gsm_div  		(word num, word denum);
+word	gsm_div  		(word num, word denum);
 
-extern word	gsm_add 		(word a, word b );
-extern longword gsm_L_add 	(longword a, longword b );
+word	gsm_add 		(word a, word b );
+longword gsm_L_add 	(longword a, longword b );
 
-extern word	gsm_sub 		(word a, word b);
-extern longword gsm_L_sub 	(longword a, longword b);
+word	gsm_sub 		(word a, word b);
+longword gsm_L_sub 	(longword a, longword b);
 
-extern word	gsm_abs 		(word a);
+word	gsm_abs 		(word a);
 
-extern word	gsm_norm 		(longword a );
+word	gsm_norm 		(longword a );
 
-extern longword gsm_L_asl  	(longword a, int n);
-extern word	gsm_asl 		(word a, int n);
+longword gsm_L_asl  	(longword a, int n);
+word	gsm_asl 		(word a, int n);
 
-extern longword gsm_L_asr  	(longword a, int n);
-extern word	gsm_asr  		(word a, int n);
+longword gsm_L_asr  	(longword a, int n);
+word	gsm_asr  		(word a, int n);
 
 /*
  *  Inlined functions from add.h 
@@ -150,7 +150,7 @@
 /*
  *  More prototypes from implementations..
  */
-extern void Gsm_Coder P((
+void Gsm_Coder (
 		struct gsm_state	* S,
 		word	* s,	/* [0..159] samples		IN	*/
 		word	* LARc,	/* [0..7] LAR coefficients	OUT	*/
@@ -158,9 +158,9 @@
 		word	* bc,	/* [0..3] coded LTP gain	OUT 	*/
 		word	* Mc,	/* [0..3] RPE grid selection	OUT     */
 		word	* xmaxc,/* [0..3] Coded maximum amplitude OUT	*/
-		word	* xMc	/* [13*4] normalized RPE samples OUT	*/));
+		word	* xMc	/* [13*4] normalized RPE samples OUT	*/);
 
-extern void Gsm_Long_Term_Predictor P((		/* 4x for 160 samples */
+void Gsm_Long_Term_Predictor (		/* 4x for 160 samples */
 		struct gsm_state * S,
 		word	* d,	/* [0..39]   residual signal	IN	*/
 		word	* dp,	/* [-120..-1] d'		IN	*/
@@ -167,31 +167,31 @@
 		word	* e,	/* [0..40] 			OUT	*/
 		word	* dpp,	/* [0..40] 			OUT	*/
 		word	* Nc,	/* correlation lag		OUT	*/
-		word	* bc	/* gain factor			OUT	*/));
+		word	* bc	/* gain factor			OUT	*/);
 
-extern void Gsm_LPC_Analysis P((
+void Gsm_LPC_Analysis (
 		struct gsm_state * S,
 		word * s,	 /* 0..159 signals	IN/OUT	*/
-	        word * LARc));   /* 0..7   LARc's	OUT	*/
+	        word * LARc);   /* 0..7   LARc's	OUT	*/
 
-extern void Gsm_Preprocess P((
+void Gsm_Preprocess (
 		struct gsm_state * S,
-		word * s, word * so));
+		word * s, word * so);
 
-extern void Gsm_Encoding P((
+void Gsm_Encoding (
 		struct gsm_state * S,
 		word	* e,	
 		word	* ep,	
 		word	* xmaxc,
 		word	* Mc,	
-		word	* xMc));
+		word	* xMc);
 
-extern void Gsm_Short_Term_Analysis_Filter P((
+void Gsm_Short_Term_Analysis_Filter (
 		struct gsm_state * S,
 		word	* LARc,	/* coded log area ratio [0..7]  IN	*/
-		word	* d	/* st res. signal [0..159]	IN/OUT	*/));
+		word	* d	/* st res. signal [0..159]	IN/OUT	*/);
 
-extern void Gsm_Decoder P((
+void Gsm_Decoder (
 		struct gsm_state * S,
 		word	* LARcr,	/* [0..7]		IN	*/
 		word	* Ncr,		/* [0..3] 		IN 	*/
@@ -199,46 +199,46 @@
 		word	* Mcr,		/* [0..3] 		IN 	*/
 		word	* xmaxcr,	/* [0..3]		IN 	*/
 		word	* xMcr,		/* [0..13*4]		IN	*/
-		word	* s));		/* [0..159]		OUT 	*/
+		word	* s);		/* [0..159]		OUT 	*/
 
-extern void Gsm_Decoding P((
+void Gsm_Decoding (
 		struct gsm_state * S,
 		word 	xmaxcr,
 		word	Mcr,
 		word	* xMcr,  	/* [0..12]		IN	*/
-		word	* erp)); 	/* [0..39]		OUT 	*/
+		word	* erp); 	/* [0..39]		OUT 	*/
 
-extern void Gsm_Long_Term_Synthesis_Filtering P((
+void Gsm_Long_Term_Synthesis_Filtering (
 		struct gsm_state* S,
 		word	Ncr,
 		word	bcr,
 		word	* erp,		/* [0..39]		  IN 	*/
-		word	* drp)); 	/* [-120..-1] IN, [0..40] OUT 	*/
+		word	* drp); 	/* [-120..-1] IN, [0..40] OUT 	*/
 
-void Gsm_RPE_Decoding P((
-	struct gsm_state *S,
+void Gsm_RPE_Decoding (
+	/*-struct gsm_state *S,-*/
 		word xmaxcr,
 		word Mcr,
 		word * xMcr,  /* [0..12], 3 bits             IN      */
-		word * erp)); /* [0..39]                     OUT     */
+		word * erp); /* [0..39]                     OUT     */
 
-void Gsm_RPE_Encoding P((
-		struct gsm_state * S,
+void Gsm_RPE_Encoding (
+		/*-struct gsm_state * S,-*/
 		word    * e,            /* -5..-1][0..39][40..44     IN/OUT  */
 		word    * xmaxc,        /*                              OUT */
 		word    * Mc,           /*                              OUT */
-		word    * xMc));        /* [0..12]                      OUT */
+		word    * xMc);        /* [0..12]                      OUT */
 
-extern void Gsm_Short_Term_Synthesis_Filter P((
+void Gsm_Short_Term_Synthesis_Filter (
 		struct gsm_state * S,
 		word	* LARcr, 	/* log area ratios [0..7]  IN	*/
 		word	* drp,		/* received d [0...39]	   IN	*/
-		word	* s));		/* signal   s [0..159]	  OUT	*/
+		word	* s);		/* signal   s [0..159]	  OUT	*/
 
-extern void Gsm_Update_of_reconstructed_short_time_residual_signal P((
+void Gsm_Update_of_reconstructed_short_time_residual_signal (
 		word	* dpp,		/* [0...39]	IN	*/
 		word	* ep,		/* [0...39]	IN	*/
-		word	* dp));		/* [-120...-1]  IN/OUT 	*/
+		word	* dp);		/* [-120...-1]  IN/OUT 	*/
 
 /*
  *  Tables from table.c
@@ -266,13 +266,11 @@
 
 #else	/* !NDEBUG => DEBUG */
 
-	extern void  gsm_debug_words     P((char * name, int, int, word *));
-	extern void  gsm_debug_longwords P((char * name, int, int, longword *));
-	extern void  gsm_debug_longword  P((char * name, longword));
-	extern void  gsm_debug_word      P((char * name, word));
+	void  gsm_debug_words     (char * name, int, int, word *);
+	void  gsm_debug_longwords (char * name, int, int, longword *);
+	void  gsm_debug_longword  (char * name, longword);
+	void  gsm_debug_word      (char * name, word);
 
 #endif /* !NDEBUG */
-
-#include "unproto.h"
 
 #endif	/* PRIVATE_H */
--- a/common/libsndfile/src/GSM610/proto.h
+++ /dev/null
@@ -1,65 +1,0 @@
-/*
- * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
- * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
- * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
- */
-
-/*$Header: /home/cvs/f/fa/faac/faad2/common/libsndfile/src/GSM610/Attic/proto.h,v 1.1 2002/01/14 19:15:55 menno Exp $*/
-
-#ifndef	PROTO_H
-#define	PROTO_H
-
-/*#if __cplusplus*/
-#	define	NeedFunctionPrototypes	1
-/*#endif*/
-
-#if __STDC__
-#	define	NeedFunctionPrototypes	1
-#endif
-
-#ifdef	_NO_PROTO
-#	undef	NeedFunctionPrototypes
-#endif
-
-#undef	P	/* gnu stdio.h actually defines this... 	*/
-#undef	P0
-#undef	P1
-#undef	P2
-#undef	P3
-#undef	P4
-#undef	P5
-#undef	P6
-#undef	P7
-#undef	P8
-
-#if NeedFunctionPrototypes
-
-#	define	P( protos )	protos
-
-#	define	P0()				(void)
-#	define	P1(x, a)			(a)
-#	define	P2(x, a, b)			(a, b)
-#	define	P3(x, a, b, c)			(a, b, c)
-#	define	P4(x, a, b, c, d)		(a, b, c, d)	
-#	define	P5(x, a, b, c, d, e)		(a, b, c, d, e)
-#	define	P6(x, a, b, c, d, e, f)		(a, b, c, d, e, f)
-#	define	P7(x, a, b, c, d, e, f, g)	(a, b, c, d, e, f, g)
-#	define	P8(x, a, b, c, d, e, f, g, h)	(a, b, c, d, e, f, g, h)
-
-#else /* !NeedFunctionPrototypes */
-
-#	define	P( protos )	( /* protos */ )
-
-#	define	P0()				()
-#	define	P1(x, a)			x a;
-#	define	P2(x, a, b)			x a; b;
-#	define	P3(x, a, b, c)			x a; b; c;
-#	define	P4(x, a, b, c, d)		x a; b; c; d;
-#	define	P5(x, a, b, c, d, e)		x a; b; c; d; e;
-#	define	P6(x, a, b, c, d, e, f)		x a; b; c; d; e; f;
-#	define	P7(x, a, b, c, d, e, f, g)	x a; b; c; d; e; f; g;
-#	define	P8(x, a, b, c, d, e, f, g, h)	x a; b; c; d; e; f; g; h;
-
-#endif  /* !NeedFunctionPrototypes */
-
-#endif	/* PROTO_H */
--- a/common/libsndfile/src/GSM610/rpe.c
+++ b/common/libsndfile/src/GSM610/rpe.c
@@ -4,7 +4,7 @@
  * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
  */
 
-/* $Header: /home/cvs/f/fa/faac/faad2/common/libsndfile/src/GSM610/Attic/rpe.c,v 1.1 2002/01/14 19:15:55 menno Exp $ */
+/* $Header: /home/cvs/f/fa/faac/faad2/common/libsndfile/src/GSM610/Attic/rpe.c,v 1.2 2002/07/25 12:22:13 menno Exp $ */
 
 #include <stdio.h>
 #include <assert.h>
@@ -12,7 +12,6 @@
 #include "private.h"
 
 #include "gsm.h"
-#include "proto.h"
 
 /*  4.2.13 .. 4.2.17  RPE ENCODING SECTION
  */
@@ -19,7 +18,7 @@
 
 /* 4.2.13 */
 
-static void Weighting_filter P2((e, x),
+static void Weighting_filter (
 	register word	* e,		/* signal [-5..0.39.44]	IN  */
 	word		* x		/* signal [0..39]	OUT */
 )
@@ -113,7 +112,7 @@
 
 /* 4.2.14 */
 
-static void RPE_grid_selection P3((x,xM,Mc_out),
+static void RPE_grid_selection (
 	word		* x,		/* [0..39]		IN  */ 
 	word		* xM,		/* [0..12]		OUT */
 	word		* Mc_out	/*			OUT */
@@ -220,7 +219,7 @@
 
 /* 4.12.15 */
 
-static void APCM_quantization_xmaxc_to_exp_mant P3((xmaxc,exp_out,mant_out),
+static void APCM_quantization_xmaxc_to_exp_mant (
 	word		xmaxc,		/* IN 	*/
 	word		* exp_out,	/* OUT	*/
 	word		* mant_out )	/* OUT  */
@@ -253,9 +252,8 @@
 	*mant_out = mant;
 }
 
-static void APCM_quantization P5((xM,xMc,mant_out,exp_out,xmaxc_out),
+static void APCM_quantization (
 	word		* xM,		/* [0..12]		IN	*/
-
 	word		* xMc,		/* [0..12]		OUT	*/
 	word		* mant_out,	/* 			OUT	*/
 	word		* exp_out,	/*			OUT	*/
@@ -346,7 +344,7 @@
 
 /* 4.2.16 */
 
-static void APCM_inverse_quantization P4((xMc,mant,exp,xMp),
+static void APCM_inverse_quantization (
 	register word	* xMc,	/* [0..12]			IN 	*/
 	word		mant,
 	word		exp,
@@ -384,7 +382,7 @@
 
 /* 4.2.17 */
 
-static void RPE_grid_positioning P3((Mc,xMp,ep),
+static void RPE_grid_positioning (
 	word		Mc,		/* grid position	IN	*/
 	register word	* xMp,		/* [0..12]		IN	*/
 	register word	* ep		/* [0..39]		OUT	*/
@@ -431,7 +429,7 @@
  */
 
 #if 0	/* Has been inlined in code.c */
-void Gsm_Update_of_reconstructed_short_time_residual_signal P3((dpp, ep, dp),
+void Gsm_Update_of_reconstructed_short_time_residual_signal (
 	word	* dpp,		/* [0...39]	IN	*/
 	word	* ep,		/* [0...39]	IN	*/
 	word	* dp)		/* [-120...-1]  IN/OUT 	*/
@@ -446,10 +444,9 @@
 }
 #endif	/* Has been inlined in code.c */
 
-void Gsm_RPE_Encoding P5((S,e,xmaxc,Mc,xMc),
+void Gsm_RPE_Encoding (
+	/*-struct gsm_state * S,-*/
 
-	struct gsm_state * S,
-
 	word	* e,		/* -5..-1][0..39][40..44	IN/OUT  */
 	word	* xmaxc,	/* 				OUT */
 	word	* Mc,		/* 			  	OUT */
@@ -469,8 +466,8 @@
 
 }
 
-void Gsm_RPE_Decoding P5((S, xmaxcr, Mcr, xMcr, erp),
-	struct gsm_state	* S,
+void Gsm_RPE_Decoding (
+	/*-struct gsm_state	* S,-*/
 
 	word 		xmaxcr,
 	word		Mcr,
--- a/common/libsndfile/src/GSM610/short_term.c
+++ b/common/libsndfile/src/GSM610/short_term.c
@@ -4,7 +4,7 @@
  * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
  */
 
-/* $Header: /home/cvs/f/fa/faac/faad2/common/libsndfile/src/GSM610/Attic/short_term.c,v 1.1 2002/01/14 19:15:55 menno Exp $ */
+/* $Header: /home/cvs/f/fa/faac/faad2/common/libsndfile/src/GSM610/Attic/short_term.c,v 1.2 2002/07/25 12:22:13 menno Exp $ */
 
 #include <stdio.h>
 #include <assert.h>
@@ -12,7 +12,6 @@
 #include "private.h"
 
 #include "gsm.h"
-#include "proto.h"
 
 /*
  *  SHORT TERM ANALYSIS FILTERING SECTION
@@ -20,7 +19,7 @@
 
 /* 4.2.8 */
 
-static void Decoding_of_the_coded_Log_Area_Ratios P2((LARc,LARpp),
+static void Decoding_of_the_coded_Log_Area_Ratios (
 	word 	* LARc,		/* coded log area ratio	[0..7] 	IN	*/
 	word	* LARpp)	/* out: decoded ..			*/
 {
@@ -88,7 +87,7 @@
  * (Initial value: LARpp(j-1)[1..8] = 0.)
  */
 
-static void Coefficients_0_12 P3((LARpp_j_1, LARpp_j, LARp),
+static void Coefficients_0_12 (
 	register word * LARpp_j_1,
 	register word * LARpp_j,
 	register word * LARp)
@@ -102,7 +101,7 @@
 	}
 }
 
-static void Coefficients_13_26 P3((LARpp_j_1, LARpp_j, LARp),
+static void Coefficients_13_26 (
 	register word * LARpp_j_1,
 	register word * LARpp_j,
 	register word * LARp)
@@ -114,7 +113,7 @@
 	}
 }
 
-static void Coefficients_27_39 P3((LARpp_j_1, LARpp_j, LARp),
+static void Coefficients_27_39 (
 	register word * LARpp_j_1,
 	register word * LARpp_j,
 	register word * LARp)
@@ -129,7 +128,7 @@
 }
 
 
-static void Coefficients_40_159 P2((LARpp_j, LARp),
+static void Coefficients_40_159 (
 	register word * LARpp_j,
 	register word * LARp)
 {
@@ -141,7 +140,7 @@
 
 /* 4.2.9.2 */
 
-static void LARp_to_rp P1((LARp),
+static void LARp_to_rp (
 	register word * LARp)	/* [0..7] IN/OUT  */
 /*
  *  The input of this procedure is the interpolated LARp[0..7] array.
@@ -180,7 +179,7 @@
 
 
 /* 4.2.10 */
-static void Short_term_analysis_filtering P4((S,rp,k_n,s),
+static void Short_term_analysis_filtering (
 	struct gsm_state * S,
 	register word	* rp,	/* [0..7]	IN	*/
 	register int 	k_n, 	/*   k_end - k_start	*/
@@ -225,7 +224,7 @@
 
 #if defined(USE_FLOAT_MUL) && defined(FAST)
 
-static void Fast_Short_term_analysis_filtering P4((S,rp,k_n,s),
+static void Fast_Short_term_analysis_filtering (
 	struct gsm_state * S,
 	register word	* rp,	/* [0..7]	IN	*/
 	register int 	k_n, 	/*   k_end - k_start	*/
@@ -262,7 +261,7 @@
 }
 #endif /* ! (defined (USE_FLOAT_MUL) && defined (FAST)) */
 
-static void Short_term_synthesis_filtering P5((S,rrp,k,wt,sr),
+static void Short_term_synthesis_filtering (
 	struct gsm_state * S,
 	register word	* rrp,	/* [0..7]	IN	*/
 	register int	k,	/* k_end - k_start	*/
@@ -306,7 +305,7 @@
 
 #if defined(FAST) && defined(USE_FLOAT_MUL)
 
-static void Fast_Short_term_synthesis_filtering P5((S,rrp,k,wt,sr),
+static void Fast_Short_term_synthesis_filtering (
 	struct gsm_state * S,
 	register word	* rrp,	/* [0..7]	IN	*/
 	register int	k,	/* k_end - k_start	*/
@@ -343,7 +342,7 @@
 
 #endif /* defined(FAST) && defined(USE_FLOAT_MUL) */
 
-void Gsm_Short_Term_Analysis_Filter P3((S,LARc,s),
+void Gsm_Short_Term_Analysis_Filter (
 
 	struct gsm_state * S,
 
@@ -385,7 +384,7 @@
 	FILTER( S, LARp, 120, s + 40);
 }
 
-void Gsm_Short_Term_Synthesis_Filter P4((S, LARcr, wt, s),
+void Gsm_Short_Term_Synthesis_Filter (
 	struct gsm_state * S,
 
 	word	* LARcr,	/* received log area ratios [0..7] IN  */
--- a/common/libsndfile/src/GSM610/table.c
+++ b/common/libsndfile/src/GSM610/table.c
@@ -4,7 +4,7 @@
  * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
  */
 
-/* $Header: /home/cvs/f/fa/faac/faad2/common/libsndfile/src/GSM610/Attic/table.c,v 1.1 2002/01/14 19:15:55 menno Exp $ */
+/* $Header: /home/cvs/f/fa/faac/faad2/common/libsndfile/src/GSM610/Attic/table.c,v 1.2 2002/07/25 12:22:13 menno Exp $ */
 
 /*  Most of these tables are inlined at their point of use.
  */
--- a/common/libsndfile/src/GSM610/unproto.h
+++ /dev/null
@@ -1,23 +1,0 @@
-/*
- * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
- * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
- * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
- */
-
-/*$Header: /home/cvs/f/fa/faac/faad2/common/libsndfile/src/GSM610/Attic/unproto.h,v 1.1 2002/01/14 19:15:55 menno Exp $*/
-
-#ifdef	PROTO_H		/* sic */
-#undef	PROTO_H
-
-#undef	P
-#undef	P0
-#undef	P1
-#undef	P2
-#undef	P3
-#undef	P4
-#undef	P5
-#undef	P6
-#undef	P7
-#undef	P8
-
-#endif	/* PROTO_H */
--- a/common/libsndfile/src/Makefile.am
+++ b/common/libsndfile/src/Makefile.am
@@ -1,20 +1,20 @@
 # This file was automatically generated
 # DO NOT EDIT!
-#
-DIST_SUBDIRS = GSM610 G72x
+
 SUBDIRS = GSM610 G72x
 
 lib_LTLIBRARIES = libsndfile.la
 include_HEADERS = sndfile.h
-INCLUDES = -I$(srcdir)/../src -I$(srcdir)
 
-noinst_HEADERS = common.h sfendian.h floatcast.h wav.h au.h
+noinst_HEADERS = common.h sfendian.h float_cast.h wav_w64.h au.h sf_command.h
 
-COMMON = common.c pcm.c ulaw.c alaw.c float32.c sndfile.c  
-FILESPECIFIC = aiff.c au.c au_g72x.c nist.c paf.c raw.c samplitude.c \
-				svx.c wav.c wav_gsm610.c wav_ima_adpcm.c \
-				wav_ms_adpcm.c voc.c ircam.c
+COMMON = sndfile.c common.c file_io.c command.c pcm.c ulaw.c alaw.c float32.c \
+			double64.c ima_adpcm.c ms_adpcm.c gsm610.c dwvw.c 
 
+FILESPECIFIC = aiff.c au.c au_g72x.c nist.c paf.c raw.c samplitude.c svx.c \
+				wav.c wav_w64.c voc.c ircam.c w64.c \
+				sd2.c rx2.c txw.c
+				
 libsndfile_la_SOURCES = $(COMMON) $(FILESPECIFIC) sndfile.h
 libsndfile_la_LDFLAGS = -version-info @SHARED_VERSION_INFO@
 libsndfile_la_LIBADD  = GSM610/libgsm.la G72x/libg72x.la
--- a/common/libsndfile/src/Makefile.in
+++ b/common/libsndfile/src/Makefile.in
@@ -12,7 +12,6 @@
 
 # This file was automatically generated
 # DO NOT EDIT!
-#
 
 
 SHELL = @SHELL@
@@ -69,29 +68,38 @@
 AS = @AS@
 CC = @CC@
 DLLTOOL = @DLLTOOL@
+ECHO = @ECHO@
+EXEEXT = @EXEEXT@
+GETCONF = @GETCONF@
 LIBTOOL = @LIBTOOL@
 LN_S = @LN_S@
 MAKEINFO = @MAKEINFO@
 OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OS_SPECIFIC_INCLUDES = @OS_SPECIFIC_INCLUDES@
+OS_SPECIFIC_LINKS = @OS_SPECIFIC_LINKS@
 PACKAGE = @PACKAGE@
 RANLIB = @RANLIB@
 SHARED_VERSION_INFO = @SHARED_VERSION_INFO@
+STRIP = @STRIP@
 VERSION = @VERSION@
+ac_cv_sys_largefile_CFLAGS = @ac_cv_sys_largefile_CFLAGS@
+autogen = @autogen@
 subdirs = @subdirs@
 
-DIST_SUBDIRS = GSM610 G72x
 SUBDIRS = GSM610 G72x
 
 lib_LTLIBRARIES = libsndfile.la
 include_HEADERS = sndfile.h
-INCLUDES = -I$(srcdir)/../src -I$(srcdir)
 
-noinst_HEADERS = common.h sfendian.h floatcast.h wav.h au.h
+noinst_HEADERS = common.h sfendian.h float_cast.h wav_w64.h au.h sf_command.h
 
-COMMON = common.c pcm.c ulaw.c alaw.c float32.c sndfile.c  
-FILESPECIFIC = aiff.c au.c au_g72x.c nist.c paf.c raw.c samplitude.c 				svx.c wav.c wav_gsm610.c wav_ima_adpcm.c 				wav_ms_adpcm.c voc.c ircam.c
+COMMON = sndfile.c common.c file_io.c command.c pcm.c ulaw.c alaw.c float32.c 			double64.c ima_adpcm.c ms_adpcm.c gsm610.c dwvw.c 
 
 
+FILESPECIFIC = aiff.c au.c au_g72x.c nist.c paf.c raw.c samplitude.c svx.c 				wav.c wav_w64.c voc.c ircam.c w64.c 				sd2.c rx2.c txw.c
+
+
 libsndfile_la_SOURCES = $(COMMON) $(FILESPECIFIC) sndfile.h
 libsndfile_la_LDFLAGS = -version-info @SHARED_VERSION_INFO@
 libsndfile_la_LIBADD = GSM610/libgsm.la G72x/libg72x.la
@@ -109,10 +117,11 @@
 LDFLAGS = @LDFLAGS@
 LIBS = @LIBS@
 libsndfile_la_DEPENDENCIES =  GSM610/libgsm.la G72x/libg72x.la
-libsndfile_la_OBJECTS =  common.lo pcm.lo ulaw.lo alaw.lo float32.lo \
-sndfile.lo aiff.lo au.lo au_g72x.lo nist.lo paf.lo raw.lo samplitude.lo \
-svx.lo wav.lo wav_gsm610.lo wav_ima_adpcm.lo wav_ms_adpcm.lo voc.lo \
-ircam.lo
+libsndfile_la_OBJECTS =  sndfile.lo common.lo file_io.lo command.lo \
+pcm.lo ulaw.lo alaw.lo float32.lo double64.lo ima_adpcm.lo ms_adpcm.lo \
+gsm610.lo dwvw.lo aiff.lo au.lo au_g72x.lo nist.lo paf.lo raw.lo \
+samplitude.lo svx.lo wav.lo wav_w64.lo voc.lo ircam.lo w64.lo sd2.lo \
+rx2.lo txw.lo
 CFLAGS = @CFLAGS@
 COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
 LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
@@ -132,9 +141,9 @@
 
 all: all-redirect
 .SUFFIXES:
-.SUFFIXES: .S .c .lo .o .s
+.SUFFIXES: .S .c .lo .o .obj .s
 $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
-	cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps src/Makefile
+	cd $(top_srcdir) && $(AUTOMAKE) --foreign --include-deps src/Makefile
 
 Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
 	cd $(top_builddir) \
@@ -197,6 +206,11 @@
 .c.o:
 	$(COMPILE) -c $<
 
+# FIXME: We should only use cygpath when building on Windows,
+# and only if it is available.
+.c.obj:
+	$(COMPILE) -c `cygpath -w $<`
+
 .s.o:
 	$(COMPILE) -c $<
 
@@ -205,6 +219,7 @@
 
 mostlyclean-compile:
 	-rm -f *.o core *.core
+	-rm -f *.$(OBJEXT)
 
 clean-compile:
 
@@ -354,7 +369,7 @@
 	    || cp -p $$d/$$file $(distdir)/$$file || :; \
 	  fi; \
 	done
-	for subdir in $(DIST_SUBDIRS); do \
+	for subdir in $(SUBDIRS); do \
 	  if test "$$subdir" = .; then :; else \
 	    test -d $(distdir)/$$subdir \
 	    || mkdir $(distdir)/$$subdir \
@@ -364,32 +379,6 @@
 	      || exit 1; \
 	  fi; \
 	done
-aiff.lo aiff.o : aiff.c sndfile.h config.h sfendian.h common.h
-alaw.lo alaw.o : alaw.c sndfile.h floatcast.h common.h
-au.lo au.o : au.c sndfile.h config.h sfendian.h common.h au.h
-au_g72x.lo au_g72x.o : au_g72x.c config.h sndfile.h sfendian.h \
-	floatcast.h common.h au.h G72x/g72x.h
-common.lo common.o : common.c sndfile.h sfendian.h config.h common.h
-float32.lo float32.o : float32.c sndfile.h config.h sfendian.h common.h
-ircam.lo ircam.o : ircam.c sndfile.h config.h sfendian.h common.h
-nist.lo nist.o : nist.c sndfile.h config.h sfendian.h common.h
-paf.lo paf.o : paf.c config.h sndfile.h sfendian.h floatcast.h common.h
-pcm.lo pcm.o : pcm.c config.h sndfile.h sfendian.h floatcast.h common.h
-raw.lo raw.o : raw.c sndfile.h config.h sfendian.h common.h
-samplitude.lo samplitude.o : samplitude.c sndfile.h config.h sfendian.h \
-	common.h
-sndfile.lo sndfile.o : sndfile.c sndfile.h config.h sfendian.h common.h
-svx.lo svx.o : svx.c sndfile.h config.h sfendian.h common.h
-ulaw.lo ulaw.o : ulaw.c sndfile.h floatcast.h common.h
-voc.lo voc.o : voc.c sndfile.h config.h sfendian.h common.h
-wav.lo wav.o : wav.c sndfile.h config.h sfendian.h common.h wav.h
-wav_gsm610.lo wav_gsm610.o : wav_gsm610.c sndfile.h config.h sfendian.h \
-	floatcast.h common.h wav.h GSM610/gsm.h
-wav_ima_adpcm.lo wav_ima_adpcm.o : wav_ima_adpcm.c sndfile.h config.h \
-	sfendian.h floatcast.h common.h wav.h
-wav_ms_adpcm.lo wav_ms_adpcm.o : wav_ms_adpcm.c sndfile.h config.h \
-	sfendian.h floatcast.h common.h wav.h
-
 info-am:
 info: info-recursive
 dvi-am:
--- a/common/libsndfile/src/aiff.c
+++ b/common/libsndfile/src/aiff.c
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 1999-2001 Erik de Castro Lopo <[email protected]>
+** Copyright (C) 1999-2002 Erik de Castro Lopo <[email protected]>
 **  
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -16,12 +16,11 @@
 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 */
 
-
 #include	<stdio.h>
 #include	<unistd.h>
 #include	<string.h>
-#include	<ctype.h>
 #include	<time.h>
+#include	<ctype.h>
 
 #include	"sndfile.h"
 #include	"config.h"
@@ -28,7 +27,6 @@
 #include	"sfendian.h"
 #include	"common.h"
 
-
 /*------------------------------------------------------------------------------
  * Macros to handle big/little endian issues.
  */
@@ -65,17 +63,27 @@
 #define NONE_MARKER	(MAKE_MARKER ('N', 'O', 'N', 'E')) 
 #define sowt_MARKER	(MAKE_MARKER ('s', 'o', 'w', 't')) 
 #define twos_MARKER	(MAKE_MARKER ('t', 'w', 'o', 's')) 
+#define raw_MARKER	(MAKE_MARKER ('r', 'a', 'w', ' ')) 
+#define in32_MARKER	(MAKE_MARKER ('i', 'n', '3', '2')) 
+#define ni32_MARKER	(MAKE_MARKER ('2', '3', 'n', 'i')) 
+
 #define fl32_MARKER	(MAKE_MARKER ('f', 'l', '3', '2')) 
 #define FL32_MARKER	(MAKE_MARKER ('F', 'L', '3', '2')) 
-
-/* Unsupported AIFC encodings.*/
 #define fl64_MARKER	(MAKE_MARKER ('f', 'l', '6', '4')) 
 #define FL64_MARKER	(MAKE_MARKER ('F', 'L', '6', '4')) 
+
+#define ulaw_MARKER	(MAKE_MARKER ('u', 'l', 'a', 'w')) 
+#define ULAW_MARKER	(MAKE_MARKER ('U', 'L', 'A', 'W')) 
+#define alaw_MARKER	(MAKE_MARKER ('a', 'l', 'a', 'w')) 
+#define ALAW_MARKER	(MAKE_MARKER ('A', 'L', 'A', 'W')) 
+
+#define DWVW_MARKER	(MAKE_MARKER ('D', 'W', 'V', 'W')) 
+
+/* Unsupported AIFC encodings.*/
+#define ima4_MARKER	(MAKE_MARKER ('i', 'm', 'a', '4')) 
+
 #define MAC3_MARKER	(MAKE_MARKER ('M', 'A', 'C', '3')) 
 #define MAC6_MARKER	(MAKE_MARKER ('M', 'A', 'C', '6')) 
-#define ima4_MARKER	(MAKE_MARKER ('i', 'm', 'a', '4')) 
-#define ulaw_MARKER	(MAKE_MARKER ('a', 'l', 'a', 'w')) 
-#define alaw_MARKER	(MAKE_MARKER ('u', 'l', 'a', 'w')) 
 #define ADP4_MARKER	(MAKE_MARKER ('A', 'D', 'P', '4')) 
 
 /* Predfined chunk sizes. */
@@ -127,35 +135,139 @@
 
 static  int  	aiff_read_comm_chunk (SF_PRIVATE *psf, COMM_CHUNK *comm_fmt) ;
 
+static int		aiff_read_header (SF_PRIVATE *psf, COMM_CHUNK *comm_fmt) ;
+
 static int		aiff_write_header (SF_PRIVATE *psf) ;
 static int		aiff_write_tailer (SF_PRIVATE *psf) ;
 
 /*------------------------------------------------------------------------------
-** Public functions.
+** Public function.
 */
 
 int
-aiff_open_read	(SF_PRIVATE *psf)
-{	COMM_CHUNK	comm_fmt ;
-	SSND_CHUNK	ssnd_fmt ;
+aiff_open	(SF_PRIVATE *psf)
+{	COMM_CHUNK comm_fmt ;
+	int error ;
+
+	if (psf->mode == SFM_READ || (psf->mode == SFM_RDWR && psf->filelength > 0))
+	{	if ((error = aiff_read_header (psf, &comm_fmt)))
+			return error ;
+		
+		psf_fseek (psf->filedes, psf->dataoffset, SEEK_SET) ;
+		} ;
+
+	if (psf->mode == SFM_WRITE || psf->mode == SFM_RDWR)
+	{	if ((psf->sf.format & SF_FORMAT_TYPEMASK) != SF_FORMAT_AIFF)
+			return	SFE_BAD_OPEN_FORMAT ;
+	
+		if ((error = aiff_write_header (psf)))
+			return error ;
+
+		psf->write_header = aiff_write_header ;
+		} ;
+
+	psf->error = 0 ;
+	psf->close = aiff_close ;
+
+	psf->blockwidth  = psf->sf.channels * psf->bytewidth ;
+
+	switch (psf->sf.format & SF_FORMAT_SUBMASK)
+	{	case SF_FORMAT_PCM_U8 :
+				psf->chars = SF_CHARS_UNSIGNED ;
+				error = pcm_init (psf) ;
+				break ;
+		
+		case SF_FORMAT_PCM_S8 :
+				psf->chars = SF_CHARS_SIGNED ;
+				error = pcm_init (psf) ;
+				break ;
+
+		case SF_FORMAT_PCM_16 : 
+		case SF_FORMAT_PCM_24 : 
+		case SF_FORMAT_PCM_32 : 
+				error = pcm_init (psf) ;
+				break ;
+				
+		case SF_FORMAT_FLOAT :
+				error = float32_init (psf) ;
+				break ;
+
+		case SF_FORMAT_DOUBLE :
+				error = double64_init (psf) ;
+				break ;
+
+		case SF_FORMAT_ULAW :
+				error = ulaw_init (psf) ;
+				break ;
+
+		case SF_FORMAT_ALAW :
+				error = alaw_init (psf) ;
+				break ;
+
+		case SF_FORMAT_DWVW_12 :
+				error = dwvw_init (psf, 12) ;
+				break ;
+
+		case SF_FORMAT_DWVW_16 :
+				error = dwvw_init (psf, 16) ;
+				break ;
+
+		case SF_FORMAT_DWVW_24 :
+				error = dwvw_init (psf, 24) ;
+				break ;
+
+		case SF_FORMAT_DWVW_N :
+				if (psf->mode != SFM_READ)
+				{	error = SFE_DWVW_BAD_BITWIDTH ;
+					break ;
+					} ;
+				if (comm_fmt.sampleSize >= 8 && comm_fmt.sampleSize < 24)
+				{	error = dwvw_init (psf, comm_fmt.sampleSize) ;
+					psf->sf.samples = comm_fmt.numSampleFrames ;
+					break ;
+					} ;
+				psf_log_printf (psf, "AIFC : Bad bitwidth %d\n", comm_fmt.sampleSize) ;
+				error = SFE_DWVW_BAD_BITWIDTH ;
+				break ;
+
+		/*
+		case SF_FORMAT_IMA_ADPCM :
+				error = aiff_ima_writer_init (psf, 34) ;
+				break ;
+		*/
+		
+		default : return SFE_UNIMPLEMENTED ;
+		} ;
+
+	if (psf->mode == SFM_READ) 
+		psf->blockwidth = psf->sf.channels * psf->bytewidth ;
+
+	return error ;
+} /* aiff_open */
+
+/*==========================================================================================
+** Private functions.
+*/
+
+static int
+aiff_read_header	(SF_PRIVATE *psf, COMM_CHUNK *comm_fmt)
+{	SSND_CHUNK	ssnd_fmt ;
 	int			marker, dword ;
-	long		FORMsize, SSNDsize ;
+	int			FORMsize, SSNDsize ;
 	int			filetype, found_chunk = 0, done = 0, error = 0 ;
 	char		*cptr ;
 
-	psf->sf.seekable = SF_TRUE ;
-
 	/* Set position to start of file to begin reading header. */
 	psf_binheader_readf (psf, "p", 0) ;	
 
-	memset (&comm_fmt, 0, sizeof (comm_fmt)) ;
+	memset (comm_fmt, 0, sizeof (COMM_CHUNK)) ;
 
 	/* Until recently AIF* file were all BIG endian. */ 	
 	psf->endian = SF_ENDIAN_BIG ;
 
-	/* 	AIFF files can apparently have their chunks in any order. However, they must
-	**	a FORM chunk. Approach here is to read allthe chunks one by one and then 
-	**	check for the mandatory chunks at the end.
+	/* 	AIFF files can apparently have their chunks in any order. However, they 
+	**	must have a FORM chunk. Approach here is to read all the chunks one by 
+	**  one and then check for the mandatory chunks at the end.
 	*/
 	while (! done)
 	{	psf_binheader_readf (psf, "m", &marker) ;
@@ -164,11 +276,11 @@
 					if (found_chunk)
 						return SFE_AIFF_NO_FORM ;
 
-					psf_binheader_readf (psf, "L", &FORMsize) ;
+					psf_binheader_readf (psf, "E4", &FORMsize) ;
 
-					if (FORMsize != psf->filelength - 2 * sizeof (dword))
+					if (FORMsize != psf->filelength - 2 * SIGNED_SIZEOF (dword))
 					{	dword = psf->filelength - 2 * sizeof (dword);
-						psf_log_printf (psf, "FORM : %d (should be %d)\n", FORMsize, dword) ;
+						psf_log_printf (psf, "FORM : %u (should be %u)\n", FORMsize, dword) ;
 						FORMsize = dword ;
 						}
 					else
@@ -186,13 +298,12 @@
 					break ;
 
 			case COMM_MARKER :
-					error = aiff_read_comm_chunk (psf, &comm_fmt) ;
+					error = aiff_read_comm_chunk (psf, comm_fmt) ;
 
-					psf->sf.samplerate 		= tenbytefloat2int (comm_fmt.sampleRate) ;
-					psf->sf.samples 		= comm_fmt.numSampleFrames ;
-					psf->sf.channels 		= comm_fmt.numChannels ;
-					psf->sf.pcmbitwidth 	= comm_fmt.sampleSize ;
-					psf->sf.sections 		= 1 ;
+					psf->sf.samplerate 	= tenbytefloat2int (comm_fmt->sampleRate) ;
+					psf->sf.samples 	= comm_fmt->numSampleFrames ;
+					psf->sf.channels 	= comm_fmt->numChannels ;
+					psf->bytewidth 		= BITWIDTH2BYTES (comm_fmt->sampleSize) ;
 					
 					if (error)
 						return error ;
@@ -205,15 +316,15 @@
 					if ((found_chunk & (HAVE_FORM | HAVE_AIFF | HAVE_COMM)) != (HAVE_FORM | HAVE_AIFF | HAVE_COMM))
 						return SFE_AIFF_PEAK_B4_COMM ;
 
-					psf_binheader_readf (psf, "L", &dword) ;
+					psf_binheader_readf (psf, "E4", &dword) ;
 					
 					psf_log_printf (psf, "%D : %d\n", marker, dword) ;
-					if (dword > sizeof (psf->peak))
+					if (dword > SIGNED_SIZEOF (psf->peak))
 					{	psf_binheader_readf (psf, "j", dword) ;
 						psf_log_printf (psf, "*** File PEAK chunk bigger than sizeof (PEAK_CHUNK).\n") ;
 						return SFE_WAV_BAD_PEAK ;
 						} ;
-					if (dword != sizeof (psf->peak) - sizeof (psf->peak.peak) + psf->sf.channels * sizeof (PEAK_POS))
+					if (dword != SIGNED_SIZEOF (psf->peak) - SIGNED_SIZEOF (psf->peak.peak) + psf->sf.channels * SIGNED_SIZEOF (PEAK_POS))
 					{	psf_binheader_readf (psf, "j", dword) ;
 						psf_log_printf (psf, "*** File PEAK chunk size doesn't fit with number of channels.\n") ;
 						return SFE_WAV_BAD_PEAK ;
@@ -220,7 +331,7 @@
 						} ;
 					
 					/* read in rest of PEAK chunk. */	
-					psf_binheader_readf (psf, "LL", &(psf->peak.version), &(psf->peak.timestamp)) ;
+					psf_binheader_readf (psf, "E44", &(psf->peak.version), &(psf->peak.timestamp)) ;
 
 					if (psf->peak.version != 1)
 						psf_log_printf (psf, "  version    : %d *** (should be version 1)\n", psf->peak.version) ;
@@ -232,10 +343,10 @@
 
 					cptr = (char *) psf->buffer ;
 					for (dword = 0 ; dword < psf->sf.channels ; dword++)
-					{	psf_binheader_readf (psf, "FL", &(psf->peak.peak[dword].value), 
+					{	psf_binheader_readf (psf, "Ef4", &(psf->peak.peak[dword].value), 
 														&(psf->peak.peak[dword].position)) ;
 					
-						snprintf (cptr, sizeof (psf->buffer), "    %2d   %-12d   %g\n", 
+						LSF_SNPRINTF (cptr, sizeof (psf->buffer), "    %2d   %-12d   %g\n", 
 								dword, psf->peak.peak[dword].position, psf->peak.peak[dword].value) ;
 						cptr [sizeof (psf->buffer) - 1] = 0 ;
 						psf_log_printf (psf, cptr) ;
@@ -245,11 +356,11 @@
 					break ;
 
 			case SSND_MARKER :
-					psf_binheader_readf (psf, "LLL", &SSNDsize, &(ssnd_fmt.offset), &(ssnd_fmt.blocksize)) ;
+					psf_binheader_readf (psf, "E444", &SSNDsize, &(ssnd_fmt.offset), &(ssnd_fmt.blocksize)) ;
 											
-					psf->dataoffset = ftell (psf->file) ;
+					psf->dataoffset = psf_ftell (psf->filedes) ;
 					psf->datalength = psf->filelength - psf->dataoffset ;
-					if (SSNDsize > psf->datalength + sizeof (SSND_CHUNK))
+					if (SSNDsize > psf->datalength + SIGNED_SIZEOF (SSND_CHUNK))
 						psf_log_printf (psf, " SSND : %d (should be %d)\n", SSNDsize, psf->datalength + sizeof (SSND_CHUNK)) ;
 					else
 						psf_log_printf (psf, " SSND : %d\n", SSNDsize) ;
@@ -263,7 +374,7 @@
 						break ;
 
 					/* 	Seek to end of SSND chunk. */
-					fseek (psf->file, SSNDsize - 8, SEEK_CUR) ;
+					psf_fseek (psf->filedes, SSNDsize - 8, SEEK_CUR) ;
 					break ;
 
 			case c_MARKER :
@@ -271,22 +382,22 @@
 			case AUTH_MARKER :
 			case COMT_MARKER :
 			case NAME_MARKER :
-					psf_binheader_readf (psf, "L", &dword);
+					psf_binheader_readf (psf, "E4", &dword);
 					dword += (dword & 1) ;
 					if (dword == 0)
 						break ;
-					if (dword > sizeof (psf->buffer))
-					{	psf_log_printf (psf, "  *** %D : %d (too big)\n", marker, dword) ;
+					if (dword > SIGNED_SIZEOF (psf->buffer))
+					{	psf_log_printf (psf, "  %D : %d (too big)\n", marker, dword) ;
 						return SFE_INTERNAL ;
 						} ;
-					psf_binheader_readf (psf, "B", psf->buffer, dword) ;
+					psf_binheader_readf (psf, "b", psf->buffer, dword) ;
 					psf->buffer [dword - 1] = 0 ;
-					psf_log_printf (psf, "***    %D : %s\n", marker, psf->buffer) ;
+					psf_log_printf (psf, "    %D : %s\n", marker, psf->buffer) ;
 					break ;
 
 			case FVER_MARKER :
 			case SFX_MARKER :
-					psf_binheader_readf (psf, "L", &dword) ;
+					psf_binheader_readf (psf, "E4", &dword) ;
 					psf_log_printf (psf, " %D : %d\n", marker, dword) ;
 
 					psf_binheader_readf (psf, "j", dword) ;
@@ -295,7 +406,7 @@
 			case APPL_MARKER :
 			case INST_MARKER :
 			case MARK_MARKER :
-					psf_binheader_readf (psf, "L", &dword) ;
+					psf_binheader_readf (psf, "E4", &dword) ;
 					psf_log_printf (psf, " %D : %d\n", marker, dword) ;
 
 					psf_binheader_readf (psf, "j", dword) ;
@@ -304,19 +415,19 @@
 			default : 
 					if (isprint ((marker >> 24) & 0xFF) && isprint ((marker >> 16) & 0xFF)
 						&& isprint ((marker >> 8) & 0xFF) && isprint (marker & 0xFF))
-					{	psf_binheader_readf (psf, "L", &dword) ;
+					{	psf_binheader_readf (psf, "E4", &dword) ;
 						psf_log_printf (psf, "%D : %d (unknown marker)\n", marker, dword) ;
 
 						psf_binheader_readf (psf, "j", dword) ;
 						break ;
 						} ;
-					if ((dword = ftell (psf->file)) & 0x03)
+					if ((dword = psf_ftell (psf->filedes)) & 0x03)
 					{	psf_log_printf (psf, "  Unknown chunk marker at position %d. Resyncing.\n", dword - 4) ;
 
 						psf_binheader_readf (psf, "j", -3) ;
 						break ;
 						} ;
-					psf_log_printf (psf, "*** Unknown chunk marker : %X. Exiting parser.\n", marker) ;
+					psf_log_printf (psf, "*** Unknown chunk marker : %X at position %d. Exiting parser.\n", marker, psf_ftell (psf->filedes)) ;
 					done = 1 ;
 					break ;
 			} ;	/* switch (marker) */
@@ -324,14 +435,17 @@
 		if ((! psf->sf.seekable) && (found_chunk & HAVE_SSND))
 			break ;
 
-		if (ferror (psf->file))
+		if (psf_ferror (psf->filedes))
 		{	psf_log_printf (psf, "*** Error on file handle. ***\n") ;
-			clearerr (psf->file) ;
+			psf_fclearerr (psf->filedes) ;
 			break ;
 			} ;
 
-		if (ftell (psf->file) >= (long) (psf->filelength - (2 * sizeof (dword))))
+		if (psf_ftell (psf->filedes) >= (sf_count_t) (psf->filelength - (2 * sizeof (dword))))
 			break ;
+
+		if (psf->logindex >= sizeof (psf->logbuffer) - 2)
+			return SFE_LOG_OVERRUN ;
 		} ; /* while (1) */
 		
 	if (! (found_chunk & HAVE_FORM))
@@ -346,92 +460,13 @@
 	if (! psf->dataoffset)
 		return SFE_AIFF_NO_DATA ;
 
-	psf->current     = 0 ;
-	psf->sf.seekable = SF_TRUE ;
-	psf->bytewidth   = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
+	return 0 ;
+} /* aiff_read_header */
 
-	psf->blockwidth  = psf->sf.channels * psf->bytewidth ;
-	
-	fseek (psf->file, psf->dataoffset, SEEK_SET) ;
-
-	psf->close = (func_close) aiff_close ;
-
-	switch (psf->sf.format & SF_FORMAT_SUBMASK)
-	{	case SF_FORMAT_PCM :
-		case SF_FORMAT_PCM_LE :
-		case SF_FORMAT_PCM_BE :
-				if (psf->bytewidth == 1)
-					psf->chars = SF_CHARS_SIGNED ;
-
-				error = pcm_read_init (psf) ;
-				break ;
-				
-		case SF_FORMAT_FLOAT :
-				error = float32_read_init (psf) ;
-				break ;
-
-		default : return SFE_UNIMPLEMENTED ;
-		} ;
-
-	return error ;
-} /* aiff_open_read */
-
-/*------------------------------------------------------------------------------
- */
-
-int
-aiff_open_write	(SF_PRIVATE *psf)
-{	int error ;
-
-	if ((psf->sf.format & SF_FORMAT_TYPEMASK) != SF_FORMAT_AIFF)
-		return	SFE_BAD_OPEN_FORMAT ;
-	
-	psf->sf.seekable = SF_TRUE ;
-	psf->error       = 0 ;
-
-	psf->bytewidth   = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
-	psf->blockwidth  = psf->bytewidth * psf->sf.channels ;
-
-	/* Set sample count artifically high and fix later. */ 
-	psf->sf.samples = 0x7FFFFFFF / psf->blockwidth ; 
-	
-	psf->datalength  = psf->blockwidth * psf->sf.samples ;
-	psf->filelength  = 0x7FFFFFFF ;
-
-	if ((error = aiff_write_header (psf)))
-		return error ;
-
-	psf->close        = (func_close)  aiff_close ;
-	psf->write_header = (func_wr_hdr) aiff_write_header ;
-
-	switch (psf->sf.format & SF_FORMAT_SUBMASK)
-	{	case SF_FORMAT_PCM :
-		case SF_FORMAT_PCM_LE :
-		case SF_FORMAT_PCM_BE :
-				if (psf->bytewidth == 1)
-					psf->chars = SF_CHARS_SIGNED ;
-
-				error = pcm_write_init (psf) ;
-				break ;
-				
-		case SF_FORMAT_FLOAT :
-				error = float32_write_init (psf) ;
-				break ;
-
-		default : return SFE_UNIMPLEMENTED ;
-		} ;
-
-	return error ;
-} /* aiff_open_write */
-
-/*==========================================================================================
-** Private functions.
-*/
-
 static int	
 aiff_close	(SF_PRIVATE  *psf)
 {
-	if (psf->mode == SF_MODE_WRITE)
+	if (psf->mode == SFM_WRITE || psf->mode == SFM_RDWR)
 	{	/*  Now we know for certain the length of the file we can re-write 
 		**	correct values for the FORM, COMM and SSND chunks.
 		*/
@@ -438,11 +473,12 @@
 		 
 		aiff_write_tailer (psf) ;
 
-		fseek (psf->file, 0, SEEK_END) ;		
-		psf->filelength = ftell (psf->file) ;
-		fseek (psf->file, 0, SEEK_SET) ;
+		psf_fseek (psf->filedes, 0, SEEK_END) ;		
+		psf->filelength = psf_ftell (psf->filedes) ;
+		psf_fseek (psf->filedes, 0, SEEK_SET) ;
 		
 		psf->datalength = psf->filelength - psf->dataoffset ;
+		
  		psf->sf.samples = psf->datalength / (psf->bytewidth * psf->sf.channels) ;
 		
 		aiff_write_header (psf) ;
@@ -457,10 +493,10 @@
 
 static int
 aiff_read_comm_chunk (SF_PRIVATE *psf, COMM_CHUNK *comm_fmt)
-{	int error = 0, bytesread ;
-
-	bytesread = psf_binheader_readf (psf, "L", &(comm_fmt->size)) ;
+{	int error = 0, bytesread, subformat ;
 	
+	bytesread = psf_binheader_readf (psf, "E4", &(comm_fmt->size)) ;
+	
 	/* The COMM chunk has an int aligned to an odd word boundary. Some 
 	** procesors are not able to deal with this (ie bus fault) so we have 
 	** to take special care.
@@ -467,16 +503,21 @@
 	*/
 
 	bytesread +=
-	psf_binheader_readf (psf, "WLWB", &(comm_fmt->numChannels), &(comm_fmt->numSampleFrames), 
+	psf_binheader_readf (psf, "E242b", &(comm_fmt->numChannels), &(comm_fmt->numSampleFrames), 
 			&(comm_fmt->sampleSize), &(comm_fmt->sampleRate), sizeof (comm_fmt->sampleRate)) ;
 
 	if (comm_fmt->size == AIFF_COMM_SIZE)
 		comm_fmt->encoding = NONE_MARKER ;
 	else if (comm_fmt->size >= AIFC_COMM_SIZE)
-	{	bytesread +=
-		psf_binheader_readf (psf, "mB", &(comm_fmt->encoding), &(comm_fmt->zero_bytes), 2) ;
+	{	unsigned char encoding_len ;
 
-		psf_binheader_readf (psf, "B", psf->header, comm_fmt->size - AIFC_COMM_SIZE) ;
+		bytesread += psf_binheader_readf (psf, "Em1", &(comm_fmt->encoding), &encoding_len) ;
+
+		memset (psf->buffer, 0, comm_fmt->size) ;
+
+		bytesread += psf_binheader_readf (psf, "b", psf->buffer, 
+							comm_fmt->size - AIFC_COMM_SIZE + 1) ;
+		psf->buffer [encoding_len] = 0 ;
 		} ;
 		
 	psf_log_printf (psf, " COMM : %d\n", comm_fmt->size) ;
@@ -490,37 +531,93 @@
 	{	psf_log_printf (psf, "  Sample Size : %d (should be 32)\n", comm_fmt->sampleSize) ;
 		comm_fmt->sampleSize = 32 ;
 		}
+	else if ((comm_fmt->encoding == fl64_MARKER || comm_fmt->encoding == FL64_MARKER) && comm_fmt->sampleSize != 64)
+	{	psf_log_printf (psf, "  Sample Size : %d (should be 64)\n", comm_fmt->sampleSize) ;
+		comm_fmt->sampleSize = 64 ;
+		}
 	else
 		psf_log_printf (psf, "  Sample Size : %d\n", comm_fmt->sampleSize) ;
 
+	subformat = s_bitwidth_to_subformat (comm_fmt->sampleSize) ;
+
+	psf->endian = SF_ENDIAN_BIG ;
+
 	switch (comm_fmt->encoding)
 	{	case NONE_MARKER :
-				psf->endian = SF_ENDIAN_BIG ;
-				psf->sf.format = (SF_FORMAT_AIFF | SF_FORMAT_PCM) ;
+				psf->sf.format = (SF_FORMAT_AIFF | subformat) ;
 				break ;
-				
+
 		case twos_MARKER :
-				psf->endian = SF_ENDIAN_BIG ;
-				psf->sf.format = (SF_FORMAT_AIFF | SF_FORMAT_PCM_BE) ;
+		case in32_MARKER :
+				psf->sf.format = (SF_ENDIAN_BIG | SF_FORMAT_AIFF | subformat) ;
 				break ;
 
 		case sowt_MARKER :
+		case ni32_MARKER :
 				psf->endian = SF_ENDIAN_LITTLE ;
-				psf->sf.format = (SF_FORMAT_AIFF | SF_FORMAT_PCM_LE) ;
+				psf->sf.format = (SF_ENDIAN_LITTLE | SF_FORMAT_AIFF | subformat) ;
 				break ;
 				
 		case fl32_MARKER :
 		case FL32_MARKER :
-				psf->endian = SF_ENDIAN_BIG ;
 				psf->sf.format = (SF_FORMAT_AIFF | SF_FORMAT_FLOAT) ;
 				break ;
 
+		case ulaw_MARKER :
+		case ULAW_MARKER :
+				psf->sf.format = (SF_FORMAT_AIFF | SF_FORMAT_ULAW) ;
+				break ;
+
+		case alaw_MARKER :
+		case ALAW_MARKER :
+				psf->sf.format = (SF_FORMAT_AIFF | SF_FORMAT_ALAW) ;
+				break ;
+
+		case fl64_MARKER :
+		case FL64_MARKER :
+				psf->sf.format = (SF_FORMAT_AIFF | SF_FORMAT_DOUBLE) ;
+				break ;
+
+		case raw_MARKER :
+				psf->sf.format = (SF_FORMAT_AIFF | SF_FORMAT_PCM_U8) ;
+				break ;
+
+		case DWVW_MARKER :
+				psf->sf.format = SF_FORMAT_AIFF ;
+				switch (comm_fmt->sampleSize)
+				{	case 12 :
+						psf->sf.format |= SF_FORMAT_DWVW_12 ;
+						break ;
+					case 16 :
+						psf->sf.format |= SF_FORMAT_DWVW_16 ;
+						break ;
+					case 24 :
+						psf->sf.format |= SF_FORMAT_DWVW_24 ;
+						break ;
+						
+					default :
+						psf->sf.format |= SF_FORMAT_DWVW_N ;
+						break ;
+					}  ;
+				break ;
+
+				
+		/*
+		case ima4_MARKER :
+				psf->endian = SF_ENDIAN_BIG ;
+				psf->sf.format = (SF_FORMAT_AIFF | SF_FORMAT_IMA_ADPCM) ;
+				break ;
+		*/
+
 		default :
 			psf_log_printf (psf, "AIFC : Unimplemented format : %D\n", comm_fmt->encoding) ;
 			error = SFE_UNIMPLEMENTED ;
 		} ;
 
-	psf_log_printf (psf, "  Encoding    : %D\n", comm_fmt->encoding) ;
+	if (! psf->buffer [0])
+		psf_log_printf (psf, "  Encoding    : %D\n", comm_fmt->encoding) ;
+	else
+		psf_log_printf (psf, "  Encoding    : %D => %s\n", comm_fmt->encoding, (char*) psf->buffer) ;
 	
 	return error ;
 } /* aiff_read_comm_chunk */
@@ -529,39 +626,120 @@
 aiff_write_header (SF_PRIVATE *psf)
 {	unsigned char 	comm_sample_rate [10], comm_zero_bytes [2] = { 0, 0 } ;
 	unsigned int 	comm_type, comm_size, comm_encoding ;
-	int				k ;
+	int				k, endian ;
+	short			bit_width ;
 	
+	endian = psf->sf.format & SF_FORMAT_ENDMASK ; 
+	if (CPU_IS_LITTLE_ENDIAN && endian == SF_ENDIAN_CPU)
+		endian = SF_ENDIAN_LITTLE ;
+	
+	/* Standard value here. */
+	bit_width = psf->bytewidth * 8 ;
+
 	switch (psf->sf.format & SF_FORMAT_SUBMASK)
-	{	case SF_FORMAT_PCM :					/* Standard big endian AIFF. */
-				psf->endian = SF_ENDIAN_BIG ;			
-				comm_type = AIFF_MARKER ;
-				comm_size = AIFF_COMM_SIZE ;
-				comm_encoding = 0 ;
+	{	case SF_FORMAT_PCM_S8 :
+		case SF_FORMAT_PCM_16 : 
+		case SF_FORMAT_PCM_24 : 
+		case SF_FORMAT_PCM_32 : 
+				switch (endian)
+				{	case SF_ENDIAN_BIG :
+							psf->endian = SF_ENDIAN_BIG ;
+							comm_type = AIFC_MARKER ;
+							comm_size = AIFC_COMM_SIZE ;
+							comm_encoding = twos_MARKER ;
+							break ;
+							
+					case SF_ENDIAN_LITTLE :
+							psf->endian = SF_ENDIAN_LITTLE ;
+							comm_type = AIFC_MARKER ;
+							comm_size = AIFC_COMM_SIZE ;
+							comm_encoding = sowt_MARKER ;
+							break ;
+			
+					default : /* SF_ENDIAN_FILE */
+							psf->endian = SF_ENDIAN_BIG ;
+							comm_type = AIFF_MARKER ;
+							comm_size = AIFF_COMM_SIZE ;
+							comm_encoding = 0 ;
+							break ;
+					} ;
 				break ;
 
-		case SF_FORMAT_PCM_BE :					/* Big endian AIFC. */
+		case SF_FORMAT_FLOAT :					/* Big endian floating point. */
 				psf->endian = SF_ENDIAN_BIG ;
 				comm_type = AIFC_MARKER ;
 				comm_size = AIFC_COMM_SIZE ;
-				comm_encoding = twos_MARKER ;
+				comm_encoding = FL32_MARKER ; /* Use 'FL32' because its easier to read. */
+				psf->has_peak = SF_TRUE ;
+				psf->peak_loc = SF_PEAK_START ;
 				break ;
-				
-		case SF_FORMAT_PCM_LE :					/* Little endian AIFC. */
-				psf->endian = SF_ENDIAN_LITTLE ;
+
+		case SF_FORMAT_DOUBLE :					/* Big endian double precision floating point. */
+				psf->endian = SF_ENDIAN_BIG ;
 				comm_type = AIFC_MARKER ;
 				comm_size = AIFC_COMM_SIZE ;
-				comm_encoding = sowt_MARKER ;
+				comm_encoding = FL64_MARKER ; /* Use 'FL64' because its easier to read. */
+				psf->has_peak = SF_TRUE ;
+				psf->peak_loc = SF_PEAK_START ;
 				break ;
 
-		case SF_FORMAT_FLOAT :					/* Big endian floating point. */
+		case SF_FORMAT_ULAW :
 				psf->endian = SF_ENDIAN_BIG ;
 				comm_type = AIFC_MARKER ;
 				comm_size = AIFC_COMM_SIZE ;
-				comm_encoding = FL32_MARKER ; /* Use 'FL32' because its easier to read. */
-				psf->has_peak = SF_TRUE ;
-				psf->peak_loc = SF_PEAK_START ;
+				comm_encoding = ulaw_MARKER ;
+				psf->has_peak = SF_FALSE ;
 				break ;
 
+		case SF_FORMAT_ALAW :
+				psf->endian = SF_ENDIAN_BIG ;
+				comm_type = AIFC_MARKER ;
+				comm_size = AIFC_COMM_SIZE ;
+				comm_encoding = alaw_MARKER ;
+				psf->has_peak = SF_FALSE ;
+				break ;
+
+		case SF_FORMAT_PCM_U8 :
+				psf->endian = SF_ENDIAN_BIG ;
+				comm_type = AIFC_MARKER ;
+				comm_size = AIFC_COMM_SIZE ;
+				comm_encoding = raw_MARKER ;
+				psf->has_peak = SF_FALSE ;
+				break ;
+
+		case SF_FORMAT_DWVW_12 :
+				psf->endian = SF_ENDIAN_BIG ;
+				comm_type = AIFC_MARKER ;
+				comm_size = AIFC_COMM_SIZE ;
+				comm_encoding = DWVW_MARKER ;
+				psf->has_peak = SF_FALSE ;
+
+				/* Override standard value here.*/
+				bit_width = 12 ;
+				break ;
+
+		case SF_FORMAT_DWVW_16 :
+				psf->endian = SF_ENDIAN_BIG ;
+				comm_type = AIFC_MARKER ;
+				comm_size = AIFC_COMM_SIZE ;
+				comm_encoding = DWVW_MARKER ;
+				psf->has_peak = SF_FALSE ;
+
+				/* Override standard value here.*/
+				bit_width = 16 ;
+				break ;
+
+		case SF_FORMAT_DWVW_24 :
+				psf->endian = SF_ENDIAN_BIG ;
+				comm_type = AIFC_MARKER ;
+				comm_size = AIFC_COMM_SIZE ;
+				comm_encoding = DWVW_MARKER ;
+				psf->has_peak = SF_FALSE ;
+
+				/* Override standard value here.*/
+				bit_width = 24 ;
+				break ;
+
 		default :	return	SFE_BAD_OPEN_FORMAT ;
 		} ;
 	
@@ -568,35 +746,35 @@
 	/* Reset the current header length to zero. */
 	psf->header [0] = 0 ;
 	psf->headindex = 0 ;
-	fseek (psf->file, 0, SEEK_SET) ;
+	psf_fseek (psf->filedes, 0, SEEK_SET) ;
 
-	psf_binheader_writef (psf, "mL", FORM_MARKER, psf->filelength - 8) ;
+	psf_binheader_writef (psf, "Etm8", FORM_MARKER, psf->filelength - 8) ;
 	
 	/* Write COMM chunk. */
-	psf_binheader_writef (psf, "mmL", comm_type, COMM_MARKER, comm_size) ;
+	psf_binheader_writef (psf, "Emm4", comm_type, COMM_MARKER, comm_size) ;
 
 	uint2tenbytefloat (psf->sf.samplerate, comm_sample_rate)  ;
 
-	psf_binheader_writef (psf, "WLW", psf->sf.channels, psf->sf.samples, psf->sf.pcmbitwidth) ;
-	psf_binheader_writef (psf, "B", comm_sample_rate, sizeof (comm_sample_rate)) ;
+	psf_binheader_writef (psf, "Et282", psf->sf.channels, psf->sf.samples, bit_width) ;
+	psf_binheader_writef (psf, "b", comm_sample_rate, sizeof (comm_sample_rate)) ;
 	
 	/* AIFC chunks have some extra data. */
 	if (comm_type == AIFC_MARKER)
-		psf_binheader_writef (psf, "mB", comm_encoding, comm_zero_bytes, sizeof (comm_zero_bytes)) ;
+		psf_binheader_writef (psf, "mb", comm_encoding, comm_zero_bytes, sizeof (comm_zero_bytes)) ;
 		
 	if (psf->has_peak && psf->peak_loc == SF_PEAK_START)
-	{	psf_binheader_writef (psf, "mL", PEAK_MARKER, 
+	{	psf_binheader_writef (psf, "Em4", PEAK_MARKER, 
 			sizeof (psf->peak) - sizeof (psf->peak.peak) + psf->sf.channels * sizeof (PEAK_POS)) ;
-		psf_binheader_writef (psf, "LL", 1, time (NULL)) ;
+		psf_binheader_writef (psf, "E44", 1, time (NULL)) ;
 		for (k = 0 ; k < psf->sf.channels ; k++)
-			psf_binheader_writef (psf, "FL", psf->peak.peak[k].value, psf->peak.peak[k].position) ; /* XXXXX */
+			psf_binheader_writef (psf, "Ef4", psf->peak.peak[k].value, psf->peak.peak[k].position) ; /* XXXXX */
 		} ;
 		
 	/* Write SSND chunk. */
-	psf_binheader_writef (psf, "mLLL", SSND_MARKER, psf->datalength + SSND_CHUNK_SIZE, 0, 0) ;
+	psf_binheader_writef (psf, "Etm844", SSND_MARKER, psf->datalength + SSND_CHUNK_SIZE, 0, 0) ;
 
-	/* Header cunstruction complete so write it out. */
-	fwrite (psf->header, psf->headindex, 1, psf->file) ;
+	/* Header construction complete so write it out. */
+	psf_fwrite (psf->header, psf->headindex, 1, psf->filedes) ;
 
 	psf->dataoffset = psf->headindex ;
 
@@ -610,38 +788,22 @@
 	/* Reset the current header length to zero. */
 	psf->header [0] = 0 ;
 	psf->headindex = 0 ;
-	fseek (psf->file, 0, SEEK_SET) ;
+	psf_fseek (psf->filedes, 0, SEEK_SET) ;
 
 	if (psf->has_peak && psf->peak_loc == SF_PEAK_END)
-	{	psf_binheader_writef (psf, "mL", PEAK_MARKER, 
+	{	psf_binheader_writef (psf, "Em4", PEAK_MARKER, 
 			sizeof (psf->peak) - sizeof (psf->peak.peak) + psf->sf.channels * sizeof (PEAK_POS)) ;
-		psf_binheader_writef (psf, "LL", 1, time (NULL)) ;
+		psf_binheader_writef (psf, "E44", 1, time (NULL)) ;
 		for (k = 0 ; k < psf->sf.channels ; k++)
-			psf_binheader_writef (psf, "FL", psf->peak.peak[k].value, psf->peak.peak[k].position) ; /* XXXXX */
+			psf_binheader_writef (psf, "Ef4", psf->peak.peak[k].value, psf->peak.peak[k].position) ; /* XXXXX */
 		} ;
 		
 	if (psf->headindex)
-		fwrite (psf->header, psf->headindex, 1, psf->file) ;
+		psf_fwrite (psf->header, psf->headindex, 1, psf->filedes) ;
 
 	return 0 ;
 } /* aiff_write_tailer */
 
-/*-
-static void
-endswap_comm_fmt (COMM_CHUNK *comm)
-{	comm->size            = ENDSWAP_INT (comm->size) ;
-	comm->numChannels     = ENDSWAP_SHORT (comm->numChannels) ;
-	comm->numSampleFrames = ENDSWAP_INT (comm->numSampleFrames) ;
-	comm->sampleSize      = ENDSWAP_SHORT (comm->sampleSize) ;
-} /+* endswap_comm_fmt *+/
-
-static void
-endswap_ssnd_fmt (SSND_CHUNK *ssnd)
-{	ssnd->offset 	= ENDSWAP_INT (ssnd->offset) ;
-	ssnd->blocksize = ENDSWAP_INT (ssnd->blocksize) ;
-} /+* endswap_ssnd_fmt *+/
--*/
-
 /*==========================================================================================
 **	Rough hack at converting from 80 bit IEEE float in AIFF header to an int and
 **	back again. It assumes that all sample rates are between 1 and 800MHz, which 
@@ -678,7 +840,9 @@
 
 static void
 uint2tenbytefloat (unsigned int num, unsigned char *bytes)
-{	int		count, mask = 0x40000000 ;
+{	unsigned int mask = 0x40000000 ;
+	int		count ;
+	
 
 	memset (bytes, 0, 10) ;
 
--- a/common/libsndfile/src/alaw.c
+++ b/common/libsndfile/src/alaw.c
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 1999-2001 Erik de Castro Lopo <[email protected]>
+** Copyright (C) 1999-2002 Erik de Castro Lopo <[email protected]>
 **  
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -16,67 +16,72 @@
 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 */
 
-
 #include	<unistd.h>
 
 #include	"sndfile.h"
-#include	"floatcast.h"
+#include	"float_cast.h"
 #include	"common.h"
 
-static int		alaw_read_alaw2s (SF_PRIVATE *psf, short *ptr, unsigned int len) ;
-static int		alaw_read_alaw2i (SF_PRIVATE *psf, int *ptr, unsigned int len) ;
-static int		alaw_read_alaw2f (SF_PRIVATE *psf, float *ptr, unsigned int len) ;
-static int		alaw_read_alaw2d (SF_PRIVATE *psf, double *ptr, unsigned int len, int normalize) ;
+static sf_count_t		alaw_read_alaw2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static sf_count_t		alaw_read_alaw2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+static sf_count_t		alaw_read_alaw2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+static sf_count_t		alaw_read_alaw2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
 
-static int		alaw_write_s2alaw (SF_PRIVATE *psf, short *ptr, unsigned int len) ;
-static int		alaw_write_i2alaw (SF_PRIVATE *psf, int *ptr, unsigned int len) ;
-static int		alaw_write_f2alaw (SF_PRIVATE *psf, float *ptr, unsigned int len) ;
-static int		alaw_write_d2alaw (SF_PRIVATE *psf, double *ptr, unsigned int len, int normalize) ;
+static sf_count_t		alaw_write_s2alaw (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static sf_count_t		alaw_write_i2alaw (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+static sf_count_t		alaw_write_f2alaw (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+static sf_count_t		alaw_write_d2alaw (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
 
-static  void    alaw2s_array      (unsigned char *buffer, unsigned int count, short *ptr, unsigned int index) ;
-static  void    alaw2i_array      (unsigned char *buffer, unsigned int count, int *ptr, unsigned int index) ;
-static  void    alaw2f_array      (unsigned char *buffer, unsigned int count, float *ptr, unsigned int index, float normfact) ;
-static  void    alaw2d_array      (unsigned char *buffer, unsigned int count, double *ptr, unsigned int index, double normfact) ;
+static  void    alaw2s_array      (unsigned char *buffer, unsigned int count, short *ptr) ;
+static  void    alaw2i_array      (unsigned char *buffer, unsigned int count, int *ptr) ;
+static  void    alaw2f_array      (unsigned char *buffer, unsigned int count, float *ptr, float normfact) ;
+static  void    alaw2d_array      (unsigned char *buffer, unsigned int count, double *ptr, double normfact) ;
 
-static  void    s2alaw_array      (short *buffer, unsigned int count, unsigned char *ptr, unsigned int index) ;
-static  void    i2alaw_array      (int *buffer, unsigned int count, unsigned char *ptr, unsigned int index) ;
-static  void    f2alaw_array      (float *buffer, unsigned int count, unsigned char *ptr, unsigned int index, float normfact) ;
-static  void    d2alaw_array      (double *buffer, unsigned int count, unsigned char *ptr, unsigned int index, double normfact) ;
+static  void    s2alaw_array      (short *buffer, unsigned int count, unsigned char *ptr) ;
+static  void    i2alaw_array      (int *buffer, unsigned int count, unsigned char *ptr) ;
+static  void    f2alaw_array      (float *buffer, unsigned int count, unsigned char *ptr, float normfact) ;
+static  void    d2alaw_array      (double *buffer, unsigned int count, unsigned char *ptr, double normfact) ;
 
-int
-alaw_read_init (SF_PRIVATE *psf)
+
+int 
+alaw_init (SF_PRIVATE *psf)
 {
-	psf->read_short  = (func_short)  alaw_read_alaw2s ;
-	psf->read_int    = (func_int)    alaw_read_alaw2i ;
-	psf->read_float  = (func_float)  alaw_read_alaw2f ;
-	psf->read_double = (func_double) alaw_read_alaw2d ;
+	if (psf->mode == SFM_READ || psf->mode == SFM_RDWR)
+	{	psf->read_short  = alaw_read_alaw2s ;
+		psf->read_int    = alaw_read_alaw2i ;
+		psf->read_float  = alaw_read_alaw2f ;
+		psf->read_double = alaw_read_alaw2d ;
+		};
+		
+	if (psf->mode == SFM_WRITE || psf->mode == SFM_RDWR)
+	{	psf->write_short  = alaw_write_s2alaw ;
+		psf->write_int    = alaw_write_i2alaw ;
+		psf->write_float  = alaw_write_f2alaw ;
+		psf->write_double = alaw_write_d2alaw ;
+		} ;
 
-	return 0 ;
-} /* alaw_read_init */
+	psf->bytewidth  = 1 ;
+	psf->blockwidth = psf->sf.channels ;
 
-int
-alaw_write_init (SF_PRIVATE *psf)
-{
-	psf->write_short  = (func_short)  alaw_write_s2alaw ;
-	psf->write_int    = (func_int)    alaw_write_i2alaw ;
-	psf->write_float  = (func_float)  alaw_write_f2alaw ;
-	psf->write_double = (func_double) alaw_write_d2alaw ;
+	psf->filelength = psf_get_filelen (psf->filedes) ;
+	psf->datalength = (psf->dataend) ? psf->dataend - psf->dataoffset : 
+							psf->filelength - psf->dataoffset ;
+	psf->sf.samples = psf->datalength / psf->blockwidth ;
 
 	return 0 ;
-} /* alaw_read_init */
+} /* alaw_init */
 
-static int
-alaw_read_alaw2s (SF_PRIVATE *psf, short *ptr, unsigned int len)
-{	unsigned int readcount, thisread, index = 0 ;
-	int		bytecount, bufferlen ;
-	int		total = 0 ;
+static sf_count_t
+alaw_read_alaw2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
+{	sf_count_t	readcount, thisread, index = 0, total = 0 ;
+	sf_count_t	bytecount, bufferlen ;
 
 	bufferlen = (SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth ;
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
-		alaw2s_array ((unsigned char*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
+		thisread = psf_fread (psf->buffer, 1, readcount, psf->filedes) ;
+		alaw2s_array ((unsigned char*) (psf->buffer), thisread / psf->bytewidth, ptr + index) ;
 		total += thisread ;
 		if (thisread < readcount)
 			break ;
@@ -91,18 +96,17 @@
 	return total ;
 } /* alaw_read_alaw2s */
 
-static int
-alaw_read_alaw2i (SF_PRIVATE *psf, int *ptr, unsigned int len)
-{	unsigned int readcount, thisread, index = 0 ;
-	int		bytecount, bufferlen ;
-	int		total = 0 ;
+static sf_count_t
+alaw_read_alaw2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
+{	sf_count_t	readcount, thisread, index = 0, total = 0 ;
+	sf_count_t	bytecount, bufferlen ;
 
 	bufferlen = (SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth ;
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
-		alaw2i_array ((unsigned char*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
+		thisread = psf_fread (psf->buffer, 1, readcount, psf->filedes) ;
+		alaw2i_array ((unsigned char*) (psf->buffer), thisread / psf->bytewidth, ptr + index) ;
 		total += thisread ;
 		if (thisread < readcount)
 			break ;
@@ -117,11 +121,10 @@
 	return total ;
 } /* alaw_read_alaw2i */
 
-static int
-alaw_read_alaw2f (SF_PRIVATE *psf, float *ptr, unsigned int len)
-{	unsigned int readcount, thisread, index = 0 ;
-	int		bytecount, bufferlen ;
-	int		total = 0 ;
+static sf_count_t
+alaw_read_alaw2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
+{	sf_count_t	readcount, thisread, index = 0, total = 0 ;
+	sf_count_t	bytecount, bufferlen ;
 	float	normfact ;
 
 	normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ;
@@ -130,8 +133,8 @@
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
-		alaw2f_array ((unsigned char*) (psf->buffer), thisread / psf->bytewidth, ptr, index, normfact) ;
+		thisread = psf_fread (psf->buffer, 1, readcount, psf->filedes) ;
+		alaw2f_array ((unsigned char*) (psf->buffer), thisread / psf->bytewidth, ptr + index, normfact) ;
 		total += thisread ;
 		if (thisread < readcount)
 			break ;
@@ -146,20 +149,19 @@
 	return total ;
 } /* alaw_read_alaw2f */
 
-static int
-alaw_read_alaw2d (SF_PRIVATE *psf, double *ptr, unsigned int len, int normalize)
-{	unsigned int readcount, thisread, index = 0 ;
-	int		bytecount, bufferlen ;
-	int		total = 0 ;
+static sf_count_t
+alaw_read_alaw2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
+{	sf_count_t	readcount, thisread, index = 0, total = 0 ;
+	sf_count_t	bytecount, bufferlen ;
 	double	normfact ;
 	
-	normfact = (normalize ? 1.0 / ((double) 0x8000) : 1.0) ;
+	normfact = (psf->norm_double) ? 1.0 / ((double) 0x8000) : 1.0 ;
 	bufferlen = (SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth ;
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
-		alaw2d_array ((unsigned char*) (psf->buffer), thisread / psf->bytewidth, ptr, index, normfact) ;
+		thisread = psf_fread (psf->buffer, 1, readcount, psf->filedes) ;
+		alaw2d_array ((unsigned char*) (psf->buffer), thisread / psf->bytewidth, ptr + index, normfact) ;
 		total += thisread ;
 		if (thisread < readcount)
 			break ;
@@ -177,18 +179,17 @@
 /*=============================================================================================
 */
 
-static int
-alaw_write_s2alaw	(SF_PRIVATE *psf, short *ptr, unsigned int len)
-{	unsigned int	writecount, thiswrite, index = 0 ;
-	int		bytecount, bufferlen ;
-	int		total = 0 ;
+static sf_count_t
+alaw_write_s2alaw	(SF_PRIVATE *psf, short *ptr, sf_count_t len)
+{	sf_count_t	writecount, thiswrite, index = 0, total = 0 ;
+	sf_count_t	bytecount, bufferlen ;
 
 	bufferlen = (SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth ;
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		s2alaw_array (ptr, index, (unsigned char*) (psf->buffer), writecount / psf->bytewidth) ;
-		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		s2alaw_array (ptr + index, writecount / psf->bytewidth, (unsigned char*) (psf->buffer)) ;
+		thiswrite = psf_fwrite (psf->buffer, 1, writecount, psf->filedes) ;
 		total += thiswrite ;
 		if (thiswrite < writecount)
 			break ;
@@ -203,18 +204,17 @@
 	return total ;
 } /* alaw_write_s2alaw */
 
-static int
-alaw_write_i2alaw	(SF_PRIVATE *psf, int *ptr, unsigned int len)
-{	unsigned int	writecount, thiswrite, index = 0 ;
-	int		bytecount, bufferlen ;
-	int		total = 0 ;
+static sf_count_t
+alaw_write_i2alaw	(SF_PRIVATE *psf, int *ptr, sf_count_t len)
+{	sf_count_t	writecount, thiswrite, index = 0, total = 0 ;
+	sf_count_t	bytecount, bufferlen ;
 
 	bufferlen = (SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth ;
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		i2alaw_array (ptr, index, (unsigned char*) (psf->buffer), writecount / psf->bytewidth) ;
-		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		i2alaw_array (ptr + index, writecount / psf->bytewidth, (unsigned char*) (psf->buffer)) ;
+		thiswrite = psf_fwrite (psf->buffer, 1, writecount, psf->filedes) ;
 		total += thiswrite ;
 		if (thiswrite < writecount)
 			break ;
@@ -229,11 +229,10 @@
 	return total ;
 } /* alaw_write_i2alaw */
 
-static int
-alaw_write_f2alaw	(SF_PRIVATE *psf, float *ptr, unsigned int len)
-{	unsigned int	writecount, thiswrite, index = 0 ;
-	int		bytecount, bufferlen ;
-	int		total = 0 ;
+static sf_count_t
+alaw_write_f2alaw	(SF_PRIVATE *psf, float *ptr, sf_count_t len)
+{	sf_count_t	writecount, thiswrite, index = 0, total = 0 ;
+	sf_count_t	bytecount, bufferlen ;
 	float	normfact ;
 
 	normfact = (psf->norm_float == SF_TRUE) ? ((float) 0x8000) : 1.0 ;
@@ -242,8 +241,8 @@
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		f2alaw_array (ptr, index, (unsigned char*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
-		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		f2alaw_array (ptr + index, writecount / psf->bytewidth, (unsigned char*) (psf->buffer), normfact) ;
+		thiswrite = psf_fwrite (psf->buffer, 1, writecount, psf->filedes) ;
 		total += thiswrite ;
 		if (thiswrite < writecount)
 			break ;
@@ -258,21 +257,20 @@
 	return total ;
 } /* alaw_write_f2alaw */
 
-static int
-alaw_write_d2alaw	(SF_PRIVATE *psf, double *ptr, unsigned int len, int normalize)
-{	unsigned int	writecount, thiswrite, index = 0 ;
-	int		bytecount, bufferlen ;
-	int		total = 0 ;
+static sf_count_t
+alaw_write_d2alaw	(SF_PRIVATE *psf, double *ptr, sf_count_t len)
+{	sf_count_t	writecount, thiswrite, index = 0, total = 0 ;
+	sf_count_t	bytecount, bufferlen ;
 	double	normfact ;
 	
-	normfact = (normalize ? ((double) 0x8000) : 1.0) ;
+	normfact = (psf->norm_double) ? ((double) 0x8000) : 1.0 ;
 
 	bufferlen = (SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth ;
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		d2alaw_array (ptr, index, (unsigned char*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
-		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		d2alaw_array (ptr + index, writecount / psf->bytewidth, (unsigned char*) (psf->buffer), normfact) ;
+		thiswrite = psf_fwrite (psf->buffer, 1, writecount, psf->filedes) ;
 		total += thiswrite ;
 		if (thiswrite < writecount)
 			break ;
@@ -487,102 +485,90 @@
 } ; /* alaw_encode */
 
 static void	
-alaw2s_array	(unsigned char *buffer, unsigned int count, short *ptr, unsigned int index)
-{	int 	k ;
-	for (k = 0 ; k < count ; k++)
-	{	if (buffer [k] & 0x80)
-			ptr [index] = -1 * alaw_decode [((int) buffer [k]) & 0x7F] ;
+alaw2s_array	(unsigned char *buffer, unsigned int count, short *ptr)
+{	while (count)
+	{	count -- ;
+		if (buffer [count] & 0x80)
+			ptr [count] = -1 * alaw_decode [((int) buffer [count]) & 0x7F] ;
 		else
-			ptr [index] = alaw_decode [((int) buffer [k]) & 0x7F] ;
-		index ++ ;
+			ptr [count] = alaw_decode [((int) buffer [count]) & 0x7F] ;
 		} ;
 } /* alaw2s_array */
 
 static void	
-alaw2i_array	(unsigned char *buffer, unsigned int count, int *ptr, unsigned int index)
-{	int 	k ;
-	for (k = 0 ; k < count ; k++)
-	{	if (buffer [k] & 0x80)
-			ptr [index] = -1 * alaw_decode [((int) buffer [k]) & 0x7F] ;
+alaw2i_array	(unsigned char *buffer, unsigned int count, int *ptr)
+{	while (count)
+	{	count -- ;
+		if (buffer [count] & 0x80)
+			ptr [count] = (-1 * alaw_decode [((int) buffer [count]) & 0x7F]) << 16 ;
 		else
-			ptr [index] = alaw_decode [((int) buffer [k]) & 0x7F] ;
-		index ++ ;
+			ptr [count] = alaw_decode [((int) buffer [count]) & 0x7F] << 16 ;
 		} ;
 } /* alaw2i_array */
 
 static void	
-alaw2f_array	(unsigned char *buffer, unsigned int count, float *ptr, unsigned int index, float normfact)
-{	int 	k ;
-	for (k = 0 ; k < count ; k++)
-	{	if (buffer [k] & 0x80)
-			ptr [index] = -normfact * alaw_decode [((int) buffer [k]) & 0x7F] ;
+alaw2f_array	(unsigned char *buffer, unsigned int count, float *ptr, float normfact)
+{	while (count)
+	{	count -- ;
+		if (buffer [count] & 0x80)
+			ptr [count] = -normfact * alaw_decode [((int) buffer [count]) & 0x7F] ;
 		else
-			ptr [index] = normfact * alaw_decode [((int) buffer [k]) & 0x7F] ;
-		index ++ ;
+			ptr [count] = normfact * alaw_decode [((int) buffer [count]) & 0x7F] ;
 		} ;
 } /* alaw2d_array */
 
 static void	
-alaw2d_array	(unsigned char *buffer, unsigned int count, double *ptr, unsigned int index, double normfact)
-{	int 	k ;
-	for (k = 0 ; k < count ; k++)
-	{	if (buffer [k] & 0x80)
-			ptr [index] = -normfact * alaw_decode [((int) buffer [k]) & 0x7F] ;
+alaw2d_array	(unsigned char *buffer, unsigned int count, double *ptr, double normfact)
+{	while (count)
+	{	count -- ;
+		if (buffer [count] & 0x80)
+			ptr [count] = -normfact * alaw_decode [((int) buffer [count]) & 0x7F] ;
 		else
-			ptr [index] = normfact * alaw_decode [((int) buffer [k]) & 0x7F] ;
-		index ++ ;
+			ptr [count] = normfact * alaw_decode [((int) buffer [count]) & 0x7F] ;
 		} ;
 } /* alaw2d_array */
 
 static void    
-s2alaw_array      (short *ptr, unsigned int index, unsigned char *buffer, unsigned int count)
-{	unsigned int	k ;
-
-	for (k = 0 ; k < count ; k++)
-	{	if (ptr [index] >= 0) 
-			buffer [k] = alaw_encode [ptr [index] / 16] ;
+s2alaw_array      (short *ptr, unsigned int count, unsigned char *buffer)
+{	while (count)
+	{	count -- ;
+		if (ptr [count] >= 0) 
+			buffer [count] = alaw_encode [ptr [count] / 16] ;
 		else
-			buffer [k] = 0x7F & alaw_encode [ptr [index] / -16] ;
-		index ++ ;
+			buffer [count] = 0x7F & alaw_encode [ptr [count] / -16] ;
 		} ;
 } /* s2alaw_array */
 
 static void    
-i2alaw_array      (int *ptr, unsigned int index, unsigned char *buffer, unsigned int count)
-{	unsigned int	k ;
-
-	for (k = 0 ; k < count ; k++)
-	{	if (ptr [index] >= 0) 
-			buffer [k] = alaw_encode [ptr [index] / 16] ;
+i2alaw_array      (int *ptr, unsigned int count, unsigned char *buffer)
+{	while (count)
+	{	count -- ;
+		if (ptr [count] >= 0) 
+			buffer [count] = alaw_encode [ptr [count] >> (16 + 4)] ;
 		else
-			buffer [k] = 0x7F & alaw_encode [ptr [index] / -16] ;
-		index ++ ;
+			buffer [count] = 0x7F & alaw_encode [- ptr [count] >> (16 + 4)] ;
 		} ;
 } /* i2alaw_array */
 
 static void    
-f2alaw_array      (float *ptr, unsigned int index, unsigned char *buffer, unsigned int count, float normfact)
-{	unsigned int	k ;
-
-	for (k = 0 ; k < count ; k++)
-	{	if (ptr [index] >= 0) 
-			buffer [k] = alaw_encode [(FLOAT_TO_INT (normfact * ptr [index])) / 16] ;
+f2alaw_array      (float *ptr, unsigned int count, unsigned char *buffer, float normfact)
+{	while (count)
+	{	count -- ;
+		if (ptr [count] >= 0) 
+			buffer [count] = alaw_encode [(lrintf (normfact * ptr [count])) / 16] ;
 		else
-			buffer [k] = 0x7F & alaw_encode [(FLOAT_TO_INT (normfact * ptr [index])) / -16] ;
-		index ++ ;
+			buffer [count] = 0x7F & alaw_encode [(lrintf (normfact * ptr [count])) / -16] ;
 		} ;
 } /* f2alaw_array */
 
 static void    
-d2alaw_array      (double *ptr, unsigned int index, unsigned char *buffer, unsigned int count, double normfact)
-{	unsigned int	k ;
-
-	for (k = 0 ; k < count ; k++)
-	{	if (ptr [index] >= 0) 
-			buffer [k] = alaw_encode [(DOUBLE_TO_INT (normfact * ptr [index])) / 16] ;
+d2alaw_array      (double *ptr, unsigned int count, unsigned char *buffer, double normfact)
+{	while (count)
+	{	count -- ;
+		if (ptr [count] >= 0) 
+			buffer [count] = alaw_encode [(lrint (normfact * ptr [count])) / 16] ;
 		else
-			buffer [k] = 0x7F & alaw_encode [(DOUBLE_TO_INT (normfact * ptr [index])) / -16] ;
-		index ++ ;
+			buffer [count] = 0x7F & alaw_encode [(lrint (normfact * ptr [count])) / -16] ;
 		} ;
 } /* d2alaw_array */
 
--- a/common/libsndfile/src/au.c
+++ b/common/libsndfile/src/au.c
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 1999-2001 Erik de Castro Lopo <[email protected]>
+** Copyright (C) 1999-2002 Erik de Castro Lopo <[email protected]>
 **  
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -16,7 +16,6 @@
 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 */
 
-
 #include	<stdio.h>
 #include	<unistd.h>
 #include	<fcntl.h>
@@ -94,216 +93,128 @@
 
 static	int				au_close		(SF_PRIVATE *psf) ;
 
-static	int 			get_encoding	(unsigned int format, unsigned int	bitwidth) ;
-static	char const* 	get_encoding_str(int format) ;
+static	int 			au_format_to_encoding	(int format) ;
 
 static int				au_write_header (SF_PRIVATE *psf) ;
+static int				au_read_header (SF_PRIVATE *psf) ;
 
-/*
-static	void			endswap_au_fmt	(AU_FMT *pau_fmt) ;
-*/
-
 /*------------------------------------------------------------------------------
-** Public functions.
+** Public function.
 */
 
 int
-au_open_read	(SF_PRIVATE *psf)
-{	AU_FMT			au_fmt ;
-	unsigned int	marker, dword ;
-	int				error = SFE_NO_ERROR ;
-	
-	psf_binheader_readf (psf, "pm", 0, &marker) ;
-	psf_log_printf (psf, "%D\n", marker) ;
+au_open	(SF_PRIVATE *psf)
+{	int		encoding, subformat ;
+	int		error = 0 ;
 
-	if (marker == DOTSND_MARKER)
-	{	psf->endian = SF_ENDIAN_BIG ;
+	if (psf->mode == SFM_READ || (psf->mode == SFM_RDWR && psf->filelength > 0))
+	{	if ((error = au_read_header (psf)))
+			return error ; 
+		} ;
 
-		psf_binheader_readf (psf, "LLLLL", &(au_fmt.dataoffset), &(au_fmt.datasize),
-					&(au_fmt.encoding), &(au_fmt.samplerate), &(au_fmt.channels)) ;
-		}
-	else if (marker == DNSDOT_MARKER)
-	{	psf->endian = SF_ENDIAN_LITTLE ;
-		psf_binheader_readf (psf, "lllll", &(au_fmt.dataoffset), &(au_fmt.datasize),
-					&(au_fmt.encoding), &(au_fmt.samplerate), &(au_fmt.channels)) ;
-		}
-	else
-		return SFE_AU_NO_DOTSND ;
-		
+	if ((psf->sf.format & SF_FORMAT_TYPEMASK) != SF_FORMAT_AU)
+		return	SFE_BAD_OPEN_FORMAT ;
+
+	subformat = psf->sf.format & SF_FORMAT_SUBMASK ;
 	
-	psf_log_printf (psf, "  Data Offset : %d\n", au_fmt.dataoffset) ;
+	if (psf->mode == SFM_WRITE || psf->mode == SFM_RDWR)
+	{	psf->endian = psf->sf.format & SF_FORMAT_ENDMASK ; 
+		if (CPU_IS_LITTLE_ENDIAN && psf->endian == SF_ENDIAN_CPU)
+			psf->endian = SF_ENDIAN_LITTLE ;
+		else if (psf->endian != SF_ENDIAN_LITTLE)
+			psf->endian = SF_ENDIAN_BIG ;
 	
-	if (au_fmt.datasize == 0xFFFFFFFF || au_fmt.dataoffset + au_fmt.datasize == psf->filelength)
-		psf_log_printf (psf, "  Data Size   : %d\n", au_fmt.datasize) ;
-	else if (au_fmt.dataoffset + au_fmt.datasize < psf->filelength)
-	{	psf->filelength = au_fmt.dataoffset + au_fmt.dataoffset ;
-		psf_log_printf (psf, "  Data Size   : %d\n", au_fmt.datasize) ;
-		}
-	else
-	{	dword = psf->filelength - au_fmt.dataoffset ;
-		psf_log_printf (psf, "  Data Size   : %d (should be %d)\n", au_fmt.datasize, dword) ;
-		au_fmt.datasize = dword ;
+		if (! (encoding = au_write_header (psf)))
+			return psf->error ;
+	
+		psf->write_header = au_write_header ;
 		} ;
-		
- 	psf->dataoffset = au_fmt.dataoffset ;
-	psf->datalength = psf->filelength - psf->dataoffset ;
 
- 	psf->current  = 0 ;
- 	
- 	if (fseek (psf->file, psf->dataoffset, SEEK_SET))
-		return SFE_BAD_SEEK ;
-
-	psf->close = (func_close) au_close ;
+	psf->close = au_close ;
 	
-	psf->sf.samplerate	= au_fmt.samplerate ;
-	psf->sf.channels 	= au_fmt.channels ;
-					
-	/* Only fill in type major. */
-	if (psf->endian == SF_ENDIAN_BIG)
-		psf->sf.format = SF_FORMAT_AU ;
-	else if (psf->endian == SF_ENDIAN_LITTLE)
-		psf->sf.format = SF_FORMAT_AULE ;
+	psf->blockwidth  = psf->bytewidth * psf->sf.channels ;
 
-	psf->sf.sections 	= 1 ;
-
-	psf_log_printf (psf, "  Encoding    : %d => %s\n", au_fmt.encoding, get_encoding_str (au_fmt.encoding)) ;
-
-	psf_log_printf (psf, "  Sample Rate : %d\n", au_fmt.samplerate) ;
-	psf_log_printf (psf, "  Channels    : %d\n", au_fmt.channels) ;
+	switch (subformat)
+	{	case  SF_FORMAT_ULAW :	/* 8-bit Ulaw encoding. */
+				ulaw_init (psf) ;
+				break ;
 	
-	switch (au_fmt.encoding)
-	{	case  AU_ENCODING_PCM_8 :	
-				psf->sf.pcmbitwidth = 8 ;
-				psf->bytewidth      = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
-				psf->blockwidth = psf->sf.channels * psf->bytewidth ;
-
-				psf->sf.format |= SF_FORMAT_PCM ;
-
+		case  SF_FORMAT_PCM_S8 :	/* 8-bit linear PCM. */
 				psf->chars = SF_CHARS_SIGNED ;
-									
-				if ((error = pcm_read_init (psf)))
-					return error ;
+				error = pcm_init (psf) ;				
 				break ;
 
-		case  AU_ENCODING_PCM_16 :	
-				psf->sf.pcmbitwidth = 16 ;
-				psf->bytewidth      = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
-				psf->blockwidth = psf->sf.channels * psf->bytewidth ;
-
-				psf->sf.format |= SF_FORMAT_PCM ;
-					
-				if ((error = pcm_read_init (psf)))
-					return error ;
+		case  SF_FORMAT_PCM_16 :	/* 16-bit linear PCM. */
+		case  SF_FORMAT_PCM_24 :	/* 24-bit linear PCM */
+		case  SF_FORMAT_PCM_32 :	/* 32-bit linear PCM. */
+				error = pcm_init (psf) ;
 				break ;
 
-		case  AU_ENCODING_PCM_24 :	
-				psf->sf.pcmbitwidth = 24 ;
-				psf->bytewidth      = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
-				psf->blockwidth = psf->sf.channels * psf->bytewidth ;
-					
-				psf->sf.format |= SF_FORMAT_PCM ;
-
-				if ((error = pcm_read_init (psf)))
-					return error ;
+		case  SF_FORMAT_FLOAT :	/* 32-bit floats. */
+				error = float32_init (psf) ;
 				break ;
-
-		case  AU_ENCODING_PCM_32 :	
-				psf->sf.pcmbitwidth = 32 ;
-				psf->bytewidth      = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
-				psf->blockwidth = psf->sf.channels * psf->bytewidth ;
-					
-				psf->sf.format |= SF_FORMAT_PCM ;
-					
-				if ((error = pcm_read_init (psf)))
-					return error ;
+				
+		case  SF_FORMAT_DOUBLE :	/* 64-bit double precision floats. */
+				error = double64_init (psf) ;
 				break ;
-					
-		case  AU_ENCODING_FLOAT :	
-				psf->sf.pcmbitwidth = 32 ;
-				psf->bytewidth      = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
-				psf->blockwidth = psf->sf.channels * psf->bytewidth ;
-					
-				psf->sf.format |= SF_FORMAT_FLOAT ;
-
-				float32_read_init (psf) ;
+				
+		case  SF_FORMAT_ALAW :	/* 8-bit Alaw encoding. */
+				alaw_init (psf) ;
 				break ;
+	
+		case  SF_FORMAT_G721_32 :  
+				if (psf->mode == SFM_READ)
+					error = au_g72x_reader_init (psf, AU_H_G721_32) ;
+				else if (psf->mode == SFM_WRITE)
+					error = au_g72x_writer_init (psf, AU_H_G721_32) ;
+				psf->sf.seekable = SF_FALSE ;
+				break ;
 
-		default : 
-				error = SFE_AU_UNKNOWN_FORMAT ;
+		case  SF_FORMAT_G723_24 :  
+				if (psf->mode == SFM_READ)
+					error = au_g72x_reader_init (psf, AU_H_G723_24) ;
+				else if (psf->mode == SFM_WRITE)
+					error = au_g72x_writer_init (psf, AU_H_G723_24) ;
+				psf->sf.seekable = SF_FALSE ;
 				break ;
+
+		default :   break ;
 		} ;
+		
+	return error ;
+} /* au_open */
 
-	if (error)
-		return error ;
-
-	if (! psf->sf.samples && psf->blockwidth)
-		psf->sf.samples = au_fmt.datasize / psf->blockwidth ;
-
-
-	return 0 ;
-} /* au_open_read */
-
-
-/*------------------------------------------------------------------------------
-*/
-
 int
-au_open_write	(SF_PRIVATE *psf)
-{	unsigned int	encoding, format, subformat ;
-	int				error = 0 ;
+au_nh_open	(SF_PRIVATE *psf)
+{	
+	if (psf->mode == SFM_RDWR)
+		return SFE_BAD_OPEN_FORMAT ;
 
-	format = psf->sf.format & SF_FORMAT_TYPEMASK ;
-	subformat = psf->sf.format & SF_FORMAT_SUBMASK ;
-	if (format == SF_FORMAT_AU)
-		psf->endian = SF_ENDIAN_BIG ;
-	else if (format == SF_FORMAT_AULE)
-		psf->endian = SF_ENDIAN_LITTLE ;
-	else
-		return	SFE_BAD_OPEN_FORMAT ;
-		
-	if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW || 
-		subformat == SF_FORMAT_G721_32 || subformat == SF_FORMAT_G723_24)
-		psf->bytewidth = 1 ;
-	else
-		psf->bytewidth = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
-		
-	psf->sf.seekable = SF_TRUE ;
-	psf->error       = 0 ;
+	if (psf_fseek (psf->filedes, psf->dataoffset, SEEK_SET))
+		return SFE_BAD_SEEK ;
 
-	psf->blockwidth  = psf->bytewidth * psf->sf.channels ;
- 	psf->dataoffset  = AU_DATA_OFFSET ;
-	psf->datalength  = psf->blockwidth * psf->sf.samples ;
-	psf->filelength  = psf->datalength + psf->dataoffset ;
+	psf_log_printf (psf, "Headers-less u-law encoded file.\n") ;
+	psf_log_printf (psf, "Setting up for 8kHz, mono, u-law.\n") ;
+	
+	psf->sf.format = SF_FORMAT_AU | SF_FORMAT_ULAW ;
 
-	if (! (encoding = au_write_header (psf)))
-		return psf->error ;
-
-	psf->close        = (func_close)  au_close ;
-	psf->write_header = (func_wr_hdr) au_write_header ;
+ 	psf->dataoffset     = 0 ;
+	psf->endian         = 0 ;  /* Irrelevant but it must be something. */
+	psf->sf.samplerate	= 8000 ;
+	psf->sf.channels 	= 1 ;
+	psf->bytewidth   	= 1 ;	/* Before decoding */
+					
+	ulaw_init (psf) ;
 	
-	switch (encoding)
-	{	case  AU_ENCODING_PCM_8 :	/* 8-bit linear PCM. */
-				psf->chars = SF_CHARS_SIGNED ;
+	psf->close = au_close ;
 
-				error = pcm_write_init (psf) ;				
-				break ;
+	psf->blockwidth = 1 ;
+	psf->sf.samples = psf->filelength ;
+	psf->datalength = psf->filelength - AU_DATA_OFFSET ;
 
-		case  AU_ENCODING_PCM_16 :	/* 16-bit linear PCM. */
-		case  AU_ENCODING_PCM_24 :	/* 24-bit linear PCM */
-		case  AU_ENCODING_PCM_32 :	/* 32-bit linear PCM. */
-				error = pcm_write_init (psf) ;
-				break ;
+	return 0 ;
+} /* au_nh_open */
 
-		case  AU_ENCODING_FLOAT :	/* 32-bit linear PCM. */
-				error = float32_write_init (psf) ;
-				break ;
-				
-		default :   break ;
-		} ;
-		
-	return error ;
-} /* au_open_write */
-
 /*------------------------------------------------------------------------------
 */
 
@@ -310,16 +221,16 @@
 static int
 au_close	(SF_PRIVATE  *psf)
 {
-	if (psf->mode == SF_MODE_WRITE)
+	if (psf->mode == SFM_WRITE || psf->mode == SFM_RDWR)
 	{	/*  Now we know for certain the length of the file we can
 		 *  re-write correct values for the datasize header element.
 		 */
 
-		fseek (psf->file, 0, SEEK_END) ;
-		psf->filelength = ftell (psf->file) ;
+		psf_fseek (psf->filedes, 0, SEEK_END) ;
+		psf->filelength = psf_ftell (psf->filedes) ;
 
 		psf->datalength = psf->filelength - AU_DATA_OFFSET ;
-		fseek (psf->file, 0, SEEK_SET) ;
+		psf_fseek (psf->filedes, 0, SEEK_SET) ;
 		
 		psf->sf.samples = psf->datalength / psf->blockwidth ;
 		au_write_header (psf) ;
@@ -336,7 +247,7 @@
 au_write_header (SF_PRIVATE *psf)
 {	int		encoding ;
 
-	encoding = get_encoding (psf->sf.format & SF_FORMAT_SUBMASK, psf->bytewidth * 8) ;
+	encoding = au_format_to_encoding (psf->sf.format & SF_FORMAT_SUBMASK) ;
 	if (! encoding)
 	{	psf->error = SFE_BAD_OPEN_FORMAT ;
 		return	encoding ;
@@ -345,15 +256,15 @@
 	/* Reset the current header length to zero. */
 	psf->header [0] = 0 ;
 	psf->headindex = 0 ;
-	fseek (psf->file, 0, SEEK_SET) ;
+	psf_fseek (psf->filedes, 0, SEEK_SET) ;
 
 	if (psf->endian == SF_ENDIAN_BIG)
-	{	psf_binheader_writef (psf, "mL", DOTSND_MARKER, AU_DATA_OFFSET) ;
-		psf_binheader_writef (psf, "LLLL", psf->datalength, encoding, psf->sf.samplerate, psf->sf.channels) ;
+	{	psf_binheader_writef (psf, "Em4", DOTSND_MARKER, AU_DATA_OFFSET) ;
+		psf_binheader_writef (psf, "Et8444", psf->datalength, encoding, psf->sf.samplerate, psf->sf.channels) ;
 		}
 	else if  (psf->endian == SF_ENDIAN_LITTLE)
-	{	psf_binheader_writef (psf, "ml", DNSDOT_MARKER, AU_DATA_OFFSET) ;
-		psf_binheader_writef (psf, "llll", psf->datalength, encoding, psf->sf.samplerate, psf->sf.channels) ;
+	{	psf_binheader_writef (psf, "em4", DNSDOT_MARKER, AU_DATA_OFFSET) ;
+		psf_binheader_writef (psf, "et8444", psf->datalength, encoding, psf->sf.samplerate, psf->sf.channels) ;
 		}
 	else
 	{	psf->error = SFE_BAD_OPEN_FORMAT ;
@@ -361,7 +272,7 @@
 		} ;
 
 	/* Header construction complete so write it out. */
-	fwrite (psf->header, psf->headindex, 1, psf->file) ;
+	psf_fwrite (psf->header, psf->headindex, 1, psf->filedes) ;
 
 	psf->dataoffset = psf->headindex ;
 	
@@ -369,81 +280,163 @@
 } /* au_write_header */ 
 
 static int
-get_encoding (unsigned int format, unsigned int	bitwidth)
-{	if (format == SF_FORMAT_ULAW)
-		return AU_ENCODING_ULAW_8 ;
-		
-	if (format == SF_FORMAT_ALAW)
-		return AU_ENCODING_ALAW_8 ;
+au_format_to_encoding (int format)
+{	
+	switch (format)
+	{	case SF_FORMAT_PCM_S8 : 	return AU_ENCODING_PCM_8 ;		
+		case SF_FORMAT_PCM_16 :		return AU_ENCODING_PCM_16 ;
+		case SF_FORMAT_PCM_24 : 	return AU_ENCODING_PCM_24 ;
+		case SF_FORMAT_PCM_32 : 	return AU_ENCODING_PCM_32 ;
 
-	if (format == SF_FORMAT_G721_32)
-		return AU_ENCODING_ADPCM_G721_32 ;
+		case SF_FORMAT_FLOAT :		return AU_ENCODING_FLOAT ;
+		case SF_FORMAT_DOUBLE :		return AU_ENCODING_DOUBLE ;
 
-	if (format == SF_FORMAT_G723_24)
-		return AU_ENCODING_ADPCM_G723_24 ;
+		case SF_FORMAT_ULAW :		return AU_ENCODING_ULAW_8 ;
+		case SF_FORMAT_ALAW :		return AU_ENCODING_ALAW_8 ;
+		
+		case SF_FORMAT_G721_32 : 	return AU_ENCODING_ADPCM_G721_32 ;
+		case SF_FORMAT_G723_24 :	return AU_ENCODING_ADPCM_G723_24 ;
+		
+		default : break ;
+		} ;
+	return 0 ;
+} /* au_format_to_encoding */
 
-	if (format == SF_FORMAT_FLOAT)
-		return AU_ENCODING_FLOAT ;
+static int
+au_read_header (SF_PRIVATE *psf)
+{	AU_FMT	au_fmt ;
+	int		marker, dword ;
 
-	if (format != SF_FORMAT_PCM)
-		return 0 ;
+	psf_binheader_readf (psf, "pm", 0, &marker) ;
+	psf_log_printf (psf, "%D\n", marker) ;
 
-	/* For PCM encoding, the header encoding field depends on the bitwidth. */
-	switch (bitwidth)
-	{	case	8  : return AU_ENCODING_PCM_8 ;
-		case	16 : return AU_ENCODING_PCM_16 ;
-		case	24 : return AU_ENCODING_PCM_24 ;
-		case	32 : return	AU_ENCODING_PCM_32 ;
-		default : break ;
+	if (marker == DOTSND_MARKER)
+	{	psf->endian = SF_ENDIAN_BIG ;
+
+		psf_binheader_readf (psf, "E44444", &(au_fmt.dataoffset), &(au_fmt.datasize),
+					&(au_fmt.encoding), &(au_fmt.samplerate), &(au_fmt.channels)) ;
+		}
+	else if (marker == DNSDOT_MARKER)
+	{	psf->endian = SF_ENDIAN_LITTLE ;
+		psf_binheader_readf (psf, "e44444", &(au_fmt.dataoffset), &(au_fmt.datasize),
+					&(au_fmt.encoding), &(au_fmt.samplerate), &(au_fmt.channels)) ;
+		}
+	else
+		return SFE_AU_NO_DOTSND ;
+		
+	
+	psf_log_printf (psf, "  Data Offset : %d\n", au_fmt.dataoffset) ;
+	
+	if (au_fmt.datasize == -1 || au_fmt.dataoffset + au_fmt.datasize == psf->filelength)
+		psf_log_printf (psf, "  Data Size   : %d\n", au_fmt.datasize) ;
+	else if (au_fmt.dataoffset + au_fmt.datasize < psf->filelength)
+	{	psf->filelength = au_fmt.dataoffset + au_fmt.dataoffset ;
+		psf_log_printf (psf, "  Data Size   : %d\n", au_fmt.datasize) ;
+		}
+	else
+	{	dword = psf->filelength - au_fmt.dataoffset ;
+		psf_log_printf (psf, "  Data Size   : %d (should be %d)\n", au_fmt.datasize, dword) ;
+		au_fmt.datasize = dword ;
 		} ;
-	return 0 ;
-} /* get_encoding */
+		
+ 	psf->dataoffset = au_fmt.dataoffset ;
+	psf->datalength = psf->filelength - psf->dataoffset ;
 
-/*-
-static void
-endswap_au_fmt (AU_FMT *pau_fmt)
-{	pau_fmt->dataoffset = ENDSWAP_INT (pau_fmt->dataoffset) ;
-	pau_fmt->datasize   = ENDSWAP_INT (pau_fmt->datasize) ;
-	pau_fmt->encoding   = ENDSWAP_INT (pau_fmt->encoding) ;
-    pau_fmt->samplerate = ENDSWAP_INT (pau_fmt->samplerate) ;
-    pau_fmt->channels   = ENDSWAP_INT (pau_fmt->channels) ;
-} /+* endswap_au_fmt *+/
--*/
+ 	if (psf_fseek (psf->filedes, psf->dataoffset, SEEK_SET) != psf->dataoffset)
+		return SFE_BAD_SEEK ;
 
-static	char const* 
-get_encoding_str (int format)
-{	switch (format)
+	psf->close = au_close ;
+	
+	psf->sf.samplerate	= au_fmt.samplerate ;
+	psf->sf.channels 	= au_fmt.channels ;
+					
+	/* Only fill in type major. */
+	if (psf->endian == SF_ENDIAN_BIG)
+		psf->sf.format = SF_FORMAT_AU ;
+	else if (psf->endian == SF_ENDIAN_LITTLE)
+		psf->sf.format = SF_ENDIAN_LITTLE | SF_FORMAT_AU ;
+
+	psf_log_printf (psf, "  Encoding    : %d => ", au_fmt.encoding) ;
+	
+	psf->sf.format = psf->sf.format & SF_FORMAT_ENDMASK ;
+				
+	switch (au_fmt.encoding)
 	{	case  AU_ENCODING_ULAW_8 :	
-				return "8-bit ISDN u-law" ;
-										
+				psf->sf.format |= SF_FORMAT_AU | SF_FORMAT_ULAW ;
+				psf->bytewidth  = 1 ;	/* Before decoding */
+				psf_log_printf (psf, "8-bit ISDN u-law\n") ;
+				break  ;
+														
 		case  AU_ENCODING_PCM_8 :	
-				return "8-bit linear PCM" ;
+				psf->sf.format |= SF_FORMAT_AU | SF_FORMAT_PCM_S8 ;
+				psf->bytewidth  = 1 ;
+				psf_log_printf (psf, "8-bit linear PCM\n") ;
+				break  ;
 
 		case  AU_ENCODING_PCM_16 :	
-				return "16-bit linear PCM" ;
+				psf->sf.format |= SF_FORMAT_AU | SF_FORMAT_PCM_16 ;
+				psf->bytewidth  = 2 ;
+				psf_log_printf (psf, "16-bit linear PCM\n") ;
+				break  ;
 
 		case  AU_ENCODING_PCM_24 :	
-				return "24-bit linear PCM" ;
+				psf->sf.format |= SF_FORMAT_AU | SF_FORMAT_PCM_24 ;
+				psf->bytewidth  = 3 ;
+				psf_log_printf (psf, "24-bit linear PCM\n") ;
+				break  ;
 
 		case  AU_ENCODING_PCM_32 :	
-				return "32-bit linear PCM" ;
+				psf->sf.format |= SF_FORMAT_AU | SF_FORMAT_PCM_32 ;
+				psf->bytewidth  = 4 ;
+				psf_log_printf (psf, "32-bit linear PCM\n") ;
+				break  ;
 					
 		case  AU_ENCODING_FLOAT :	
-				return "32-bit float" ;
+				psf->sf.format |= SF_FORMAT_AU | SF_FORMAT_FLOAT ;
+				psf->bytewidth  = 4 ;
+				psf_log_printf (psf, "32-bit float\n") ;
+				break  ;
 					
+		case  AU_ENCODING_DOUBLE :	
+				psf->sf.format |= SF_FORMAT_AU | SF_FORMAT_DOUBLE ;
+				psf->bytewidth  = 8 ;
+				psf_log_printf (psf, "64-bit double precision float\n") ;
+				break  ;
+					
 		case  AU_ENCODING_ALAW_8 :
-				return "8-bit ISDN A-law" ;
+				psf->sf.format |= SF_FORMAT_AU | SF_FORMAT_ALAW ;
+				psf->bytewidth  = 1 ;	/* Before decoding */
+				psf_log_printf (psf, "8-bit ISDN A-law\n") ;
+				break  ;
 					
 		case  AU_ENCODING_ADPCM_G721_32 :  
-				return "G721 32kbs ADPCM" ;
+				psf->sf.format |= SF_FORMAT_AU | SF_FORMAT_G721_32 ;
+				psf->bytewidth  = 0 ;
+				psf_log_printf (psf, "G721 32kbs ADPCM\n") ;
+				break  ;
 										
 		case  AU_ENCODING_ADPCM_G723_24 :  
-				return "G723 24kbs ADPCM" ;
+				psf->sf.format |= SF_FORMAT_AU | SF_FORMAT_G723_24 ;
+				psf->bytewidth  = 0 ;
+				psf_log_printf (psf, "G723 24kbs ADPCM\n") ;
+				break  ;
 										
 		case  AU_ENCODING_NEXT :	
-				return "Weird NeXT encoding format (unsupported)" ;
+				psf_log_printf (psf, "Weird NeXT encoding format (unsupported)\n") ;
+				break  ;
+
+		default : 
+				psf_log_printf (psf, "Unknown!!\n") ;
+				break ;
 		} ;
-	return "Unknown!!" ;
-} /* get_encoding_str */	
 
+	psf_log_printf (psf, "  Sample Rate : %d\n", au_fmt.samplerate) ;
+	psf_log_printf (psf, "  Channels    : %d\n", au_fmt.channels) ;
+	
+	psf->blockwidth = psf->sf.channels * psf->bytewidth ;
+	
+	if (! psf->sf.samples && psf->blockwidth)
+		psf->sf.samples = (psf->filelength - psf->dataoffset) / psf->blockwidth ;
 
+	return 0 ;
+} /* au_read_header */
--- a/common/libsndfile/src/au.h
+++ b/common/libsndfile/src/au.h
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 1999-2001 Erik de Castro Lopo <[email protected]>
+** Copyright (C) 1999-2002 Erik de Castro Lopo <[email protected]>
 **  
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
--- a/common/libsndfile/src/au_g72x.c
+++ b/common/libsndfile/src/au_g72x.c
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 1999-2001 Erik de Castro Lopo <[email protected]>
+** Copyright (C) 1999-2002 Erik de Castro Lopo <[email protected]>
 **  
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -19,33 +19,32 @@
 #include	<stdio.h>
 #include	<unistd.h>
 #include	<string.h>
-#include	<math.h>
 
-#include	"config.h"
 #include	"sndfile.h"
+#include	"config.h"
 #include	"sfendian.h"
-#include	"floatcast.h"
+#include	"float_cast.h"
 #include	"common.h"
 #include	"au.h"
 #include	"G72x/g72x.h"
 
-static	int	au_g72x_read_block (SF_PRIVATE *psf, G72x_DATA *pg72x) ;
-static	int au_g72x_read (SF_PRIVATE *psf, G72x_DATA *pg72x, short *ptr, int len) ;
+static	int	au_g72x_decode_block (SF_PRIVATE *psf, G72x_DATA *pg72x) ;
+static	int au_g72x_read_block (SF_PRIVATE *psf, G72x_DATA *pg72x, short *ptr, sf_count_t len) ;
 
-static	int	au_g72x_write_block (SF_PRIVATE *psf, G72x_DATA *pg72x) ;
-static	int au_g72x_write (SF_PRIVATE *psf, G72x_DATA *pg72x, short *ptr, int len) ;
+static	int	au_g72x_encode_block (SF_PRIVATE *psf, G72x_DATA *pg72x) ;
+static	int au_g72x_write_block (SF_PRIVATE *psf, G72x_DATA *pg72x, short *ptr, sf_count_t len) ;
 
-static	int	au_g72x_read_s (SF_PRIVATE *psf, short *ptr, int len) ;
-static	int	au_g72x_read_i (SF_PRIVATE *psf, int *ptr, int len) ;
-static	int	au_g72x_read_f (SF_PRIVATE *psf, float *ptr, int len) ;
-static	int	au_g72x_read_d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+static	sf_count_t	au_g72x_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static	sf_count_t	au_g72x_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+static	sf_count_t	au_g72x_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+static	sf_count_t	au_g72x_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
 
-static	int	au_g72x_write_s (SF_PRIVATE *psf, short *ptr, int len) ;
-static	int	au_g72x_write_i (SF_PRIVATE *psf, int *ptr, int len) ;
-static	int	au_g72x_write_f (SF_PRIVATE *psf, float *ptr, int len) ;
-static	int	au_g72x_write_d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+static	sf_count_t	au_g72x_write_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static	sf_count_t	au_g72x_write_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+static	sf_count_t	au_g72x_write_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+static	sf_count_t	au_g72x_write_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
 
-static  long au_g72x_seek (SF_PRIVATE *psf, long offset, int whence) ;
+static  sf_count_t au_g72x_seek (SF_PRIVATE *psf, int mode, sf_count_t offset) ;
 
 static	int	au_g72x_close	(SF_PRIVATE  *psf) ;
 
@@ -61,9 +60,6 @@
 	
 	psf->sf.seekable = SF_FALSE ;
 	
-	if (psf->mode != SF_MODE_READ)
-		return SFE_BAD_MODE_RW ;
-
 	if (! (pg72x = malloc (sizeof (G72x_DATA))))
 		return SFE_MALLOC_FAILED ;
 
@@ -84,17 +80,22 @@
 				pg72x->bytesperblock = G723_24_BYTES_PER_BLOCK ;
 				bitspersample = G723_24_BITS_PER_SAMPLE ;
 				break ;
-		default : return 0 ;
+		default : return SFE_UNIMPLEMENTED ;
 		} ;
 				
-	psf->read_short  = (func_short)  au_g72x_read_s ;
-	psf->read_int    = (func_int)    au_g72x_read_i ;
-	psf->read_float  = (func_float)  au_g72x_read_f ;
-	psf->read_double = (func_double) au_g72x_read_d ;
+	psf->read_short  = au_g72x_read_s ;
+	psf->read_int    = au_g72x_read_i ;
+	psf->read_float  = au_g72x_read_f ;
+	psf->read_double = au_g72x_read_d ;
  
- 	psf->seek_func   = (func_seek)   au_g72x_seek ;
- 	psf->close       = (func_close)  au_g72x_close ;
+ 	psf->new_seek    = au_g72x_seek ;
+ 	psf->close       = au_g72x_close ;
 
+	psf->blockwidth = psf->bytewidth = 1 ;
+
+	psf->filelength = psf_get_filelen (psf->filedes) ;
+	psf->datalength = psf->filelength - psf->dataoffset ;
+
 	if (psf->datalength % pg72x->blocksize)
 		pg72x->blocks = (psf->datalength / pg72x->blocksize) + 1 ;
 	else
@@ -105,9 +106,7 @@
 	if ((psf->sf.samples * bitspersample) / 8 != psf->datalength)
 		psf_log_printf (psf, "*** Warning : weird psf->datalength.\n") ;
 			
-	psf->blockwidth = psf->bytewidth = 1 ;
-
-	au_g72x_read_block (psf, pg72x) ;
+	au_g72x_decode_block (psf, pg72x) ;
 	
 	return 0 ;	
 } /* au_g72x_reader_init */
@@ -119,12 +118,10 @@
 int	
 au_g72x_writer_init (SF_PRIVATE *psf, int codec)
 {	G72x_DATA	*pg72x ;
+	int bitspersample ;
 	
 	psf->sf.seekable = SF_FALSE ;
 	
-	if (psf->mode != SF_MODE_WRITE)
-		return SFE_BAD_MODE_RW ;
-
 	if (! (pg72x = malloc (sizeof (G72x_DATA))))
 		return SFE_MALLOC_FAILED ;
 
@@ -137,36 +134,48 @@
 	{	case AU_H_G721_32 :
 				g72x_writer_init (pg72x, G721_32_BITS_PER_SAMPLE) ;
 				pg72x->bytesperblock = G721_32_BYTES_PER_BLOCK ;
+				bitspersample = G721_32_BITS_PER_SAMPLE ;
 				break ;
 				
 		case AU_H_G723_24:
 				g72x_writer_init (pg72x, G723_24_BITS_PER_SAMPLE) ;
 				pg72x->bytesperblock = G723_24_BYTES_PER_BLOCK ;
+				bitspersample = G723_24_BITS_PER_SAMPLE ;
 				break ;
-		default : return 0 ;
+		default : return SFE_UNIMPLEMENTED ;
 		} ;
 
-	psf->write_short  = (func_short)  au_g72x_write_s ;
-	psf->write_int    = (func_int)    au_g72x_write_i ;
-	psf->write_float  = (func_float)  au_g72x_write_f ;
-	psf->write_double = (func_double) au_g72x_write_d ;
+	psf->write_short  = au_g72x_write_s ;
+	psf->write_int    = au_g72x_write_i ;
+	psf->write_float  = au_g72x_write_f ;
+	psf->write_double = au_g72x_write_d ;
  
- 	psf->seek_func   = (func_seek)    au_g72x_seek ;
- 	psf->close       = (func_close)   au_g72x_close ;
+ 	psf->close       = au_g72x_close ;
  
 	psf->blockwidth = psf->bytewidth = 1 ;
 
-	return 0 ;
-} /* au_g72x_writer_init */
+	psf->filelength = psf_get_filelen (psf->filedes) ;
+	psf->datalength = psf->filelength - psf->dataoffset ;
 
+	if (psf->datalength % pg72x->blocksize)
+		pg72x->blocks = (psf->datalength / pg72x->blocksize) + 1 ;
+	else
+		pg72x->blocks = psf->datalength / pg72x->blocksize ;
 
+	psf->sf.samples = (8 * psf->datalength) / bitspersample ;
 
+	if ((psf->sf.samples * bitspersample) / 8 != psf->datalength)
+		psf_log_printf (psf, "*** Warning : weird psf->datalength.\n") ;
+
+	return 0 ;
+} /* au_g72x_writer_init */
+
 /*============================================================================================
 ** G721 Read Functions.
 */
 
 static int
-au_g72x_read_block (SF_PRIVATE *psf, G72x_DATA *pg72x)
+au_g72x_decode_block (SF_PRIVATE *psf, G72x_DATA *pg72x)
 {	int	k ;
 	
 	pg72x->blockcount ++ ;
@@ -177,7 +186,7 @@
 		return 1 ;
 		} ;
 
-	if ((k = fread (pg72x->block, 1, pg72x->bytesperblock, psf->file)) != pg72x->bytesperblock)
+	if ((k = psf_fread (pg72x->block, 1, pg72x->bytesperblock, psf->filedes)) != pg72x->bytesperblock)
 		psf_log_printf (psf, "*** Warning : short read (%d != %d).\n", k, pg72x->bytesperblock) ;
 
 	pg72x->blocksize = k ;
@@ -184,11 +193,11 @@
 	g72x_decode_block (pg72x) ;
 
 	return 1 ;
-} /* au_g72x_read_block */
+} /* au_g72x_decode_block */
 
-static int 
-au_g72x_read (SF_PRIVATE *psf, G72x_DATA *pg72x, short *ptr, int len)
-{	int		count, total = 0, index = 0 ;
+static int
+au_g72x_read_block (SF_PRIVATE *psf, G72x_DATA *pg72x, short *ptr, sf_count_t len)
+{	sf_count_t	count, total = 0, index = 0 ;
 
 	while (index < len)
 	{	if (pg72x->blockcount >= pg72x->blocks && pg72x->samplecount >= pg72x->samplesperblock)
@@ -197,7 +206,7 @@
 			} ;
 		
 		if (pg72x->samplecount >= pg72x->samplesperblock)
-			au_g72x_read_block (psf, pg72x) ;
+			au_g72x_decode_block (psf, pg72x) ;
 		
 		count = pg72x->samplesperblock - pg72x->samplecount ;
 		count = (len - index > count) ? count : len - index ;
@@ -209,28 +218,28 @@
 		} ;
 
 	return total ;		
-} /* au_g72x_read */
+} /* au_g72x_read_block */
 
-static int		
-au_g72x_read_s (SF_PRIVATE *psf, short *ptr, int len)
+static sf_count_t		
+au_g72x_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
 {	G72x_DATA 	*pg72x ; 
-	int				total ;
+	sf_count_t		total ;
 
 	if (! psf->fdata)
 		return 0 ;
 	pg72x = (G72x_DATA*) psf->fdata ;
 	
-	total = au_g72x_read (psf, pg72x, ptr, len) ;
+	total = au_g72x_read_block (psf, pg72x, ptr, len) ;
 
 	return total ;
 } /* au_g72x_read_s */
 
-static int		
-au_g72x_read_i  (SF_PRIVATE *psf, int *ptr, int len)
+static sf_count_t		
+au_g72x_read_i  (SF_PRIVATE *psf, int *ptr, sf_count_t len)
 {	G72x_DATA *pg72x ; 
 	short		*sptr ;
 	int			k, bufferlen, readcount = 0, count ;
-	int			index = 0, total = 0 ;
+	sf_count_t		index = 0, total = 0 ;
 
 	if (! psf->fdata)
 		return 0 ;
@@ -240,9 +249,10 @@
 	bufferlen = SF_BUFFER_LEN / sizeof (short) ;
 	while (len > 0)
 	{	readcount = (len >= bufferlen) ? bufferlen : len ;
-		count = au_g72x_read (psf, pg72x, sptr, readcount) ;
+		count = au_g72x_read_block (psf, pg72x, sptr, readcount) ;
+		
 		for (k = 0 ; k < readcount ; k++)
-			ptr [index+k] = (int) (sptr [k]) ;
+			ptr [index + k] = sptr [k] << 16 ;
 		index += readcount ;
 		total += count ;
 		len -= readcount ;
@@ -250,12 +260,12 @@
 	return total ;
 } /* au_g72x_read_i */
 
-static int
-au_g72x_read_f  (SF_PRIVATE *psf, float *ptr, int len)
+static sf_count_t
+au_g72x_read_f  (SF_PRIVATE *psf, float *ptr, sf_count_t len)
 {	G72x_DATA *pg72x ; 
 	short		*sptr ;
 	int			k, bufferlen, readcount = 0, count ;
-	int			index = 0, total = 0 ;
+	sf_count_t		index = 0, total = 0 ;
 	float 		normfact ;
 
 	if (! psf->fdata)
@@ -268,9 +278,9 @@
 	bufferlen = SF_BUFFER_LEN / sizeof (short) ;
 	while (len > 0)
 	{	readcount = (len >= bufferlen) ? bufferlen : len ;
-		count = au_g72x_read (psf, pg72x, sptr, readcount) ;
+		count = au_g72x_read_block (psf, pg72x, sptr, readcount) ;
 		for (k = 0 ; k < readcount ; k++)
-			ptr [index+k] = normfact * sptr [k] ;
+			ptr [index + k] = normfact * sptr [k] ;
 		index += readcount ;
 		total += count ;
 		len -= readcount ;
@@ -279,12 +289,12 @@
 	return total ;
 } /* au_g72x_read_f */
 
-static int		
-au_g72x_read_d  (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+static sf_count_t		
+au_g72x_read_d  (SF_PRIVATE *psf, double *ptr, sf_count_t len)
 {	G72x_DATA *pg72x ; 
 	short		*sptr ;
 	int			k, bufferlen, readcount = 0, count ;
-	int			index = 0, total = 0 ;
+	sf_count_t		index = 0, total = 0 ;
 	double		normfact ;
 	
 	if (! psf->fdata)
@@ -291,15 +301,15 @@
 		return 0 ;
 	pg72x = (G72x_DATA*) psf->fdata ;
 	
-	normfact = (normalize) ? 1.0 / ((double) 0x8000) : 1.0 ;
+	normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x8000) : 1.0 ;
 
 	sptr = (short*) psf->buffer ;
 	bufferlen = SF_BUFFER_LEN / sizeof (short) ;
 	while (len > 0)
 	{	readcount = (len >= bufferlen) ? bufferlen : len ;
-		count = au_g72x_read (psf, pg72x, sptr, readcount) ;
+		count = au_g72x_read_block (psf, pg72x, sptr, readcount) ;
 		for (k = 0 ; k < readcount ; k++)
-			ptr [index+k] = normfact * (double) (sptr [k]) ;
+			ptr [index + k] = normfact * (double) (sptr [k]) ;
 		index += readcount ;
 		total += count ;
 		len -= readcount ;
@@ -308,10 +318,12 @@
 	return total ;
 } /* au_g72x_read_d */
 
-static long    
-au_g72x_seek   (SF_PRIVATE *psf, long offset, int whence)
+static sf_count_t    
+au_g72x_seek   (SF_PRIVATE *psf, int mode, sf_count_t offset)
 {
 
+	psf_log_printf (psf, "seek unsupported\n") ;
+
 	/*	No simple solution. To do properly, would need to seek
 	**	to start of file and decode everything up to seek position.
 	**	Maybe implement SEEK_SET to 0 only?
@@ -328,7 +340,7 @@
 **	
 **		if (! (psf->datalength && psf->dataoffset))
 **		{	psf->error = SFE_BAD_SEEK ;
-**			return	((long) -1) ;
+**			return	((sf_count_t) -1) ;
 **			} ;
 **			
 **		samplecount = (8 * psf->datalength) / G721_32_BITS_PER_SAMPLE ;
@@ -337,7 +349,7 @@
 **		{	case SEEK_SET :
 **					if (offset < 0 || offset > samplecount)
 **					{	psf->error = SFE_BAD_SEEK ;
-**						return	((long) -1) ;
+**						return	((sf_count_t) -1) ;
 **						} ;
 **					newblock  = offset / pg72x->samplesperblock ;
 **					newsample = offset % pg72x->samplesperblock ;
@@ -346,7 +358,7 @@
 **			case SEEK_CUR :
 **					if (psf->current + offset < 0 || psf->current + offset > samplecount)
 **					{	psf->error = SFE_BAD_SEEK ;
-**						return	((long) -1) ;
+**						return	((sf_count_t) -1) ;
 **						} ;
 **					newblock  = (8 * (psf->current + offset)) / pg72x->samplesperblock ;
 **					newsample = (8 * (psf->current + offset)) % pg72x->samplesperblock ;
@@ -355,7 +367,7 @@
 **			case SEEK_END :
 **					if (offset > 0 || samplecount + offset < 0)
 **					{	psf->error = SFE_BAD_SEEK ;
-**						return	((long) -1) ;
+**						return	((sf_count_t) -1) ;
 **						} ;
 **					newblock  = (samplecount + offset) / pg72x->samplesperblock ;
 **					newsample = (samplecount + offset) % pg72x->samplesperblock ;
@@ -363,19 +375,19 @@
 **					
 **			default : 
 **					psf->error = SFE_BAD_SEEK ;
-**					return	((long) -1) ;
+**					return	((sf_count_t) -1) ;
 **			} ;
 **			
-**		if (psf->mode == SF_MODE_READ)
-**		{	fseek (psf->file, (int) (psf->dataoffset + newblock * pg72x->blocksize), SEEK_SET) ;
+**		if (psf->mode == SFM_READ)
+**		{	psf_fseek (psf->filedes, psf->dataoffset + newblock * pg72x->blocksize, SEEK_SET) ;
 **			pg72x->blockcount  = newblock ;
-**			au_g72x_read_block (psf, pg72x) ;
+**			au_g72x_decode_block (psf, pg72x) ;
 **			pg72x->samplecount = newsample ;
 **			}
 **		else
 **		{	/+* What to do about write??? *+/ 
 **			psf->error = SFE_BAD_SEEK ;
-**			return	((long) -1) ;
+**			return	((sf_count_t) -1) ;
 **			} ;
 **	
 **		psf->current = newblock * pg72x->samplesperblock + newsample ;
@@ -388,8 +400,8 @@
 ** G72x Write Functions.
 */
 
-static int		
-au_g72x_write_block (SF_PRIVATE *psf, G72x_DATA *pg72x)
+static int
+au_g72x_encode_block (SF_PRIVATE *psf, G72x_DATA *pg72x)
 {	int k ;
 
 	/* Encode the samples. */
@@ -396,7 +408,7 @@
 	g72x_encode_block (pg72x) ;
 
 	/* Write the block to disk. */
-	if ((k = fwrite (pg72x->block, 1, pg72x->blocksize, psf->file)) != pg72x->blocksize)
+	if ((k = psf_fwrite (pg72x->block, 1, pg72x->blocksize, psf->filedes)) != pg72x->blocksize)
 		psf_log_printf (psf, "*** Warning : short write (%d != %d).\n", k, pg72x->blocksize) ;
 
 	pg72x->samplecount = 0 ;
@@ -406,11 +418,11 @@
 	memset (pg72x->samples, 0, G72x_BLOCK_SIZE * sizeof (short)) ;
 			
 	return 1 ;
-} /* au_g72x_write_block */
+} /* au_g72x_encode_block */
 
-static int 
-au_g72x_write (SF_PRIVATE *psf, G72x_DATA *pg72x, short *ptr, int len)
-{	int		count, total = 0, index = 0 ;
+static int
+au_g72x_write_block (SF_PRIVATE *psf, G72x_DATA *pg72x, short *ptr, sf_count_t len)
+{	sf_count_t	count, total = 0, index = 0 ;
 	
 	while (index < len)
 	{	count = pg72x->samplesperblock - pg72x->samplecount ;
@@ -424,32 +436,32 @@
 		total = index ;
 
 		if (pg72x->samplecount >= pg72x->samplesperblock)
-			au_g72x_write_block (psf, pg72x) ;	
+			au_g72x_encode_block (psf, pg72x) ;	
 		} ;
 
 	return total ;		
-} /* au_g72x_write */
+} /* au_g72x_write_block */
 
-static int		
-au_g72x_write_s (SF_PRIVATE *psf, short *ptr, int len)
+static sf_count_t		
+au_g72x_write_s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
 {	G72x_DATA 	*pg72x ; 
-	int				total ;
+	sf_count_t			total ;
 
 	if (! psf->fdata)
 		return 0 ;
 	pg72x = (G72x_DATA*) psf->fdata ;
 	
-	total = au_g72x_write (psf, pg72x, ptr, len) ;
+	total = au_g72x_write_block (psf, pg72x, ptr, len) ;
 
 	return total ;
 } /* au_g72x_write_s */
 
-static int		
-au_g72x_write_i  (SF_PRIVATE *psf, int *ptr, int len)
+static sf_count_t		
+au_g72x_write_i  (SF_PRIVATE *psf, int *ptr, sf_count_t len)
 {	G72x_DATA *pg72x ; 
 	short		*sptr ;
 	int			k, bufferlen, writecount = 0, count ;
-	int			index = 0, total = 0 ;
+	sf_count_t		index = 0, total = 0 ;
 
 	if (! psf->fdata)
 		return 0 ;
@@ -460,8 +472,14 @@
 	while (len > 0)
 	{	writecount = (len >= bufferlen) ? bufferlen : len ;
 		for (k = 0 ; k < writecount ; k++)
-			sptr [k] = ptr [index+k] ;
-		count = au_g72x_write (psf, pg72x, sptr, writecount) ;
+			sptr [k] = ptr [index + k] >> 16 ;
+		count = au_g72x_write_block (psf, pg72x, sptr, writecount) ;
+		
+if (count != writecount)
+{	printf ("count != writecount\n") ;
+	exit (1) ;
+	} ;
+
 		index += writecount ;
 		total += count ;
 		len -= writecount ;
@@ -469,8 +487,8 @@
 	return total ;
 } /* au_g72x_write_i */
 
-static int		
-au_g72x_write_f  (SF_PRIVATE *psf, float *ptr, int len)
+static sf_count_t		
+au_g72x_write_f  (SF_PRIVATE *psf, float *ptr, sf_count_t len)
 {	G72x_DATA *pg72x ; 
 	short		*sptr ;
 	int			k, bufferlen, writecount = 0, count ;
@@ -488,8 +506,8 @@
 	while (len > 0)
 	{	writecount = (len >= bufferlen) ? bufferlen : len ;
 		for (k = 0 ; k < writecount ; k++)
-			sptr [k] = FLOAT_TO_SHORT (normfact * ptr [index+k])  ;
-		count = au_g72x_write (psf, pg72x, sptr, writecount) ;
+			sptr [k] = lrintf (normfact * ptr [index + k])  ;
+		count = au_g72x_write_block (psf, pg72x, sptr, writecount) ;
 		index += writecount ;
 		total += count ;
 		len -= writecount ;
@@ -497,8 +515,8 @@
 	return total ;
 } /* au_g72x_write_f */
 
-static int		
-au_g72x_write_d  (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+static sf_count_t
+au_g72x_write_d  (SF_PRIVATE *psf, double *ptr, sf_count_t len)
 {	G72x_DATA *pg72x ; 
 	short		*sptr ;
 	int			k, bufferlen, writecount = 0, count ;
@@ -509,7 +527,7 @@
 		return 0 ;
 	pg72x = (G72x_DATA*) psf->fdata ;
 	
-	normfact = (normalize) ? ((float) 0x8000) : 1.0 ;
+	normfact = (psf->norm_double == SF_TRUE) ? ((float) 0x8000) : 1.0 ;
 
 	sptr = (short*) psf->buffer ;
 	bufferlen = ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (short) ;
@@ -516,8 +534,8 @@
 	while (len > 0)
 	{	writecount = (len >= bufferlen) ? bufferlen : len ;
 		for (k = 0 ; k < writecount ; k++)
-			sptr [k] = DOUBLE_TO_SHORT (normfact * ptr [index+k])  ;
-		count = au_g72x_write (psf, pg72x, sptr, writecount) ;
+			sptr [k] = lrint (normfact * ptr [index + k])  ;
+		count = au_g72x_write_block (psf, pg72x, sptr, writecount) ;
 		index += writecount ;
 		total += count ;
 		len -= writecount ;
@@ -525,7 +543,7 @@
 	return total ;
 } /* au_g72x_write_d */
 
-static int	
+static int
 au_g72x_close	(SF_PRIVATE  *psf)
 {	G72x_DATA *pg72x ; 
 
@@ -534,20 +552,20 @@
 
 	pg72x = (G72x_DATA*) psf->fdata ;
 
-	if (psf->mode == SF_MODE_WRITE)
+	if (psf->mode == SFM_WRITE)
 	{	/*	If a block has been partially assembled, write it out
 		**	as the final block.
 		*/
 	
 		if (pg72x->samplecount && pg72x->samplecount < G72x_BLOCK_SIZE)
-			au_g72x_write_block (psf, pg72x) ;	
+			au_g72x_encode_block (psf, pg72x) ;	
 
 		/*  Now we know for certain the length of the file we can
 		**  re-write correct values for the RIFF and data chunks.
 		*/
 		
-		fseek (psf->file, 0, SEEK_END) ;
-		psf->filelength = ftell (psf->file) ;
+		psf_fseek (psf->filedes, 0, SEEK_END) ;
+		psf->filelength = psf_ftell (psf->filedes) ;
 
 		psf->sf.samples = pg72x->samplesperblock * pg72x->blockcount ;
 		psf->datalength = psf->filelength - psf->dataoffset ;
--- /dev/null
+++ b/common/libsndfile/src/command.c
@@ -1,0 +1,226 @@
+/*
+** Copyright (C) 2001-2002 Erik de Castro Lopo <[email protected]>
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+** 
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+** 
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include	<stdio.h>
+#include	<unistd.h>
+#include	<string.h>
+#include	<math.h>
+
+#include	"sndfile.h"
+#include	"config.h"
+#include	"common.h"
+
+static SF_FORMAT_INFO simple_formats [] =
+{
+	{	SF_FORMAT_AIFF | SF_FORMAT_PCM_16,
+		"AIFF (Apple/SGI 16 bit PCM)", "aiff" 
+		},
+	
+	{	SF_FORMAT_AIFF | SF_FORMAT_FLOAT,
+		"AIFF (Apple/SGI 32 bit float)", "aifc" 
+		},
+
+	{	SF_FORMAT_AIFF | SF_FORMAT_PCM_S8,
+		"AIFF (Apple/SGI 8 bit PCM)", "aiff"
+		},
+
+	{	SF_FORMAT_AU | SF_FORMAT_PCM_16,
+		"AU (Sun/Next 16 bit PCM)", "au"
+		},
+		
+	{	SF_FORMAT_AU | SF_FORMAT_ULAW,
+		"AU (Sun/Next 8-bit u-law)", "au"
+		},
+		
+	{	SF_FORMAT_WAV | SF_FORMAT_PCM_16,
+		"WAV (Microsoft 16 bit PCM)", "wav"
+		},
+
+	{	SF_FORMAT_WAV | SF_FORMAT_FLOAT,
+		"WAV (Microsoft 32 bit float)", "wav"
+		},
+
+	{	SF_FORMAT_WAV | SF_FORMAT_IMA_ADPCM,
+		"WAV (Microsoft 4 bit IMA ADPCM)", "wav"
+		},
+		
+	{	SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM,
+		"WAV (Microsoft 4 bit MS ADPCM)", "wav"
+		},
+	
+	{	SF_FORMAT_WAV | SF_FORMAT_PCM_U8,
+		"WAV (Microsoft 8 bit PCM)", "wav"
+		},
+
+} ; /* simple_formats */
+
+int		
+psf_get_format_simple_count	(void)
+{	return (sizeof (simple_formats) / sizeof (SF_FORMAT_INFO)) ;
+} /* psf_get_format_simple_count */
+
+int
+psf_get_format_simple (SF_FORMAT_INFO *data) 
+{	int index ;
+
+	if (data->format < 0 || data->format >= (SIGNED_SIZEOF (simple_formats) / SIGNED_SIZEOF (SF_FORMAT_INFO)))
+		return SFE_BAD_CONTROL_CMD ;
+
+	index = data->format ;
+	memcpy (data, &(simple_formats [index]), SIGNED_SIZEOF (SF_FORMAT_INFO)) ;
+	
+	return 0 ;
+} /* psf_get_format_simple */
+
+/*============================================================================
+** Major format info.
+*/
+
+static SF_FORMAT_INFO major_formats [] =
+{
+	{	SF_FORMAT_AIFF,		"AIFF (Apple/SGI)", 			"aiff" 	},
+	{	SF_FORMAT_AU,		"AU (Sun/NeXT)", 				"au"	},
+	{	SF_FORMAT_SVX,		"IFF (Amiga IFF/SVX8/SV16)", 	"iff"	},
+	{	SF_FORMAT_PAF,		"PAF (Ensoniq PARIS)", 			"paf"	},
+	{	SF_FORMAT_RAW,		"RAW header-less",		 		"raw"	},
+	/* Not ready for mainstream use yet.
+	{	SF_FORMAT_SD2,		"SD2 (Sound Designer II)", 		"sd2"	},
+	*/
+	{	SF_FORMAT_IRCAM,	"SF (Berkeley/IRCAM/CARL)", 	"sf"	},
+	{	SF_FORMAT_VOC,		"VOC (Creative Labs)",			"voc"	},
+	{	SF_FORMAT_W64,		"W64 (SoundFoundry WAVE 64)",	"w64"	},
+	{	SF_FORMAT_WAV,		"WAV (Microsoft)", 				"wav"	},
+	{	SF_FORMAT_NIST,		"WAV (Sphere NIST)", 			"wav"	},
+
+} ; /* major_formats */
+
+int		
+psf_get_format_major_count	(void)
+{	return (sizeof (major_formats) / sizeof (SF_FORMAT_INFO)) ;
+} /* psf_get_format_major_count */
+
+int
+psf_get_format_major (SF_FORMAT_INFO *data) 
+{	int index ;
+
+	if (data->format < 0 || data->format >= (SIGNED_SIZEOF (major_formats) / SIGNED_SIZEOF (SF_FORMAT_INFO)))
+		return SFE_BAD_CONTROL_CMD ;
+
+	index = data->format ;
+	memcpy (data, &(major_formats [index]), SIGNED_SIZEOF (SF_FORMAT_INFO)) ;
+	
+	return 0 ;
+} /* psf_get_format_major */
+
+/*============================================================================
+** Subtype format info.
+*/
+
+static SF_FORMAT_INFO subtype_formats [] =
+{
+	{	SF_FORMAT_PCM_S8,		"Signed 8 bit PCM",		NULL },
+	{	SF_FORMAT_PCM_16,		"Signed 16 bit PCM",	NULL },
+	{	SF_FORMAT_PCM_24,		"Signed 24 bit PCM",	NULL },
+	{	SF_FORMAT_PCM_32,		"Signed 32 bit PCM",	NULL },
+
+	{	SF_FORMAT_PCM_U8,		"Unsigned 8 bit PCM",	NULL },
+	
+	{	SF_FORMAT_FLOAT,		"32 bit float",			NULL },
+	{	SF_FORMAT_DOUBLE,		"64 bit float",			NULL },
+	
+	{	SF_FORMAT_ULAW,			"U-Law",				NULL },
+	{	SF_FORMAT_ALAW,			"A-Law",				NULL },
+	{	SF_FORMAT_IMA_ADPCM,	"IMA ADPCM",			NULL },
+	{	SF_FORMAT_MS_ADPCM,		"Microsoft ADPCM",		NULL },
+
+	{	SF_FORMAT_GSM610,		"GSM 6.10",				NULL },
+
+	{	SF_FORMAT_G721_32,		"32kbs G721 ADPCM",		NULL },
+	{	SF_FORMAT_G723_24,		"24kbs G723 ADPCM",		NULL },
+
+	{	SF_FORMAT_DWVW_12,		"12 bit DWVW",			NULL },
+	{	SF_FORMAT_DWVW_16,		"16 bit DWVW",			NULL },
+	{	SF_FORMAT_DWVW_24,		"24 bit DWVW",			NULL },
+
+} ; /* subtype_formats */
+
+int		
+psf_get_format_subtype_count	(void)
+{	return (sizeof (subtype_formats) / sizeof (SF_FORMAT_INFO)) ;
+} /* psf_get_format_subtype_count */
+
+int
+psf_get_format_subtype (SF_FORMAT_INFO *data) 
+{	int index ;
+
+	if (data->format < 0 || data->format >= (SIGNED_SIZEOF (subtype_formats) / SIGNED_SIZEOF (SF_FORMAT_INFO)))
+		return SFE_BAD_CONTROL_CMD ;
+
+	index = data->format ;
+	memcpy (data, &(subtype_formats [index]), sizeof (SF_FORMAT_INFO)) ;
+	
+	return 0 ;
+} /* psf_get_format_subtype */
+
+/*==============================================================================
+*/
+
+double
+psf_calc_signal_max (SF_PRIVATE *psf)
+{	sf_count_t	position ;
+	double 		max_val = 0.0, temp, *data ;
+	int			k, len, readcount, save_state ;
+
+	/* If the file is not seekable, there is nothing we can do. */
+	if (! psf->sf.seekable)
+	{	psf->error = SFE_NOT_SEEKABLE ;
+		return	0.0 ;
+		} ;
+		
+	if (! psf->read_double)
+	{	psf->error = SFE_UNIMPLEMENTED ;
+		return	0.0 ;
+		} ;
+		
+	save_state = sf_command ((SNDFILE*) psf, SFC_GET_NORM_DOUBLE, NULL, 0) ;
+	sf_command ((SNDFILE*) psf, SFC_SET_NORM_DOUBLE, NULL, SF_FALSE) ;
+	
+	/* Brute force. Read the whole file and find the biggest sample. */
+	position = sf_seek ((SNDFILE*) psf, 0, SEEK_CUR) ; /* Get current position in file */
+	sf_seek ((SNDFILE*) psf, 0, SEEK_SET) ;			/* Go to start of file. */
+	
+	len = sizeof (psf->buffer) / sizeof (double) ;
+	
+	data = (double*) psf->buffer ;
+	
+	readcount = len ;
+	while (readcount == len)
+	{	readcount = sf_read_double ((SNDFILE*) psf, data, len) ;
+		for (k = 0 ; k < len ; k++)
+		{	temp = fabs (data [k]) ;
+			max_val  = temp > max_val ? temp : max_val ;
+			} ;
+		} ;
+	
+	sf_seek ((SNDFILE*) psf, position, SEEK_SET) ;		/* Return to original position. */
+	
+	sf_command ((SNDFILE*) psf, SFC_SET_NORM_DOUBLE, NULL, save_state) ;
+
+	return	max_val ;
+} /* psf_calc_signal_max */
+
--- a/common/libsndfile/src/common.c
+++ b/common/libsndfile/src/common.c
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 1999-2001 Erik de Castro Lopo <[email protected]>
+** Copyright (C) 1999-2002 Erik de Castro Lopo <[email protected]>
 **  
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -29,21 +29,114 @@
 */
 
 void
-endswap_short_array (short *ptr, int len)
-{	int k ;
-	for (k = 0 ; k < len ; k++)
-		ptr[k] = ((((ptr[k])>>8)&0xFF)|(((ptr[k])&0xFF)<<8)) ;
+endswap_short_array (short *ptr, sf_count_t len)
+{	unsigned char *ucptr, temp ;
+
+	ucptr = (unsigned char *) ptr ;
+	while (len > 0)
+	{	len -- ;
+		temp = ucptr [2 * len] ;
+		ucptr [2 * len] = ucptr [2 * len + 1] ;
+		ucptr [2 * len + 1] = temp ;
+		} ;
 } /* endswap_short_array */
 
 void
-endswap_int_array (int *ptr, int len)
-{	int k ;
-	for (k = 0 ; k < len ; k++)
-		ptr[k] = ((((ptr[k])>>24)&0xFF)|(((ptr[k])>>8)&0xFF00)|
-					(((ptr[k])&0xFF00)<<8)|(((ptr[k])&0xFF)<<24)) ;		
+endswap_int_array (int *ptr, sf_count_t len)
+{	unsigned char *ucptr, temp ;
+	
+	ucptr = (unsigned char *) ptr ;
+	while (len > 0)
+	{	len -- ;
+
+		temp = ucptr [4 * len] ;
+		ucptr [4 * len] = ucptr [4 * len + 3] ;
+		ucptr [4 * len + 3] = temp ;
+
+		temp = ucptr [4 * len + 1] ;
+		ucptr [4 * len + 1] = ucptr [4 * len + 2] ;
+		ucptr [4 * len + 2] = temp ;
+		} ;
 } /* endswap_int_array */
 
+/*	This function assumes that sizeof (long) == 8, but works correctly even 
+**	is sizeof (long) == 4.
+*/
+void
+endswap_long_array (long *ptr, sf_count_t len)
+{	unsigned char *ucptr, temp ;
+	
+	ucptr = (unsigned char *) ptr ;
+	while (len > 0)
+	{	len -- ;
+	
+		temp = ucptr [8 * len] ;
+		ucptr [8 * len] = ucptr [8 * len + 7] ;
+		ucptr [8 * len + 7] = temp ;
+
+		temp = ucptr [8 * len + 1] ;
+		ucptr [8 * len + 1] = ucptr [8 * len + 6] ;
+		ucptr [8 * len + 6] = temp ;
+		
+		temp = ucptr [8 * len + 2] ;
+		ucptr [8 * len + 2] = ucptr [8 * len + 5] ;
+		ucptr [8 * len + 5] = temp ;
+		
+		temp = ucptr [8 * len + 3] ;
+		ucptr [8 * len + 3] = ucptr [8 * len + 4] ;
+		ucptr [8 * len + 4] = temp ;
+		} ;
+} /* endswap_long_array */
+
 /*-----------------------------------------------------------------------------------------------
+*/
+
+int 
+subformat_to_bytewidth (int format)
+{
+	switch (format)
+	{	case SF_FORMAT_PCM_U8 :
+		case SF_FORMAT_PCM_S8 :
+				return 1 ;
+		case SF_FORMAT_PCM_16 :
+				return 2 ;
+		case SF_FORMAT_PCM_24 :
+				return 3 ;
+		case SF_FORMAT_PCM_32 :
+		case SF_FORMAT_FLOAT :
+				return 4 ;
+		case SF_FORMAT_DOUBLE :
+				return 8 ;
+		};
+	
+	return 0 ;
+} /* subformat_to_bytewidth */
+
+int 
+s_bitwidth_to_subformat (int bits)
+{	static int array [] = 
+	{	SF_FORMAT_PCM_S8, SF_FORMAT_PCM_16, SF_FORMAT_PCM_24, SF_FORMAT_PCM_32 
+		} ;
+		
+	if (bits < 8 || bits > 32)
+		return 0 ;
+		
+	return array [((bits + 7) / 8) - 1] ;
+} /* bitwidth_to_subformat */
+
+int 
+u_bitwidth_to_subformat (int bits)
+{	static int array [] = 
+	{	SF_FORMAT_PCM_U8, SF_FORMAT_PCM_16, SF_FORMAT_PCM_24, SF_FORMAT_PCM_32 
+		} ;
+		
+	if (bits < 8 || bits > 32)
+		return 0 ;
+		
+	return array [((bits + 7) / 8) - 1] ;
+} /* bitwidth_to_subformat */
+
+/*-----------------------------------------------------------------------------------------------
 ** psf_log_printf allows libsndfile internal functions to print to an internal logbuffer which
 ** can later be displayed. 
 ** The format specifiers are as for printf but without the field width and other modifiers.
@@ -52,17 +145,20 @@
 ** logbuffer array.  
 */
 
-#define psf_putchar(a,b)									\
+#define LOG_PUTCHAR(a,b)									\
 			if ((a)->logindex < SF_BUFFER_LEN - 1)			\
 			{	(a)->logbuffer [(a)->logindex++] = (b) ;	\
 				(a)->logbuffer [(a)->logindex] = 0 ;		\
-				} ;
+				}											\
+			else											\
+				break ;
 
 void
 psf_log_printf (SF_PRIVATE *psf, char *format, ...)
-{	va_list	ap ;
-	int     d, tens, shift ;
-	char    c, *strptr, istr [5] ;
+{	va_list			ap ;
+	unsigned int	u ;
+	int     		d, tens, shift ;
+	char    		c, *strptr, istr [5] ;
 
 	va_start(ap, format);
 	
@@ -70,7 +166,7 @@
 	
 	while ((c = *format++))
 	{	if (c != '%')
-		{	psf_putchar (psf, c) ;
+		{	LOG_PUTCHAR (psf, c) ;
 			continue ;
 			} ;
 		
@@ -78,7 +174,7 @@
 		{	case 's': /* string */
 					strptr = va_arg (ap, char *) ;
 					while (*strptr)
-						psf_putchar (psf, *strptr++) ;
+						LOG_PUTCHAR (psf, *strptr++) ;
 					break;
 		    
 			case 'd': /* int */
@@ -85,11 +181,11 @@
 					d = va_arg (ap, int) ;
 
 					if (d == 0)
-					{	psf_putchar (psf, '0') ;
+					{	LOG_PUTCHAR (psf, '0') ;
 						break ;
 						} 
 					if (d < 0)
-					{	psf_putchar (psf, '-') ;
+					{	LOG_PUTCHAR (psf, '-') ;
 						d = -d ;
 						} ;
 					tens = 1 ;
@@ -96,17 +192,39 @@
 					while (d / tens >= 10) 
 						tens *= 10 ;
 					while (tens > 0)
-					{	psf_putchar (psf, '0' + d / tens) ;
+					{	LOG_PUTCHAR (psf, '0' + d / tens) ;
 						d %= tens ;
 						tens /= 10 ;
 						} ;
 					break;
 					
+			case 'u': /* unsigned int */
+					u = va_arg (ap, unsigned int) ;
+
+					if (u == 0)
+					{	LOG_PUTCHAR (psf, '0') ;
+						break ;
+						} 
+					tens = 1 ;
+					while (u / tens >= 10) 
+						tens *= 10 ;
+					while (tens > 0)
+					{	LOG_PUTCHAR (psf, '0' + u / tens) ;
+						u %= tens ;
+						tens /= 10 ;
+						} ;
+					break;
+					
+			case 'c': /* char */
+					c = va_arg (ap, int) & 0xFF ;
+					LOG_PUTCHAR (psf, c);
+					break;
+					
 			case 'X': /* hex */
 					d = va_arg (ap, int) ;
 					
 					if (d == 0)
-					{	psf_putchar (psf, '0') ;
+					{	LOG_PUTCHAR (psf, '0') ;
 						break ;
 						} ;
 					shift = 28 ;
@@ -114,16 +232,11 @@
 						shift -= 4 ;
 					while (shift >= 0)
 					{	c = (d >> shift) & 0xF ;
-						psf_putchar (psf, (c > 9) ? c + 'A' - 10 : c + '0') ;
+						LOG_PUTCHAR (psf, (c > 9) ? c + 'A' - 10 : c + '0') ;
 						shift -= 4 ;
 						} ;
 					break;
-					
-			case 'c': /* char */
-					c = va_arg (ap, int) & 0xFF ;
-					psf_putchar (psf, c);
-					break;
-					
+
 			case 'D': /* int2str */
 					d = va_arg (ap, int);
 					if (CPU_IS_LITTLE_ENDIAN)
@@ -142,14 +255,40 @@
 					strptr = istr ;
 					while (*strptr)
 					{	c = *strptr++ ;
-						psf_putchar (psf, c) ;
+						LOG_PUTCHAR (psf, c) ;
 						} ;
 					break;
 					
+			case 'C': /* int2str */
+					{	sf_count_t lld, tens ;
+					
+						lld = va_arg (ap, sf_count_t);
+
+						if (lld == 0)
+						{	LOG_PUTCHAR (psf, '0') ;
+							break ;
+							} 
+						if (lld < 0)
+						{	LOG_PUTCHAR (psf, '-') ;
+							lld = -lld ;
+							} ;
+						tens = 1 ;
+						while (lld / tens >= 10) 
+							tens *= 10 ;
+						while (tens > 0)
+						{	LOG_PUTCHAR (psf, '0' + lld / tens) ;
+							lld %= tens ;
+							tens /= 10 ;
+							} ;
+
+
+						} ;
+					break;
+					
 			default :
-					psf_putchar (psf, '*') ;
-					psf_putchar (psf, c) ;
-					psf_putchar (psf, '*') ;
+					LOG_PUTCHAR (psf, '*') ;
+					LOG_PUTCHAR (psf, c) ;
+					LOG_PUTCHAR (psf, '*') ;
 					break ;
 			} /* switch */
 		} /* while */
@@ -176,11 +315,13 @@
 	maxlen = sizeof (psf->header) - strlen ((char*) psf->header) ;
 	
 	va_start (argptr, format) ;
-	vsnprintf (start, maxlen, format, argptr) ;
+	LSF_VSNPRINTF (start, maxlen, format, argptr) ;
 	va_end (argptr) ;
 
 	/* Make sure the string is properly terminated. */
-	start [maxlen - 1] = 0 ;	
+	start [maxlen - 1] = 0 ;
+	
+	psf->headindex = strlen (psf->header) ;
 
 	return ;
 } /* psf_asciiheader_printf */
@@ -191,27 +332,32 @@
 **  Format specifiers for psf_binheader_writef are as follows
 **		m	- marker - four bytes - no endian manipulation
 **
-**		b   - byte
+**		e   - all following numerical values will be little endian
+**		E   - all following numerical values will be big endian
 **
-**		w	- two byte value - little endian
-**		W	- two byte value - big endian
-**		l	- four byte value - little endian
-**		L	- four byte value - big endian
+**		t   - all following O types will be truncated to 4 bytes
+**		T   - switch off truncation of all following O types
 **
+**		1	- single byte value
+**		2	- two byte value
+**		3	- three byte value
+**		4	- four byte value
+**		8	- eight byte value (sometimes written as 4 bytes)
+**
 **		s   - string preceded by a little endian four byte length
-**		S   - string preceded by a big endian four byte length
+**		f	- floating point data
+**		d	- double precision floating point data
+**		h	- 16 binary bytes value
 **
-**		f	- little endian 32 bit float
-**		F   - big endian 32 bit float
-**
-**		B	- binary data (see below)
+**		b	- binary data (see below)
 **		z   - zero bytes (se below)
+**		h   - zero bytes (se below)
 **
-**	To write a word followed by a long (both little endian) use:
-**		psf_binheader_writef ("wl", wordval, longval) ;
+**	To write a word followed by an int (both little endian) use:
+**		psf_binheader_writef ("e24", wordval, sf_count_tval) ;
 **
 **	To write binary data use:
-**		psf_binheader_writef ("B", &bindata, sizeof (bindata)) ;
+**		psf_binheader_writef ("b", &bindata, sizeof (bindata)) ;
 **
 **	To write N zero bytes use:
 **		psf_binheader_writef ("z", N) ;
@@ -221,103 +367,229 @@
 ** seg. fault when asked to write an int or short to a non-int/short aligned address.
 */
 
+#define	PUT_BYTE(psf,x)		if ((psf)->headindex < sizeof ((psf)->header) - 1)	\
+							{	(psf)->header [(psf)->headindex++] = (x) ;   }
+
 #if (CPU_IS_BIG_ENDIAN == 1)
-#define	PUT_INT(psf,x)		if ((psf)->headindex < sizeof ((psf)->header) - 4)					\
-							{	(psf)->header [(psf)->headindex++] = ((x) >> 24) & 0xFF ;		\
-								(psf)->header [(psf)->headindex++] = ((x) >> 16) & 0xFF ;		\
-								(psf)->header [(psf)->headindex++] = ((x) >>  8) & 0xFF ;		\
-								(psf)->header [(psf)->headindex++] = (x) & 0xFF ;   }
+#define	PUT_MARKER(psf,x)	if ((psf)->headindex < sizeof ((psf)->header) - 4)			\
+							{	(psf)->header [(psf)->headindex++] = ((x) >> 24) ;		\
+								(psf)->header [(psf)->headindex++] = ((x) >> 16) ;		\
+								(psf)->header [(psf)->headindex++] = ((x) >>  8);		\
+								(psf)->header [(psf)->headindex++] = (x) ;   }
 								                                                                   
-#define	PUT_SHORT(psf,x)	if ((psf)->headindex < sizeof ((psf)->header) - 2)					\
-							{	(psf)->header [(psf)->headindex++] = ((x) >> 8) & 0xFF ;		\
-								(psf)->header [(psf)->headindex++] = (x) & 0xFF ;   }
-
 #elif (CPU_IS_LITTLE_ENDIAN == 1)
-#define	PUT_INT(psf,x)		if ((psf)->headindex < sizeof ((psf)->header) - 4)					\
-							{	(psf)->header [(psf)->headindex++] = (x) & 0xFF ;				\
-								(psf)->header [(psf)->headindex++] = ((x) >>  8) & 0xFF ;		\
-								(psf)->header [(psf)->headindex++] = ((x) >> 16) & 0xFF ;		\
-								(psf)->header [(psf)->headindex++] = ((x) >> 24) & 0xFF ;   }
-                                                                        
-#define	PUT_SHORT(psf,x)	if ((psf)->headindex < sizeof ((psf)->header) - 2)					\
-							{	(psf)->header [(psf)->headindex++] = (x) & 0xFF ;				\
-								(psf)->header [(psf)->headindex++] = ((x) >> 8) & 0xFF ;   }
+#define	PUT_MARKER(psf,x)	if ((psf)->headindex < sizeof ((psf)->header) - 4)			\
+							{	(psf)->header [(psf)->headindex++] = (x) ;				\
+								(psf)->header [(psf)->headindex++] = ((x) >>  8) ;		\
+								(psf)->header [(psf)->headindex++] = ((x) >> 16) ;		\
+								(psf)->header [(psf)->headindex++] = ((x) >> 24) ;   }
 
 #else
 #       error "Cannot determine endian-ness of processor."
 #endif
 
-#define	PUT_BYTE(psf,x)		if ((psf)->headindex < sizeof ((psf)->header) - 1)					\
-							{	(psf)->header [(psf)->headindex++] = (x) & 0xFF ;   }
 
+#define	PUT_BE_SHORT(psf,x)	if ((psf)->headindex < sizeof ((psf)->header) - 2)			\
+							{	(psf)->header [(psf)->headindex++] = ((x) >> 8) ;		\
+								(psf)->header [(psf)->headindex++] = (x) ; 		}
+
+#define	PUT_LE_SHORT(psf,x)	if ((psf)->headindex < sizeof ((psf)->header) - 2)			\
+							{	(psf)->header [(psf)->headindex++] = (x) ;				\
+								(psf)->header [(psf)->headindex++] = ((x) >> 8) ;	}
+
+#define	PUT_BE_3BYTE(psf,x)	if ((psf)->headindex < sizeof ((psf)->header) - 3)			\
+							{	(psf)->header [(psf)->headindex++] = ((x) >> 16) ;		\
+								(psf)->header [(psf)->headindex++] = ((x) >> 8) ;		\
+								(psf)->header [(psf)->headindex++] = (x) ;		}
+
+#define	PUT_LE_3BYTE(psf,x)	if ((psf)->headindex < sizeof ((psf)->header) - 3)			\
+							{	(psf)->header [(psf)->headindex++] = (x) ;				\
+								(psf)->header [(psf)->headindex++] = ((x) >> 8) ;   	\
+								(psf)->header [(psf)->headindex++] = ((x) >> 16) ;	}
+
+#define	PUT_BE_INT(psf,x)	if ((psf)->headindex < sizeof ((psf)->header) - 4)			\
+							{	(psf)->header [(psf)->headindex++] = ((x) >> 24) ;		\
+								(psf)->header [(psf)->headindex++] = ((x) >> 16) ;		\
+								(psf)->header [(psf)->headindex++] = ((x) >> 8) ;		\
+								(psf)->header [(psf)->headindex++] = (x) ;		}
+
+#define	PUT_LE_INT(psf,x)	if ((psf)->headindex < sizeof ((psf)->header) - 4)			\
+							{	(psf)->header [(psf)->headindex++] = (x) ;				\
+								(psf)->header [(psf)->headindex++] = ((x) >> 8) ;   	\
+								(psf)->header [(psf)->headindex++] = ((x) >> 16) ;		\
+								(psf)->header [(psf)->headindex++] = ((x) >> 24) ;	}
+
+#if (SIZEOF_SF_COUNT_T == 4)
+#define	PUT_BE_8BYTE(psf,x)	if ((psf)->headindex < sizeof ((psf)->header) - 8)			\
+							{	(psf)->header [(psf)->headindex++] = 0 ;				\
+								(psf)->header [(psf)->headindex++] = 0 ;				\
+								(psf)->header [(psf)->headindex++] = 0 ;				\
+								(psf)->header [(psf)->headindex++] = 0 ;				\
+								(psf)->header [(psf)->headindex++] = ((x) >> 24) ;		\
+								(psf)->header [(psf)->headindex++] = ((x) >> 16) ;		\
+								(psf)->header [(psf)->headindex++] = ((x) >> 8) ;		\
+								(psf)->header [(psf)->headindex++] = (x) ;		}
+
+#define	PUT_LE_8BYTE(psf,x)	if ((psf)->headindex < sizeof ((psf)->header) - 8)			\
+							{	(psf)->header [(psf)->headindex++] = (x) ;				\
+								(psf)->header [(psf)->headindex++] = ((x) >> 8) ;   	\
+								(psf)->header [(psf)->headindex++] = ((x) >> 16) ;		\
+								(psf)->header [(psf)->headindex++] = ((x) >> 24) ;		\
+								(psf)->header [(psf)->headindex++] = 0 ;				\
+								(psf)->header [(psf)->headindex++] = 0 ;   				\
+								(psf)->header [(psf)->headindex++] = 0 ;				\
+								(psf)->header [(psf)->headindex++] = 0 ;	}
+
+#elif  (SIZEOF_SF_COUNT_T == 8)
+#define	PUT_BE_8BYTE(psf,x)	if ((psf)->headindex < sizeof ((psf)->header) - 8)			\
+							{	(psf)->header [(psf)->headindex++] = ((x) >> 56) ;		\
+								(psf)->header [(psf)->headindex++] = ((x) >> 48) ;		\
+								(psf)->header [(psf)->headindex++] = ((x) >> 40) ;		\
+								(psf)->header [(psf)->headindex++] = ((x) >> 32) ;		\
+								(psf)->header [(psf)->headindex++] = ((x) >> 24) ;		\
+								(psf)->header [(psf)->headindex++] = ((x) >> 16) ;		\
+								(psf)->header [(psf)->headindex++] = ((x) >> 8) ;		\
+								(psf)->header [(psf)->headindex++] = (x) ;		}
+
+#define	PUT_LE_8BYTE(psf,x)	if ((psf)->headindex < sizeof ((psf)->header) - 8)			\
+							{	(psf)->header [(psf)->headindex++] = (x) ;				\
+								(psf)->header [(psf)->headindex++] = ((x) >> 8) ;   	\
+								(psf)->header [(psf)->headindex++] = ((x) >> 16) ;		\
+								(psf)->header [(psf)->headindex++] = ((x) >> 24) ;		\
+								(psf)->header [(psf)->headindex++] = ((x) >> 32) ;		\
+								(psf)->header [(psf)->headindex++] = ((x) >> 40) ;   	\
+								(psf)->header [(psf)->headindex++] = ((x) >> 48) ;		\
+								(psf)->header [(psf)->headindex++] = ((x) >> 56) ;	}
+#else
+#error "SIZEOF_SF_COUNT_T is not defined."
+#endif
 int
 psf_binheader_writef (SF_PRIVATE *psf, char *format, ...)
 {	va_list	argptr ;
+	sf_count_t 		countdata ;
+	unsigned long 	longdata ;
 	unsigned int 	data ;
 	float			floatdata ;
 	void			*bindata ;
 	size_t			size ;
 	char    		c, *strptr ;
-	int				count = 0 ;
+	int				count = 0, endian, trunc_8to4 ;
 	
+	endian = SF_ENDIAN_LITTLE ;
+	trunc_8to4 = SF_FALSE ;
+	
 	va_start(argptr, format);
 	
 	while ((c = *format++))
 	{	switch (c)
-		{	case 'm' : 
+		{	case 'e' : /* All conversions are now from LE to host. */
+					endian = SF_ENDIAN_LITTLE ;
+					break ;
+
+			case 'E' : /* All conversions are now from BE to host. */
+					endian = SF_ENDIAN_BIG ;
+					break ;
+
+			case 't' : /* All 8 byte values now get written as 4 bytes. */
+					trunc_8to4 = SF_TRUE ;
+					break ;
+
+			case 'T' : /* All 8 byte values now get written as 8 bytes. */
+					trunc_8to4 = SF_FALSE ;
+					break ;
+
+			case 'm' : 
 					data = va_arg (argptr, unsigned int) ;
-					PUT_INT (psf, data) ;
+					PUT_MARKER (psf, data) ;
 					count += 4 ;
 					break ;
 					
-			case 'b' :
+			case '1' :
 					data = va_arg (argptr, unsigned int) ;
 					PUT_BYTE (psf, data) ;
 					count += 1 ;
 					break ;
 					
-			case 'w' :
+			case '2' :
 					data = va_arg (argptr, unsigned int) ;
-					data = H2LE_SHORT (data) ;
-					PUT_SHORT (psf, data) ;
+					if (endian == SF_ENDIAN_BIG)
+					{	PUT_BE_SHORT (psf, data) ;
+						}
+					else
+					{	PUT_LE_SHORT (psf, data) ;
+						} ;
 					count += 2 ;
 					break ;
 
-			case 'W' :
+			case '3' : /* tribyte */
 					data = va_arg (argptr, unsigned int) ;
-					data = H2BE_SHORT (data) ;
-					PUT_SHORT (psf, data) ;
-					count += 2 ;
+					if (endian == SF_ENDIAN_BIG)
+					{	PUT_BE_3BYTE (psf, data) ;
+						}
+					else
+					{	PUT_LE_3BYTE (psf, data) ;
+						} ;
+					count += 3 ;
 					break ;
-					
-			case 'l' :
+
+			case '4' :
 					data = va_arg (argptr, unsigned int) ;
-					data = H2LE_INT (data) ;
-					PUT_INT (psf, data) ;
+					if (endian == SF_ENDIAN_BIG)
+					{	PUT_BE_INT (psf, data) ;
+						}
+					else
+					{	PUT_LE_INT (psf, data) ;
+						} ;
 					count += 4 ;
 					break ;
 
-			case 'L' :
-					data = va_arg (argptr, unsigned int) ;
-					data = H2BE_INT (data) ;
-					PUT_INT (psf, data) ;
-					count += 4 ;
+			case '8' :
+					countdata = va_arg (argptr, sf_count_t) ;
+					if (endian == SF_ENDIAN_BIG && trunc_8to4 == SF_FALSE)
+					{	PUT_BE_8BYTE (psf, countdata) ;
+						count += 8 ;
+						}
+					else if (endian == SF_ENDIAN_LITTLE && trunc_8to4 == SF_FALSE)
+					{	PUT_LE_8BYTE (psf, countdata) ;
+						count += 8 ;
+						}
+					else if (endian == SF_ENDIAN_BIG && trunc_8to4 == SF_TRUE)
+					{	longdata = countdata ;
+						PUT_BE_INT (psf, longdata) ;
+						count += 4 ;
+						}
+					else if (endian == SF_ENDIAN_LITTLE && trunc_8to4 == SF_TRUE)
+					{	longdata = countdata ;
+						PUT_LE_INT (psf, longdata) ;
+						count += 4 ;
+						}
 					break ;
 
 			case 'f' :
 					floatdata = (float) va_arg (argptr, double) ;
 					float32_write (floatdata, (unsigned char *) &data) ;
-					data = H2LE_INT (data) ;
-					PUT_INT (psf, data) ;
+					if (endian == SF_ENDIAN_BIG)
+					{	PUT_BE_INT (psf, data) ;
+						}
+					else
+					{	PUT_LE_INT (psf, data) ;
+						} ;
 					count += 4 ;
 					break ;
 
-			case 'F' :
-					floatdata = (float) va_arg (argptr, double) ;
-					float32_write (floatdata, (unsigned char *) &data) ;
-					data = H2BE_INT (data) ;
-					PUT_INT (psf, data) ;
+			case 'd' :
+					psf_log_printf (psf, "Must fix double conversion\n") ;
+					/*
+					doubledata = va_arg (argptr, double) ;
+					double64_write (doubledata, (unsigned char *) &data) ;
+					if (endian == SF_ENDIAN_BIG)
+					{	PUT_BE_INT (psf, data) ;
+						}
+					else
+					{	PUT_LE_INT (psf, data) ;
+						} ;
 					count += 4 ;
+					*/
 					break ;
 
 			case 's' :
@@ -324,25 +596,18 @@
 					strptr = va_arg (argptr, char *) ;
 					size   = strlen (strptr) + 1 ;
 					size  += (size & 1) ;
-					data = H2LE_INT (size) ;
-					PUT_INT (psf, data) ;
+					if (endian == SF_ENDIAN_BIG)
+					{	PUT_BE_INT (psf, size) ;
+						}
+					else
+					{	PUT_LE_INT (psf, size) ;
+						} ;
 					memcpy (&(psf->header [psf->headindex]), strptr, size) ;
 					psf->headindex += size ;
 					count += 4 + size ;
 					break ;
 					
-			case 'S' :
-					strptr = va_arg (argptr, char *) ;
-					size   = strlen (strptr) + 1 ;
-					size  += (size & 1) ;
-					data = H2BE_INT (size) ;
-					PUT_INT (psf, data) ;
-					memcpy (&(psf->header [psf->headindex]), strptr, size) ;
-					psf->headindex += size ;
-					count += 4 + size ;
-					break ;
-					
-			case 'B' :
+			case 'b' :
 					bindata = va_arg (argptr, void *) ;
 					size    = va_arg (argptr, size_t) ;
 					memcpy (&(psf->header [psf->headindex]), bindata, size) ;
@@ -360,6 +625,13 @@
 						} ;
 					break ;
 					
+			case 'h' :
+					bindata = va_arg (argptr, void *) ; ;
+					memcpy (&(psf->header [psf->headindex]), bindata, 16) ;
+					psf->headindex += 16 ;
+					count += 16 ;
+					break ;
+
 			default : 
 				psf_log_printf (psf, "*** Invalid format specifier `%c'\n", c) ;
 				psf->error = SFE_INTERNAL ; 
@@ -378,135 +650,177 @@
 **	additions:
 **
 **		p   - jump a given number of position from start of file.
+**		j   - jump a given number of bytes forward in the file.
 **
 **	If format is NULL, psf_binheader_readf returns the current offset.
 */
 
+#define	GET_BYTE(psf)	( (psf)->header [0] )
+
 #if (CPU_IS_BIG_ENDIAN == 1)
-#define	GET_INT(psf)	( ((psf)->header [0] << 24) + ((psf)->header [1] << 16) +	\
-						  ((psf)->header [2] <<  8) + ((psf)->header [3]) )
+#define	GET_MARKER(psf)	( ((psf)->header [0] << 24) | ((psf)->header [1] << 16) |	\
+						  ((psf)->header [2] <<  8) | ((psf)->header [3]) )
 
-#define	GET_3BYTE(psf)	( ((psf)->header [0] << 16) + ((psf)->header [1] << 8) +	\
-						  ((psf)->header [2]) )
+#elif (CPU_IS_LITTLE_ENDIAN == 1)
+#define	GET_MARKER(psf)	( ((psf)->header [0]      ) | ((psf)->header [1] <<  8) |	\
+						  ((psf)->header [2] << 16) | ((psf)->header [3] << 24) )
 
-#define	GET_SHORT(psf)	( ((psf)->header [0] <<  8) + ((psf)->header [1]) )
+#else
+#       error "Cannot determine endian-ness of processor."
+#endif
 
-#elif (CPU_IS_LITTLE_ENDIAN == 1)
-#define	GET_INT(psf)	( ((psf)->header [0]      ) + ((psf)->header [1] <<  8) +	\
-						  ((psf)->header [2] << 16) + ((psf)->header [3] << 24) )
+#define	GET_LE_SHORT(psf)	( ((psf)->header [1] <<  8) | ((psf)->header [0]) )
 
-#define	GET_3BYTE(psf)	( ((psf)->header [0]      ) + ((psf)->header [1] <<  8) +	\
-						  ((psf)->header [2] << 16) )
+#define	GET_BE_SHORT(psf)	( ((psf)->header [0] <<  8) | ((psf)->header [1]) )
 
-#define	GET_SHORT(psf)	( ((psf)->header [0]) + ((psf)->header [1] <<  8) )
 
+#define	GET_LE_3BYTE(psf)	( 	((psf)->header [2] << 16) | ((psf)->header [1] << 8) |	\
+								((psf)->header [0]) )
+
+#define	GET_BE_3BYTE(psf)	( 	((psf)->header [0] << 16) | ((psf)->header [1] << 8) |	\
+								((psf)->header [2]) )
+
+#define	GET_LE_INT(psf)		( 	((psf)->header [3] << 24) | ((psf)->header [2] << 16) |	\
+								((psf)->header [1] <<  8) | ((psf)->header [0]) )
+
+#define	GET_BE_INT(psf)		( 	((psf)->header [0] << 24) | ((psf)->header [1] << 16) |	\
+							 	((psf)->header [2] <<  8) | ((psf)->header [3]) )
+
+#if (SIZEOF_LONG == 4)
+#define	GET_LE_8BYTE(psf)	( 	((psf)->header [3] << 24) | ((psf)->header [2] << 16) |	\
+							 	((psf)->header [1] <<  8) | ((psf)->header [0]) )
+
+#define	GET_BE_8BYTE(psf)	( 	((psf)->header [4] << 24) | ((psf)->header [5] << 16) |	\
+								((psf)->header [6] <<  8) | ((psf)->header [7]) )
 #else
-#       error "Cannot determine endian-ness of processor."
-#endif
+#define	GET_LE_8BYTE(psf)	( 	((psf)->header [7] << 56L) | ((psf)->header [6] << 48L) |	\
+							 	((psf)->header [5] << 40L) | ((psf)->header [4] << 32L) |	\
+							 	((psf)->header [3] << 24L) | ((psf)->header [2] << 16L) |	\
+							 	((psf)->header [1] <<  8L) | ((psf)->header [0] ))
 
-#define	GET_BYTE(psf)	( (psf)->header [0] )
+#define	GET_BE_8BYTE(psf)	( 	((psf)->header [0] << 56L) | ((psf)->header [1] << 48L) |	\
+							 	((psf)->header [2] << 40L) | ((psf)->header [3] << 32L) |	\
+							 	((psf)->header [4] << 24L) | ((psf)->header [5] << 16L) |	\
+							 	((psf)->header [6] <<  8L) | ((psf)->header [7] ))
 
+#endif
+
 int
 psf_binheader_readf (SF_PRIVATE *psf, char const *format, ...)
-{	va_list	argptr ;
-	unsigned int 	*longptr, longdata ;
-	unsigned short	*wordptr, worddata ;
+{	va_list			argptr ;
+	sf_count_t		*countptr, countdata ;
+	unsigned int 	*intptr, intdata ;
+	unsigned short	*shortptr, shortdata ;
 	char    		*charptr ;
 	int				position ;
 	float			*floatptr ;
 	size_t			size ;
 	char			c ;
-	int				count = 0 ;
+	int				count = 0, endian = SF_ENDIAN_LITTLE ;
 	
 	if (! format)
-		return ftell (psf->file) ;
-			
+		return psf_ftell (psf->filedes) ;
+	
 	va_start(argptr, format);
 	
 	while ((c = *format++))
 	{	switch (c)
-		{	case 'm' : 
-					longptr = va_arg (argptr, unsigned int*) ;
-					fread (psf->header, 1, sizeof (int), psf->file) ;
-					*longptr = GET_INT (psf) ;
-					count += 4 ;
+		{	case 'e' : /* All conversions are now from LE to host. */
+					endian = SF_ENDIAN_LITTLE ;
 					break ;
+
+			case 'E' : /* All conversions are now from BE to host. */
+					endian = SF_ENDIAN_BIG ;
+					break ;
+
+			case 'm' : 
+					intptr = va_arg (argptr, unsigned int*) ;
+					count += psf_fread (psf->header, 1, sizeof (int), psf->filedes) ;
+					*intptr = GET_MARKER (psf) ;
+					break ;
 					
-			case 'b' :
+			case 'h' : 
+					intptr = va_arg (argptr, unsigned int*) ;
+					count += psf_fread (psf->header, 1, 16, psf->filedes) ;
+					{	int k ;
+						intdata = 0 ;
+						for (k = 0 ; k < 16 ; k++)
+							intdata ^= psf->header [k] << k ;
+						}
+					*intptr = intdata ;
+					break ;
+					
+			case '1' :
 					charptr = va_arg (argptr, char*) ;
-					fread (psf->header, 1, sizeof (char), psf->file) ;
+					count += psf_fread (psf->header, 1, sizeof (char), psf->filedes) ;
 					*charptr = GET_BYTE (psf) ;
-					count += 1 ;
 					break ;
 					
-			case 'w' :
-					wordptr = va_arg (argptr, unsigned short*) ;
-					fread (psf->header, 1, sizeof (short), psf->file) ;
-					worddata = GET_SHORT (psf) ;
-					*wordptr = H2LE_SHORT (worddata) ;
-					count += 2 ;
+			case '2' :
+					shortptr = va_arg (argptr, unsigned short*) ;
+					count += psf_fread (psf->header, 1, sizeof (short), psf->filedes) ;
+					if (endian == SF_ENDIAN_BIG)
+						shortdata = GET_BE_SHORT (psf) ;
+					else
+						shortdata = GET_LE_SHORT (psf) ;
+					*shortptr = shortdata ;
 					break ;
 
-			case 'W' :
-					wordptr = va_arg (argptr, unsigned short*) ;
-					fread (psf->header, 1, sizeof (short), psf->file) ;
-					worddata = GET_SHORT (psf) ;
-					*wordptr = H2BE_SHORT (worddata) ;
-					count += 2 ;
+			case '3' :
+					intptr = va_arg (argptr, unsigned int*) ;
+					count += psf_fread (psf->header, 1, 3, psf->filedes) ;
+					if (endian == SF_ENDIAN_BIG)
+						intdata = GET_BE_3BYTE (psf) ;
+					else
+						intdata = GET_LE_3BYTE (psf) ;
+					*intptr = intdata ;
 					break ;
-					
-			case 'l' :
-					longptr = va_arg (argptr, unsigned int*) ;
-					fread (psf->header, 1, sizeof (int), psf->file) ;
-					longdata = GET_INT (psf) ;
-					*longptr = H2LE_INT (longdata) ;
-					count += 4 ;
-					break ;
 
-			case 'L' :
-					longptr = va_arg (argptr, unsigned int*) ;
-					fread (psf->header, 1, sizeof (int), psf->file) ;
-					longdata = GET_INT (psf) ;
-					*longptr = H2BE_INT (longdata) ;
-					count += 4 ;
+			case '4' :
+					intptr = va_arg (argptr, unsigned int*) ;
+					count += psf_fread (psf->header, 1, sizeof (int), psf->filedes) ;
+					if (endian == SF_ENDIAN_BIG)
+						intdata = GET_BE_INT (psf) ;
+					else
+						intdata = GET_LE_INT (psf) ;
+					*intptr = intdata ;
 					break ;
 
-			case 't' :
-					longptr = va_arg (argptr, unsigned int*) ;
-					fread (psf->header, 1, 3, psf->file) ;
-					longdata = GET_3BYTE (psf) ;
-					*longptr = H2LE_INT (longdata) ;
-					count += 3 ;
+			case '8' :
+					countptr = va_arg (argptr, sf_count_t*) ;
+					count += psf_fread (psf->header, 1, 8, psf->filedes) ;
+					if (endian == SF_ENDIAN_BIG)
+						countdata = GET_BE_8BYTE (psf) ;
+					else
+						countdata = GET_LE_8BYTE (psf) ;
+					*countptr = countdata ;
 					break ;
 
-			case 'T' :
-					longptr = va_arg (argptr, unsigned int*) ;
-					fread (psf->header, 1, 3, psf->file) ;
-					longdata = GET_3BYTE (psf) ;
-					*longptr = H2BE_INT (longdata) ;
-					count += 3 ;
-					break ;
-
-			case 'f' :
+			case 'f' : /* Float conversion */
 					floatptr = va_arg (argptr, float *) ;
-					fread (psf->header, 1, sizeof (float), psf->file) ;
-					longdata = GET_INT (psf) ;
-					longdata = H2LE_INT (longdata) ;
-					*floatptr = float32_read ((unsigned char*) &longdata) ;
-					count += 4 ;
+					count += psf_fread (psf->header, 1, sizeof (float), psf->filedes) ;
+					if (endian == SF_ENDIAN_BIG)
+						intdata = GET_BE_INT (psf) ;
+					else
+						intdata = GET_LE_INT (psf) ;
+					*floatptr = float32_read ((unsigned char*) &intdata) ;
 					break ;
 
-			case 'F' :
-					floatptr = va_arg (argptr, float *) ;
-					fread (psf->header, 1, sizeof (float), psf->file) ;
-					longdata = GET_INT (psf) ;
-					longdata = H2BE_INT (longdata) ;
-					*floatptr = float32_read ((unsigned char*) &longdata) ;
-					count += 4 ;
+			case 'd' : /* double conversion */
+					psf_log_printf (psf, "Must fix double conversion\n") ;
+					/*
+					doubleptr = va_arg (argptr, double *) ;
+					count += psf_fread (psf->header, 1, sizeof (double), psf->filedes) ;
+					if (endian == SF_ENDIAN_BIG)
+						longdata = GET_BE_8BYTE (psf) ;
+					else
+						longdata = GET_LE_8BYTE (psf) ;
+					*doubleptr = double32_read ((unsigned char*) &longdata) ;
+					*/
 					break ;
 
 			case 's' :
-					printf ("Format conversion not implemented yet.\n") ;
+					psf_log_printf (psf, "Format conversion 's' not implemented yet.\n") ;
 					/*
 					strptr = va_arg (argptr, char *) ;
 					size   = strlen (strptr) + 1 ;
@@ -518,31 +832,17 @@
 					*/
 					break ;
 					
-			case 'S' :
-					printf ("Format conversion not implemented yet.\n") ;
-					/*
-					strptr = va_arg (argptr, char *) ;
-					size   = strlen (strptr) + 1 ;
-					size  += (size & 1) ;
-					longdata = H2BE_INT (size) ;
-					get_int (psf, longdata) ;
-					memcpy (&(psf->header [psf->headindex]), strptr, size) ;
-					psf->headindex += size ;
-					*/
-					break ;
-					
-			case 'B' :
+			case 'b' :
 					charptr = va_arg (argptr, char*) ;
 					size = va_arg (argptr, size_t) ;
 					if (size > 0)
 					{	memset (charptr, 0, size) ;
-						fread (charptr, 1, size, psf->file) ;
-						count += size ;
+						count += psf_fread (charptr, 1, size, psf->filedes) ;
 						} ;
 					break ;
 					
 			case 'z' :
-					printf ("Format conversion not implemented yet.\n") ;
+					psf_log_printf (psf, "Format conversion 'z' not implemented yet.\n") ;
 					/*
 					size    = va_arg (argptr, size_t) ;
 					while (size)
@@ -556,7 +856,7 @@
 			case 'p' :
 					/* Get the seek position first. */ 
 					position = va_arg (argptr, int) ;
-					fseek (psf->file, position, SEEK_SET) ;
+					psf_fseek (psf->filedes, position, SEEK_SET) ;
 					count = 0 ;
 					break ;
 
@@ -563,7 +863,7 @@
 			case 'j' :
 					/* Get the seek position first. */ 
 					position = va_arg (argptr, int) ;
-					fseek (psf->file, position, SEEK_CUR) ;
+					psf_fseek (psf->filedes, position, SEEK_CUR) ;
 					count = 0 ;
 					break ;
 
@@ -587,11 +887,10 @@
 {	psf_log_printf (psf, "---------------------------------\n") ;
 
 	psf_log_printf (psf, " Sample rate :   %d\n", psf->sf.samplerate) ;
-	psf_log_printf (psf, " Samples     :   %d\n", psf->sf.samples) ;
+	psf_log_printf (psf, " Samples     :   %C\n", psf->sf.samples) ;
 	psf_log_printf (psf, " Channels    :   %d\n", psf->sf.channels) ;
 
-	psf_log_printf (psf, " Bit width   :   %d\n", psf->sf.pcmbitwidth) ;
-	psf_log_printf (psf, " Format      :   %X\n", psf->sf.format) ;
+	psf_log_printf (psf, " Format      :   0x%X\n", psf->sf.format) ;
 	psf_log_printf (psf, " Sections    :   %d\n", psf->sf.sections) ;
 	psf_log_printf (psf, " Seekable    :   %s\n", psf->sf.seekable ? "TRUE" : "FALSE") ;
 	
@@ -598,6 +897,27 @@
 	psf_log_printf (psf, "---------------------------------\n") ;
 } /* psf_dump_SFINFO */ 
 
+sf_count_t  
+psf_default_seek (SF_PRIVATE *psf, int mode, sf_count_t samples_from_start)
+{	sf_count_t position, retval ;
+
+	if (! (psf->blockwidth && psf->dataoffset >= 0))
+	{	psf->error = SFE_BAD_SEEK ;
+		return	((sf_count_t) -1) ;
+		} ;
+
+	position = psf->dataoffset + psf->blockwidth * samples_from_start ;
+
+	if ((retval = psf_fseek (psf->filedes, position, SEEK_SET)) != position)
+	{	psf->error = SFE_SEEK_FAILED ;
+		return ((sf_count_t) -1) ;
+		} ;
+		
+	mode = mode ;
+
+	return samples_from_start ;
+} /* psf_default_seek */
+
 /*========================================================================================
 **	Functions used in the write function for updating the peak chunk. 
 */
@@ -644,7 +964,7 @@
 				position = k ;
 				} ;
 				
-		fmaxval   = maxval / 0x7FFFFFFF ;
+		fmaxval   = maxval / SF_MAX_COUNT ;
 		position /= psf->sf.channels ;
 		
 		if (fmaxval > psf->peak.peak[chan].value)
--- a/common/libsndfile/src/common.h
+++ b/common/libsndfile/src/common.h
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 1999-2001 Erik de Castro Lopo <[email protected]>
+** Copyright (C) 1999-2002 Erik de Castro Lopo <[email protected]>
 **  
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -16,14 +16,15 @@
 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 */
 
+#include  "config.h"
+
 #ifndef COMMON_H_INCLUDED
 #define COMMON_H_INCLUDED
 
-#ifdef _WIN32
+#if (defined (WIN32) || defined (_WIN32))
 	#pragma pack(push,1)
 #endif
 
-
 #define	SF_BUFFER_LEN			(4096)
 #define	SF_FILENAME_LEN			(256)
 #define	SF_HEADER_LEN			(2048)
@@ -33,67 +34,48 @@
 
 #define		PEAK_CHANNEL_COUNT	16
 
+/*	For some reason SIGNED_SIZEOF returns an unsigned  value which causes
+**	a warning when that value is added or subtracted from a signed
+**	value. Use SIGNED_SIZEOF instead.
+*/
+#define		SIGNED_SIZEOF(x)	((int) sizeof (x))
+
+#if (defined (WIN32) || defined (_WIN32))
+#	define	SF_MAX_COUNT		0x7FFFFFFFFFFFFFFFI64
+#elif (SIZEOF_OFF_T == 4)
+#	define	SF_MAX_COUNT		0x7FFFFFFF
+#elif (SIZEOF_OFF_T == 8)
+#	define	SF_MAX_COUNT		0x7FFFFFFFFFFFFFFFLL
+#else
+#	error "sizeof (long) != 4 && sizeof (long) != 8"
+#endif
+
+#define	SF_MAX_UINT				0xFFFFFFFF
+#define	SF_MAX_INT				0x7FFFFFFF
+
+#if (defined (WIN32) || defined (_WIN32))
+	#define	SIZEOF_SF_COUNT_T	8
+#else
+	#define	SIZEOF_SF_COUNT_T	SIZEOF_OFF_T
+#endif
+
 enum
-{	SF_MODE_READ		= 11, 
-	SF_MODE_WRITE		= 12,
-	SF_MODE_RW			= 13,	/* Unlikely that RW will ever be implemented. */ 
-	
-	/* PEAK chunk location. */
+{	/* PEAK chunk location. */
 	SF_PEAK_START		= 42,
 	SF_PEAK_END			= 43,
 
-	/* Two endian enums. */
-	SF_ENDIAN_LITTLE	= 100, 
-	SF_ENDIAN_BIG		= 101,
-	
+	/* PEAK chunk location. */
+	SF_SCALE_MAX		= 52,
+	SF_SCALE_MIN		= 53,
+
 	/* Char type for 8 bit files. */
 	SF_CHARS_SIGNED		= 200,
 	SF_CHARS_UNSIGNED	= 201
 } ; 
 
-/*	Processor floating point capabilities. float32_get_capabilities () in
-**	src/float32.c returns one of the latter three values.
-*/
-enum
-{	FLOAT_UNKNOWN		= 0x00,
-	FLOAT_CAN_RW_LE		= 0x23,
-	FLOAT_CAN_RW_BE		= 0x34,
-	FLOAT_BROKEN_LE		= 0x35,
-	FLOAT_BROKEN_BE		= 0x36
-} ;
+#define		SFM_MASK 	(SFM_READ | SFM_WRITE | SFM_RDWR)
+#define		SFM_UNMASK 	(~SFM_MASK)
 
-enum
-{	SF_FALSE = 0, 
-	SF_TRUE = 1
-} ; 
-
-/* Command values for sf_command (). These are obtained using the Python
-** script sf_command.py in the top level directory of the libsndfile sources.
-*/
-enum
-{	SFC_LIB_VERSION	= 0x1048C,
-	SFC_READ_TEXT	= 0x054F0,
-	SFC_WRITE_TEXT	= 0x0B990,
-	SFC_NORM_FLOAT	= 0x0914A,
-	SFC_NORM_DOUBLE	= 0x1226D,
-	SFC_SCALE_MODE	= 0x0A259,
-	SFC_ADD_PEAK	= 0x96F53
-} ;
-
-/*	Function pointer typedefs. */
-
-typedef	int	(*func_seek) 	(void*, long, int) ;
-
-typedef	int	(*func_short)	(void*, short *ptr, unsigned int len) ;
-typedef	int	(*func_int)		(void*, int *ptr, unsigned int len) ;
-typedef	int	(*func_float)	(void*, float *ptr, unsigned int len) ;
-typedef	int	(*func_double)	(void*, double *ptr, unsigned int len, int normalize) ;
-
-typedef	int	(*func_wr_hdr)	(void*) ;
-typedef	int	(*func_command)	(void*, int command, void *data, int datasize) ;
-
-typedef	int	(*func_close)	(void*) ;
-
 /*---------------------------------------------------------------------------------------
 **	PEAK_CHUNK - This chunk type is common to both AIFF and WAVE files although their 
 **	endian encodings are different. 
@@ -116,7 +98,7 @@
 **	contents. 
 */
 
-typedef struct
+typedef struct sf_private_tag
 {	/* Force the compiler to double align the start of buffer. */
 	double			buffer		[SF_BUFFER_LEN/sizeof(double)] ;
 	char			filename	[SF_FILENAME_LEN] ;
@@ -125,7 +107,7 @@
 	** of common.c
 	*/
 	char			logbuffer	[SF_BUFFER_LEN] ;
-	unsigned char	header		[SF_HEADER_LEN] ;
+	unsigned char	header		[SF_HEADER_LEN] ; /* Must be unsigned */
 
 	/* For storing text from header. */
 	char			headertext	[SF_TEXT_LEN] ;
@@ -138,13 +120,13 @@
 	unsigned int	headindex, headcurrent ;
 	int				has_text ;
 	
-	FILE 			*file ;
+	int 			filedes ;
 	int				error ;
 	
-	int				mode ;			/* Open mode : SF_MODE_READ or SF_MODE_WRITE. */
+	int				mode ;			/* Open mode : SFM_READ, SFM_WRITE or SFM_RDWR. */
 	int				endian ;		/* File endianness : SF_ENDIAN_LITTLE or SF_ENDIAN_BIG. */
 	int				chars ;			/* Chars are SF_CHARS_SIGNED or SF_CHARS_UNSIGNED. */
-	int				fl32_endswap ;	/* Need to endswap float32s? */
+	int				float_endswap ;	/* Need to endswap float32s? */
 	
 	SF_INFO			sf ; 	
 
@@ -152,37 +134,42 @@
 	int				peak_loc ;		/* Write a PEAK chunk at the start or end of the file? */
 	PEAK_CHUNK		peak ;			
 	
-	long			dataoffset ;	/* Offset in number of bytes from beginning of file. */
-	long			datalength ;	/* Length in bytes of the audio data. */
-	long			tailstart ;		/* Offset to file tailer. */
-	unsigned int	blockwidth ;	/* Size in bytes of one set of interleaved samples. */
-	unsigned int	bytewidth ;		/* Size in bytes of one sample (one channel). */
+	sf_count_t		dataoffset ;	/* Offset in number of bytes from beginning of file. */
+	sf_count_t		datalength ;	/* Length in bytes of the audio data. */
+	sf_count_t		dataend ;		/* Offset to file tailer. */
 
-	long			filelength ;
-	long			current ;
+	int				blockwidth ;	/* Size in bytes of one set of interleaved samples. */
+	int				bytewidth ;		/* Size in bytes of one sample (one channel). */
 
-	void			*fdata ;
-	
-	int				scale_mode ;
+	sf_count_t		filelength ;
+
+	int				last_op ;		/* Last operation; either SFM_READ or SFM_WRITE */ 	
+	sf_count_t		read_current ;
+	sf_count_t		write_current ;
+
+	void			*fdata ;		/*	This is a pointer to dynamically allocated file format 
+									**	specific data. 
+									*/
 	int				norm_double ;
 	int				norm_float ;
+	
+	/* A set of file specific function pointers */
 
-	func_seek		seek_func ;
+	sf_count_t		(*read_short)	(struct sf_private_tag*, short *ptr, sf_count_t len) ;
+	sf_count_t		(*read_int)		(struct sf_private_tag*, int *ptr, sf_count_t len) ;
+	sf_count_t		(*read_float)	(struct sf_private_tag*, float *ptr, sf_count_t len) ;
+	sf_count_t		(*read_double)	(struct sf_private_tag*, double *ptr, sf_count_t len) ;
 
-	func_short		read_short ;
-	func_int		read_int ;
-	func_float		read_float ;
-	func_double		read_double ;
+	sf_count_t		(*write_short)	(struct sf_private_tag*, short *ptr, sf_count_t len) ;
+	sf_count_t		(*write_int)	(struct sf_private_tag*, int *ptr, sf_count_t len) ;
+	sf_count_t		(*write_float)	(struct sf_private_tag*, float *ptr, sf_count_t len) ;
+	sf_count_t		(*write_double)	(struct sf_private_tag*, double *ptr, sf_count_t len) ;
 
-	func_short		write_short ;
-	func_int		write_int ;
-	func_float		write_float ;
-	func_double		write_double ;
+	sf_count_t		(*new_seek) 	(struct sf_private_tag*, int mode, sf_count_t samples_from_start) ;
+	int				(*write_header)	(struct sf_private_tag*) ;
+	int				(*command)		(struct sf_private_tag*, int command, void *data, int datasize) ;
+	int				(*close)		(struct sf_private_tag*) ;
 
-	func_wr_hdr		write_header ;
-	func_command	command ;
-	func_close		close ;
-
 } SF_PRIVATE ;
 
 enum
@@ -189,15 +176,15 @@
 {	SFE_NO_ERROR	= 0,
 
 	SFE_BAD_FILE,
+	SFE_BAD_FILE_READ,
 	SFE_OPEN_FAILED,
 	SFE_BAD_OPEN_FORMAT,
 	SFE_BAD_SNDFILE_PTR,
 	SFE_BAD_SF_INFO_PTR,
-	SFE_BAD_INT_FD,
+	SFE_BAD_SF_INCOMPLETE,
+	SFE_BAD_FILE_PTR,
 	SFE_BAD_INT_PTR,
 	SFE_MALLOC_FAILED, 
-	SFE_BAD_SEEK, 
-	SFE_NOT_SEEKABLE,
 	SFE_UNIMPLEMENTED,
 	SFE_BAD_READ_ALIGN,
 	SFE_BAD_WRITE_ALIGN,
@@ -209,8 +196,21 @@
 	SFE_SHORT_READ,
 	SFE_SHORT_WRITE,
 	SFE_INTERNAL,
+	SFE_LOG_OVERRUN,
 	SFE_BAD_CONTROL_CMD,
+	SFE_BAD_ENDIAN,
+	SFE_CHANNEL_COUNT,
 	
+	SFE_BAD_SEEK, 
+	SFE_NOT_SEEKABLE,
+	SFE_AMBIGUOUS_SEEK,
+	SFE_WRONG_SEEK,
+	SFE_SEEK_FAILED,
+	
+	SFE_BAD_OPEN_MODE,
+	SFE_OPEN_PIPE_RDWR,
+	SFE_RDWR_POSITION,
+
 	SFE_WAV_NO_RIFF,
 	SFE_WAV_NO_WAVE,
 	SFE_WAV_NO_FMT,
@@ -262,33 +262,59 @@
 	SFE_SMTD_NO_SAMR, 
 
 	SFE_VOC_NO_CREATIVE, 
+	SFE_VOC_BAD_FORMAT, 
 	SFE_VOC_BAD_VERSION, 
 	SFE_VOC_BAD_MARKER, 
+	SFE_VOC_BAD_SECTIONS, 
+	SFE_VOC_MULTI_SAMPLERATE, 
+	SFE_VOC_MULTI_SECTION, 
+	SFE_VOC_MULTI_PARAM, 
+	SFE_VOC_SECTION_COUNT, 
 
 	SFE_IRCAM_NO_MARKER,
 	SFE_IRCAM_BAD_CHANNELS,
 	SFE_IRCAM_UNKNOWN_FORMAT,
 
+	SFE_W64_64_BIT,
+	SFE_W64_NO_RIFF,
+	SFE_W64_NO_WAVE,
+	SFE_W64_NO_FMT,
+	SFE_W64_NO_DATA,
+	SFE_W64_FMT_SHORT,
+	SFE_W64_FMT_TOO_BIG,
+	SFE_W64_ADPCM_NOT4BIT,
+	SFE_W64_ADPCM_CHANNELS,
+	SFE_W64_GSM610_FORMAT,
+
+	SFE_DWVW_BAD_BITWIDTH,
+	
 	SFE_MAX_ERROR			/* This must be last in list. */
 } ;
 
-/* Get the float32 capability of the processor at run time.
-**	Implemented in src/float32.c.
+int subformat_to_bytewidth (int format) ;
+int s_bitwidth_to_subformat (int bits) ;
+int u_bitwidth_to_subformat (int bits) ;
+
+/*  Functions for reading and writing floats and doubles on processors
+**	with non-IEEE floats/doubles.
 */
-int		float32_get_capability (int endianness) ;
 float	float32_read  (unsigned char *cptr) ;
 void	float32_write (float in, unsigned char *out) ;
 
+double	double64_read  (unsigned char *cptr) ;
+void	double64_write (double in, unsigned char *out) ;
 
 /* Endian swapping routines implemented in src/common.h. */
 
-void	endswap_short_array	(short *ptr, int len) ;
-void	endswap_int_array 	(int *ptr, int len) ;
+void	endswap_short_array	(short *ptr, sf_count_t len) ;
+void	endswap_int_array 	(int *ptr, sf_count_t len) ;
+/* Always 8 byte values whether sizeof (long) == 8 or not. */
+void	endswap_long_array  (long *ptr, sf_count_t len) ; 
 
 /* Functions for writing to the internal logging buffer. */
 
 void	psf_log_printf		(SF_PRIVATE *psf, char *format, ...) ;
-void	psf_log_SF_INFO 		(SF_PRIVATE *psf) ;
+void	psf_log_SF_INFO 	(SF_PRIVATE *psf) ;
 
 /* Functions used when writing file headers. */
 
@@ -305,64 +331,102 @@
 void	peak_update_int		(SF_PRIVATE *psf, int *ptr, size_t items) ;
 void	peak_update_double	(SF_PRIVATE *psf, double *ptr, size_t items) ;
 
-/* Init functions for a number of common data encodings. */
+/* Functions defined in command.c. */
 
-int 	pcm_read_init  (SF_PRIVATE *psf) ;
-int 	pcm_write_init (SF_PRIVATE *psf) ;
+int		psf_get_format_simple_count	(void) ;
+int		psf_get_format_simple		(SF_FORMAT_INFO *data) ;
 
-int 	ulaw_read_init  (SF_PRIVATE *psf) ;
-int 	ulaw_write_init (SF_PRIVATE *psf) ;
+int		psf_get_format_major_count	(void) ;
+int		psf_get_format_major		(SF_FORMAT_INFO *data) ;
 
-int 	alaw_read_init  (SF_PRIVATE *psf) ;
-int 	alaw_write_init (SF_PRIVATE *psf) ;
+int		psf_get_format_subtype_count	(void) ;
+int		psf_get_format_subtype		(SF_FORMAT_INFO *data) ;
 
-int 	float32_read_init  (SF_PRIVATE *psf) ;
-int 	float32_write_init (SF_PRIVATE *psf) ;
+double	psf_calc_signal_max 		(SF_PRIVATE *psf) ;
 
-/* Functions for reading and writing different file formats.*/
+/* Default seek function. Use for PCM and float encoded data. */
+sf_count_t  psf_default_seek (SF_PRIVATE *psf, int mode, sf_count_t samples_from_start) ;
 
-int		aiff_open_read	(SF_PRIVATE *psf) ;
-int		aiff_open_write	(SF_PRIVATE *psf) ;
+/*------------------------------------------------------------------------------------ 
+**	File I/O functions which will allow access to large files (> 2 Gig) on
+**	some 32 bit OSes. Implementation in file_io.c.
+*/ 
 
-int		au_open_read	(SF_PRIVATE *psf) ;
-int		au_nh_open_read	(SF_PRIVATE *psf) ;	/* Headerless version of AU. */
-int		au_open_write	(SF_PRIVATE *psf) ;
+int psf_open (const char *pathname, int flags) ;
 
-int		wav_open_read	(SF_PRIVATE *psf) ;
-int		wav_open_write	(SF_PRIVATE *psf) ;
+sf_count_t psf_fseek (int fd, sf_count_t offset, int whence) ;
+sf_count_t psf_fread (void *ptr, sf_count_t bytes, sf_count_t count, int fd) ;
+sf_count_t psf_fwrite (void *ptr, sf_count_t bytes, sf_count_t count, int fd) ;
+sf_count_t psf_fgets (char *buffer, sf_count_t bufsize, int fd) ;
+sf_count_t psf_ftell (int fd) ;
+sf_count_t psf_get_filelen (int fd) ;
 
-int		raw_open_read	(SF_PRIVATE *psf) ;
-int		raw_open_write	(SF_PRIVATE *psf) ;
+void psf_fclearerr (int fd) ;
 
-int		paf_open_read	(SF_PRIVATE *psf) ;
-int		paf_open_write	(SF_PRIVATE *psf) ;
+int psf_ferror (int fd) ;
+int psf_fclose (int fd) ;
 
-int		svx_open_read	(SF_PRIVATE *psf) ;
-int		svx_open_write	(SF_PRIVATE *psf) ;
+/*------------------------------------------------------------------------------------ 
+** Functions for reading and writing different file formats.
+*/
 
-int		nist_open_read	(SF_PRIVATE *psf) ;
-int		nist_open_write	(SF_PRIVATE *psf) ;
+int		aiff_open	(SF_PRIVATE *psf) ;
+int		au_open		(SF_PRIVATE *psf) ;
+int		au_nh_open	(SF_PRIVATE *psf) ;	/* Headerless version of AU. */
+int		ircam_open	(SF_PRIVATE *psf) ;
+int		nist_open	(SF_PRIVATE *psf) ;
+int		paf_open	(SF_PRIVATE *psf) ;
+int		raw_open	(SF_PRIVATE *psf) ;
+int		svx_open	(SF_PRIVATE *psf) ;
+int		voc_open	(SF_PRIVATE *psf) ;
+int		w64_open	(SF_PRIVATE *psf) ;
+int		wav_open	(SF_PRIVATE *psf) ;
 
-int		smpltd_open_read	(SF_PRIVATE *psf) ;
-int		smpltd_open_write	(SF_PRIVATE *psf) ;
+/* In progress. Do not currently work. */
 
-int		voc_open_read	(SF_PRIVATE *psf) ;
-int		voc_open_write	(SF_PRIVATE *psf) ;
+int		rx2_open	(SF_PRIVATE *psf) ;
+int		sd2_open	(SF_PRIVATE *psf) ;
+int		smpltd_open	(SF_PRIVATE *psf) ;
+int		txw_open	(SF_PRIVATE *psf) ;
 
-int		rx2_open_read	(SF_PRIVATE *psf) ;
-int		rx2_open_write	(SF_PRIVATE *psf) ;
+/*------------------------------------------------------------------------------------ 
+**	Init functions for a number of common data encodings. 
+*/
 
-int		ircam_open_read		(SF_PRIVATE *psf) ;
-int		ircam_open_write	(SF_PRIVATE *psf) ;
+int 	pcm_init		(SF_PRIVATE *psf) ;
+int 	ulaw_init		(SF_PRIVATE *psf) ;
+int 	alaw_init		(SF_PRIVATE *psf) ;
+int 	float32_init	(SF_PRIVATE *psf) ;
+int 	double64_init	(SF_PRIVATE *psf) ;
+int 	dwvw_init		(SF_PRIVATE *psf, int bitwidth) ;
+int		gsm610_init 	(SF_PRIVATE *psf) ;
 
+int		wav_w64_ima_init (SF_PRIVATE *psf, int blockalign, int samplesperblock) ;
+int		wav_w64_msadpcm_init (SF_PRIVATE *psf, int blockalign, int samplesperblock) ;
 
-/*	Win32 does seem to have snprintf and vsnprintf but prepends
-**	the names with an underscore. Why?
+int		aiff_ima_init (SF_PRIVATE *psf, int blockalign, int samplesperblock) ;
+
+/*------------------------------------------------------------------------------------ 
+** Here's how we fix systems which don't snprintf / vsnprintf.
+** Systems without these functions should use the 
 */
 
-#ifdef	WIN32
-#define	snprintf	_snprintf
-#define	vsnprintf	_vsnprintf
+#if (defined (WIN32) || defined (_WIN32))
+#define	LSF_SNPRINTF	_snprintf
+#elif		(HAVE_SNPRINTF && ! FORCE_MISSING_SNPRINTF)
+#define	LSF_SNPRINTF	snprintf
+#else
+int missing_snprintf (char *str, size_t n, char const *fmt, ...) ;
+#define	LSF_SNPRINTF	missing_snprintf
+#endif
+
+#if (defined (WIN32) || defined (_WIN32))
+#define	LSF_VSNPRINTF	_vsnprintf
+#elif		(HAVE_VSNPRINTF && ! FORCE_MISSING_SNPRINTF)
+#define	LSF_VSNPRINTF	vsnprintf
+#else
+int missing_vsnprintf (char *str, size_t n, const char *fmt, ...) ;
+#define	LSF_VSNPRINTF	missing_vsnprintf
 #endif
 
 #ifdef _WIN32
--- a/common/libsndfile/src/config.h.in
+++ b/common/libsndfile/src/config.h.in
@@ -1,33 +1,8 @@
 /* src/config.h.in.  Generated automatically from configure.in by autoheader 2.13.  */
 
-/* Define to `long' if <sys/types.h> doesn't define.  */
-#undef off_t
-
-/* Define to `unsigned' if <sys/types.h> doesn't define.  */
-#undef size_t
-
 /* Define if you have the ANSI C header files.  */
 #undef STDC_HEADERS
 
-/* Define to `long' if <sys/types.h> doesn't define.  */
-#undef off_t
-
-/* Define to `unsigned' if <sys/types.h> doesn't define.  */
-#undef size_t
-
-/* Define if you have the ANSI C header files.  */
-#undef STDC_HEADERS
-
-/* Set to 1 if the processor is big endian, otherwise set to 0.  */
-#undef GUESS_BIG_ENDIAN
-
-/* Set to 1 if the processor is little endian, otherwise set to 0.  */
-#undef GUESS_LITTLE_ENDIAN
-
-/* Set to 1 to force the use of code for processors with broken floats */
-/* Otherwise set it to 0.  */
-#undef FORCE_BROKEN_FLOAT
-
 /* The number of bytes in a double.  */
 #undef SIZEOF_DOUBLE
 
@@ -40,6 +15,9 @@
 /* The number of bytes in a long.  */
 #undef SIZEOF_LONG
 
+/* The number of bytes in a off_t.  */
+#undef SIZEOF_OFF_T
+
 /* The number of bytes in a short.  */
 #undef SIZEOF_SHORT
 
@@ -46,30 +24,24 @@
 /* The number of bytes in a void*.  */
 #undef SIZEOF_VOIDP
 
-/* Define if you have the fclose function.  */
-#undef HAVE_FCLOSE
-
-/* Define if you have the fopen function.  */
-#undef HAVE_FOPEN
-
-/* Define if you have the fread function.  */
-#undef HAVE_FREAD
-
 /* Define if you have the free function.  */
 #undef HAVE_FREE
 
-/* Define if you have the fseek function.  */
-#undef HAVE_FSEEK
+/* Define if you have the fstat function.  */
+#undef HAVE_FSTAT
 
-/* Define if you have the ftell function.  */
-#undef HAVE_FTELL
+/* Define if you have the lseek function.  */
+#undef HAVE_LSEEK
 
-/* Define if you have the fwrite function.  */
-#undef HAVE_FWRITE
-
 /* Define if you have the malloc function.  */
 #undef HAVE_MALLOC
 
+/* Define if you have the open function.  */
+#undef HAVE_OPEN
+
+/* Define if you have the read function.  */
+#undef HAVE_READ
+
 /* Define if you have the snprintf function.  */
 #undef HAVE_SNPRINTF
 
@@ -76,6 +48,12 @@
 /* Define if you have the vsnprintf function.  */
 #undef HAVE_VSNPRINTF
 
+/* Define if you have the write function.  */
+#undef HAVE_WRITE
+
+/* Define if you have the <dlfcn.h> header file.  */
+#undef HAVE_DLFCN_H
+
 /* Define if you have the <endian.h> header file.  */
 #undef HAVE_ENDIAN_H
 
@@ -84,4 +62,34 @@
 
 /* Version number of package */
 #undef VERSION
+
+/* Number of bits in a file offset, on hosts where this is settable. */
+#undef _FILE_OFFSET_BITS
+
+/* Define to make fseeko etc. visible, on some hosts. */
+#undef _LARGEFILE_SOURCE
+
+/* Define for large files, on AIX-style hosts. */
+#undef _LARGE_FILES
+
+/* Target processor is big endian. */
+#undef CPU_IS_BIG_ENDIAN
+
+/* Target processor is little endian. */
+#undef CPU_IS_LITTLE_ENDIAN
+
+/* Define if you have C99's lrint function. */
+#undef HAVE_LRINT
+
+/* Define if you have C99's lrintf function. */
+#undef HAVE_LRINTF
+
+/* Set to 1 to force the use of code for processors with broken floats */
+#undef FORCE_BROKEN_FLOAT
+
+/* Set to 1 to force the use of code for processors with broken floats */
+#undef FORCE_BROKEN_FLOAT
+
+/* Set to 1 if compiling for Win32 */
+#undef OS_IS_WIN32
 
--- /dev/null
+++ b/common/libsndfile/src/double64.c
@@ -1,0 +1,620 @@
+/*
+** Copyright (C) 1999-2002 Erik de Castro Lopo <[email protected]>
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+** 
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+** 
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+
+#include	<stdio.h>
+#include	<unistd.h>
+#include	<string.h>
+
+#include	"sndfile.h"
+#include	"config.h"
+#include	"sfendian.h"
+#include	"common.h"
+#include	"float_cast.h"
+
+/*--------------------------------------------------------------------------------------------
+**	Processor floating point capabilities. double64_get_capability () returns one of the 
+**	latter three values.
+*/
+
+enum
+{	DOUBLE_UNKNOWN		= 0x00,
+	DOUBLE_CAN_RW_LE	= 0x23,
+	DOUBLE_CAN_RW_BE	= 0x34,
+	DOUBLE_BROKEN_LE	= 0x35,
+	DOUBLE_BROKEN_BE	= 0x36
+} ;
+
+/*--------------------------------------------------------------------------------------------
+**	Prototypes for private functions.
+*/
+
+static sf_count_t		host_read_d2s   (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static sf_count_t		host_read_d2i   (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+static sf_count_t		host_read_d2f   (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+static sf_count_t		host_read_d     (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
+
+static sf_count_t		host_write_s2d   (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static sf_count_t		host_write_i2d   (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+static sf_count_t		host_write_f2d   (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+static sf_count_t		host_write_d     (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
+
+static	void	d2s_array 	(double *buffer, unsigned int count, short *ptr) ;
+static	void	d2i_array 	(double *buffer, unsigned int count, int *ptr) ;
+static	void	d2f_array 	(double *buffer, unsigned int count, float *ptr) ;
+
+static 	void	s2d_array 	(short *ptr, double *buffer, unsigned int count) ;
+static 	void	i2d_array 	(int *ptr, double *buffer, unsigned int count) ;
+static 	void	f2d_array 	(float *ptr, double *buffer, unsigned int count) ;
+
+static void		double64_peak_update (SF_PRIVATE *psf, double *buffer, int count, int index) ;
+
+static int		double64_get_capability (void) ;
+
+/*--------------------------------------------------------------------------------------------
+**	Exported functions.
+*/
+
+int
+double64_init (SF_PRIVATE *psf)
+{	static int double64_caps = DOUBLE_UNKNOWN ;
+
+	if (double64_caps == DOUBLE_UNKNOWN)
+		double64_caps = double64_get_capability () ;
+	
+	psf->blockwidth = sizeof (double) * psf->sf.channels ;
+
+	if (psf->mode == SFM_READ || psf->mode == SFM_RDWR)
+	{	switch (psf->endian + double64_caps)
+		{	case (SF_ENDIAN_BIG + DOUBLE_CAN_RW_BE) :
+					psf->float_endswap = SF_FALSE ;
+					psf->read_short  = host_read_d2s ;
+					psf->read_int    = host_read_d2i ;
+					psf->read_float  = host_read_d2f ;
+					psf->read_double = host_read_d ;
+					break ;
+					
+			case (SF_ENDIAN_LITTLE + DOUBLE_CAN_RW_LE) :
+					psf->float_endswap = SF_FALSE ;
+					psf->read_short  = host_read_d2s ;
+					psf->read_int    = host_read_d2i ;
+					psf->read_float  = host_read_d2f ;
+					psf->read_double = host_read_d ;
+					break ;
+	
+			case (SF_ENDIAN_BIG + DOUBLE_CAN_RW_LE) :
+					psf->float_endswap = SF_TRUE ;
+					psf->read_short  = host_read_d2s ;
+					psf->read_int    = host_read_d2i ;
+					psf->read_float  = host_read_d2f ;
+					psf->read_double = host_read_d ;
+					break ;
+					
+			case (SF_ENDIAN_LITTLE + DOUBLE_CAN_RW_BE) :
+					psf->float_endswap = SF_TRUE ;
+					psf->read_short  = host_read_d2s ;
+					psf->read_int    = host_read_d2i ;
+					psf->read_float  = host_read_d2f ;
+					psf->read_double = host_read_d ;
+					break ;
+					
+			default : break ;
+			} ;
+		} ;
+
+	if (psf->mode == SFM_WRITE || psf->mode == SFM_RDWR)
+	{	switch (psf->endian + double64_caps)
+		{	case (SF_ENDIAN_LITTLE + DOUBLE_CAN_RW_LE) :
+					psf->float_endswap = SF_FALSE ;
+					psf->write_short  = host_write_s2d ;
+					psf->write_int    = host_write_i2d ;
+					psf->write_float  = host_write_f2d ;
+					psf->write_double = host_write_d ;
+					break ;
+	
+			case (SF_ENDIAN_BIG + DOUBLE_CAN_RW_BE) :
+					psf->float_endswap = SF_FALSE ;
+					psf->write_short  = host_write_s2d ;
+					psf->write_int    = host_write_i2d ;
+					psf->write_float  = host_write_f2d ;
+					psf->write_double = host_write_d ;
+					break ;
+					
+			case (SF_ENDIAN_BIG + DOUBLE_CAN_RW_LE) :
+					psf->float_endswap = SF_TRUE ;
+					psf->write_short  = host_write_s2d ;
+					psf->write_int    = host_write_i2d ;
+					psf->write_float  = host_write_f2d ;
+					psf->write_double = host_write_d ;
+					break ;
+					
+			case (SF_ENDIAN_LITTLE + DOUBLE_CAN_RW_BE) :
+					psf->float_endswap = SF_TRUE ;
+					psf->write_short  = host_write_s2d ;
+					psf->write_int    = host_write_i2d ;
+					psf->write_float  = host_write_f2d ;
+					psf->write_double = host_write_d ;
+					break ;
+					
+			default : break ;
+			} ;
+		};
+
+	psf->filelength = psf_get_filelen (psf->filedes) ;
+	psf->datalength = (psf->dataend) ? psf->dataend - psf->dataoffset : 
+							psf->filelength - psf->dataoffset ;
+	psf->sf.samples = psf->datalength / (psf->sf.channels * sizeof (double)) ;
+
+	return 0 ;
+} /* double64_init */	
+
+double
+double64_read (unsigned char *cptr)
+{	int		exponent, mantissa, negative ;
+	double	fvalue ;
+
+	if (CPU_IS_LITTLE_ENDIAN)
+	{	negative = cptr [3] & 0x80 ;
+		exponent = ((cptr [3] & 0x7F) << 1) | ((cptr [2] & 0x80) ? 1 : 0);
+		mantissa = ((cptr [2] & 0x7F) << 16) | (cptr [1] << 8) | (cptr [0]) ;
+		}
+	else
+	{	negative = cptr [0] & 0x80 ;
+		exponent = ((cptr [0] & 0x7F) << 1) | ((cptr [1] & 0x80) ? 1 : 0);
+		mantissa = ((cptr [1] & 0x7F) << 16) | (cptr [2] << 8) | (cptr [3]) ;
+		} ;
+
+	if (! (exponent || mantissa))
+		return 0.0 ;
+
+	mantissa |= 0x800000 ;
+	exponent = exponent ? exponent - 127 : 0 ;
+                
+	fvalue = mantissa ? ((float) mantissa) / ((float) 0x800000) : 0.0 ;
+                
+	if (negative)
+		fvalue *= -1 ;
+                
+	if (exponent > 0)
+		fvalue *= (1 << exponent) ;
+	else if (exponent < 0)
+		fvalue /= (1 << abs (exponent)) ;
+
+	return fvalue ;
+} /* double64_read */
+
+void	
+double64_write (double in, unsigned char *out)
+{	int		exponent, mantissa, negative = 0 ;
+
+	*((int*) out) = 0 ;
+	
+	if (in == 0.0)
+		return ;
+	
+	if (in < 0.0)
+	{	in *= -1.0 ;
+		negative = 1 ;
+		} ;
+		
+	in = frexp (in, &exponent) ;
+	
+	exponent += 126 ;
+	
+	in *= (float) 0x1000000 ;
+	mantissa = (((int) in) & 0x7FFFFF) ;
+
+	if (CPU_IS_LITTLE_ENDIAN)	
+	{	if (negative)
+			out [3] |= 0x80 ;
+			
+		if (exponent & 0x01)
+			out [2] |= 0x80 ;
+	
+		out [0]  = mantissa & 0xFF ;
+		out [1]  = (mantissa >> 8) & 0xFF ;
+		out [2] |= (mantissa >> 16) & 0x7F ;
+		out [3] |= (exponent >> 1) & 0x7F ;
+		}
+	else
+	{	if (negative)
+			out [0] |= 0x80 ;
+			
+		if (exponent & 0x01)
+			out [1] |= 0x80 ;
+	
+		out [3]  = mantissa & 0xFF ;
+		out [2]  = (mantissa >> 8) & 0xFF ;
+		out [1] |= (mantissa >> 16) & 0x7F ;
+		out [0] |= (exponent >> 1) & 0x7F ;
+		}
+	
+	return ;
+} /* double64_write */
+
+/*==============================================================================================
+**	Private functions.
+*/
+
+static void
+double64_peak_update (SF_PRIVATE *psf, double *buffer, int count, int index)
+{	int 	chan ;
+	int		k, position ;
+	float	fmaxval;
+	
+	for (chan = 0 ; chan < psf->sf.channels ; chan++)
+	{	fmaxval = fabs (buffer [chan]) ;
+		position = 0 ;
+		for (k = chan ; k < count ; k += psf->sf.channels)
+			if (fmaxval < fabs (buffer [k]))
+			{	fmaxval = fabs (buffer [k]) ;
+				position = k ;
+				} ;
+				
+		if (fmaxval > psf->peak.peak[chan].value)
+		{	psf->peak.peak[chan].value = fmaxval ;
+			psf->peak.peak[chan].position = psf->write_current + index + (position /psf->sf.channels) ;
+			} ;
+		} ;
+
+	return ;	
+} /* double64_peak_update */
+
+static int
+double64_get_capability (void)
+{	union 
+	{	double			d ;
+		int				i [2] ;
+		unsigned char	c [8] ;
+	} data ;
+
+	data.d = 1.234567890123456789 ; /* Some abitrary value. */
+	
+	if (FORCE_BROKEN_FLOAT)
+		return (CPU_IS_LITTLE_ENDIAN) ? DOUBLE_BROKEN_LE : DOUBLE_BROKEN_BE ;
+
+	/* If this test is true ints and floats are compatible and little endian. */
+	if (data.i [0] == 0x428c59fb && data.i [1] == 0x3ff3c0ca && 
+		data.c [0] == 0xfb && data.c [2] == 0x8c && data.c [4] == 0xca && data.c [6] == 0xf3)
+		return DOUBLE_CAN_RW_LE ;
+
+	/* If this test is true ints and floats are compatible and big endian. */
+	if (data.i [0] == 0x3ff3c0ca && data.i [1] == 0x428c59fb &&
+		data.c [0] == 0x3f && data.c [2] == 0xc0 && data.c [4] == 0x42 && data.c [6] == 0x59)
+		return DOUBLE_CAN_RW_BE ;
+		
+	/* Doubles are broken. Don't expect reading or writing to be fast. */
+	return (CPU_IS_LITTLE_ENDIAN) ? DOUBLE_BROKEN_LE : DOUBLE_BROKEN_BE ;
+} /* double64_get_capability */
+
+/*----------------------------------------------------------------------------------------------
+*/
+
+
+static sf_count_t
+host_read_d2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
+{	unsigned int readcount, thisread ;
+	int		bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		thisread = psf_fread (psf->buffer, 1, readcount, psf->filedes) ;
+		
+		if (psf->float_endswap == SF_TRUE)
+			endswap_long_array ((long*) psf->buffer, readcount / sizeof (int)) ;
+
+		d2s_array ((double*) (psf->buffer), thisread / psf->bytewidth, ptr + index) ;
+		total += thisread ;
+		if (thisread < readcount)
+			break ;
+		index += thisread / psf->bytewidth ;
+		bytecount -= thisread ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_READ ;
+	
+	return total ;
+} /* host_read_d2s */
+
+static sf_count_t
+host_read_d2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
+{	unsigned int readcount, thisread ;
+	int		bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		thisread = psf_fread (psf->buffer, 1, readcount, psf->filedes) ;
+		
+		if (psf->float_endswap == SF_TRUE)
+			endswap_long_array ((long*) psf->buffer, readcount / sizeof (int)) ;
+
+		d2i_array ((double*) (psf->buffer), thisread / psf->bytewidth, ptr + index) ;
+		total += thisread ;
+		if (thisread < readcount)
+			break ;
+		index += thisread / psf->bytewidth ;
+		bytecount -= thisread ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_READ ;
+	
+	return total ;
+} /* host_read_d2i */
+
+static sf_count_t
+host_read_d2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
+{	unsigned int readcount, thisread ;
+	int		bytecount, bufferlen ;
+	int	index = 0, total = 0 ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		thisread = psf_fread (psf->buffer, 1, readcount, psf->filedes) ;
+		
+		if (psf->float_endswap == SF_TRUE)
+			endswap_long_array ((long*) psf->buffer, readcount / sizeof (int)) ;
+
+		d2f_array ((double*) (psf->buffer), thisread / psf->bytewidth, ptr + index) ;
+		total += thisread ;
+		if (thisread < readcount)
+			break ;
+		index += thisread / psf->bytewidth ;
+		bytecount -= thisread ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_READ ;
+	
+	return total ;
+} /* host_read_d2f */
+
+static sf_count_t
+host_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
+{	unsigned int readcount, thisread ;
+	int		bytecount, bufferlen ;
+	int	index = 0, total = 0 ;
+	
+	if (psf->float_endswap != SF_TRUE)
+		total = psf_fread (ptr, sizeof (double), len, psf->filedes) ; 
+	else
+	{	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+		bytecount = len * psf->bytewidth ;
+		while (bytecount > 0)
+		{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+			thisread = psf_fread (psf->buffer, 1, readcount, psf->filedes) ;
+			
+			endswap_long_array ((long*) psf->buffer, readcount / sizeof (int)) ;
+	
+			memcpy (ptr + index, psf->buffer, thisread) ;
+	
+			total += thisread ;
+			if (thisread < readcount)
+				break ;
+			index += thisread / psf->bytewidth ;
+			bytecount -= thisread ;
+			} ;
+		total /= psf->bytewidth ;
+		} ;
+
+	if (total < len)
+		psf->error = SFE_SHORT_READ ;
+	
+	return total ;
+} /* host_read_d */
+
+static sf_count_t
+host_write_s2d	(SF_PRIVATE *psf, short *ptr, sf_count_t len)
+{	unsigned int	writecount, thiswrite ;
+	int	bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		s2d_array (ptr + index, (double*) (psf->buffer), writecount / psf->bytewidth) ;
+		
+		double64_peak_update (psf, (double*) (psf->buffer), writecount / psf->bytewidth, index / psf->sf.channels) ;
+		
+		if (psf->float_endswap == SF_TRUE)
+			endswap_long_array ((long*) psf->buffer, writecount / sizeof (int)) ;
+			
+		thiswrite = psf_fwrite (psf->buffer, 1, writecount, psf->filedes) ;
+		total += thiswrite ;
+		if (thiswrite < writecount)
+			break ;
+		index += thiswrite / psf->bytewidth ;
+		bytecount -= thiswrite ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_WRITE ;
+	
+	return total ;
+} /* host_write_s2d */
+
+static sf_count_t
+host_write_i2d	(SF_PRIVATE *psf, int *ptr, sf_count_t len)
+{	unsigned int	writecount, thiswrite ;
+	int	bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		i2d_array (ptr + index, (double*) (psf->buffer), writecount / psf->bytewidth) ;
+		
+		double64_peak_update (psf, (double*) (psf->buffer), writecount / psf->bytewidth, index / psf->sf.channels) ;
+		
+		if (psf->float_endswap == SF_TRUE)
+			endswap_long_array ((long*) psf->buffer, writecount / sizeof (int)) ;
+			
+		thiswrite = psf_fwrite (psf->buffer, 1, writecount, psf->filedes) ;
+		total += thiswrite ;
+		if (thiswrite < writecount)
+			break ;
+		index += thiswrite / psf->bytewidth ;
+		bytecount -= thiswrite ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_WRITE ;
+	
+	return total ;
+} /* host_write_i2d */
+
+static sf_count_t
+host_write_f2d	(SF_PRIVATE *psf, float *ptr, sf_count_t len)
+{	unsigned int	writecount, thiswrite ;
+	int		bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		f2d_array (ptr + index, (double*) (psf->buffer), writecount / psf->bytewidth) ;
+		
+		double64_peak_update (psf, (double*) (psf->buffer), writecount / psf->bytewidth, index / psf->sf.channels) ;
+		
+		if (psf->float_endswap == SF_TRUE)
+			endswap_long_array ((long*) psf->buffer, writecount / sizeof (int)) ;
+			
+		thiswrite = psf_fwrite (psf->buffer, 1, writecount, psf->filedes) ;
+		total += thiswrite ;
+		if (thiswrite < writecount)
+			break ;
+		index += thiswrite / psf->bytewidth ;
+		bytecount -= thiswrite ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_WRITE ;
+	
+	return total ;
+} /* host_write_f2d */
+
+static sf_count_t
+host_write_d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
+{	unsigned int	writecount, thiswrite ;
+	int	bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+
+	double64_peak_update (psf, ptr, len, 0) ;
+			
+	if (psf->float_endswap != SF_TRUE)
+		total = psf_fwrite (ptr, sizeof (double), len, psf->filedes) ; 
+	else
+	{	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+		bytecount = len * psf->bytewidth ;
+		while (bytecount > 0)
+		{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+	
+			memcpy (psf->buffer, ptr + index, writecount) ;
+			
+			if (psf->float_endswap == SF_TRUE)
+				endswap_long_array ((long*) psf->buffer, writecount / sizeof (int)) ;
+				
+			thiswrite = psf_fwrite (psf->buffer, 1, writecount, psf->filedes) ;
+			total += thiswrite ;
+			if (thiswrite < writecount)
+				break ;
+			index += thiswrite / psf->bytewidth ;
+			bytecount -= thiswrite ;
+			} ;
+		total /= psf->bytewidth ;
+		} ;
+
+	if (total < len)
+		psf->error = SFE_SHORT_WRITE ;
+	
+	return total ;
+} /* host_write_d */
+
+/*=======================================================================================
+*/
+
+static void	
+d2s_array (double *buffer, unsigned int count, short *ptr)
+{	while (count)
+	{	count -- ;
+		ptr [count] = lrint (buffer [count]) ;
+		} ;
+} /* d2s_array */
+
+static void	
+d2i_array (double *buffer, unsigned int count, int *ptr)
+{	while (count)
+	{	count -- ;
+		ptr [count] = lrint (buffer [count]) ;
+		} ;
+} /* d2i_array */
+
+static void	
+d2f_array (double *buffer, unsigned int count, float *ptr)
+{	while (count)
+	{	count -- ;
+		ptr [count] = buffer [count] ;
+		} ;
+} /* d2f_array */
+
+static  void	
+s2d_array (short *ptr, double *buffer, unsigned int count)
+{	while (count)
+	{	count -- ;
+		buffer [count] = ptr [count] ;
+		} ;
+		
+} /* s2d_array */
+
+static void	
+i2d_array (int *ptr, double *buffer, unsigned int count)
+{	while (count)
+	{	count -- ;
+		buffer [count] = ptr [count] ;
+		} ;
+} /* i2d_array */
+
+static void	
+f2d_array (float *ptr, double *buffer, unsigned int count)
+{	while (count)
+	{	count -- ;
+		buffer [count] = ptr [count] ;
+		} ;
+} /* f2d_array */
+
+/*=======================================================================================
+*/
+
--- /dev/null
+++ b/common/libsndfile/src/dwvw.c
@@ -1,0 +1,644 @@
+/*
+** Copyright (C) 2002 Erik de Castro Lopo <[email protected]>
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+** 
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+** 
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+/*===========================================================================
+** Delta Word Variable Width
+** 
+** This decoder and encoder were implemented using information found in this
+** document : http://home.swbell.net/rubywand/R011SNDFMTS.TXT 
+**
+** According to the document, the algorithm "was invented 1991 by Magnus 
+** Lidstrom and is copyright 1993 by NuEdge Development".
+*/
+
+#include	<stdio.h>
+#include	<unistd.h>
+#include	<string.h>
+
+#include	"sndfile.h"
+#include	"config.h"
+#include	"sfendian.h"
+#include	"float_cast.h"
+#include	"common.h"
+
+typedef struct
+{	int		filedes ;
+	int		dwm_maxsize, bit_width, max_delta, span ;
+	int		samplecount ;
+	int		bit_count, bits, last_delta_width, last_sample ;
+	struct
+	{	int				index, end ;
+		unsigned char	buffer [256] ;
+	} b ;
+} DWVW_PRIVATE ;
+
+/*============================================================================================
+*/
+
+static sf_count_t dwvw_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static sf_count_t dwvw_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+static sf_count_t dwvw_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+static sf_count_t dwvw_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
+
+static sf_count_t dwvw_write_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static sf_count_t dwvw_write_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+static sf_count_t dwvw_write_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+static sf_count_t dwvw_write_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
+
+static sf_count_t	dwvw_seek   (SF_PRIVATE *psf, int mode, sf_count_t offset) ;
+static int	dwvw_close  (SF_PRIVATE *psf) ;
+
+static sf_count_t dwvw_decode_data (DWVW_PRIVATE *pdwvw, int *ptr, sf_count_t len) ;
+static int  dwvw_decode_load_bits (DWVW_PRIVATE *pdwvw, int bit_count) ;
+
+static sf_count_t	dwvw_encode_data (DWVW_PRIVATE *pdwvw, int *ptr, sf_count_t len) ;
+static void dwvw_encode_store_bits (DWVW_PRIVATE *pdwvw, int data, int new_bits) ;
+static void dwvw_read_reset (DWVW_PRIVATE *pdwvw) ;
+
+/*============================================================================================
+** DWVW initialisation function.
+*/
+
+int	
+dwvw_init (SF_PRIVATE *psf, int bitwidth)
+{	DWVW_PRIVATE	*pdwvw ;
+	
+	if (bitwidth > 24)
+		return SFE_DWVW_BAD_BITWIDTH ;
+
+	if (psf->mode == SFM_RDWR)
+		return SFE_BAD_MODE_RW ;
+
+	if (! (pdwvw = malloc (sizeof (DWVW_PRIVATE))))
+		return SFE_MALLOC_FAILED ;
+
+	psf->fdata = (void*) pdwvw ;
+
+	memset (pdwvw, 0, sizeof (DWVW_PRIVATE)) ;
+
+	pdwvw->filedes = psf->filedes ;
+
+	pdwvw->bit_width 	= bitwidth ;
+	pdwvw->dwm_maxsize	= bitwidth / 2 ;
+	pdwvw->max_delta	= 1 << (bitwidth - 1) ;
+	pdwvw->span			= 1 << bitwidth ;
+
+	dwvw_read_reset (pdwvw) ;
+	
+	if (psf->mode == SFM_READ)
+	{	psf->read_short  = dwvw_read_s ;
+		psf->read_int    = dwvw_read_i ;
+		psf->read_float  = dwvw_read_f ;
+		psf->read_double = dwvw_read_d ;
+		} ;
+		
+	if (psf->mode == SFM_WRITE)
+	{	psf->write_short  = dwvw_write_s ;
+		psf->write_int    = dwvw_write_i ;
+		psf->write_float  = dwvw_write_f ;
+		psf->write_double = dwvw_write_d ;
+		} ;
+
+	psf->new_seek	= dwvw_seek ;
+	psf->close  	= dwvw_close ;
+
+	/* FIXME : This s bogus. */
+	if (psf->sf.samples <= 0)
+		psf->sf.samples = (psf->blockwidth) ? SF_MAX_COUNT / psf->blockwidth : SF_MAX_COUNT ; 
+
+	psf->datalength = SF_MAX_COUNT ;
+	/* EMXIF : This s bogus. */
+
+	return 0 ;	
+} /* dwvw_init */
+
+/*--------------------------------------------------------------------------------------------
+*/
+
+static int
+dwvw_close  (SF_PRIVATE *psf)
+{	DWVW_PRIVATE *pdwvw ; 
+
+	if (! psf->fdata)
+		return 0 ;
+	pdwvw = (DWVW_PRIVATE*) psf->fdata ;
+
+	if (psf->mode == SFM_WRITE)
+	{	static int last_values [8] = { 0, 0, 0, 0, 0, 0, 0, 0 } ;
+	
+		/* Write 8 zero samples to fully flush output. */
+		dwvw_encode_data (pdwvw, last_values, 8) ;
+	
+		/* Write the last buffer worth of data to disk. */
+		psf_fwrite (pdwvw->b.buffer, 1, pdwvw->b.index, pdwvw->filedes) ;
+		
+		/*  Now we know for certain the length of the file we can re-write 
+		**	correct values for the FORM, COMM and SSND chunks.
+		*/
+		 
+		psf_fseek (psf->filedes, 0, SEEK_END) ;		
+		psf->filelength = psf_ftell (psf->filedes) ;
+		psf_fseek (psf->filedes, 0, SEEK_SET) ;
+		
+		psf->datalength = psf->filelength - psf->dataoffset ;
+		
+ 		psf->sf.samples = pdwvw->samplecount ;
+
+		if (psf->write_header)
+			psf->write_header (psf) ;
+		} ;
+
+	if (psf->fdata)
+		free (psf->fdata) ;
+	psf->fdata = NULL ;
+	
+	return 0 ;
+} /* dwvw_close */
+
+static sf_count_t	
+dwvw_seek   (SF_PRIVATE *psf, int mode, sf_count_t offset)
+{	DWVW_PRIVATE *pdwvw ; 
+
+	mode = mode ;
+
+	if (! psf->fdata)
+	{	psf->error = SFE_INTERNAL ;
+		return ((sf_count_t) -1) ;
+		} ;
+
+	pdwvw = (DWVW_PRIVATE*) psf->fdata ;
+
+	if (offset == 0)
+	{	psf_fseek (psf->filedes, psf->dataoffset, SEEK_SET) ;
+		dwvw_read_reset (pdwvw) ;
+		return 0 ;
+		} ;
+
+	psf->error = SFE_BAD_SEEK ;
+	return	((sf_count_t) -1) ;
+} /* dwvw_seek */
+
+
+/*==============================================================================
+*/
+
+static sf_count_t 
+dwvw_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
+{	DWVW_PRIVATE *pdwvw ; 
+	int		*iptr ;
+	int		k, bufferlen, readcount = 0, count ;
+	int		index = 0, total = 0 ;
+
+	if (! psf->fdata)
+		return 0 ;
+	pdwvw = (DWVW_PRIVATE*) psf->fdata ;
+
+	iptr = (int*) psf->buffer ;
+	bufferlen = SF_BUFFER_LEN / sizeof (int) ;
+	while (len > 0)
+	{	readcount = (len >= bufferlen) ? bufferlen : len ;
+		count = dwvw_decode_data (pdwvw, iptr, readcount) ;
+		for (k = 0 ; k < readcount ; k++)
+			ptr [index + k] = iptr [k] >> 16 ;
+		index += readcount ;
+		total += count ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* dwvw_read_s */
+
+static sf_count_t 
+dwvw_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
+{	DWVW_PRIVATE *pdwvw ;
+	sf_count_t	total ;
+	
+	if (! psf->fdata)
+		return 0 ;
+	pdwvw = (DWVW_PRIVATE*) psf->fdata ;
+	
+	total =  dwvw_decode_data (pdwvw, ptr, len) ;
+	
+	return total ;
+} /* dwvw_read_i */
+
+static sf_count_t 
+dwvw_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
+{	DWVW_PRIVATE *pdwvw ; 
+	int		*iptr ;
+	int		k, bufferlen, readcount = 0, count ;
+	int		index = 0, total = 0 ;
+	float	normfact ;
+
+	if (! psf->fdata)
+		return 0 ;
+	pdwvw = (DWVW_PRIVATE*) psf->fdata ;
+	
+	normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x80000000) : 1.0 ;
+
+	iptr = (int*) psf->buffer ;
+	bufferlen = SF_BUFFER_LEN / sizeof (int) ;
+	while (len > 0)
+	{	readcount = (len >= bufferlen) ? bufferlen : len ;
+		count = dwvw_decode_data (pdwvw, iptr, readcount) ;
+		for (k = 0 ; k < readcount ; k++)
+			ptr [index + k] = normfact * (float) (iptr [k]) ;
+		index += readcount ;
+		total += count ;
+		len -= readcount ;
+		} ;
+	return total ;
+} /* dwvw_read_f */
+
+static sf_count_t 
+dwvw_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
+{	DWVW_PRIVATE *pdwvw ; 
+	int		*iptr ;
+	int		k, bufferlen, readcount = 0, count ;
+	int		index = 0, total = 0 ;
+	double 	normfact ;
+	
+	if (! psf->fdata)
+		return 0 ;
+	pdwvw = (DWVW_PRIVATE*) psf->fdata ;
+	
+	normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x80000000) : 1.0 ;
+
+	iptr = (int*) psf->buffer ;
+	bufferlen = SF_BUFFER_LEN / sizeof (int) ;
+	while (len > 0)
+	{	readcount = (len >= bufferlen) ? bufferlen : len ;
+		count = dwvw_decode_data (pdwvw, iptr, readcount) ;
+		for (k = 0 ; k < readcount ; k++)
+			ptr [index + k] = normfact * (double) (iptr [k]) ;
+		index += readcount ;
+		total += count ;
+		len -= readcount ;
+		} ;
+	return total ;
+} /* dwvw_read_d */
+
+static sf_count_t
+dwvw_decode_data (DWVW_PRIVATE *pdwvw, int *ptr, sf_count_t len)
+{	sf_count_t	count ;
+	int 	delta_width_modifier, delta_width, delta_negative, delta, sample ;
+
+	/* Restore state from last decode call. */
+	delta_width = pdwvw->last_delta_width ;
+	sample = pdwvw->last_sample ;
+
+	for (count = 0 ; count < len ; count++)
+	{	/* If bit_count parameter is zero get the delta_width_modifier. */
+		delta_width_modifier = dwvw_decode_load_bits (pdwvw, -1) ;
+
+		/* Check for end of input bit stream. Break loop if end. */
+		if (delta_width_modifier < 0)
+			break ; 
+
+		if (delta_width_modifier && dwvw_decode_load_bits (pdwvw, 1))
+			delta_width_modifier = - delta_width_modifier ;
+			
+		/* Calculate the current word width. */
+		delta_width = (delta_width + delta_width_modifier + pdwvw->bit_width) % pdwvw->bit_width ;
+
+		/* Load the delta. */
+		delta = 0 ;
+		if (delta_width)
+		{	delta = dwvw_decode_load_bits (pdwvw, delta_width - 1) | (1 << (delta_width - 1)) ;
+			delta_negative = dwvw_decode_load_bits (pdwvw, 1) ;
+			if (delta == pdwvw->max_delta - 1)
+				delta += dwvw_decode_load_bits (pdwvw, 1) ;
+			if (delta_negative)
+				delta = -delta ;
+			} ;
+			
+		/* Calculate the sample */
+		sample += delta ;
+	
+		if (sample >= pdwvw->max_delta)
+			sample -= pdwvw->span ;
+		else if (sample <  - pdwvw->max_delta)
+			sample += pdwvw->span ;
+
+		/* Store the sample justifying to the most significant bit. */
+		ptr [count] = sample << (32 - pdwvw->bit_width) ;
+		
+		if (pdwvw->b.end == 0 && pdwvw->bit_count == 0)
+			break ;
+		} ;
+
+	pdwvw->last_delta_width = delta_width ;
+	pdwvw->last_sample = sample ;
+
+	pdwvw->samplecount += count ;
+
+	return count ;
+} /* dwvw_decode_data */
+
+static int  
+dwvw_decode_load_bits (DWVW_PRIVATE *pdwvw, int bit_count)
+{	int output = 0, get_dwm = SF_FALSE ;
+
+	/*
+	**	Depending on the value of parameter bit_count, either get the 
+	**	required number of bits (ie bit_count > 0) or the 
+	**	delta_width_modifier (otherwise).
+	*/
+	
+	if (bit_count < 0)
+	{	get_dwm = SF_TRUE ;
+		/* modify bit_count to ensure we have enought bits for finding dwm. */
+		bit_count = pdwvw->dwm_maxsize ;
+		} ;
+
+	/* Load bits in bit reseviour. */ 
+	while (pdwvw->bit_count < bit_count)
+	{	if (pdwvw->b.index >= pdwvw->b.end)
+		{	pdwvw->b.end = psf_fread (pdwvw->b.buffer, 1, sizeof (pdwvw->b.buffer), pdwvw->filedes) ;
+			pdwvw->b.index = 0 ;
+			} ;
+			
+		/* Check for end of input stream. */
+		if (bit_count < 8 && pdwvw->b.end == 0)
+			return -1 ;
+
+		pdwvw->bits = (pdwvw->bits << 8) ;
+		
+		if (pdwvw->b.index < pdwvw->b.end)
+		{	pdwvw->bits |= pdwvw->b.buffer [pdwvw->b.index] ;
+			pdwvw->b.index ++ ;
+			} ;
+		pdwvw->bit_count += 8 ;
+		} ;
+
+	/* If asked to get bits do so. */
+	if (! get_dwm)
+	{	output = (pdwvw->bits >> (pdwvw->bit_count - bit_count)) & ((1 << bit_count) - 1) ;
+		pdwvw->bit_count -= bit_count ;
+		return output ;
+		} ;
+		
+	/* Otherwise must have been asked to get delta_width_modifier. */
+	while (output < (pdwvw->dwm_maxsize))
+	{	pdwvw->bit_count -= 1 ;
+		if (pdwvw->bits & (1 << pdwvw->bit_count))
+			break ;
+		output += 1 ;
+		} ;
+		
+	return output ;
+} /* dwvw_decode_load_bits */
+
+static void
+dwvw_read_reset (DWVW_PRIVATE *pdwvw)
+{	pdwvw->samplecount  = 0 ;
+	pdwvw->b.index		= 0 ;
+	pdwvw->b.end		= 0 ;
+	pdwvw->bit_count    = 0 ;
+	pdwvw->bits			= 0 ;
+	pdwvw->last_delta_width = 0 ;
+	pdwvw->last_sample  = 0 ;
+} /* dwvw_read_reset */
+
+static void
+dwvw_encode_store_bits (DWVW_PRIVATE *pdwvw, int data, int new_bits)
+{	int 	byte ;
+
+	/* Shift the bits into the resevoir. */
+	pdwvw->bits = (pdwvw->bits << new_bits) | (data & ((1 << new_bits) - 1)) ;
+	pdwvw->bit_count += new_bits ;
+
+	/* Transfer bit to buffer. */
+	while (pdwvw->bit_count >= 8)
+	{	byte = pdwvw->bits >> (pdwvw->bit_count - 	8) ;
+		pdwvw->bit_count -= 8	;
+		pdwvw->b.buffer [pdwvw->b.index] = byte & 0xFF ;
+		pdwvw->b.index ++ ;
+		} ;
+
+	if (pdwvw->b.index > SIGNED_SIZEOF (pdwvw->b.buffer) - 4) 
+	{	psf_fwrite (pdwvw->b.buffer, 1, pdwvw->b.index, pdwvw->filedes) ;
+		pdwvw->b.index = 0 ;
+		} ;
+
+	return ;
+} /* dwvw_encode_store_bits */
+
+#if 0
+/* Debigging routine. */
+static void
+dump_bits (DWVW_PRIVATE *pdwvw)
+{	int k, mask ;
+
+	for (k = 0 ; k < 10 && k < pdwvw->b.index ; k++)
+	{	mask = 0x80 ;
+		while (mask)
+		{	putchar (mask & pdwvw->b.buffer [k] ? '1' : '0') ;
+			mask >>= 1 ;
+			} ;
+		putchar (' ') ;
+		}
+	
+	for (k = pdwvw->bit_count - 1 ; k >= 0 ; k --)
+		putchar (pdwvw->bits & (1 << k) ? '1' : '0') ;
+
+	putchar ('\n') ;
+} /* dump_bits */
+#endif
+
+#define HIGHEST_BIT(x,count)   		\
+			{	int y = x ;			\
+				(count) = 0 ;	 	\
+				while (y)			\
+				{	(count) ++ ;	\
+					y >>= 1 ;		\
+					} ;				\
+				} ;
+
+static sf_count_t
+dwvw_encode_data (DWVW_PRIVATE *pdwvw, int *ptr, sf_count_t len)
+{	sf_count_t	count ;
+	int 	delta_width_modifier, delta, delta_negative, delta_width, extra_bit ;
+	
+	for (count = 0 ; count < len ; count++)
+	{	delta = (ptr [count] >> (32 - pdwvw->bit_width)) - pdwvw->last_sample ;
+	
+		/* Calculate extra_bit if needed. */
+		extra_bit = -1 ;
+		delta_negative = 0 ;
+		if (delta < -pdwvw->max_delta)
+			delta = pdwvw->max_delta + (delta % pdwvw->max_delta) ;
+		else if (delta == -pdwvw->max_delta)
+		{	extra_bit = 1 ;
+			delta_negative = 1 ;
+			delta = pdwvw->max_delta - 1 ;
+			}
+		else if (delta > pdwvw->max_delta)
+		{	delta_negative = 1 ;
+			delta = pdwvw->span - delta ;
+			delta = abs (delta) ;
+			}
+		else if (delta == pdwvw->max_delta)
+		{	extra_bit = 1 ;
+			delta = pdwvw->max_delta - 1 ;
+			}
+		else if (delta < 0)
+		{	delta_negative = 1 ;
+			delta = abs (delta) ;
+			} ;
+
+		if (delta == pdwvw->max_delta - 1 && extra_bit == -1)
+			extra_bit = 0 ;
+
+		/* Find width in bits of delta */
+		HIGHEST_BIT (delta, delta_width) ;
+
+		/* Calculate the delta_width_modifier */
+		delta_width_modifier = (delta_width - pdwvw->last_delta_width) % pdwvw->bit_width ;
+		if (delta_width_modifier > pdwvw->dwm_maxsize)
+			delta_width_modifier -= pdwvw->bit_width ;
+		if (delta_width_modifier < -pdwvw->dwm_maxsize)
+			delta_width_modifier += pdwvw->bit_width ;
+
+		/* Write delta_width_modifier zeros, followed by terminating '1'. */
+		dwvw_encode_store_bits (pdwvw, 0, abs (delta_width_modifier)) ;
+		if (abs (delta_width_modifier) != pdwvw->dwm_maxsize)
+			dwvw_encode_store_bits (pdwvw, 1, 1) ;
+
+		/*  Write delta_width_modifier sign. */
+		if (delta_width_modifier < 0)
+			dwvw_encode_store_bits (pdwvw, 1, 1) ;
+		if (delta_width_modifier > 0)
+			dwvw_encode_store_bits (pdwvw, 0, 1) ;
+
+		/* Write delta and delta sign bit. */
+		if (delta_width)
+		{	dwvw_encode_store_bits (pdwvw, delta, abs (delta_width) - 1) ;
+			dwvw_encode_store_bits (pdwvw, (delta_negative ? 1 : 0), 1) ;
+			} ;
+
+		/* Write extra bit!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
+		if (extra_bit >= 0)
+			dwvw_encode_store_bits (pdwvw, extra_bit, 1) ;
+			
+		pdwvw->last_sample = ptr [count] >> (32 - pdwvw->bit_width) ;
+		pdwvw->last_delta_width = delta_width ;
+		} ;
+
+	pdwvw->samplecount += count ;
+
+	return count ;
+} /* dwvw_encode_data */
+
+static sf_count_t 
+dwvw_write_s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
+{	DWVW_PRIVATE *pdwvw ; 
+	int		*iptr ;
+	int		k, bufferlen, writecount = 0, count ;
+	int		index = 0, total = 0 ;
+
+	if (! psf->fdata)
+		return 0 ;
+	pdwvw = (DWVW_PRIVATE*) psf->fdata ;
+	
+	iptr = (int*) psf->buffer ;
+	bufferlen = SF_BUFFER_LEN / sizeof (int) ;
+	while (len > 0)
+	{	writecount = (len >= bufferlen) ? bufferlen : len ;
+		for (k = 0 ; k < writecount ; k++)
+			iptr [k] = ptr [index + k] << 16 ;
+		count = dwvw_encode_data (pdwvw, iptr, writecount) ;
+		index += writecount ;
+		total += count ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* dwvw_write_s */
+
+static sf_count_t 
+dwvw_write_i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
+{	DWVW_PRIVATE *pdwvw ;
+	sf_count_t	total ;
+	
+	if (! psf->fdata)
+		return 0 ;
+	pdwvw = (DWVW_PRIVATE*) psf->fdata ;
+	
+	total =  dwvw_encode_data (pdwvw, ptr, len) ;
+	
+	return total ;
+} /* dwvw_write_i */
+
+static sf_count_t 
+dwvw_write_f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
+{	DWVW_PRIVATE *pdwvw ; 
+	int			*iptr ;
+	int			k, bufferlen, writecount = 0, count ;
+	int			index = 0, total = 0 ;
+	float		normfact ;
+
+	if (! psf->fdata)
+		return 0 ;
+	pdwvw = (DWVW_PRIVATE*) psf->fdata ;
+	
+	normfact = (psf->norm_float == SF_TRUE) ? ((float) 0x80000000) : 1.0 ;
+	
+	iptr = (int*) psf->buffer ;
+	bufferlen = SF_BUFFER_LEN / sizeof (short) ;
+	while (len > 0)
+	{	writecount = (len >= bufferlen) ? bufferlen : len ;
+		for (k = 0 ; k < writecount ; k++)
+			iptr [k] = lrintf (normfact * ptr [index + k])  ;
+		count = dwvw_encode_data (pdwvw, iptr, writecount) ;
+		index += writecount ;
+		total += count ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* dwvw_write_f */
+
+static sf_count_t 
+dwvw_write_d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
+{	DWVW_PRIVATE *pdwvw ; 
+	int			*iptr ;
+	int			k, bufferlen, writecount = 0, count ;
+	int			index = 0, total = 0 ;
+	double 		normfact ;
+	
+	if (! psf->fdata)
+		return 0 ;
+	pdwvw = (DWVW_PRIVATE*) psf->fdata ;
+	
+	normfact = (psf->norm_double == SF_TRUE) ? ((double) 0x80000000) : 1.0 ;
+
+	iptr = (int*) psf->buffer ;
+	bufferlen = SF_BUFFER_LEN / sizeof (short) ;
+	while (len > 0)
+	{	writecount = (len >= bufferlen) ? bufferlen : len ;
+		for (k = 0 ; k < writecount ; k++)
+			iptr [k] = lrint (normfact * ptr [index + k])  ;
+		count = dwvw_encode_data (pdwvw, iptr, writecount) ;
+		index += writecount ;
+		total += count ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* dwvw_write_d */
--- /dev/null
+++ b/common/libsndfile/src/file_io.c
@@ -1,0 +1,258 @@
+/*
+** Copyright (C) 2002 Erik de Castro Lopo <[email protected]>
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+** 
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+** 
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <sys/stat.h>
+
+#include "sndfile.h"
+#include "config.h"
+#include "common.h"
+
+#if (defined (WIN32) || defined (_WIN32))
+
+	/* Win32 has a 64 file offset seek function:
+	**		__int64 _lseeki64 (int handle, __int64 offset, int origin);
+	*/
+	#define	EXTRA_OPEN_FLAGS	O_BINARY
+	#define	SF_SEEK				_lseeki64
+	#define SF_FTELL(fd)		_telli64 (fd)
+
+#elif (defined (SIZEOF_OFF_T) && SIZEOF_OFF_T == 8)
+	
+	/* If sizeof (off_t) == 8 everything should just work :-). 
+	** This works if the libray is being compiled as a 64 bit user space
+	** application or as a 32 bit user space library on *BSD, MacOSX.
+	** It will hopefully be the default on everything RealSoonNow (tm).
+	*/
+	#define	EXTRA_OPEN_FLAGS	0
+	#define	SF_SEEK				lseek
+	#define SF_FTELL(fd)		lseek ((fd), 0, SEEK_CUR)
+
+#else
+	/* Fallback position : if sizeof (off_t) == 4 will be limited to files of 
+	** 2^31-1 bytes. 
+	*/
+	#define	EXTRA_OPEN_FLAGS	0
+	#define	SF_SEEK				lseek
+	#define SF_FTELL(fd)		lseek ((fd), 0, SEEK_CUR)
+
+#endif
+
+/*------------------------------------------------------------------------------
+*/
+#if (defined (WIN32) || defined (_WIN32))
+#include <direct.h>
+
+#define	_IFMT		_S_IFMT
+#define _IFREG		_S_IFREG
+
+#define	S_ISREG(m)	((m) & _S_IFREG)
+
+#define	S_IRWXU 	0000700	/* rwx, owner */
+#define		S_IRUSR	0000400	/* read permission, owner */
+#define		S_IWUSR	0000200	/* write permission, owner */
+#define		S_IXUSR	0000100	/* execute/search permission, owner */
+#define	S_IRWXG		0000070	/* rwx, group */
+#define		S_IRGRP	0000040	/* read permission, group */
+#define		S_IWGRP	0000020	/* write permission, grougroup */
+#define		S_IXGRP	0000010	/* execute/search permission, group */
+#define	S_IRWXO		0000007	/* rwx, other */
+#define		S_IROTH	0000004	/* read permission, other */
+#define		S_IWOTH	0000002	/* write permission, other */
+#define		S_IXOTH	0000001	/* execute/search permission, other */
+
+#endif
+
+/*------------------------------------------------------------------------------
+*/
+
+#define	SENSIBLE_SIZE	(0x40000000)
+
+int
+psf_open (const char *pathname, int mode)
+{	int fd = -1, flags ;
+
+	switch (mode)
+	{	case SFM_READ :
+				flags = O_RDONLY | EXTRA_OPEN_FLAGS ;
+				fd = open (pathname, flags) ;
+				break ;
+
+		case SFM_WRITE :
+				flags = O_WRONLY | O_CREAT | O_TRUNC | EXTRA_OPEN_FLAGS ;
+				fd = open (pathname, flags, S_IRUSR | S_IWUSR | S_IRGRP) ;
+				break ;
+			
+		case SFM_RDWR :
+				flags = O_RDWR | O_CREAT | EXTRA_OPEN_FLAGS ;
+				fd = open (pathname, flags, S_IRUSR | S_IWUSR | S_IRGRP) ;
+				break ;
+			
+		default :
+				/* psf_log_printf (psf, "ad open mode.\n") ; */
+				return -1 ;
+		} ;
+	
+	if (fd < 0)
+		perror ("psf_open") ;
+	
+	return fd ;
+} /* psf_open */
+
+sf_count_t 
+psf_fseek (int fd, sf_count_t offset, int whence)
+{
+	/* Bypass weird Win32-ism if necessary. 
+	** _lseeki64() returns an "invalid parameter" error is called with the
+	** following offset and whence parameter. Instead, use the _telli64()
+	** function.
+	*/
+	if (OS_IS_WIN32 && offset == 0 && whence == SEEK_CUR)
+		return SF_FTELL (fd) ;
+
+	return SF_SEEK (fd, offset, whence) ;
+} /* psf_fseek */
+
+sf_count_t
+psf_fread (void *ptr, sf_count_t bytes, sf_count_t items, int fd)
+{	sf_count_t total = 0 ;
+	size_t	 count ;
+	
+	items *= bytes ;
+
+	/* Do this check after the multiplication above. */	
+	if (items <= 0)
+		return 0 ;
+		
+	while (items > 0)
+	{	/* Break the writes down to a sensible size. */
+		count = (items > SENSIBLE_SIZE) ? SENSIBLE_SIZE : items ;
+		
+		count = read (fd, ((char*) ptr) + total, count) ;
+		
+		if (count == ((size_t) -1) && errno == EINTR)
+			continue ;
+
+		if (count <= 0)
+			break ;
+			
+		total += count ;
+		items -= count ;
+		} ;
+
+	return total / bytes ;
+} /* psf_fread */
+
+sf_count_t
+psf_fwrite (void *ptr, sf_count_t bytes, sf_count_t items, int fd)
+{	sf_count_t total = 0 ;
+	size_t	 count ;
+	
+	items *= bytes ;
+	
+	/* Do this check after the multiplication above. */	
+	if (items <= 0)
+		return 0 ;
+		
+	while (items > 0)
+	{	/* Break the writes down to a sensible size. */
+		count = (items > SENSIBLE_SIZE) ? SENSIBLE_SIZE : items ;
+		
+		count = write (fd, ((char*) ptr) + total, count) ;
+		
+		if (count == ((size_t) -1) && errno == EINTR)
+			continue ;
+
+		if (count <= 0)
+			break ;
+			
+		total += count ;
+		items -= count ;
+		} ;
+
+	return total / bytes ;
+} /* psf_fwrite */
+
+sf_count_t
+psf_ftell (int fd)
+{	sf_count_t pos ;
+
+	pos = SF_FTELL (fd) ;
+
+	/*
+	if (pos < 0)
+		psf_log_printf (psf, "psf_ftell error %s\n", strerror (errno)) ;
+	*/
+
+	return pos ;
+} /* psf_ftell */
+
+int
+psf_fclose (int fd)
+{	return close (fd) ;
+} /* psf_fclose */
+
+sf_count_t 
+psf_fgets (char *buffer, sf_count_t bufsize, int fd)
+{	sf_count_t	k = 0 ;
+	sf_count_t		count ;
+
+	while (k < bufsize - 1)
+	{	count = read (fd, &(buffer [k]), 1) ;
+
+	    if (count == -1 && errno == EINTR)
+			continue ;
+		if (count <= 0)
+			break ;
+		
+		if (buffer [k++] == '\n')
+			break ;
+		}
+
+	buffer [k] = 0 ;
+	
+	return k ;
+} /* psf_fgets */
+
+int 
+psf_ferror (int fd)
+{	
+	return 0 ;
+} /* psf_ferror */
+
+void 
+psf_fclearerr (int fd)
+{	errno = fd ? 0 : 0 ;
+} /* psf_fclearerr */
+
+sf_count_t
+psf_get_filelen (int fd)
+{	struct stat statbuf ;
+
+	if (fstat (fd, &statbuf))
+	{	perror ("fstat") ;
+		return -1 ;
+		} ;
+		
+	return statbuf.st_size ;
+} /* psf_fclose */
+
--- a/common/libsndfile/src/float32.c
+++ b/common/libsndfile/src/float32.c
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 1999-2001 Erik de Castro Lopo <[email protected]>
+** Copyright (C) 1999-2002 Erik de Castro Lopo <[email protected]>
 **  
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -16,216 +16,228 @@
 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 */
 
-
 #include	<stdio.h>
 #include	<unistd.h>
 #include	<string.h>
-#include	<math.h>
 
 #include	"sndfile.h"
 #include	"config.h"
 #include	"sfendian.h"
 #include	"common.h"
+#include	"float_cast.h"
 
 /*--------------------------------------------------------------------------------------------
+**	Processor floating point capabilities. float32_get_capability () returns one of the 
+**	latter four values.
 */
 
+enum
+{	FLOAT_UNKNOWN		= 0x00,
+	FLOAT_CAN_RW_LE		= 0x23,
+	FLOAT_CAN_RW_BE		= 0x34,
+	FLOAT_BROKEN_LE		= 0x35,
+	FLOAT_BROKEN_BE		= 0x36
+} ;
+
 /*--------------------------------------------------------------------------------------------
 **	Prototypes for private functions.
 */
 
-static int		host_read_f2s   (SF_PRIVATE *psf, short *ptr, int len) ;
-static int		host_read_f2i   (SF_PRIVATE *psf, int *ptr, int len) ;
-static int		host_read_f     (SF_PRIVATE *psf, float *ptr, int len) ;
-static int		host_read_f2d   (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+static sf_count_t		host_read_f2s   (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static sf_count_t		host_read_f2i   (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+static sf_count_t		host_read_f     (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+static sf_count_t		host_read_f2d   (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
 
-static int		host_write_s2f   (SF_PRIVATE *psf, short *ptr, int len) ;
-static int		host_write_i2f   (SF_PRIVATE *psf, int *ptr, int len) ;
-static int		host_write_f     (SF_PRIVATE *psf, float *ptr, int len) ;
-static int		host_write_d2f   (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+static sf_count_t		host_write_s2f   (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static sf_count_t		host_write_i2f   (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+static sf_count_t		host_write_f     (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+static sf_count_t		host_write_d2f   (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
 
-static	void	f2s_array 	(float *buffer, unsigned int count, short *ptr, int index) ;
-static	void	f2i_array 	(float *buffer, unsigned int count, int *ptr, int index) ;
-static	void	f2d_array 	(float *buffer, unsigned int count, double *ptr, int index) ;
+static	void	f2s_array 	(float *buffer, unsigned int count, short *ptr) ;
+static	void	f2i_array 	(float *buffer, unsigned int count, int *ptr) ;
+static	void	f2d_array 	(float *buffer, unsigned int count, double *ptr) ;
 
-static 	void	s2f_array 	(short *ptr, int index, float *buffer, unsigned int count) ;
-static 	void	i2f_array 	(int *ptr, int index, float *buffer, unsigned int count) ;
-static 	void	d2f_array 	(double *ptr, int index, float *buffer, unsigned int count) ;
+static 	void	s2f_array 	(short *ptr, float *buffer, unsigned int count) ;
+static 	void	i2f_array 	(int *ptr, float *buffer, unsigned int count) ;
+static 	void	d2f_array 	(double *ptr, float *buffer, unsigned int count) ;
 
 static void		float32_peak_update (SF_PRIVATE *psf, float *buffer, int count, int index) ;
 
-static int		broken_read_f2s (SF_PRIVATE *psf, short *ptr, int len) ;
-static int		broken_read_f2i (SF_PRIVATE *psf, int *ptr, int len) ;
-static int		broken_read_f   (SF_PRIVATE *psf, float *ptr, int len) ;
-static int		broken_read_f2d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+static sf_count_t		broken_read_f2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static sf_count_t		broken_read_f2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+static sf_count_t		broken_read_f   (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+static sf_count_t		broken_read_f2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
 
-static int		broken_write_s2f (SF_PRIVATE *psf, short *ptr, int len) ;
-static int		broken_write_i2f (SF_PRIVATE *psf, int *ptr, int len) ;
-static int		broken_write_f   (SF_PRIVATE *psf, float *ptr, int len) ;
-static int		broken_write_d2f (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+static sf_count_t		broken_write_s2f (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static sf_count_t		broken_write_i2f (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+static sf_count_t		broken_write_f   (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+static sf_count_t		broken_write_d2f (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
 
 static	void	bf2f_array (float *buffer, unsigned int count) ;
 static	void	f2bf_array (float *buffer, unsigned int count) ;
 
+static int		float32_get_capability (void) ;
+
 /*--------------------------------------------------------------------------------------------
 **	Exported functions.
 */
 
 int
-float32_read_init (SF_PRIVATE *psf)
+float32_init (SF_PRIVATE *psf)
 {	static int float_caps = FLOAT_UNKNOWN ;
 
 	if (float_caps == FLOAT_UNKNOWN)
-		float_caps = float32_get_capability (psf->endian) ;
+		float_caps = float32_get_capability () ;
 	
-	switch (psf->endian + 0x1000 * float_caps)
-	{	case (SF_ENDIAN_BIG + 0x1000 * FLOAT_CAN_RW_BE) :
-				psf->fl32_endswap = SF_FALSE ;
-				psf->read_short  = (func_short)  host_read_f2s ;
-				psf->read_int    = (func_int)    host_read_f2i ;
-				psf->read_float  = (func_float)  host_read_f ;
-				psf->read_double = (func_double) host_read_f2d ;
-				break ;
-				
-		case (SF_ENDIAN_LITTLE + 0x1000 * FLOAT_CAN_RW_LE) :
-				psf->fl32_endswap = SF_FALSE ;
-				psf->read_short  = (func_short)  host_read_f2s ;
-				psf->read_int    = (func_int)    host_read_f2i ;
-				psf->read_float  = (func_float)  host_read_f ;
-				psf->read_double = (func_double) host_read_f2d ;
-				break ;
+	psf->blockwidth = sizeof (float) * psf->sf.channels ;
 
-		case (SF_ENDIAN_BIG + 0x1000 * FLOAT_CAN_RW_LE) :
-				psf->fl32_endswap = SF_TRUE ;
-				psf->read_short  = (func_short)  host_read_f2s ;
-				psf->read_int    = (func_int)    host_read_f2i ;
-				psf->read_float  = (func_float)  host_read_f ;
-				psf->read_double = (func_double) host_read_f2d ;
-				break ;
-				
-		case (SF_ENDIAN_LITTLE + 0x1000 * FLOAT_CAN_RW_BE) :
-				psf->fl32_endswap = SF_TRUE ;
-				psf->read_short  = (func_short)  host_read_f2s ;
-				psf->read_int    = (func_int)    host_read_f2i ;
-				psf->read_float  = (func_float)  host_read_f ;
-				psf->read_double = (func_double) host_read_f2d ;
-				break ;
-				
-		case (SF_ENDIAN_BIG + 0x1000 * FLOAT_BROKEN_LE) :
-				psf->fl32_endswap = SF_TRUE ;
-				psf->read_short  = (func_short)  broken_read_f2s ;
-				psf->read_int    = (func_int)    broken_read_f2i ;
-				psf->read_float  = (func_float)  broken_read_f ;
-				psf->read_double = (func_double) broken_read_f2d ;
-				break ;
-				
-		case (SF_ENDIAN_LITTLE + 0x1000 * FLOAT_BROKEN_LE) :
-				psf->fl32_endswap = SF_FALSE ;
-				psf->read_short  = (func_short)  broken_read_f2s ;
-				psf->read_int    = (func_int)    broken_read_f2i ;
-				psf->read_float  = (func_float)  broken_read_f ;
-				psf->read_double = (func_double) broken_read_f2d ;
-				break ;
-				
-		case (SF_ENDIAN_BIG + 0x1000 * FLOAT_BROKEN_BE) :
-				psf->fl32_endswap = SF_FALSE ;
-				psf->read_short  = (func_short)  broken_read_f2s ;
-				psf->read_int    = (func_int)    broken_read_f2i ;
-				psf->read_float  = (func_float)  broken_read_f ;
-				psf->read_double = (func_double) broken_read_f2d ;
-				break ;
-				
-		case (SF_ENDIAN_LITTLE + 0x1000 * FLOAT_BROKEN_BE) :
-				psf->fl32_endswap = SF_TRUE ;
-				psf->read_short  = (func_short)  broken_read_f2s ;
-				psf->read_int    = (func_int)    broken_read_f2i ;
-				psf->read_float  = (func_float)  broken_read_f ;
-				psf->read_double = (func_double) broken_read_f2d ;
-				break ;
-				
-		default : break ;
+	if (psf->mode == SFM_READ || psf->mode == SFM_RDWR)
+	{	switch (psf->endian + float_caps)
+		{	case (SF_ENDIAN_BIG + FLOAT_CAN_RW_BE) :
+					psf->float_endswap = SF_FALSE ;
+					psf->read_short  = host_read_f2s ;
+					psf->read_int    = host_read_f2i ;
+					psf->read_float  = host_read_f ;
+					psf->read_double = host_read_f2d ;
+					break ;
+					
+			case (SF_ENDIAN_LITTLE + FLOAT_CAN_RW_LE) :
+					psf->float_endswap = SF_FALSE ;
+					psf->read_short  = host_read_f2s ;
+					psf->read_int    = host_read_f2i ;
+					psf->read_float  = host_read_f ;
+					psf->read_double = host_read_f2d ;
+					break ;
+	
+			case (SF_ENDIAN_BIG + FLOAT_CAN_RW_LE) :
+					psf->float_endswap = SF_TRUE ;
+					psf->read_short  = host_read_f2s ;
+					psf->read_int    = host_read_f2i ;
+					psf->read_float  = host_read_f ;
+					psf->read_double = host_read_f2d ;
+					break ;
+					
+			case (SF_ENDIAN_LITTLE + FLOAT_CAN_RW_BE) :
+					psf->float_endswap = SF_TRUE ;
+					psf->read_short  = host_read_f2s ;
+					psf->read_int    = host_read_f2i ;
+					psf->read_float  = host_read_f ;
+					psf->read_double = host_read_f2d ;
+					break ;
+					
+			case (SF_ENDIAN_BIG + FLOAT_BROKEN_LE) :
+					psf->float_endswap = SF_TRUE ;
+					psf->read_short  = broken_read_f2s ;
+					psf->read_int    = broken_read_f2i ;
+					psf->read_float  = broken_read_f ;
+					psf->read_double = broken_read_f2d ;
+					break ;
+					
+			case (SF_ENDIAN_LITTLE + FLOAT_BROKEN_LE) :
+					psf->float_endswap = SF_FALSE ;
+					psf->read_short  = broken_read_f2s ;
+					psf->read_int    = broken_read_f2i ;
+					psf->read_float  = broken_read_f ;
+					psf->read_double = broken_read_f2d ;
+					break ;
+					
+			case (SF_ENDIAN_BIG + FLOAT_BROKEN_BE) :
+					psf->float_endswap = SF_FALSE ;
+					psf->read_short  = broken_read_f2s ;
+					psf->read_int    = broken_read_f2i ;
+					psf->read_float  = broken_read_f ;
+					psf->read_double = broken_read_f2d ;
+					break ;
+					
+			case (SF_ENDIAN_LITTLE + FLOAT_BROKEN_BE) :
+					psf->float_endswap = SF_TRUE ;
+					psf->read_short  = broken_read_f2s ;
+					psf->read_int    = broken_read_f2i ;
+					psf->read_float  = broken_read_f ;
+					psf->read_double = broken_read_f2d ;
+					break ;
+					
+			default : break ;
+			} ;
 		} ;
-
-	return 0 ;
-} /* float32_read_init */
-
-int
-float32_write_init (SF_PRIVATE *psf)
-{	static int float_caps = FLOAT_UNKNOWN ;
-
-	if (float_caps == FLOAT_UNKNOWN)
-		float_caps = float32_get_capability (psf->endian) ;
 	
-	switch (psf->endian + 0x1000 * float_caps)
-	{	case (SF_ENDIAN_LITTLE + 0x1000 * FLOAT_CAN_RW_LE) :
-				psf->fl32_endswap = SF_FALSE ;
-				psf->write_short  = (func_short)  host_write_s2f ;
-				psf->write_int    = (func_int)    host_write_i2f ;
-				psf->write_float  = (func_float)  host_write_f ;
-				psf->write_double = (func_double) host_write_d2f ;
-				break ;
-
-		case (SF_ENDIAN_BIG + 0x1000 * FLOAT_CAN_RW_BE) :
-				psf->fl32_endswap = SF_FALSE ;
-				psf->write_short  = (func_short)  host_write_s2f ;
-				psf->write_int    = (func_int)    host_write_i2f ;
-				psf->write_float  = (func_float)  host_write_f ;
-				psf->write_double = (func_double) host_write_d2f ;
-				break ;
-				
-		case (SF_ENDIAN_BIG + 0x1000 * FLOAT_CAN_RW_LE) :
-				psf->fl32_endswap = SF_TRUE ;
-				psf->write_short  = (func_short)  host_write_s2f ;
-				psf->write_int    = (func_int)    host_write_i2f ;
-				psf->write_float  = (func_float)  host_write_f ;
-				psf->write_double = (func_double) host_write_d2f ;
-				break ;
-				
-		case (SF_ENDIAN_LITTLE + 0x1000 * FLOAT_CAN_RW_BE) :
-				psf->fl32_endswap = SF_TRUE ;
-				psf->write_short  = (func_short)  host_write_s2f ;
-				psf->write_int    = (func_int)    host_write_i2f ;
-				psf->write_float  = (func_float)  host_write_f ;
-				psf->write_double = (func_double) host_write_d2f ;
-				break ;
-				
-		case (SF_ENDIAN_BIG + 0x1000 * FLOAT_BROKEN_LE) :
-				psf->fl32_endswap = SF_TRUE ;
-				psf->write_short  = (func_short)  broken_write_s2f ;
-				psf->write_int    = (func_int)    broken_write_i2f ;
-				psf->write_float  = (func_float)  broken_write_f ;
-				psf->write_double = (func_double) broken_write_d2f ;
-				break ;
-				
-		case (SF_ENDIAN_LITTLE + 0x1000 * FLOAT_BROKEN_LE) :
-				psf->fl32_endswap = SF_FALSE ;
-				psf->write_short  = (func_short)  broken_write_s2f ;
-				psf->write_int    = (func_int)    broken_write_i2f ;
-				psf->write_float  = (func_float)  broken_write_f ;
-				psf->write_double = (func_double) broken_write_d2f ;
-				break ;
-				
-		case (SF_ENDIAN_BIG + 0x1000 * FLOAT_BROKEN_BE) :
-				psf->fl32_endswap = SF_FALSE ;
-				psf->write_short  = (func_short)  broken_write_s2f ;
-				psf->write_int    = (func_int)    broken_write_i2f ;
-				psf->write_float  = (func_float)  broken_write_f ;
-				psf->write_double = (func_double) broken_write_d2f ;
-				break ;
-				
-		case (SF_ENDIAN_LITTLE + 0x1000 * FLOAT_BROKEN_BE) :
-				psf->fl32_endswap = SF_TRUE ;
-				psf->write_short  = (func_short)  broken_write_s2f ;
-				psf->write_int    = (func_int)    broken_write_i2f ;
-				psf->write_float  = (func_float)  broken_write_f ;
-				psf->write_double = (func_double) broken_write_d2f ;
-				break ;
-				
-		default : break ;
+	if (psf->mode == SFM_WRITE || psf->mode == SFM_RDWR)
+	{	switch (psf->endian + float_caps)
+		{	case (SF_ENDIAN_LITTLE + FLOAT_CAN_RW_LE) :
+					psf->float_endswap = SF_FALSE ;
+					psf->write_short  = host_write_s2f ;
+					psf->write_int    = host_write_i2f ;
+					psf->write_float  = host_write_f ;
+					psf->write_double = host_write_d2f ;
+					break ;
+	
+			case (SF_ENDIAN_BIG + FLOAT_CAN_RW_BE) :
+					psf->float_endswap = SF_FALSE ;
+					psf->write_short  = host_write_s2f ;
+					psf->write_int    = host_write_i2f ;
+					psf->write_float  = host_write_f ;
+					psf->write_double = host_write_d2f ;
+					break ;
+					
+			case (SF_ENDIAN_BIG + FLOAT_CAN_RW_LE) :
+					psf->float_endswap = SF_TRUE ;
+					psf->write_short  = host_write_s2f ;
+					psf->write_int    = host_write_i2f ;
+					psf->write_float  = host_write_f ;
+					psf->write_double = host_write_d2f ;
+					break ;
+					
+			case (SF_ENDIAN_LITTLE + FLOAT_CAN_RW_BE) :
+					psf->float_endswap = SF_TRUE ;
+					psf->write_short  = host_write_s2f ;
+					psf->write_int    = host_write_i2f ;
+					psf->write_float  = host_write_f ;
+					psf->write_double = host_write_d2f ;
+					break ;
+					
+			case (SF_ENDIAN_BIG + FLOAT_BROKEN_LE) :
+					psf->float_endswap = SF_TRUE ;
+					psf->write_short  = broken_write_s2f ;
+					psf->write_int    = broken_write_i2f ;
+					psf->write_float  = broken_write_f ;
+					psf->write_double = broken_write_d2f ;
+					break ;
+					
+			case (SF_ENDIAN_LITTLE + FLOAT_BROKEN_LE) :
+					psf->float_endswap = SF_FALSE ;
+					psf->write_short  = broken_write_s2f ;
+					psf->write_int    = broken_write_i2f ;
+					psf->write_float  = broken_write_f ;
+					psf->write_double = broken_write_d2f ;
+					break ;
+					
+			case (SF_ENDIAN_BIG + FLOAT_BROKEN_BE) :
+					psf->float_endswap = SF_FALSE ;
+					psf->write_short  = broken_write_s2f ;
+					psf->write_int    = broken_write_i2f ;
+					psf->write_float  = broken_write_f ;
+					psf->write_double = broken_write_d2f ;
+					break ;
+					
+			case (SF_ENDIAN_LITTLE + FLOAT_BROKEN_BE) :
+					psf->float_endswap = SF_TRUE ;
+					psf->write_short  = broken_write_s2f ;
+					psf->write_int    = broken_write_i2f ;
+					psf->write_float  = broken_write_f ;
+					psf->write_double = broken_write_d2f ;
+					break ;
+					
+			default : break ;
+			} ;
 		} ;
 
+	psf->filelength = psf_get_filelen (psf->filedes) ;
+	psf->datalength = (psf->dataend) ? psf->dataend - psf->dataoffset : 
+							psf->filelength - psf->dataoffset ;
+	psf->sf.samples = psf->datalength / (psf->sf.channels * sizeof (float)) ;
+
 	return 0 ;
-} /* float32_write_init */	
+} /* float32_init */	
 
 float	
 float32_read (unsigned char *cptr)
@@ -317,7 +329,8 @@
 
 static void
 float32_peak_update (SF_PRIVATE *psf, float *buffer, int count, int index)
-{	int		k, chan, position ;
+{	int 	chan ;
+	int		k, position ;
 	float	fmaxval;
 	
 	for (chan = 0 ; chan < psf->sf.channels ; chan++)
@@ -331,7 +344,7 @@
 				
 		if (fmaxval > psf->peak.peak[chan].value)
 		{	psf->peak.peak[chan].value = fmaxval ;
-			psf->peak.peak[chan].position = psf->current + index + (position /psf->sf.channels) ;
+			psf->peak.peak[chan].position = psf->write_current + index + (position /psf->sf.channels) ;
 			} ;
 		} ;
 
@@ -338,8 +351,8 @@
 	return ;	
 } /* float32_peak_update */
 
-int
-float32_get_capability (int endianness)
+static int
+float32_get_capability (void)
 {	union 
 	{	float			f ;
 		int				i ;
@@ -360,7 +373,7 @@
 		return FLOAT_CAN_RW_BE ;
 		
 	/* Floats are broken. Don't expect reading or writing to be fast. */
-	return 0 ;
+	return FLOAT_UNKNOWN ;
 } /* float32_get_capability */
 
 /*----------------------------------------------------------------------------------------------
@@ -367,8 +380,8 @@
 */
 
 
-static int
-host_read_f2s (SF_PRIVATE *psf, short *ptr, int len)
+static sf_count_t
+host_read_f2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
 {	unsigned int readcount, thisread ;
 	int		bytecount, bufferlen ;
 	int		index = 0, total = 0 ;
@@ -377,12 +390,12 @@
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+		thisread = psf_fread (psf->buffer, 1, readcount, psf->filedes) ;
 		
-		if (psf->fl32_endswap == SF_TRUE)
+		if (psf->float_endswap == SF_TRUE)
 			endswap_int_array ((int*) psf->buffer, readcount / sizeof (int)) ;
 
-		f2s_array ((float*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
+		f2s_array ((float*) (psf->buffer), thisread / psf->bytewidth, ptr + index) ;
 		total += thisread ;
 		if (thisread < readcount)
 			break ;
@@ -397,8 +410,8 @@
 	return total ;
 } /* host_read_f2s */
 
-static int
-host_read_f2i (SF_PRIVATE *psf, int *ptr, int len)
+static sf_count_t
+host_read_f2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
 {	unsigned int readcount, thisread ;
 	int		bytecount, bufferlen ;
 	int		index = 0, total = 0 ;
@@ -407,12 +420,12 @@
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+		thisread = psf_fread (psf->buffer, 1, readcount, psf->filedes) ;
 		
-		if (psf->fl32_endswap == SF_TRUE)
+		if (psf->float_endswap == SF_TRUE)
 			endswap_int_array ((int*) psf->buffer, readcount / sizeof (int)) ;
 
-		f2i_array ((float*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
+		f2i_array ((float*) (psf->buffer), thisread / psf->bytewidth, ptr + index) ;
 		total += thisread ;
 		if (thisread < readcount)
 			break ;
@@ -427,20 +440,20 @@
 	return total ;
 } /* host_read_f2i */
 
-static int
-host_read_f (SF_PRIVATE *psf, float *ptr, int len)
+static sf_count_t
+host_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
 {	unsigned int readcount, thisread ;
 	int		bytecount, bufferlen ;
 	int	index = 0, total = 0 ;
 	
-	if (psf->fl32_endswap != SF_TRUE)
-		return fread (ptr, sizeof (float), len, psf->file) ; 
+	if (psf->float_endswap != SF_TRUE)
+		return psf_fread (ptr, sizeof (float), len, psf->filedes) ; 
 	
 	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+		thisread = psf_fread (psf->buffer, 1, readcount, psf->filedes) ;
 		
 		endswap_int_array ((int*) psf->buffer, readcount / sizeof (int)) ;
 
@@ -460,8 +473,8 @@
 	return total ;
 } /* host_read_f */
 
-static int
-host_read_f2d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+static sf_count_t
+host_read_f2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
 {	unsigned int readcount, thisread ;
 	int		bytecount, bufferlen ;
 	int	index = 0, total = 0 ;
@@ -470,12 +483,12 @@
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+		thisread = psf_fread (psf->buffer, 1, readcount, psf->filedes) ;
 		
-		if (psf->fl32_endswap == SF_TRUE)
+		if (psf->float_endswap == SF_TRUE)
 			endswap_int_array ((int*) psf->buffer, readcount / sizeof (int)) ;
 
-		f2d_array ((float*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
+		f2d_array ((float*) (psf->buffer), thisread / psf->bytewidth, ptr + index) ;
 		total += thisread ;
 		if (thisread < readcount)
 			break ;
@@ -490,8 +503,8 @@
 	return total ;
 } /* host_read_f2d */
 
-static int
-host_write_s2f	(SF_PRIVATE *psf, short *ptr, int len)
+static sf_count_t
+host_write_s2f	(SF_PRIVATE *psf, short *ptr, sf_count_t len)
 {	unsigned int	writecount, thiswrite ;
 	int	bytecount, bufferlen ;
 	int		index = 0, total = 0 ;
@@ -500,14 +513,15 @@
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		s2f_array (ptr, index, (float*) (psf->buffer), writecount / psf->bytewidth) ;
+		s2f_array (ptr + index, (float*) (psf->buffer), writecount / psf->bytewidth) ;
 		
-		float32_peak_update (psf, (float *) (psf->buffer), writecount / psf->bytewidth, index / psf->sf.channels) ;
+		if (psf->has_peak)
+			float32_peak_update (psf, (float *) (psf->buffer), writecount / psf->bytewidth, index / psf->sf.channels) ;
 		
-		if (psf->fl32_endswap == SF_TRUE)
+		if (psf->float_endswap == SF_TRUE)
 			endswap_int_array ((int*) psf->buffer, writecount / sizeof (int)) ;
 			
-		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		thiswrite = psf_fwrite (psf->buffer, 1, writecount, psf->filedes) ;
 		total += thiswrite ;
 		if (thiswrite < writecount)
 			break ;
@@ -522,8 +536,8 @@
 	return total ;
 } /* host_write_s2f */
 
-static int
-host_write_i2f	(SF_PRIVATE *psf, int *ptr, int len)
+static sf_count_t
+host_write_i2f	(SF_PRIVATE *psf, int *ptr, sf_count_t len)
 {	unsigned int	writecount, thiswrite ;
 	int	bytecount, bufferlen ;
 	int		index = 0, total = 0 ;
@@ -532,14 +546,15 @@
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		i2f_array (ptr, index, (float*) (psf->buffer), writecount / psf->bytewidth) ;
+		i2f_array (ptr + index, (float*) (psf->buffer), writecount / psf->bytewidth) ;
 		
-		float32_peak_update (psf, (float *) (psf->buffer), writecount / psf->bytewidth, index / psf->sf.channels) ;
+		if (psf->has_peak)
+			float32_peak_update (psf, (float *) (psf->buffer), writecount / psf->bytewidth, index / psf->sf.channels) ;
 		
-		if (psf->fl32_endswap == SF_TRUE)
+		if (psf->float_endswap == SF_TRUE)
 			endswap_int_array ((int*) psf->buffer, writecount / sizeof (int)) ;
 			
-		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		thiswrite = psf_fwrite (psf->buffer, 1, writecount, psf->filedes) ;
 		total += thiswrite ;
 		if (thiswrite < writecount)
 			break ;
@@ -554,16 +569,17 @@
 	return total ;
 } /* host_write_i2f */
 
-static int
-host_write_f (SF_PRIVATE *psf, float *ptr, int len)
+static sf_count_t
+host_write_f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
 {	unsigned int	writecount, thiswrite ;
 	int	bytecount, bufferlen ;
 	int		index = 0, total = 0 ;
 
-	float32_peak_update (psf, ptr, len, 0) ;
+	if (psf->has_peak)
+		float32_peak_update (psf, ptr, len, 0) ;
 			
-	if (psf->fl32_endswap != SF_TRUE)
-		return fwrite (ptr, sizeof (float), len, psf->file) ;
+	if (psf->float_endswap != SF_TRUE)
+		return psf_fwrite (ptr, sizeof (float), len, psf->filedes) ;
 
 	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
 	bytecount = len * psf->bytewidth ;
@@ -572,10 +588,10 @@
 
 		memcpy (psf->buffer, ptr + index, writecount) ;
 		
-		if (psf->fl32_endswap == SF_TRUE)
+		if (psf->float_endswap == SF_TRUE)
 			endswap_int_array ((int*) psf->buffer, writecount / sizeof (int)) ;
 			
-		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		thiswrite = psf_fwrite (psf->buffer, 1, writecount, psf->filedes) ;
 		total += thiswrite ;
 		if (thiswrite < writecount)
 			break ;
@@ -590,8 +606,8 @@
 	return total ;
 } /* host_write_f */
 
-static int
-host_write_d2f	(SF_PRIVATE *psf, double *ptr, int len, int normalize)
+static sf_count_t
+host_write_d2f	(SF_PRIVATE *psf, double *ptr, sf_count_t len)
 {	unsigned int	writecount, thiswrite ;
 	int	bytecount, bufferlen ;
 	int		index = 0, total = 0 ;
@@ -600,14 +616,15 @@
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		d2f_array (ptr, index, (float*) (psf->buffer), writecount / psf->bytewidth) ;
+		d2f_array (ptr + index, (float*) (psf->buffer), writecount / psf->bytewidth) ;
 		
-		float32_peak_update (psf, (float *) (psf->buffer), writecount / psf->bytewidth, index / psf->sf.channels) ;
+		if (psf->has_peak)
+			float32_peak_update (psf, (float *) (psf->buffer), writecount / psf->bytewidth, index / psf->sf.channels) ;
 		
-		if (psf->fl32_endswap == SF_TRUE)
+		if (psf->float_endswap == SF_TRUE)
 			endswap_int_array ((int*) psf->buffer, writecount / sizeof (int)) ;
 			
-		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		thiswrite = psf_fwrite (psf->buffer, 1, writecount, psf->filedes) ;
 		total += thiswrite ;
 		if (thiswrite < writecount)
 			break ;
@@ -626,57 +643,51 @@
 */
 
 static void	
-f2s_array (float *buffer, unsigned int count, short *ptr, int index)
-{	int	k ;
-	for (k = 0 ; k < count ; k++)
-	{	ptr [index] = ((double) buffer [k]) ;
-		index ++ ;
+f2s_array (float *buffer, unsigned int count, short *ptr)
+{	while (count)
+	{	count -- ;
+		ptr [count] = lrintf (buffer [count]) ;
 		} ;
 } /* f2s_array */
 
 static void	
-f2i_array (float *buffer, unsigned int count, int *ptr, int index)
-{	int	k ;
-	for (k = 0 ; k < count ; k++)
-	{	ptr [index] = (int) ((double) buffer [k]) ;
-		index ++ ;
+f2i_array (float *buffer, unsigned int count, int *ptr)
+{	while (count)
+	{	count -- ;
+		ptr [count] = lrintf (buffer [count]) ;
 		} ;
 } /* f2i_array */
 
 static void	
-f2d_array (float *buffer, unsigned int count, double *ptr, int index)
-{	int	k ;
-	for (k = 0 ; k < count ; k++)
-	{	ptr [index] = ((double) buffer [k]) ;
-		index ++ ;
+f2d_array (float *buffer, unsigned int count, double *ptr)
+{	while (count)
+	{	count -- ;
+		ptr [count] = buffer [count] ;
 		} ;
 } /* f2d_array */
 
 static  void	
-s2f_array (short *ptr, int index, float *buffer, unsigned int count)
-{	int		k ;
-	for (k = 0 ; k < count ; k++)
-	{	buffer [k] = (float) (ptr [index]) ;
-		index ++ ;
+s2f_array (short *ptr, float *buffer, unsigned int count)
+{	while (count)
+	{	count -- ;
+		buffer [count] = ptr [count] ;
 		} ;
 		
 } /* s2f_array */
 
 static void	
-i2f_array (int *ptr, int index, float *buffer, unsigned int count)
-{	int	k ;
-	for (k = 0 ; k < count ; k++)
-	{	buffer [k] = (float) (ptr [index]) ;
-		index ++ ;
+i2f_array (int *ptr, float *buffer, unsigned int count)
+{	while (count)
+	{	count -- ;
+		buffer [count] = ptr [count] ;
 		} ;
 } /* i2f_array */
 
 static void	
-d2f_array (double *ptr, int index, float *buffer, unsigned int count)
-{	int	k ;
-	for (k = 0 ; k < count ; k++)
-	{	buffer [k] = (float) (ptr [index]) ;
-		index ++ ;
+d2f_array (double *ptr, float *buffer, unsigned int count)
+{	while (count)
+	{	count -- ;
+		buffer [count] = ptr [count] ;
 		} ;
 } /* d2f_array */
 
@@ -683,23 +694,23 @@
 /*=======================================================================================
 */
 
-static int		
-broken_read_f2s (SF_PRIVATE *psf, short *ptr, int len)
-{	unsigned int	bytecount, readcount, bufferlen, thisread ;
-	int				index = 0, total = 0 ;
+static sf_count_t		
+broken_read_f2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
+{	sf_count_t	bytecount, readcount, bufferlen, thisread ;
+	sf_count_t	index = 0, total = 0 ;
 		
 	bufferlen = (SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth ;
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+		thisread = psf_fread (psf->buffer, 1, readcount, psf->filedes) ;
 
-		if (psf->fl32_endswap == SF_TRUE)
+		if (psf->float_endswap == SF_TRUE)
 			endswap_int_array ((int*) psf->buffer, readcount / sizeof (int)) ;
 
 		bf2f_array ((float *) (psf->buffer), readcount / psf->bytewidth) ;
 
-		f2s_array ((float*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
+		f2s_array ((float*) (psf->buffer), thisread / psf->bytewidth, ptr + index) ;
 		total += thisread ;
 		if (thisread < readcount)
 			break ;
@@ -714,23 +725,23 @@
 	return total ;
 } /* broken_read_f2s */
 
-static int		
-broken_read_f2i (SF_PRIVATE *psf, int *ptr, int len)
-{	unsigned int	bytecount, readcount, bufferlen, thisread ;
-	int				index = 0, total = 0 ;
+static sf_count_t		
+broken_read_f2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
+{	sf_count_t	bytecount, readcount, bufferlen, thisread ;
+	sf_count_t	index = 0, total = 0 ;
 
 	bufferlen = (SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth ;
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+		thisread = psf_fread (psf->buffer, 1, readcount, psf->filedes) ;
 
-		if (psf->fl32_endswap == SF_TRUE)
+		if (psf->float_endswap == SF_TRUE)
 			endswap_int_array ((int*) psf->buffer, readcount / sizeof (int)) ;
 
 		bf2f_array ((float *) (psf->buffer), readcount / psf->bytewidth) ;
 
-		f2i_array ((float*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
+		f2i_array ((float*) (psf->buffer), thisread / psf->bytewidth, ptr + index) ;
 		total += thisread ;
 		if (thisread < readcount)
 			break ;
@@ -745,10 +756,10 @@
 	return total ;
 } /* broken_read_f2i */
 
-static int		
-broken_read_f (SF_PRIVATE *psf, float *ptr, int len)
-{	unsigned int	bytecount, readcount, bufferlen, thisread ;
-	int				index = 0, total = 0 ;
+static sf_count_t
+broken_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
+{	sf_count_t	bytecount, readcount, bufferlen, thisread ;
+	sf_count_t	index = 0, total = 0 ;
 	
 	/* FIX THIS */
 
@@ -756,9 +767,9 @@
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+		thisread = psf_fread (psf->buffer, 1, readcount, psf->filedes) ;
 
-		if (psf->fl32_endswap == SF_TRUE)
+		if (psf->float_endswap == SF_TRUE)
 			endswap_int_array ((int*) psf->buffer, readcount / sizeof (int)) ;
 
 		bf2f_array ((float *) (psf->buffer), readcount / psf->bytewidth) ;
@@ -779,23 +790,23 @@
 	return total ;
 } /* broken_read_f */
 
-static int		
-broken_read_f2d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
-{	unsigned int	bytecount, readcount, bufferlen, thisread ;
-	int				index = 0, total = 0 ;
+static sf_count_t
+broken_read_f2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
+{	sf_count_t	bytecount, readcount, bufferlen, thisread ;
+	sf_count_t	index = 0, total = 0 ;
 
 	bufferlen = (SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth ;
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+		thisread = psf_fread (psf->buffer, 1, readcount, psf->filedes) ;
 
-		if (psf->fl32_endswap == SF_TRUE)
+		if (psf->float_endswap == SF_TRUE)
 			endswap_int_array ((int*) psf->buffer, readcount / sizeof (int)) ;
 
 		bf2f_array ((float *) (psf->buffer), readcount / psf->bytewidth) ;
 
-		f2d_array ((float*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
+		f2d_array ((float*) (psf->buffer), thisread / psf->bytewidth, ptr + index) ;
 		total += thisread ;
 		if (thisread < readcount)
 			break ;
@@ -810,25 +821,26 @@
 	return total ;
 } /* broken_read_f2d */
 
-static int	
-broken_write_s2f (SF_PRIVATE *psf, short *ptr, int len)
-{	unsigned int	bytecount, writecount, bufferlen, thiswrite ;
-	int				index = 0, total = 0 ;
+static sf_count_t	
+broken_write_s2f (SF_PRIVATE *psf, short *ptr, sf_count_t len)
+{	sf_count_t	bytecount, writecount, bufferlen, thiswrite ;
+	sf_count_t	index = 0, total = 0 ;
 
 	bufferlen = (SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth ;
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		s2f_array (ptr, index, (float*) (psf->buffer), writecount / psf->bytewidth) ;
+		s2f_array (ptr + index, (float*) (psf->buffer), writecount / psf->bytewidth) ;
 
-		float32_peak_update (psf, (float *) (psf->buffer), writecount / psf->bytewidth, index / psf->sf.channels) ;
+		if (psf->has_peak)
+			float32_peak_update (psf, (float *) (psf->buffer), writecount / psf->bytewidth, index / psf->sf.channels) ;
 
 		f2bf_array ((float *) (psf->buffer), writecount / psf->bytewidth) ;
 
-		if (psf->fl32_endswap == SF_TRUE)
+		if (psf->float_endswap == SF_TRUE)
 			endswap_int_array ((int*) psf->buffer, writecount / sizeof (int)) ;
 
-		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		thiswrite = psf_fwrite (psf->buffer, 1, writecount, psf->filedes) ;
 		total += thiswrite ;
 		if (thiswrite < writecount)
 			break ;
@@ -843,25 +855,26 @@
 	return total ;
 } /* broken_write_s2f */
 
-static int	
-broken_write_i2f (SF_PRIVATE *psf, int *ptr, int len) 
-{	unsigned int	bytecount, writecount, bufferlen, thiswrite ;
-	int				index = 0, total = 0 ;
+static sf_count_t	
+broken_write_i2f (SF_PRIVATE *psf, int *ptr, sf_count_t len) 
+{	sf_count_t	bytecount, writecount, bufferlen, thiswrite ;
+	sf_count_t	index = 0, total = 0 ;
 
 	bufferlen = (SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth ;
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		i2f_array (ptr, index, (float*) (psf->buffer), writecount / psf->bytewidth) ;
+		i2f_array (ptr + index, (float*) (psf->buffer), writecount / psf->bytewidth) ;
 
-		float32_peak_update (psf, (float *) (psf->buffer), writecount / psf->bytewidth, index / psf->sf.channels) ;
+		if (psf->has_peak)
+			float32_peak_update (psf, (float *) (psf->buffer), writecount / psf->bytewidth, index / psf->sf.channels) ;
 
 		f2bf_array ((float *) (psf->buffer), writecount / psf->bytewidth) ;
 
-		if (psf->fl32_endswap == SF_TRUE)
+		if (psf->float_endswap == SF_TRUE)
 			endswap_int_array ((int*) psf->buffer, writecount / sizeof (int)) ;
 
-		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		thiswrite = psf_fwrite (psf->buffer, 1, writecount, psf->filedes) ;
 		total += thiswrite ;
 		if (thiswrite < writecount)
 			break ;
@@ -876,13 +889,14 @@
 	return total ;
 } /* broken_write_i2f */
 
-static int	
-broken_write_f (SF_PRIVATE *psf, float *ptr, int len)
-{	unsigned int	bytecount, writecount, bufferlen, thiswrite ;
-	int				index = 0, total = 0 ;
+static sf_count_t	
+broken_write_f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
+{	sf_count_t	bytecount, writecount, bufferlen, thiswrite ;
+	sf_count_t	index = 0, total = 0 ;
 	
 	/* FIX THIS */
-	float32_peak_update (psf, ptr, len, 0) ;
+	if (psf->has_peak)
+		float32_peak_update (psf, ptr, len, 0) ;
 
 	bufferlen = (SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth ;
 	bytecount = len * psf->bytewidth ;
@@ -893,10 +907,10 @@
 
 		f2bf_array ((float *) (psf->buffer), writecount / psf->bytewidth) ;
 		
-		if (psf->fl32_endswap == SF_TRUE)
+		if (psf->float_endswap == SF_TRUE)
 			endswap_int_array ((int*) psf->buffer, writecount / sizeof (int)) ;
 
-		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		thiswrite = psf_fwrite (psf->buffer, 1, writecount, psf->filedes) ;
 		total += thiswrite ;
 		if (thiswrite < writecount)
 			break ;
@@ -911,25 +925,26 @@
 	return total ;
 } /* broken_write_f */
 
-static int	
-broken_write_d2f (SF_PRIVATE *psf, double *ptr, int len, int normalize)
-{	unsigned int	bytecount, writecount, bufferlen, thiswrite ;
-	int				index = 0, total = 0 ;
+static sf_count_t	
+broken_write_d2f (SF_PRIVATE *psf, double *ptr, sf_count_t len)
+{	sf_count_t	bytecount, writecount, bufferlen, thiswrite ;
+	sf_count_t	index = 0, total = 0 ;
 
 	bufferlen = (SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth ;
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		d2f_array (ptr, index, (float*) (psf->buffer), writecount / psf->bytewidth) ;
+		d2f_array (ptr + index, (float*) (psf->buffer), writecount / psf->bytewidth) ;
 
-		float32_peak_update (psf, (float *) (psf->buffer), writecount / psf->bytewidth, index / psf->sf.channels) ;
+		if (psf->has_peak)
+			float32_peak_update (psf, (float *) (psf->buffer), writecount / psf->bytewidth, index / psf->sf.channels) ;
 
 		f2bf_array ((float *) (psf->buffer), writecount / psf->bytewidth) ;
 
-		if (psf->fl32_endswap == SF_TRUE)
+		if (psf->float_endswap == SF_TRUE)
 			endswap_int_array ((int*) psf->buffer, writecount / sizeof (int)) ;
 
-		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		thiswrite = psf_fwrite (psf->buffer, 1, writecount, psf->filedes) ;
 		total += thiswrite ;
 		if (thiswrite < writecount)
 			break ;
@@ -944,25 +959,22 @@
 	return total ;
 } /* broken_write_d2f */
 
-/*==============================================================================
-*/
-
 /*----------------------------------------------------------------------------------------------
 */
 
 static void	
 bf2f_array (float *buffer, unsigned int count)
-{	int	k ;
-	
-	for (k = 0 ; k < count ; k++)
-		buffer [k] = float32_read ((unsigned char *) (buffer + k)) ;
+{	while (count)
+	{	count -- ;
+		buffer [count] = float32_read ((unsigned char *) (buffer + count)) ;
+		} ;
 } /* bf2f_array */
 
 static void	
 f2bf_array (float *buffer, unsigned int count)
-{	int	k ;
-	
-	for (k = 0 ; k < count ; k++)
-		float32_write (buffer [k], (unsigned char*) (buffer + k)) ;
+{	while (count)
+	{	count -- ;
+		float32_write (buffer [count], (unsigned char*) (buffer + count)) ;
+		} ;
 } /* f2bf_array */
 
--- /dev/null
+++ b/common/libsndfile/src/float_cast.h
@@ -1,0 +1,184 @@
+/*
+** Copyright (C) 2001-2002 Erik de Castro Lopo <[email protected]>
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+** 
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+** 
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+/* Version 1.3 */
+
+
+/*============================================================================ 
+**	On Intel Pentium processors (especially PIII and probably P4), converting
+**	from float to int is very slow. To meet the C specs, the code produced by 
+**	most C compilers targeting Pentium needs to change the FPU rounding mode 
+**	before the float to int conversion is performed. 
+**
+**	Changing the FPU rounding mode causes the FPU pipeline to be flushed. It 
+**	is this flushing of the pipeline which is so slow.
+**
+**	Fortunately the ISO C99 specifications define the functions lrint, lrintf,
+**	llrint and llrintf which fix this problem as a side effect. 
+**
+**	On Unix-like systems, the configure process should have detected the 
+**	presence of these functions. If they weren't found we have to replace them 
+**	here with a standard C cast.
+*/
+
+/*	
+**	The C99 prototypes for lrint and lrintf are as follows:
+**	
+**		long int lrintf (float x) ;
+**		long int lrint  (double x) ;
+*/
+
+#include "config.h"
+
+/*
+**	The presence of the required functions are detected during the configure
+**	process and the values HAVE_LRINT and HAVE_LRINTF are set accordingly in
+**	the config.h file.
+*/
+
+#if (HAVE_LRINT && HAVE_LRINTF)
+
+	/*
+	**	These defines enable functionality introduced with the 1999 ISO C
+	**	standard. They must be defined before the inclusion of math.h to
+	**	engage them. If optimisation is enabled, these functions will be 
+	**	inlined. With optimisation switched off, you have to link in the
+	**	maths library using -lm.
+	*/
+
+	#define	_ISOC9X_SOURCE	1
+	#define _ISOC99_SOURCE	1
+
+	#define	__USE_ISOC9X	1
+	#define	__USE_ISOC99	1
+
+	#include	<math.h>
+	
+#elif (defined (WIN32) || defined (_WIN32))
+
+	#include	<math.h>
+
+	/*
+	**	Win32 doesn't seem to have these functions. 
+	**	Therefore implement inline versions of these functions here.
+	*/
+	
+	__inline long int 
+	lrint (double flt)
+	{	int intgr;
+
+		_asm
+		{	fld flt
+			fistp intgr
+			} ;
+			
+		return intgr ;
+	} 
+	
+	__inline long int 
+	lrintf (float flt)
+	{	int intgr;
+
+		_asm
+		{	fld flt
+			fistp intgr
+			} ;
+			
+		return intgr ;
+	}
+
+#elif (defined (__MWERKS__) && defined (__APPLE__))
+
+	/* This MacOS 9 solution was provided by Stephane Letz */
+
+	#include   <math.h>
+
+	#define	lrint   double2int
+	#define	lrintf  float2int
+
+	inline int 
+	float2int (register float in) 
+	{	long res [2] ;
+	
+		asm 
+		{	fctiw	in,in
+		  	stfd	 in,res
+	  	}
+		return res [1] ;
+	} /* float2int */
+	
+	inline int 
+	double2int (register double in) 
+	{	long res [2] ;
+	
+		asm 
+		{	fctiw	in,in
+			stfd	 in,res
+	  	}
+		return res [1] ;
+	} /* double2int */
+
+#elif (defined (__MACH__) && defined (__APPLE__))
+
+	/* For Apple MacOSX. */
+
+	#include   <math.h>
+
+	inline static long int 
+	lrintf (register float in) 
+	{	int res [2] ;
+	
+		__asm__ __volatile__
+		(	"fctiw	%1, %1\n\t"
+		  	"stfd	%1, %0"
+			: "=m" (res)	/* Output */
+			: "f" (in)		/* Input */
+			: "memory"
+			) ;
+
+		return res [1] ;
+	} /* lrintf */
+	
+	inline static long int 
+	lrint (register double in) 
+	{	int res [2] ;
+	
+		__asm__ __volatile__
+		(	"fctiw	%1, %1\n\t"
+		  	"stfd	%1, %0"
+			: "=m" (res)	/* Output */
+			: "f" (in)		/* Input */
+			: "memory"
+			) ;
+
+		return res [1] ;
+	} /* lrint */
+
+#else
+	#warning "Don't have the functions lrint() and lrintf()."
+	#warning "Replacing these functions with a standard C cast."
+
+	#include	<math.h>
+
+	#define	lrint(dbl)		((int) (dbl))
+	#define	lrintf(flt)		((int) (flt))
+
+#endif
+
+
+
--- a/common/libsndfile/src/floatcast.h
+++ /dev/null
@@ -1,37 +1,0 @@
-/*
-** Copyright (C) 2001 Erik de Castro Lopo <[email protected]>
-**  
-** This program is free software; you can redistribute it and/or modify
-** it under the terms of the GNU Lesser General Public License as published by
-** the Free Software Foundation; either version 2.1 of the License, or
-** (at your option) any later version.
-** 
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-** GNU Lesser General Public License for more details.
-** 
-** You should have received a copy of the GNU Lesser General Public License
-** along with this program; if not, write to the Free Software 
-** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-*/
-
-/* On Intel Pentium processors (especially PIII and probably P4), converting
-** from float to int is very slow. To meet the C specs, the code produced by 
-** most C compilers targeting Pentium needs to change the FPU rounding mode 
-** before the float to int conversion is performed. 
-**
-** Changing the FPU rounding mode causes the FPU pipeline to be flushed. It 
-** is this flushing of the pipeline which is so slow.
-*/
-
-
-/* These macros are place holders for inline functions which will replace 
-** them in the near future.
-*/
-
-#define	FLOAT_TO_INT(x)		((int)(x))
-#define	FLOAT_TO_SHORT(x)	((short)(x))
-
-#define	DOUBLE_TO_INT(x)	((int)(x))
-#define	DOUBLE_TO_SHORT(x)	((short)(x))
--- /dev/null
+++ b/common/libsndfile/src/gsm610.c
@@ -1,0 +1,540 @@
+/*
+** Copyright (C) 1999-2002 Erik de Castro Lopo <[email protected]>
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+** 
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+** 
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include	<stdio.h>
+#include	<unistd.h>
+#include	<string.h>
+
+#include	"sndfile.h"
+#include	"config.h"
+#include	"sfendian.h"
+#include	"float_cast.h"
+#include	"common.h"
+#include	"wav_w64.h"
+#include	"GSM610/gsm.h"
+
+#if (CPU_IS_LITTLE_ENDIAN == 1)
+#	define	MAKE_MARKER(a,b,c,d)		((a)|((b)<<8)|((c)<<16)|((d)<<24))
+#elif (CPU_IS_BIG_ENDIAN == 1)
+#	define	MAKE_MARKER(a,b,c,d)		(((a)<<24)|((b)<<16)|((c)<<8)|(d))
+#else
+#	error "Cannot determine endian-ness of processor."
+#endif
+
+#define RIFF_MARKER	(MAKE_MARKER ('R', 'I', 'F', 'F')) 
+#define WAVE_MARKER	(MAKE_MARKER ('W', 'A', 'V', 'E')) 
+#define fmt_MARKER	(MAKE_MARKER ('f', 'm', 't', ' ')) 
+#define fact_MARKER	(MAKE_MARKER ('f', 'a', 'c', 't')) 
+#define data_MARKER	(MAKE_MARKER ('d', 'a', 't', 'a')) 
+
+#define 	WAVE_FORMAT_GSM610	0x0031
+
+typedef struct
+{	int				blocks ; 
+	int				blockcount, samplecount ;
+	short			samples [WAV_W64_GSM610_SAMPLES] ;
+	unsigned char	block [WAV_W64_GSM610_BLOCKSIZE] ;
+	gsm				gsm_data ;
+} GSM610_PRIVATE ;
+
+
+static sf_count_t	gsm610_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static sf_count_t	gsm610_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+static sf_count_t	gsm610_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+static sf_count_t	gsm610_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
+
+static sf_count_t	gsm610_write_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static sf_count_t	gsm610_write_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+static sf_count_t	gsm610_write_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+static sf_count_t	gsm610_write_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
+
+static	int gsm610_read_block (SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610, short *ptr, sf_count_t len) ;
+static	int gsm610_write_block (SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610, short *ptr, sf_count_t len) ;
+
+static	int	gsm610_decode_block (SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610) ;
+static	int	gsm610_encode_block (SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610) ;
+
+static sf_count_t  gsm610_seek   (SF_PRIVATE *psf, int mode, sf_count_t offset) ;
+
+static int	gsm610_close	(SF_PRIVATE  *psf) ;
+
+/*============================================================================================
+** WAV GSM610 initialisation function.
+*/
+
+int	
+gsm610_init (SF_PRIVATE *psf)
+{	GSM610_PRIVATE	*pgsm610 ;
+	int  true = 1 ;
+	
+	if (psf->mode == SFM_RDWR)
+		return SFE_BAD_MODE_RW ;
+
+	psf->sf.seekable = SF_FALSE ;
+
+	if (! (pgsm610 = malloc (sizeof (GSM610_PRIVATE))))
+		return SFE_MALLOC_FAILED ;
+
+	psf->fdata = (void*) pgsm610 ;
+
+	memset (pgsm610, 0, sizeof (GSM610_PRIVATE)) ;
+
+/*============================================================
+
+Need separate gsm_data structs for encode and decode.
+
+============================================================*/
+
+	if (! (pgsm610->gsm_data = gsm_create ()))
+		return SFE_MALLOC_FAILED ;
+		
+	if ((psf->sf.format & SF_FORMAT_TYPEMASK) == SF_FORMAT_WAV ||
+				(psf->sf.format & SF_FORMAT_TYPEMASK) == SF_FORMAT_W64)
+		gsm_option (pgsm610->gsm_data,  GSM_OPT_WAV49, &true) ;
+
+	if (psf->mode == SFM_READ)
+	{	if (psf->datalength % WAV_W64_GSM610_BLOCKSIZE)
+		{	psf_log_printf (psf, "*** Warning : data chunk seems to be truncated.\n") ;
+			pgsm610->blocks = psf->datalength / WAV_W64_GSM610_BLOCKSIZE + 1 ;
+			}
+		else
+			pgsm610->blocks = psf->datalength / WAV_W64_GSM610_BLOCKSIZE ;
+	
+		psf->sf.samples = WAV_W64_GSM610_SAMPLES * pgsm610->blocks ;
+
+		gsm610_decode_block (psf, pgsm610) ;	/* Read first block. */
+		
+		psf->read_short  = gsm610_read_s ;
+		psf->read_int    = gsm610_read_i ;
+		psf->read_float  = gsm610_read_f ;
+		psf->read_double = gsm610_read_d ;
+		} ;
+		
+	if (psf->mode == SFM_WRITE)
+	{	pgsm610->blockcount  = 0 ;
+		pgsm610->samplecount = 0 ;
+
+		psf->write_short  = gsm610_write_s ;
+		psf->write_int    = gsm610_write_i ;
+		psf->write_float  = gsm610_write_f ;
+		psf->write_double = gsm610_write_d ;
+		} ;
+		
+	psf->close    = gsm610_close ;
+	psf->new_seek = gsm610_seek ;
+
+	psf->filelength = psf_get_filelen (psf->filedes) ;
+	psf->datalength = psf->filelength - psf->dataoffset ;
+
+	return 0 ;	
+} /* gsm610_init */
+
+/*============================================================================================
+** GSM 6.10 Read Functions.
+*/
+
+static int		
+gsm610_decode_block (SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610)
+{	int	k ;
+	
+	pgsm610->blockcount ++ ;
+	pgsm610->samplecount = 0 ;
+	
+	if (pgsm610->blockcount > pgsm610->blocks)
+	{	memset (pgsm610->samples, 0, WAV_W64_GSM610_SAMPLES * sizeof (short)) ;
+		return 1 ;
+		} ;
+
+	if ((k = psf_fread (pgsm610->block, 1, WAV_W64_GSM610_BLOCKSIZE, psf->filedes)) != WAV_W64_GSM610_BLOCKSIZE)
+		psf_log_printf (psf, "*** Warning : short read (%d != %d).\n", k, WAV_W64_GSM610_BLOCKSIZE) ;
+
+	if (gsm_decode (pgsm610->gsm_data, pgsm610->block, pgsm610->samples) < 0)
+	{	psf_log_printf (psf, "Error from gsm_decode() on frame : %d\n", pgsm610->blockcount) ;
+		return 0 ;
+		} ;
+			
+	if (gsm_decode (pgsm610->gsm_data, pgsm610->block+(WAV_W64_GSM610_BLOCKSIZE+1)/2, pgsm610->samples+WAV_W64_GSM610_SAMPLES/2) < 0)
+	{	psf_log_printf (psf, "Error from gsm_decode() on frame : %d.5\n", pgsm610->blockcount) ;
+		return 0 ;
+		} ;
+
+	return 1 ;
+} /* gsm610_decode_block */
+
+static int 
+gsm610_read_block (SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610, short *ptr, sf_count_t len)
+{	sf_count_t	count, total = 0, index = 0 ;
+
+	while (index < len)
+	{	if (pgsm610->blockcount >= pgsm610->blocks && pgsm610->samplecount >= WAV_W64_GSM610_SAMPLES)
+		{	memset (&(ptr[index]), 0, (size_t) ((len - index) * sizeof (short))) ;
+			return total ;
+			} ;
+		
+		if (pgsm610->samplecount >= WAV_W64_GSM610_SAMPLES)
+			gsm610_decode_block (psf, pgsm610) ;
+		
+		count = WAV_W64_GSM610_SAMPLES - pgsm610->samplecount ;
+		count = (len - index > count) ? count : len - index ;
+		
+		memcpy (&(ptr[index]), &(pgsm610->samples [pgsm610->samplecount]), count * sizeof (short)) ;
+		index += count ;
+		pgsm610->samplecount += count ;
+		total = index ;
+		} ;
+
+	return total ;		
+} /* gsm610_read_block */
+
+static sf_count_t
+gsm610_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
+{	GSM610_PRIVATE 	*pgsm610 ; 
+	int				total ;
+
+	if (! psf->fdata)
+		return 0 ;
+	pgsm610 = (GSM610_PRIVATE*) psf->fdata ;
+	
+	total = gsm610_read_block (psf, pgsm610, ptr, len) ;
+
+	return total ;
+} /* gsm610_read_s */
+
+static sf_count_t	
+gsm610_read_i  (SF_PRIVATE *psf, int *ptr, sf_count_t len)
+{	GSM610_PRIVATE *pgsm610 ; 
+	short		*sptr ;
+	int			k, bufferlen, readcount = 0, count ;
+	int			index = 0, total = 0 ;
+
+	if (! psf->fdata)
+		return 0 ;
+	pgsm610 = (GSM610_PRIVATE*) psf->fdata ;
+	
+	sptr = (short*) psf->buffer ;
+	bufferlen = SF_BUFFER_LEN / sizeof (short) ;
+	while (len > 0)
+	{	readcount = (len >= bufferlen) ? bufferlen : len ;
+		count = gsm610_read_block (psf, pgsm610, sptr, readcount) ;
+		for (k = 0 ; k < readcount ; k++)
+			ptr [index + k] = sptr [k] << 16 ;
+		index += readcount ;
+		total += count ;
+		len -= readcount ;
+		} ;
+	return total ;
+} /* gsm610_read_i */
+
+static sf_count_t	
+gsm610_read_f  (SF_PRIVATE *psf, float *ptr, sf_count_t len)
+{	GSM610_PRIVATE *pgsm610 ; 
+	short		*sptr ;
+	int			k, bufferlen, readcount = 0, count ;
+	int			index = 0, total = 0 ;
+	float		normfact ;
+
+	if (! psf->fdata)
+		return 0 ;
+	pgsm610 = (GSM610_PRIVATE*) psf->fdata ;
+	
+	normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ;
+
+	sptr = (short*) psf->buffer ;
+	bufferlen = SF_BUFFER_LEN / sizeof (short) ;
+	while (len > 0)
+	{	readcount = (len >= bufferlen) ? bufferlen : len ;
+		count = gsm610_read_block (psf, pgsm610, sptr, readcount) ;
+		for (k = 0 ; k < readcount ; k++)
+			ptr [index + k] = normfact * sptr [k] ;
+		index += readcount ;
+		total += count ;
+		len -= readcount ;
+		} ;
+	return total ;
+} /* gsm610_read_f */
+
+static sf_count_t	
+gsm610_read_d  (SF_PRIVATE *psf, double *ptr, sf_count_t len)
+{	GSM610_PRIVATE *pgsm610 ; 
+	short		*sptr ;
+	int			k, bufferlen, readcount = 0, count ;
+	int			index = 0, total = 0 ;
+	double		normfact ;
+	
+	normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x8000) : 1.0 ;
+
+	if (! psf->fdata)
+		return 0 ;
+	pgsm610 = (GSM610_PRIVATE*) psf->fdata ;
+	
+	sptr = (short*) psf->buffer ;
+	bufferlen = SF_BUFFER_LEN / sizeof (short) ;
+	while (len > 0)
+	{	readcount = (len >= bufferlen) ? bufferlen : len ;
+		count = gsm610_read_block (psf, pgsm610, sptr, readcount) ;
+		for (k = 0 ; k < readcount ; k++)
+			ptr [index + k] = normfact * sptr [k] ;
+		index += readcount ;
+		total += count ;
+		len -= readcount ;
+		} ;
+	return total ;
+} /* gsm610_read_d */
+
+static sf_count_t    
+gsm610_seek   (SF_PRIVATE *psf, int mode, sf_count_t offset)
+{	GSM610_PRIVATE *pgsm610 ; 
+	int			newblock, newsample ;
+	
+	if (! psf->fdata)
+		return 0 ;
+	pgsm610 = (GSM610_PRIVATE*) psf->fdata ;
+
+	if (psf->dataoffset < 0)
+	{	psf->error = SFE_BAD_SEEK ;
+		return	((sf_count_t) -1) ;
+		} ;
+		
+	if (offset == 0)
+	{	int true = 1 ;
+	
+		psf_fseek (psf->filedes, psf->dataoffset, SEEK_SET) ;
+		pgsm610->blockcount  = 0 ;
+		
+		gsm_init (pgsm610->gsm_data) ;
+		if ((psf->sf.format & SF_FORMAT_TYPEMASK) == SF_FORMAT_WAV ||
+				(psf->sf.format & SF_FORMAT_TYPEMASK) == SF_FORMAT_W64)
+			gsm_option (pgsm610->gsm_data,  GSM_OPT_WAV49, &true) ;
+
+		gsm610_decode_block (psf, pgsm610) ;
+		pgsm610->samplecount = 0 ;
+		return 0 ;
+		} ;
+
+	if (offset < 0 || offset > pgsm610->blocks * WAV_W64_GSM610_SAMPLES)
+	{	psf->error = SFE_BAD_SEEK ;
+		return	((sf_count_t) -1) ;
+		} ;
+
+	newblock  = offset / WAV_W64_GSM610_SAMPLES ;
+	newsample = offset % WAV_W64_GSM610_SAMPLES ;
+		
+	if (psf->mode == SFM_READ)
+	{	if (psf->read_current != newblock * WAV_W64_GSM610_BLOCKSIZE + newsample)
+		{	psf_fseek (psf->filedes, psf->dataoffset + newblock * WAV_W64_GSM610_BLOCKSIZE, SEEK_SET) ;
+			pgsm610->blockcount  = newblock ;
+			gsm610_decode_block (psf, pgsm610) ;
+			pgsm610->samplecount = newsample ;
+			} ;
+		
+		return newblock * WAV_W64_GSM610_SAMPLES + newsample ;
+		} ;
+		
+	/* What to do about write??? */ 
+	psf->error = SFE_BAD_SEEK ;
+	return	((sf_count_t) -1) ;
+} /* gsm610_seek */
+
+/*==========================================================================================
+** GSM 6.10 Write Functions.
+*/
+
+
+
+/*==========================================================================================
+*/
+
+static int
+gsm610_encode_block (SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610)
+{	int k ;
+
+	/* Encode the samples. */
+	gsm_encode (pgsm610->gsm_data, pgsm610->samples, pgsm610->block) ;
+	gsm_encode (pgsm610->gsm_data, pgsm610->samples+WAV_W64_GSM610_SAMPLES/2, pgsm610->block+WAV_W64_GSM610_BLOCKSIZE/2) ;
+
+	/* Write the block to disk. */
+	if ((k = psf_fwrite (pgsm610->block, 1, WAV_W64_GSM610_BLOCKSIZE, psf->filedes)) != WAV_W64_GSM610_BLOCKSIZE)
+		psf_log_printf (psf, "*** Warning : short write (%d != %d).\n", k, WAV_W64_GSM610_BLOCKSIZE) ;
+
+	pgsm610->samplecount = 0 ;
+	pgsm610->blockcount ++ ;
+
+	/* Set samples to zero for next block. */
+	memset (pgsm610->samples, 0, WAV_W64_GSM610_SAMPLES * sizeof (short)) ;
+
+	return 1 ;
+} /* wav_gsm610_encode_block */
+
+static int 
+gsm610_write_block (SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610, short *ptr, sf_count_t len)
+{	int		count, total = 0, index = 0 ;
+	
+	while (index < len)
+	{	count = WAV_W64_GSM610_SAMPLES - pgsm610->samplecount ;
+
+		if (count > len - index)
+			count = len - index ;
+
+		memcpy (&(pgsm610->samples [pgsm610->samplecount]), &(ptr [index]), count * sizeof (short)) ;
+		index += count ;
+		pgsm610->samplecount += count ;
+		total = index ;
+
+		if (pgsm610->samplecount >= WAV_W64_GSM610_SAMPLES)
+			gsm610_encode_block (psf, pgsm610) ;	
+		} ;
+
+	return total ;		
+} /* gsm610_write_block */
+
+static sf_count_t
+gsm610_write_s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
+{	GSM610_PRIVATE 	*pgsm610 ; 
+	int				total ;
+
+	if (! psf->fdata)
+		return 0 ;
+	pgsm610 = (GSM610_PRIVATE*) psf->fdata ;
+	
+	total = gsm610_write_block (psf, pgsm610, ptr, len) ;
+
+	return total ;
+} /* gsm610_write_s */
+
+static sf_count_t	
+gsm610_write_i  (SF_PRIVATE *psf, int *ptr, sf_count_t len)
+{	GSM610_PRIVATE *pgsm610 ; 
+	short		*sptr ;
+	int			k, bufferlen, writecount = 0, count ;
+	int			index = 0, total = 0 ;
+
+	if (! psf->fdata)
+		return 0 ;
+	pgsm610 = (GSM610_PRIVATE*) psf->fdata ;
+	
+	sptr = (short*) psf->buffer ;
+	bufferlen = SF_BUFFER_LEN / sizeof (short) ;
+	while (len > 0)
+	{	writecount = (len >= bufferlen) ? bufferlen : len ;
+		for (k = 0 ; k < writecount ; k++)
+			sptr [k] = ptr [index + k] >> 16 ;
+		count = gsm610_write_block (psf, pgsm610, sptr, writecount) ;
+		index += writecount ;
+		total += count ;
+		len -= writecount ;
+		} ;
+	return total ;
+} /* gsm610_write_i */
+
+static sf_count_t	
+gsm610_write_f  (SF_PRIVATE *psf, float *ptr, sf_count_t len)
+{	GSM610_PRIVATE *pgsm610 ; 
+	short		*sptr ;
+	int			k, bufferlen, writecount = 0, count ;
+	int			index = 0, total = 0 ;
+	float		normfact ;
+	
+	if (! psf->fdata)
+		return 0 ;
+	pgsm610 = (GSM610_PRIVATE*) psf->fdata ;
+	
+	normfact = (psf->norm_float == SF_TRUE) ? ((float) 0x8000) : 1.0 ;
+	
+	sptr = (short*) psf->buffer ;
+	bufferlen = SF_BUFFER_LEN / sizeof (short) ;
+	while (len > 0)
+	{	writecount = (len >= bufferlen) ? bufferlen : len ;
+		for (k = 0 ; k < writecount ; k++)
+			sptr [k] = lrintf (normfact * ptr [index + k])  ;
+		count = gsm610_write_block (psf, pgsm610, sptr, writecount) ;
+		index += writecount ;
+		total += count ;
+		len -= writecount ;
+		} ;
+	return total ;
+} /* gsm610_write_f */
+
+static sf_count_t	
+gsm610_write_d  (SF_PRIVATE *psf, double *ptr, sf_count_t len)
+{	GSM610_PRIVATE *pgsm610 ; 
+	short		*sptr ;
+	int			k, bufferlen, writecount = 0, count ;
+	int			index = 0, total = 0 ;
+	double		normfact ;
+	
+	if (! psf->fdata)
+		return 0 ;
+	pgsm610 = (GSM610_PRIVATE*) psf->fdata ;
+	
+	normfact = (psf->norm_double == SF_TRUE) ? ((double) 0x8000) : 1.0 ;
+
+	sptr = (short*) psf->buffer ;
+	bufferlen = SF_BUFFER_LEN / sizeof (short) ;
+	while (len > 0)
+	{	writecount = (len >= bufferlen) ? bufferlen : len ;
+		for (k = 0 ; k < writecount ; k++)
+			sptr [k] = lrint (normfact * ptr [index + k]) ;
+		count = gsm610_write_block (psf, pgsm610, sptr, writecount) ;
+		index += writecount ;
+		total += count ;
+		len -= writecount ;
+		} ;
+	return total ;
+} /* gsm610_write_d */
+
+static int	
+gsm610_close	(SF_PRIVATE  *psf)
+{	GSM610_PRIVATE *pgsm610 ; 
+
+	if (! psf->fdata)
+		return 0 ;
+
+	pgsm610 = (GSM610_PRIVATE*) psf->fdata ;
+
+	if (psf->mode == SFM_WRITE)
+	{	/*	If a block has been partially assembled, write it out
+		**	as the final block.
+		*/
+	
+		if (pgsm610->samplecount && pgsm610->samplecount < WAV_W64_GSM610_SAMPLES)
+			gsm610_encode_block (psf, pgsm610) ;	
+
+		/*  Now we know for certain the length of the file we can
+		**  re-write correct values for the RIFF and data chunks.
+		*/
+		 
+		psf_fseek (psf->filedes, 0, SEEK_END) ;
+		psf->filelength = psf_ftell (psf->filedes) ;
+
+		psf->sf.samples = WAV_W64_GSM610_SAMPLES * pgsm610->blockcount ;
+		psf->datalength = psf->filelength - psf->dataoffset ;
+
+		if (psf->write_header)
+			psf->write_header (psf) ;
+		} ;
+
+	if (pgsm610->gsm_data)
+		gsm_destroy (pgsm610->gsm_data) ;
+
+	if (psf->fdata)
+		free (psf->fdata) ;
+	psf->fdata = NULL ;
+
+	return 0 ;
+} /* gsm610_close */
+
--- /dev/null
+++ b/common/libsndfile/src/ima_adpcm.c
@@ -1,0 +1,793 @@
+/*
+** Copyright (C) 1999-2002 Erik de Castro Lopo <[email protected]>
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+** 
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+** 
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include	<stdio.h>
+#include	<unistd.h>
+#include	<string.h>
+
+#include	"sndfile.h"
+#include	"config.h"
+#include	"sfendian.h"
+#include	"float_cast.h"
+#include	"common.h"
+
+typedef struct
+{	int				channels, blocksize, samplesperblock, blocks ; 
+	int				blockcount, samplecount ;
+	int				previous [2] ;
+	int				stepindex [2] ;
+	unsigned char	*block ;
+	short			*samples ;
+	unsigned char	data	[4] ; /* Dummy size */
+} IMA_ADPCM_PRIVATE ;
+
+/*============================================================================================
+** Predefined IMA ADPCM data.
+*/
+
+static int ima_index_adjust [16] = 
+{	-1, -1, -1, -1,		/* +0 - +3, decrease the step size */
+     2,  4,  6,  8,     /* +4 - +7, increase the step size */
+    -1, -1, -1, -1,		/* -0 - -3, decrease the step size */
+     2,  4,  6,  8,		/* -4 - -7, increase the step size */
+} ;
+
+static int ima_step_size [89] = 
+{	7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 19, 21, 23, 25, 28, 31, 34, 37, 41, 45, 
+	50, 55, 60, 66, 73, 80, 88, 97, 107, 118, 130, 143, 157, 173, 190, 209, 230, 
+	253, 279, 307, 337, 371, 408, 449, 494, 544, 598, 658, 724, 796, 876, 963, 
+	1060, 1166, 1282, 1411, 1552, 1707, 1878, 2066, 2272, 2499, 2749, 3024, 3327, 
+	3660, 4026, 4428, 4871, 5358, 5894, 6484, 7132, 7845, 8630, 9493, 10442,
+	11487, 12635, 13899, 15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794, 
+	32767
+} ;
+
+static int ima_reader_init (SF_PRIVATE *psf, int blockalign, int samplesperblock) ;
+static int ima_writer_init (SF_PRIVATE *psf, int blockalign) ;
+
+static int ima_decode_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima) ;
+static int ima_read_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima, short *ptr, sf_count_t len) ;
+
+static int ima_encode_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima) ;
+static int ima_write_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima, short *ptr, sf_count_t len) ;
+
+static sf_count_t ima_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static sf_count_t ima_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+static sf_count_t ima_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+static sf_count_t ima_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
+
+static sf_count_t ima_write_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static sf_count_t ima_write_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+static sf_count_t ima_write_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+static sf_count_t ima_write_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
+
+static sf_count_t	ima_seek   (SF_PRIVATE *psf, int mode, sf_count_t offset) ;
+
+static int	wav_w64_ima_close	(SF_PRIVATE  *psf) ;
+/*-static int	aiff_ima_close	(SF_PRIVATE  *psf) ;-*/
+
+/*============================================================================================
+** IMA ADPCM Reader initialisation function.
+*/
+
+int	
+wav_w64_ima_init (SF_PRIVATE *psf, int blockalign, int samplesperblock)
+{	int error ;
+
+	if (psf->mode == SFM_RDWR)
+		return SFE_BAD_MODE_RW ;
+ 
+	if (psf->mode == SFM_READ)
+		if ((error = ima_reader_init (psf, blockalign, samplesperblock)))
+			return error ;
+		
+	if (psf->mode == SFM_WRITE)
+		if ((error = ima_writer_init (psf, blockalign)))
+			return error ;
+
+	psf->new_seek = ima_seek ;
+	psf->close = wav_w64_ima_close ;
+
+	return 0 ;
+} /* wav_w64_ima_init */
+
+static int	
+wav_w64_ima_close	(SF_PRIVATE  *psf)
+{	IMA_ADPCM_PRIVATE *pima ; 
+
+	if (! psf->fdata)
+		return 0 ;
+
+	pima = (IMA_ADPCM_PRIVATE*) psf->fdata ;
+
+	if (psf->mode == SFM_WRITE)
+	{	/*	If a block has been partially assembled, write it out
+		**	as the final block.
+		*/
+	
+		if (pima->samplecount && pima->samplecount < pima->samplesperblock)
+			ima_encode_block (psf, pima) ;	
+
+		/*  Now we know for certain the length of the file we can
+		**  re-write the header.
+		*/
+		psf_fseek (psf->filedes, 0, SEEK_END) ;
+		psf->filelength = psf_ftell (psf->filedes) ;
+
+		psf->sf.samples = pima->samplesperblock * pima->blockcount ;
+		psf->datalength = psf->filelength - psf->dataoffset ;
+
+		if (psf->write_header)
+			psf->write_header (psf) ;
+		} ;
+
+	free (psf->fdata) ;
+	psf->fdata = NULL ;
+
+	return 0 ;
+} /* wav_w64_ima_close */
+
+/*-
+int	
+aiff_ima_reader_init (SF_PRIVATE *psf, int blockalign, int samplesperblock)
+{	IMA_ADPCM_PUBLIC public ;
+
+	public.blocksize       = blockalign ;
+	public.channels        = psf->sf.channels ;
+	public.samplesperblock = samplesperblock ;
+	return ima_reader_init (psf, &public) ;
+} /+* aiff_ima_reader_init *+/
+
+int	
+aiff_ima_writer_init (SF_PRIVATE *psf, int blocksize)
+{	IMA_ADPCM_PUBLIC 	public ;
+	int					error ;
+	
+	public.blocksize = blocksize ;	
+	public.channels  = psf->sf.channels ;
+	public.samplesperblock = 2 * (public.blocksize - 4 * psf->sf.channels) / psf->sf.channels + 1 ;
+	
+	if ((error = ima_writer_init (psf, &public)))
+		return error ;
+		
+	if (psf->write_header)
+		psf->write_header (psf) ;
+
+	psf->write_short  = ima_write_s ;
+	psf->write_int    = ima_write_i ;
+	psf->write_float  = ima_write_f ;
+	psf->write_double = ima_write_d ;
+	psf->new_seek    = ima_seek ;
+	psf->close        = aiff_ima_close ;
+		
+	return 0 ;
+} /+* aiff_ima_writer_init *+/
+
+static int	
+aiff_ima_close	(SF_PRIVATE  *psf)
+{	IMA_ADPCM_PRIVATE *pima ; 
+
+	if (! psf->fdata)
+		return 0 ;
+
+	pima = (IMA_ADPCM_PRIVATE*) psf->fdata ;
+
+	if (psf->mode == SFM_WRITE)
+	{	/+*	If a block has been partially assembled, write it out
+		**	as the final block.
+		*+/
+	
+		if (pima->samplecount && pima->samplecount < pima->samplesperblock)
+			ima_encode_block (psf, pima) ;	
+
+		/+*  Now we know for certain the length of the file we can
+		**  re-write the header.
+		*+/
+		psf_fseek (psf->filedes, 0, SEEK_END) ;
+		psf->filelength = psf_ftell (psf->filedes) ;
+
+		psf->sf.samples = pima->samplesperblock * pima->blockcount ;
+		psf->datalength = psf->filelength - psf->dataoffset ;
+
+		if (psf->write_header)
+			psf->write_header (psf) ;
+		} ;
+
+	free (psf->fdata) ;
+	psf->fdata = NULL ;
+
+	return 0 ;
+} /+* aiff_ima_close *+/
+-*/
+
+/*============================================================================================
+** IMA ADPCM Read Functions.
+*/
+
+static int
+ima_reader_init (SF_PRIVATE *psf, int blockalign, int samplesperblock)
+{	IMA_ADPCM_PRIVATE	*pima ;
+	int		pimasize, count ;
+	
+	if (psf->mode != SFM_READ)
+		return SFE_BAD_MODE_RW ;
+
+	pimasize = sizeof (IMA_ADPCM_PRIVATE) + blockalign + 3 * psf->sf.channels * samplesperblock ;
+
+	if (! (pima = malloc (pimasize)))
+		return SFE_MALLOC_FAILED ;
+
+	psf->fdata = (void*) pima ;
+
+	memset (pima, 0, pimasize) ;
+
+	pima->block   = (unsigned char*) pima->data ;
+	pima->samples = (short*) (pima->data + blockalign) ;
+	
+	pima->channels        = psf->sf.channels ;
+	pima->blocksize       = blockalign ;
+	pima->samplesperblock = samplesperblock ;
+	
+	psf->filelength = psf_get_filelen (psf->filedes) ;
+	psf->datalength = (psf->dataend) ? psf->dataend - psf->dataoffset : 
+							psf->filelength - psf->dataoffset ;
+
+	if (psf->datalength % pima->blocksize)
+		pima->blocks = psf->datalength / pima->blocksize  + 1 ;
+	else
+		pima->blocks = psf->datalength / pima->blocksize ;
+	
+	count = 2 * (pima->blocksize - 4 * pima->channels) / pima->channels + 1 ;
+	if (pima->samplesperblock != count)
+		psf_log_printf (psf, "*** Warning : samplesperblock should be %d.\n", count) ;
+
+	psf->sf.samples = pima->samplesperblock * pima->blocks ;
+
+	ima_decode_block (psf, pima) ;	/* Read first block. */
+	
+	psf->read_short  = ima_read_s ;
+	psf->read_int    = ima_read_i ;
+	psf->read_float  = ima_read_f ;
+	psf->read_double = ima_read_d ;
+
+	return 0 ;	
+} /* ima_reader_init */
+
+static int
+ima_decode_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima)
+{	int		chan, k, current, blockindex, index, indexstart ;
+	short	step, diff, bytecode, stepindex [2] ;
+	
+	pima->blockcount ++ ;
+	pima->samplecount = 0 ;
+	
+	if (pima->blockcount > pima->blocks)
+	{	memset (pima->samples, 0, pima->samplesperblock * pima->channels * sizeof (short)) ;
+		return 1 ;
+		} ;
+
+	if ((k = psf_fread (pima->block, 1, pima->blocksize, psf->filedes)) != pima->blocksize)
+		psf_log_printf (psf, "*** Warning : short read (%d != %d).\n", k, pima->blocksize) ;
+
+	/* Read and check the block header. */
+	
+	for (chan = 0 ; chan < pima->channels ; chan++)
+	{	current = pima->block [chan*4] | (pima->block [chan*4+1] << 8) ;
+		if (current & 0x8000)
+			current -= 0x10000 ;
+			
+		stepindex [chan] = pima->block [chan*4+2] ;
+		if (stepindex [chan] < 0)
+			stepindex [chan] = 0 ;
+		else if (stepindex [chan] > 88)
+			stepindex [chan] = 88 ;
+
+		if (pima->block [chan*4+3] != 0)
+			psf_log_printf (psf, "IMA ADPCM synchronisation error.\n") ;
+		
+		pima->samples [chan] = current ;
+
+		/* psf_log_printf (psf, "block %d : channel %d (current, index) : (%d, %d)\n", 
+		**	pima->blockcount, chan,  current, stepindex [chan]) ;
+		*/
+		} ;
+		
+	/* Pull apart the packed 4 bit samples and store them in their
+	** correct sample positions.
+	*/
+	
+	blockindex = 4 * pima->channels ;
+	
+	indexstart = pima->channels ;
+	while (blockindex <  pima->blocksize)
+	{	for (chan = 0 ; chan < pima->channels ; chan++)
+		{	index = indexstart + chan ;
+			for (k = 0 ; k < 4 ; k++)
+			{	bytecode = pima->block [blockindex++] ;
+				pima->samples [index] = bytecode & 0x0F ;
+				index += pima->channels ;
+				pima->samples [index] = (bytecode >> 4) & 0x0F ;
+				index += pima->channels ;
+				} ;
+			} ;
+		indexstart += 8 * pima->channels ;
+		} ;
+		
+	/* Decode the encoded 4 bit samples. */
+	
+	for (k = pima->channels ; k < (pima->samplesperblock * pima->channels) ; k ++)
+	{	chan = (pima->channels > 1) ? (k % 2) : 0 ;
+
+		bytecode = pima->samples [k] & 0xF ;
+		
+		step = ima_step_size [stepindex [chan]] ;
+		current = pima->samples [k - pima->channels] ;
+  
+		diff = step >> 3 ;
+		if (bytecode & 1) 
+			diff += step >> 2 ;
+		if (bytecode & 2) 
+			diff += step >> 1 ;
+		if (bytecode & 4) 
+			diff += step ;
+		if (bytecode & 8) 
+			diff = -diff ;
+
+		current += diff ;
+
+		if (current > 32767) 
+			current = 32767;
+		else if (current < -32768) 
+			current = -32768 ;
+
+		stepindex [chan] += ima_index_adjust [bytecode] ;
+	
+		if (stepindex [chan] < 0) 
+			stepindex [chan] = 0 ;
+		else if (stepindex [chan] > 88) 
+			stepindex [chan] = 88 ;
+
+		pima->samples [k] = current ;
+		} ;
+
+	return 1 ;
+} /* ima_decode_block */
+
+static int 
+ima_read_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima, short *ptr, sf_count_t len)
+{	sf_count_t		count, total = 0, index = 0 ;
+
+	while (index < len)
+	{	if (pima->blockcount >= pima->blocks && pima->samplecount >= pima->samplesperblock)
+		{	memset (&(ptr[index]), 0, (size_t) ((len - index) * sizeof (short))) ;
+			return total ;
+			} ;
+		
+		if (pima->samplecount >= pima->samplesperblock)
+			ima_decode_block (psf, pima) ;
+		
+		count = (pima->samplesperblock - pima->samplecount) * pima->channels ;
+		count = (len - index > count) ? count : len - index ;
+		
+		memcpy (&(ptr[index]), &(pima->samples [pima->samplecount * pima->channels]), count * sizeof (short)) ;
+		index += count ;
+		pima->samplecount += count / pima->channels ;
+		total = index ;
+		} ;
+
+	return total ;		
+} /* ima_read_block */
+
+static sf_count_t		
+ima_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
+{	IMA_ADPCM_PRIVATE 	*pima ; 
+	int				total ;
+
+	if (! psf->fdata)
+		return 0 ;
+	pima = (IMA_ADPCM_PRIVATE*) psf->fdata ;
+	
+	total = ima_read_block (psf, pima, ptr, len) ;
+
+	return total ;
+} /* ima_read_s */
+
+static sf_count_t	
+ima_read_i  (SF_PRIVATE *psf, int *ptr, sf_count_t len)
+{	IMA_ADPCM_PRIVATE *pima ; 
+	short		*sptr ;
+	int			k, bufferlen, readcount = 0, count ;
+	int			index = 0, total = 0 ;
+
+	if (! psf->fdata)
+		return 0 ;
+	pima = (IMA_ADPCM_PRIVATE*) psf->fdata ;
+	
+	sptr = (short*) psf->buffer ;
+	bufferlen = SF_BUFFER_LEN / sizeof (short) ;
+	while (len > 0)
+	{	readcount = (len >= bufferlen) ? bufferlen : len ;
+		count = ima_read_block (psf, pima, sptr, readcount) ;
+		for (k = 0 ; k < readcount ; k++)
+			ptr [index + k] = ((int) sptr [k]) << 16 ;
+		index += readcount ;
+		total += count ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* ima_read_i */
+
+static sf_count_t
+ima_read_f  (SF_PRIVATE *psf, float *ptr, sf_count_t len)
+{	IMA_ADPCM_PRIVATE *pima ; 
+	short		*sptr ;
+	int			k, bufferlen, readcount = 0, count ;
+	int			index = 0, total = 0 ;
+	float		normfact ;
+
+	if (! psf->fdata)
+		return 0 ;
+	pima = (IMA_ADPCM_PRIVATE*) psf->fdata ;
+	
+	normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ;
+
+	sptr = (short*) psf->buffer ;
+	bufferlen = SF_BUFFER_LEN / sizeof (short) ;
+	while (len > 0)
+	{	readcount = (len >= bufferlen) ? bufferlen : len ;
+		count = ima_read_block (psf, pima, sptr, readcount) ;
+		for (k = 0 ; k < readcount ; k++)
+			ptr [index + k] = normfact * (float) (sptr [k]) ;
+		index += readcount ;
+		total += count ;
+		len -= readcount ;
+		} ;
+	return total ;
+} /* ima_read_f */
+
+static sf_count_t
+ima_read_d  (SF_PRIVATE *psf, double *ptr, sf_count_t len)
+{	IMA_ADPCM_PRIVATE *pima ; 
+	short		*sptr ;
+	int			k, bufferlen, readcount = 0, count ;
+	int			index = 0, total = 0 ;
+	double 		normfact ;
+	
+	if (! psf->fdata)
+		return 0 ;
+	pima = (IMA_ADPCM_PRIVATE*) psf->fdata ;
+	
+	normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x8000) : 1.0 ;
+
+	sptr = (short*) psf->buffer ;
+	bufferlen = SF_BUFFER_LEN / sizeof (short) ;
+	while (len > 0)
+	{	readcount = (len >= bufferlen) ? bufferlen : len ;
+		count = ima_read_block (psf, pima, sptr, readcount) ;
+		for (k = 0 ; k < readcount ; k++)
+			ptr [index + k] = normfact * (double) (sptr [k]) ;
+		index += readcount ;
+		total += count ;
+		len -= readcount ;
+		} ;
+	return total ;
+} /* ima_read_d */
+
+static sf_count_t
+ima_seek   (SF_PRIVATE *psf, int mode, sf_count_t offset)
+{	IMA_ADPCM_PRIVATE *pima ; 
+	int			newblock, newsample ;
+	
+	if (! psf->fdata)
+		return 0 ;
+	pima = (IMA_ADPCM_PRIVATE*) psf->fdata ;
+
+	if (! (psf->datalength && psf->dataoffset))
+	{	psf->error = SFE_BAD_SEEK ;
+		return	((sf_count_t) -1) ;
+		} ;
+		
+	if (offset == 0)
+	{	psf_fseek (psf->filedes, psf->dataoffset, SEEK_SET) ;
+		pima->blockcount  = 0 ;
+		ima_decode_block (psf, pima) ;
+		pima->samplecount = 0 ;
+		return 0 ;
+		} ;
+
+	if (offset < 0 || offset > pima->blocks * pima->samplesperblock)
+	{	psf->error = SFE_BAD_SEEK ;
+		return	((sf_count_t) -1) ;
+		} ;
+
+	newblock  = offset / pima->samplesperblock ;
+	newsample = offset % pima->samplesperblock ;
+		
+	if (mode == SFM_READ)
+	{	psf_fseek (psf->filedes, psf->dataoffset + newblock * pima->blocksize, SEEK_SET) ;
+		pima->blockcount  = newblock ;
+		ima_decode_block (psf, pima) ;
+		pima->samplecount = newsample ;
+		}
+	else
+	{	/* What to do about write??? */ 
+		psf->error = SFE_BAD_SEEK ;
+		return	((sf_count_t) -1) ;
+		} ;
+
+	return newblock * pima->samplesperblock + newsample ;
+} /* ima_seek */
+
+/*==========================================================================================
+** IMA ADPCM Write Functions.
+*/
+
+static int	
+ima_writer_init (SF_PRIVATE *psf, int blockalign)
+{	IMA_ADPCM_PRIVATE	*pima ;
+	int					samplesperblock ;
+	unsigned int 		pimasize ;
+	
+	if (psf->mode != SFM_WRITE)
+		return SFE_BAD_MODE_RW ;
+
+	samplesperblock = 2 * (blockalign - 4 * psf->sf.channels) / psf->sf.channels + 1 ;
+
+	pimasize = sizeof (IMA_ADPCM_PRIVATE) + blockalign + 3 * psf->sf.channels * samplesperblock ;
+
+	if (! (pima = malloc (pimasize)))
+		return SFE_MALLOC_FAILED ;
+		
+	psf->fdata = (void*) pima ;
+
+	memset (pima, 0, pimasize) ;
+	
+	pima->channels        = psf->sf.channels ;
+	pima->blocksize       = blockalign ;
+	pima->samplesperblock = samplesperblock ;
+
+	pima->block   = (unsigned char*) pima->data ;
+	pima->samples = (short*) (pima->data + blockalign) ;
+	
+	pima->samplecount = 0 ;
+	
+	psf->write_short  = ima_write_s ;
+	psf->write_int    = ima_write_i ;
+	psf->write_float  = ima_write_f ;
+	psf->write_double = ima_write_d ;
+
+	return 0 ;
+} /* ima_writer_init */
+
+
+
+/*==========================================================================================
+*/
+
+static int		
+ima_encode_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima)
+{	int		chan, k, step, diff, vpdiff, blockindex, index, indexstart ;
+	short	bytecode, mask ;
+	
+	/* Encode the block header. */
+	for (chan = 0 ; chan < pima->channels ; chan++)
+	{	pima->block [chan*4]   = pima->samples [chan] & 0xFF ;
+		pima->block [chan*4+1] = (pima->samples [chan] >> 8) & 0xFF ;
+		
+		pima->block [chan*4+2] = pima->stepindex [chan] ;
+		pima->block [chan*4+3] = 0 ;
+		} ;
+		
+	pima->previous  [0] = pima->samples [0] ;
+	pima->previous  [1] = pima->samples [1] ;
+
+	/* Encode the samples as 4 bit. */
+
+	for (k = pima->channels ; k < (pima->samplesperblock * pima->channels) ; k ++)
+	{	chan = (pima->channels > 1) ? (k % 2) : 0 ;
+
+		diff = pima->samples [k] - pima->previous [chan] ;
+
+		bytecode = 0 ;
+		step = ima_step_size [pima->stepindex [chan]] ;
+		vpdiff = step >> 3 ;
+		if (diff < 0) 
+		{	bytecode = 8 ; 
+			diff = -diff ;
+			} ;
+		mask = 4 ;
+		while (mask)
+		{	if (diff >= step)
+			{	bytecode |= mask ;
+				diff -= step ;
+				vpdiff += step ;
+				} ;
+			step >>= 1 ;
+			mask >>= 1 ;
+			} ;
+
+		if (bytecode & 8)
+			pima->previous [chan] -= vpdiff ;
+		else
+			pima->previous [chan] += vpdiff ;
+
+		if (pima->previous [chan] > 32767) 
+			pima->previous [chan] = 32767;
+		else if (pima->previous [chan] < -32768) 
+			pima->previous [chan] = -32768;
+
+		pima->stepindex [chan] += ima_index_adjust [bytecode] ;
+		if (pima->stepindex [chan] < 0)
+			pima->stepindex [chan] = 0 ;
+		else if (pima->stepindex [chan] > 88)
+			pima->stepindex [chan] = 88 ;
+		
+		pima->samples [k] = bytecode ;
+		} ;
+
+	/* Pack the 4 bit encoded samples. */
+
+	blockindex = 4 * pima->channels ;
+	
+	indexstart = pima->channels ;
+	while (blockindex <  pima->blocksize)
+	{	for (chan = 0 ; chan < pima->channels ; chan++)
+		{	index = indexstart + chan ;
+			for (k = 0 ; k < 4 ; k++)
+			{	pima->block [blockindex] = pima->samples [index] & 0x0F ;
+				index += pima->channels ;
+				pima->block [blockindex] |= (pima->samples [index] << 4) & 0xF0 ;
+				index += pima->channels ;
+				blockindex ++ ;
+				} ;
+			} ;
+		indexstart += 8 * pima->channels ;
+		} ;
+		
+	/* Write the block to disk. */
+
+	if ((k = psf_fwrite (pima->block, 1, pima->blocksize, psf->filedes)) != pima->blocksize)
+		psf_log_printf (psf, "*** Warning : short write (%d != %d).\n", k, pima->blocksize) ;
+		
+	memset (pima->samples, 0, pima->samplesperblock * sizeof (short)) ;
+	pima->samplecount = 0 ;
+	pima->blockcount ++ ;
+		
+	return 1 ;
+} /* ima_encode_block */
+
+static int 
+ima_write_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima, short *ptr, sf_count_t len)
+{	int		count, total = 0, index = 0 ;
+	
+	while (index < len)
+	{	count = (pima->samplesperblock - pima->samplecount) * pima->channels ;
+
+		if (count > len - index)
+			count = len - index ;
+
+		memcpy (&(pima->samples [pima->samplecount * pima->channels]), &(ptr [index]), count * sizeof (short)) ;
+		index += count ;
+		pima->samplecount += count / pima->channels ;
+		total = index ;
+
+		if (pima->samplecount >= pima->samplesperblock)
+			ima_encode_block (psf, pima) ;	
+		} ;
+
+	return total ;		
+} /* ima_write_block */
+
+static sf_count_t
+ima_write_s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
+{	IMA_ADPCM_PRIVATE 	*pima ; 
+	int				total ;
+
+	if (! psf->fdata)
+		return 0 ;
+	pima = (IMA_ADPCM_PRIVATE*) psf->fdata ;
+	
+	total = ima_write_block (psf, pima, ptr, len) ;
+
+	return total ;
+} /* ima_write_s */
+
+static sf_count_t	
+ima_write_i  (SF_PRIVATE *psf, int *ptr, sf_count_t len)
+{	IMA_ADPCM_PRIVATE *pima ; 
+	short		*sptr ;
+	int			k, bufferlen, writecount = 0, count ;
+	int			index = 0, total = 0 ;
+
+	if (! psf->fdata)
+		return 0 ;
+	pima = (IMA_ADPCM_PRIVATE*) psf->fdata ;
+	
+	sptr = (short*) psf->buffer ;
+	bufferlen = SF_BUFFER_LEN / sizeof (short) ;
+	while (len > 0)
+	{	writecount = (len >= bufferlen) ? bufferlen : len ;
+		for (k = 0 ; k < writecount ; k++)
+			sptr [k] = ptr [index + k] >> 16 ;
+		count = ima_write_block (psf, pima, sptr, writecount) ;
+		index += writecount ;
+		total += count ;
+		len -= writecount ;
+		} ;
+
+	return total ;
+} /* ima_write_i */
+
+static sf_count_t	
+ima_write_f  (SF_PRIVATE *psf, float *ptr, sf_count_t len)
+{	IMA_ADPCM_PRIVATE *pima ; 
+	short		*sptr ;
+	int			k, bufferlen, writecount = 0, count ;
+	int			index = 0, total = 0 ;
+	float		normfact ;
+
+	if (! psf->fdata)
+		return 0 ;
+	pima = (IMA_ADPCM_PRIVATE*) psf->fdata ;
+	
+	normfact = (psf->norm_float == SF_TRUE) ? ((float) 0x8000) : 1.0 ;
+	
+	sptr = (short*) psf->buffer ;
+	bufferlen = SF_BUFFER_LEN / sizeof (short) ;
+	while (len > 0)
+	{	writecount = (len >= bufferlen) ? bufferlen : len ;
+		for (k = 0 ; k < writecount ; k++)
+			sptr [k] = lrintf (normfact * ptr [index + k])  ;
+		count = ima_write_block (psf, pima, sptr, writecount) ;
+		index += writecount ;
+		total += count ;
+		len -= writecount ;
+		} ;
+	return total ;
+} /* ima_write_f */
+
+static sf_count_t	
+ima_write_d  (SF_PRIVATE *psf, double *ptr, sf_count_t len)
+{	IMA_ADPCM_PRIVATE *pima ; 
+	short		*sptr ;
+	int			k, bufferlen, writecount = 0, count ;
+	int			index = 0, total = 0 ;
+	double 		normfact ;
+	
+	if (! psf->fdata)
+		return 0 ;
+	pima = (IMA_ADPCM_PRIVATE*) psf->fdata ;
+	
+	normfact = (psf->norm_double == SF_TRUE) ? ((double) 0x8000) : 1.0 ;
+
+	sptr = (short*) psf->buffer ;
+	bufferlen = SF_BUFFER_LEN / sizeof (short) ;
+	while (len > 0)
+	{	writecount = (len >= bufferlen) ? bufferlen : len ;
+		for (k = 0 ; k < writecount ; k++)
+			sptr [k] = lrint (normfact * ptr [index + k])  ;
+		count = ima_write_block (psf, pima, sptr, writecount) ;
+		index += writecount ;
+		total += count ;
+		len -= writecount ;
+		} ;
+	return total ;
+} /* ima_write_d */
+
+
--- a/common/libsndfile/src/ircam.c
+++ b/common/libsndfile/src/ircam.c
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2001 Erik de Castro Lopo <[email protected]>
+** Copyright (C) 2001-2002 Erik de Castro Lopo <[email protected]>
 **  
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -16,7 +16,6 @@
 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 */
 
-
 #include	<stdio.h>
 #include	<unistd.h>
 #include	<fcntl.h>
@@ -36,10 +35,15 @@
 ** values of 0x1, 0x2, 0x03 or 0x04. Hence the need for a marker and a mask.
 */
 
-#define IRCAM_02_MARKER	(MAKE_MARKER (0x00, 0x02, 0xA3, 0x64)) 
-#define IRCAM_03_MARKER	(MAKE_MARKER (0x64, 0xA3, 0x03, 0x00)) 
-#define IRCAM_04_MARKER	(MAKE_MARKER (0x64, 0xA3, 0x04, 0x00)) 
+#define IRCAM_BE_MASK		(MAKE_MARKER (0xFF, 0xFF, 0x00, 0xFF)) 
+#define IRCAM_BE_MARKER		(MAKE_MARKER (0x64, 0xA3, 0x00, 0x00)) 
 
+#define IRCAM_LE_MASK		(MAKE_MARKER (0xFF, 0x00, 0xFF, 0xFF)) 
+#define IRCAM_LE_MARKER		(MAKE_MARKER (0x00, 0x00, 0xA3, 0x64)) 
+
+#define IRCAM_02B_MARKER	(MAKE_MARKER (0x00, 0x02, 0xA3, 0x64)) 
+#define IRCAM_03L_MARKER	(MAKE_MARKER (0x64, 0xA3, 0x03, 0x00))
+
 #define IRCAM_DATA_OFFSET	(1024)
 
 /*------------------------------------------------------------------------------
@@ -59,102 +63,146 @@
 ** Private static functions.
 */
 
-static	int		ircam_close		(SF_PRIVATE *psf) ;
-static	int		ircam_write_header (SF_PRIVATE *psf) ;
+static	int		ircam_close			(SF_PRIVATE *psf) ;
+static	int		ircam_write_header	(SF_PRIVATE *psf) ;
+static	int		ircam_read_header	(SF_PRIVATE *psf) ;
 
-static	int		get_encoding (SF_PRIVATE *psf) ;
+static	int		get_encoding (int subformat) ;
 
 static	char*	get_encoding_str (int encoding) ;
 
 /*------------------------------------------------------------------------------
-** Public functions.
+** Public function.
 */
 
 int
-ircam_open_read	(SF_PRIVATE *psf)
-{	unsigned int	marker, encoding ;
-	float			samplerate ;
-	int				error = SFE_NO_ERROR ;
+ircam_open	(SF_PRIVATE *psf)
+{	int		subformat ;
+	int		error = SFE_NO_ERROR ;
 	
-	psf_binheader_readf (psf, "pm", 0, &marker) ;
-	
-	if (marker == IRCAM_03_MARKER)
-	{	psf->endian = SF_ENDIAN_LITTLE ;
+	if (psf->mode == SFM_READ || (psf->mode == SFM_RDWR && psf->filelength > 0))
+	{	if ((error = ircam_read_header (psf)))
+			return error ;
+		} ;
 		
-		if (CPU_IS_LITTLE_ENDIAN)
-			marker = ENDSWAP_INT (marker) ;
-		psf_log_printf (psf, "marker: 0x%X => little endian\n", marker) ;
-
-		psf_binheader_readf (psf, "fll", &samplerate, &(psf->sf.channels), &encoding) ;
+	subformat = psf->sf.format & SF_FORMAT_SUBMASK ;
 		
-		psf->sf.samplerate = (int) samplerate ;
-		psf_log_printf (psf, "  Sample Rate : %d\n", psf->sf.samplerate) ;
-		psf_log_printf (psf, "  Channels    : %d\n", psf->sf.channels) ;
-		psf_log_printf (psf, "  Encoding    : %X => %s\n", encoding, get_encoding_str (encoding)) ;
-		}
-	else if (marker == IRCAM_02_MARKER || marker == IRCAM_04_MARKER)
-	{	psf->endian = SF_ENDIAN_BIG ;
+	if (psf->mode == SFM_WRITE || psf->mode == SFM_RDWR)
+	{	if ((psf->sf.format & SF_FORMAT_TYPEMASK) != SF_FORMAT_IRCAM)
+			return	SFE_BAD_OPEN_FORMAT ;
+			
+		psf->endian = psf->sf.format & SF_FORMAT_ENDMASK ;
+		if (psf->endian == 0 || psf->endian == SF_ENDIAN_CPU)
+			psf->endian = (CPU_IS_BIG_ENDIAN) ? SF_ENDIAN_BIG : SF_ENDIAN_LITTLE ;
+	
+	 	psf->dataoffset  = IRCAM_DATA_OFFSET ;
+	
+		if ((error = ircam_write_header (psf)))
+			return error ;
+	
+		psf->write_header = ircam_write_header ;
+		} ;
 		
-		if (CPU_IS_BIG_ENDIAN)
-			marker = ENDSWAP_INT (marker) ;
-		psf_log_printf (psf, "marker: 0x%X => big endian\n", marker) ;
+	psf->close = ircam_close ;
+	
+	switch (subformat)
+	{	case  SF_FORMAT_ULAW :		/* 8-bit Ulaw encoding. */
+				error = ulaw_init (psf) ;
+				break ;
+	
+		case  SF_FORMAT_ALAW :		/* 8-bit Alaw encoding. */
+				error = alaw_init (psf) ;
+				break ;
+	
+		case  SF_FORMAT_PCM_16 :	/* 16-bit linear PCM. */
+		case  SF_FORMAT_PCM_32 :	/* 32-bit linear PCM. */
+				error = pcm_init (psf) ;
+				break ;
+				
+		case  SF_FORMAT_FLOAT :	/* 32-bit linear PCM. */
+				error = float32_init (psf) ;
+				break ;
+				
+		default :   break ;
+		} ;
+		
+	return error ;
+} /* ircam_open */
 
-		psf_binheader_readf (psf, "FLL", &samplerate, &(psf->sf.channels), &encoding) ;
+/*------------------------------------------------------------------------------
+*/
 
-		psf->sf.samplerate = (int) samplerate ;
-		psf_log_printf (psf, "  Sample Rate : %d\n", psf->sf.samplerate) ;
-		psf_log_printf (psf, "  Channels    : %d\n", psf->sf.channels) ;
-		psf_log_printf (psf, "  Encoding    : %X => %s\n", encoding, get_encoding_str (encoding)) ;
-		}
-	else	
+static int
+ircam_read_header	(SF_PRIVATE *psf)
+{	unsigned int	marker, encoding ;
+	float			samplerate ;
+	int				error = SFE_NO_ERROR ;
+	
+	psf_binheader_readf (psf, "epmf44", 0, &marker, &samplerate, &(psf->sf.channels), &encoding) ;
+	
+	if (((marker & IRCAM_LE_MASK) != IRCAM_LE_MARKER) && 
+		((marker & IRCAM_BE_MASK) != IRCAM_BE_MARKER))
+	{	psf_log_printf (psf, "marker: 0x%X\n", marker) ;	
 		return SFE_IRCAM_NO_MARKER ;
+		} ;
 		
-	/* Sanit checking for endian-ness detection. */
+	psf->endian = SF_ENDIAN_LITTLE ;
+		
 	if (psf->sf.channels > 256)
-		return SFE_IRCAM_BAD_CHANNELS ;
+	{	psf_binheader_readf (psf, "Epmf44", 0, &marker, &samplerate, &(psf->sf.channels), &encoding) ;
+	
+		/* Sanity checking for endian-ness detection. */
+		if (psf->sf.channels > 256)
+		{	psf_log_printf (psf, "marker: 0x%X\n", marker) ;	
+			return SFE_IRCAM_BAD_CHANNELS ;
+			} ;
 
-	psf->sf.sections = 1 ;
-	psf->sf.seekable = SF_TRUE ;
+		psf->endian = SF_ENDIAN_BIG ;
+		} ;
+		
+	psf_log_printf (psf, "marker: 0x%X\n", marker) ;
 
+	psf->sf.samplerate = (int) samplerate ;
+
+	psf_log_printf (psf, "  Sample Rate : %d\n"
+						 "  Channels    : %d\n"
+						 "  Encoding    : %X => %s\n", psf->sf.samplerate, psf->sf.channels, encoding, get_encoding_str (encoding)) ;
+		
 	switch (encoding)
 	{	case  IRCAM_PCM_16 :	
-				psf->sf.pcmbitwidth = 16 ;
-				psf->bytewidth      = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
+				psf->bytewidth  = 2 ;
 				psf->blockwidth = psf->sf.channels * psf->bytewidth ;
 
-				if (psf->endian == SF_ENDIAN_BIG)
-					psf->sf.format = SF_FORMAT_IRCAM | SF_FORMAT_PCM_BE ;
-				else
-					psf->sf.format = SF_FORMAT_IRCAM | SF_FORMAT_PCM_LE ;
-					
-				error = pcm_read_init (psf) ;
+				psf->sf.format = SF_FORMAT_IRCAM | SF_FORMAT_PCM_16 ;
 				break ;
 
 		case IRCAM_PCM_32 :
-				psf->sf.pcmbitwidth = 32 ;
-				psf->bytewidth      = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
+				psf->bytewidth  = 4 ;
 				psf->blockwidth = psf->sf.channels * psf->bytewidth ;
 
-				if (psf->endian == SF_ENDIAN_BIG)
-					psf->sf.format = SF_FORMAT_IRCAM | SF_FORMAT_PCM_BE ;
-				else
-					psf->sf.format = SF_FORMAT_IRCAM | SF_FORMAT_PCM_LE ;
-					
-				error = pcm_read_init (psf) ;
+				psf->sf.format = SF_FORMAT_IRCAM | SF_FORMAT_PCM_32 ;
 				break ;
 	
 		case  IRCAM_FLOAT :
-				psf->sf.pcmbitwidth = 32 ;
-				psf->bytewidth      = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
+				psf->bytewidth  = 4 ;
 				psf->blockwidth = psf->sf.channels * psf->bytewidth ;
 					
-				if (psf->endian == SF_ENDIAN_BIG)
-					psf->sf.format = SF_FORMAT_IRCAM | SF_FORMAT_FLOAT_BE ;
-				else
-					psf->sf.format = SF_FORMAT_IRCAM | SF_FORMAT_FLOAT_LE ;
+				psf->sf.format = SF_FORMAT_IRCAM | SF_FORMAT_FLOAT ;
+				break ;
 					
-				error = float32_read_init (psf) ;
+		case IRCAM_ALAW :
+				psf->bytewidth  = 1 ;
+				psf->blockwidth = psf->sf.channels * psf->bytewidth ;
+					
+				psf->sf.format = SF_FORMAT_IRCAM | SF_FORMAT_ALAW ;
 				break ;
+				
+		case IRCAM_ULAW :
+				psf->bytewidth  = 1 ;
+				psf->blockwidth = psf->sf.channels * psf->bytewidth ;
+					
+				psf->sf.format = SF_FORMAT_IRCAM | SF_FORMAT_ULAW ;
+				break ;
 
 		default : 
 				error = SFE_IRCAM_UNKNOWN_FORMAT ;
@@ -161,6 +209,11 @@
 				break ;
 		} ;
 
+	if (psf->endian == SF_ENDIAN_BIG)
+		psf->sf.format |= SF_ENDIAN_BIG ;
+	else
+		psf->sf.format |= SF_ENDIAN_LITTLE ;
+					
 	if (error)
 		return error ;
 		
@@ -175,62 +228,13 @@
 	psf_binheader_readf (psf, "p", IRCAM_DATA_OFFSET) ;
 
 	return 0 ;
-} /* ircam_open_read */
+} /* ircam_read_header */
 
-/*------------------------------------------------------------------------------
-*/
-
-int
-ircam_open_write	(SF_PRIVATE *psf)
-{	unsigned int	encoding, subformat ;
-	int				error = SFE_NO_ERROR ;
-
-	if ((psf->sf.format & SF_FORMAT_TYPEMASK) != SF_FORMAT_IRCAM)
-		return	SFE_BAD_OPEN_FORMAT ;
-		
-	subformat = psf->sf.format & SF_FORMAT_SUBMASK ;
-
-	if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW)
-		psf->bytewidth = 1 ;
-	else
-		psf->bytewidth = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
-		
-	psf->sf.seekable = SF_TRUE ;
-	psf->error       = 0 ;
-
-	psf->blockwidth  = psf->bytewidth * psf->sf.channels ;
- 	psf->dataoffset  = IRCAM_DATA_OFFSET ;
-	psf->datalength  = psf->blockwidth * psf->sf.samples ;
-	psf->filelength  = psf->datalength + psf->dataoffset ;
-
-	if (! (encoding = ircam_write_header (psf)))
-		return psf->error ;
-
-	psf->close        = (func_close)  ircam_close ;
-	psf->write_header = (func_wr_hdr) ircam_write_header ;
-	
-	switch (encoding)
-	{	case  IRCAM_PCM_16 :	/* 16-bit linear PCM. */
-		case  IRCAM_PCM_32 :	/* 32-bit linear PCM. */
-				error = pcm_write_init (psf) ;
-				break ;
-				
-		case  IRCAM_FLOAT :	/* 32-bit linear PCM. */
-				error = float32_write_init (psf) ;
-				break ;
-				
-		default :   break ;
-		} ;
-		
-	return error ;
-} /* ircam_open_write */
-
-/*------------------------------------------------------------------------------
-*/
-
 static int
 ircam_close	(SF_PRIVATE  *psf)
 {
+	psf_log_printf (psf, "close\n") ;
+	
 	return 0 ;
 } /* ircam_close */
 
@@ -240,78 +244,48 @@
 	float	samplerate ;
 
 	/* This also sets psf->endian. */
-	encoding = get_encoding (psf) ;
+	encoding = get_encoding (psf->sf.format & SF_FORMAT_SUBMASK) ;
 	
 	if (! encoding)
-	{	psf->error = SFE_BAD_OPEN_FORMAT ;
-		return	encoding ;
-		} ;
+		return SFE_BAD_OPEN_FORMAT ;
 
 	/* Reset the current header length to zero. */
 	psf->header [0] = 0 ;
 	psf->headindex = 0 ;
-	fseek (psf->file, 0, SEEK_SET) ;
+	psf_fseek (psf->filedes, 0, SEEK_SET) ;
 	
 	samplerate = psf->sf.samplerate ;
 
 	if (psf->endian == SF_ENDIAN_BIG)
-	{	psf_binheader_writef (psf, "mF", IRCAM_02_MARKER, samplerate) ;
-		psf_binheader_writef (psf, "LL", psf->sf.channels, encoding) ;
+	{	psf_binheader_writef (psf, "Emf", IRCAM_02B_MARKER, samplerate) ;
+		psf_binheader_writef (psf, "E44", psf->sf.channels, encoding) ;
 		}
 	else if  (psf->endian == SF_ENDIAN_LITTLE)
-	{	psf_binheader_writef (psf, "mf", IRCAM_03_MARKER, samplerate) ;
-		psf_binheader_writef (psf, "ll", psf->sf.channels, encoding) ;
+	{	psf_binheader_writef (psf, "emf", IRCAM_03L_MARKER, samplerate) ;
+		psf_binheader_writef (psf, "e44", psf->sf.channels, encoding) ;
 		}
 	else
-	{	psf->error = SFE_BAD_OPEN_FORMAT ;
-		return	encoding ;
-		} ;
+		return SFE_BAD_OPEN_FORMAT ;
 
 	psf_binheader_writef (psf, "z", IRCAM_DATA_OFFSET - psf->headindex) ;
 	
 	/* Header construction complete so write it out. */
-	fwrite (psf->header, psf->headindex, 1, psf->file) ;
+	psf_fwrite (psf->header, psf->headindex, 1, psf->filedes) ;
 
-	return encoding ;
+	return 0 ;
 } /* ircam_write_header */ 
 
 static int
-get_encoding (SF_PRIVATE *psf)
-{	unsigned int format, bitwidth ;
-
-	format = psf->sf.format & SF_FORMAT_SUBMASK ;
-	bitwidth = psf->bytewidth * 8 ;
-
-	/* Default endian-ness is the same as host processor unless overridden. */
-	if (format == SF_FORMAT_PCM_BE || format == SF_FORMAT_FLOAT_BE)
-		psf->endian = SF_ENDIAN_BIG ;
-	else if (format == SF_FORMAT_PCM_LE || format == SF_FORMAT_FLOAT_LE)
-		psf->endian = SF_ENDIAN_LITTLE ;
-	else if (CPU_IS_BIG_ENDIAN)
-		psf->endian = SF_ENDIAN_BIG ;
-	else	
-		psf->endian = SF_ENDIAN_LITTLE ;
-
-	switch (format)
-	{	case SF_FORMAT_ULAW :	return IRCAM_ULAW ;
+get_encoding (int subformat)
+{	switch (subformat)
+	{	case SF_FORMAT_PCM_16 :	return IRCAM_PCM_16 ;
+		case SF_FORMAT_PCM_32 :	return IRCAM_PCM_32 ;
+		
+		case SF_FORMAT_FLOAT :	return IRCAM_FLOAT ;
+					
+		case SF_FORMAT_ULAW :	return IRCAM_ULAW ;
 		case SF_FORMAT_ALAW :	return IRCAM_ALAW ;
 
-		case SF_FORMAT_PCM :
-		case SF_FORMAT_PCM_BE :
-		case SF_FORMAT_PCM_LE :
-				/* For PCM encoding, the header encoding field depends on the bitwidth. */
-				switch (bitwidth)
-				{	case	16 : return IRCAM_PCM_16 ;
-					case	32 : return	IRCAM_PCM_32 ;
-					default : break ;
-					} ;
-				break ;
-
-		case SF_FORMAT_FLOAT :
-		case SF_FORMAT_FLOAT_BE :	
-		case SF_FORMAT_FLOAT_LE :	
-				return IRCAM_FLOAT ;
-					
 		default : break ;
 		} ;
 
--- /dev/null
+++ b/common/libsndfile/src/ms_adpcm.c
@@ -1,0 +1,801 @@
+/*
+** Copyright (C) 1999-2002 Erik de Castro Lopo <[email protected]>
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+** 
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+** 
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include	<stdio.h>
+#include	<unistd.h>
+#include	<string.h>
+
+#include	"sndfile.h"
+#include	"config.h"
+#include	"sfendian.h"
+#include	"float_cast.h"
+#include	"common.h"
+#include	"wav_w64.h"
+
+/* These required here because we write the header in this file. */
+
+#define RIFF_MARKER	(MAKE_MARKER ('R', 'I', 'F', 'F')) 
+#define WAVE_MARKER	(MAKE_MARKER ('W', 'A', 'V', 'E')) 
+#define fmt_MARKER	(MAKE_MARKER ('f', 'm', 't', ' ')) 
+#define fact_MARKER	(MAKE_MARKER ('f', 'a', 'c', 't')) 
+#define data_MARKER	(MAKE_MARKER ('d', 'a', 't', 'a')) 
+
+#define WAVE_FORMAT_MS_ADPCM	0x0002
+
+typedef struct
+{	int				channels, blocksize, samplesperblock, blocks, dataremaining ; 
+	int				blockcount ;
+	sf_count_t			samplecount ;
+	short			*samples ;
+	unsigned char	*block ;
+	unsigned char	dummydata [4] ; /* Dummy size */
+} MSADPCM_PRIVATE ;
+
+/*============================================================================================
+** MS ADPCM static data and functions.
+*/
+
+static int AdaptationTable []    = 
+{	230, 230, 230, 230, 307, 409, 512, 614,
+	768, 614, 512, 409, 307, 230, 230, 230 
+} ;
+
+/* TODO : The first 7 coef's are are always hardcode and must
+   appear in the actual WAVE file.  They should be read in
+   in case a sound program added extras to the list. */
+
+static int AdaptCoeff1 [MSADPCM_ADAPT_COEFF_COUNT] = 
+{	256, 512, 0, 192, 240, 460, 392 
+} ;
+
+static int AdaptCoeff2 [MSADPCM_ADAPT_COEFF_COUNT] = 
+{	0, -256, 0, 64, 0, -208, -232
+} ;
+
+/*============================================================================================
+**	MS ADPCM Block Layout.
+**	======================
+**	Block is usually 256, 512 or 1024 bytes depending on sample rate.
+**	For a mono file, the block is laid out as follows:
+**		byte	purpose
+**		0		block predictor [0..6]
+**		1,2		initial idelta (positive)
+**		3,4		sample 1
+**		5,6		sample 0
+**		7..n	packed bytecodes
+**
+**	For a stereo file, the block is laid out as follows:
+**		byte	purpose
+**		0		block predictor [0..6] for left channel
+**		1		block predictor [0..6] for right channel
+**		2,3		initial idelta (positive) for left channel
+**		4,5		initial idelta (positive) for right channel
+**		6,7		sample 1 for left channel
+**		8,9		sample 1 for right channel
+**		10,11	sample 0 for left channel
+**		12,13	sample 0 for right channel
+**		14..n	packed bytecodes
+*/
+
+/*============================================================================================
+** Static functions.
+*/
+
+static	int	msadpcm_decode_block (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms) ;
+static sf_count_t msadpcm_read_block (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms, short *ptr, sf_count_t len) ;
+
+static	int	msadpcm_encode_block (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms) ;
+static sf_count_t msadpcm_write_block (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms, short *ptr, sf_count_t len) ;
+
+static sf_count_t	msadpcm_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static sf_count_t	msadpcm_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+static sf_count_t	msadpcm_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+static sf_count_t	msadpcm_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
+
+static sf_count_t	msadpcm_write_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static sf_count_t	msadpcm_write_i  (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+static sf_count_t	msadpcm_write_f  (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+static sf_count_t	msadpcm_write_d  (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
+
+static sf_count_t msadpcm_seek   (SF_PRIVATE *psf, int mode, sf_count_t offset) ;
+static	int	msadpcm_close	(SF_PRIVATE  *psf) ;
+
+static	void	choose_predictor (unsigned int channels, short *data, int *bpred, int *idelta) ;
+
+/*============================================================================================
+** MS ADPCM Read Functions.
+*/
+
+int	
+wav_w64_msadpcm_init (SF_PRIVATE *psf, int blockalign, int samplesperblock)
+{	MSADPCM_PRIVATE	*pms ;
+	unsigned int	pmssize ;
+	int				count ;
+
+	if (psf->mode == SFM_WRITE)
+		samplesperblock = 2 + 2 * (blockalign - 7 * psf->sf.channels) / psf->sf.channels ;
+
+	pmssize = sizeof (MSADPCM_PRIVATE) + blockalign + 3 * psf->sf.channels * samplesperblock ;
+
+	if (! (psf->fdata = malloc (pmssize)))
+		return SFE_MALLOC_FAILED ;
+	pms = (MSADPCM_PRIVATE*) psf->fdata ;
+	memset (pms, 0, pmssize) ;
+		
+	pms->block   = (unsigned char*) pms->dummydata ;
+	pms->samples = (short*) (pms->dummydata + blockalign) ;
+		
+	pms->channels        = psf->sf.channels ;
+	pms->blocksize       = blockalign ;
+	pms->samplesperblock = samplesperblock ;
+
+	if (psf->mode == SFM_READ)
+	{	pms->dataremaining	 = psf->datalength ;
+	
+		if (psf->datalength % pms->blocksize)
+			pms->blocks = psf->datalength / pms->blocksize  + 1 ;
+		else
+			pms->blocks = psf->datalength / pms->blocksize ;
+	
+		count = 2 * (pms->blocksize - 6 * pms->channels) / pms->channels ;
+		if (pms->samplesperblock != count)
+			psf_log_printf (psf, "*** Warning : samplesperblock shoud be %d.\n", count) ;
+	
+		psf->sf.samples = (psf->datalength / pms->blocksize) * pms->samplesperblock ;
+	
+		psf_log_printf (psf, " bpred   idelta\n") ;
+	
+		msadpcm_decode_block (psf, pms) ;
+		
+		psf->read_short  = msadpcm_read_s ;
+		psf->read_int    = msadpcm_read_i ;
+		psf->read_float  = msadpcm_read_f ;
+		psf->read_double = msadpcm_read_d ;
+		} ;
+	
+	if (psf->mode == SFM_WRITE)
+	{	pms->samples = (short*) (pms->dummydata + blockalign) ;
+		
+		pms->samplecount = 0 ;
+		
+		psf->write_short  = msadpcm_write_s ;
+		psf->write_int    = msadpcm_write_i ;
+		psf->write_float  = msadpcm_write_f ;
+		psf->write_double = msadpcm_write_d ;
+		} ;
+		
+	psf->new_seek	= msadpcm_seek ;
+	psf->close		= msadpcm_close ;
+
+	return 0 ;
+} /* wav_w64_msadpcm_init */
+
+static int
+msadpcm_decode_block (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms)
+{	int		chan, k, blockindex, sampleindex ;
+	short	bytecode, bpred [2], chan_idelta [2] ;
+	
+    int predict ;
+    int current ;
+    int idelta ;
+
+	pms->blockcount ++ ;
+	pms->samplecount = 0 ;
+	
+	if (pms->blockcount > pms->blocks)
+	{	memset (pms->samples, 0, pms->samplesperblock * pms->channels) ;
+		return 1 ;
+		} ;
+
+	if ((k = psf_fread (pms->block, 1, pms->blocksize, psf->filedes)) != pms->blocksize)
+		psf_log_printf (psf, "*** Warning : short read (%d != %d).\n", k, pms->blocksize) ;
+
+	/* Read and check the block header. */
+	
+	if (pms->channels == 1)
+	{	bpred [0] = pms->block [0] ;
+	
+		if (bpred [0] >= 7)
+			psf_log_printf (psf, "MS ADPCM synchronisation error (%d).\n", bpred [0]) ;
+	
+		chan_idelta [0] = pms->block [1] | (pms->block [2] << 8) ;
+		chan_idelta [1] = 0 ;
+
+		psf_log_printf (psf, "(%d) (%d)\n", bpred [0], chan_idelta [0]) ;
+
+		pms->samples [1] = pms->block [3] | (pms->block [4] << 8) ;
+		pms->samples [0] = pms->block [5] | (pms->block [6] << 8) ;
+		blockindex = 7 ;
+		}
+	else
+	{	bpred [0] = pms->block [0] ;
+		bpred [1] = pms->block [1] ;
+	
+		if (bpred [0] >= 7 || bpred [1] >= 7)
+			psf_log_printf (psf, "MS ADPCM synchronisation error (%d %d).\n", bpred [0], bpred [1]) ;
+	
+		chan_idelta [0] = pms->block [2] | (pms->block [3] << 8) ;
+		chan_idelta [1] = pms->block [4] | (pms->block [5] << 8) ;
+
+		psf_log_printf (psf, "(%d, %d) (%d, %d)\n", bpred [0], bpred [1], chan_idelta [0], chan_idelta [1]) ;
+
+		pms->samples [2] = pms->block [6] | (pms->block [7] << 8) ;
+		pms->samples [3] = pms->block [8] | (pms->block [9] << 8) ;
+
+		pms->samples [0] = pms->block [10] | (pms->block [11] << 8) ;
+		pms->samples [1] = pms->block [12] | (pms->block [13] << 8) ;
+
+		blockindex = 14 ;
+		} ;
+
+    if (chan_idelta [0] & 0x8000) 
+		chan_idelta [0] -= 0x10000 ;
+    if (chan_idelta [1] & 0x8000) 
+		chan_idelta [1] -= 0x10000 ;
+		
+	/* Pull apart the packed 4 bit samples and store them in their
+	** correct sample positions.
+	*/
+	
+	sampleindex = 2 * pms->channels ;
+	while (blockindex <  pms->blocksize)
+	{	bytecode = pms->block [blockindex++] ;
+  		pms->samples [sampleindex++] = (bytecode >> 4) & 0x0F ;
+		pms->samples [sampleindex++] = bytecode & 0x0F ;
+		} ;
+		
+	/* Decode the encoded 4 bit samples. */
+	
+	for (k = 2 * pms->channels ; k < (pms->samplesperblock * pms->channels) ; k ++)
+	{	chan = (pms->channels > 1) ? (k % 2) : 0 ;
+
+		bytecode = pms->samples [k] & 0xF ;
+
+	    /** Compute next Adaptive Scale Factor (ASF) **/
+	    idelta = chan_idelta [chan] ;
+	    chan_idelta [chan] = (AdaptationTable [bytecode] * idelta) >> 8 ; /* => / 256 => FIXED_POINT_ADAPTATION_BASE == 256 */
+	    if (chan_idelta [chan] < 16) 
+			chan_idelta [chan] = 16 ;
+	    if (bytecode & 0x8) 
+			bytecode -= 0x10 ;
+		
+    	predict = ((pms->samples [k - pms->channels] * AdaptCoeff1 [bpred [chan]]) 
+					+ (pms->samples [k - 2 * pms->channels] * AdaptCoeff2 [bpred [chan]])) >> 8 ; /* => / 256 => FIXED_POINT_COEFF_BASE == 256 */
+    	current = (bytecode * idelta) + predict;
+    
+	    if (current > 32767) 
+			current = 32767 ;
+	    else if (current < -32768) 
+			current = -32768 ;
+    
+		pms->samples [k] = current ;
+		} ;
+
+	return 1 ;
+} /* msadpcm_decode_block */
+
+static sf_count_t 
+msadpcm_read_block (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms, short *ptr, sf_count_t len)
+{	sf_count_t	count, total = 0, index = 0 ;
+	
+	while (index < len)
+	{	if (pms->blockcount >= pms->blocks && pms->samplecount >= pms->samplesperblock)
+		{	memset (&(ptr[index]), 0, (size_t) ((len - index) * sizeof (short))) ;
+			return total ;
+			} ;
+		
+		if (pms->samplecount >= pms->samplesperblock)
+			msadpcm_decode_block (psf, pms) ;
+		
+		count = (pms->samplesperblock - pms->samplecount) * pms->channels ;
+		count = (len - index > count) ? count : len - index ;
+		
+		memcpy (&(ptr[index]), &(pms->samples [pms->samplecount * pms->channels]), count * sizeof (short)) ;
+		index += count ;
+		pms->samplecount += count / pms->channels ;
+		total = index ;
+		} ;
+
+	return total ;		
+} /* msadpcm_read_block */
+
+static sf_count_t		
+msadpcm_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
+{	MSADPCM_PRIVATE 	*pms ; 
+	int				total ;
+
+	if (! psf->fdata)
+		return 0 ;
+	pms = (MSADPCM_PRIVATE*) psf->fdata ;
+	
+	total = msadpcm_read_block (psf, pms, ptr, len) ;
+
+	return total ;
+} /* msadpcm_read_s */
+
+static sf_count_t		
+msadpcm_read_i  (SF_PRIVATE *psf, int *ptr, sf_count_t len)
+{	MSADPCM_PRIVATE *pms ; 
+	short		*sptr ;
+	int			k, bufferlen, readcount = 0, count ;
+	int			index = 0, total = 0 ;
+
+	if (! psf->fdata)
+		return 0 ;
+	pms = (MSADPCM_PRIVATE*) psf->fdata ;
+	
+	sptr = (short*) psf->buffer ;
+	bufferlen = SF_BUFFER_LEN / sizeof (short) ;
+	while (len > 0)
+	{	readcount = (len >= bufferlen) ? bufferlen : len ;
+		count = msadpcm_read_block (psf, pms, sptr, readcount) ;
+		for (k = 0 ; k < readcount ; k++)
+			ptr [index + k] = sptr [k] << 16 ;
+		index += readcount ;
+		total += count ;
+		len -= readcount ;
+		} ;
+	return total ;
+} /* msadpcm_read_i */
+
+static sf_count_t
+msadpcm_read_f  (SF_PRIVATE *psf, float *ptr, sf_count_t len)
+{	MSADPCM_PRIVATE *pms ; 
+	short		*sptr ;
+	int			k, bufferlen, readcount = 0, count ;
+	int			index = 0, total = 0 ;
+	float		normfact ;
+
+	if (! psf->fdata)
+		return 0 ;
+	pms = (MSADPCM_PRIVATE*) psf->fdata ;
+	
+	normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ;
+	sptr = (short*) psf->buffer ;
+	bufferlen = SF_BUFFER_LEN / sizeof (short) ;
+	while (len > 0)
+	{	readcount = (len >= bufferlen) ? bufferlen : len ;
+		count = msadpcm_read_block (psf, pms, sptr, readcount) ;
+		for (k = 0 ; k < readcount ; k++)
+			ptr [index + k] = normfact * (float) (sptr [k]) ;
+		index += readcount ;
+		total += count ;
+		len -= readcount ;
+		} ;
+	return total ;
+} /* msadpcm_read_f */
+
+static sf_count_t		
+msadpcm_read_d  (SF_PRIVATE *psf, double *ptr, sf_count_t len)
+{	MSADPCM_PRIVATE *pms ; 
+	short		*sptr ;
+	int			k, bufferlen, readcount = 0, count ;
+	int			index = 0, total = 0 ;
+	double 		normfact ;
+	
+	normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x8000) : 1.0 ;
+
+	if (! psf->fdata)
+		return 0 ;
+	pms = (MSADPCM_PRIVATE*) psf->fdata ;
+	
+	sptr = (short*) psf->buffer ;
+	bufferlen = SF_BUFFER_LEN / sizeof (short) ;
+	while (len > 0)
+	{	readcount = (len >= bufferlen) ? bufferlen : len ;
+		count = msadpcm_read_block (psf, pms, sptr, readcount) ;
+		for (k = 0 ; k < readcount ; k++)
+			ptr [index + k] = normfact * (double) (sptr [k]) ;
+		index += readcount ;
+		total += count ;
+		len -= readcount ;
+		} ;
+	return total ;
+} /* msadpcm_read_d */
+
+static sf_count_t    
+msadpcm_seek   (SF_PRIVATE *psf, int mode, sf_count_t offset)
+{	MSADPCM_PRIVATE *pms ; 
+	int			newblock, newsample ;
+	
+	if (! psf->fdata)
+		return 0 ;
+	pms = (MSADPCM_PRIVATE*) psf->fdata ;
+
+	if (! (psf->datalength && psf->dataoffset))
+	{	psf->error = SFE_BAD_SEEK ;
+		return	((sf_count_t) -1) ;
+		} ;
+
+	if (offset == 0)
+	{	psf_fseek (psf->filedes, psf->dataoffset, SEEK_SET) ;
+		pms->blockcount  = 0 ;
+		msadpcm_decode_block (psf, pms) ;
+		pms->samplecount = 0 ;
+		return 0 ;
+		} ;
+
+	if (offset < 0 || offset > pms->blocks * pms->samplesperblock)
+	{	psf->error = SFE_BAD_SEEK ;
+		return	((sf_count_t) -1) ;
+		} ;
+
+	newblock  = offset / pms->samplesperblock ;
+	newsample = offset % pms->samplesperblock ;
+		
+	if (mode == SFM_READ)
+	{	psf_fseek (psf->filedes, psf->dataoffset + newblock * pms->blocksize, SEEK_SET) ;
+		pms->blockcount  = newblock ;
+		msadpcm_decode_block (psf, pms) ;
+		pms->samplecount = newsample ;
+		}
+	else
+	{	/* What to do about write??? */ 
+		psf->error = SFE_BAD_SEEK ;
+		return	((sf_count_t) -1) ;
+		} ;
+
+	return newblock * pms->samplesperblock + newsample ;
+} /* msadpcm_seek */
+
+/*==========================================================================================
+** MS ADPCM Write Functions.
+*/
+
+void
+msadpcm_write_adapt_coeffs (SF_PRIVATE *psf)
+{	int k ;
+
+	for (k = 0 ; k < MSADPCM_ADAPT_COEFF_COUNT ; k++)
+		psf_binheader_writef (psf, "e22", AdaptCoeff1 [k], AdaptCoeff2 [k]) ;
+} /* msadpcm_write_adapt_coeffs */
+
+/*==========================================================================================
+*/
+
+static int
+msadpcm_encode_block (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms)
+{	unsigned int	blockindex ;
+	unsigned char	byte ;
+	int				chan, k, predict, bpred [2], idelta [2], errordelta, newsamp ;
+	
+	choose_predictor (pms->channels, pms->samples, bpred, idelta) ;
+
+	/* Write the block header. */
+
+	if (pms->channels == 1)
+	{	pms->block [0]	= bpred [0] ;	
+		pms->block [1]	= idelta [0] & 0xFF ;
+		pms->block [2]	= idelta [0] >> 8 ;
+		pms->block [3]	= pms->samples [1] & 0xFF ;
+		pms->block [4]	= pms->samples [1] >> 8 ;
+		pms->block [5]	= pms->samples [0] & 0xFF ;
+		pms->block [6]	= pms->samples [0] >> 8 ;
+
+		blockindex = 7 ;
+		byte = 0 ;
+
+		/* Encode the samples as 4 bit. */
+		
+		for (k = 2 ; k < pms->samplesperblock ; k++)
+		{	predict = (pms->samples [k-1] * AdaptCoeff1 [bpred [0]] + pms->samples [k-2] * AdaptCoeff2 [bpred [0]]) >> 8 ;
+			errordelta = (pms->samples [k] - predict) / idelta [0] ;
+			if (errordelta < -8)
+				errordelta = -8 ;
+			else if (errordelta > 7)
+				errordelta = 7 ;
+			newsamp = predict + (idelta [0] * errordelta) ;
+			if (newsamp > 32767)
+				newsamp = 32767 ;
+			else if (newsamp < -32768)
+				newsamp = -32768 ;
+			if (errordelta < 0)
+				errordelta += 0x10 ;
+				
+			byte = (byte << 4) | (errordelta & 0xF) ;
+			if (k % 2)
+			{	pms->block [blockindex++] = byte ;
+				byte = 0 ;
+				} ;
+
+			idelta [0] = (idelta [0] * AdaptationTable [errordelta]) >> 8 ;
+			if (idelta [0] < 16)
+				idelta [0] = 16 ;
+			pms->samples [k] = newsamp ;
+			} ;
+		}
+	else
+	{	/* Stereo file. */
+		pms->block [0]	= bpred [0] ;	
+		pms->block [1]	= bpred [1] ;	
+
+		pms->block [2]	= idelta [0] & 0xFF ;
+		pms->block [3]	= idelta [0] >> 8 ;
+		pms->block [4]	= idelta [1] & 0xFF ;
+		pms->block [5]	= idelta [1] >> 8 ;
+		
+		pms->block [6]	= pms->samples [2] & 0xFF ;
+		pms->block [7]	= pms->samples [2] >> 8 ;
+		pms->block [8]	= pms->samples [3] & 0xFF ;
+		pms->block [9]	= pms->samples [3] >> 8 ;
+
+		pms->block [10]	= pms->samples [0] & 0xFF ;
+		pms->block [11]	= pms->samples [0] >> 8 ;
+		pms->block [12]	= pms->samples [1] & 0xFF ;
+		pms->block [13]	= pms->samples [1] >> 8 ;
+	
+		blockindex = 14 ;
+		byte = 0 ;
+		chan = 1 ;
+		
+		for (k = 4 ; k < 2 * pms->samplesperblock ; k++)
+		{	chan = k & 1 ;
+
+			predict = (pms->samples [k-2] * AdaptCoeff1 [bpred [chan]] + pms->samples [k-4] * AdaptCoeff2 [bpred [chan]]) >> 8 ;
+			errordelta = (pms->samples [k] - predict) / idelta [chan] ;
+
+
+			if (errordelta < -8)
+				errordelta = -8 ;
+			else if (errordelta > 7)
+				errordelta = 7 ;
+			newsamp = predict + (idelta [chan] * errordelta) ;
+			if (newsamp > 32767)
+				newsamp = 32767 ;
+			else if (newsamp < -32768)
+				newsamp = -32768 ;
+			if (errordelta < 0)
+				errordelta += 0x10 ;
+				
+			byte = (byte << 4) | (errordelta & 0xF) ;
+
+			if (chan)
+			{	pms->block [blockindex++] = byte ;
+				byte = 0 ;
+				} ;
+
+			idelta [chan] = (idelta [chan] * AdaptationTable [errordelta]) >> 8 ;
+			if (idelta [chan] < 16)
+				idelta [chan] = 16 ;
+			pms->samples [k] = newsamp ;
+			} ;
+		} ;
+
+	/* Write the block to disk. */
+
+	if ((k = psf_fwrite (pms->block, 1, pms->blocksize, psf->filedes)) != pms->blocksize)
+		psf_log_printf (psf, "*** Warning : short write (%d != %d).\n", k, pms->blocksize) ;
+		
+	memset (pms->samples, 0, pms->samplesperblock * sizeof (short)) ;
+
+	pms->blockcount ++ ;
+	pms->samplecount = 0 ;
+			
+	return 1 ;
+} /* msadpcm_encode_block */
+
+static sf_count_t 
+msadpcm_write_block (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms, short *ptr, sf_count_t len)
+{	int		count, total = 0, index = 0 ;
+	
+	while (index < len)
+	{	count = (pms->samplesperblock - pms->samplecount) * pms->channels ;
+
+		if (count > len - index)
+			count = len - index ;
+
+		memcpy (&(pms->samples [pms->samplecount * pms->channels]), &(ptr [index]), count * sizeof (short)) ;
+		index += count ;
+		pms->samplecount += count / pms->channels ;
+		total = index ;
+
+		if (pms->samplecount >= pms->samplesperblock)
+			msadpcm_encode_block (psf, pms) ;	
+		} ;
+
+	return total ;		
+} /* msadpcm_write_block */
+
+static sf_count_t		
+msadpcm_write_s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
+{	MSADPCM_PRIVATE *pms ; 
+	int				total ;
+
+	if (! psf->fdata)
+		return 0 ;
+	pms = (MSADPCM_PRIVATE*) psf->fdata ;
+	
+	total = msadpcm_write_block (psf, pms, ptr, len) ;
+
+	return total ;
+} /* msadpcm_write_s */
+
+static sf_count_t		
+msadpcm_write_i  (SF_PRIVATE *psf, int *ptr, sf_count_t len)
+{	MSADPCM_PRIVATE *pms ; 
+	short		*sptr ;
+	int			k, bufferlen, writecount = 0, count ;
+	int			index = 0, total = 0 ;
+
+	if (! psf->fdata)
+		return 0 ;
+	pms = (MSADPCM_PRIVATE*) psf->fdata ;
+	
+	sptr = (short*) psf->buffer ;
+	bufferlen = SF_BUFFER_LEN / sizeof (short) ;
+	while (len > 0)
+	{	writecount = (len >= bufferlen) ? bufferlen : len ;
+		for (k = 0 ; k < writecount ; k++)
+			sptr [k] = ptr [index + k] >> 16 ;
+		count = msadpcm_write_block (psf, pms, sptr, writecount) ;
+		index += writecount ;
+		total += count ;
+		len -= writecount ;
+		} ;
+	return total ;
+} /* msadpcm_write_i */
+
+static sf_count_t
+msadpcm_write_f  (SF_PRIVATE *psf, float *ptr, sf_count_t len)
+{	MSADPCM_PRIVATE *pms ; 
+	short		*sptr ;
+	int			k, bufferlen, writecount = 0, count ;
+	int			index = 0, total = 0 ;
+	float		normfact ;
+	
+	if (! psf->fdata)
+		return 0 ;
+	pms = (MSADPCM_PRIVATE*) psf->fdata ;
+	
+	normfact = (psf->norm_float == SF_TRUE) ? ((float) 0x8000) : 1.0 ;
+	
+	sptr = (short*) psf->buffer ;
+	bufferlen = SF_BUFFER_LEN / sizeof (short) ;
+	while (len > 0)
+	{	writecount = (len >= bufferlen) ? bufferlen : len ;
+		for (k = 0 ; k < writecount ; k++)
+			sptr [k] = lrintf (normfact * ptr [index + k]) ;
+		count = msadpcm_write_block (psf, pms, sptr, writecount) ;
+		index += writecount ;
+		total += count ;
+		len -= writecount ;
+		} ;
+	return total ;
+} /* msadpcm_write_f */
+
+static sf_count_t		
+msadpcm_write_d  (SF_PRIVATE *psf, double *ptr, sf_count_t len)
+{	MSADPCM_PRIVATE *pms ; 
+	short		*sptr ;
+	int			k, bufferlen, writecount = 0, count ;
+	int			index = 0, total = 0 ;
+	double 		normfact ;
+	
+	normfact = (psf->norm_double == SF_TRUE) ? ((double) 0x8000) : 1.0 ;
+
+	if (! psf->fdata)
+		return 0 ;
+	pms = (MSADPCM_PRIVATE*) psf->fdata ;
+	
+	sptr = (short*) psf->buffer ;
+	bufferlen = SF_BUFFER_LEN / sizeof (short) ;
+	while (len > 0)
+	{	writecount = (len >= bufferlen) ? bufferlen : len ;
+		for (k = 0 ; k < writecount ; k++)
+			sptr [k] = lrint (normfact * ptr [index + k]) ;
+		count = msadpcm_write_block (psf, pms, sptr, writecount) ;
+		index += writecount ;
+		total += count ;
+		len -= writecount ;
+		} ;
+	return total ;
+} /* msadpcm_write_d */
+
+/*========================================================================================
+*/
+
+static int	
+msadpcm_close	(SF_PRIVATE  *psf)
+{	MSADPCM_PRIVATE *pms ; 
+
+	if (! psf->fdata)
+		return 0 ;
+
+	pms = (MSADPCM_PRIVATE*) psf->fdata ;
+
+	if (psf->mode == SFM_WRITE)
+	{	/*  Now we know static int for certain the length of the file we can
+		**  re-write the header.
+		*/
+		 
+		if (pms->samplecount && pms->samplecount < pms->samplesperblock)
+			msadpcm_encode_block (psf, pms) ;	
+
+		psf_fseek (psf->filedes, 0, SEEK_END) ;
+		psf->filelength = psf_ftell (psf->filedes) ;
+
+		psf->sf.samples = pms->samplesperblock * pms->blockcount ;
+		psf->datalength = psf->filelength - psf->dataoffset ;
+
+		if (psf->write_header)
+			psf->write_header (psf) ;
+		} ;
+
+	if (psf->fdata)
+		free (psf->fdata) ;
+	psf->fdata = NULL ;
+
+	return 0 ;
+} /* msadpcm_close */
+
+/*========================================================================================
+** Static functions.
+*/
+
+/*----------------------------------------------------------------------------------------
+**	Choosing the block predictor.
+**	Each block requires a predictor and an idelta for each channel. 
+**	The predictor is in the range [0..6] which is an index into the	two AdaptCoeff tables. 
+**	The predictor is chosen by trying all of the possible predictors on a small set of
+**	samples at the beginning of the block. The predictor with the smallest average
+**	abs (idelta) is chosen as the best predictor for this block. 
+**	The value of idelta is chosen to to give a 4 bit code value of +/- 4 (approx. half the 
+**	max. code value). If the average abs (idelta) is zero, the sixth predictor is chosen.
+**	If the value of idelta is less then 16 it is set to 16.
+**
+**	Microsoft uses an IDELTA_COUNT (number of sample pairs used to choose best predictor)
+**	value of 3. The best possible results would be obtained by using all the samples to
+**	choose the predictor.
+*/
+
+#define		IDELTA_COUNT	3
+
+static	void	
+choose_predictor (unsigned int channels, short *data, int *block_pred, int *idelta)
+{	unsigned int	chan, k, bpred, idelta_sum, best_bpred, best_idelta ;
+	
+	for (chan = 0 ; chan < channels; chan++)
+	{	best_bpred = best_idelta = 0 ;
+
+		for (bpred = 0 ; bpred < 7 ; bpred++)
+		{	idelta_sum = 0 ;
+			for (k = 2 ; k < 2 + IDELTA_COUNT ; k++)
+				idelta_sum += abs (data [k*channels] - ((data [(k-1)*channels] * AdaptCoeff1 [bpred] + data [(k-2)*channels] * AdaptCoeff2 [bpred]) >> 8)) ;
+			idelta_sum /= (4 * IDELTA_COUNT) ;
+			
+			if (bpred == 0 || idelta_sum < best_idelta)
+			{	best_bpred = bpred ;
+				best_idelta = idelta_sum ;
+				} ;
+				
+			if (! idelta_sum)
+			{	best_bpred = bpred ;
+				best_idelta = 16 ;
+				break ;
+				} ;
+		
+			} ; /* for bpred ... */
+		if (best_idelta < 16)
+			best_idelta = 16 ;
+	
+		block_pred [chan] = best_bpred ;
+		idelta [chan]     = best_idelta ;
+		} ;
+
+	return ;
+} /* choose_predictor */
--- a/common/libsndfile/src/nist.c
+++ b/common/libsndfile/src/nist.c
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 1999-2001 Erik de Castro Lopo <[email protected]>
+** Copyright (C) 1999-2002 Erik de Castro Lopo <[email protected]>
 **  
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -44,149 +44,221 @@
 */
 
 static	int	nist_close	(SF_PRIVATE *psf) ;
-static	void nist_write_header (SF_PRIVATE  *psf) ;
+static	int nist_write_header	(SF_PRIVATE  *psf) ;
+static  int nist_read_header	(SF_PRIVATE *psf) ;
 
 /*------------------------------------------------------------------------------
 */
 
 int 	
-nist_open_read	(SF_PRIVATE *psf)
-{	char	*psf_header ;
-	int		error ;
+nist_open	(SF_PRIVATE *psf)
+{	int subformat, error ;
+	
+	if (psf->mode == SFM_READ || (psf->mode == SFM_RDWR && psf->filelength > 0))
+	{	if ((error = nist_read_header (psf)))
+			return error ;
+		} ;
 
-	fseek (psf->file, 0, SEEK_SET) ;
+	subformat = psf->sf.format & SF_FORMAT_SUBMASK ;
 	
+	if (psf->mode == SFM_WRITE || psf->mode == SFM_RDWR)
+	{	if ((psf->sf.format & SF_FORMAT_TYPEMASK) != SF_FORMAT_NIST)
+			return	SFE_BAD_OPEN_FORMAT ;
+	
+		psf->endian = psf->sf.format & SF_FORMAT_ENDMASK ;
+		if (psf->endian == 0 || psf->endian == SF_ENDIAN_CPU)
+			psf->endian = (CPU_IS_BIG_ENDIAN) ? SF_ENDIAN_BIG : SF_ENDIAN_LITTLE ;
+	
+		psf->blockwidth  = psf->bytewidth * psf->sf.channels ;
+	
+		if ((error = nist_write_header (psf)))
+			return error ;
+	
+		psf->write_header = nist_write_header ;
+		} ;
+
+	psf->close = nist_close ;
+	
+	switch (psf->sf.format & SF_FORMAT_SUBMASK)
+	{	case SF_FORMAT_PCM_S8 :
+				psf->chars = SF_CHARS_SIGNED ;
+				error = pcm_init (psf) ;
+				break ;
+				
+		case SF_FORMAT_PCM_16 :
+		case SF_FORMAT_PCM_24 :
+		case SF_FORMAT_PCM_32 :
+				error = pcm_init (psf) ;
+				break ;
+				
+		case SF_FORMAT_ULAW :
+				error = ulaw_init (psf) ;
+				break ;
+				
+		case SF_FORMAT_ALAW :
+				error = alaw_init (psf) ;
+				break ;
+				
+		default : error = SFE_UNIMPLEMENTED ;
+				break ;
+		} ;
+
+	return error ;
+} /* nist_open */
+
+/*------------------------------------------------------------------------------
+*/
+
+static int 	
+nist_read_header (SF_PRIVATE *psf)
+{	char	*psf_header ;
+	int		bitwidth = 0, bytes = 0, count, encoding ;
+	char 	str [64], *cptr ;
+	long	samples ;
+	
+		
+	psf->sf.format = SF_FORMAT_NIST ;
+	
 	psf_header = (char*) psf->header ;
+	
+	if (sizeof (psf->header) <= NIST_HEADER_LENGTH)
+		return SFE_INTERNAL ;
+		
+	/* Go to start of file and read in the whole header. */
+	psf_binheader_readf (psf, "pb", 0, psf_header, NIST_HEADER_LENGTH) ;
 
-	fgets (psf_header, SF_HEADER_LEN, psf->file) ;
-	psf_log_printf (psf, psf_header) ;
-	if (strlen (psf_header) != 8 || strcmp (psf_header, "NIST_1A\n"))
-		return SFE_NIST_BAD_HEADER ;
+	/* Header is a string, so make sure it is null terminated. */
+	psf_header [NIST_HEADER_LENGTH] = 0 ;
 	
-	fgets (psf_header, SF_HEADER_LEN, psf->file) ;
+	/* Now trim the header after the end marker. */
+	if ((cptr = strstr (psf_header, "end_head")))
+	{	cptr += strlen ("end_head") + 1 ;
+		cptr [0] = 0 ;
+		} ;
+
 	psf_log_printf (psf, psf_header) ;
-	if (strlen (psf_header) != 8 || atoi (psf_header) != 1024)
-		return SFE_NIST_BAD_HEADER ;
+	
+	/* Make sure its a NIST file. */
+	if (strstr (psf_header, "NIST_1A\n   1024\n") != psf_header)
+	{	printf ("Not a NIST file.\n") ;
+		puts (psf_header) ;
+		exit (1) ;
+		} ;
 
-	while (ftell (psf->file) < 1024 && !ferror (psf->file))
-	{	fgets (psf_header, SF_HEADER_LEN, psf->file) ;
-		psf_log_printf (psf, psf_header) ;
+	/* Determine sample encoding, start by assuming PCM. */		
+	encoding = SF_FORMAT_PCM_U8 ;
+	if ((cptr = strstr (psf_header, "sample_coding -s")))
+	{	sscanf (cptr, "sample_coding -s%d %63s", &count, str) ;
+
+		if (strcmp (str, "pcm") == 0)
+			encoding = SF_FORMAT_PCM_U8 ;
+		else if (strcmp (str, "alaw") == 0)
+			encoding = SF_FORMAT_ALAW ;
+		else if ((strcmp (str, "ulaw") == 0) || (strcmp (str, "mu-law") == 0))
+			encoding = SF_FORMAT_ULAW ;
+		else
+		{	psf_log_printf (psf, "*** Unknown encoding : %s\n", str) ;
+			encoding = 0 ;
+			} ;
+		} ;
+
+	if ((cptr = strstr (psf_header, "channel_count -i ")))
+		sscanf (cptr, "channel_count -i %d", &(psf->sf.channels)) ;
 		
-		if (strstr (psf_header, "channel_count -i ") == psf_header)
-			sscanf (psf_header, "channel_count -i %u", &(psf->sf.channels)) ;
-		
-		if (strstr (psf_header, "sample_count -i ") == psf_header)
-			sscanf (psf_header, "sample_count -i %u", &(psf->sf.samples)) ;
+	if ((cptr = strstr (psf_header, "sample_rate -i ")))
+		sscanf (cptr, "sample_rate -i %d", &(psf->sf.samplerate)) ;
 
-		if (strstr (psf_header, "sample_rate -i ") == psf_header)
-			sscanf (psf_header, "sample_rate -i %u", &(psf->sf.samplerate)) ;
+	if ((cptr = strstr (psf_header, "sample_count -i ")))
+	{	sscanf (psf_header, "sample_count -i %ld", &samples) ;
+		psf->sf.samples = samples ;
+		} ;
 
-		if (strstr (psf_header, "sample_n_bytes -i ") == psf_header)
-			sscanf (psf_header, "sample_n_bytes -i %u", &(psf->bytewidth)) ;
+	if ((cptr = strstr (psf_header, "sample_n_bytes -i ")))
+		sscanf (cptr, "sample_n_bytes -i %d", &(psf->bytewidth)) ;
 
-		if (strstr (psf_header, "sample_sig_bits -i ") == psf_header)
-			sscanf (psf_header, "sample_sig_bits -i %u", &(psf->sf.pcmbitwidth)) ;
+	/* Default endian-ness (for 8 bit, u-law, A-law. */
+	psf->endian = (CPU_IS_BIG_ENDIAN) ? SF_ENDIAN_BIG : SF_ENDIAN_LITTLE ;
 
-		if (strstr (psf_header, "sample_byte_format -s") == psf_header)
-		{	int bytes ;
-			char str [8] = { 0, 0, 0, 0, 0, 0, 0, 0 } ;
-			
-			sscanf (psf_header, "sample_byte_format -s%d %5s", &bytes, str) ;
-			if (bytes < 2 || bytes > 4)
+	/* This is where we figure out endian-ness. */
+	if ((cptr = strstr (psf_header, "sample_byte_format -s")))
+	{	sscanf (cptr, "sample_byte_format -s%d %8s", &bytes, str) ;
+		if (bytes > 1)
+		{	if (psf->bytewidth == 0)
+				psf->bytewidth = bytes ;
+			else if (psf->bytewidth != bytes)
+			{	psf_log_printf (psf, "psf->bytewidth (%d) != bytes (%d)\n", psf->bytewidth, bytes) ;
 				return SFE_NIST_BAD_ENCODING ;
-				
-			psf->bytewidth = bytes ;
-				
+				} ;
+
 			if (strstr (str, "01") == str)
-			{	psf->endian    = SF_ENDIAN_LITTLE ;
-				psf->sf.format = SF_FORMAT_NIST | SF_FORMAT_PCM_LE ;
-				}
+				psf->endian = SF_ENDIAN_LITTLE ;
 			else if (strstr (str, "10"))
-			{	psf->endian    = SF_ENDIAN_BIG ;
-				psf->sf.format = SF_FORMAT_NIST | SF_FORMAT_PCM_BE ;
+				psf->endian = SF_ENDIAN_BIG ;
+			else
+			{	psf_log_printf (psf, "Weird endian-ness : %s\n", str) ;
+				return SFE_NIST_BAD_ENCODING ;
 				} ;
 			} ;
 
-		if (strstr (psf_header, "sample_coding -s") == psf_header)
-			return SFE_NIST_BAD_ENCODING ;
+		psf->sf.format |= psf->endian ;
+		} ;
 
-		if (strstr (psf_header, "end_head") == psf_header)
-			break ;
+	if ((cptr = strstr (psf_header, "sample_sig_bits -i ")))
+		sscanf (cptr, "sample_sig_bits -i %d", &bitwidth) ;
+		
+	if (strstr (psf_header, "channels_interleaved -s5 FALSE"))
+	{	psf_log_printf (psf, "Non-interleaved data unsupported.\n", str) ;
+		return SFE_NIST_BAD_ENCODING ;
 		} ;
 		
  	psf->dataoffset = NIST_HEADER_LENGTH ;
- 	psf->current  = 0 ;
-	psf->sf.seekable = SF_TRUE ;
-	psf->sf.sections = 1 ;
-
-	psf->close = (func_close) nist_close ;
-
 	psf->blockwidth = psf->sf.channels * psf->bytewidth ;
 	psf->datalength = psf->filelength - psf->dataoffset ;
 
-	if ((error = pcm_read_init (psf)))
-		return error ;
+	psf->close = nist_close ;
 
-	fseek (psf->file, psf->dataoffset, SEEK_SET) ;
+	psf_fseek (psf->filedes, psf->dataoffset, SEEK_SET) ;
 
-	return 0 ;
-} /* nist_open_read */
+	if (encoding == SF_FORMAT_PCM_U8)
+	{	switch (psf->bytewidth)
+		{	case 1 :
+					psf->chars = SF_CHARS_SIGNED ;
+					psf->sf.format |= SF_FORMAT_PCM_S8 ;
+					break ;
 
-/*------------------------------------------------------------------------------
-*/
+			case 2 :
+					psf->sf.format |= SF_FORMAT_PCM_16 ;
+					break ;
 
-int 	
-nist_open_write	(SF_PRIVATE *psf)
-{	int subformat, error ;
-	
-	if ((psf->sf.format & SF_FORMAT_TYPEMASK) != SF_FORMAT_NIST)
-		return	SFE_BAD_OPEN_FORMAT ;
+			case 3 :
+					psf->sf.format |= SF_FORMAT_PCM_24 ;
+					break ;
 
-	subformat = psf->sf.format & SF_FORMAT_SUBMASK ;
+			case 4 :
+					psf->sf.format |= SF_FORMAT_PCM_32 ;
+					break ;
 
-	if (subformat == SF_FORMAT_PCM_BE)
-		psf->endian = SF_ENDIAN_BIG ;
-	else if (subformat == SF_FORMAT_PCM_LE)
-		psf->endian = SF_ENDIAN_LITTLE ;
-	else if (CPU_IS_BIG_ENDIAN && subformat == SF_FORMAT_PCM)
-		psf->endian = SF_ENDIAN_BIG ;
-	else if (CPU_IS_LITTLE_ENDIAN && subformat == SF_FORMAT_PCM)
-		psf->endian = SF_ENDIAN_LITTLE ;
+			default : break ;
+			} ;
+		}
+	else if (encoding != 0)
+		psf->sf.format |= encoding ;
 	else
-		return	SFE_BAD_OPEN_FORMAT ;
-		
-	psf->bytewidth = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
-		
-	psf->blockwidth  = psf->bytewidth * psf->sf.channels ;
- 	psf->dataoffset  = NIST_HEADER_LENGTH ;
-	psf->datalength  = psf->blockwidth * psf->sf.samples ;
-	psf->filelength  = psf->datalength + psf->dataoffset ;
-	psf->error       = 0 ;
+		return SFE_UNIMPLEMENTED ;
 
-	if ((error = pcm_write_init (psf)))
-		return error ;
-
-	psf->close        = (func_close)  nist_close ;
-	psf->write_header = (func_wr_hdr) nist_write_header ;
-		
-	nist_write_header (psf) ;
-	
 	return 0 ;
-} /* nist_open_write */
+} /* nist_read_header */
 
-/*------------------------------------------------------------------------------
-*/
-
 static int	
 nist_close	(SF_PRIVATE  *psf)
 {
-	if (psf->mode == SF_MODE_WRITE)
+	if (psf->mode == SFM_WRITE || psf->mode == SFM_RDWR)
 	{	/*  Now we know for certain the length of the file we can
 		**  re-write correct values for the datasize header element.
 		*/
 
-		fseek (psf->file, 0, SEEK_END) ;
-		psf->filelength = ftell (psf->file) ;
+		psf_fseek (psf->filedes, 0, SEEK_END) ;
+		psf->filelength = psf_ftell (psf->filedes) ;
 
 		psf->dataoffset = NIST_HEADER_LENGTH ;
 		psf->datalength = psf->filelength - psf->dataoffset ;
@@ -196,10 +268,6 @@
 		nist_write_header (psf) ;
 		} ;
 
-	if (psf->fdata)
-		free (psf->fdata) ;
-	psf->fdata = NULL ;
-	
 	return 0 ;
 } /* nist_close */
 
@@ -206,9 +274,10 @@
 /*=========================================================================
 */
 
-static void 
+static int
 nist_write_header (SF_PRIVATE  *psf)
 {	char	*end_str ;
+	long	samples ;
 
 	if (psf->endian == SF_ENDIAN_BIG)
 		end_str = "10" ;
@@ -219,56 +288,56 @@
 
 	/* Clear the whole header. */
 	memset (psf->header, 0, sizeof (psf->header)) ;
+	psf->headindex = 0 ;
 		
+	psf_fseek (psf->filedes, 0, SEEK_SET) ;
+
 	psf_asciiheader_printf (psf, "NIST_1A\n   1024\n") ;
 	psf_asciiheader_printf (psf, "channel_count -i %d\n", psf->sf.channels) ;
 	psf_asciiheader_printf (psf, "sample_rate -i %d\n", psf->sf.samplerate) ;
-	psf_asciiheader_printf (psf, "sample_n_bytes -i %d\n", psf->bytewidth) ;
-	psf_asciiheader_printf (psf, "sample_byte_format -s%d %s\n", psf->bytewidth, end_str) ;
-	psf_asciiheader_printf (psf, "sample_sig_bits -i %d\n", psf->sf.pcmbitwidth) ;
-	psf_asciiheader_printf (psf, "sample_count -i %d\n", psf->sf.samples) ;
-	psf_asciiheader_printf (psf, "end_head\n") ;
 
-	fseek (psf->file, 0, SEEK_SET) ;
+	switch (psf->sf.format & SF_FORMAT_SUBMASK)
+	{	case SF_FORMAT_PCM_S8 :
+				psf_asciiheader_printf (psf, "sample_coding -s3 pcm\n") ;
+				psf_asciiheader_printf (psf, "sample_n_bytes -i 1\n"
+											"sample_sig_bits -i 8\n") ;
+				break ;
 
+		case SF_FORMAT_PCM_16 :
+		case SF_FORMAT_PCM_24 :
+		case SF_FORMAT_PCM_32 :
+				psf_asciiheader_printf (psf, "sample_n_bytes -i %d\n", psf->bytewidth) ;
+				psf_asciiheader_printf (psf, "sample_sig_bits -i %d\n", psf->bytewidth * 8) ;
+				psf_asciiheader_printf (psf, "sample_coding -s3 pcm\n"
+								"sample_byte_format -s%d %s\n", psf->bytewidth, end_str) ;
+				break ;
+	
+		case SF_FORMAT_ALAW :
+				psf_asciiheader_printf (psf, "sample_coding -s4 alaw\n") ;
+				psf_asciiheader_printf (psf, "sample_n_bytes -s1 1\n") ;
+				break ;
+	
+		case SF_FORMAT_ULAW :
+				psf_asciiheader_printf (psf, "sample_coding -s4 ulaw\n") ;
+				psf_asciiheader_printf (psf, "sample_n_bytes -s1 1\n") ;
+				break ;
+				
+		default : return SFE_UNIMPLEMENTED ;
+		} ;
+	
+	psf->dataoffset = NIST_HEADER_LENGTH ;
+	
+	/* Fix this */
+	samples = psf->sf.samples ;
+	psf_asciiheader_printf (psf, "sample_count -i %ld\n", samples) ;
+	psf_asciiheader_printf (psf, "end_head\n") ;
+
 	/* Zero fill to dataoffset. */
 	psf_binheader_writef (psf, "z", NIST_HEADER_LENGTH - psf->headindex) ;
 
-	fwrite (psf->header, psf->headindex, 1, psf->file) ;
+	psf_fwrite (psf->header, psf->headindex, 1, psf->filedes) ;
 
-	return ;		
+	return 0 ;		
 } /* nist_write_header */
 
-/*-
 
-These were used to parse the sample_byte_format field but were discarded in favour
-os a simpler method using strstr ().
-
-static  
-int strictly_ascending (char *str)
-{	int  k ;
-
-	if (strlen (str) < 2)
-		return 0 ;
-
-	for (k = 1 ; str [k] ; k++) 
-		if (str [k] != str [k-1] + 1)
-			return 0 ;
-	
-	return 1 ;
-} /+* strictly_ascending *+/
-
-static  int strictly_descending (char *str)
-{	int  k ;
-
-	if (strlen (str) < 2)
-		return 0 ;
-
-	for (k = 1 ; str [k] ; k++) 
-		if (str [k] + 1 != str [k-1])
-			return 0 ;
-	
-	return 1 ;
-} /+* strictly_descending *+/
-
--*/
--- a/common/libsndfile/src/paf.c
+++ b/common/libsndfile/src/paf.c
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 1999-2001 Erik de Castro Lopo <[email protected]>
+** Copyright (C) 1999-2002 Erik de Castro Lopo <[email protected]>
 **  
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -16,7 +16,6 @@
 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 */
 
-
 #include	<stdio.h>
 #include	<unistd.h>
 #include	<fcntl.h>
@@ -23,10 +22,10 @@
 #include	<string.h>
 #include	<ctype.h>
 
-#include	"config.h"
 #include	"sndfile.h"
+#include	"config.h"
 #include	"sfendian.h"
-#include	"floatcast.h"
+#include	"float_cast.h"
 #include	"common.h"
 
 /*------------------------------------------------------------------------------
@@ -40,25 +39,30 @@
 ** Other defines.
 */
 
-#define	PAF_HEADER_LENGTH 	2048
+#define	PAF_HEADER_LENGTH 			2048
 
+#define	PAF24_SAMPLES_PER_BLOCK		10
+#define	PAF24_BLOCK_SIZE			32
+
 /*------------------------------------------------------------------------------
 ** Typedefs.
 */
 
 typedef	struct
-{	unsigned int	version ;
-	unsigned int	endianness ;
-    unsigned int	samplerate ;
-    unsigned int	format ;
-	unsigned int	channels ;
-	unsigned int	source ;
+{	int	version ;
+	int	endianness ;
+    int	samplerate ;
+    int	format ;
+	int	channels ;
+	int	source ;
 } PAF_FMT ;
 
 typedef struct
-{	unsigned int	index, blocks, channels, samplesperblock, blockcount, blocksize, samplecount ;
-	unsigned char	*block ;
+{	int				max_blocks, channels, samplesperblock, blocksize ;
+	int				read_block, write_block, read_count, write_count ;
+	sf_count_t		sample_count ;
 	int				*samples ;
+	unsigned char	*block ;
 	unsigned char	data [1] ; /* Data size fixed during malloc (). */
 } PAF24_PRIVATE ;
 
@@ -66,49 +70,103 @@
 ** Private static functions.
 */
 
-static int paf24_reader_init (SF_PRIVATE  *psf) ;
-static int paf24_writer_init (SF_PRIVATE  *psf) ;
+static int paf24_init (SF_PRIVATE  *psf) ;
 
-static int paf24_read_block (SF_PRIVATE  *psf, PAF24_PRIVATE *ppaf24) ;
-	
-static int paf24_close (SF_PRIVATE  *psf) ;
+static int	paf_read_header	(SF_PRIVATE *psf) ;
+static int	paf_write_header (SF_PRIVATE  *psf) ;
 
-static int paf24_read_s (SF_PRIVATE *psf, short *ptr, int len) ;
-static int paf24_read_i (SF_PRIVATE *psf, int *ptr, int len) ;
-static int paf24_read_f (SF_PRIVATE *psf, float *ptr, int len) ;
-static int paf24_read_d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+static sf_count_t paf24_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static sf_count_t paf24_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+static sf_count_t paf24_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+static sf_count_t paf24_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
 
-static int paf24_write_s (SF_PRIVATE *psf, short *ptr, int len) ;
-static int paf24_write_i (SF_PRIVATE *psf, int *ptr, int len) ;
-static int paf24_write_f (SF_PRIVATE *psf, float *ptr, int len) ;
-static int paf24_write_d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+static sf_count_t paf24_write_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static sf_count_t paf24_write_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+static sf_count_t paf24_write_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+static sf_count_t paf24_write_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
 
-static long paf24_seek (SF_PRIVATE *psf, long offset, int whence) ;
+static sf_count_t paf24_seek (SF_PRIVATE *psf, int mode, sf_count_t offset) ;
 
-/*
-static void	endswap_paf_fmt (PAF_FMT *ppaf_fmt) ;
-*/
+enum
+{	PAF_PCM_16 = 0,
+	PAF_PCM_24 = 1,
+	PAF_PCM_S8 = 2
+} ;
 
 /*------------------------------------------------------------------------------
-** Public functions.
+** Public function.
 */
 
 int
-paf_open_read	(SF_PRIVATE *psf)
-{	PAF_FMT			paf_fmt ;
-	unsigned int	marker ;
-	int				error ;
+paf_open	(SF_PRIVATE *psf)
+{	int		subformat, error, endian ;
+
+ 	psf->dataoffset = PAF_HEADER_LENGTH ;
+
+	if (psf->mode == SFM_READ || (psf->mode == SFM_RDWR && psf->filelength > 0))	
+	{	if ((error = paf_read_header (psf)))
+			return error ;
+		} ;
+		
+	subformat = psf->sf.format & SF_FORMAT_SUBMASK ;
+
+	if (psf->mode == SFM_WRITE || psf->mode == SFM_RDWR 
+		/*- || (psf->mode == SFM_RDWR && psf->filelength <= 0)-*/)
+	{	if ((psf->sf.format & SF_FORMAT_TYPEMASK) != SF_FORMAT_PAF)
+			return	SFE_BAD_OPEN_FORMAT ;
+
+		endian = psf->sf.format & SF_FORMAT_ENDMASK ;
+
+		/* PAF is by default big endian. */
+		psf->endian = SF_ENDIAN_BIG ;
 	
+		if (endian == SF_ENDIAN_LITTLE || (CPU_IS_LITTLE_ENDIAN && (endian == SF_ENDIAN_CPU)))
+			psf->endian = SF_ENDIAN_LITTLE ;
+
+		if ((error = paf_write_header (psf)))
+			return error ;
+		} ;
+
+	switch (subformat)
+	{	case  SF_FORMAT_PCM_S8 : 	
+					psf->chars = SF_CHARS_SIGNED ;
+					psf->bytewidth = 1 ;
+					error = pcm_init (psf) ;
+					break ;
+
+		case  SF_FORMAT_PCM_16 : 	
+					psf->bytewidth = 2 ;
+					error = pcm_init (psf) ;
+					break ;
+
+		case  SF_FORMAT_PCM_24 :	
+					error = paf24_init (psf) ;
+					break ;
+	
+		default : return SFE_PAF_UNKNOWN_FORMAT ;
+		} ;
+
+	return error ;
+} /* paf_open */
+
+/*------------------------------------------------------------------------------
+*/
+
+static int
+paf_read_header	(SF_PRIVATE *psf)
+{	PAF_FMT		paf_fmt ;
+	int			marker ;
+	
 	psf_binheader_readf (psf, "pm", 0, &marker) ;
 	
-	psf_log_printf (psf, "Signature   : %D\n", marker) ;
+	psf_log_printf (psf, "Signature   : '%D'\n", marker) ;
 
 	if (marker == PAF_MARKER)
-	{	psf_binheader_readf (psf, "LLLLLL", &(paf_fmt.version), &(paf_fmt.endianness), 
+	{	psf_binheader_readf (psf, "E444444", &(paf_fmt.version), &(paf_fmt.endianness), 
 			&(paf_fmt.samplerate), &(paf_fmt.format), &(paf_fmt.channels), &(paf_fmt.source)) ;
 		}
 	else if (marker == FAP_MARKER)
-	{	psf_binheader_readf (psf, "llllll", &(paf_fmt.version), &(paf_fmt.endianness), 
+	{	psf_binheader_readf (psf, "e444444", &(paf_fmt.version), &(paf_fmt.endianness), 
 			&(paf_fmt.samplerate), &(paf_fmt.format), &(paf_fmt.channels), &(paf_fmt.source)) ;
 		}
 	else
@@ -115,28 +173,31 @@
 		return SFE_PAF_NO_MARKER ;
 		
 	psf_log_printf (psf, "Version     : %d\n", paf_fmt.version) ;
+
 	if (paf_fmt.version != 0)
 	{	psf_log_printf (psf, "*** Bad version number. should be zero.\n") ;
 		return SFE_PAF_VERSION ;
 		} ;
 		
+	psf_log_printf (psf, "Sample Rate : %d\n", paf_fmt.samplerate) ;
+	psf_log_printf (psf, "Channels    : %d\n", paf_fmt.channels) ;
+
 	psf_log_printf (psf, "Endianness  : %d => ", paf_fmt.endianness) ;
 	if (paf_fmt.endianness)
-		psf_log_printf (psf, "Little\n", paf_fmt.endianness) ;
+	{	psf_log_printf (psf, "Little\n", paf_fmt.endianness) ;
+		psf->endian = SF_ENDIAN_LITTLE ;
+		}
 	else
-		psf_log_printf (psf, "Big\n", paf_fmt.endianness) ;
-	psf_log_printf (psf, "Sample Rate : %d\n", paf_fmt.samplerate) ;
+	{	psf_log_printf (psf, "Big\n", paf_fmt.endianness) ;
+		psf->endian = SF_ENDIAN_BIG ;
+		} ;
 
 	if (psf->filelength < PAF_HEADER_LENGTH)
 		return SFE_PAF_SHORT_HEADER ;
 		
- 	psf->dataoffset = PAF_HEADER_LENGTH ;
 	psf->datalength = psf->filelength - psf->dataoffset ;
 
- 	psf->current  = 0 ;
-	psf->endian   = paf_fmt.endianness ? SF_ENDIAN_LITTLE : SF_ENDIAN_BIG ;
-
-	psf_binheader_readf (psf, "p", psf->dataoffset) ;
+	psf_binheader_readf (psf, "p", (int) psf->dataoffset) ;
 	
 	psf->sf.samplerate	= paf_fmt.samplerate ;
 	psf->sf.channels 	= paf_fmt.channels ;
@@ -144,53 +205,42 @@
 	/* Only fill in type major. */
 	psf->sf.format = SF_FORMAT_PAF ;
 
-	psf->sf.sections 	= 1 ;
-
 	psf_log_printf (psf, "Format      : %d => ", paf_fmt.format) ;
+	
+	/* PAF is by default big endian. */
+	psf->sf.format |= paf_fmt.endianness ? SF_ENDIAN_LITTLE : SF_ENDIAN_BIG ;
 
 	switch (paf_fmt.format)
-	{	case  0 :	psf_log_printf (psf, "16 bit linear PCM\n") ;
-					psf->sf.pcmbitwidth = 16 ;
-					psf->bytewidth      = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
+	{	case  PAF_PCM_S8 :	
+					psf_log_printf (psf, "8 bit linear PCM\n") ;
+					psf->bytewidth = 1 ;
 
-					psf->sf.format |= paf_fmt.endianness ? SF_FORMAT_PCM_LE : SF_FORMAT_PCM_BE ; ;
+					psf->sf.format |= SF_FORMAT_PCM_S8 ;
+					psf->chars = SF_CHARS_SIGNED ;
 					
-					if ((error = pcm_read_init (psf)))
-						return error ;
-
 					psf->blockwidth = psf->bytewidth * psf->sf.channels ;
+					psf->sf.samples = psf->datalength / psf->blockwidth ;
+					break ;
+		
+		case  PAF_PCM_16 :	
+					psf_log_printf (psf, "16 bit linear PCM\n") ;
+					psf->bytewidth   = 2 ;
 
-	psf_log_printf (psf, "X blockwidth : %d\n", psf->blockwidth) ;
-
-					if (psf->blockwidth)
-						psf->sf.samples = psf->datalength / psf->blockwidth ;
-					else
-						psf_log_printf (psf, "*** Warning : blockwidth == 0.\n") ;
+					psf->sf.format |= SF_FORMAT_PCM_16 ;
 					
-	psf_log_printf (psf, "X samples : %d\n", psf->sf.samples) ;
+					psf->blockwidth = psf->bytewidth * psf->sf.channels ;
+					psf->sf.samples = psf->datalength / psf->blockwidth ;
 					break ;
 
-		case  1 :	psf_log_printf (psf, "24 bit linear PCM\n") ;
-					psf->sf.pcmbitwidth = 24 ;
-					psf->bytewidth      = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
+		case  PAF_PCM_24 :	
+					psf_log_printf (psf, "24 bit linear PCM\n") ;
+					psf->bytewidth   = 3 ;
 
-					psf->sf.format |= paf_fmt.endianness ? SF_FORMAT_PCM_LE : SF_FORMAT_PCM_BE ; ;
+					psf->sf.format |= SF_FORMAT_PCM_24 ;
 					
-					psf->read_short  = (func_short)  paf24_read_s ;
-					psf->read_int    = (func_int)    paf24_read_i ;
-					psf->read_float  = (func_float) paf24_read_f ;
-					psf->read_double = (func_double) paf24_read_d ;
-
-					if ((error = paf24_reader_init (psf)))
-						return error ;
-
-					psf->seek_func = (func_seek) paf24_seek ;
-					psf->close = (func_close) paf24_close ;
-
-					psf->blockwidth = psf->bytewidth * psf->sf.channels ;
-	psf_log_printf (psf, "X blockwidth : %d\n", psf->blockwidth) ;
-					psf->sf.samples = 10 * psf->datalength / (32 * psf->sf.channels) ;
-	psf_log_printf (psf, "X samples : %d\n", psf->sf.samples) ;
+					psf->blockwidth = 0 ;
+					psf->sf.samples = PAF24_SAMPLES_PER_BLOCK * psf->datalength / 
+											(PAF24_BLOCK_SIZE * psf->sf.channels) ;
 					break ;
 		
 		default :   psf_log_printf (psf, "Unknown\n") ;
@@ -198,7 +248,6 @@
 					break ;
 		} ;
 
-	psf_log_printf (psf, "Channels    : %d\n", paf_fmt.channels) ;
 	psf_log_printf (psf, "Source      : %d => ", paf_fmt.source) ;
 	
 	switch (paf_fmt.source)
@@ -215,98 +264,53 @@
 		} ;
 
 	return 0 ;
-} /* paf_open_read */
+} /* paf_read_header */
 
-/*------------------------------------------------------------------------------
-*/
+static int
+paf_write_header (SF_PRIVATE  *psf)
+{	int			paf_format ;
 
-int
-paf_open_write	(SF_PRIVATE *psf)
-{	PAF_FMT			paf_fmt ;
-	int				subformat, error, paf_format ;
-	
-	if ((psf->sf.format & SF_FORMAT_TYPEMASK) != SF_FORMAT_PAF)
-		return	SFE_BAD_OPEN_FORMAT ;
+	switch (psf->sf.format & SF_FORMAT_SUBMASK)
+	{	case  SF_FORMAT_PCM_S8 : 	
+					paf_format = PAF_PCM_S8 ;
+					break ;
 
-	subformat = psf->sf.format & SF_FORMAT_SUBMASK ;
-
-	if (subformat == SF_FORMAT_PCM_BE)
-		psf->endian = SF_ENDIAN_BIG ;
-	else if (subformat == SF_FORMAT_PCM_LE)
-		psf->endian = SF_ENDIAN_LITTLE ;
-	else if (CPU_IS_BIG_ENDIAN && subformat == SF_FORMAT_PCM)
-		psf->endian = SF_ENDIAN_BIG ;
-	else if (CPU_IS_LITTLE_ENDIAN && subformat == SF_FORMAT_PCM)
-		psf->endian = SF_ENDIAN_LITTLE ;
-	else
-		return	SFE_BAD_OPEN_FORMAT ;
-		
-	psf->bytewidth = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
-
-	psf->blockwidth  = psf->bytewidth * psf->sf.channels ;
- 	psf->dataoffset  = PAF_HEADER_LENGTH ;
-	psf->datalength  = psf->blockwidth * psf->sf.samples ;
-	psf->filelength  = psf->datalength + psf->dataoffset ;
-	psf->error       = 0 ;
-
-	switch (psf->sf.pcmbitwidth)
-	{	case  16 : 	paf_format = 0 ;
-					psf->bytewidth = 2 ;
+		case  SF_FORMAT_PCM_16 : 	
+					paf_format = PAF_PCM_16 ;
 					break ;
 
-		case  24 :	paf_format = 1 ;
-					psf->bytewidth = 3 ;
+		case  SF_FORMAT_PCM_24 :	
+					paf_format = PAF_PCM_24 ;
 					break ;
 	
 		default : return SFE_PAF_UNKNOWN_FORMAT ;
 		} ;
-		
-	switch (paf_format)
-	{	case  0 :	/* 16-bit linear PCM. */
-					if ((error = pcm_write_init (psf)))
-						return error ;
-					break ;
 
-		case  1 :	/* 24-bit linear PCM */
-					psf->write_short  = (func_short)  paf24_write_s ;
-					psf->write_int    = (func_int)    paf24_write_i ;
-					psf->write_float  = (func_float)  paf24_write_f ;
-					psf->write_double = (func_double) paf24_write_d ;
-					
-					if ((error = paf24_writer_init (psf)))
-						return error ;
-					
-					psf->seek_func = (func_seek) paf24_seek ;
-					psf->close = (func_close) paf24_close ;
-					break ;
-
-		default :   break ;
-		} ;
-	
 	/* Reset the current header length to zero. */
 	psf->header [0] = 0 ;
 	psf->headindex = 0 ;
+	psf_fseek (psf->filedes, 0, SEEK_SET) ;
 	
 	if (psf->endian == SF_ENDIAN_BIG)
 	{	/* Marker, version, endianness, samplerate */
-		psf_binheader_writef (psf, "mLLL", PAF_MARKER, 0, 0, psf->sf.samplerate) ;
+		psf_binheader_writef (psf, "Em444", PAF_MARKER, 0, 0, psf->sf.samplerate) ;
 		/* format, channels, source */
-		psf_binheader_writef (psf, "LLL", paf_format, psf->sf.channels, paf_fmt.source) ;	
+		psf_binheader_writef (psf, "E444", paf_format, psf->sf.channels, 0) ;	
 		}
 	else if (psf->endian == SF_ENDIAN_LITTLE)
 	{	/* Marker, version, endianness, samplerate */
-		psf_binheader_writef (psf, "mlll", FAP_MARKER, 0, 1, psf->sf.samplerate) ;
+		psf_binheader_writef (psf, "em444", FAP_MARKER, 0, 1, psf->sf.samplerate) ;
 		/* format, channels, source */
-		psf_binheader_writef (psf, "lll", paf_format, psf->sf.channels, 0) ;
+		psf_binheader_writef (psf, "e444", paf_format, psf->sf.channels, 0) ;
 		} ;
 
 	/* Zero fill to dataoffset. */
-	psf_binheader_writef (psf, "z", psf->dataoffset - psf->headindex) ;
+	psf_binheader_writef (psf, "z", (int) (psf->dataoffset - psf->headindex)) ;
 
-	fwrite (psf->header, psf->headindex, 1, psf->file) ;
+	psf_fwrite (psf->header, psf->headindex, 1, psf->filedes) ;
 
 	return 0 ;
-} /* paf_open_write */
+} /* paf_write_header */
 
 /*===============================================================================
 **	24 bit PAF files have a really weird encoding. 
@@ -314,7 +318,7 @@
 **	block. The 8 ints in this 32 byte block are then endian swapped (as ints) 
 **	if necessary before being written to disk.
 **  For a stereo file, blocks of 10 samples from the same channel are encoded 
-**  into 32 bytes as fro the mono case. The 32 block bytes are then interleaved 
+**  into 32 bytes as for the mono case. The 32 byte blocks are then interleaved 
 **	on disk.
 **	Reading has to reverse the above process :-).
 **	Weird!!!
@@ -322,49 +326,162 @@
 **	The code below attempts to gain efficiency while maintaining readability.
 */
 
+static int paf24_read_block (SF_PRIVATE  *psf, PAF24_PRIVATE *ppaf24) ;
+static int paf24_write_block (SF_PRIVATE  *psf, PAF24_PRIVATE *ppaf24) ;
+static int paf24_close (SF_PRIVATE  *psf) ;
+
+
 static int 
-paf24_reader_init (SF_PRIVATE  *psf)
-{	PAF24_PRIVATE	*ppaf24 ; 
-	unsigned int	paf24size ;	
+paf24_init (SF_PRIVATE  *psf)
+{	PAF24_PRIVATE	*ppaf24 ; 	
+	int	paf24size, max_blocks ;	
 	
-	paf24size = sizeof (PAF24_PRIVATE) + psf->sf.channels * (32 + 10 * sizeof (int)) ;
+	paf24size = sizeof (PAF24_PRIVATE) + psf->sf.channels * 
+					(PAF24_BLOCK_SIZE + PAF24_SAMPLES_PER_BLOCK * sizeof (int)) ;
+					
 	if (! (psf->fdata = malloc (paf24size)))
 		return SFE_MALLOC_FAILED ;
-		
+
 	ppaf24 = (PAF24_PRIVATE*) psf->fdata ;
 	memset (ppaf24, 0, paf24size) ;
 	
 	ppaf24->channels = psf->sf.channels ;
 	ppaf24->block    = (unsigned char*) ppaf24->data ;
-	ppaf24->samples  = (int*) (ppaf24->data + 32 * ppaf24->channels) ;
+	ppaf24->samples  = (int*) (ppaf24->data + PAF24_BLOCK_SIZE * ppaf24->channels) ;
 	
-	ppaf24->blocksize = 32 * ppaf24->channels ;
-	ppaf24->samplesperblock = 10 ;
+	ppaf24->blocksize = PAF24_BLOCK_SIZE * ppaf24->channels ;
+	ppaf24->samplesperblock = PAF24_SAMPLES_PER_BLOCK ;
 	
-	if (psf->datalength % ppaf24->blocksize)
-	{	psf_log_printf (psf, "*** Warning : file seems to be truncated.\n") ;
-		ppaf24->blocks = psf->datalength / ppaf24->blocksize  + 1 ;
+	if (psf->mode == SFM_READ || psf->mode == SFM_RDWR)
+	{	paf24_read_block (psf, ppaf24) ;	/* Read first block. */
+	
+		psf->read_short  = paf24_read_s ;
+		psf->read_int    = paf24_read_i ;
+		psf->read_float  = paf24_read_f ;
+		psf->read_double = paf24_read_d ;
+		} ;
+
+	if (psf->mode == SFM_WRITE || psf->mode == SFM_RDWR)
+	{	psf->write_short  = paf24_write_s ;
+		psf->write_int    = paf24_write_i ;
+		psf->write_float  = paf24_write_f ;
+		psf->write_double = paf24_write_d ;
+		} ;
+
+	psf->new_seek 	= paf24_seek ;
+	psf->close     	= paf24_close ;
+
+	psf->filelength = psf_get_filelen (psf->filedes) ;
+	psf->datalength = psf->filelength - psf->dataoffset ;
+
+	if (psf->datalength % PAF24_BLOCK_SIZE)
+	{	if (psf->mode == SFM_READ)
+			psf_log_printf (psf, "*** Warning : file seems to be truncated.\n") ;
+		max_blocks = psf->datalength / ppaf24->blocksize  + 1 ;
 		}
 	else
-		ppaf24->blocks = psf->datalength / ppaf24->blocksize ;
+		max_blocks = psf->datalength / ppaf24->blocksize ;
+	
+	ppaf24->read_block = 0 ;
+	if (psf->mode == SFM_RDWR)
+		ppaf24->write_block = max_blocks ;
+	else
+		ppaf24->write_block = 0 ;
 		
-	psf->sf.samples = ppaf24->samplesperblock * ppaf24->blocks ;
+	psf->sf.samples = ppaf24->samplesperblock * max_blocks ;
+	ppaf24->sample_count = psf->sf.samples ;
 
-	paf24_read_block (psf, ppaf24) ;	/* Read first block. */
-	
 	return 0 ;
-} /* paf24_reader_init */
+} /* paf24_init */
 
+static sf_count_t 
+paf24_seek (SF_PRIVATE *psf, int mode, sf_count_t offset)
+{	PAF24_PRIVATE	*ppaf24 ; 
+	int				newblock, newsample ;
 
+	if (! psf->fdata)
+	{	psf->error = SFE_INTERNAL ;
+		return	((sf_count_t) -1) ;
+		} ;
+		
+	ppaf24 = (PAF24_PRIVATE*) psf->fdata ;
+	
+	if (mode == SFM_READ && ppaf24->write_count > 0)
+		paf24_write_block (psf, ppaf24) ;
+
+	newblock  = offset / ppaf24->samplesperblock ;
+	newsample = offset % ppaf24->samplesperblock ;
+		
+	switch (mode)
+	{	case SFM_READ :
+				if (offset > ppaf24->read_block * ppaf24->samplesperblock + ppaf24->read_count)
+				{	psf->error = SFE_BAD_SEEK ;
+					return	((sf_count_t) -1) ;
+					} ;
+	
+				if (psf->last_op == SFM_WRITE && ppaf24->write_count)
+					paf24_write_block (psf, ppaf24) ;
+
+				psf_fseek (psf->filedes, psf->dataoffset + newblock * ppaf24->blocksize, SEEK_SET) ;
+				ppaf24->read_block  = newblock ;
+				paf24_read_block (psf, ppaf24) ;
+				ppaf24->read_count = newsample ;
+				break ;
+				
+		case SFM_WRITE :
+				if (offset > ppaf24->sample_count)
+				{	psf->error = SFE_BAD_SEEK ;
+					return	((sf_count_t) -1) ;
+					} ;
+
+				if (psf->last_op == SFM_WRITE && ppaf24->write_count)
+					paf24_write_block (psf, ppaf24) ;
+
+				psf_fseek (psf->filedes, psf->dataoffset + newblock * ppaf24->blocksize, SEEK_SET) ;
+				ppaf24->read_block  = newblock ;
+				paf24_read_block (psf, ppaf24) ;
+				ppaf24->read_count = newsample ;
+				break ;
+				
+		default :
+				psf->error = SFE_BAD_SEEK ;
+				return	((sf_count_t) -1) ;
+		} ;
+
+	return newblock * ppaf24->samplesperblock + newsample ;
+} /* paf24_seek */
+
+static int 
+paf24_close (SF_PRIVATE  *psf)
+{	PAF24_PRIVATE *ppaf24 ; 
+	
+	if (! psf->fdata)
+		return 0 ;
+		
+	ppaf24 = (PAF24_PRIVATE*) psf->fdata ;
+	
+	if (psf->mode == SFM_WRITE || psf->mode == SFM_RDWR)
+	{	if (ppaf24->write_count > 0)
+			paf24_write_block (psf, ppaf24) ;
+		} ;
+		
+	free (psf->fdata) ;
+	psf->fdata = NULL ;
+
+	return 0 ;
+} /* paf24_close */
+
+/*---------------------------------------------------------------------------
+*/
 static int	
 paf24_read_block (SF_PRIVATE  *psf, PAF24_PRIVATE *ppaf24)
-{	int				k, *iptr, newsample, channel ;
+{	int				k, channel ;
 	unsigned char	*cptr ;
 	
-	ppaf24->blockcount ++ ;
-	ppaf24->samplecount = 0 ;
+	ppaf24->read_block ++ ;
+	ppaf24->read_count = 0 ;
 	
-	if (ppaf24->blockcount > ppaf24->blocks)
+	if (ppaf24->read_block * ppaf24->samplesperblock > ppaf24->sample_count)
 	{	memset (ppaf24->samples, 0, ppaf24->samplesperblock * ppaf24->channels) ;
 		return 1 ;
 		} ;
@@ -371,25 +488,21 @@
 		
 	/* Read the block. */
 
-	if ((k = fread (ppaf24->block, 1, ppaf24->blocksize, psf->file)) != ppaf24->blocksize)
+	if ((k = psf_fread (ppaf24->block, 1, ppaf24->blocksize, psf->filedes)) != ppaf24->blocksize)
 		psf_log_printf (psf, "*** Warning : short read (%d != %d).\n", k, ppaf24->blocksize) ;
 
 	/* Do endian swapping if necessary. */
 
-	iptr = (int*) (ppaf24->data) ;
 	if ((CPU_IS_BIG_ENDIAN && psf->endian == SF_ENDIAN_LITTLE) ||
 			(CPU_IS_LITTLE_ENDIAN && psf->endian == SF_ENDIAN_BIG))
-	{	for (k = 0 ; k < 8 * ppaf24->channels ; k++)
-			iptr [k] = ENDSWAP_INT (iptr [k]) ;
+	{	endswap_int_array 	((int*) ppaf24->data, 8 * ppaf24->channels) ;
 		} ;
 		
-	/* Unpack block. */	
-
-	for (k = 0 ; k < 10 * ppaf24->channels ; k++)
+	/* Unpack block. */
+	for (k = 0 ; k < PAF24_SAMPLES_PER_BLOCK * ppaf24->channels ; k++)
 	{	channel = k % ppaf24->channels ;
-		cptr = ppaf24->block + 32 * channel + 3 * (k / ppaf24->channels) ;
-		newsample = (cptr [0] << 8) | (cptr [1] << 16) | (cptr [2] << 24) ;
-		ppaf24->samples [k] = newsample / 256 ;
+		cptr = ppaf24->block + PAF24_BLOCK_SIZE * channel + 3 * (k / ppaf24->channels) ;
+		ppaf24->samples [k] = (cptr [0] << 8) | (cptr [1] << 16) | (cptr [2] << 24) ;
 		} ;
 
 	return 1 ;
@@ -396,24 +509,24 @@
 } /* paf24_read_block */
 
 static int 
-paf24_read (SF_PRIVATE *psf, PAF24_PRIVATE *ppaf24, int *ptr, int len)
-{	int		count, total = 0, index = 0 ;
+paf24_read (SF_PRIVATE *psf, PAF24_PRIVATE *ppaf24, int *ptr, sf_count_t len)
+{	sf_count_t	count, total = 0, index = 0 ;
 	
 	while (index < len)
-	{	if (ppaf24->blockcount >= ppaf24->blocks && ppaf24->samplecount >= ppaf24->samplesperblock)
-		{	memset (&(ptr[index]), 0, (len - index) * sizeof (int)) ;
+	{	if (ppaf24->read_block * ppaf24->samplesperblock >= ppaf24->sample_count)
+		{	memset (&(ptr[index]), 0, (size_t) ((len - index) * sizeof (int))) ;
 			return total ;
 			} ;
 		
-		if (ppaf24->samplecount >= ppaf24->samplesperblock)
+		if (ppaf24->read_count >= ppaf24->samplesperblock)
 			paf24_read_block (psf, ppaf24) ;
 		
-		count = (ppaf24->samplesperblock - ppaf24->samplecount) * ppaf24->channels ;
+		count = (ppaf24->samplesperblock - ppaf24->read_count) * ppaf24->channels ;
 		count = (len - index > count) ? count : len - index ;
 		
-		memcpy (&(ptr[index]), &(ppaf24->samples [ppaf24->samplecount * ppaf24->channels]), count * sizeof (int)) ;
+		memcpy (&(ptr[index]), &(ppaf24->samples [ppaf24->read_count * ppaf24->channels]), count * sizeof (int)) ;
 		index += count ;
-		ppaf24->samplecount += count / ppaf24->channels ;
+		ppaf24->read_count += count / ppaf24->channels ;
 		total = index ;
 		} ;
 
@@ -420,8 +533,8 @@
 	return total ;		
 } /* paf24_read */
 
-static int 
-paf24_read_s (SF_PRIVATE *psf, short *ptr, int len)
+static sf_count_t 
+paf24_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
 {	PAF24_PRIVATE 	*ppaf24 ; 
 	int				*iptr ;
 	int				k, bufferlen, readcount = 0, count ;
@@ -432,12 +545,12 @@
 	ppaf24 = (PAF24_PRIVATE*) psf->fdata ;
 	
 	iptr = (int*) psf->buffer ;
-	bufferlen = psf->sf.channels * ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (int) ;
+	bufferlen = SF_BUFFER_LEN / sizeof (int) ;
 	while (len > 0)
 	{	readcount = (len >= bufferlen) ? bufferlen : len ;
 		count = paf24_read (psf, ppaf24, iptr, readcount) ;
 		for (k = 0 ; k < readcount ; k++)
-			ptr [index+k] = (short) (iptr [k] / 256) ;
+			ptr [index+k] = iptr [k] >> 16 ;
 		index += readcount ;
 		total += count ;
 		len -= readcount ;
@@ -445,8 +558,8 @@
 	return total ;
 } /* paf24_read_s */
 
-static int 
-paf24_read_i (SF_PRIVATE *psf, int *ptr, int len) 
+static sf_count_t
+paf24_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) 
 {	PAF24_PRIVATE *ppaf24 ; 
 	int				total ;
 
@@ -459,24 +572,27 @@
 	return total ;
 } /* paf24_read_i */
 
-static int 
-paf24_read_f (SF_PRIVATE *psf, float *ptr, int len)
+static sf_count_t
+paf24_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
 {	PAF24_PRIVATE 	*ppaf24 ; 
 	int				*iptr ;
 	int				k, bufferlen, readcount = 0, count ;
 	int				index = 0, total = 0 ;
+	float			normfact ;
 
 	if (! psf->fdata)
 		return 0 ;
 	ppaf24 = (PAF24_PRIVATE*) psf->fdata ;
-	
+
+	normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x80000000) : 1.0 ;
+
 	iptr = (int*) psf->buffer ;
-	bufferlen = psf->sf.channels * ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (int) ;
+	bufferlen = SF_BUFFER_LEN / sizeof (int) ;
 	while (len > 0)
 	{	readcount = (len >= bufferlen) ? bufferlen : len ;
 		count = paf24_read (psf, ppaf24, iptr, readcount) ;
 		for (k = 0 ; k < readcount ; k++)
-			ptr [index+k] = (float) (iptr [k]) ;
+			ptr [index+k] = normfact * iptr [k] ;
 		index += readcount ;
 		total += count ;
 		len -= readcount ;
@@ -484,24 +600,27 @@
 	return total ;
 } /* paf24_read_f */
 
-static int 
-paf24_read_d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+static sf_count_t
+paf24_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
 {	PAF24_PRIVATE 	*ppaf24 ; 
 	int				*iptr ;
 	int				k, bufferlen, readcount = 0, count ;
 	int				index = 0, total = 0 ;
+	double 			normfact ;
 
 	if (! psf->fdata)
 		return 0 ;
 	ppaf24 = (PAF24_PRIVATE*) psf->fdata ;
-	
+
+	normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x80000000) : 1.0 ;
+
 	iptr = (int*) psf->buffer ;
-	bufferlen = psf->sf.channels * ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (int) ;
+	bufferlen = SF_BUFFER_LEN / sizeof (int) ;
 	while (len > 0)
 	{	readcount = (len >= bufferlen) ? bufferlen : len ;
 		count = paf24_read (psf, ppaf24, iptr, readcount) ;
 		for (k = 0 ; k < readcount ; k++)
-			ptr [index+k] = (double) (iptr [k]) ;
+			ptr [index+k] = normfact * iptr [k] ;
 		index += readcount ;
 		total += count ;
 		len -= readcount ;
@@ -512,90 +631,59 @@
 /*---------------------------------------------------------------------------
 */
 
-static int 
-paf24_writer_init (SF_PRIVATE  *psf)
-{	PAF24_PRIVATE	*ppaf24 ; 
-	unsigned int	paf24size ;	
-	
-	paf24size = sizeof (PAF24_PRIVATE) + psf->sf.channels * (32 + 10 * sizeof (int)) ;
-	if (! (psf->fdata = malloc (paf24size)))
-		return SFE_MALLOC_FAILED ;
-		
-	ppaf24 = (PAF24_PRIVATE*) psf->fdata ;
-	memset (ppaf24, 0, paf24size) ;
-	
-	ppaf24->channels = psf->sf.channels ;
-	ppaf24->block    = (unsigned char*) ppaf24->data ;
-	ppaf24->samples  = (int*) (ppaf24->data + 32 * ppaf24->channels) ;
-	
-	ppaf24->blocksize = 32 * ppaf24->channels ;
-	ppaf24->samplesperblock = 10 ;
-	
-	if (psf->datalength % ppaf24->blocksize)
-	{	psf_log_printf (psf, "*** Warning : file seems to be truncated.\n") ;
-		ppaf24->blocks = psf->datalength / ppaf24->blocksize  + 1 ;
-		}
-	else
-		ppaf24->blocks = psf->datalength / ppaf24->blocksize ;
-		
-	psf->sf.samples = ppaf24->samplesperblock * ppaf24->blocks ;
-
-	return 0 ;
-} /* paf24_writer_init */
-
-
 static int	
 paf24_write_block (SF_PRIVATE  *psf, PAF24_PRIVATE *ppaf24)
-{	int				k, *iptr, nextsample, channel ;
+{	int				k, nextsample, channel ;
 	unsigned char	*cptr ;
 	
 	/* First pack block. */	
 
-	for (k = 0 ; k < 10 * ppaf24->channels ; k++)
+	for (k = 0 ; k < PAF24_SAMPLES_PER_BLOCK * ppaf24->channels ; k++)
 	{	channel = k % ppaf24->channels ;
-		cptr = ppaf24->block + 32 * channel + 3 * (k / ppaf24->channels) ;
-		nextsample = ppaf24->samples [k] ;
-		cptr [0] = nextsample & 0xFF ;
-		cptr [1] = (nextsample >> 8) & 0xFF ;
-		cptr [2] = (nextsample >> 16) & 0xFF ;
+		cptr = ppaf24->block + PAF24_BLOCK_SIZE * channel + 3 * (k / ppaf24->channels) ;
+		nextsample = ppaf24->samples [k] >> 8 ;
+		cptr [0] = nextsample  ;
+		cptr [1] = nextsample >> 8 ;
+		cptr [2] = nextsample >> 16 ;
 		} ;
 	
 	/* Do endian swapping if necessary. */
-
-	iptr = (int*) (ppaf24->data) ;
 	if ((CPU_IS_BIG_ENDIAN && psf->endian == SF_ENDIAN_LITTLE) ||
 			(CPU_IS_LITTLE_ENDIAN && psf->endian == SF_ENDIAN_BIG))
-	{	for (k = 0 ; k < 8 * ppaf24->channels ; k++)
-			iptr [k] = ENDSWAP_INT (iptr [k]) ;
+	{	endswap_int_array 	((int*) ppaf24->data, 8 * ppaf24->channels) ;
 		} ;
 		
 	/* Write block to disk. */
-	
-	if ((k = fwrite (ppaf24->block, 1, ppaf24->blocksize, psf->file)) != ppaf24->blocksize)
+	if ((k = psf_fwrite (ppaf24->block, 1, ppaf24->blocksize, psf->filedes)) != ppaf24->blocksize)
 		psf_log_printf (psf, "*** Warning : short write (%d != %d).\n", k, ppaf24->blocksize) ;
 
-	ppaf24->blockcount ++ ;
-	ppaf24->samplecount = 0 ;
-	
+	if (ppaf24->sample_count < ppaf24->write_block * ppaf24->samplesperblock + ppaf24->write_count)
+		ppaf24->sample_count = ppaf24->write_block * ppaf24->samplesperblock + ppaf24->write_count ;
+
+	if (ppaf24->write_count == ppaf24->samplesperblock)
+	{	ppaf24->write_block ++ ;
+		ppaf24->write_count = 0 ;
+		} ;
+
 	return 1 ;
 } /* paf24_write_block */
 
 static int 
-paf24_write (SF_PRIVATE *psf, PAF24_PRIVATE *ppaf24, int *ptr, int len)
+paf24_write (SF_PRIVATE *psf, PAF24_PRIVATE *ppaf24, int *ptr, sf_count_t len)
 {	int		count, total = 0, index = 0 ;
 	
 	while (index < len)
-	{	count = (ppaf24->samplesperblock - ppaf24->samplecount) * ppaf24->channels ;
+	{	count = (ppaf24->samplesperblock - ppaf24->write_count) * ppaf24->channels ;
 
 		if (count > len - index)
 			count = len - index ;
 
-		memcpy (&(ppaf24->samples [ppaf24->samplecount * ppaf24->channels]), &(ptr [index]), count * sizeof (int)) ;
+		memcpy (&(ppaf24->samples [ppaf24->write_count * ppaf24->channels]), &(ptr [index]), count * sizeof (int)) ;
 		index += count ;
-		ppaf24->samplecount += count / ppaf24->channels ;
+		ppaf24->write_count += count / ppaf24->channels ;
 		total = index ;
 
-		if (ppaf24->samplecount >= ppaf24->samplesperblock)
+		if (ppaf24->write_count >= ppaf24->samplesperblock)
 			paf24_write_block (psf, ppaf24) ;	
 		} ;
 
@@ -602,8 +690,8 @@
 	return total ;		
 } /* paf24_write */
 
-static int 
-paf24_write_s (SF_PRIVATE *psf, short *ptr, int len)
+static sf_count_t
+paf24_write_s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
 {	PAF24_PRIVATE 	*ppaf24 ; 
 	int				*iptr ;
 	int				k, bufferlen, writecount = 0, count ;
@@ -614,11 +702,11 @@
 	ppaf24 = (PAF24_PRIVATE*) psf->fdata ;
 	
 	iptr = (int*) psf->buffer ;
-	bufferlen = psf->sf.channels * ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (int) ;
+	bufferlen = SF_BUFFER_LEN / sizeof (int) ;
 	while (len > 0)
 	{	writecount = (len >= bufferlen) ? bufferlen : len ;
 		for (k = 0 ; k < writecount ; k++)
-			iptr [k] = ((int) ptr [index+k]) * 256 ;
+			iptr [k] = ptr [index + k] << 16 ;
 		count = paf24_write (psf, ppaf24, iptr, writecount) ;
 		index += writecount ;
 		total += count ;
@@ -627,8 +715,8 @@
 	return total ;
 } /* paf24_write_s */
 
-static int 
-paf24_write_i (SF_PRIVATE *psf, int *ptr, int len)
+static sf_count_t
+paf24_write_i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
 {	PAF24_PRIVATE 	*ppaf24 ; 
 	int				total = 0 ;
 
@@ -641,23 +729,26 @@
 	return total ;
 } /* paf24_write_i */
 
-static int 
-paf24_write_f (SF_PRIVATE *psf, float *ptr, int len) 
+static sf_count_t
+paf24_write_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) 
 {	PAF24_PRIVATE 	*ppaf24 ; 
 	int				*iptr ;
 	int				k, bufferlen, writecount = 0, count ;
 	int				index = 0, total = 0 ;
+	float			normfact ;
 
 	if (! psf->fdata)
 		return 0 ;
 	ppaf24 = (PAF24_PRIVATE*) psf->fdata ;
-	
+
+	normfact = (psf->norm_float == SF_TRUE) ? ((float) 0x80000000) : 1.0 ;
+
 	iptr = (int*) psf->buffer ;
-	bufferlen = psf->sf.channels * ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (int) ;
+	bufferlen = SF_BUFFER_LEN / sizeof (int) ;
 	while (len > 0)
 	{	writecount = (len >= bufferlen) ? bufferlen : len ;
 		for (k = 0 ; k < writecount ; k++)
-			iptr [k] = FLOAT_TO_INT (ptr [index+k]) ;
+			iptr [k] = lrintf (normfact * ptr [index+k]) ;
 		count = paf24_write (psf, ppaf24, iptr, writecount) ;
 		index += writecount ;
 		total += count ;
@@ -666,23 +757,26 @@
 	return total ;
 } /* paf24_write_f */
 
-static int 
-paf24_write_d (SF_PRIVATE *psf, double *ptr, int len, int normalize) 
+static sf_count_t
+paf24_write_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) 
 {	PAF24_PRIVATE 	*ppaf24 ; 
 	int				*iptr ;
 	int				k, bufferlen, writecount = 0, count ;
 	int				index = 0, total = 0 ;
-
+	double			normfact ;
+	
 	if (! psf->fdata)
 		return 0 ;
 	ppaf24 = (PAF24_PRIVATE*) psf->fdata ;
-	
+
+	normfact = (psf->norm_double == SF_TRUE) ? ((double) 0x80000000) : 1.0 ;
+
 	iptr = (int*) psf->buffer ;
-	bufferlen = psf->sf.channels * ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (int) ;
+	bufferlen = SF_BUFFER_LEN / sizeof (int) ;
 	while (len > 0)
 	{	writecount = (len >= bufferlen) ? bufferlen : len ;
 		for (k = 0 ; k < writecount ; k++)
-			iptr [k] = DOUBLE_TO_INT (ptr [index+k]) ;
+			iptr [k] = lrint (normfact * ptr [index+k]) ;
 		count = paf24_write (psf, ppaf24, iptr, writecount) ;
 		index += writecount ;
 		total += count ;
@@ -691,108 +785,4 @@
 	return total ;
 } /* paf24_write_d */
 
-/*---------------------------------------------------------------------------
-*/
 
-static long 
-paf24_seek (SF_PRIVATE *psf, long offset, int whence)
-{	PAF24_PRIVATE	*ppaf24 ; 
-	int				newblock, newsample ;
-	
-	if (! psf->fdata)
-		return 0 ;
-
-	ppaf24 = (PAF24_PRIVATE*) psf->fdata ;
-
-	if (! (psf->blockwidth && psf->datalength && psf->dataoffset))
-	{	psf->error = SFE_BAD_SEEK ;
-		return	((long) -1) ;
-		} ;
-		
-	switch (whence)
-	{	case SEEK_SET :
-				if (offset < 0 || offset > ppaf24->blocks * ppaf24->samplesperblock)
-				{	psf->error = SFE_BAD_SEEK ;
-					return	((long) -1) ;
-					} ;
-				newblock  = offset / ppaf24->samplesperblock ;
-				newsample = offset % ppaf24->samplesperblock ;
-				break ;
-				
-		case SEEK_CUR :
-				if (psf->current + offset < 0 || psf->current + offset > ppaf24->blocks * ppaf24->samplesperblock)
-				{	psf->error = SFE_BAD_SEEK ;
-					return	((long) -1) ;
-					} ;
-				newblock  = (psf->current + offset) / ppaf24->samplesperblock ;
-				newsample = (psf->current + offset) % ppaf24->samplesperblock ;
-				break ;
-				
-		case SEEK_END :
-				if (offset > 0 || ppaf24->samplesperblock * ppaf24->blocks + offset < 0)
-				{	psf->error = SFE_BAD_SEEK ;
-					return	((long) -1) ;
-					} ;
-				newblock  = (ppaf24->samplesperblock * ppaf24->blocks + offset) / ppaf24->samplesperblock ;
-				newsample = (ppaf24->samplesperblock * ppaf24->blocks + offset) % ppaf24->samplesperblock ;
-				break ;
-				
-		default : 
-				psf->error = SFE_BAD_SEEK ;
-				return	((long) -1) ;
-		} ;
-		
-	if (psf->mode == SF_MODE_READ)
-	{	fseek (psf->file, (int) (psf->dataoffset + newblock * ppaf24->blocksize), SEEK_SET) ;
-		ppaf24->blockcount  = newblock ;
-		paf24_read_block (psf, ppaf24) ;
-		ppaf24->samplecount = newsample ;
-		}
-	else
-	{	/* What to do about write??? */ 
-		psf->error = SFE_BAD_SEEK ;
-		return	((long) -1) ;
-		} ;
-
-	psf->current = newblock * ppaf24->samplesperblock + newsample ;
-
-	return psf->current ;
-} /* paf24_seek */
-
-/*---------------------------------------------------------------------------
-*/
-
-static int 
-paf24_close (SF_PRIVATE  *psf)
-{	PAF24_PRIVATE *ppaf24 ; 
-	
-	if (! psf->fdata)
-		return 0 ;
-		
-	ppaf24 = (PAF24_PRIVATE*) psf->fdata ;
-	
-	if (psf->mode == SF_MODE_WRITE)
-	{	if (ppaf24->samplecount && ppaf24->samplecount < ppaf24->samplesperblock)
-			paf24_write_block (psf, ppaf24) ;	
-		} ;
-		
-	free (psf->fdata) ;
-	psf->fdata = NULL ;
-
-	return 0 ;
-} /* paf24_close */
-
-/*---------------------------------------------------------------------------
-*/
-
-/*-
-static void
-endswap_paf_fmt (PAF_FMT *ppaf_fmt)
-{	ppaf_fmt->version    = ENDSWAP_INT (ppaf_fmt->version) ;
-	ppaf_fmt->endianness = ENDSWAP_INT (ppaf_fmt->endianness) ;
-	ppaf_fmt->samplerate = ENDSWAP_INT (ppaf_fmt->samplerate) ;
-	ppaf_fmt->format     = ENDSWAP_INT (ppaf_fmt->format) ;
-	ppaf_fmt->channels   = ENDSWAP_INT (ppaf_fmt->channels) ;
-	ppaf_fmt->source     = ENDSWAP_INT (ppaf_fmt->source) ;
-} /+* endswap_paf_fmt *+/
--*/
--- a/common/libsndfile/src/pcm.c
+++ b/common/libsndfile/src/pcm.c
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 1999-2001 Erik de Castro Lopo <[email protected]>
+** Copyright (C) 1999-2002 Erik de Castro Lopo <[email protected]>
 **  
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -19,10 +19,10 @@
 
 #include	<unistd.h>
 
-#include	"config.h"
 #include	"sndfile.h"
+#include	"config.h"
 #include	"sfendian.h"
-#include	"floatcast.h"
+#include	"float_cast.h"
 #include	"common.h"
 
 /* Important!!! Do not assume that sizeof (tribyte) == 3. Some compilers 
@@ -33,284 +33,290 @@
 {	char	bytes [3] ;
 } tribyte ;
 
-static int	pcm_read_sc2s  (SF_PRIVATE *psf, short *ptr, int len) ;
-static int	pcm_read_uc2s  (SF_PRIVATE *psf, short *ptr, int len) ;
-static int	pcm_read_bes2s (SF_PRIVATE *psf, short *ptr, int len) ;
-static int	pcm_read_les2s (SF_PRIVATE *psf, short *ptr, int len) ;
-static int	pcm_read_bet2s (SF_PRIVATE *psf, short *ptr, int len) ;
-static int	pcm_read_let2s (SF_PRIVATE *psf, short *ptr, int len) ;
-static int	pcm_read_bei2s (SF_PRIVATE *psf, short *ptr, int len) ;
-static int	pcm_read_lei2s (SF_PRIVATE *psf, short *ptr, int len) ;
+static sf_count_t	pcm_read_sc2s  (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static sf_count_t	pcm_read_uc2s  (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static sf_count_t	pcm_read_bes2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static sf_count_t	pcm_read_les2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static sf_count_t	pcm_read_bet2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static sf_count_t	pcm_read_let2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static sf_count_t	pcm_read_bei2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static sf_count_t	pcm_read_lei2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
 
-static int	pcm_read_sc2i  (SF_PRIVATE *psf, int *ptr, int len) ;
-static int	pcm_read_uc2i  (SF_PRIVATE *psf, int *ptr, int len) ;
-static int	pcm_read_bes2i (SF_PRIVATE *psf, int *ptr, int len) ;
-static int	pcm_read_les2i (SF_PRIVATE *psf, int *ptr, int len) ;
-static int	pcm_read_bet2i (SF_PRIVATE *psf, int *ptr, int len) ;
-static int	pcm_read_let2i (SF_PRIVATE *psf, int *ptr, int len) ;
-static int	pcm_read_bei2i (SF_PRIVATE *psf, int *ptr, int len) ;
-static int	pcm_read_lei2i (SF_PRIVATE *psf, int *ptr, int len) ;
+static sf_count_t	pcm_read_sc2i  (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+static sf_count_t	pcm_read_uc2i  (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+static sf_count_t	pcm_read_bes2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+static sf_count_t	pcm_read_les2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+static sf_count_t	pcm_read_bet2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+static sf_count_t	pcm_read_let2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+static sf_count_t	pcm_read_bei2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+static sf_count_t	pcm_read_lei2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
 
-static int	pcm_read_sc2f  (SF_PRIVATE *psf, float *ptr, int len) ;
-static int	pcm_read_uc2f  (SF_PRIVATE *psf, float *ptr, int len) ;
-static int	pcm_read_bes2f (SF_PRIVATE *psf, float *ptr, int len) ;
-static int	pcm_read_les2f (SF_PRIVATE *psf, float *ptr, int len) ;
-static int	pcm_read_bet2f (SF_PRIVATE *psf, float *ptr, int len) ;
-static int	pcm_read_let2f (SF_PRIVATE *psf, float *ptr, int len) ;
-static int	pcm_read_bei2f (SF_PRIVATE *psf, float *ptr, int len) ;
-static int	pcm_read_lei2f (SF_PRIVATE *psf, float *ptr, int len) ;
+static sf_count_t	pcm_read_sc2f  (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+static sf_count_t	pcm_read_uc2f  (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+static sf_count_t	pcm_read_bes2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+static sf_count_t	pcm_read_les2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+static sf_count_t	pcm_read_bet2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+static sf_count_t	pcm_read_let2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+static sf_count_t	pcm_read_bei2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+static sf_count_t	pcm_read_lei2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
 
-static int	pcm_read_sc2d  (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
-static int	pcm_read_uc2d  (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
-static int	pcm_read_bes2d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
-static int	pcm_read_les2d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
-static int	pcm_read_bet2d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
-static int	pcm_read_let2d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
-static int	pcm_read_bei2d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
-static int	pcm_read_lei2d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+static sf_count_t	pcm_read_sc2d  (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
+static sf_count_t	pcm_read_uc2d  (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
+static sf_count_t	pcm_read_bes2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
+static sf_count_t	pcm_read_les2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
+static sf_count_t	pcm_read_bet2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
+static sf_count_t	pcm_read_let2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
+static sf_count_t	pcm_read_bei2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
+static sf_count_t	pcm_read_lei2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
 
 
-static int	pcm_write_s2sc  (SF_PRIVATE *psf, short *ptr, int len) ;
-static int	pcm_write_s2uc  (SF_PRIVATE *psf, short *ptr, int len) ;
-static int	pcm_write_s2bes (SF_PRIVATE *psf, short *ptr, int len) ;
-static int	pcm_write_s2les (SF_PRIVATE *psf, short *ptr, int len) ;
-static int	pcm_write_s2bet (SF_PRIVATE *psf, short *ptr, int len) ;
-static int	pcm_write_s2let (SF_PRIVATE *psf, short *ptr, int len) ;
-static int	pcm_write_s2bei (SF_PRIVATE *psf, short *ptr, int len) ;
-static int	pcm_write_s2lei (SF_PRIVATE *psf, short *ptr, int len) ;
+static sf_count_t	pcm_write_s2sc  (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static sf_count_t	pcm_write_s2uc  (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static sf_count_t	pcm_write_s2bes (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static sf_count_t	pcm_write_s2les (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static sf_count_t	pcm_write_s2bet (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static sf_count_t	pcm_write_s2let (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static sf_count_t	pcm_write_s2bei (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static sf_count_t	pcm_write_s2lei (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
 
-static int	pcm_write_i2sc  (SF_PRIVATE *psf, int *ptr, int len) ;
-static int	pcm_write_i2uc  (SF_PRIVATE *psf, int *ptr, int len) ;
-static int	pcm_write_i2bes (SF_PRIVATE *psf, int *ptr, int len) ;
-static int	pcm_write_i2les (SF_PRIVATE *psf, int *ptr, int len) ;
-static int	pcm_write_i2bet (SF_PRIVATE *psf, int *ptr, int len) ;
-static int	pcm_write_i2let (SF_PRIVATE *psf, int *ptr, int len) ;
-static int	pcm_write_i2bei (SF_PRIVATE *psf, int *ptr, int len) ;
-static int	pcm_write_i2lei (SF_PRIVATE *psf, int *ptr, int len) ;
+static sf_count_t	pcm_write_i2sc  (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+static sf_count_t	pcm_write_i2uc  (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+static sf_count_t	pcm_write_i2bes (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+static sf_count_t	pcm_write_i2les (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+static sf_count_t	pcm_write_i2bet (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+static sf_count_t	pcm_write_i2let (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+static sf_count_t	pcm_write_i2bei (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+static sf_count_t	pcm_write_i2lei (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
 
-static int	pcm_write_f2sc  (SF_PRIVATE *psf, float *ptr, int len) ;
-static int	pcm_write_f2uc  (SF_PRIVATE *psf, float *ptr, int len) ;
-static int	pcm_write_f2bes (SF_PRIVATE *psf, float *ptr, int len) ;
-static int	pcm_write_f2les (SF_PRIVATE *psf, float *ptr, int len) ;
-static int	pcm_write_f2bet (SF_PRIVATE *psf, float *ptr, int len) ;
-static int	pcm_write_f2let (SF_PRIVATE *psf, float *ptr, int len) ;
-static int	pcm_write_f2bei (SF_PRIVATE *psf, float *ptr, int len) ;
-static int	pcm_write_f2lei (SF_PRIVATE *psf, float *ptr, int len) ;
+static sf_count_t	pcm_write_f2sc  (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+static sf_count_t	pcm_write_f2uc  (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+static sf_count_t	pcm_write_f2bes (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+static sf_count_t	pcm_write_f2les (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+static sf_count_t	pcm_write_f2bet (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+static sf_count_t	pcm_write_f2let (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+static sf_count_t	pcm_write_f2bei (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+static sf_count_t	pcm_write_f2lei (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
 
-static int	pcm_write_d2sc  (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
-static int	pcm_write_d2uc  (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
-static int	pcm_write_d2bes (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
-static int	pcm_write_d2les (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
-static int	pcm_write_d2bet (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
-static int	pcm_write_d2let (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
-static int	pcm_write_d2bei (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
-static int	pcm_write_d2lei (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+static sf_count_t	pcm_write_d2sc  (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
+static sf_count_t	pcm_write_d2uc  (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
+static sf_count_t	pcm_write_d2bes (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
+static sf_count_t	pcm_write_d2les (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
+static sf_count_t	pcm_write_d2bet (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
+static sf_count_t	pcm_write_d2let (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
+static sf_count_t	pcm_write_d2bei (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
+static sf_count_t	pcm_write_d2lei (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
 
-static	void	sc2s_array	(signed char *buffer, unsigned int count, short *ptr, int index) ;
-static	void	uc2s_array	(unsigned char *buffer, unsigned int count, short *ptr, int index) ;
-static	void	bet2s_array (tribyte *buffer, unsigned int count, short *ptr, int index) ;
-static	void	let2s_array (tribyte *buffer, unsigned int count, short *ptr, int index) ;
-static	void	bei2s_array (int *buffer, unsigned int count, short *ptr, int index) ;
-static	void	lei2s_array (int *buffer, unsigned int count, short *ptr, int index) ;
+static	void	sc2s_array	(signed char *buffer, unsigned int count, short *ptr) ;
+static	void	uc2s_array	(unsigned char *buffer, unsigned int count, short *ptr) ;
 
-static	void	sc2i_array	(signed char *buffer, unsigned int count, int *ptr, int index) ;
-static	void	uc2i_array	(unsigned char *buffer, unsigned int count, int *ptr, int index) ;
-static	void	bes2i_array (short *buffer, unsigned int count, int *ptr, int index) ;
-static	void	les2i_array (short *buffer, unsigned int count, int *ptr, int index) ;
-static	void	bet2i_array (tribyte *buffer, unsigned int count, int *ptr, int index) ;
-static	void	let2i_array (tribyte *buffer, unsigned int count, int *ptr, int index) ;
+static	void	bet2s_array (tribyte *buffer, unsigned int count, short *ptr) ;
+static	void	let2s_array (tribyte *buffer, unsigned int count, short *ptr) ;
+static	void	bei2s_array (int *buffer, unsigned int count, short *ptr) ;
+static	void	lei2s_array (int *buffer, unsigned int count, short *ptr) ;
 
-static	void	sc2f_array	(signed char *buffer, unsigned int count, float *ptr, int index, float normfact) ;
-static	void	uc2f_array	(unsigned char *buffer, unsigned int count, float *ptr, int index, float normfact) ;
-static	void	bes2f_array (short *buffer, unsigned int count, float *ptr, int index, float normfact) ;
-static	void	les2f_array (short *buffer, unsigned int count, float *ptr, int index, float normfact) ;
-static	void	bet2f_array (tribyte *buffer, unsigned int count, float *ptr, int index, float normfact) ;
-static	void	let2f_array (tribyte *buffer, unsigned int count, float *ptr, int index, float normfact) ;
-static	void	bei2f_array (int *buffer, unsigned int count, float *ptr, int index, float normfact) ;
-static	void	lei2f_array (int *buffer, unsigned int count, float *ptr, int index, float normfact) ;
+static	void	sc2i_array	(signed char *buffer, unsigned int count, int *ptr) ;
+static	void	uc2i_array	(unsigned char *buffer, unsigned int count, int *ptr) ;
+static	void	bes2i_array (short *buffer, unsigned int count, int *ptr) ;
+static	void	les2i_array (short *buffer, unsigned int count, int *ptr) ;
+static	void	bet2i_array (tribyte *buffer, unsigned int count, int *ptr) ;
+static	void	let2i_array (tribyte *buffer, unsigned int count, int *ptr) ;
 
-static	void	sc2d_array	(signed char *buffer, unsigned int count, double *ptr, int index, double normfact) ;
-static	void	uc2d_array	(unsigned char *buffer, unsigned int count, double *ptr, int index, double normfact) ;
-static	void	bes2d_array (short *buffer, unsigned int count, double *ptr, int index, double normfact) ;
-static	void	les2d_array (short *buffer, unsigned int count, double *ptr, int index, double normfact) ;
-static	void	bet2d_array (tribyte *buffer, unsigned int count, double *ptr, int index, double normfact) ;
-static	void	let2d_array (tribyte *buffer, unsigned int count, double *ptr, int index, double normfact) ;
-static	void	bei2d_array (int *buffer, unsigned int count, double *ptr, int index, double normfact) ;
-static	void	lei2d_array (int *buffer, unsigned int count, double *ptr, int index, double normfact) ;
+static	void	sc2f_array	(signed char *buffer, unsigned int count, float *ptr, float normfact) ;
+static	void	uc2f_array	(unsigned char *buffer, unsigned int count, float *ptr, float normfact) ;
+static	void	bes2f_array (short *buffer, unsigned int count, float *ptr, float normfact) ;
+static	void	les2f_array (short *buffer, unsigned int count, float *ptr, float normfact) ;
+static	void	bet2f_array (tribyte *buffer, unsigned int count, float *ptr, float normfact) ;
+static	void	let2f_array (tribyte *buffer, unsigned int count, float *ptr, float normfact) ;
+static	void	bei2f_array (int *buffer, unsigned int count, float *ptr, float normfact) ;
+static	void	lei2f_array (int *buffer, unsigned int count, float *ptr, float normfact) ;
 
+static	void	sc2d_array	(signed char *buffer, unsigned int count, double *ptr, double normfact) ;
+static	void	uc2d_array	(unsigned char *buffer, unsigned int count, double *ptr, double normfact) ;
+static	void	bes2d_array (short *buffer, unsigned int count, double *ptr, double normfact) ;
+static	void	les2d_array (short *buffer, unsigned int count, double *ptr, double normfact) ;
+static	void	bet2d_array (tribyte *buffer, unsigned int count, double *ptr, double normfact) ;
+static	void	let2d_array (tribyte *buffer, unsigned int count, double *ptr, double normfact) ;
+static	void	bei2d_array (int *buffer, unsigned int count, double *ptr, double normfact) ;
+static	void	lei2d_array (int *buffer, unsigned int count, double *ptr, double normfact) ;
 
-static	void	s2sc_array	(short *ptr, int index, signed char *buffer, unsigned int count) ;
-static	void	s2uc_array	(short *ptr, int index, unsigned char *buffer, unsigned int count) ;
-static	void	s2bet_array (short *ptr, int index, tribyte *buffer, unsigned int count) ;
-static	void	s2let_array (short *ptr, int index, tribyte *buffer, unsigned int count) ;
-static	void	s2bei_array (short *ptr, int index, int *buffer, unsigned int count) ;
-static	void	s2lei_array (short *ptr, int index, int *buffer, unsigned int count) ;
 
-static	void	i2sc_array	(int *ptr, int index, signed char *buffer, unsigned int count) ;
-static	void	i2uc_array	(int *ptr, int index, unsigned char *buffer, unsigned int count) ;
-static	void	i2bes_array (int *ptr, int index, short *buffer, unsigned int count) ;
-static	void	i2les_array (int *ptr, int index, short *buffer, unsigned int count) ;
-static	void	i2bet_array (int *ptr, int index, tribyte *buffer, unsigned int count) ;
-static	void	i2let_array (int *ptr, int index, tribyte *buffer, unsigned int count) ;
+static	void	s2sc_array	(short *ptr, signed char *buffer, unsigned int count) ;
+static	void	s2uc_array	(short *ptr, unsigned char *buffer, unsigned int count) ;
+static	void	s2bet_array (short *ptr, tribyte *buffer, unsigned int count) ;
+static	void	s2let_array (short *ptr, tribyte *buffer, unsigned int count) ;
+static	void	s2bei_array (short *ptr, int *buffer, unsigned int count) ;
+static	void	s2lei_array (short *ptr, int *buffer, unsigned int count) ;
 
-static	void	f2sc_array	(float *ptr, int index, signed char *buffer, unsigned int count, float normfact) ;
-static	void	f2uc_array	(float *ptr, int index, unsigned char *buffer, unsigned int count, float normfact) ;
-static	void	f2bes_array (float *ptr, int index, short *buffer, unsigned int count, float normfact) ;
-static	void	f2les_array (float *ptr, int index, short *buffer, unsigned int count, float normfact) ;
-static	void	f2bet_array (float *ptr, int index, tribyte *buffer, unsigned int count, float normfact) ;
-static	void	f2let_array (float *ptr, int index, tribyte *buffer, unsigned int count, float normfact) ;
-static 	void	f2bei_array (float *ptr, int index, int *buffer, unsigned int count, float normfact) ;
-static 	void	f2lei_array (float *ptr, int index, int *buffer, unsigned int count, float normfact) ;
+static	void	i2sc_array	(int *ptr, signed char *buffer, unsigned int count) ;
+static	void	i2uc_array	(int *ptr, unsigned char *buffer, unsigned int count) ;
+static	void	i2bes_array (int *ptr, short *buffer, unsigned int count) ;
+static	void	i2les_array (int *ptr, short *buffer, unsigned int count) ;
+static	void	i2bet_array (int *ptr, tribyte *buffer, unsigned int count) ;
+static	void	i2let_array (int *ptr, tribyte *buffer, unsigned int count) ;
 
-static	void	d2sc_array	(double *ptr, int index, signed char *buffer, unsigned int count, double normfact) ;
-static	void	d2uc_array	(double *ptr, int index, unsigned char *buffer, unsigned int count, double normfact) ;
-static	void	d2bes_array (double *ptr, int index, short *buffer, unsigned int count, double normfact) ;
-static	void	d2les_array (double *ptr, int index, short *buffer, unsigned int count, double normfact) ;
-static	void	d2bet_array (double *ptr, int index, tribyte *buffer, unsigned int count, double normfact) ;
-static	void	d2let_array (double *ptr, int index, tribyte *buffer, unsigned int count, double normfact) ;
-static 	void	d2bei_array (double *ptr, int index, int *buffer, unsigned int count, double normfact) ;
-static 	void	d2lei_array (double *ptr, int index, int *buffer, unsigned int count, double normfact) ;
+static	void	f2sc_array	(float *ptr, signed char *buffer, unsigned int count, float normfact) ;
+static	void	f2uc_array	(float *ptr, unsigned char *buffer, unsigned int count, float normfact) ;
+static	void	f2bes_array (float *ptr, short *buffer, unsigned int count, float normfact) ;
+static	void	f2les_array (float *ptr, short *buffer, unsigned int count, float normfact) ;
+static	void	f2bet_array (float *ptr, tribyte *buffer, unsigned int count, float normfact) ;
+static	void	f2let_array (float *ptr, tribyte *buffer, unsigned int count, float normfact) ;
+static 	void	f2bei_array (float *ptr, int *buffer, unsigned int count, float normfact) ;
+static 	void	f2lei_array (float *ptr, int *buffer, unsigned int count, float normfact) ;
 
+static	void	d2sc_array	(double *ptr, signed char *buffer, unsigned int count, double normfact) ;
+static	void	d2uc_array	(double *ptr, unsigned char *buffer, unsigned int count, double normfact) ;
+static	void	d2bes_array (double *ptr, short *buffer, unsigned int count, double normfact) ;
+static	void	d2les_array (double *ptr, short *buffer, unsigned int count, double normfact) ;
+static	void	d2bet_array (double *ptr, tribyte *buffer, unsigned int count, double normfact) ;
+static	void	d2let_array (double *ptr, tribyte *buffer, unsigned int count, double normfact) ;
+static 	void	d2bei_array (double *ptr, int *buffer, unsigned int count, double normfact) ;
+static 	void	d2lei_array (double *ptr, int *buffer, unsigned int count, double normfact) ;
+
 /*-----------------------------------------------------------------------------------------------
 */
 
 int
-pcm_read_init (SF_PRIVATE *psf)
+pcm_init (SF_PRIVATE *psf)
 {
-	if (psf->bytewidth == 1 && psf->chars == SF_CHARS_SIGNED)
-	{	psf->read_short  = (func_short)  pcm_read_sc2s ;
-		psf->read_int    = (func_int)    pcm_read_sc2i ;
-		psf->read_float  = (func_float)  pcm_read_sc2f ;
-		psf->read_double = (func_double) pcm_read_sc2d ;
-		return 0 ;
-		} 
-	else if (psf->bytewidth == 1 && psf->chars == SF_CHARS_UNSIGNED)
-	{	psf->read_short  = (func_short)  pcm_read_uc2s ;
-		psf->read_int    = (func_int)    pcm_read_uc2i ;
-		psf->read_float  = (func_float)  pcm_read_uc2f ;
-		psf->read_double = (func_double) pcm_read_uc2d ;
-		return 0 ;
+	psf->blockwidth = psf->bytewidth * psf->sf.channels ;
+
+	if (psf->mode == SFM_READ || psf->mode == SFM_RDWR)
+	{	switch (psf->bytewidth * 0x10000 + psf->endian + psf->chars)
+		{	case (0x10000 + SF_ENDIAN_BIG + SF_CHARS_SIGNED) :
+			case (0x10000 + SF_ENDIAN_LITTLE + SF_CHARS_SIGNED) :
+					psf->read_short  = pcm_read_sc2s ;
+					psf->read_int    = pcm_read_sc2i ;
+					psf->read_float  = pcm_read_sc2f ;
+					psf->read_double = pcm_read_sc2d ;
+					break ;
+			case (0x10000 + SF_ENDIAN_BIG + SF_CHARS_UNSIGNED) :
+			case (0x10000 + SF_ENDIAN_LITTLE + SF_CHARS_UNSIGNED) :
+					psf->read_short  = pcm_read_uc2s ;
+					psf->read_int    = pcm_read_uc2i ;
+					psf->read_float  = pcm_read_uc2f ;
+					psf->read_double = pcm_read_uc2d ;
+					break ;
+	
+			case  (2 * 0x10000 + SF_ENDIAN_BIG) :
+					psf->read_short  = pcm_read_bes2s ;
+					psf->read_int    = pcm_read_bes2i ;
+					psf->read_float  = pcm_read_bes2f ;
+					psf->read_double = pcm_read_bes2d ;
+					break ;
+			case  (3 * 0x10000 + SF_ENDIAN_BIG) :
+					psf->read_short  = pcm_read_bet2s ;
+					psf->read_int    = pcm_read_bet2i ;
+					psf->read_float  = pcm_read_bet2f ;
+					psf->read_double = pcm_read_bet2d ;
+					break ;
+			case  (4 * 0x10000 + SF_ENDIAN_BIG) :
+					psf->read_short  = pcm_read_bei2s ;
+					psf->read_int    = pcm_read_bei2i ;
+					psf->read_float  = pcm_read_bei2f ;
+					psf->read_double = pcm_read_bei2d ;
+					break ;
+					
+			case  (2 * 0x10000 + SF_ENDIAN_LITTLE) :
+					psf->read_short  = pcm_read_les2s ;
+					psf->read_int    = pcm_read_les2i ;
+					psf->read_float  = pcm_read_les2f ;
+					psf->read_double = pcm_read_les2d ;
+					break ;
+			case  (3 * 0x10000 + SF_ENDIAN_LITTLE) :
+					psf->read_short  = pcm_read_let2s ;
+					psf->read_int    = pcm_read_let2i ;
+					psf->read_float  = pcm_read_let2f ;
+					psf->read_double = pcm_read_let2d ;
+					break ;
+			case  (4 * 0x10000 + SF_ENDIAN_LITTLE) :
+					psf->read_short  = pcm_read_lei2s ;
+					psf->read_int    = pcm_read_lei2i ;
+					psf->read_float  = pcm_read_lei2f ;
+					psf->read_double = pcm_read_lei2d ;
+					break ;
+			default : return SFE_UNIMPLEMENTED ;
+			} ;
 		} ;
-		
-	switch (psf->bytewidth * 0x10000 + psf->endian)
-	{	case  (2 * 0x10000 + SF_ENDIAN_BIG) :
-				psf->read_short  = (func_short)  pcm_read_bes2s ;
-				psf->read_int    = (func_int)    pcm_read_bes2i ;
-				psf->read_float  = (func_float)  pcm_read_bes2f ;
-				psf->read_double = (func_double) pcm_read_bes2d ;
-				break ;
-		case  (3 * 0x10000 + SF_ENDIAN_BIG) :
-				psf->read_short  = (func_short)  pcm_read_bet2s ;
-				psf->read_int    = (func_int)    pcm_read_bet2i ;
-				psf->read_float  = (func_float)  pcm_read_bet2f ;
-				psf->read_double = (func_double) pcm_read_bet2d ;
-				break ;
-		case  (4 * 0x10000 + SF_ENDIAN_BIG) :
-				psf->read_short  = (func_short)  pcm_read_bei2s ;
-				psf->read_int    = (func_int)    pcm_read_bei2i ;
-				psf->read_float  = (func_float)  pcm_read_bei2f ;
-				psf->read_double = (func_double) pcm_read_bei2d ;
-				break ;
-				
-		case  (2 * 0x10000 + SF_ENDIAN_LITTLE) :
-				psf->read_short  = (func_short)  pcm_read_les2s ;
-				psf->read_int    = (func_int)    pcm_read_les2i ;
-				psf->read_float  = (func_float)  pcm_read_les2f ;
-				psf->read_double = (func_double) pcm_read_les2d ;
-				break ;
-		case  (3 * 0x10000 + SF_ENDIAN_LITTLE) :
-				psf->read_short  = (func_short)  pcm_read_let2s ;
-				psf->read_int    = (func_int)    pcm_read_let2i ;
-				psf->read_float  = (func_float)  pcm_read_let2f ;
-				psf->read_double = (func_double) pcm_read_let2d ;
-				break ;
-		case  (4 * 0x10000 + SF_ENDIAN_LITTLE) :
-				psf->read_short  = (func_short)  pcm_read_lei2s ;
-				psf->read_int    = (func_int)    pcm_read_lei2i ;
-				psf->read_float  = (func_float)  pcm_read_lei2f ;
-				psf->read_double = (func_double) pcm_read_lei2d ;
-				break ;
-		default : return SFE_UNIMPLEMENTED ;
-		} ;
 
-	return 0 ;
-} /* pcm_read_init */
-
-int
-pcm_write_init (SF_PRIVATE *psf)
-{
-	if (psf->bytewidth == 1 && psf->chars == SF_CHARS_SIGNED)
-	{	psf->write_short  = (func_short)  pcm_write_s2sc ;
-		psf->write_int    = (func_int)    pcm_write_i2sc ;
-		psf->write_float  = (func_float)  pcm_write_f2sc ;
-		psf->write_double = (func_double) pcm_write_d2sc ;
-		return 0 ;
-		} 
-	else if (psf->bytewidth == 1 && psf->chars == SF_CHARS_UNSIGNED)
-	{	psf->write_short  = (func_short)  pcm_write_s2uc ;
-		psf->write_int    = (func_int)    pcm_write_i2uc ;
-		psf->write_float  = (func_float)  pcm_write_f2uc ;
-		psf->write_double = (func_double) pcm_write_d2uc ;
-		return 0 ;
+	if (psf->mode == SFM_WRITE || psf->mode == SFM_RDWR)
+	{	switch (psf->bytewidth * 0x10000 + psf->endian + psf->chars)
+		{	case (0x10000 + SF_ENDIAN_BIG + SF_CHARS_SIGNED) :
+			case (0x10000 + SF_ENDIAN_LITTLE + SF_CHARS_SIGNED) :
+					psf->write_short  = pcm_write_s2sc ;
+					psf->write_int    = pcm_write_i2sc ;
+					psf->write_float  = pcm_write_f2sc ;
+					psf->write_double = pcm_write_d2sc ;
+					break ;
+			case (0x10000 + SF_ENDIAN_BIG + SF_CHARS_UNSIGNED) :
+			case (0x10000 + SF_ENDIAN_LITTLE + SF_CHARS_UNSIGNED) :
+					psf->write_short  = pcm_write_s2uc ;
+					psf->write_int    = pcm_write_i2uc ;
+					psf->write_float  = pcm_write_f2uc ;
+					psf->write_double = pcm_write_d2uc ;
+					break ;
+	
+			case  (2 * 0x10000 + SF_ENDIAN_BIG) :
+					psf->write_short  = pcm_write_s2bes ;
+					psf->write_int    = pcm_write_i2bes ;
+					psf->write_float  = pcm_write_f2bes ;
+					psf->write_double = pcm_write_d2bes ;
+					break ;
+					
+			case  (3 * 0x10000 + SF_ENDIAN_BIG) :
+					psf->write_short  = pcm_write_s2bet ;
+					psf->write_int    = pcm_write_i2bet ;
+					psf->write_float  = pcm_write_f2bet ;
+					psf->write_double = pcm_write_d2bet ;
+					break ;
+					
+			case  (4 * 0x10000 + SF_ENDIAN_BIG) :
+					psf->write_short  = pcm_write_s2bei ;
+					psf->write_int    = pcm_write_i2bei ;
+					psf->write_float  = pcm_write_f2bei ;
+					psf->write_double = pcm_write_d2bei ;
+					break ;
+					
+			case  (2 * 0x10000 + SF_ENDIAN_LITTLE) :
+					psf->write_short  = pcm_write_s2les ;
+					psf->write_int    = pcm_write_i2les ;
+					psf->write_float  = pcm_write_f2les ;
+					psf->write_double = pcm_write_d2les ;
+					break ;
+					
+			case  (3 * 0x10000 + SF_ENDIAN_LITTLE) :
+					psf->write_short  = pcm_write_s2let ;
+					psf->write_int    = pcm_write_i2let ;
+					psf->write_float  = pcm_write_f2let ;
+					psf->write_double = pcm_write_d2let ;
+					break ;
+					
+			case  (4 * 0x10000 + SF_ENDIAN_LITTLE) :
+					psf->write_short  = pcm_write_s2lei ;
+					psf->write_int    = pcm_write_i2lei ;
+					psf->write_float  = pcm_write_f2lei ;
+					psf->write_double = pcm_write_d2lei ;
+					break ;
+					
+			default : return SFE_UNIMPLEMENTED ;
+			} ;
+			
 		} ;
-		
-	switch (psf->bytewidth * 0x10000 + psf->endian)
-	{	case  (2 * 0x10000 + SF_ENDIAN_BIG) :
-				psf->write_short  = (func_short)  pcm_write_s2bes ;
-				psf->write_int    = (func_int)    pcm_write_i2bes ;
-				psf->write_float  = (func_float)  pcm_write_f2bes ;
-				psf->write_double = (func_double) pcm_write_d2bes ;
-				break ;
-				
-		case  (3 * 0x10000 + SF_ENDIAN_BIG) :
-				psf->write_short  = (func_short)  pcm_write_s2bet ;
-				psf->write_int    = (func_int)    pcm_write_i2bet ;
-				psf->write_float  = (func_float)  pcm_write_f2bet ;
-				psf->write_double = (func_double) pcm_write_d2bet ;
-				break ;
-				
-		case  (4 * 0x10000 + SF_ENDIAN_BIG) :
-				psf->write_short  = (func_short)  pcm_write_s2bei ;
-				psf->write_int    = (func_int)    pcm_write_i2bei ;
-				psf->write_float  = (func_float)  pcm_write_f2bei ;
-				psf->write_double = (func_double) pcm_write_d2bei ;
-				break ;
-				
-		case  (2 * 0x10000 + SF_ENDIAN_LITTLE) :
-				psf->write_short  = (func_short)  pcm_write_s2les ;
-				psf->write_int    = (func_int)    pcm_write_i2les ;
-				psf->write_float  = (func_float)  pcm_write_f2les ;
-				psf->write_double = (func_double) pcm_write_d2les ;
-				break ;
-				
-		case  (3 * 0x10000 + SF_ENDIAN_LITTLE) :
-				psf->write_short  = (func_short)  pcm_write_s2let ;
-				psf->write_int    = (func_int)    pcm_write_i2let ;
-				psf->write_float  = (func_float)  pcm_write_f2let ;
-				psf->write_double = (func_double) pcm_write_d2let ;
-				break ;
-				
-		case  (4 * 0x10000 + SF_ENDIAN_LITTLE) :
-				psf->write_short  = (func_short)  pcm_write_s2lei ;
-				psf->write_int    = (func_int)    pcm_write_i2lei ;
-				psf->write_float  = (func_float)  pcm_write_f2lei ;
-				psf->write_double = (func_double) pcm_write_d2lei ;
-				break ;
-				
-		default : return SFE_UNIMPLEMENTED ;
-		} ;
 
+	psf->filelength = psf_get_filelen (psf->filedes) ;
+	psf->datalength = (psf->dataend) ? psf->dataend - psf->dataoffset : 
+							psf->filelength - psf->dataoffset ;
+	psf->sf.samples = psf->datalength / psf->blockwidth ;
+
 	return 0 ;
-} /* pcm_read_init */
+} /* pcm_init */
 
-
 /*-----------------------------------------------------------------------------------------------
 */
 
-static int		
-pcm_read_sc2s (SF_PRIVATE *psf, short *ptr, int len)
+static sf_count_t		
+pcm_read_sc2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
 {	unsigned int readcount, thisread ;
-	int		bytecount, bufferlen ;
+	sf_count_t	bytecount, bufferlen ;
 	int		index = 0, total = 0 ;
 
 	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
@@ -317,8 +323,8 @@
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
-		sc2s_array ((signed char*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
+		thisread = psf_fread (psf->buffer, 1, readcount, psf->filedes) ;
+		sc2s_array ((signed char*) (psf->buffer), thisread / psf->bytewidth, ptr + index) ;
 		total += thisread ;
 		if (thisread < readcount)
 			break ;
@@ -333,10 +339,10 @@
 	return total ;
 } /* pcm_read_sc2s */
 
-static int
-pcm_read_uc2s (SF_PRIVATE *psf, short *ptr, int len)
+static sf_count_t
+pcm_read_uc2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
 {	unsigned int readcount, thisread ;
-	int		bytecount, bufferlen ;
+	sf_count_t	bytecount, bufferlen ;
 	int		index = 0, total = 0 ;
 
 	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
@@ -343,8 +349,8 @@
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
-		uc2s_array ((unsigned char*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
+		thisread = psf_fread (psf->buffer, 1, readcount, psf->filedes) ;
+		uc2s_array ((unsigned char*) (psf->buffer), thisread / psf->bytewidth, ptr + index) ;
 		total += thisread ;
 		if (thisread < readcount)
 			break ;
@@ -359,13 +365,13 @@
 	return total ;
 } /* pcm_read_uc2s */
 
-static int
-pcm_read_bes2s (SF_PRIVATE *psf, short *ptr, int len)
+static sf_count_t
+pcm_read_bes2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
 {	int		total ;
 
-	total = fread (ptr, 1, len * sizeof (short), psf->file) ;
+	total = psf_fread (ptr, 1, len * sizeof (short), psf->filedes) ;
 	if (CPU_IS_LITTLE_ENDIAN)
-		endswap_short_array	(ptr, len) ;
+		endswap_short_array (ptr, len) ;
 
 	total /= psf->bytewidth ;
 	if (total < len)
@@ -374,13 +380,13 @@
 	return total ;
 } /* pcm_read_bes2s */
 
-static int
-pcm_read_les2s (SF_PRIVATE *psf, short *ptr, int len)
+static sf_count_t
+pcm_read_les2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
 {	int		total ;
 
-	total = fread (ptr, 1, len * sizeof (short), psf->file) ;
+	total = psf_fread (ptr, 1, len * sizeof (short), psf->filedes) ;
 	if (CPU_IS_BIG_ENDIAN)
-		endswap_short_array	(ptr, len) ;
+		endswap_short_array (ptr, len) ;
 
 	total /= psf->bytewidth ;
 	if (total < len)
@@ -389,10 +395,10 @@
 	return total ;
 } /* pcm_read_les2s */
 
-static int
-pcm_read_bet2s (SF_PRIVATE *psf, short *ptr, int len)
+static sf_count_t
+pcm_read_bet2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
 {	unsigned int readcount, thisread ;
-	int		bytecount, bufferlen ;
+	sf_count_t	bytecount, bufferlen ;
 	int		index = 0, total = 0 ;
 
 	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
@@ -399,8 +405,8 @@
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
-		bet2s_array ((tribyte*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
+		thisread = psf_fread (psf->buffer, 1, readcount, psf->filedes) ;
+		bet2s_array ((tribyte*) (psf->buffer), thisread / psf->bytewidth, ptr + index) ;
 		total += thisread ;
 		if (thisread < readcount)
 			break ;
@@ -415,10 +421,10 @@
 	return total ;
 } /* pcm_read_bet2s */
 
-static int
-pcm_read_let2s (SF_PRIVATE *psf, short *ptr, int len)
+static sf_count_t
+pcm_read_let2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
 {	unsigned int readcount, thisread ;
-	int		bytecount, bufferlen ;
+	sf_count_t	bytecount, bufferlen ;
 	int		index = 0, total = 0 ;
 
 	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
@@ -425,8 +431,8 @@
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
-		let2s_array ((tribyte*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
+		thisread = psf_fread (psf->buffer, 1, readcount, psf->filedes) ;
+		let2s_array ((tribyte*) (psf->buffer), thisread / psf->bytewidth, ptr + index) ;
 		total += thisread ;
 		if (thisread < readcount)
 			break ;
@@ -441,10 +447,10 @@
 	return total ;
 } /* pcm_read_let2s */
 
-static int
-pcm_read_bei2s (SF_PRIVATE *psf, short *ptr, int len)
+static sf_count_t
+pcm_read_bei2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
 {	unsigned int readcount, thisread ;
-	int		bytecount, bufferlen ;
+	sf_count_t	bytecount, bufferlen ;
 	int		index = 0, total = 0 ;
 
 	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
@@ -451,8 +457,8 @@
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
-		bei2s_array ((int*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
+		thisread = psf_fread (psf->buffer, 1, readcount, psf->filedes) ;
+		bei2s_array ((int*) (psf->buffer), thisread / psf->bytewidth, ptr + index) ;
 		total += thisread ;
 		if (thisread < readcount)
 			break ;
@@ -467,10 +473,10 @@
 	return total ;
 } /* pcm_read_bei2s */
 
-static int
-pcm_read_lei2s (SF_PRIVATE *psf, short *ptr, int len)
+static sf_count_t
+pcm_read_lei2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
 {	unsigned int readcount, thisread ;
-	int		bytecount, bufferlen ;
+	sf_count_t	bytecount, bufferlen ;
 	int		index = 0, total = 0 ;
 
 	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
@@ -477,8 +483,8 @@
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
-		lei2s_array ((int*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
+		thisread = psf_fread (psf->buffer, 1, readcount, psf->filedes) ;
+		lei2s_array ((int*) (psf->buffer), thisread / psf->bytewidth, ptr + index) ;
 		total += thisread ;
 		if (thisread < readcount)
 			break ;
@@ -496,10 +502,10 @@
 /*-----------------------------------------------------------------------------------------------
 */
 
-static int
-pcm_read_sc2i (SF_PRIVATE *psf, int *ptr, int len)
+static sf_count_t
+pcm_read_sc2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
 {	unsigned int readcount, thisread ;
-	int		bytecount, bufferlen ;
+	sf_count_t	bytecount, bufferlen ;
 	int		index = 0, total = 0 ;
 
 	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
@@ -506,8 +512,8 @@
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
-		sc2i_array ((signed char*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
+		thisread = psf_fread (psf->buffer, 1, readcount, psf->filedes) ;
+		sc2i_array ((signed char*) (psf->buffer), thisread / psf->bytewidth, ptr + index) ;
 		total += thisread ;
 		if (thisread < readcount)
 			break ;
@@ -522,10 +528,10 @@
 	return total ;
 } /* pcm_read_sc2i */
 
-static int
-pcm_read_uc2i (SF_PRIVATE *psf, int *ptr, int len)
+static sf_count_t
+pcm_read_uc2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
 {	unsigned int readcount, thisread ;
-	int		bytecount, bufferlen ;
+	sf_count_t	bytecount, bufferlen ;
 	int		index = 0, total = 0 ;
 
 	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
@@ -532,8 +538,8 @@
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
-		uc2i_array ((unsigned char*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
+		thisread = psf_fread (psf->buffer, 1, readcount, psf->filedes) ;
+		uc2i_array ((unsigned char*) (psf->buffer), thisread / psf->bytewidth, ptr + index) ;
 		total += thisread ;
 		if (thisread < readcount)
 			break ;
@@ -548,10 +554,10 @@
 	return total ;
 } /* pcm_read_uc2i */
 
-static int
-pcm_read_bes2i (SF_PRIVATE *psf, int *ptr, int len)
+static sf_count_t
+pcm_read_bes2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
 {	unsigned int readcount, thisread ;
-	int		bytecount, bufferlen ;
+	sf_count_t	bytecount, bufferlen ;
 	int		index = 0, total = 0 ;
 
 	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
@@ -558,8 +564,8 @@
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
-		bes2i_array ((short*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
+		thisread = psf_fread (psf->buffer, 1, readcount, psf->filedes) ;
+		bes2i_array ((short*) (psf->buffer), thisread / psf->bytewidth, ptr + index) ;
 		total += thisread ;
 		if (thisread < readcount)
 			break ;
@@ -574,10 +580,10 @@
 	return total ;
 } /* pcm_read_bes2i */
 
-static int
-pcm_read_les2i (SF_PRIVATE *psf, int *ptr, int len)
+static sf_count_t
+pcm_read_les2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
 {	unsigned int readcount, thisread ;
-	int		bytecount, bufferlen ;
+	sf_count_t	bytecount, bufferlen ;
 	int		index = 0, total = 0 ;
 
 	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
@@ -584,8 +590,8 @@
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
-		les2i_array ((short*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
+		thisread = psf_fread (psf->buffer, 1, readcount, psf->filedes) ;
+		les2i_array ((short*) (psf->buffer), thisread / psf->bytewidth, ptr + index) ;
 		total += thisread ;
 		if (thisread < readcount)
 			break ;
@@ -600,10 +606,10 @@
 	return total ;
 } /* pcm_read_les2i */
 
-static int
-pcm_read_bet2i (SF_PRIVATE *psf, int *ptr, int len)
+static sf_count_t
+pcm_read_bet2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
 {	unsigned int readcount, thisread ;
-	int		bytecount, bufferlen ;
+	sf_count_t	bytecount, bufferlen ;
 	int		index = 0, total = 0 ;
 
 	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
@@ -610,8 +616,8 @@
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
-		bet2i_array ((tribyte*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
+		thisread = psf_fread (psf->buffer, 1, readcount, psf->filedes) ;
+		bet2i_array ((tribyte*) (psf->buffer), thisread / psf->bytewidth, ptr + index) ;
 		total += thisread ;
 		if (thisread < readcount)
 			break ;
@@ -626,10 +632,10 @@
 	return total ;
 } /* pcm_read_bet2i */
 
-static int
-pcm_read_let2i (SF_PRIVATE *psf, int *ptr, int len)
+static sf_count_t
+pcm_read_let2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
 {	unsigned int readcount, thisread ;
-	int		bytecount, bufferlen ;
+	sf_count_t	bytecount, bufferlen ;
 	int		index = 0, total = 0 ;
 
 	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
@@ -636,8 +642,8 @@
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
-		let2i_array ((tribyte*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
+		thisread = psf_fread (psf->buffer, 1, readcount, psf->filedes) ;
+		let2i_array ((tribyte*) (psf->buffer), thisread / psf->bytewidth, ptr + index) ;
 		total += thisread ;
 		if (thisread < readcount)
 			break ;
@@ -652,11 +658,11 @@
 	return total ;
 } /* pcm_read_let2i */
 
-static int
-pcm_read_bei2i (SF_PRIVATE *psf, int *ptr, int len)
+static sf_count_t
+pcm_read_bei2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
 {	int		total ;
 
-	total = fread (ptr, 1, len * sizeof (int), psf->file) ;
+	total = psf_fread (ptr, 1, len * sizeof (int), psf->filedes) ;
 	if (CPU_IS_LITTLE_ENDIAN)
 		endswap_int_array	(ptr, len) ;
 
@@ -667,11 +673,11 @@
 	return total ;
 } /* pcm_read_bei2i */
 
-static int
-pcm_read_lei2i (SF_PRIVATE *psf, int *ptr, int len)
+static sf_count_t
+pcm_read_lei2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
 {	int		total ;
 
-	total = fread (ptr, 1, len * sizeof (int), psf->file) ;
+	total = psf_fread (ptr, 1, len * sizeof (int), psf->filedes) ;
 	if (CPU_IS_BIG_ENDIAN)
 		endswap_int_array	(ptr, len) ;
 
@@ -685,10 +691,10 @@
 /*-----------------------------------------------------------------------------------------------
 */
 
-static int
-pcm_read_sc2f (SF_PRIVATE *psf, float *ptr, int len)
+static sf_count_t
+pcm_read_sc2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
 {	unsigned int readcount, thisread ;
-	int		bytecount, bufferlen ;
+	sf_count_t	bytecount, bufferlen ;
 	int		index = 0, total = 0 ;
 	float	normfact ;
 
@@ -698,8 +704,8 @@
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
-		sc2f_array ((signed char*) (psf->buffer), thisread / psf->bytewidth, ptr, index, normfact) ;
+		thisread = psf_fread (psf->buffer, 1, readcount, psf->filedes) ;
+		sc2f_array ((signed char*) (psf->buffer), thisread / psf->bytewidth, ptr + index, normfact) ;
 		total += thisread ;
 		if (thisread < readcount)
 			break ;
@@ -714,10 +720,10 @@
 	return total ;
 } /* pcm_read_sc2f */
 
-static int
-pcm_read_uc2f (SF_PRIVATE *psf, float *ptr, int len)
+static sf_count_t
+pcm_read_uc2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
 {	unsigned int readcount, thisread ;
-	int		bytecount, bufferlen ;
+	sf_count_t	bytecount, bufferlen ;
 	int		index = 0, total = 0 ;
 	float	normfact ;
 
@@ -727,8 +733,8 @@
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
-		uc2f_array ((unsigned char*) (psf->buffer), thisread / psf->bytewidth, ptr, index, normfact) ;
+		thisread = psf_fread (psf->buffer, 1, readcount, psf->filedes) ;
+		uc2f_array ((unsigned char*) (psf->buffer), thisread / psf->bytewidth, ptr + index, normfact) ;
 		total += thisread ;
 		if (thisread < readcount)
 			break ;
@@ -743,10 +749,10 @@
 	return total ;
 } /* pcm_read_uc2f */
 
-static int
-pcm_read_bes2f (SF_PRIVATE *psf, float *ptr, int len)
+static sf_count_t
+pcm_read_bes2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
 {	unsigned int readcount, thisread ;
-	int		bytecount, bufferlen ;
+	sf_count_t	bytecount, bufferlen ;
 	int		index = 0, total = 0 ;
 	float	normfact ;
 
@@ -756,8 +762,8 @@
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
-		bes2f_array ((short*) (psf->buffer), thisread / psf->bytewidth, ptr, index, normfact) ;
+		thisread = psf_fread (psf->buffer, 1, readcount, psf->filedes) ;
+		bes2f_array ((short*) (psf->buffer), thisread / psf->bytewidth, ptr + index, normfact) ;
 		total += thisread ;
 		if (thisread < readcount)
 			break ;
@@ -772,10 +778,10 @@
 	return total ;
 } /* pcm_read_bes2f */
 
-static int
-pcm_read_les2f (SF_PRIVATE *psf, float *ptr, int len)
+static sf_count_t
+pcm_read_les2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
 {	unsigned int readcount, thisread ;
-	int		bytecount, bufferlen ;
+	sf_count_t	bytecount, bufferlen ;
 	int		index = 0, total = 0 ;
 	float	normfact ;
 
@@ -785,8 +791,8 @@
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
-		les2f_array ((short*) (psf->buffer), thisread / psf->bytewidth, ptr, index, normfact) ;
+		thisread = psf_fread (psf->buffer, 1, readcount, psf->filedes) ;
+		les2f_array ((short*) (psf->buffer), thisread / psf->bytewidth, ptr + index, normfact) ;
 		total += thisread ;
 		if (thisread < readcount)
 			break ;
@@ -801,10 +807,10 @@
 	return total ;
 } /* pcm_read_les2f */
 
-static int
-pcm_read_bet2f (SF_PRIVATE *psf, float *ptr, int len)
+static sf_count_t
+pcm_read_bet2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
 {	unsigned int readcount, thisread ;
-	int		bytecount, bufferlen ;
+	sf_count_t	bytecount, bufferlen ;
 	int		index = 0, total = 0 ;
 	float	normfact ;
 
@@ -814,8 +820,8 @@
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
-		bet2f_array ((tribyte*) (psf->buffer), thisread / psf->bytewidth, ptr, index, normfact) ;
+		thisread = psf_fread (psf->buffer, 1, readcount, psf->filedes) ;
+		bet2f_array ((tribyte*) (psf->buffer), thisread / psf->bytewidth, ptr + index, normfact) ;
 		total += thisread ;
 		if (thisread < readcount)
 			break ;
@@ -830,10 +836,10 @@
 	return total ;
 } /* pcm_read_bet2f */
 
-static int
-pcm_read_let2f (SF_PRIVATE *psf, float *ptr, int len)
+static sf_count_t
+pcm_read_let2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
 {	unsigned int readcount, thisread ;
-	int		bytecount, bufferlen ;
+	sf_count_t	bytecount, bufferlen ;
 	int		index = 0, total = 0 ;
 	float	normfact ;
 
@@ -843,8 +849,8 @@
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
-		let2f_array ((tribyte*) (psf->buffer), thisread / psf->bytewidth, ptr, index, normfact) ;
+		thisread = psf_fread (psf->buffer, 1, readcount, psf->filedes) ;
+		let2f_array ((tribyte*) (psf->buffer), thisread / psf->bytewidth, ptr + index, normfact) ;
 		total += thisread ;
 		if (thisread < readcount)
 			break ;
@@ -859,10 +865,10 @@
 	return total ;
 } /* pcm_read_let2f */
 
-static int
-pcm_read_bei2f (SF_PRIVATE *psf, float *ptr, int len)
+static sf_count_t
+pcm_read_bei2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
 {	unsigned int readcount, thisread ;
-	int		bytecount, bufferlen ;
+	sf_count_t	bytecount, bufferlen ;
 	int		index = 0, total = 0 ;
 	float	normfact ;
 
@@ -872,8 +878,8 @@
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
-		bei2f_array ((int*) (psf->buffer), thisread / psf->bytewidth, ptr, index, normfact) ;
+		thisread = psf_fread (psf->buffer, 1, readcount, psf->filedes) ;
+		bei2f_array ((int*) (psf->buffer), thisread / psf->bytewidth, ptr + index, normfact) ;
 		total += thisread ;
 		if (thisread < readcount)
 			break ;
@@ -888,10 +894,10 @@
 	return total ;
 } /* pcm_read_bei2f */
 
-static int
-pcm_read_lei2f (SF_PRIVATE *psf, float *ptr, int len)
+static sf_count_t
+pcm_read_lei2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
 {	unsigned int readcount, thisread ;
-	int		bytecount, bufferlen ;
+	sf_count_t	bytecount, bufferlen ;
 	int		index = 0, total = 0 ;
 	float	normfact ;
 
@@ -901,8 +907,8 @@
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
-		lei2f_array ((int*) (psf->buffer), thisread / psf->bytewidth, ptr, index, normfact) ;
+		thisread = psf_fread (psf->buffer, 1, readcount, psf->filedes) ;
+		lei2f_array ((int*) (psf->buffer), thisread / psf->bytewidth, ptr + index, normfact) ;
 		total += thisread ;
 		if (thisread < readcount)
 			break ;
@@ -920,21 +926,21 @@
 /*-----------------------------------------------------------------------------------------------
 */
 
-static int
-pcm_read_sc2d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+static sf_count_t
+pcm_read_sc2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
 {	unsigned int readcount, thisread ;
-	int		bytecount, bufferlen ;
+	sf_count_t	bytecount, bufferlen ;
 	int		index = 0, total = 0 ;
 	double		normfact ;
 
-	normfact = (normalize ? 1.0 / ((double) 0x80) : 1.0) ;
+	normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x80) : 1.0 ;
 
 	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
-		sc2d_array ((signed char*) (psf->buffer), thisread / psf->bytewidth, ptr, index, normfact) ;
+		thisread = psf_fread (psf->buffer, 1, readcount, psf->filedes) ;
+		sc2d_array ((signed char*) (psf->buffer), thisread / psf->bytewidth, ptr + index, normfact) ;
 		total += thisread ;
 		if (thisread < readcount)
 			break ;
@@ -949,21 +955,21 @@
 	return total ;
 } /* pcm_read_sc2d */
 
-static int
-pcm_read_uc2d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+static sf_count_t
+pcm_read_uc2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
 {	unsigned int readcount, thisread ;
-	int		bytecount, bufferlen ;
+	sf_count_t	bytecount, bufferlen ;
 	int		index = 0, total = 0 ;
 	double		normfact ;
 
-	normfact = (normalize ? 1.0 / ((double) 0x80) : 1.0) ;
+	normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x80) : 1.0 ;
 
 	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
-		uc2d_array ((unsigned char*) (psf->buffer), thisread / psf->bytewidth, ptr, index, normfact) ;
+		thisread = psf_fread (psf->buffer, 1, readcount, psf->filedes) ;
+		uc2d_array ((unsigned char*) (psf->buffer), thisread / psf->bytewidth, ptr + index, normfact) ;
 		total += thisread ;
 		if (thisread < readcount)
 			break ;
@@ -978,21 +984,21 @@
 	return total ;
 } /* pcm_read_uc2d */
 
-static int
-pcm_read_bes2d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+static sf_count_t
+pcm_read_bes2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
 {	unsigned int readcount, thisread ;
-	int		bytecount, bufferlen ;
+	sf_count_t	bytecount, bufferlen ;
 	int		index = 0, total = 0 ;
 	double		normfact ;
 
-	normfact = (normalize ? 1.0 / ((double) 0x8000) : 1.0) ;
+	normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x8000) : 1.0 ;
 
 	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
-		bes2d_array ((short*) (psf->buffer), thisread / psf->bytewidth, ptr, index, normfact) ;
+		thisread = psf_fread (psf->buffer, 1, readcount, psf->filedes) ;
+		bes2d_array ((short*) (psf->buffer), thisread / psf->bytewidth, ptr + index, normfact) ;
 		total += thisread ;
 		if (thisread < readcount)
 			break ;
@@ -1007,21 +1013,21 @@
 	return total ;
 } /* pcm_read_bes2d */
 
-static int
-pcm_read_les2d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+static sf_count_t
+pcm_read_les2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
 {	unsigned int readcount, thisread ;
-	int		bytecount, bufferlen ;
+	sf_count_t	bytecount, bufferlen ;
 	int		index = 0, total = 0 ;
 	double		normfact ;
 
-	normfact = (normalize ? 1.0 / ((double) 0x8000) : 1.0) ;
+	normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x8000) : 1.0 ;
 
 	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
-		les2d_array ((short*) (psf->buffer), thisread / psf->bytewidth, ptr, index, normfact) ;
+		thisread = psf_fread (psf->buffer, 1, readcount, psf->filedes) ;
+		les2d_array ((short*) (psf->buffer), thisread / psf->bytewidth, ptr + index, normfact) ;
 		total += thisread ;
 		if (thisread < readcount)
 			break ;
@@ -1036,21 +1042,21 @@
 	return total ;
 } /* pcm_read_les2d */
 
-static int
-pcm_read_bet2d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+static sf_count_t
+pcm_read_bet2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
 {	unsigned int readcount, thisread ;
-	int		bytecount, bufferlen ;
+	sf_count_t	bytecount, bufferlen ;
 	int		index = 0, total = 0 ;
 	double		normfact ;
 
-	normfact = (normalize ? 1.0 / ((double) 0x800000) : 1.0) ;
+	normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x800000) : 1.0 ;
 
 	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
-		bet2d_array ((tribyte*) (psf->buffer), thisread / psf->bytewidth, ptr, index, normfact) ;
+		thisread = psf_fread (psf->buffer, 1, readcount, psf->filedes) ;
+		bet2d_array ((tribyte*) (psf->buffer), thisread / psf->bytewidth, ptr + index, normfact) ;
 		total += thisread ;
 		if (thisread < readcount)
 			break ;
@@ -1065,21 +1071,21 @@
 	return total ;
 } /* pcm_read_bet2d */
 
-static int
-pcm_read_let2d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+static sf_count_t
+pcm_read_let2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
 {	unsigned int readcount, thisread ;
-	int		bytecount, bufferlen ;
+	sf_count_t	bytecount, bufferlen ;
 	int		index = 0, total = 0 ;
 	double		normfact ;
 
-	normfact = (normalize ? 1.0 / ((double) 0x800000) : 1.0) ;
+	normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x800000) : 1.0 ;
 
 	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
-		let2d_array ((tribyte*) (psf->buffer), thisread / psf->bytewidth, ptr, index, normfact) ;
+		thisread = psf_fread (psf->buffer, 1, readcount, psf->filedes) ;
+		let2d_array ((tribyte*) (psf->buffer), thisread / psf->bytewidth, ptr + index, normfact) ;
 		total += thisread ;
 		if (thisread < readcount)
 			break ;
@@ -1094,21 +1100,21 @@
 	return total ;
 } /* pcm_read_let2d */
 
-static int
-pcm_read_bei2d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+static sf_count_t
+pcm_read_bei2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
 {	unsigned int readcount, thisread ;
-	int		bytecount, bufferlen ;
+	sf_count_t	bytecount, bufferlen ;
 	int		index = 0, total = 0 ;
 	double		normfact ;
 
-	normfact = (normalize ? 1.0 / ((double) 0x80000000) : 1.0) ;
+	normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x80000000) : 1.0 ;
 
 	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
-		bei2d_array ((int*) (psf->buffer), thisread / psf->bytewidth, ptr, index, normfact) ;
+		thisread = psf_fread (psf->buffer, 1, readcount, psf->filedes) ;
+		bei2d_array ((int*) (psf->buffer), thisread / psf->bytewidth, ptr + index, normfact) ;
 		total += thisread ;
 		if (thisread < readcount)
 			break ;
@@ -1123,21 +1129,21 @@
 	return total ;
 } /* pcm_read_bei2d */
 
-static int
-pcm_read_lei2d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+static sf_count_t
+pcm_read_lei2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
 {	unsigned int readcount, thisread ;
-	int		bytecount, bufferlen ;
+	sf_count_t	bytecount, bufferlen ;
 	int		index = 0, total = 0 ;
 	double		normfact ;
 
-	normfact = (normalize ? 1.0 / ((double) 0x80000000) : 1.0) ;
+	normfact = (psf->norm_double == SF_TRUE) ? 1.0 / ((double) 0x80000000) : 1.0 ;
 
 	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
-		lei2d_array ((int*) (psf->buffer), thisread / psf->bytewidth, ptr, index, normfact) ;
+		thisread = psf_fread (psf->buffer, 1, readcount, psf->filedes) ;
+		lei2d_array ((int*) (psf->buffer), thisread / psf->bytewidth, ptr + index, normfact) ;
 		total += thisread ;
 		if (thisread < readcount)
 			break ;
@@ -1157,10 +1163,10 @@
 **===============================================================================================
 */
 
-static int
-pcm_write_s2sc	(SF_PRIVATE *psf, short *ptr, int len)
-{	unsigned int	writecount, thiswrite ;
-	int	bytecount, bufferlen ;
+static sf_count_t
+pcm_write_s2sc	(SF_PRIVATE *psf, short *ptr, sf_count_t len)
+{	sf_count_t	writecount, thiswrite ;
+	sf_count_t	bytecount, bufferlen ;
 	int		index = 0, total = 0 ;
 
 	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
@@ -1167,8 +1173,8 @@
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		s2sc_array (ptr, index, (signed char*) (psf->buffer), writecount / psf->bytewidth) ;
-		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		s2sc_array (ptr + index, (signed char*) (psf->buffer), writecount / psf->bytewidth) ;
+		thiswrite = psf_fwrite (psf->buffer, 1, writecount, psf->filedes) ;
 		total += thiswrite ;
 		if (thiswrite < writecount)
 			break ;
@@ -1183,10 +1189,10 @@
 	return total ;
 } /* pcm_write_s2sc */
 
-static int
-pcm_write_s2uc	(SF_PRIVATE *psf, short *ptr, int len)
-{	unsigned int	writecount, thiswrite ;
-	int	bytecount, bufferlen ;
+static sf_count_t
+pcm_write_s2uc	(SF_PRIVATE *psf, short *ptr, sf_count_t len)
+{	sf_count_t	writecount, thiswrite ;
+	sf_count_t	bytecount, bufferlen ;
 	int		index = 0, total = 0 ;
 
 	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
@@ -1193,8 +1199,8 @@
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		s2uc_array (ptr, index, (unsigned char*) (psf->buffer), writecount / psf->bytewidth) ;
-		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		s2uc_array (ptr + index, (unsigned char*) (psf->buffer), writecount / psf->bytewidth) ;
+		thiswrite = psf_fwrite (psf->buffer, 1, writecount, psf->filedes) ;
 		total += thiswrite ;
 		if (thiswrite < writecount)
 			break ;
@@ -1209,13 +1215,13 @@
 	return total ;
 } /* pcm_write_s2uc */
 
-static int
-pcm_write_s2bes	(SF_PRIVATE *psf, short *ptr, int len)
+static sf_count_t
+pcm_write_s2bes	(SF_PRIVATE *psf, short *ptr, sf_count_t len)
 {	int		total ;
 
 	if (CPU_IS_LITTLE_ENDIAN)
 		endswap_short_array (ptr, len) ;
-	total = fwrite (ptr, 1, len * sizeof (short), psf->file) ;
+	total = psf_fwrite (ptr, 1, len * sizeof (short), psf->filedes) ;
 	if (CPU_IS_LITTLE_ENDIAN)
 		endswap_short_array (ptr, len) ;
 
@@ -1226,13 +1232,13 @@
 	return total ;
 } /* pcm_write_s2bes */
 
-static int
-pcm_write_s2les	(SF_PRIVATE *psf, short *ptr, int len)
+static sf_count_t
+pcm_write_s2les	(SF_PRIVATE *psf, short *ptr, sf_count_t len)
 {	int		total ;
 
 	if (CPU_IS_BIG_ENDIAN)
 		endswap_short_array (ptr, len) ;
-	total = fwrite (ptr, 1, len * sizeof (short), psf->file) ;
+	total = psf_fwrite (ptr, 1, len * sizeof (short), psf->filedes) ;
 	if (CPU_IS_BIG_ENDIAN)
 		endswap_short_array (ptr, len) ;
 
@@ -1243,10 +1249,10 @@
 	return total ;
 } /* pcm_write_s2les */
 
-static int
-pcm_write_s2bet	(SF_PRIVATE *psf, short *ptr, int len)
-{	unsigned int	writecount, thiswrite ;
-	int	bytecount, bufferlen ;
+static sf_count_t
+pcm_write_s2bet	(SF_PRIVATE *psf, short *ptr, sf_count_t len)
+{	sf_count_t	writecount, thiswrite ;
+	sf_count_t	bytecount, bufferlen ;
 	int		index = 0, total = 0 ;
 
 	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
@@ -1253,8 +1259,8 @@
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		s2bet_array (ptr, index, (tribyte*) (psf->buffer), writecount / psf->bytewidth) ;
-		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		s2bet_array (ptr + index, (tribyte*) (psf->buffer), writecount / psf->bytewidth) ;
+		thiswrite = psf_fwrite (psf->buffer, 1, writecount, psf->filedes) ;
 		total += thiswrite ;
 		if (thiswrite < writecount)
 			break ;
@@ -1269,10 +1275,10 @@
 	return total ;
 } /* pcm_write_s2bet */
 
-static int
-pcm_write_s2let	(SF_PRIVATE *psf, short *ptr, int len)
-{	unsigned int	writecount, thiswrite ;
-	int	bytecount, bufferlen ;
+static sf_count_t
+pcm_write_s2let	(SF_PRIVATE *psf, short *ptr, sf_count_t len)
+{	sf_count_t	writecount, thiswrite ;
+	sf_count_t	bytecount, bufferlen ;
 	int		index = 0, total = 0 ;
 
 	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
@@ -1279,8 +1285,8 @@
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		s2let_array (ptr, index, (tribyte*) (psf->buffer), writecount / psf->bytewidth) ;
-		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		s2let_array (ptr + index, (tribyte*) (psf->buffer), writecount / psf->bytewidth) ;
+		thiswrite = psf_fwrite (psf->buffer, 1, writecount, psf->filedes) ;
 		total += thiswrite ;
 		if (thiswrite < writecount)
 			break ;
@@ -1295,10 +1301,10 @@
 	return total ;
 } /* pcm_write_s2let */
 
-static int
-pcm_write_s2bei	(SF_PRIVATE *psf, short *ptr, int len)
-{	unsigned int	writecount, thiswrite ;
-	int	bytecount, bufferlen ;
+static sf_count_t
+pcm_write_s2bei	(SF_PRIVATE *psf, short *ptr, sf_count_t len)
+{	sf_count_t	writecount, thiswrite ;
+	sf_count_t	bytecount, bufferlen ;
 	int		index = 0, total = 0 ;
 
 	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
@@ -1305,8 +1311,8 @@
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		s2bei_array (ptr, index, (int*) (psf->buffer), writecount / psf->bytewidth) ;
-		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		s2bei_array (ptr + index, (int*) (psf->buffer), writecount / psf->bytewidth) ;
+		thiswrite = psf_fwrite (psf->buffer, 1, writecount, psf->filedes) ;
 		total += thiswrite ;
 		if (thiswrite < writecount)
 			break ;
@@ -1321,10 +1327,10 @@
 	return total ;
 } /* pcm_write_s2bei */
 
-static int
-pcm_write_s2lei	(SF_PRIVATE *psf, short *ptr, int len)
-{	unsigned int	writecount, thiswrite ;
-	int	bytecount, bufferlen ;
+static sf_count_t
+pcm_write_s2lei	(SF_PRIVATE *psf, short *ptr, sf_count_t len)
+{	sf_count_t	writecount, thiswrite ;
+	sf_count_t	bytecount, bufferlen ;
 	int		index = 0, total = 0 ;
 
 	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
@@ -1331,8 +1337,8 @@
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		s2lei_array (ptr, index, (int*) (psf->buffer), writecount / psf->bytewidth) ;
-		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		s2lei_array (ptr + index, (int*) (psf->buffer), writecount / psf->bytewidth) ;
+		thiswrite = psf_fwrite (psf->buffer, 1, writecount, psf->filedes) ;
 		total += thiswrite ;
 		if (thiswrite < writecount)
 			break ;
@@ -1350,10 +1356,10 @@
 /*-----------------------------------------------------------------------------------------------
 */
 
-static int
-pcm_write_i2sc	(SF_PRIVATE *psf, int *ptr, int len)
-{	unsigned int	writecount, thiswrite ;
-	int	bytecount, bufferlen ;
+static sf_count_t
+pcm_write_i2sc	(SF_PRIVATE *psf, int *ptr, sf_count_t len)
+{	sf_count_t	writecount, thiswrite ;
+	sf_count_t	bytecount, bufferlen ;
 	int		index = 0, total = 0 ;
 
 	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
@@ -1360,8 +1366,8 @@
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		i2sc_array (ptr, index, (signed char*) (psf->buffer), writecount / psf->bytewidth) ;
-		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		i2sc_array (ptr + index, (signed char*) (psf->buffer), writecount / psf->bytewidth) ;
+		thiswrite = psf_fwrite (psf->buffer, 1, writecount, psf->filedes) ;
 		total += thiswrite ;
 		if (thiswrite < writecount)
 			break ;
@@ -1376,10 +1382,10 @@
 	return total ;
 } /* pcm_write_i2sc */
 
-static int
-pcm_write_i2uc	(SF_PRIVATE *psf, int *ptr, int len)
-{	unsigned int	writecount, thiswrite ;
-	int	bytecount, bufferlen ;
+static sf_count_t
+pcm_write_i2uc	(SF_PRIVATE *psf, int *ptr, sf_count_t len)
+{	sf_count_t	writecount, thiswrite ;
+	sf_count_t	bytecount, bufferlen ;
 	int		index = 0, total = 0 ;
 
 	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
@@ -1386,8 +1392,8 @@
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		i2uc_array (ptr, index, (unsigned char*) (psf->buffer), writecount / psf->bytewidth) ;
-		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		i2uc_array (ptr + index, (unsigned char*) (psf->buffer), writecount / psf->bytewidth) ;
+		thiswrite = psf_fwrite (psf->buffer, 1, writecount, psf->filedes) ;
 		total += thiswrite ;
 		if (thiswrite < writecount)
 			break ;
@@ -1402,10 +1408,10 @@
 	return total ;
 } /* pcm_write_i2uc */
 
-static int
-pcm_write_i2bes	(SF_PRIVATE *psf, int *ptr, int len)
-{	unsigned int	writecount, thiswrite ;
-	int	bytecount, bufferlen ;
+static sf_count_t
+pcm_write_i2bes	(SF_PRIVATE *psf, int *ptr, sf_count_t len)
+{	sf_count_t	writecount, thiswrite ;
+	sf_count_t	bytecount, bufferlen ;
 	int		index = 0, total = 0 ;
 
 	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
@@ -1412,8 +1418,8 @@
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		i2bes_array (ptr, index, (short*) (psf->buffer), writecount / psf->bytewidth) ;
-		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		i2bes_array (ptr + index, (short*) (psf->buffer), writecount / psf->bytewidth) ;
+		thiswrite = psf_fwrite (psf->buffer, 1, writecount, psf->filedes) ;
 		total += thiswrite ;
 		if (thiswrite < writecount)
 			break ;
@@ -1428,10 +1434,10 @@
 	return total ;
 } /* pcm_write_i2bes */
 
-static int
-pcm_write_i2les	(SF_PRIVATE *psf, int *ptr, int len)
-{	unsigned int	writecount, thiswrite ;
-	int	bytecount, bufferlen ;
+static sf_count_t
+pcm_write_i2les	(SF_PRIVATE *psf, int *ptr, sf_count_t len)
+{	sf_count_t	writecount, thiswrite ;
+	sf_count_t	bytecount, bufferlen ;
 	int		index = 0, total = 0 ;
 
 	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
@@ -1438,8 +1444,8 @@
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		i2les_array (ptr, index, (short*) (psf->buffer), writecount / psf->bytewidth) ;
-		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		i2les_array (ptr + index, (short*) (psf->buffer), writecount / psf->bytewidth) ;
+		thiswrite = psf_fwrite (psf->buffer, 1, writecount, psf->filedes) ;
 		total += thiswrite ;
 		if (thiswrite < writecount)
 			break ;
@@ -1454,10 +1460,10 @@
 	return total ;
 } /* pcm_write_i2les */
 
-static int
-pcm_write_i2bet	(SF_PRIVATE *psf, int *ptr, int len)
-{	unsigned int	writecount, thiswrite ;
-	int	bytecount, bufferlen ;
+static sf_count_t
+pcm_write_i2bet	(SF_PRIVATE *psf, int *ptr, sf_count_t len)
+{	sf_count_t	writecount, thiswrite ;
+	sf_count_t	bytecount, bufferlen ;
 	int		index = 0, total = 0 ;
 
 	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
@@ -1464,8 +1470,8 @@
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		i2bet_array (ptr, index, (tribyte*) (psf->buffer), writecount / psf->bytewidth) ;
-		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		i2bet_array (ptr + index, (tribyte*) (psf->buffer), writecount / psf->bytewidth) ;
+		thiswrite = psf_fwrite (psf->buffer, 1, writecount, psf->filedes) ;
 		total += thiswrite ;
 		if (thiswrite < writecount)
 			break ;
@@ -1480,10 +1486,10 @@
 	return total ;
 } /* pcm_write_i2bet */
 
-static int
-pcm_write_i2let	(SF_PRIVATE *psf, int *ptr, int len)
-{	unsigned int	writecount, thiswrite ;
-	int	bytecount, bufferlen ;
+static sf_count_t
+pcm_write_i2let	(SF_PRIVATE *psf, int *ptr, sf_count_t len)
+{	sf_count_t	writecount, thiswrite ;
+	sf_count_t	bytecount, bufferlen ;
 	int		index = 0, total = 0 ;
 
 	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
@@ -1490,8 +1496,8 @@
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		i2let_array (ptr, index, (tribyte*) (psf->buffer), writecount / psf->bytewidth) ;
-		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		i2let_array (ptr + index, (tribyte*) (psf->buffer), writecount / psf->bytewidth) ;
+		thiswrite = psf_fwrite (psf->buffer, 1, writecount, psf->filedes) ;
 		total += thiswrite ;
 		if (thiswrite < writecount)
 			break ;
@@ -1506,15 +1512,17 @@
 	return total ;
 } /* pcm_write_i2les */
 
-static int
-pcm_write_i2bei	(SF_PRIVATE *psf, int *ptr, int len)
+static sf_count_t
+pcm_write_i2bei	(SF_PRIVATE *psf, int *ptr, sf_count_t len)
 {	int		total ;
 
-	if (CPU_IS_LITTLE_ENDIAN)
+	if (CPU_IS_BIG_ENDIAN)
+		total = psf_fwrite (ptr, 1, len * sizeof (int), psf->filedes) ;
+	else
+	{	endswap_int_array (ptr, len) ;
+		total = psf_fwrite (ptr, 1, len * sizeof (int), psf->filedes) ;
 		endswap_int_array (ptr, len) ;
-	total = fwrite (ptr, 1, len * sizeof (int), psf->file) ;
-	if (CPU_IS_LITTLE_ENDIAN)
-		endswap_int_array (ptr, len) ;
+		} ;
 
 	total /= psf->bytewidth ;
 	if (total < len)
@@ -1523,15 +1531,17 @@
 	return total ;
 } /* pcm_write_i2bei */
 
-static int
-pcm_write_i2lei	(SF_PRIVATE *psf, int *ptr, int len)
+static sf_count_t
+pcm_write_i2lei	(SF_PRIVATE *psf, int *ptr, sf_count_t len)
 {	int		total ;
 
-	if (CPU_IS_BIG_ENDIAN)
+	if (CPU_IS_LITTLE_ENDIAN)
+		total = psf_fwrite (ptr, 1, len * sizeof (int), psf->filedes) ;
+	else
+	{	endswap_int_array (ptr, len) ;
+		total = psf_fwrite (ptr, 1, len * sizeof (int), psf->filedes) ;
 		endswap_int_array (ptr, len) ;
-	total = fwrite (ptr, 1, len * sizeof (int), psf->file) ;
-	if (CPU_IS_BIG_ENDIAN)
-		endswap_int_array (ptr, len) ;
+		} ;
 
 	total /= psf->bytewidth ;
 	if (total < len)
@@ -1543,10 +1553,10 @@
 /*-----------------------------------------------------------------------------------------------
 */
 
-static int
-pcm_write_f2sc	(SF_PRIVATE *psf, float *ptr, int len)
-{	unsigned int	writecount, thiswrite ;
-	int		bytecount, bufferlen ;
+static sf_count_t
+pcm_write_f2sc	(SF_PRIVATE *psf, float *ptr, sf_count_t len)
+{	sf_count_t	writecount, thiswrite ;
+	sf_count_t	bytecount, bufferlen ;
 	int		index = 0, total = 0 ;
 	float	normfact ;
 	
@@ -1556,8 +1566,8 @@
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		f2sc_array (ptr, index, (signed char*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
-		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		f2sc_array (ptr + index, (signed char*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
+		thiswrite = psf_fwrite (psf->buffer, 1, writecount, psf->filedes) ;
 		total += thiswrite ;
 		if (thiswrite < writecount)
 			break ;
@@ -1572,10 +1582,10 @@
 	return total ;
 } /* pcm_write_f2sc */
 
-static int
-pcm_write_f2uc	(SF_PRIVATE *psf, float *ptr, int len)
-{	unsigned int	writecount, thiswrite ;
-	int		bytecount, bufferlen ;
+static sf_count_t
+pcm_write_f2uc	(SF_PRIVATE *psf, float *ptr, sf_count_t len)
+{	sf_count_t	writecount, thiswrite ;
+	sf_count_t	bytecount, bufferlen ;
 	int		index = 0, total = 0 ;
 	float	normfact ;
 	
@@ -1585,8 +1595,8 @@
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		f2uc_array (ptr, index, (unsigned char*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
-		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		f2uc_array (ptr + index, (unsigned char*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
+		thiswrite = psf_fwrite (psf->buffer, 1, writecount, psf->filedes) ;
 		total += thiswrite ;
 		if (thiswrite < writecount)
 			break ;
@@ -1601,10 +1611,10 @@
 	return total ;
 } /* pcm_write_f2uc */
 
-static int
-pcm_write_f2bes	(SF_PRIVATE *psf, float *ptr, int len)
-{	unsigned int	writecount, thiswrite ;
-	int	bytecount, bufferlen ;
+static sf_count_t
+pcm_write_f2bes	(SF_PRIVATE *psf, float *ptr, sf_count_t len)
+{	sf_count_t	writecount, thiswrite ;
+	sf_count_t	bytecount, bufferlen ;
 	int		index = 0, total = 0 ;
 	float	normfact ;
 	
@@ -1614,8 +1624,8 @@
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		f2bes_array (ptr, index, (short*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
-		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		f2bes_array (ptr + index, (short*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
+		thiswrite = psf_fwrite (psf->buffer, 1, writecount, psf->filedes) ;
 		total += thiswrite ;
 		if (thiswrite < writecount)
 			break ;
@@ -1630,10 +1640,10 @@
 	return total ;
 } /* pcm_write_f2bes */
 
-static int
-pcm_write_f2les	(SF_PRIVATE *psf, float *ptr, int len)
-{	unsigned int	writecount, thiswrite ;
-	int		bytecount, bufferlen ;
+static sf_count_t
+pcm_write_f2les	(SF_PRIVATE *psf, float *ptr, sf_count_t len)
+{	sf_count_t	writecount, thiswrite ;
+	sf_count_t	bytecount, bufferlen ;
 	int		index = 0, total = 0 ;
 	float	normfact ;
 	
@@ -1643,8 +1653,8 @@
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		f2les_array (ptr, index, (short*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
-		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		f2les_array (ptr + index, (short*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
+		thiswrite = psf_fwrite (psf->buffer, 1, writecount, psf->filedes) ;
 		total += thiswrite ;
 		if (thiswrite < writecount)
 			break ;
@@ -1659,10 +1669,10 @@
 	return total ;
 } /* pcm_write_f2les */
 
-static int
-pcm_write_f2let	(SF_PRIVATE *psf, float *ptr, int len)
-{	unsigned int	writecount, thiswrite ;
-	int	bytecount, bufferlen ;
+static sf_count_t
+pcm_write_f2let	(SF_PRIVATE *psf, float *ptr, sf_count_t len)
+{	sf_count_t	writecount, thiswrite ;
+	sf_count_t	bytecount, bufferlen ;
 	int		index = 0, total = 0 ;
 	float	normfact ;
 	
@@ -1672,8 +1682,8 @@
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		f2let_array (ptr, index, (tribyte*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
-		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		f2let_array (ptr + index, (tribyte*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
+		thiswrite = psf_fwrite (psf->buffer, 1, writecount, psf->filedes) ;
 		total += thiswrite ;
 		if (thiswrite < writecount)
 			break ;
@@ -1688,10 +1698,10 @@
 	return total ;
 } /* pcm_write_f2les */
 
-static int
-pcm_write_f2bet	(SF_PRIVATE *psf, float *ptr, int len)
-{	unsigned int	writecount, thiswrite ;
-	int	bytecount, bufferlen ;
+static sf_count_t
+pcm_write_f2bet	(SF_PRIVATE *psf, float *ptr, sf_count_t len)
+{	sf_count_t	writecount, thiswrite ;
+	sf_count_t	bytecount, bufferlen ;
 	int		index = 0, total = 0 ;
 	float	normfact ;
 	
@@ -1702,8 +1712,8 @@
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		f2bet_array (ptr, index, (tribyte*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
-		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		f2bet_array (ptr + index, (tribyte*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
+		thiswrite = psf_fwrite (psf->buffer, 1, writecount, psf->filedes) ;
 		total += thiswrite ;
 		if (thiswrite < writecount)
 			break ;
@@ -1718,10 +1728,10 @@
 	return total ;
 } /* pcm_write_f2bes */
 
-static int
-pcm_write_f2bei	(SF_PRIVATE *psf, float *ptr, int len)
-{	unsigned int	writecount, thiswrite ;
-	int		bytecount, bufferlen ;
+static sf_count_t
+pcm_write_f2bei	(SF_PRIVATE *psf, float *ptr, sf_count_t len)
+{	sf_count_t	writecount, thiswrite ;
+	sf_count_t	bytecount, bufferlen ;
 	int		index = 0, total = 0 ;
 	float	normfact ;
 	
@@ -1732,8 +1742,8 @@
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		f2bei_array (ptr, index, (int*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
-		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		f2bei_array (ptr + index, (int*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
+		thiswrite = psf_fwrite (psf->buffer, 1, writecount, psf->filedes) ;
 		total += thiswrite ;
 		if (thiswrite < writecount)
 			break ;
@@ -1748,10 +1758,10 @@
 	return total ;
 } /* pcm_write_f2bei */
 
-static int
-pcm_write_f2lei	(SF_PRIVATE *psf, float *ptr, int len)
-{	unsigned int	writecount, thiswrite ;
-	int		bytecount, bufferlen ;
+static sf_count_t
+pcm_write_f2lei	(SF_PRIVATE *psf, float *ptr, sf_count_t len)
+{	sf_count_t	writecount, thiswrite ;
+	sf_count_t	bytecount, bufferlen ;
 	int		index = 0, total = 0 ;
 	float	normfact ;
 	
@@ -1761,8 +1771,8 @@
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		f2lei_array (ptr, index, (int*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
-		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		f2lei_array (ptr + index, (int*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
+		thiswrite = psf_fwrite (psf->buffer, 1, writecount, psf->filedes) ;
 		total += thiswrite ;
 		if (thiswrite < writecount)
 			break ;
@@ -1780,21 +1790,21 @@
 /*-----------------------------------------------------------------------------------------------
 */
 
-static int
-pcm_write_d2sc	(SF_PRIVATE *psf, double *ptr, int len, int normalize)
-{	unsigned int	writecount, thiswrite ;
-	int		bytecount, bufferlen ;
+static sf_count_t
+pcm_write_d2sc	(SF_PRIVATE *psf, double *ptr, sf_count_t len)
+{	sf_count_t	writecount, thiswrite ;
+	sf_count_t	bytecount, bufferlen ;
 	int		index = 0, total = 0 ;
 	double	normfact ;
 	
-	normfact = (normalize ? ((double) 0x80) : 1.0) ;
+	normfact = (psf->norm_double == SF_TRUE) ? ((double) 0x80) : 1.0 ;
 
 	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		d2sc_array (ptr, index, (signed char*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
-		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		d2sc_array (ptr + index, (signed char*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
+		thiswrite = psf_fwrite (psf->buffer, 1, writecount, psf->filedes) ;
 		total += thiswrite ;
 		if (thiswrite < writecount)
 			break ;
@@ -1809,21 +1819,21 @@
 	return total ;
 } /* pcm_write_d2sc */
 
-static int
-pcm_write_d2uc	(SF_PRIVATE *psf, double *ptr, int len, int normalize)
-{	unsigned int	writecount, thiswrite ;
-	int		bytecount, bufferlen ;
+static sf_count_t
+pcm_write_d2uc	(SF_PRIVATE *psf, double *ptr, sf_count_t len)
+{	sf_count_t	writecount, thiswrite ;
+	sf_count_t	bytecount, bufferlen ;
 	int		index = 0, total = 0 ;
 	double	normfact ;
 	
-	normfact = (normalize ? ((double) 0x80) : 1.0) ;
+	normfact = (psf->norm_double == SF_TRUE) ? ((double) 0x80) : 1.0 ;
 
 	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		d2uc_array (ptr, index, (unsigned char*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
-		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		d2uc_array (ptr + index, (unsigned char*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
+		thiswrite = psf_fwrite (psf->buffer, 1, writecount, psf->filedes) ;
 		total += thiswrite ;
 		if (thiswrite < writecount)
 			break ;
@@ -1838,21 +1848,21 @@
 	return total ;
 } /* pcm_write_d2uc */
 
-static int
-pcm_write_d2bes	(SF_PRIVATE *psf, double *ptr, int len, int normalize)
-{	unsigned int	writecount, thiswrite ;
-	int		bytecount, bufferlen ;
+static sf_count_t
+pcm_write_d2bes	(SF_PRIVATE *psf, double *ptr, sf_count_t len)
+{	sf_count_t	writecount, thiswrite ;
+	sf_count_t	bytecount, bufferlen ;
 	int		index = 0, total = 0 ;
 	double	normfact ;
 	
-	normfact = (normalize ? ((double) 0x8000) : 1.0) ;
+	normfact = (psf->norm_double == SF_TRUE) ? ((double) 0x8000) : 1.0 ;
 
 	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		d2bes_array (ptr, index, (short*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
-		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		d2bes_array (ptr + index, (short*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
+		thiswrite = psf_fwrite (psf->buffer, 1, writecount, psf->filedes) ;
 		total += thiswrite ;
 		if (thiswrite < writecount)
 			break ;
@@ -1867,21 +1877,21 @@
 	return total ;
 } /* pcm_write_d2bes */
 
-static int
-pcm_write_d2les	(SF_PRIVATE *psf, double *ptr, int len, int normalize)
-{	unsigned int	writecount, thiswrite ;
-	int		bytecount, bufferlen ;
+static sf_count_t
+pcm_write_d2les	(SF_PRIVATE *psf, double *ptr, sf_count_t len)
+{	sf_count_t	writecount, thiswrite ;
+	sf_count_t	bytecount, bufferlen ;
 	int		index = 0, total = 0 ;
 	double	normfact ;
 	
-	normfact = (normalize ? ((double) 0x8000) : 1.0) ;
+	normfact = (psf->norm_double == SF_TRUE) ? ((double) 0x8000) : 1.0 ;
 
 	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		d2les_array (ptr, index, (short*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
-		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		d2les_array (ptr + index, (short*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
+		thiswrite = psf_fwrite (psf->buffer, 1, writecount, psf->filedes) ;
 		total += thiswrite ;
 		if (thiswrite < writecount)
 			break ;
@@ -1896,21 +1906,21 @@
 	return total ;
 } /* pcm_write_d2les */
 
-static int
-pcm_write_d2let	(SF_PRIVATE *psf, double *ptr, int len, int normalize)
-{	unsigned int	writecount, thiswrite ;
-	int		bytecount, bufferlen ;
+static sf_count_t
+pcm_write_d2let	(SF_PRIVATE *psf, double *ptr, sf_count_t len)
+{	sf_count_t	writecount, thiswrite ;
+	sf_count_t	bytecount, bufferlen ;
 	int		index = 0, total = 0 ;
 	double	normfact ;
 	
-	normfact = (normalize ? ((double) 0x800000) : 1.0) ;
+	normfact = (psf->norm_double == SF_TRUE) ? ((double) 0x800000) : 1.0 ;
 
 	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		d2let_array (ptr, index, (tribyte*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
-		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		d2let_array (ptr + index, (tribyte*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
+		thiswrite = psf_fwrite (psf->buffer, 1, writecount, psf->filedes) ;
 		total += thiswrite ;
 		if (thiswrite < writecount)
 			break ;
@@ -1925,21 +1935,21 @@
 	return total ;
 } /* pcm_write_d2les */
 
-static int
-pcm_write_d2bet	(SF_PRIVATE *psf, double *ptr, int len, int normalize)
-{	unsigned int	writecount, thiswrite ;
-	int		bytecount, bufferlen ;
+static sf_count_t
+pcm_write_d2bet	(SF_PRIVATE *psf, double *ptr, sf_count_t len)
+{	sf_count_t	writecount, thiswrite ;
+	sf_count_t	bytecount, bufferlen ;
 	int		index = 0, total = 0 ;
 	double	normfact ;
 	
-	normfact = (normalize ? ((double) 0x800000) : 1.0) ;
+	normfact = (psf->norm_double == SF_TRUE) ? ((double) 0x800000) : 1.0 ;
 
 	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		d2bet_array (ptr, index, (tribyte*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
-		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		d2bet_array (ptr + index, (tribyte*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
+		thiswrite = psf_fwrite (psf->buffer, 1, writecount, psf->filedes) ;
 		total += thiswrite ;
 		if (thiswrite < writecount)
 			break ;
@@ -1954,21 +1964,21 @@
 	return total ;
 } /* pcm_write_d2bes */
 
-static int
-pcm_write_d2bei	(SF_PRIVATE *psf, double *ptr, int len, int normalize)
-{	unsigned int	writecount, thiswrite ;
-	int		bytecount, bufferlen ;
+static sf_count_t
+pcm_write_d2bei	(SF_PRIVATE *psf, double *ptr, sf_count_t len)
+{	sf_count_t	writecount, thiswrite ;
+	sf_count_t	bytecount, bufferlen ;
 	int		index = 0, total = 0 ;
 	double	normfact ;
 	
-	normfact = (normalize ? ((double) 0x80000000) : 1.0) ;
+	normfact = (psf->norm_double == SF_TRUE) ? ((double) 0x80000000) : 1.0 ;
 
 	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		d2bei_array (ptr, index, (int*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
-		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		d2bei_array (ptr + index, (int*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
+		thiswrite = psf_fwrite (psf->buffer, 1, writecount, psf->filedes) ;
 		total += thiswrite ;
 		if (thiswrite < writecount)
 			break ;
@@ -1983,21 +1993,21 @@
 	return total ;
 } /* pcm_write_d2bei */
 
-static int
-pcm_write_d2lei	(SF_PRIVATE *psf, double *ptr, int len, int normalize)
-{	unsigned int	writecount, thiswrite ;
-	int		bytecount, bufferlen ;
+static sf_count_t
+pcm_write_d2lei	(SF_PRIVATE *psf, double *ptr, sf_count_t len)
+{	sf_count_t	writecount, thiswrite ;
+	sf_count_t	bytecount, bufferlen ;
 	int		index = 0, total = 0 ;
 	double	normfact ;
 	
-	normfact = (normalize ? ((double) 0x80000000) : 1.0) ;
+	normfact = (psf->norm_double == SF_TRUE) ? ((double) 0x80000000) : 1.0 ;
 
 	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		d2lei_array (ptr, index, (int*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
-		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		d2lei_array (ptr + index, (int*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
+		thiswrite = psf_fwrite (psf->buffer, 1, writecount, psf->filedes) ;
 		total += thiswrite ;
 		if (thiswrite < writecount)
 			break ;
@@ -2016,72 +2026,66 @@
 */
 
 static	void	
-sc2s_array	(signed char *buffer, unsigned int count, short *ptr, int index)
-{	int	k ;
-	for (k = 0 ; k < count ; k++)
-	{	ptr [index] = ((short) buffer [k]) ;
-		index ++ ;
+sc2s_array	(signed char *buffer, unsigned int count, short *ptr)
+{	while (count)
+	{	count -- ;
+		ptr [count] = buffer [count] << 8 ;
 		} ;
 } /* sc2s_array */
 
 static	void	
-uc2s_array	(unsigned char *buffer, unsigned int count, short *ptr, int index)
-{	int	k ;
-	for (k = 0 ; k < count ; k++)
-	{	ptr [index] = ((((short) buffer [k]) - 128) % 256) ;
-		index ++ ;
+uc2s_array	(unsigned char *buffer, unsigned int count, short *ptr)
+{	while (count)
+	{	count -- ;
+		ptr [count] = (((short) buffer [count]) - 0x80) << 8 ;
 		} ;
 } /* uc2s_array */
 
 static void	
-bet2s_array (tribyte *buffer, unsigned int count, short *ptr, int index)
+bet2s_array (tribyte *buffer, unsigned int count, short *ptr)
 {	unsigned char	*cptr ;
-	int		k ;
-	int 	value;
-	cptr = (unsigned char*) buffer ;
-	for (k = 0 ; k < count ; k++)
-	{	value = (cptr [0] << 24) + (cptr [1] << 16) + (cptr [2] << 8) ;
-		value = BE2H_INT (value) ;
-		ptr [index] = (short) (value >> 16) ;
-		index ++ ;
-		cptr += 3 ;	
+
+	cptr = ((unsigned char*) buffer) + 3 * count ;
+	while (count)
+	{	count -- ;
+		cptr -= 3 ;	
+		ptr [count] = (cptr [0] << 8) + cptr [1] ;
 		} ;
 } /* bet2s_array */
 
 static void	
-let2s_array (tribyte *buffer, unsigned int count, short *ptr, int index)
+let2s_array (tribyte *buffer, unsigned int count, short *ptr)
 {	unsigned char	*cptr ;
-	int		k ;
-	int 	value;
-	cptr = (unsigned char*) buffer ;
-	for (k = 0 ; k < count ; k++)
-	{	value = (cptr [0] << 8) + (cptr [1] << 16) + (cptr [2] << 24) ;
-		value = LE2H_INT (value) ;
-		ptr [index] = (short) (value >> 16) ;
-		index ++ ;
-		cptr += 3 ;
+
+	cptr = ((unsigned char*) buffer) + 3 * count ;
+	while (count)
+	{	count -- ;
+		cptr -= 3 ;	
+		ptr [count] = cptr [1] + (cptr [2] << 8) ;
 		} ;
 } /* let2s_array */
 
 static void	
-bei2s_array (int *buffer, unsigned int count, short *ptr, int index)
-{	int	k ;
-	int		value ;
-	for (k = 0 ; k < count ; k++)
-	{	value = BE2H_INT (buffer [k]) ;
-		ptr [index] = (short) (value >> 16) ;
-		index ++ ;
+bei2s_array (int *buffer, unsigned int count, short *ptr)
+{	unsigned char	*cptr ;
+
+	cptr = ((unsigned char*) buffer) + 4 * count ;
+	while (count)
+	{	count -- ;
+		cptr -= 4 ;
+		ptr [count] = (cptr [0] << 8) + cptr [1] ;
 		} ;
 } /* bei2s_array */
 
 static void	
-lei2s_array (int *buffer, unsigned int count, short *ptr, int index)
-{	int	k ;
-	int		value ;
-	for (k = 0 ; k < count ; k++)
-	{	value = LE2H_INT (buffer [k]) ;
-		ptr [index] = (short) (value >> 16) ;
-		index ++ ;
+lei2s_array (int *buffer, unsigned int count, short *ptr)
+{	unsigned char	*cptr ;
+
+	cptr = ((unsigned char*) buffer) + 4 * count ;
+	while (count)
+	{	count -- ;
+		cptr -= 4 ;
+		ptr [count] = cptr [2] + (cptr [3] << 8) ;
 		} ;
 } /* lei2s_array */
 
@@ -2090,70 +2094,66 @@
 */
 
 static	void	
-sc2i_array	(signed char *buffer, unsigned int count, int *ptr, int index)
-{	int	k ;
-	for (k = 0 ; k < count ; k++)
-	{	ptr [index] = ((int) buffer [k]) ;
-		index ++ ;
+sc2i_array	(signed char *buffer, unsigned int count, int *ptr)
+{	while (count)
+	{	count -- ;
+		ptr [count] = ((int) buffer [count]) << 24 ;
 		} ;
 } /* sc2i_array */
 
 static	void	
-uc2i_array	(unsigned char *buffer, unsigned int count, int *ptr, int index)
-{	int	k ;
-	for (k = 0 ; k < count ; k++)
-	{	ptr [index] = ((((int) buffer [k]) - 128) % 256) ;
-		index ++ ;
+uc2i_array	(unsigned char *buffer, unsigned int count, int *ptr)
+{	while (count)
+	{	count -- ;
+		ptr [count] = (((int) buffer [count]) - 128) << 24 ;
 		} ;
 } /* uc2i_array */
 
 static void	
-bes2i_array (short *buffer, unsigned int count, int *ptr, int index)
-{	int	k ;
-	short	value ;
-	for (k = 0 ; k < count ; k++)
-	{	value = BE2H_SHORT (buffer [k]) ;
-		ptr [index] = ((int) value) ;
-		index ++ ;
+bes2i_array (short *buffer, unsigned int count, int *ptr)
+{	unsigned char	*cptr ;
+
+	cptr = ((unsigned char*) buffer) + 2 * count ;
+	while (count)
+	{	count -- ;
+		cptr -= 2 ;	
+		ptr [count] = (cptr [0] << 24) + (cptr [1] << 16) ;
 		} ;
 } /* bes2i_array */
 
 static void	
-les2i_array (short *buffer, unsigned int count, int *ptr, int index)
-{	int	k ;
-	short	value ;
-	for (k = 0 ; k < count ; k++)
-	{	value = LE2H_SHORT (buffer [k]) ;
-		ptr [index] = ((int) value) ;
-		index ++ ;
+les2i_array (short *buffer, unsigned int count, int *ptr)
+{	unsigned char	*cptr ;
+
+	cptr = ((unsigned char*) buffer) + 2 * count ;
+	while (count)
+	{	count -- ;
+		cptr -= 2 ;	
+		ptr [count] = (cptr [0] << 16) + (cptr [1] << 24) ;
 		} ;
 } /* les2i_array */
 
 static void	
-bet2i_array (tribyte *buffer, unsigned int count, int *ptr, int index)
+bet2i_array (tribyte *buffer, unsigned int count, int *ptr)
 {	unsigned char	*cptr ;
-	int		k ;
-	int 	value;
-	cptr = (unsigned char*) buffer ;
-	for (k = 0 ; k < count ; k++)
-	{	value = (cptr [0] << 24) + (cptr [1] << 16) + (cptr [2] << 8) ;
-		ptr [index] = value / 256 ;
-		index ++ ;
-		cptr += 3 ;
+
+	cptr = ((unsigned char*) buffer) + 3 * count ;
+	while (count)
+	{	count -- ;
+		cptr -= 3 ;	
+		ptr [count] = (cptr [0] << 24) + (cptr [1] << 16) + (cptr [2] << 8) ;
 		} ;
 } /* bet2i_array */
 
 static void	
-let2i_array (tribyte *buffer, unsigned int count, int *ptr, int index)
+let2i_array (tribyte *buffer, unsigned int count, int *ptr)
 {	unsigned char	*cptr ;
-	int	k ;
-	int 	value;
-	cptr = (unsigned char*) buffer ;
-	for (k = 0 ; k < count ; k++)
-	{	value = (cptr [0] << 8) + (cptr [1] << 16) + (cptr [2] << 24) ;
-		ptr [index] = value / 256 ;
-		index ++ ;
-		cptr += 3 ;
+
+	cptr = ((unsigned char*) buffer) + 3 * count ;
+	while (count)
+	{	count -- ;
+		cptr -= 3 ;
+		ptr [count] = (cptr [0] << 8) + (cptr [1] << 16) + (cptr [2] << 24) ;
 		} ;
 } /* let2i_array */
 
@@ -2162,186 +2162,205 @@
 
 
 static	void	
-sc2f_array	(signed char *buffer, unsigned int count, float *ptr, int index, float normfact)
-{	int	k ;
-	for (k = 0 ; k < count ; k++)
-	{	ptr [index] = ((float) buffer [k]) * normfact ;
-		index ++ ;
+sc2f_array	(signed char *buffer, unsigned int count, float *ptr, float normfact)
+{	while (count)
+	{	count -- ;
+		ptr [count] = ((float) buffer [count]) * normfact ;
 		} ;
 } /* sc2f_array */
 
 static	void	
-uc2f_array	(unsigned char *buffer, unsigned int count, float *ptr, int index, float normfact)
-{	int	k ;
-	for (k = 0 ; k < count ; k++)
-	{	ptr [index] = ((((int) buffer [k]) - 128) % 256) * normfact ;
-		index ++ ;
+uc2f_array	(unsigned char *buffer, unsigned int count, float *ptr, float normfact)
+{	while (count)
+	{	count -- ;
+		ptr [count] = (((int) buffer [count]) - 128) * normfact ;
 		} ;
 } /* uc2f_array */
 
 static void	
-bes2f_array (short *buffer, unsigned int count, float *ptr, int index, float normfact)
-{	int	k ;
-	short	value ;
-	for (k = 0 ; k < count ; k++)
-	{	value = BE2H_SHORT (buffer [k]) ;
-		ptr [index] = ((float) value) * normfact ;
-		index ++ ;
+bes2f_array (short *buffer, unsigned int count, float *ptr, float normfact)
+{	unsigned char	*cptr ;
+	short			value;
+
+	cptr = ((unsigned char*) buffer) + 2 * count ;
+	while (count)
+	{	count -- ;
+		cptr -= 2 ;
+		value = (cptr [0] << 8) + cptr [1] ;
+		ptr [count] = ((float) value) * normfact ;
 		} ;
 } /* bes2f_array */
 
 static void	
-les2f_array (short *buffer, unsigned int count, float *ptr, int index, float normfact)
-{	int	k ;
-	short	value ;
-	for (k = 0 ; k < count ; k++)
-	{	value = LE2H_SHORT (buffer [k]) ;
-		ptr [index] = ((float) value) * normfact ;
-		index ++ ;
+les2f_array (short *buffer, unsigned int count, float *ptr, float normfact)
+{	unsigned char	*cptr ;
+	short			value;
+
+	cptr = ((unsigned char*) buffer) + 2 * count ;
+	while (count)
+	{	count -- ;
+		cptr -= 2 ;
+		value = cptr [0] + (cptr [1] << 8) ;
+		ptr [count] = ((float) value) * normfact ;
 		} ;
 } /* les2f_array */
 
 static void	
-bet2f_array (tribyte *buffer, unsigned int count, float *ptr, int index, float normfact)
+bet2f_array (tribyte *buffer, unsigned int count, float *ptr, float normfact)
 {	unsigned char	*cptr ;
-	int		k ;
 	int 	value;
-	cptr = (unsigned char*) buffer ;
-	for (k = 0 ; k < count ; k++)
-	{	value = (cptr [0] << 24) + (cptr [1] << 16) + (cptr [2] << 8) ;
-		ptr [index] = ((float) (value / 256)) * normfact ;
-		index ++ ;
-		cptr += 3 ;
+
+	cptr = ((unsigned char*) buffer) + 3 * count ;
+	while (count)
+	{	count -- ;
+		cptr -= 3 ;	
+		value = (cptr [0] << 24) + (cptr [1] << 16) + (cptr [2] << 8) ;
+		ptr [count] = ((float) (value >> 8)) * normfact ;
 		} ;
 } /* bet2f_array */
 
 static void	
-let2f_array (tribyte *buffer, unsigned int count, float *ptr, int index, float normfact)
+let2f_array (tribyte *buffer, unsigned int count, float *ptr, float normfact)
 {	unsigned char	*cptr ;
-	int		k ;
 	int 	value;
-	cptr = (unsigned char*) buffer ;
-	for (k = 0 ; k < count ; k++)
-	{	value = (cptr [0] << 8) + (cptr [1] << 16) + (cptr [2] << 24) ;
-		ptr [index] = ((float) (value / 256)) * normfact ;
-		index ++ ;
-		cptr += 3 ; 
+
+	cptr = ((unsigned char*) buffer) + 3 * count ;
+	while (count)
+	{	count -- ;
+		cptr -= 3 ;	
+		value = (cptr [0] << 8) + (cptr [1] << 16) + (cptr [2] << 24) ;
+		ptr [count] = ((float) (value >> 8)) * normfact ;
 		} ;
 } /* let2f_array */
 
 static void	
-lei2f_array (int *buffer, unsigned int count, float *ptr, int index, float normfact)
-{	int	k ;
-	int		value ;
-	for (k = 0 ; k < count ; k++)
-	{	value = LE2H_INT (buffer [k]) ;
-		ptr [index] = ((float) value) * normfact ;
-		index ++ ;
+lei2f_array (int *buffer, unsigned int count, float *ptr, float normfact)
+{	unsigned char	*cptr ;
+	int 			value;
+
+	cptr = ((unsigned char*) buffer) + 4 * count ;
+	while (count)
+	{	count -- ;
+		cptr -= 4 ;
+		value = cptr [0] + (cptr [1] << 8) + (cptr [2] << 16) + (cptr [3] << 24) ;
+		ptr [count] = ((float) value) * normfact ;
 		} ;
 } /* lei2f_array */
 
 static void	
-bei2f_array (int *buffer, unsigned int count, float *ptr, int index, float normfact)
-{	int	k ;
-	int		value ;
-	for (k = 0 ; k < count ; k++)
-	{	value = BE2H_INT (buffer [k]) ;
-		ptr [index] = ((float) value) * normfact ;
-		index ++ ;
+bei2f_array (int *buffer, unsigned int count, float *ptr, float normfact)
+{	unsigned char	*cptr ;
+	int 			value;
+
+	cptr = ((unsigned char*) buffer) + 4 * count ;
+	while (count)
+	{	count -- ;
+		cptr -= 4 ;
+		value = (cptr [0] << 24) + (cptr [1] << 16) + (cptr [2] << 8) + cptr [3] ;
+		ptr [count] = ((float) value) * normfact ;
 		} ;
 } /* bei2f_array */
 
-
 /*-----------------------------------------------------------------------------------------------
 */
 
 static	void	
-sc2d_array	(signed char *buffer, unsigned int count, double *ptr, int index, double normfact)
-{	int	k ;
-	for (k = 0 ; k < count ; k++)
-	{	ptr [index] = ((double) buffer [k]) * normfact ;
-		index ++ ;
+sc2d_array	(signed char *buffer, unsigned int count, double *ptr, double normfact)
+{	while (count)
+	{	count -- ;
+		ptr [count] = ((double) buffer [count]) * normfact ;
 		} ;
 } /* sc2d_array */
 
 static	void	
-uc2d_array	(unsigned char *buffer, unsigned int count, double *ptr, int index, double normfact)
-{	int	k ;
-	for (k = 0 ; k < count ; k++)
-	{	ptr [index] = ((((int) buffer [k]) - 128) % 256) * normfact ;
-		index ++ ;
+uc2d_array	(unsigned char *buffer, unsigned int count, double *ptr, double normfact)
+{	while (count)
+	{	count -- ;
+		ptr [count] = (((int) buffer [count]) - 128) * normfact ;
 		} ;
 } /* uc2d_array */
 
 static void	
-bes2d_array (short *buffer, unsigned int count, double *ptr, int index, double normfact)
-{	int	k ;
-	short	value ;
-	for (k = 0 ; k < count ; k++)
-	{	value = BE2H_SHORT (buffer [k]) ;
-		ptr [index] = ((double) value) * normfact ;
-		index ++ ;
+bes2d_array (short *buffer, unsigned int count, double *ptr, double normfact)
+{	unsigned char	*cptr ;
+	short			value;
+
+	cptr = ((unsigned char*) buffer) + 2 * count ;
+	while (count)
+	{	count -- ;
+		cptr -= 2 ;
+		value = (cptr [0] << 8) + cptr [1] ;
+		ptr [count] = ((double) value) * normfact ;
 		} ;
 } /* bes2d_array */
 
 static void	
-les2d_array (short *buffer, unsigned int count, double *ptr, int index, double normfact)
-{	int	k ;
-	short	value ;
-	for (k = 0 ; k < count ; k++)
-	{	value = LE2H_SHORT (buffer [k]) ;
-		ptr [index] = ((double) value) * normfact ;
-		index ++ ;
+les2d_array (short *buffer, unsigned int count, double *ptr, double normfact)
+{	unsigned char	*cptr ;
+	short			value;
+
+	cptr = ((unsigned char*) buffer) + 2 * count ;
+	while (count)
+	{	count -- ;
+		cptr -= 2 ;
+		value = cptr [0] + (cptr [1] << 8) ;
+		ptr [count] = ((double) value) * normfact ;
 		} ;
 } /* les2d_array */
 
 static void	
-bet2d_array (tribyte *buffer, unsigned int count, double *ptr, int index, double normfact)
+bet2d_array (tribyte *buffer, unsigned int count, double *ptr, double normfact)
 {	unsigned char	*cptr ;
-	int		k ;
 	int 	value;
-	cptr = (unsigned char*) buffer ;
-	for (k = 0 ; k < count ; k++)
-	{	value = (cptr [0] << 24) + (cptr [1] << 16) + (cptr [2] << 8) ;
-		ptr [index] = ((double) (value / 256)) * normfact ;
-		index ++ ;
-		cptr += 3 ;
+	
+	cptr = ((unsigned char*) buffer) + 3 * count ;
+	while (count)
+	{	count -- ;
+		cptr -= 3 ;	
+		value = (cptr [0] << 24) + (cptr [1] << 16) + (cptr [2] << 8) ;
+		ptr [count] = ((double) (value >> 8)) * normfact ;
 		} ;
 } /* bet2d_array */
 
 static void	
-let2d_array (tribyte *buffer, unsigned int count, double *ptr, int index, double normfact)
+let2d_array (tribyte *buffer, unsigned int count, double *ptr, double normfact)
 {	unsigned char	*cptr ;
-	int		k ;
 	int 	value;
-	cptr = (unsigned char*) buffer ;
-	for (k = 0 ; k < count ; k++)
-	{	value = (cptr [0] << 8) + (cptr [1] << 16) + (cptr [2] << 24) ;
-		ptr [index] = ((double) (value / 256)) * normfact ;
-		index ++ ;
-		cptr += 3 ; 
+
+	cptr = ((unsigned char*) buffer) + 3 * count ;
+	while (count)
+	{	count -- ;
+		cptr -= 3 ;	
+		value = (cptr [0] << 8) + (cptr [1] << 16) + (cptr [2] << 24) ;
+		ptr [count] = ((double) (value >> 8)) * normfact ;
 		} ;
 } /* let2d_array */
 
 static void	
-bei2d_array (int *buffer, unsigned int count, double *ptr, int index, double normfact)
-{	int	k ;
-	int		value ;
-	for (k = 0 ; k < count ; k++)
-	{	value = BE2H_INT (buffer [k]) ;
-		ptr [index] = ((double) value) * normfact ;
-		index ++ ;
+bei2d_array (int *buffer, unsigned int count, double *ptr, double normfact)
+{	unsigned char	*cptr ;
+	int 			value;
+
+	cptr = ((unsigned char*) buffer) + 4 * count ;
+	while (count)
+	{	count -- ;
+		cptr -= 4 ;
+		value = (cptr [0] << 24) + (cptr [1] << 16) + (cptr [2] << 8) + cptr [3] ;
+		ptr [count] = ((double) value) * normfact ;
 		} ;
 } /* bei2d_array */
 
 static void	
-lei2d_array (int *buffer, unsigned int count, double *ptr, int index, double normfact)
-{	int	k ;
-	int		value ;
-	for (k = 0 ; k < count ; k++)
-	{	value = LE2H_INT (buffer [k]) ;
-		ptr [index] = ((double) value) * normfact ;
-		index ++ ;
+lei2d_array (int *buffer, unsigned int count, double *ptr, double normfact)
+{	unsigned char	*cptr ;
+	int 			value;
+
+	cptr = ((unsigned char*) buffer) + 4 * count ;
+	while (count)
+	{	count -- ;
+		cptr -= 4 ;
+		value = cptr [0] + (cptr [1] << 8) + (cptr [2] << 16) + (cptr [3] << 24) ;
+		ptr [count] = ((double) value) * normfact ;
 		} ;
 } /* lei2d_array */
 
@@ -2349,137 +2368,154 @@
 */
 
 static	void	
-s2sc_array	(short *ptr, int index, signed char *buffer, unsigned int count)
-{	int	k ;
-	for (k = 0 ; k < count ; k++)
-	{	buffer [k] = (signed char) (ptr [index]) ;
-		index ++ ;
+s2sc_array	(short *ptr, signed char *buffer, unsigned int count)
+{	while (count)
+	{	count -- ;
+		buffer [count] = ptr [count] >> 8 ;
 		} ;
 } /* s2sc_array */
 
 static	void	
-s2uc_array	(short *ptr, int index, unsigned char *buffer, unsigned int count)
-{	int	k ;
-	for (k = 0 ; k < count ; k++)
-	{	buffer [k] = (unsigned char) (ptr [index] + 128) ;
-		index ++ ;
+s2uc_array	(short *ptr, unsigned char *buffer, unsigned int count)
+{	while (count)
+	{	count -- ;
+		buffer [count] = (ptr [count] >> 8) + 0x80 ;
 		} ;
 } /* s2uc_array */
 
 static void	
-s2bet_array (short *ptr, int index, tribyte *buffer, unsigned int count)
+s2bet_array (short *ptr, tribyte *buffer, unsigned int count)
 {	unsigned char	*cptr ;
-	int		k, value ;
-	cptr = (unsigned char*) buffer ;
-	for (k = 0 ; k < count ; k++)
-	{	value = ptr [index] << 8 ;
-		cptr [2] = (unsigned char) (value & 0xFF) ;
-		cptr [1] = (unsigned char) ((value >> 8) & 0xFF) ;
-		cptr [0] = (unsigned char) ((value >> 16) & 0xFF) ;
-		index ++ ;
-		cptr += 3 ;
+
+	cptr = ((unsigned char*) buffer) + 3 * count ;
+	while (count)
+	{	count -- ;
+		cptr -= 3 ;	
+		cptr [2] = 0 ;
+		cptr [1] = ptr [count] ;
+		cptr [0] = ptr [count] >> 8 ;
 		} ;
 } /* s2bet_array */
 
 static void	
-s2let_array (short *ptr, int index, tribyte *buffer, unsigned int count)
+s2let_array (short *ptr, tribyte *buffer, unsigned int count)
 {	unsigned char	*cptr ;
-	int		k, value ;
-	cptr = (unsigned char*) buffer ;
-	for (k = 0 ; k < count ; k++)
-	{	value = ptr [index] << 8 ;
-		cptr [0] = (unsigned char) (value & 0xFF) ;
-		cptr [1] = (unsigned char) ((value >> 8) & 0xFF) ;
-		cptr [2] = (unsigned char) ((value >> 16) & 0xFF) ;
-		index ++ ;
-		cptr += 3 ;
+
+	cptr = ((unsigned char*) buffer) + 3 * count ;
+	while (count)
+	{	count -- ;
+		cptr -= 3 ;	
+		cptr [0] = 0 ;
+		cptr [1] = ptr [count] ;
+		cptr [2] = ptr [count] >> 8 ;
 		} ;
 } /* s2let_array */
 
 static void	
-s2bei_array (short *ptr, int index, int *buffer, unsigned int count)
-{	int	k ;
-	for (k = 0 ; k < count ; k++)
-	{	buffer [k] = H2BE_INT (ptr [index] << 16) ;
-		index ++ ;
+s2bei_array (short *ptr, int *buffer, unsigned int count)
+{	unsigned char	*cptr ;
+	
+	cptr = ((unsigned char*) buffer) + 4 * count ;
+	while (count)
+	{	count -- ;
+		cptr -= 4 ;
+		cptr [0] = ptr [count] >> 8 ;
+		cptr [1] = ptr [count] ;
+		cptr [2] = 0 ;
+		cptr [3] = 0 ;
 		} ;
-} /* s2lei_array */
+} /* s2bei_array */
 
 static void	
-s2lei_array (short *ptr, int index, int *buffer, unsigned int count)
-{	int	k ;
-	for (k = 0 ; k < count ; k++)
-	{	buffer [k] = H2LE_INT (ptr [index] << 16) ;
-		index ++ ;
+s2lei_array (short *ptr, int *buffer, unsigned int count)
+{	unsigned char	*cptr ;
+	
+	cptr = ((unsigned char*) buffer) + 4 * count ;
+	while (count)
+	{	count -- ;
+		cptr -= 4 ;
+		cptr [0] = 0 ; 
+		cptr [1] = 0 ; 
+		cptr [2] = ptr [count] ;
+		cptr [3] = ptr [count] >> 8 ;
 		} ;
 } /* s2lei_array */
 
+
 /*-----------------------------------------------------------------------------------------------
 */
 
 static	void	
-i2sc_array	(int *ptr, int index, signed char *buffer, unsigned int count)
-{	int	k ;
-	for (k = 0 ; k < count ; k++)
-	{	buffer [k] = (signed char) (ptr [index]) ;
-		index ++ ;
+i2sc_array	(int *ptr, signed char *buffer, unsigned int count)
+{	while (count)
+	{	count -- ;
+		buffer [count] = (ptr [count] >> 24) ;
 		} ;
 } /* i2sc_array */
 
 static	void	
-i2uc_array	(int *ptr, int index, unsigned char *buffer, unsigned int count)
-{	int	k ;
-	for (k = 0 ; k < count ; k++)
-	{	buffer [k] = (unsigned char) (ptr [index] + 128) ;
-		index ++ ;
+i2uc_array	(int *ptr, unsigned char *buffer, unsigned int count)
+{	while (count)
+	{	count -- ;
+		buffer [count] = ((ptr [count] >> 24) + 128) ;
 		} ;
 } /* i2uc_array */
 
 static void	
-i2bes_array (int *ptr, int index, short *buffer, unsigned int count)
-{	int	k ;
-	for (k = 0 ; k < count ; k++)
-	{	buffer [k] = H2BE_SHORT (ptr [index]) ;
-		index ++ ;
+i2bes_array (int *ptr, short *buffer, unsigned int count)
+{	unsigned char	*cptr ;
+	
+	cptr = ((unsigned char*) buffer) + 2 * count ;
+	while (count)
+	{	count -- ;
+		cptr -= 2 ;
+		cptr [0] = ptr [count] >> 24 ;
+		cptr [1] = ptr [count] >> 16 ;
 		} ;
 } /* i2bes_array */
 
 static void	
-i2les_array (int *ptr, int index, short *buffer, unsigned int count)
-{	int	k ;
-	for (k = 0 ; k < count ; k++)
-	{	buffer [k] = H2LE_SHORT (ptr [index]) ;
-		index ++ ;
+i2les_array (int *ptr, short *buffer, unsigned int count)
+{	unsigned char	*cptr ;
+	
+	cptr = ((unsigned char*) buffer) + 2 * count ;
+	while (count)
+	{	count -- ;
+		cptr -= 2 ;
+		cptr [0] = ptr [count] >> 16 ;
+		cptr [1] = ptr [count] >> 24 ;
 		} ;
 } /* i2les_array */
 
 static void	
-i2bet_array (int *ptr, int index, tribyte *buffer, unsigned int count)
+i2bet_array (int *ptr, tribyte *buffer, unsigned int count)
 {	unsigned char	*cptr ;
-	int		k, value ;
-	cptr = (unsigned char*) buffer ;
-	for (k = 0 ; k < count ; k++)
-	{	value = ptr [index] ;
-		cptr [0] = (unsigned char) ((value & 0xFF0000) >> 16) ;
-		cptr [1] = (unsigned char) ((value >> 8) & 0xFF) ;
-		cptr [2] = (unsigned char) (value & 0xFF) ;
-		index ++ ;
-		cptr += 3 ;
+	int				value ;
+	
+	cptr = ((unsigned char*) buffer) + 3 * count ;
+	while (count)
+	{	count -- ;
+		cptr -= 3 ;	
+		value = ptr [count] >> 8 ;
+		cptr [2] = value ;
+		cptr [1] = value >> 8 ;
+		cptr [0] = value >> 16 ;
 		} ;
 } /* i2bet_array */
 
 static void	
-i2let_array (int *ptr, int index, tribyte *buffer, unsigned int count)
+i2let_array (int *ptr, tribyte *buffer, unsigned int count)
 {	unsigned char	*cptr ;
-	int		k, value ;
-	cptr = (unsigned char*) buffer ;
-	for (k = 0 ; k < count ; k++)
-	{	value = ptr [index] ;
-		cptr [0] = (unsigned char) (value & 0xFF) ;
-		cptr [1] = (unsigned char) ((value >> 8) & 0xFF) ;
-		cptr [2] = (unsigned char) ((value >> 16) & 0xFF) ;
-		index ++ ;
-		cptr += 3 ;
+	int				value ;
+
+	cptr = ((unsigned char*) buffer) + 3 * count ;
+	while (count)
+	{	count -- ;
+		cptr -= 3 ;	
+		value = ptr [count] >> 8 ;
+		cptr [0] = value ;
+		cptr [1] = value >> 8 ;
+		cptr [2] = value >> 16 ;
 		} ;
 } /* i2let_array */
 
@@ -2487,86 +2523,110 @@
 */
 
 static	void	
-f2sc_array	(float *ptr, int index, signed char *buffer, unsigned int count, float normfact)
-{	int	k ;
-	for (k = 0 ; k < count ; k++)
-	{	buffer [k] = FLOAT_TO_SHORT (ptr [index] * normfact) ;
-		index ++ ;
+f2sc_array	(float *ptr, signed char *buffer, unsigned int count, float normfact)
+{	while (count)
+	{	count -- ;
+		buffer [count] = lrintf (ptr [count] * normfact) ;
 		} ;
 } /* f2sc_array */
 
 static	void	
-f2uc_array	(float *ptr, int index, unsigned char *buffer, unsigned int count, float normfact)
-{	int	k ;
-	for (k = 0 ; k < count ; k++)
-	{	buffer [k] = FLOAT_TO_SHORT (ptr [index] * normfact) + 128 ;
-		index ++ ;
+f2uc_array	(float *ptr, unsigned char *buffer, unsigned int count, float normfact)
+{	while (count)
+	{	count -- ;
+		buffer [count] = lrintf (ptr [count] * normfact) + 128 ;
 		} ;
 } /* f2uc_array */
 
 static void	
-f2bes_array (float *ptr, int index, short *buffer, unsigned int count, float normfact)
-{	int	k ;
-	for (k = 0 ; k < count ; k++)
-	{	buffer [k] = H2BE_SHORT (FLOAT_TO_SHORT (ptr [index] * normfact)) ;
-		index ++ ;
+f2bes_array (float *ptr, short *buffer, unsigned int count, float normfact)
+{	unsigned char	*cptr ;
+	short			value ;	
+	cptr = ((unsigned char*) buffer) + 2 * count ;
+	while (count)
+	{	count -- ;
+		cptr -= 2 ;
+		value = lrintf (ptr [count] * normfact) ;
+		cptr [0] = value >> 8 ;
+		cptr [1] = value ;
 		} ;
 } /* f2bes_array */
 
 static void	
-f2les_array (float *ptr, int index, short *buffer, unsigned int count, float normfact)
-{	int	k ;
-	for (k = 0 ; k < count ; k++)
-	{	buffer [k] = H2LE_SHORT (FLOAT_TO_SHORT (ptr [index] * normfact)) ;
-		index ++ ;
+f2les_array (float *ptr, short *buffer, unsigned int count, float normfact)
+{	unsigned char	*cptr ;
+	short			value ;	
+	cptr = ((unsigned char*) buffer) + 2 * count ;
+	while (count)
+	{	count -- ;
+		cptr -= 2 ;
+		value = lrintf (ptr [count] * normfact) ;
+		cptr [0] = value ;
+		cptr [1] = value >> 8 ;
 		} ;
 } /* f2les_array */
 
 static void	
-f2bet_array (float *ptr, int index, tribyte *buffer, unsigned int count, float normfact)
+f2bet_array (float *ptr, tribyte *buffer, unsigned int count, float normfact)
 {	unsigned char	*cptr ;
-	int		k, value ;
-	cptr = (unsigned char*) buffer ;
-	for (k = 0 ; k < count ; k++)
-	{	value = FLOAT_TO_INT (ptr [index] * normfact) ;
-		cptr [2] = (unsigned char) (value & 0xFF) ;
-		cptr [1] = (unsigned char) ((value >> 8) & 0xFF) ;
-		cptr [0] = (unsigned char) ((value >> 16) & 0xFF) ;
-		index ++ ;
-		cptr += 3 ;
+	int		value ;
+	
+	cptr = ((unsigned char*) buffer) + 3 * count ;
+	while (count)
+	{	count -- ;
+		cptr -= 3 ;	
+		value = lrintf (ptr [count] * normfact) ;
+		cptr [0] = value >> 16 ;
+		cptr [1] = value >> 8 ;
+		cptr [2] = value ;
 		} ;
 } /* f2bet_array */
 
 static void	
-f2let_array (float *ptr, int index, tribyte *buffer, unsigned int count, float normfact)
+f2let_array (float *ptr, tribyte *buffer, unsigned int count, float normfact)
 {	unsigned char	*cptr ;
-	int		k, value ;
-	cptr = (unsigned char*) buffer ;	
-	for (k = 0 ; k < count ; k++)
-	{	value = FLOAT_TO_INT (ptr [index] * normfact) ;
-		cptr [0] = (unsigned char) (value & 0xFF) ;
-		cptr [1] = (unsigned char) ((value >> 8) & 0xFF) ;
-		cptr [2] = (unsigned char) ((value >> 16) & 0xFF) ;
-		index ++ ;
-		cptr += 3 ;
+	int		value ;
+
+	cptr = ((unsigned char*) buffer) + 3 * count ;
+	while (count)
+	{	count -- ;
+		cptr -= 3 ;	
+		value = lrintf (ptr [count] * normfact) ;
+		cptr [0] = value ;
+		cptr [1] = value >> 8 ;
+		cptr [2] = value >> 16 ;
 		} ;
 } /* f2let_array */
 
 static void	
-f2bei_array (float *ptr, int index, int *buffer, unsigned int count, float normfact)
-{	int	k ;
-	for (k = 0 ; k < count ; k++)
-	{	buffer [k] = H2BE_INT (FLOAT_TO_INT (ptr [index] * normfact)) ;
-		index ++ ;
+f2bei_array (float *ptr, int *buffer, unsigned int count, float normfact)
+{	unsigned char	*cptr ;
+	int				value ;	
+	cptr = ((unsigned char*) buffer) + 4 * count ;
+	while (count)
+	{	count -- ;
+		cptr -= 4 ;
+		value = lrintf (ptr [count] * normfact) ;
+		cptr [0] = value >> 24 ;
+		cptr [1] = value >> 16 ;
+		cptr [2] = value >> 8 ;
+		cptr [3] = value ;
 		} ;
 } /* f2bei_array */
 
-static 
-void	f2lei_array (float *ptr, int index, int *buffer, unsigned int count, float normfact)
-{	int	k ;
-	for (k = 0 ; k < count ; k++)
-	{	buffer [k] = H2LE_INT (FLOAT_TO_INT (ptr [index] * normfact)) ;
-		index ++ ;
+static void	
+f2lei_array (float *ptr, int *buffer, unsigned int count, float normfact)
+{	unsigned char	*cptr ;
+	int				value ;	
+	cptr = ((unsigned char*) buffer) + 4 * count ;
+	while (count)
+	{	count -- ;
+		cptr -= 4 ;
+		value = lrintf (ptr [count] * normfact) ;
+		cptr [0] = value ;
+		cptr [1] = value >> 8 ;
+		cptr [2] = value >> 16 ;
+		cptr [3] = value >> 24 ;
 		} ;
 } /* f2lei_array */
 
@@ -2574,86 +2634,112 @@
 */
 
 static	void	
-d2sc_array	(double *ptr, int index, signed char *buffer, unsigned int count, double normfact)
-{	int	k ;
-	for (k = 0 ; k < count ; k++)
-	{	buffer [k] = DOUBLE_TO_SHORT (ptr [index] * normfact) ;
-		index ++ ;
+d2sc_array	(double *ptr, signed char *buffer, unsigned int count, double normfact)
+{	while (count)
+	{	count -- ;
+		buffer [count] = lrint (ptr [count] * normfact) ;
 		} ;
 } /* d2sc_array */
 
 static	void	
-d2uc_array	(double *ptr, int index, unsigned char *buffer, unsigned int count, double normfact)
-{	int	k ;
-	for (k = 0 ; k < count ; k++)
-	{	buffer [k] = DOUBLE_TO_SHORT (ptr [index] * normfact) + 128 ;
-		index ++ ;
+d2uc_array	(double *ptr, unsigned char *buffer, unsigned int count, double normfact)
+{	while (count)
+	{	count -- ;
+		buffer [count] = lrint (ptr [count] * normfact) + 128 ;
 		} ;
 } /* d2uc_array */
 
 static void	
-d2bes_array (double *ptr, int index, short *buffer, unsigned int count, double normfact)
-{	int	k ;
-	for (k = 0 ; k < count ; k++)
-	{	buffer [k] = H2BE_SHORT (DOUBLE_TO_SHORT (ptr [index] * normfact)) ;
-		index ++ ;
+d2bes_array (double *ptr, short *buffer, unsigned int count, double normfact)
+{	unsigned char	*cptr ;
+	short			value ;	
+	cptr = ((unsigned char*) buffer) + 2 * count ;
+	while (count)
+	{	count -- ;
+		cptr -= 2 ;
+		value = lrint (ptr [count] * normfact) ;
+		cptr [0] = value >> 8 ;
+		cptr [1] = value ;
 		} ;
 } /* d2bes_array */
 
 static void	
-d2les_array (double *ptr, int index, short *buffer, unsigned int count, double normfact)
-{	int	k ;
-	for (k = 0 ; k < count ; k++)
-	{	buffer [k] = H2LE_SHORT (DOUBLE_TO_SHORT (ptr [index] * normfact)) ;
-		index ++ ;
+d2les_array (double *ptr, short *buffer, unsigned int count, double normfact)
+{	unsigned char	*cptr ;
+	short			value ;	
+	cptr = ((unsigned char*) buffer) + 2 * count ;
+	while (count)
+	{	count -- ;
+		cptr -= 2 ;
+		value = lrint (ptr [count] * normfact) ;
+		cptr [0] = value ;
+		cptr [1] = value >> 8 ;
 		} ;
 } /* d2les_array */
 
 static void	
-d2bet_array (double *ptr, int index, tribyte *buffer, unsigned int count, double normfact)
+d2bet_array (double *ptr, tribyte *buffer, unsigned int count, double normfact)
 {	unsigned char	*cptr ;
-	int		k, value ;
-	cptr = (unsigned char*) buffer ;
-	for (k = 0 ; k < count ; k++)
-	{	value = DOUBLE_TO_INT (ptr [index] * normfact) ;
-		cptr [2] = (unsigned char) (value & 0xFF) ;
-		cptr [1] = (unsigned char) ((value >> 8) & 0xFF) ;
-		cptr [0] = (unsigned char) ((value >> 16) & 0xFF) ;
-		index ++ ;
-		cptr += 3 ;
+	int		value ;
+
+	cptr = ((unsigned char*) buffer) + 3 * count ;
+	while (count)
+	{	count -- ;
+		cptr -= 3 ;	
+		value = lrint (ptr [count] * normfact) ;
+		cptr [2] = value ;
+		cptr [1] = value >> 8 ;
+		cptr [0] = value >> 16 ;
 		} ;
 } /* d2bet_array */
 
 static void	
-d2let_array (double *ptr, int index, tribyte *buffer, unsigned int count, double normfact)
+d2let_array (double *ptr, tribyte *buffer, unsigned int count, double normfact)
 {	unsigned char	*cptr ;
-	int		k, value ;
-	cptr = (unsigned char*) buffer ;	
-	for (k = 0 ; k < count ; k++)
-	{	value = DOUBLE_TO_INT (ptr [index] * normfact) ;
-		cptr [0] = (unsigned char) (value & 0xFF) ;
-		cptr [1] = (unsigned char) ((value >> 8) & 0xFF) ;
-		cptr [2] = (unsigned char) ((value >> 16) & 0xFF) ;
-		index ++ ;
-		cptr += 3 ;
+	int		value ;
+
+	cptr = ((unsigned char*) buffer) + 3 * count ;
+	while (count)
+	{	count -- ;
+		cptr -= 3 ;	
+		value = lrint (ptr [count] * normfact) ;
+		cptr [0] = value ;
+		cptr [1] = value >> 8 ;
+		cptr [2] = value >> 16 ;
 		} ;
 } /* d2let_array */
 
 static void	
-d2bei_array (double *ptr, int index, int *buffer, unsigned int count, double normfact)
-{	int	k ;
-	for (k = 0 ; k < count ; k++)
-	{	buffer [k] = H2BE_INT (DOUBLE_TO_INT (ptr [index] * normfact)) ;
-		index ++ ;
+d2bei_array (double *ptr, int *buffer, unsigned int count, double normfact)
+{	unsigned char	*cptr ;
+	int				value ;	
+	cptr = ((unsigned char*) buffer) + 4 * count ;
+	while (count)
+	{	count -- ;
+		cptr -= 4 ;
+		value = lrint (ptr [count] * normfact) ;
+		cptr [0] = value >> 24 ;
+		cptr [1] = value >> 16 ;
+		cptr [2] = value >> 8 ;
+		cptr [3] = value ;
 		} ;
 } /* d2bei_array */
 
 static 
-void	d2lei_array (double *ptr, int index, int *buffer, unsigned int count, double normfact)
-{	int	k ;
-	for (k = 0 ; k < count ; k++)
-	{	buffer [k] = H2LE_INT (DOUBLE_TO_INT (ptr [index] * normfact)) ;
-		index ++ ;
+void	d2lei_array (double *ptr, int *buffer, unsigned int count, double normfact)
+{	unsigned char	*cptr ;
+	int				value ;	
+	cptr = ((unsigned char*) buffer) + 4 * count ;
+	while (count)
+	{	count -- ;
+		cptr -= 4 ;
+		value = lrint (ptr [count] * normfact) ;
+		cptr [0] = value ;
+		cptr [1] = value >> 8 ;
+		cptr [2] = value >> 16;
+		cptr [3] = value >> 24 ;
 		} ;
 } /* d2lei_array */
 
+/*==============================================================================
+*/
--- a/common/libsndfile/src/raw.c
+++ b/common/libsndfile/src/raw.c
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 1999-2001 Erik de Castro Lopo <[email protected]>
+** Copyright (C) 1999-2002 Erik de Castro Lopo <[email protected]>
 **  
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -16,161 +16,86 @@
 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 */
 
-
 #include	<stdio.h>
-#include	<unistd.h>
-#include	<fcntl.h>
-#include	<string.h>
-#include	<ctype.h>
 
 #include	"sndfile.h"
 #include	"config.h"
-#include	"sfendian.h"
 #include	"common.h"
 
-static long	raw_seek   (SF_PRIVATE *psf, long offset, int whence) ;
+/*-static sf_count_t	raw_seek   (SF_PRIVATE *psf, sf_count_t offset, int whence) ;-*/
 
 /*------------------------------------------------------------------------------
-** Public functions.
+** Public function.
 */
 
-int 	raw_open_read	(SF_PRIVATE *psf)
-{	unsigned int subformat ;
-	int			error ;
-	
-	if(! psf->sf.channels || ! psf->sf.pcmbitwidth)
-		return SFE_RAW_READ_BAD_SPEC ;
+int 	
+raw_open	(SF_PRIVATE *psf)
+{	int	subformat, error = SFE_NO_ERROR ;
 		
 	subformat = psf->sf.format & SF_FORMAT_SUBMASK ;
 
-	psf->endian = 0 ;
+	psf->endian = psf->sf.format & SF_FORMAT_ENDMASK ;
 
-	if (subformat == SF_FORMAT_PCM_BE)
+	if (CPU_IS_BIG_ENDIAN && (psf->endian == 0 || psf->endian == SF_ENDIAN_CPU))
 		psf->endian = SF_ENDIAN_BIG ;
-	else if (subformat == SF_FORMAT_PCM_LE)
+	else if (CPU_IS_LITTLE_ENDIAN && (psf->endian == 0 || psf->endian == SF_ENDIAN_CPU))
 		psf->endian = SF_ENDIAN_LITTLE ;
-	else if (subformat == SF_FORMAT_PCM_S8)
-		psf->chars = SF_CHARS_SIGNED ;
-	else if (subformat == SF_FORMAT_PCM_U8)
-		psf->chars = SF_CHARS_UNSIGNED ;
-	else
-		return SFE_RAW_READ_BAD_SPEC ;
-		
-	psf->seek_func = (func_seek) raw_seek ;
 
-	psf->sf.seekable = SF_TRUE ;
-	psf->sf.sections = 1 ;
-
+	psf->blockwidth = psf->bytewidth * psf->sf.channels ;
 	psf->dataoffset = 0 ;
-	psf->bytewidth  = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
-	psf->blockwidth = psf->sf.channels * psf->bytewidth ;
+	psf->datalength = psf->filelength ;
 
-	if ((error = pcm_read_init (psf)))
-		return error ;
-		
-	if (psf->blockwidth)
-		psf->sf.samples = psf->filelength / psf->blockwidth ;
+	switch (subformat)
+	{	case SF_FORMAT_PCM_S8 :
+				psf->chars = SF_CHARS_SIGNED ;
+				error = pcm_init (psf) ;
+				break ;
 
- 	psf->datalength = psf->filelength - psf->dataoffset ;
-
- 	psf->current  = 0 ;
-	
-	return 0 ;
-} /* raw_open_read */
-
-/*------------------------------------------------------------------------------
-*/
-
-int 	raw_open_write	(SF_PRIVATE *psf)
-{	unsigned int	subformat, big_endian_file ;
-	int error ;
+		case SF_FORMAT_PCM_U8 :
+				psf->chars = SF_CHARS_UNSIGNED ;
+				error = pcm_init (psf) ;
+				break ;
+				
+		case SF_FORMAT_PCM_16 :
+		case SF_FORMAT_PCM_24 :
+		case SF_FORMAT_PCM_32 :
+				error = pcm_init (psf) ;
+				break ;
 		
-	subformat = psf->sf.format & SF_FORMAT_SUBMASK ;
-
-	if (subformat == SF_FORMAT_PCM_BE)
-		big_endian_file = 1 ;
-	else if (subformat == SF_FORMAT_PCM_LE)
-		big_endian_file = 0 ;
-	else if (subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_U8)
-		big_endian_file = 0 ;
-	else
-		return	SFE_BAD_OPEN_FORMAT ;
+		case SF_FORMAT_ULAW :
+				error = ulaw_init (psf) ;
+				break ;
 		
-	psf->bytewidth = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
+		case SF_FORMAT_ALAW :
+				error = alaw_init (psf) ;
+				break ;
 		
-	psf->endian      = big_endian_file ? SF_ENDIAN_BIG : SF_ENDIAN_LITTLE ;
-	psf->sf.seekable = SF_TRUE ;
-	psf->blockwidth  = psf->bytewidth * psf->sf.channels ;
- 	psf->dataoffset  = 0 ;
-	psf->datalength  = psf->blockwidth * psf->sf.samples ;
-	psf->filelength  = psf->datalength ;
-	psf->error       = 0 ;
+		case SF_FORMAT_FLOAT :
+				error = float32_init (psf) ;
+				break ;
 
-	if (subformat == SF_FORMAT_PCM_S8)
-		psf->chars = SF_CHARS_SIGNED ;
-	else if (subformat == SF_FORMAT_PCM_U8)
-		psf->chars = SF_CHARS_UNSIGNED ;
-	
-	if ((error = pcm_write_init (psf)))
-		return error ;
-		
-	return 0 ;
-} /* raw_open_write */
+		case SF_FORMAT_DOUBLE :
+				error = double64_init (psf) ;
+				break ;
 
-/*------------------------------------------------------------------------------
-*/
+		case SF_FORMAT_DWVW_12 :
+				error = dwvw_init (psf, 12) ;
+				break ;
 
-static long
-raw_seek   (SF_PRIVATE *psf, long offset, int whence)
-{	long position ;
+		case SF_FORMAT_DWVW_16 :
+				error = dwvw_init (psf, 16) ;
+				break ;
 
-	if (! (psf->blockwidth && psf->datalength))
-	{	psf->error = SFE_BAD_SEEK ;
-		return	((long) -1) ;
-		} ;
+		case SF_FORMAT_DWVW_24 :
+				error = dwvw_init (psf, 24) ;
+				break ;
 
-	position = ftell (psf->file) ;
-	offset = offset * psf->blockwidth ;
-		
-	switch (whence)
-	{	case SEEK_SET :
-				if (offset < 0 || offset > psf->datalength)
-				{	psf->error = SFE_BAD_SEEK ;
-					return	((long) -1) ;
-					} ;
+		case SF_FORMAT_GSM610 :
+				error = gsm610_init (psf) ;
 				break ;
-				
-		case SEEK_CUR :
-				if (psf->current + offset < 0 || psf->current + offset > psf->datalength)
-				{	psf->error = SFE_BAD_SEEK ;
-					return	((long) -1) ;
-					} ;
-				offset = position + offset ;
-				break ;
-				
-		case SEEK_END :
-				if (offset > 0 || psf->datalength + offset < 0)
-				{	psf->error = SFE_BAD_SEEK ;
-					return	((long) -1) ;
-					} ;
-				offset = psf->datalength + offset ;
-				break ;
-				
-		default : 
-				psf->error = SFE_BAD_SEEK ;
-				return	((long) -1) ;
+
+		default : return SFE_BAD_OPEN_FORMAT ;
 		} ;
-		
-	if (psf->mode == SF_MODE_READ)
-		fseek (psf->file, offset, SEEK_SET) ;
-	else
-	{	/* What to do about write??? */ 
-		psf->error = SFE_BAD_SEEK ;
-		return	((long) -1) ;
-		} ;
 
-	psf->current = offset / psf->blockwidth ;
-
-	return psf->current ;
-} /* raw_seek */
-
+	return error ;
+} /* raw_open */
--- /dev/null
+++ b/common/libsndfile/src/rx2.c
@@ -1,0 +1,293 @@
+/*
+** Copyright (C) 2001-2002 Erik de Castro Lopo <[email protected]>
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+** 
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+** 
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include	<stdio.h>
+#include	<unistd.h>
+#include	<string.h>
+#include	<ctype.h>
+#include	<stdarg.h>
+
+#include	"sndfile.h"
+#include	"config.h"
+#include	"sfendian.h"
+#include	"common.h"
+
+/*------------------------------------------------------------------------------
+ * Macros to handle big/little endian issues.
+*/
+
+#define	CAT_MARKER	(MAKE_MARKER ('C', 'A', 'T', ' '))
+#define	GLOB_MARKER (MAKE_MARKER ('G', 'L', 'O', 'B'))
+
+#define	RECY_MARKER (MAKE_MARKER ('R', 'E', 'C', 'Y'))
+
+#define	SLCL_MARKER (MAKE_MARKER ('S', 'L', 'C', 'L'))
+#define	SLCE_MARKER (MAKE_MARKER ('S', 'L', 'C', 'E'))
+
+#define	DEVL_MARKER	(MAKE_MARKER ('D', 'E', 'V', 'L'))
+#define	TRSH_MARKER	(MAKE_MARKER ('T', 'R', 'S', 'H'))
+
+#define	EQ_MARKER	(MAKE_MARKER ('E', 'Q', ' ', ' '))
+#define	COMP_MARKER (MAKE_MARKER ('C', 'O', 'M', 'P'))
+
+#define	SINF_MARKER (MAKE_MARKER ('S', 'I', 'N', 'F'))
+#define	SDAT_MARKER (MAKE_MARKER ('S', 'D', 'A', 'T'))
+
+/*------------------------------------------------------------------------------
+ * Typedefs for file chunks.
+*/
+
+
+/*------------------------------------------------------------------------------
+ * Private static functions.
+*/
+static int	rx2_close	(SF_PRIVATE  *psf) ;
+
+/*------------------------------------------------------------------------------
+** Public functions.
+*/
+
+int 	
+rx2_open	(SF_PRIVATE *psf)
+{	int error, marker, length, glob_offset, slce_count ;
+
+	int sdat_length = 0, slce_total = 0 ;
+
+	/* So far only doing read. */
+
+	psf_binheader_readf (psf, "Epm4", 0, &marker, &length) ;
+	
+	if (marker != CAT_MARKER)
+	{	psf_log_printf (psf, "length : %d\n", length) ;
+		return -1000 ;
+		} ;
+
+	if (length != psf->filelength - 8)
+		psf_log_printf (psf, "%D : %d (should be %d)\n", marker, length, psf->filelength - 8) ;
+	else
+		psf_log_printf (psf, "%D : %d\n", marker, length) ;
+
+	/* 'REX2' marker */
+	psf_binheader_readf (psf, "m", &marker) ;
+	psf_log_printf (psf, "%D", marker) ;
+
+	/* 'HEAD' marker */
+	psf_binheader_readf (psf, "m", &marker) ;
+	psf_log_printf (psf, "%D\n", marker) ;
+	
+	/* Grab 'GLOB' offset. */
+	psf_binheader_readf (psf, "E4", &glob_offset) ;
+	glob_offset += 0x14 ;  /* Add the current file offset. */
+
+	/* Jump to offset 0x30 */
+	psf_binheader_readf (psf, "p", 0x30) ;
+	
+	/* Get name length */
+	length = 0 ;
+	psf_binheader_readf (psf, "1", &length) ;
+	if (length >= SIGNED_SIZEOF (psf->buffer))
+	{	psf_log_printf (psf, "  Text : %d *** Error : Too sf_count_t!\n") ;
+		return -1001 ;
+		}
+	
+	memset (psf->buffer, 0, SIGNED_SIZEOF (psf->buffer)) ;
+	psf_binheader_readf (psf, "b", psf->buffer, length) ;
+	psf_log_printf (psf, " Text : \"%s\"\n", psf->buffer) ;
+	
+	/* Jump to GLOB offset position. */
+	if (glob_offset & 1)
+		glob_offset ++ ;
+		
+	psf_binheader_readf (psf, "p", glob_offset) ;
+
+	slce_count = 0 ;
+	/* GLOB */
+	while (1)
+	{	psf_binheader_readf (psf, "m", &marker) ;
+
+		if (marker != SLCE_MARKER && slce_count > 0)
+		{	psf_log_printf (psf, "   SLCE count : %d\n", slce_count) ;
+			slce_count = 0 ;
+			}
+		switch (marker)
+		{	case GLOB_MARKER:
+					psf_binheader_readf (psf, "E4", &length) ;
+					psf_log_printf (psf, " %D : %d\n", marker, length) ;
+					psf_binheader_readf (psf, "j", length) ;
+					break ;
+
+			case RECY_MARKER:
+					psf_binheader_readf (psf, "E4", &length) ;
+					psf_log_printf (psf, " %D : %d\n", marker, length) ;
+					psf_binheader_readf (psf, "j", (length+1) & 0xFFFFFFFE) ; /* ?????? */
+					break ;
+
+			case CAT_MARKER:
+					psf_binheader_readf (psf, "E4", &length) ;
+					psf_log_printf (psf, " %D : %d\n", marker, length) ;
+					/*-psf_binheader_readf (psf, "j", length) ;-*/
+					break ;
+					
+			case DEVL_MARKER:
+					psf_binheader_readf (psf, "mE4", &marker, &length) ;
+					psf_log_printf (psf, "  DEVL%D : %d\n", marker, length) ;
+					if (length & 1)
+						length ++ ;
+					psf_binheader_readf (psf, "j", length) ;
+					break ;
+					
+			case EQ_MARKER:
+			case COMP_MARKER:
+					psf_binheader_readf (psf, "E4", &length) ;
+					psf_log_printf (psf, "   %D : %d\n", marker, length) ;
+					/* This is weird!!!! why make this (length - 1) */
+					if (length & 1)
+						length ++ ;
+					psf_binheader_readf (psf, "j", length) ;
+					break ;
+
+			case SLCL_MARKER:
+					psf_log_printf (psf, "  %D\n", marker) ;
+					slce_count = 0 ;
+					break ;
+					
+			case SLCE_MARKER:
+					/*-psf_log_printf (psf, "   %D\n", marker) ;-*/
+					
+					psf_binheader_readf (psf, "E4", &length) ;
+					/*-psf_log_printf (psf, "    ???????? : 0x%X\n", length) ;-*/
+					
+					psf_binheader_readf (psf, "E4", &length) ;
+					/*-psf_log_printf (psf, "    Start  ? : %d\n", length) ;-*/
+
+					psf_binheader_readf (psf, "E4", &length) ;
+					/*-psf_log_printf (psf, "    Length ? : %d\n", length) ;-*/
+
+				slce_total += length ;
+				
+					psf_binheader_readf (psf, "E4", &length) ;
+					/*-psf_log_printf (psf, "    ???????? : 0x%X\n", length) ;-*/
+					
+					slce_count ++ ;
+					break ;
+					
+			case SINF_MARKER:
+					psf_binheader_readf (psf, "E4", &length) ;
+					psf_log_printf (psf, " %D : %d\n", marker, length) ;
+
+					psf_binheader_readf (psf, "E2", &length) ;
+					psf_log_printf (psf, "  REX Version : %X ?\n", length) ;
+
+					psf_binheader_readf (psf, "E44", &psf->sf.samplerate, &psf->sf.samples) ;
+					psf_log_printf (psf, "  Sample Rate : %d\n", psf->sf.samplerate) ;
+					psf_log_printf (psf, "  Samples     : %d\n", psf->sf.samples) ;
+
+					psf_binheader_readf (psf, "E4", &length) ;
+					psf_log_printf (psf, "  ??????????? : %d\n", length) ;
+
+					psf_binheader_readf (psf, "E4", &length) ;
+					psf_log_printf (psf, "  ??????????? : %d\n", length) ;
+
+					break ;
+
+			case SDAT_MARKER:
+					psf_binheader_readf (psf, "E4", &length) ;
+					
+				sdat_length = length ;
+
+					/* Get the current offset. */
+					psf->dataoffset = psf_binheader_readf (psf, NULL) ;
+
+					if (psf->dataoffset + length != psf->filelength)
+						psf_log_printf (psf, " %D : %d (should be %d)\n", marker, length, psf->dataoffset + psf->filelength) ;
+					else
+						psf_log_printf (psf, " %D : %d\n", marker, length) ;
+					break ;
+
+			default :
+					psf_log_printf (psf, "Unknown marker : 0x%X %D", marker, marker) ;
+					return -1003 ;
+					break ;
+			} ;
+			
+		/* SDAT always last marker in file. */
+		if (marker == SDAT_MARKER)
+			break ;
+		} ;
+
+	puts (psf->logbuffer) ;
+	puts ("-----------------------------------") ;
+
+	printf ("SDAT length  : %d\n", sdat_length) ;
+	printf ("SLCE samples : %d\n", slce_total) ;
+
+	/* Two bytes per sample. */
+	printf ("Comp Ratio   : %f:1\n", (2.0 * slce_total) / sdat_length) ;
+	
+	puts (" ") ;
+	
+	psf->logbuffer [0] = 0 ;
+	
+	/* OK, have the header althought not too sure what it all means. */
+	
+	psf->endian = SF_ENDIAN_BIG ;
+
+	psf->datalength = psf->filelength - psf->dataoffset ;
+
+ 	if (psf_fseek (psf->filedes, psf->dataoffset, SEEK_SET))
+		return SFE_BAD_SEEK ;
+
+	psf->sf.format = (SF_FORMAT_REX2 | SF_FORMAT_DWVW_12) ;
+
+	psf->sf.channels 	= 1 ;
+	psf->bytewidth      = 2 ;
+	psf->blockwidth 	= psf->sf.channels * psf->bytewidth ;
+
+	if ((error = dwvw_init (psf, 16)))
+		return error ;
+
+	psf->close = rx2_close ;
+
+	if (! psf->sf.samples && psf->blockwidth)
+		psf->sf.samples = psf->datalength / psf->blockwidth ;
+
+	/* All done. */
+
+	return 0 ;
+} /* rx2_open */
+
+/*------------------------------------------------------------------------------
+*/
+
+static int	
+rx2_close	(SF_PRIVATE  *psf)
+{	
+	if (psf->mode == SFM_WRITE)
+	{	/*  Now we know for certain the length of the file we can re-write 
+		**	correct values for the FORM, 8SVX and BODY chunks.
+		*/
+                
+		} ;
+
+	if (psf->fdata)
+		free (psf->fdata) ;
+	psf->fdata = NULL ;
+	
+	return 0 ;
+} /* rx2_close */
+
--- a/common/libsndfile/src/samplitude.c
+++ b/common/libsndfile/src/samplitude.c
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2000-2001 Erik de Castro Lopo <[email protected]>
+** Copyright (C) 2000-2001-2002 Erik de Castro Lopo <[email protected]>
 **  
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -16,7 +16,6 @@
 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 */
 
-
 #include	<stdio.h>
 #include	<unistd.h>
 #include	<string.h>
@@ -70,7 +69,8 @@
 ** Public functions.
 */
 
-int 	smpltd_open_read	(SF_PRIVATE *psf)
+int 	
+smpltd_open	(SF_PRIVATE *psf)
 {	RAP_CHUNK rap ;
 	
 	psf_binheader_readf (psf, "mm", &(rap.sekd), &(rap.samr)) ;
@@ -91,18 +91,11 @@
 	printf ("channels        : %d\n", rap.channels) ;
 		
 -*/
-	psf->close = (func_close) smpltd_close ;
+	psf->close = smpltd_close ;
 
 	return 0 ;
-} /* smpltd_open_read */
+} /* smpltd_open */
 
-int 	
-smpltd_open_write	(SF_PRIVATE *psf)
-{	
-
-	return 0 ;
-} /* smpltd_open_write */
-
 /*------------------------------------------------------------------------------
 */
 
@@ -109,7 +102,7 @@
 static int	
 smpltd_close	(SF_PRIVATE  *psf)
 {	
-	if (psf->mode == SF_MODE_WRITE)
+	if (psf->mode == SFM_WRITE || psf->mode == SFM_RDWR)
 	{	/*  Now we know for certain the length of the file we can re-write 
 		**	correct values for the FORM, 8SVX and BODY chunks.
 		*/
@@ -116,10 +109,6 @@
                 
 		} ;
 
-	if (psf->fdata)
-		free (psf->fdata) ;
-	psf->fdata = NULL ;
-	
 	return 0 ;
 } /* smpltd_close */
 
--- /dev/null
+++ b/common/libsndfile/src/sd2.c
@@ -1,0 +1,177 @@
+/*
+** Copyright (C) 2001-2002 Erik de Castro Lopo <[email protected]>
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+** 
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+** 
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include	<stdio.h>
+#include	<unistd.h>
+#include	<string.h>
+
+#include	"sndfile.h"
+#include	"config.h"
+#include	"sfendian.h"
+#include	"common.h"
+
+
+/*------------------------------------------------------------------------------
+ * Macros to handle big/little endian issues.
+*/
+
+#define	Sd2f_MARKER		MAKE_MARKER ('S', 'd', '2', 'f')
+
+/*------------------------------------------------------------------------------
+ * Typedefs for file chunks.
+*/
+
+
+
+/*------------------------------------------------------------------------------
+ * Private static functions.
+*/
+
+static int	sd2_close	(SF_PRIVATE  *psf) ;
+
+/*------------------------------------------------------------------------------
+** Public functions.
+*/
+
+int 	
+sd2_open	(SF_PRIVATE *psf)
+{	int		marker, software, rsrc_offset, len ;
+	int 	rsrc_data_offset, rsrc_map_offset, rsrc_data_length, rsrc_map_length ;
+	char	slen ;
+	float	srate ;	
+
+	/* Read only so far. */
+
+	psf_binheader_readf (psf, "Epmmj", 0x41, &marker, &software, 14) ;
+	
+	if (marker != Sd2f_MARKER)
+	{	printf ("Whoops!!!\n") ;
+		puts (psf->logbuffer) ;
+		exit (1) ;
+		} ;
+
+	psf_log_printf (psf, "Marker   : %D\n"
+						 "Software : %D\n", 
+			marker, software) ;
+	
+	/* This seems to be a constant for binhex files. */
+	psf->dataoffset = 0x80 ;
+	
+	/* All SD2 files are big endian. */
+	psf->endian= SF_ENDIAN_BIG ;
+
+	/*
+	**	Resource header info from:
+	**	http://developer.apple.com/techpubs/mac/MoreToolbox/MoreToolbox-99.html
+	*/
+
+	rsrc_offset = psf->datalength + psf->dataoffset ;
+	if (rsrc_offset & 0x7F)
+		rsrc_offset = rsrc_offset - (rsrc_offset & 0x7F) + psf->dataoffset ;
+
+	psf_log_printf (psf, "Resource offset : 0x%X\n", rsrc_offset) ;
+
+	/* Jump to the rsrc_offset fork section. */
+	psf_binheader_readf (psf, "Ep", rsrc_offset) ;
+	
+	psf_binheader_readf (psf, "E4444", &rsrc_data_offset, &rsrc_map_offset, &rsrc_data_length, &rsrc_map_length) ;
+
+	rsrc_data_offset += rsrc_offset ;
+	rsrc_map_offset  += rsrc_offset ;
+
+	psf_log_printf (psf, " data offset : 0x%X\n"
+						 " map  offset : 0x%X\n"
+						 " data length : 0x%X\n"
+						 " map  length : 0x%X\n",
+	
+			rsrc_data_offset, rsrc_map_offset, rsrc_data_length, rsrc_map_length) ;
+			
+	if (rsrc_data_offset + rsrc_data_length > rsrc_map_offset || rsrc_map_offset + rsrc_map_length > psf->filelength)
+	{	puts ("##############################") ;
+		puts (psf->logbuffer) ;
+		puts ("##############################") ;
+		exit (1) ;
+		} ;
+
+	memset (psf->buffer, 0, sizeof (psf->buffer)) ;
+	
+	psf_binheader_readf (psf, "Ep41", rsrc_data_offset, &len, &slen) ;
+	if (slen + 1 == len)
+	{	psf_binheader_readf (psf, "Eb", psf->buffer, len - 1) ;
+		((char*) psf->buffer) [len - 1] = 0 ;
+		if (sscanf ((char*) psf->buffer, "%d", &len) == 1)
+			psf->bytewidth = len ; 
+		} ;
+		
+	psf_binheader_readf (psf, "E41", &len, &slen) ;
+	if (slen + 1 == len)
+	{	psf_binheader_readf (psf, "Eb", psf->buffer, len - 1) ;
+		((char*) psf->buffer) [len - 1] = 0 ;
+		if (sscanf ((char*) psf->buffer, "%f", &srate) == 1)
+			psf->sf.samplerate = srate ; 
+		} ;
+		
+	psf_binheader_readf (psf, "E41", &len, &slen) ;
+	if (slen + 1 == len)
+	{	psf_binheader_readf (psf, "Eb", psf->buffer, len - 1) ;
+		((char*) psf->buffer) [len - 1] = 0 ;
+		if (sscanf ((char*) psf->buffer, "%d", &len) == 1)
+			psf->sf.channels = len ; 
+		} ;
+		
+	psf_log_printf (psf, "  byte width  : %d\n", psf->bytewidth) ;
+	psf_log_printf (psf, "  sample rate : %d\n", psf->sf.samplerate) ;
+	psf_log_printf (psf, "  channels    : %d\n", psf->sf.channels) ;
+
+	if (psf->bytewidth == 2)
+	{	psf->sf.format = SF_FORMAT_SD2 | SF_FORMAT_PCM_16 ;
+		
+		psf->blockwidth = psf->bytewidth * psf->sf.channels ;
+		
+		psf->sf.samples = psf->datalength / psf->blockwidth ;
+		} ;
+	
+	pcm_init (psf) ;
+
+	psf_fseek (psf->filedes, psf->dataoffset, SEEK_SET) ;
+
+	psf->close = sd2_close ;
+	
+	return 0 ;
+} /* sd2_open */
+
+/*------------------------------------------------------------------------------
+*/
+
+static int	
+sd2_close	(SF_PRIVATE  *psf)
+{	
+	if (psf->mode == SFM_WRITE)
+	{	/*  Now we know for certain the audio_length of the file we can re-write 
+		**	correct values for the FORM, 8SVX and BODY chunks.
+		*/
+                
+		} ;
+
+	if (psf->fdata)
+		free (psf->fdata) ;
+	psf->fdata = NULL ;
+	
+	return 0 ;
+} /* sd2_close */
+
--- /dev/null
+++ b/common/libsndfile/src/sf_command.h
@@ -1,0 +1,41 @@
+/*
+** Copyright (C) 2001-2002 Erik de Castro Lopo <[email protected]>
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+** 
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+** 
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#ifndef SF_COMMAND_H_INCLUDED
+#define SF_COMMAND_H_INCLUDED
+
+/* Command values for sf_command (). These are obtained using the Python
+** script sf_command.py in the top level directory of the libsndfile sources.
+*/
+enum
+{
+	SFC_GET_LIB_VERSION	= 0x124A0C,	/* "get-lib-version" */
+	SFC_GET_LOG_INFO	= 0x248A3,	/* "get-log-info" */
+	SFC_GET_NORM_DOUBLE	= 0x12692D,	/* "get-norm-double" */
+	SFC_GET_NORM_FLOAT	= 0x934EA,	/* "get-norm-float" */
+	SFC_SET_NORM_DOUBLE	= 0x17692D,	/* "set-norm-double" */
+	SFC_SET_NORM_FLOAT	= 0xBB4EA,	/* "set-norm-float" */
+	SFC_GET_SIMPLE_COUNT	= 0x12145914,	/* "get-simple-format-count" */
+	SFC_GET_SIMPLE_FORMAT	= 0x485162,	/* "get-simple-format" */
+	SFC_TRUE	= 0x2E7,	/* "true" */
+	SFC_FALSE	= 0x45B		/* "false" */
+} ;
+
+#endif /* SF_COMMAND_H_INCLUDED */
+
+
--- a/common/libsndfile/src/sfendian.h
+++ b/common/libsndfile/src/sfendian.h
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 1999-2001 Erik de Castro Lopo <[email protected]>
+** Copyright (C) 1999-2002 Erik de Castro Lopo <[email protected]>
 **  
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -18,69 +18,11 @@
 
 #include	"config.h"
 
-#if HAVE_ENDIAN_H
-	/* This is the best way to do it. Unfortunately Sparc Solaris (and
-	** possibly others) don't have <endian.h>
-	*/
-	#include	<endian.h>
-	#if (__BYTE_ORDER == __LITTLE_ENDIAN)
-		#define	CPU_IS_LITTLE_ENDIAN		1
-		#define	CPU_IS_BIG_ENDIAN			0
-	#elif (__BYTE_ORDER == __BIG_ENDIAN)
-		#define	CPU_IS_LITTLE_ENDIAN		0
-		#define	CPU_IS_BIG_ENDIAN			1
-	#else
-		#error "A bit confused about endian-ness! Have <endian.h> but not __BYTEORDER."
-	#endif
-#else
-	/* If we don't have <endian.h> use the guess based on target processor
-	** from the autoconf process.
-	*/
-	#if GUESS_LITTLE_ENDIAN
-		#define	CPU_IS_LITTLE_ENDIAN		1
-		#define	CPU_IS_BIG_ENDIAN			0
-	#elif GUESS_BIG_ENDIAN
-		#define	CPU_IS_LITTLE_ENDIAN		0
-		#define	CPU_IS_BIG_ENDIAN			1
-	#else
-		#error "Endian guess seems incorrect."
-	#endif
-#endif	
-
-#define		ENDSWAP_SHORT(x)			((((x)>>8)&0xFF)|(((x)&0xFF)<<8))
-#define		ENDSWAP_INT(x)				((((x)>>24)&0xFF)|(((x)>>8)&0xFF00)|(((x)&0xFF00)<<8)|(((x)&0xFF)<<24))
-
-#if (CPU_IS_LITTLE_ENDIAN == 1)
-	#define	H2LE_SHORT(x)				(x)
-	#define	H2LE_INT(x)					(x)
-	#define	LE2H_SHORT(x)				(x)
-	#define	LE2H_INT(x)					(x)
-
-	#define	BE2H_INT(x)					ENDSWAP_INT(x)
-	#define	BE2H_SHORT(x)				ENDSWAP_SHORT(x)
-	#define	H2BE_INT(x)					ENDSWAP_INT(x)
-	#define	H2BE_SHORT(x)				ENDSWAP_SHORT(x)
-
-#elif (CPU_IS_BIG_ENDIAN == 1)
-	#define	H2LE_SHORT(x)				ENDSWAP_SHORT(x)
-	#define	H2LE_INT(x)					ENDSWAP_INT(x)
-	#define	LE2H_SHORT(x)				ENDSWAP_SHORT(x)
-	#define	LE2H_INT(x)					ENDSWAP_INT(x)
-
-	#define	BE2H_INT(x)					(x)
-	#define	BE2H_SHORT(x)				(x)
-	#define	H2BE_INT(x)					(x)
-	#define	H2BE_SHORT(x)				(x)
-
-#else
-	#error "Cannot determine endian-ness of processor."
-#endif
-
-#if (CPU_IS_LITTLE_ENDIAN == 1)
+#if (! CPU_IS_LITTLE_ENDIAN && ! CPU_IS_BIG_ENDIAN)
+#error "Target CPU endian-ness unknown. May need to hand edit src/config.h"
+#elif (CPU_IS_LITTLE_ENDIAN == 1)
 #	define	MAKE_MARKER(a,b,c,d)		((a)|((b)<<8)|((c)<<16)|((d)<<24))
 #elif (CPU_IS_BIG_ENDIAN == 1)
 #	define	MAKE_MARKER(a,b,c,d)		(((a)<<24)|((b)<<16)|((c)<<8)|(d))
-#else
-#	error "Cannot determine endian-ness of processor."
 #endif
 
--- a/common/libsndfile/src/sndfile.c
+++ b/common/libsndfile/src/sndfile.c
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 1999-2001 Erik de Castro Lopo <[email protected]>
+** Copyright (C) 1999-2002 Erik de Castro Lopo <[email protected]>
 **  
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -23,8 +23,12 @@
 #include	<ctype.h>
 #include	<math.h>
 
-/* For the Metrowerks CodeWarrior Pro Compiler (mainly MacOS) */
+/* EMX / gcc compiler for OS/2. */
+#ifdef __EMX__
+#include	<sys/types.h>
+#endif
 
+/* For the Metrowerks CodeWarrior Pro Compiler (mainly MacOS) */
 #if	(defined (__MWERKS__))
 #include	<stat.h>
 #else
@@ -48,15 +52,15 @@
 { 
 	{	SFE_NO_ERROR			, "No Error." },
 	{	SFE_BAD_FILE			, "File does not exist or is not a regular file (possibly a pipe?)." },
+	{	SFE_BAD_FILE_READ		, "File exists but no data could be read." },
 	{	SFE_OPEN_FAILED			, "Could not open file." },
 	{	SFE_BAD_OPEN_FORMAT		, "Bad format specified for file open." },
 	{	SFE_BAD_SNDFILE_PTR		, "Not a valid SNDFILE* pointer." },
 	{	SFE_BAD_SF_INFO_PTR		, "NULL SF_INFO pointer passed to libsndfile." },
-	{	SFE_BAD_INT_FD			, "Bad file descriptor." },
+	{	SFE_BAD_SF_INCOMPLETE	, "SF_PRIVATE struct incomplete and end of header parsing." },
+	{	SFE_BAD_FILE_PTR		, "Bad FILE pointer." },
 	{	SFE_BAD_INT_PTR			, "Internal error, Bad pointer." },
 	{	SFE_MALLOC_FAILED		, "Internal malloc () failed." },
-	{	SFE_BAD_SEEK			, "Internal fseek() failed." },
-	{	SFE_NOT_SEEKABLE		, "Seek attempted on unseekable file type." },
 	{	SFE_UNIMPLEMENTED		, "File contains data in an unimplemented format." },
 	{	SFE_BAD_READ_ALIGN  	, "Attempt to read a non-integer number of channels." },
 	{	SFE_BAD_WRITE_ALIGN 	, "Attempt to write a non-integer number of channels." },
@@ -69,8 +73,21 @@
 	{	SFE_SHORT_READ			, "Short read error." },
 	{	SFE_SHORT_WRITE			, "Short write error." },
 	{	SFE_INTERNAL			, "Unspecified internal error." },
+	{	SFE_LOG_OVERRUN			, "Log buffer has overrun. File probably broken." },
 	{	SFE_BAD_CONTROL_CMD		, "Bad command passed to function sf_command()." },
+	{	SFE_BAD_ENDIAN			, "Bad endian-ness. Try default endian-ness" },
+	{	SFE_CHANNEL_COUNT		, "Too many channels specified." },
 	
+	{	SFE_BAD_SEEK			, "Internal psf_fseek() failed." },
+	{	SFE_NOT_SEEKABLE		, "Seek attempted on unseekable file type." },
+	{	SFE_AMBIGUOUS_SEEK		, "Error: combination of file open mode and seek command is ambiguous." },
+	{	SFE_WRONG_SEEK			, "Error: invalid seek parameters." },
+	{	SFE_SEEK_FAILED			, "Error: parameters OK, but psf_seek() failed." },
+
+	{	SFE_BAD_OPEN_MODE		, "Error: bad mode parameter for file open." },		
+	{	SFE_OPEN_PIPE_RDWR		, "Error: attempt toopen a pipe in read/write mode." },
+	{	SFE_RDWR_POSITION		, "Error on RDWR position (cryptic)." },
+
 	{	SFE_WAV_NO_RIFF			, "Error in WAV file. No 'RIFF' chunk marker." },
 	{	SFE_WAV_NO_WAVE			, "Error in WAV file. No 'WAVE' chunk marker." },
 	{	SFE_WAV_NO_FMT			, "Error in WAV file. No 'fmt ' chunk marker." },
@@ -105,7 +122,9 @@
 	{	SFE_AU_UNKNOWN_FORMAT	, "Error in AU file, unknown format." },
 	{	SFE_AU_NO_DOTSND		, "Error in AU file, missing '.snd' or 'dns.' marker." },
 
-	{	SFE_RAW_READ_BAD_SPEC	, "Error while opening RAW file for read. Must specify format, pcmbitwidth and channels." },
+	{	SFE_RAW_READ_BAD_SPEC	, "Error while opening RAW file for read. Must specify format and channels.\n"
+									"Possibly trying to open unsupported format."
+									 },
 	{	SFE_RAW_BAD_BITWIDTH	, "Error. RAW file bitwidth must be a multiple of 8." },
 
 	{	SFE_PAF_NO_MARKER		, "Error in PAF file, no marker." },
@@ -125,13 +144,35 @@
 	{	SFE_SMTD_NO_SAMR		, "Error in Samplitude file, no 'SAMR' marker." }, 
 
 	{	SFE_VOC_NO_CREATIVE		, "Error in VOC file, no 'Creative Voice File' marker." }, 
+	{	SFE_VOC_BAD_FORMAT		, "Error in VOC file, bad format." }, 
 	{	SFE_VOC_BAD_VERSION		, "Error in VOC file, bad version number." }, 
 	{	SFE_VOC_BAD_MARKER		, "Error in VOC file, bad marker in file." }, 
+	{	SFE_VOC_BAD_SECTIONS	, "Error in VOC file, incompatible VOC sections." }, 
+	{	SFE_VOC_MULTI_SAMPLERATE, "Error in VOC file, more than one sample rate defined." }, 
+	{	SFE_VOC_MULTI_SECTION	, "Unimplemented VOC file feature, file contains multiple sound sections." },
+	{	SFE_VOC_MULTI_PARAM		, "Error in VOC file, file contains multiple bit or channel widths." },
+	{	SFE_VOC_SECTION_COUNT	, "Error in VOC file, too many sections." }, 
 
 	{	SFE_IRCAM_NO_MARKER		, "Error in IRCAM file, bad IRCAM marker." }, 
 	{	SFE_IRCAM_BAD_CHANNELS	, "Error in IRCAM file, bad channel count." }, 
 	{	SFE_IRCAM_UNKNOWN_FORMAT, "Error in IRCAM file, unknow encoding format." }, 
 
+	{	SFE_W64_64_BIT			, "Error in W64 file, file contains 64 bit offset." },
+
+	{	SFE_W64_NO_RIFF			, "Error in W64 file. No 'riff' chunk marker." },
+	{	SFE_W64_NO_WAVE			, "Error in W64 file. No 'wave' chunk marker." },
+	{	SFE_W64_NO_FMT			, "Error in W64 file. No 'fmt ' chunk marker." },
+	{	SFE_W64_NO_DATA			, "Error in W64 file. No 'data' chunk marker." },
+
+	{	SFE_W64_FMT_SHORT		, "Error in W64 file. Short 'fmt ' chunk." },
+	{	SFE_W64_FMT_TOO_BIG		, "Error in W64 file. 'fmt ' chunk too large." },
+	
+	{	SFE_W64_ADPCM_NOT4BIT	, "Error in ADPCM W64 file. Invalid bit width." },
+	{	SFE_W64_ADPCM_CHANNELS	, "Error in ADPCM W64 file. Invalid number of channels." },
+	{	SFE_W64_GSM610_FORMAT	, "Error in GSM610 W64 file. Invalid format chunk." },
+
+	{	SFE_DWVW_BAD_BITWIDTH	, "Error : Bad bit width for DWVW encoding. Must be 12, 16 or 24." },
+
 	{	SFE_MAX_ERROR			, "Maximum error number." }
 } ;
 
@@ -146,7 +187,7 @@
 static void save_header_info (SF_PRIVATE *psf) ;
 static void	copy_filename (SF_PRIVATE *psf, const char *path) ;
 
-static int	hash_command (const char *cmd) ;
+/*-static int	hash_command (const char *cmd) ;-*/
 
 /*------------------------------------------------------------------------------
 ** Private (static) variables.
@@ -162,8 +203,8 @@
 		{	if (! (a))								\
 				return SFE_BAD_SNDFILE_PTR ;		\
 			(b) = (SF_PRIVATE*) (a) ;				\
-			if (!((b)->file))						\
-				return SFE_BAD_INT_FD ;				\
+			if (((b)->filedes) < 0)					\
+				return SFE_BAD_FILE_PTR ;			\
 			if ((b)->Magick != SNDFILE_MAGICK)		\
 				return	SFE_BAD_SNDFILE_PTR ;		\
 			(b)->error = 0 ;						\
@@ -174,127 +215,220 @@
 */
 
 SNDFILE*
-sf_open_read	(const char *path, SF_INFO *sfinfo)
+sf_open	(const char *path, int mode, SF_INFO *sfinfo)
 {	SF_PRIVATE 	*psf ;
-	int			filetype ;
+	int			error ;
+
+	if (mode != SFM_READ && mode != SFM_WRITE && mode != SFM_RDWR)
+	{	sf_errno = SFE_BAD_OPEN_MODE ;
+		return	NULL ;
+		} ;
 	
+	if (! path)
+	{	sf_errno = SFE_BAD_FILE ;
+		return	NULL ;
+		} ;
+	
 	if (! sfinfo)
 	{	sf_errno = SFE_BAD_SF_INFO_PTR ;
 		return	NULL ;
 		} ;
 		
-	sf_errno = 0 ;
+	sf_errno = error = 0 ;
 	sf_logbuffer [0] = 0 ;
 	
-	psf = malloc (sizeof (SF_PRIVATE)) ; 
-	if (! psf)
+	if (! (psf = malloc (sizeof (SF_PRIVATE))))
 	{	sf_errno = SFE_MALLOC_FAILED ;
 		return	NULL ;
 		} ;
 
 	memset (psf, 0, sizeof (SF_PRIVATE)) ;
-	psf->Magick = SNDFILE_MAGICK ;
 
-	if (! strcmp (path, "-"))
-	{	psf->file = stdin ;
+	psf_log_printf (psf, "File : %s\n", path) ;
+	copy_filename (psf, path) ;
+
+	psf->Magick 		= SNDFILE_MAGICK ;
+	psf->norm_float 	= SF_TRUE ;
+	psf->norm_double	= SF_TRUE ;
+	psf->mode 			= mode ;
+	psf->filelength		= -1 ;
+	psf->filedes		= -1 ;
+	psf->dataoffset		= -1 ;
+	psf->datalength		= -1 ;
+	psf->read_current	= -1 ;
+	psf->write_current	= -1 ;
+
+	psf->new_seek		= psf_default_seek ;
+	psf->sf.format		= sfinfo->format ;
+
+	if (strcmp (path, "-") == 0)
+	{	/* File is a either stdin or stdout. */
 		psf->sf.seekable = SF_FALSE ;
-		}
-	else
-	{	/* fopen with 'b' means binary file mode for Win32 systems. */
-		if (! (psf->file = fopen (path, "rb")))
-		{	sf_errno = SFE_OPEN_FAILED ;
-			return NULL ;
+		switch (mode)
+		{	case SFM_RDWR :
+					error = SFE_OPEN_PIPE_RDWR ;
+					break ;
+
+			case SFM_READ :
+					psf->filedes = 0 ;
+					break ;
+
+			case SFM_WRITE :
+					psf->filedes = 1 ;
+					break ;
+
+			default :
+					error = SFE_BAD_OPEN_MODE ;
+					break ;
 			} ;
-		psf->sf.seekable = SF_TRUE ;
-		} ;
-		 
-	if (! psf->file) 
-	{	sf_errno = SFE_OPEN_FAILED ;
+		psf->filelength = SF_MAX_COUNT ;
+		}
+	else if ((psf->filedes = psf_open (path, mode)) < 0)
+		error = SFE_OPEN_FAILED ;
+
+	if (error)
+	{	if (psf->filedes >= 0)
+			psf_fclose (psf->filedes) ;
 		sf_close (psf) ;
+		sf_errno = error ;
 		return NULL ;
 		} ;
-	
-	psf->mode = SF_MODE_READ ;
-	
-	psf_log_printf (psf, "%s\n", path) ;
-	if (psf->sf.seekable)
-	{	fseek (psf->file, 0, SEEK_END) ;
-		psf->filelength = ftell (psf->file) ;
-		fseek (psf->file, 0, SEEK_SET) ;
-		psf_log_printf (psf, "size : %d\n", psf->filelength) ;
+		
+	/* File is open, so get the length. */
+	psf->filelength = psf_get_filelen (psf->filedes) ;
+
+	memcpy (&(psf->sf), sfinfo, sizeof (SF_INFO)) ;
+
+	psf->sf.seekable = SF_TRUE ;
+	psf->sf.sections = 1 ;
+
+	if (mode == SFM_WRITE || (mode == SFM_RDWR && psf->filelength == 0))
+	{	/* If the file is being opened for write or RDWR and the file is currently
+		** empty, then the SF_INFO struct must contain valid data.
+		*/ 
+		if (! sf_format_check (sfinfo))
+			error = SFE_BAD_OPEN_FORMAT ;
 		}
-	else
-		psf->filelength = 0x7FFF0000 ;  /* Stupidly big number. */
+	else if ((psf->sf.format & SF_FORMAT_TYPEMASK) != SF_FORMAT_RAW)
+	{	/* If type RAW has not been specified then need to figure out file type. */
+		psf->sf.format = guess_file_type (psf, psf->filename) ;
+		}  ;
 	
-	copy_filename (psf, path) ;
-	
-	if ((sfinfo->format & SF_FORMAT_TYPEMASK) == SF_FORMAT_RAW && sfinfo->channels && sfinfo->pcmbitwidth)
-		filetype = SF_FORMAT_RAW ;
-	else
-	{	memset (sfinfo, 0, sizeof (SF_INFO)) ;
-		filetype = guess_file_type (psf, psf->filename) ;
+	if (error)
+	{	if (psf->filedes >= 0)
+			psf_fclose (psf->filedes) ;
+		sf_close (psf) ;
+		sf_errno = error ;
+		return NULL ;
 		} ;
-		
-	switch (filetype)
+
+	/* Set bytewidth if known. */
+	switch (sfinfo->format & SF_FORMAT_SUBMASK)
+	{	case SF_FORMAT_PCM_S8 :
+		case SF_FORMAT_PCM_U8 : 
+		case SF_FORMAT_ULAW : 
+		case SF_FORMAT_ALAW : 
+				psf->bytewidth = 1 ;
+				break ;
+
+		case SF_FORMAT_PCM_16 : 
+				psf->bytewidth = 2 ;
+				break ;
+
+		case SF_FORMAT_PCM_24 : 
+				psf->bytewidth = 3 ;
+				break ;
+
+		case SF_FORMAT_PCM_32 : 
+		case SF_FORMAT_FLOAT : 
+				psf->bytewidth = 4 ;
+				break ;
+
+		case SF_FORMAT_DOUBLE : 
+				psf->bytewidth = 8 ;
+				break ;
+		} ;
+
+	/* Call the initialisation function for the relevant file type. */
+	switch (psf->sf.format & SF_FORMAT_TYPEMASK)
 	{	case	SF_FORMAT_WAV :
-				sf_errno = wav_open_read (psf) ;
+				error = wav_open (psf) ;
 				break ;
 
 		case	SF_FORMAT_AIFF :
-				sf_errno = aiff_open_read (psf) ;
+				error = aiff_open (psf) ;
 				break ;
 
 		case	SF_FORMAT_AU :
-				sf_errno = au_open_read (psf) ;
+				error = au_open (psf) ;
 				break ;
 
+		case	SF_FORMAT_AU | SF_FORMAT_ULAW :
+				error = au_nh_open (psf) ;
+				break ;
+
 		case	SF_FORMAT_RAW :
-				/* For RAW files, need the sfinfo struct data to
-				** figure out the bitwidth, endian-ness etc.
-				*/
-				memcpy (&(psf->sf), sfinfo, sizeof (SF_INFO)) ;
-				sf_errno = raw_open_read (psf) ;
+				error = raw_open (psf) ;
 				break ;
 
 		case	SF_FORMAT_PAF :
-				sf_errno = paf_open_read (psf) ;
+				error = paf_open (psf) ;
 				break ;
 
 		case	SF_FORMAT_SVX :
-				sf_errno = svx_open_read (psf) ;
+				error = svx_open (psf) ;
 				break ;
 
 		case	SF_FORMAT_NIST :
-				sf_errno = nist_open_read (psf) ;
+				error = nist_open (psf) ;
 				break ;
 
 		case	SF_FORMAT_SMPLTD :
-				sf_errno = smpltd_open_read (psf) ;
+				error = smpltd_open (psf) ;
 				break ;
 
+		case	SF_FORMAT_IRCAM :
+				error = ircam_open (psf) ;
+				break ;
+
 		case	SF_FORMAT_VOC :
-				sf_errno = voc_open_read (psf) ;
+				error = voc_open (psf) ;
 				break ;
 
-		case	SF_FORMAT_IRCAM :
-				sf_errno = ircam_open_read (psf) ;
+		case	SF_FORMAT_W64 :
+				error = w64_open (psf) ;
 				break ;
 
+		case	SF_FORMAT_SD2 :
+				error = sd2_open (psf) ;
+				break ;
+
+		case	SF_FORMAT_REX2 :
+				error = rx2_open (psf) ;
+				break ;
+
+		case	SF_FORMAT_TXW :
+				error = txw_open (psf) ;
+				break ;
+
 		default :	
-				sf_errno = SFE_UNKNOWN_FORMAT ;
+				error = SFE_UNKNOWN_FORMAT ;
 		} ;
 	
-	/* Both the file format and the file must be seekable to enable sf_seek(). */
-	/*-psf->sf.seekable = (psf->sf.seekable && seekable) ? SF_TRUE : SF_FALSE ;-*/
-		
-	if (sf_errno)
-	{	save_header_info (psf) ;
+	if (error)
+	{	sf_errno = error ;
+		save_header_info (psf) ;
 		sf_close (psf) ;
 		return NULL ;
 		} ;
 
 	if (! validate_sfinfo (&(psf->sf)))
-	{	psf_log_SF_INFO (psf) ;
+	{
+#ifndef REMOVE_ME
+printf ("validate_sfinfo\n") ;
+puts (psf->logbuffer) ;
+#endif
+		psf_log_SF_INFO (psf) ;
 		save_header_info (psf) ;
 		sf_errno = SFE_BAD_SF_INFO ;
 		sf_close (psf) ;
@@ -302,136 +436,46 @@
 		} ;
 		
 	if (! validate_psf (psf))
-	{	printf ("validate_psf\n") ;
+	{	
+#ifndef REMOVE_ME
+printf ("validate_psf\n") ;
+puts (psf->logbuffer) ;
+#endif
 		save_header_info (psf) ;
 		sf_errno = SFE_INTERNAL ;
 		sf_close (psf) ;
 		return NULL ;
 		} ;
-		
+
+	psf->read_current  = 0 ;
+	psf->write_current=  (psf->mode == SFM_RDWR) ? psf->sf.samples : 0 ;
+
 	memcpy (sfinfo, &(psf->sf), sizeof (SF_INFO)) ;
 
 	return (SNDFILE*) psf ;
-} /* sf_open_read */
+} /* sf_open */
 
 /*------------------------------------------------------------------------------
 */
 
-SNDFILE*
-sf_open_write	(const char *path, const SF_INFO *sfinfo)
-{	SF_PRIVATE 	*psf ;
+int
+sf_error	(SNDFILE *sndfile)
+{	SF_PRIVATE	*psf ;
 	
-	if (! sfinfo)
-	{	sf_errno = SFE_BAD_SF_INFO_PTR ;
-		return	NULL ;
+	if (! sndfile)
+	{	if (sf_error)
+			return 1 ;
+		return 0 ;
 		} ;
-		
-	if (! sf_format_check (sfinfo))
-	{	sf_errno = SFE_BAD_OPEN_FORMAT ;
-		return	NULL ;
-		} ;
 
-	sf_errno = 0 ;
-	sf_logbuffer [0] = 0 ;
+	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;
 	
-	psf = malloc (sizeof (SF_PRIVATE)) ; 
-	if (! psf)
-	{	sf_errno = SFE_MALLOC_FAILED ;
-		return	NULL ;
-		} ;
+	if (psf->error)
+		return 1 ;
 	
-	memset (psf, 0, sizeof (SF_PRIVATE)) ;
-	memcpy (&(psf->sf), sfinfo, sizeof (SF_INFO)) ;
+	return 0 ;
+} /* sf_error */
 
-	psf->Magick = SNDFILE_MAGICK ;
-
-	if (! strcmp (path, "-"))
-	{	psf->file = stdout ;
-		psf->sf.seekable = SF_FALSE ;
-		}
-	else
-	{	/* fopen with 'b' means binary file mode for Win32 systems. */
-		if (! (psf->file = fopen (path, "wb")))		
-		{	sf_errno = SFE_OPEN_FAILED ;
-			sf_close (psf) ;
-			return NULL ;
-			} ;
-		} ;
-		
-	psf->mode = SF_MODE_WRITE ;
-	
-	psf->filelength = ftell (psf->file) ;
-	fseek (psf->file, 0, SEEK_SET) ;
-
-	copy_filename (psf, path) ;
-	
-	switch (sfinfo->format & SF_FORMAT_TYPEMASK)
-	{	case	SF_FORMAT_WAV :
-				if ((sf_errno = wav_open_write (psf)))
-				{	sf_close (psf) ;
-					return NULL ;
-					} ;
-				break ;
-
-		case	SF_FORMAT_AIFF :
-				if ((sf_errno = aiff_open_write (psf)))
-				{	sf_close (psf) ;
-					return NULL ;
-					} ;
-				break ;
-
-		case	SF_FORMAT_AU :
-		case	SF_FORMAT_AULE :
-				if ((sf_errno = au_open_write (psf)))
-				{	sf_close (psf) ;
-					return NULL ;
-					} ;
-				break ;
-				
-		case    SF_FORMAT_RAW :
-				if ((sf_errno = raw_open_write (psf)))
-				{	sf_close (psf) ;
-					return NULL ;
-					} ;
-				break ;
-
-		case    SF_FORMAT_PAF :
-				if ((sf_errno = paf_open_write (psf)))
-				{	sf_close (psf) ;
-					return NULL ;
-					} ;
-				break ;
-
-		case    SF_FORMAT_SVX :
-				if ((sf_errno = svx_open_write (psf)))
-				{	sf_close (psf) ;
-					return NULL ;
-					} ;
-				break ;
-
-		case	SF_FORMAT_NIST :
-				if ((sf_errno = nist_open_write (psf)))
-				{	sf_close (psf) ;
-					return NULL ;
-					} ;
-				break ;
-
-		case	SF_FORMAT_IRCAM :
-				if ((sf_errno = ircam_open_write (psf)))
-				{	sf_close (psf) ;
-					return NULL ;
-					} ;
-				break ;
-
-		default :	
-				sf_errno = SFE_UNKNOWN_FORMAT ;
-				sf_close (psf) ;
-				return NULL ;
-		} ;				
-
-	return (SNDFILE*) psf ;
-} /* sf_open_write */
-
 /*------------------------------------------------------------------------------
 */
 
@@ -526,8 +570,11 @@
 
 int
 sf_format_check	(const SF_INFO *info)
-{	int	subformat = info->format & SF_FORMAT_SUBMASK ;
+{	int	subformat, endian ;
 
+	subformat = info->format & SF_FORMAT_SUBMASK ;
+	endian = info->format & SF_FORMAT_SUBMASK ;
+
 	/* This is the place where each file format can check if the suppiled
 	** SF_INFO struct is valid.
 	** Return 0 on failure, 1 ons success. 
@@ -538,87 +585,143 @@
 
 	switch (info->format & SF_FORMAT_TYPEMASK)
 	{	case SF_FORMAT_WAV :
-				if (subformat == SF_FORMAT_PCM && (info->pcmbitwidth >= 8 && info->pcmbitwidth <= 32))
+				/* WAV is strictly little endian. */
+				if (endian == SF_ENDIAN_BIG || endian == SF_ENDIAN_CPU)
+					return 0 ;
+				if (subformat == SF_FORMAT_PCM_U8 || subformat == SF_FORMAT_PCM_16)
 					return 1 ;
-				if (subformat == SF_FORMAT_IMA_ADPCM && info->pcmbitwidth == 16 && info->channels <= 2)
+				if (subformat == SF_FORMAT_PCM_24 || subformat == SF_FORMAT_PCM_32)
 					return 1 ;
-				if (subformat == SF_FORMAT_MS_ADPCM && info->pcmbitwidth == 16 && info->channels <= 2)
+				if ((subformat == SF_FORMAT_IMA_ADPCM || subformat == SF_FORMAT_MS_ADPCM) && info->channels <= 2)
 					return 1 ;
-				if (subformat == SF_FORMAT_GSM610 && info->pcmbitwidth == 16 && info->channels == 1)
+				if (subformat == SF_FORMAT_GSM610 && info->channels == 1)
 					return 1 ;
 				if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW)
 					return 1 ;
-				if (subformat == SF_FORMAT_FLOAT && info->pcmbitwidth == 32)
+				if (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE)
 					return 1 ;
 				break ;
 				
 		case SF_FORMAT_AIFF :
-				if (subformat == SF_FORMAT_PCM && (info->pcmbitwidth >= 8 && info->pcmbitwidth <= 32))
+				/* AIFF does allow both endian-nesses for PCM data.*/
+				if (subformat == SF_FORMAT_PCM_16 || subformat == SF_FORMAT_PCM_24 || subformat == SF_FORMAT_PCM_32)
 					return 1 ;
-				if (subformat == SF_FORMAT_PCM_LE && (info->pcmbitwidth >= 8 && info->pcmbitwidth <= 32))
+				/* Other encodings. Check for endian-ness. */
+				if (endian == SF_ENDIAN_LITTLE || endian == SF_ENDIAN_CPU)
+					return 0 ;
+				if (subformat == SF_FORMAT_PCM_U8 || subformat == SF_FORMAT_PCM_S8)
 					return 1 ;
-				if (subformat == SF_FORMAT_PCM_BE && (info->pcmbitwidth >= 8 && info->pcmbitwidth <= 32))
+				if (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE)
 					return 1 ;
-				if (subformat == SF_FORMAT_FLOAT && (info->pcmbitwidth == 32))
+				if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW)
 					return 1 ;
+				if ((subformat == SF_FORMAT_DWVW_12 || subformat == SF_FORMAT_DWVW_16 || 
+							subformat == SF_FORMAT_DWVW_24) && info-> channels == 1)
+					return 1 ;
 				break ;
 				
 		case SF_FORMAT_AU :
-		case SF_FORMAT_AULE :
-				if (subformat == SF_FORMAT_PCM && (info->pcmbitwidth >= 8 && info->pcmbitwidth <= 32))
+				if (subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_16)
 					return 1 ;
+				if (subformat == SF_FORMAT_PCM_24 || subformat == SF_FORMAT_PCM_32)
+					return 1 ;
 				if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW)
 					return 1 ;
+				if (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE)
+					return 1 ;
 				if (subformat == SF_FORMAT_G721_32 && info->channels == 1)
 					return 1 ;
 				if (subformat == SF_FORMAT_G723_24 && info->channels == 1)
 					return 1 ;
-				if (subformat == SF_FORMAT_FLOAT && (info->pcmbitwidth == 32))
-					return 1 ;
 				break ;
 				
 		case SF_FORMAT_RAW :
-				if (subformat == SF_FORMAT_PCM_S8 && info->pcmbitwidth == 8)
+				if (subformat == SF_FORMAT_PCM_U8 || subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_16)
 					return 1 ;
-				if (subformat == SF_FORMAT_PCM_U8 && info->pcmbitwidth == 8)
+				if (subformat == SF_FORMAT_PCM_24 || subformat == SF_FORMAT_PCM_32)
 					return 1 ;
-				if (subformat != SF_FORMAT_PCM_BE && subformat != SF_FORMAT_PCM_LE)
-					break ;
-				if (! (info->pcmbitwidth % 8) && info->pcmbitwidth <= 32)
+				if (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE)
 					return 1 ;
+				if (subformat == SF_FORMAT_ALAW || subformat == SF_FORMAT_ULAW)
+					return 1 ;
+				if ((subformat == SF_FORMAT_DWVW_12 || subformat == SF_FORMAT_DWVW_16 || 
+							subformat == SF_FORMAT_DWVW_24) && info-> channels == 1)
+					return 1 ;
+				if (subformat == SF_FORMAT_GSM610 && info->channels == 1)
+					return 1 ;
 				break ;
 
 		case SF_FORMAT_PAF :
-				if (subformat == SF_FORMAT_PCM_S8 && info->pcmbitwidth == 8)
+				if (subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_16)
 					return 1 ;
-				if (subformat != SF_FORMAT_PCM_BE && subformat != SF_FORMAT_PCM_LE && subformat != SF_FORMAT_PCM)
-					break ;
-				if ((info->pcmbitwidth % 8) == 0 && info->pcmbitwidth <= 24)
+				if (subformat == SF_FORMAT_PCM_24 || subformat == SF_FORMAT_PCM_32)
 					return 1 ;
 				break ;
 
 		case SF_FORMAT_SVX :
-				if (subformat == SF_FORMAT_PCM && (info->pcmbitwidth == 8 || info->pcmbitwidth == 16))
+				/* SVX currently does not support more than one channel. */
+				if (info->channels != 1)
+					return 0 ;
+				/* Always big endian. */
+				if (endian == SF_ENDIAN_LITTLE || endian == SF_ENDIAN_CPU)
+					return 0 ;
+
+				if ((subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_16) && info->channels == 1)
 					return 1 ;
 				break ;
 
 		case SF_FORMAT_NIST :
-				if ((subformat == SF_FORMAT_PCM_BE || subformat == SF_FORMAT_PCM_LE || subformat == SF_FORMAT_PCM)
-						&& info->pcmbitwidth >= 16 && info->pcmbitwidth <= 32)
+				if (subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_16)
 					return 1 ;
+				if (subformat == SF_FORMAT_PCM_24 || subformat == SF_FORMAT_PCM_32)
+					return 1 ;
+				if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW)
+					return 1 ;
 				break ;
 				
 		case SF_FORMAT_IRCAM :
-				if ((subformat == SF_FORMAT_PCM_BE || subformat == SF_FORMAT_PCM_LE || subformat == SF_FORMAT_PCM)
-						&& info->pcmbitwidth >= 16 && info->pcmbitwidth <= 32)
+				if (subformat == SF_FORMAT_PCM_16 || subformat == SF_FORMAT_PCM_24 || subformat == SF_FORMAT_PCM_32)
 					return 1 ;
-				if ((subformat == SF_FORMAT_FLOAT_BE || subformat == SF_FORMAT_FLOAT_LE || subformat == SF_FORMAT_FLOAT)
-						&& info->pcmbitwidth == 32)
+				if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW || subformat == SF_FORMAT_FLOAT)
 					return 1 ;
+				break ;
+				
+		case SF_FORMAT_VOC :
+				/* VOC is strictly little endian. */
+				if (endian == SF_ENDIAN_BIG || endian == SF_ENDIAN_CPU)
+					return 0 ;
+				if (subformat == SF_FORMAT_PCM_U8 || subformat == SF_FORMAT_PCM_16)
+					return 1 ;
 				if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW)
 					return 1 ;
 				break ;
 				
+		case SF_FORMAT_W64 :
+				/* W64 is strictly little endian. */
+				if (endian == SF_ENDIAN_BIG || endian == SF_ENDIAN_CPU)
+					return 0 ;
+				if (subformat == SF_FORMAT_PCM_U8 || subformat == SF_FORMAT_PCM_16)
+					return 1 ;
+				if (subformat == SF_FORMAT_PCM_24 || subformat == SF_FORMAT_PCM_32)
+					return 1 ;
+				if ((subformat == SF_FORMAT_IMA_ADPCM || subformat == SF_FORMAT_MS_ADPCM) && info->channels <= 2)
+					return 1 ;
+				if (subformat == SF_FORMAT_GSM610 && info->channels == 1)
+					return 1 ;
+				if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW)
+					return 1 ;
+				if (subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE)
+					return 1 ;
+				break ;
+				
+		case SF_FORMAT_SD2 :
+				/* SD2 is strictly big endian. */
+				if (endian == SF_ENDIAN_LITTLE || endian == SF_ENDIAN_CPU)
+					return 0 ;
+				if (subformat == SF_FORMAT_PCM_16)
+					return 1 ;
+				break ;
+				
 		default : break ;
 		} ;
 
@@ -628,94 +731,99 @@
 /*------------------------------------------------------------------------------
 */
 
-size_t
-sf_get_header_info	(SNDFILE *sndfile, char *buffer, size_t bufferlen, size_t offset)
-{	SF_PRIVATE	*psf ;
-	int			len ;
+int	
+sf_command	(SNDFILE *sndfile, int command, void *data, int datasize)
+{	SF_PRIVATE 		*psf = NULL ;
 	
-	if (! sndfile)
-	{	strncpy (buffer, sf_logbuffer, bufferlen - 1) ;
-		buffer [bufferlen - 1] = 0 ;
-		return strlen (sf_logbuffer) ;
-		} ;
-
-	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;
+	/*-command = hash_command (cmd) ;-*/
 	
-	len = strlen (psf->logbuffer) ;
-	if (offset < 0 || offset >= len)
+	/* This set of commands do not need the sndfile parameter. */
+	switch (command)
+	{	case  SFC_GET_LIB_VERSION :
+			strncpy (data, PACKAGE "-" VERSION, datasize - 1) ;
+		((char*) data) [datasize - 1] = 0 ;
 		return 0 ;
-	
-	strncpy (buffer, psf->logbuffer, bufferlen - 1) ;
-	buffer [bufferlen - 1] = 0 ;
-	
-	return strlen (psf->logbuffer) ;
-} /* sf_get_header_info */
 
-/*------------------------------------------------------------------------------
-*/
-
-size_t	
-sf_get_lib_version	(char *buffer, size_t bufferlen)
-{	if (! buffer || ! bufferlen)
-		return 0 ;
-
-	strncpy (buffer, PACKAGE "-" VERSION, bufferlen - 1) ;
-	buffer [bufferlen - 1] = 0 ;
+		case SFC_GET_SIMPLE_FORMAT_COUNT :
+			if (! data || datasize != SIGNED_SIZEOF (int))
+				return (sf_errno = SFE_BAD_CONTROL_CMD) ;
+			*((int*) data) = psf_get_format_simple_count () ;
+			return 0 ;
 	
-	return strlen (buffer) ;
-} /* sf_get_lib_version */
+		case SFC_GET_SIMPLE_FORMAT :
+			if (! data || datasize != SIGNED_SIZEOF (SF_FORMAT_INFO))
+				return (sf_errno = SFE_BAD_CONTROL_CMD) ;
+			return psf_get_format_simple (data) ;
 
-/*------------------------------------------------------------------------------
-*/
+		case SFC_GET_FORMAT_MAJOR_COUNT :
+			if (! data || datasize != SIGNED_SIZEOF (int))
+				return (sf_errno = SFE_BAD_CONTROL_CMD) ;
+			*((int*) data) = psf_get_format_major_count () ;
+			return 0 ;
+		
+		case SFC_GET_FORMAT_MAJOR :
+			if (! data || datasize != SIGNED_SIZEOF (SF_FORMAT_INFO))
+				return (sf_errno = SFE_BAD_CONTROL_CMD) ;
+			return psf_get_format_major (data) ;
 
-int	
-sf_command	(SNDFILE *sndfile, const char *cmd, void *data, int datasize)
-{	SF_PRIVATE 		*psf ;
-	int command ;
-	
-	command = hash_command (cmd) ;
-	
-	if (command == SFC_LIB_VERSION) 
-	{	strncpy (data, PACKAGE "-" VERSION, datasize - 1) ;
+		case SFC_GET_FORMAT_SUBTYPE_COUNT :
+			if (! data || datasize != SIGNED_SIZEOF (int))
+				return (sf_errno = SFE_BAD_CONTROL_CMD) ;
+			*((int*) data) = psf_get_format_subtype_count () ;
+			return 0 ;
+		
+		case SFC_GET_FORMAT_SUBTYPE :
+			if (! data || datasize != SIGNED_SIZEOF (SF_FORMAT_INFO))
+				return (sf_errno = SFE_BAD_CONTROL_CMD) ;
+			return psf_get_format_subtype (data) ;
+
+		} ;
+		
+	if (! sndfile && command == SFC_GET_LOG_INFO)
+	{	if (! data)
+			return (psf->error = SFE_BAD_CONTROL_CMD) ;
+		strncpy (data, sf_logbuffer, datasize) ;
 		((char*) data) [datasize - 1] = 0 ;
-		return strlen ((char*) data) ;
+		return 0 ;
 		} ;
 
 	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;
-	
+
 	switch (command)
-	{	case 0 :
-			return (psf->error = SFE_BAD_CONTROL_CMD) ;
-			
-		case SFC_NORM_FLOAT :
-			if (! data)
-				return (psf->error = SFE_BAD_CONTROL_CMD) ;
-			if (! strcmp ("on", data))
-				psf->norm_float = SF_TRUE ;
-			else if (! strcmp ("off", data))
-				psf->norm_float = SF_FALSE ;
-			else
-				return (psf->error = SFE_BAD_CONTROL_CMD) ;
+	{	case SFC_SET_NORM_FLOAT :
+			psf->norm_float = (datasize) ? SF_TRUE : SF_FALSE ;
 			break ;		
-			
-		case SFC_NORM_DOUBLE :
+
+		case SFC_SET_NORM_DOUBLE :
+			psf->norm_double = (datasize) ? SF_TRUE : SF_FALSE ;
+			break ;
+
+		case SFC_GET_NORM_FLOAT :
+			return psf->norm_float ;
+
+		case SFC_GET_NORM_DOUBLE :
+			return psf->norm_double ;
+
+		case SFC_GET_LOG_INFO :
 			if (! data)
 				return (psf->error = SFE_BAD_CONTROL_CMD) ;
-			if (! strcmp ("on", data))
-				psf->norm_double = SF_TRUE ;
-			else if (! strcmp ("off", data))
-				psf->norm_double = SF_FALSE ;
-			else
+			strncpy (data, psf->logbuffer, datasize) ;
+			((char*) data) [datasize - 1] = 0 ;
+			break ;
+
+		case SFC_CALC_SIGNAL_MAX :
+			if (! data || datasize != sizeof (double))
 				return (psf->error = SFE_BAD_CONTROL_CMD) ;
-			break ;		
-			
+			*((double*) data) = psf_calc_signal_max (psf) ;
+			break ;
+
 		default :
 			/* Must be a file specific command. Pass it on. */
 			if (psf->command)
 				return psf->command (psf, command, data, datasize) ;
 
-			psf_log_printf (psf, "*** sf_command : cmd = %08X\n", command) ;
-			break ;
+			psf_log_printf (psf, "*** sf_command : cmd = 0x%X\n", command) ;
+			return (psf->error = SFE_BAD_CONTROL_CMD) ;
 		} ;
 
 	return 0 ;
@@ -724,156 +832,155 @@
 /*------------------------------------------------------------------------------
 */
 
-double  
-sf_signal_max   (SNDFILE *sndfile)
-{	SF_PRIVATE 		*psf ;
-	long			position ;
-	unsigned int	k, len, readcount ;
-	double 			max = 0.0, *data, temp ;
-	
-	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;
-	
-	/* If the file has a PEAK chunk use that information. */
-	if (psf->has_peak)
-	{	for (k = 0 ; k < psf->sf.channels ; k++)
-			if (max < fabs (psf->peak.peak [k].value))
-				max = fabs (psf->peak.peak [k].value);
-		return max ;
-		} ;
-	
-	/* If the file is not seekable, there is nothing we can do. */
-	if (! psf->sf.seekable)
-	{	psf->error = SFE_NOT_SEEKABLE ;
-		return	0.0 ;
-		} ;
-		
-	if (! psf->read_double)
-	{	psf->error = SFE_UNIMPLEMENTED ;
-		return	0.0 ;
-		} ;
-		
-	/* Brute force. Read the whole file and find the biggest sample. */
-	position = sf_seek (sndfile, 0, SEEK_CUR) ; /* Get current position in file */
-	sf_seek (sndfile, 0, SEEK_SET) ;			/* Go to start of file. */
-	
-	len = psf->sf.channels * 1024 ;
-	
-	data = malloc (len * sizeof (double)) ;
-	readcount = len ;
-	while (readcount == len)
-	{	readcount = sf_read_double (sndfile, data, len, 0) ;
-		for (k = 0 ; k < len ; k++)
-		{	temp = data [k] ;
-			temp = temp < 0.0 ? -temp : temp ;
-			max  = temp > max ? temp : max ;
-			} ;
-		} ;
-	free (data) ;
-	
-	sf_seek (sndfile, position, SEEK_SET) ;		/* Return to original position. */
-	
-	return	max ;
-} /* sf_signal_max */
-
-/*------------------------------------------------------------------------------
-*/
-
-long	
-sf_seek	(SNDFILE *sndfile, long offset, int whence)
+sf_count_t	
+sf_seek	(SNDFILE *sndfile, sf_count_t offset, int whence)
 {	SF_PRIVATE 	*psf ;
-	long		realseek, position ;
+	sf_count_t	seek_from_start = 0, retval ;
 
 	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;
 	
 	if (! psf->sf.seekable)
 	{	psf->error = SFE_NOT_SEEKABLE ;
-		return	((long) -1) ;
+		return	((sf_count_t) -1) ;
 		} ;
 	
-	if (psf->seek_func)
-	{	psf->seek_func (psf, offset, whence) ;
-		return psf->current ;
+	/* If the whence parameter has a mode ORed in, check to see that 
+	** it makes sense.
+	*/
+	if (((whence & SFM_MASK) == SFM_WRITE && psf->mode == SFM_READ) ||
+			((whence & SFM_MASK) == SFM_WRITE && psf->mode == SFM_WRITE))
+	{	psf->error = SFE_WRONG_SEEK ;
+		return ((sf_count_t) -1) ;
 		} ;
-		
-	if (! (psf->blockwidth && psf->datalength && psf->dataoffset))
-	{	psf->error = SFE_BAD_SEEK ;
-		return	((long) -1) ;
-		} ;
-
+	
+	/* Convert all SEEK_CUR and SEEK_END into seek_from_start to be 
+	** used with SEEK_SET.
+	*/
 	switch (whence)
-	{	case SEEK_SET :
-				if (offset < 0 || offset * psf->blockwidth > psf->datalength)
-				{	psf->error = SFE_BAD_SEEK ;
-					return	((long) -1) ;
-					} ;
-				realseek = psf->dataoffset + offset * psf->blockwidth ;
-				fseek (psf->file, realseek, SEEK_SET) ;
-				position = ftell (psf->file) ;
+	{	/* The SEEK_SET behaviour is independant of mode. */
+		case SEEK_SET :
+		case SEEK_SET | SFM_READ :
+		case SEEK_SET | SFM_WRITE :
+		case SEEK_SET | SFM_RDWR :
+				seek_from_start = offset ;
 				break ;
-
+				
+		/* The SEEK_CUR is a little more tricky. */
 		case SEEK_CUR :
-				position = (ftell (psf->file) - psf->dataoffset) / psf->blockwidth ;
-				if (psf->current + offset > psf->sf.samples)
-				{	psf->error = SFE_BAD_SEEK ;
-					return	((long) -1) ;
-					} ;
-				realseek = psf->dataoffset + (position + offset) * psf->blockwidth ;
-				fseek (psf->file, realseek, SEEK_SET) ;
-				position = ftell (psf->file) ;
+				if (psf->mode == SFM_READ)
+					seek_from_start = psf->read_current + offset ;
+				else if (psf->mode == SFM_WRITE)	
+					seek_from_start = psf->write_current + offset ;
+				else
+					psf->error = SFE_AMBIGUOUS_SEEK ;
 				break ;
-
+ 
+		case SEEK_CUR | SFM_READ :
+				/*=====================================
+				if (offset == 0)
+					return psf->read_current ;
+				=====================================*/
+				seek_from_start = psf->read_current + offset ;
+				break ;
+			
+		case SEEK_CUR | SFM_WRITE :
+				seek_from_start = psf->write_current + offset ;
+				break ;
+			
+		/* The SEEK_END */
 		case SEEK_END :
-				if (offset > 0 || psf->sf.samples + offset < 0)
-				{	psf->error = SFE_BAD_SEEK ;
-					return	((long) -1) ;
-					} ;
-				realseek = (psf->sf.samples + offset) * psf->blockwidth + psf->dataoffset ;
+				if (psf->mode != SFM_READ && psf->mode != SFM_WRITE)
+					psf->error = SFE_AMBIGUOUS_SEEK ;
+				else
+					seek_from_start = psf->sf.samples + offset ;
+				break ;
 
-				fseek (psf->file, realseek, SEEK_SET) ;
-				position = ftell (psf->file) ;
+		case SEEK_END | SFM_READ :
+				seek_from_start = psf->sf.samples + offset ;
+				/*=======================================
+				if (seek_from_start == psf->read_current)
+					return psf->read_current ;
+				=======================================*/
 				break ;
-				
-		default : 
+		case SEEK_END | SFM_WRITE :
+				seek_from_start = psf->sf.samples + offset ;
+				break ;
+
+		default :
 				psf->error = SFE_BAD_SEEK ;
-				return	((long) -1) ;
+				break ;
+		} ;	
+
+	if (psf->error)
+		return ((sf_count_t) -1) ;
+
+	if (seek_from_start < 0 || seek_from_start > psf->sf.samples)
+	{	psf->error = SFE_BAD_SEEK ;
+		return ((sf_count_t) -1) ;
 		} ;
 
-	psf->current = (position - psf->dataoffset) / psf->blockwidth ;
-	return psf->current ;
+	if (psf->new_seek)
+	{	int new_mode = (whence & SFM_MASK) ? (whence & SFM_MASK) : psf->mode ;
+	
+		retval = psf->new_seek (psf, new_mode, seek_from_start) ;
+		
+		switch (new_mode)
+		{	case SFM_READ :
+					psf->read_current = retval ;
+					break ;
+			case SFM_WRITE :
+					psf->write_current = retval ;
+					break ;
+			case SFM_RDWR :
+					psf->read_current = retval ;
+					psf->write_current = retval ;
+					new_mode = SFM_READ ;
+					break ;
+			} ;
+		
+		psf->last_op = new_mode ;
+
+		return retval ;
+		} ;
+	
+	psf->error = SFE_AMBIGUOUS_SEEK ;
+	return ((sf_count_t) -1) ;
 } /* sf_seek */
 
 /*------------------------------------------------------------------------------
 */
 
-size_t
-sf_read_raw		(SNDFILE *sndfile, void *ptr, size_t bytes)
+sf_count_t
+sf_read_raw		(SNDFILE *sndfile, void *ptr, sf_count_t bytes)
 {	SF_PRIVATE 	*psf ;
-	size_t		count ;
+	sf_count_t	count ;
 
 	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;
 	
-	if (psf->mode != SF_MODE_READ)
+	if (psf->mode == SFM_WRITE)
 	{	psf->error = SFE_NOT_READMODE ;
 		return	0 ;
 		} ;
-	
-	if (psf->current >= psf->datalength)
+
+	if (bytes < 0 || psf->read_current >= psf->datalength)
 	{	memset (ptr, 0, bytes) ;
 		return 0 ;
 		} ;
-	
+
 	if (bytes % (psf->sf.channels * psf->bytewidth))
 	{	psf->error = SFE_BAD_READ_ALIGN ;
 		return 0 ;
 		} ;
-	
-	count = fread (ptr, 1, bytes, psf->file) ;
-		
+
+	count = psf_fread (ptr, 1, bytes, psf->filedes) ;
+
 	if (count < bytes)
 		memset (((char*)ptr) + count, 0, bytes - count) ;
 
-	psf->current += count / psf->blockwidth ;
-	
+	psf->read_current += count / psf->blockwidth ;
+
+	psf->last_op = SFM_READ ;
+
 	return count ;
 } /* sf_read_raw */
 
@@ -880,14 +987,14 @@
 /*------------------------------------------------------------------------------
 */
 
-size_t
-sf_read_short		(SNDFILE *sndfile, short *ptr, size_t len)
+sf_count_t
+sf_read_short	(SNDFILE *sndfile, short *ptr, sf_count_t len)
 {	SF_PRIVATE 	*psf ;
-	size_t		count, extra ;
+	sf_count_t	count, extra ;
 
 	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;
 	
-	if (psf->mode != SF_MODE_READ)
+	if (psf->mode == SFM_WRITE)
 	{	psf->error = SFE_NOT_READMODE ;
 		return 0 ;
 		} ;
@@ -897,63 +1004,75 @@
 		return 0 ;
 		} ;
 	
-	if (psf->current >= psf->sf.samples)
+	if (len <= 0 || psf->read_current >= psf->sf.samples)
 	{	memset (ptr, 0, len * sizeof (short)) ;
 		return 0 ; /* End of file. */
 		} ;
 
-	if (! psf->read_short)
+	if (! psf->read_short || ! psf->new_seek)
 	{	psf->error = SFE_UNIMPLEMENTED ;
 		return	0 ;
 		} ;
 		
+	if (psf->last_op != SFM_READ)
+		if (psf->new_seek (psf, SFM_READ, psf->read_current) < 0)
+			return 0 ;
+		
 	count = psf->read_short (psf, ptr, len) ;
 	
-	if (psf->current + count / psf->sf.channels > psf->sf.samples)
-	{	count = (psf->sf.samples - psf->current) * psf->sf.channels ;
+	if (psf->read_current + count / psf->sf.channels > psf->sf.samples)
+	{	count = (psf->sf.samples - psf->read_current) * psf->sf.channels ;
 		extra = len - count ;
 		memset (ptr + count, 0, extra * sizeof (short)) ;
-		psf->current = psf->sf.samples ;
+		psf->read_current = psf->sf.samples ;
 		} ;
 	
-	psf->current += count / psf->sf.channels ;
+	psf->read_current += count / psf->sf.channels ;
 	
+	psf->last_op = SFM_READ ;
+
 	return count ;
 } /* sf_read_short */
 
-size_t
-sf_readf_short		(SNDFILE *sndfile, short *ptr, size_t frames)
+sf_count_t
+sf_readf_short		(SNDFILE *sndfile, short *ptr, sf_count_t frames)
 {	SF_PRIVATE 	*psf ;
-	size_t		count, extra ;
+	sf_count_t		count, extra ;
 
 	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;
 	
-	if (psf->mode != SF_MODE_READ)
+	if (psf->mode == SFM_WRITE)
 	{	psf->error = SFE_NOT_READMODE ;
 		return 0 ;
 		} ;
 	
-	if (psf->current >= psf->sf.samples)
+	if (frames <= 0 || psf->read_current >= psf->sf.samples)
 	{	memset (ptr, 0, frames * psf->sf.channels * sizeof (short)) ;
 		return 0 ; /* End of file. */
 		} ;
 
-	if (! psf->read_short)
+	if (! psf->read_short || ! psf->new_seek)
 	{	psf->error = SFE_UNIMPLEMENTED ;
 		return 0 ;
 		} ;
 		
+	if (psf->last_op != SFM_READ)
+		if (psf->new_seek (psf, SFM_READ, psf->read_current) < 0)
+			return 0 ;
+		
 	count = psf->read_short (psf, ptr, frames * psf->sf.channels) ;
 	
-	if (psf->current + count / psf->sf.channels > psf->sf.samples)
-	{	count = (psf->sf.samples - psf->current) * psf->sf.channels ;
+	if (psf->read_current + count / psf->sf.channels > psf->sf.samples)
+	{	count = (psf->sf.samples - psf->read_current) * psf->sf.channels ;
 		extra =  frames * psf->sf.channels - count ;
 		memset (ptr + count, 0, extra * sizeof (short)) ;
-		psf->current = psf->sf.samples ;
+		psf->read_current = psf->sf.samples ;
 		} ;
 	
-	psf->current += count / psf->sf.channels ;
+	psf->read_current += count / psf->sf.channels ;
 	
+	psf->last_op = SFM_READ ;
+
 	return count / psf->sf.channels ;
 } /* sf_readf_short */
 
@@ -960,14 +1079,14 @@
 /*------------------------------------------------------------------------------
 */
 
-size_t	
-sf_read_int		(SNDFILE *sndfile, int *ptr, size_t len)
+sf_count_t	
+sf_read_int		(SNDFILE *sndfile, int *ptr, sf_count_t len)
 {	SF_PRIVATE 	*psf ;
-	size_t		count, extra ;
+	sf_count_t		count, extra ;
 
 	VALIDATE_SNDFILE_AND_ASSIGN_PSF   (sndfile,psf) ;
 
-	if (psf->mode != SF_MODE_READ)
+	if (psf->mode == SFM_WRITE)
 	{	psf->error = SFE_NOT_READMODE ;
 		return 0 ;
 		} ;
@@ -977,63 +1096,75 @@
 		return 0 ;
 		} ;
 	
-	if (psf->current >= psf->sf.samples)
+	if (len <= 0 || psf->read_current >= psf->sf.samples)
 	{	memset (ptr, 0, len * sizeof (int)) ;
 		return 0 ;
 		} ;
 
-	if (! psf->read_int)
+	if (! psf->read_int || ! psf->new_seek)
 	{	psf->error = SFE_UNIMPLEMENTED ;
 		return 0 ;
 		} ;
 		
+	if (psf->last_op != SFM_READ)
+		if (psf->new_seek (psf, SFM_READ, psf->read_current) < 0)
+			return 0 ;
+		
 	count = psf->read_int (psf, ptr, len) ;
 	
-	if (psf->current + count / psf->sf.channels > psf->sf.samples)
-	{	count = (psf->sf.samples - psf->current) * psf->sf.channels ;
+	if (psf->read_current + count / psf->sf.channels > psf->sf.samples)
+	{	count = (psf->sf.samples - psf->read_current) * psf->sf.channels ;
 		extra = len - count ;
 		memset (ptr + count, 0, extra * sizeof (int)) ;
-		psf->current = psf->sf.samples ;
+		psf->read_current = psf->sf.samples ;
 		} ;
 	
-	psf->current += count / psf->sf.channels ;
+	psf->read_current += count / psf->sf.channels ;
 	
+	psf->last_op = SFM_READ ;
+
 	return count ;
 } /* sf_read_int */
 
-size_t	
-sf_readf_int		(SNDFILE *sndfile, int *ptr, size_t frames)
+sf_count_t	
+sf_readf_int	(SNDFILE *sndfile, int *ptr, sf_count_t frames)
 {	SF_PRIVATE 	*psf ;
-	size_t		count, extra ;
+	sf_count_t		count, extra ;
 
 	VALIDATE_SNDFILE_AND_ASSIGN_PSF   (sndfile,psf) ;
 
-	if (psf->mode != SF_MODE_READ)
+	if (psf->mode == SFM_WRITE)
 	{	psf->error = SFE_NOT_READMODE ;
 		return 0 ;
 		} ;
 	
-	if (psf->current >= psf->sf.samples)
+	if (frames <= 0 || psf->read_current >= psf->sf.samples)
 	{	memset (ptr, 0, frames * psf->sf.channels * sizeof (int)) ;
 		return 0 ;
 		} ;
 
-	if (! psf->read_int)
+	if (! psf->read_int || ! psf->new_seek)
 	{	psf->error = SFE_UNIMPLEMENTED ;
 		return	0 ;
 		} ;
 		
+	if (psf->last_op != SFM_READ)
+		if (psf->new_seek (psf, SFM_READ, psf->read_current) < 0)
+			return 0 ;
+		
 	count = psf->read_int (psf, ptr, frames * psf->sf.channels) ;
 	
-	if (psf->current + count / psf->sf.channels > psf->sf.samples)
-	{	count = (psf->sf.samples - psf->current) * psf->sf.channels ;
+	if (psf->read_current + count / psf->sf.channels > psf->sf.samples)
+	{	count = (psf->sf.samples - psf->read_current) * psf->sf.channels ;
 		extra = frames * psf->sf.channels - count ;
 		memset (ptr + count, 0, extra * sizeof (int)) ;
-		psf->current = psf->sf.samples ;
+		psf->read_current = psf->sf.samples ;
 		} ;
 	
-	psf->current += count / psf->sf.channels ;
+	psf->read_current += count / psf->sf.channels ;
 	
+	psf->last_op = SFM_READ ;
+
 	return count / psf->sf.channels ;
 } /* sf_readf_int */
 
@@ -1040,14 +1171,14 @@
 /*------------------------------------------------------------------------------
 */
 
-size_t	
-sf_read_float		(SNDFILE *sndfile, float *ptr, size_t len)
+sf_count_t	
+sf_read_float	(SNDFILE *sndfile, float *ptr, sf_count_t len)
 {	SF_PRIVATE 	*psf ;
-	size_t		count, extra ;
+	sf_count_t		count, extra ;
 
 	VALIDATE_SNDFILE_AND_ASSIGN_PSF   (sndfile,psf) ;
 
-	if (psf->mode != SF_MODE_READ)
+	if (psf->mode == SFM_WRITE)
 	{	psf->error = SFE_NOT_READMODE ;
 		return 0 ;
 		} ;
@@ -1057,63 +1188,75 @@
 		return 0 ;
 		} ;
 	
-	if (psf->current >= psf->sf.samples)
+	if (len <= 0 || psf->read_current >= psf->sf.samples)
 	{	memset (ptr, 0, len * sizeof (float)) ;
 		return 0 ;
 		} ;
 
-	if (! psf->read_float)
+	if (! psf->read_float || ! psf->new_seek)
 	{	psf->error = SFE_UNIMPLEMENTED ;
 		return	0 ;
 		} ;
 		
+	if (psf->last_op != SFM_READ)
+		if (psf->new_seek (psf, SFM_READ, psf->read_current) < 0)
+			return 0 ;
+		
 	count = psf->read_float (psf, ptr, len) ;
 	
-	if (psf->current + count / psf->sf.channels > psf->sf.samples)
-	{	count = (psf->sf.samples - psf->current) * psf->sf.channels ;
+	if (psf->read_current + count / psf->sf.channels > psf->sf.samples)
+	{	count = (psf->sf.samples - psf->read_current) * psf->sf.channels ;
 		extra = len - count ;
 		memset (ptr + count, 0, extra * sizeof (float)) ;
-		psf->current = psf->sf.samples ;
+		psf->read_current = psf->sf.samples ;
 		} ;
 	
-	psf->current += count / psf->sf.channels ;
+	psf->read_current += count / psf->sf.channels ;
 	
+	psf->last_op = SFM_READ ;
+
 	return count ;
 } /* sf_read_float */
 
-size_t	
-sf_readf_float		(SNDFILE *sndfile, float *ptr, size_t frames)
+sf_count_t	
+sf_readf_float	(SNDFILE *sndfile, float *ptr, sf_count_t frames)
 {	SF_PRIVATE 	*psf ;
-	size_t		count, extra ;
+	sf_count_t		count, extra ;
 
 	VALIDATE_SNDFILE_AND_ASSIGN_PSF   (sndfile,psf) ;
 
-	if (psf->mode != SF_MODE_READ)
+	if (psf->mode == SFM_WRITE)
 	{	psf->error = SFE_NOT_READMODE ;
 		return 0 ;
 		} ;
 	
-	if (psf->current >= psf->sf.samples)
+	if (frames <= 0 || psf->read_current >= psf->sf.samples)
 	{	memset (ptr, 0, frames * psf->sf.channels * sizeof (float)) ;
 		return 0 ;
 		} ;
 
-	if (! psf->read_float)
+	if (! psf->read_float || ! psf->new_seek)
 	{	psf->error = SFE_UNIMPLEMENTED ;
 		return	0 ;
 		} ;
 		
+	if (psf->last_op != SFM_READ)
+		if (psf->new_seek (psf, SFM_READ, psf->read_current) < 0)
+			return 0 ;
+		
 	count = psf->read_float (psf, ptr, frames * psf->sf.channels) ;
 	
-	if (psf->current + count / psf->sf.channels > psf->sf.samples)
-	{	count = (psf->sf.samples - psf->current) * psf->sf.channels ;
+	if (psf->read_current + count / psf->sf.channels > psf->sf.samples)
+	{	count = (psf->sf.samples - psf->read_current) * psf->sf.channels ;
 		extra = frames * psf->sf.channels - count ;
 		memset (ptr + count, 0, extra * sizeof (float)) ;
-		psf->current = psf->sf.samples ;
+		psf->read_current = psf->sf.samples ;
 		} ;
 	
-	psf->current += count / psf->sf.channels ;
+	psf->read_current += count / psf->sf.channels ;
 	
+	psf->last_op = SFM_READ ;
+
 	return count / psf->sf.channels ;
 } /* sf_readf_float */
 
@@ -1120,14 +1263,14 @@
 /*------------------------------------------------------------------------------
 */
 
-size_t	
-sf_read_double	(SNDFILE *sndfile, double *ptr, size_t len, int normalize)
+sf_count_t	
+sf_read_double	(SNDFILE *sndfile, double *ptr, sf_count_t len)
 {	SF_PRIVATE 	*psf ;
-	size_t		count, extra ;
+	sf_count_t		count, extra ;
 
 	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;
 	
-	if (psf->mode != SF_MODE_READ)
+	if (psf->mode == SFM_WRITE)
 	{	psf->error = SFE_NOT_READMODE ;
 		return 0 ;
 		} ;
@@ -1137,63 +1280,75 @@
 		return 0 ;
 		} ;
 	
-	if (psf->current >= psf->sf.samples)
+	if (len <= 0 || psf->read_current >= psf->sf.samples)
 	{	memset (ptr, 0, len * sizeof (double)) ;
 		return 0 ;
 		} ;
 		
-	if (! psf->read_double)
+	if (! psf->read_double || ! psf->new_seek)
 	{	psf->error = SFE_UNIMPLEMENTED ;
 		return	0 ;
 		} ;
 		
-	count = psf->read_double (psf, ptr, len, normalize) ;
+	if (psf->last_op != SFM_READ)
+		if (psf->new_seek (psf, SFM_READ, psf->read_current) < 0)
+			return 0 ;
+		
+	count = psf->read_double (psf, ptr, len) ;
 	
-	if (psf->current + count / psf->sf.channels > psf->sf.samples)
-	{	count = (psf->sf.samples - psf->current) * psf->sf.channels ;
+	if (psf->read_current + count / psf->sf.channels > psf->sf.samples)
+	{	count = (psf->sf.samples - psf->read_current) * psf->sf.channels ;
 		extra = len - count ;
 		memset (ptr + count, 0, extra * sizeof (double)) ;
-		psf->current = psf->sf.samples ;
+		psf->read_current = psf->sf.samples ;
 		} ;
 	
-	psf->current += count / psf->sf.channels ;
+	psf->read_current += count / psf->sf.channels ;
 	
+	psf->last_op = SFM_READ ;
+
 	return count ;
 } /* sf_read_double */
 
-size_t	
-sf_readf_double	(SNDFILE *sndfile, double *ptr, size_t frames, int normalize)
+sf_count_t	
+sf_readf_double	(SNDFILE *sndfile, double *ptr, sf_count_t frames)
 {	SF_PRIVATE 	*psf ;
-	size_t		count, extra ;
+	sf_count_t		count, extra ;
 
 	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;
 	
-	if (psf->mode != SF_MODE_READ)
+	if (psf->mode == SFM_WRITE)
 	{	psf->error = SFE_NOT_READMODE ;
 		return 0 ;
 		} ;
 	
-	if (psf->current >= psf->sf.samples)
+	if (frames <= 0 || psf->read_current >= psf->sf.samples)
 	{	memset (ptr, 0, frames * psf->sf.channels * sizeof (double)) ;
 		return 0 ;
 		} ;
 		
-	if (! psf->read_double)
+	if (! psf->read_double || ! psf->new_seek)
 	{	psf->error = SFE_UNIMPLEMENTED ;
 		return	0 ;
 		} ;
 		
-	count = psf->read_double (psf, ptr, frames * psf->sf.channels, normalize) ;
+	if (psf->last_op != SFM_READ)
+		if (psf->new_seek (psf, SFM_READ, psf->read_current) < 0)
+			return 0 ;
+		
+	count = psf->read_double (psf, ptr, frames * psf->sf.channels) ;
 	
-	if (psf->current + count / psf->sf.channels > psf->sf.samples)
-	{	count = (psf->sf.samples - psf->current) * psf->sf.channels ;
+	if (psf->read_current + count / psf->sf.channels > psf->sf.samples)
+	{	count = (psf->sf.samples - psf->read_current) * psf->sf.channels ;
 		extra = frames * psf->sf.channels - count ;
 		memset (ptr + count, 0, extra * sizeof (double)) ;
-		psf->current = psf->sf.samples ;
+		psf->read_current = psf->sf.samples ;
 		} ;
 	
-	psf->current += count / psf->sf.channels ;
+	psf->read_current += count / psf->sf.channels ;
 	
+	psf->last_op = SFM_READ ;
+
 	return count / psf->sf.channels ;
 } /* sf_readf_double */
 
@@ -1200,14 +1355,14 @@
 /*------------------------------------------------------------------------------
 */
 
-size_t	
-sf_write_raw	(SNDFILE *sndfile, void *ptr, size_t len)
+sf_count_t	
+sf_write_raw	(SNDFILE *sndfile, void *ptr, sf_count_t len)
 {	SF_PRIVATE 	*psf ;
-	size_t		count ;
+	sf_count_t	count ;
 
 	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;
 
-	if (psf->mode != SF_MODE_WRITE)
+	if (psf->mode == SFM_READ)
 	{	psf->error = SFE_NOT_WRITEMODE ;
 		return 0 ;
 		} ;
@@ -1217,10 +1372,15 @@
 		return 0 ;
 		} ;
 	
-	count = fwrite (ptr, 1, len, psf->file) ;
+	count = psf_fwrite (ptr, 1, len, psf->filedes) ;
 	
-	psf->current += count / psf->blockwidth ;
+	psf->write_current += count / psf->blockwidth ;
 	
+	if (psf->write_current > psf->sf.samples)
+		psf->sf.samples = psf->write_current ;	
+	
+	psf->last_op = SFM_WRITE ;
+
 	return count ;
 } /* sf_write_raw */
 
@@ -1227,14 +1387,14 @@
 /*------------------------------------------------------------------------------
 */
 
-size_t	
-sf_write_short		(SNDFILE *sndfile, short *ptr, size_t len)
+sf_count_t	
+sf_write_short	(SNDFILE *sndfile, short *ptr, sf_count_t len)
 {	SF_PRIVATE 	*psf ;
-	size_t		count ;
+	sf_count_t	count ;
 
 	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;
 
-	if (psf->mode != SF_MODE_WRITE)
+	if (psf->mode == SFM_READ)
 	{	psf->error = SFE_NOT_WRITEMODE ;
 		return 0 ;
 		} ;
@@ -1244,39 +1404,57 @@
 		return 0 ;
 		} ;
 	
-	if (! psf->write_short)
+	if (! psf->write_short || ! psf->new_seek)
 	{	psf->error = SFE_UNIMPLEMENTED ;
 		return 0 ;
 		} ;
 		
+	if (psf->last_op != SFM_WRITE)
+		if (psf->new_seek (psf, SFM_WRITE, psf->write_current) < 0)
+			return 0 ;
+		
 	count = psf->write_short (sndfile, ptr, len) ;
 	
-	psf->current += count / psf->sf.channels ;
+	psf->write_current += count / psf->sf.channels ;
 	
+	if (psf->write_current > psf->sf.samples)
+		psf->sf.samples = psf->write_current ;	
+
+	psf->last_op = SFM_WRITE ;
+
 	return count ;
 } /* sf_write_short */
 
-size_t	
-sf_writef_short		(SNDFILE *sndfile, short *ptr, size_t frames)
+sf_count_t	
+sf_writef_short	(SNDFILE *sndfile, short *ptr, sf_count_t frames)
 {	SF_PRIVATE 	*psf ;
-	size_t		count ;
+	sf_count_t	count ;
 
 	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;
 
-	if (psf->mode != SF_MODE_WRITE)
+	if (psf->mode == SFM_READ)
 	{	psf->error = SFE_NOT_WRITEMODE ;
 		return 0 ;
 		} ;
 	
-	if (! psf->write_short)
+	if (! psf->write_short || ! psf->new_seek)
 	{	psf->error = SFE_UNIMPLEMENTED ;
 		return 0 ;
 		} ;
 		
+	if (psf->last_op != SFM_WRITE)
+		if (psf->new_seek (psf, SFM_WRITE, psf->write_current) < 0)
+			return 0 ;
+		
 	count = psf->write_short (sndfile, ptr, frames * psf->sf.channels) ;
 	
-	psf->current += count / psf->sf.channels ;
+	psf->write_current += count / psf->sf.channels ;
 	
+	if (psf->write_current > psf->sf.samples)
+		psf->sf.samples = psf->write_current ;	
+
+	psf->last_op = SFM_WRITE ;
+
 	return count / psf->sf.channels ;
 } /* sf_writef_short */
 
@@ -1283,14 +1461,14 @@
 /*------------------------------------------------------------------------------
 */
 
-size_t	
-sf_write_int		(SNDFILE *sndfile, int *ptr, size_t len)
+sf_count_t	
+sf_write_int	(SNDFILE *sndfile, int *ptr, sf_count_t len)
 {	SF_PRIVATE 	*psf ;
-	size_t		count ;
+	sf_count_t	count ;
 
 	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;
 
-	if (psf->mode != SF_MODE_WRITE)
+	if (psf->mode == SFM_READ)
 	{	psf->error = SFE_NOT_WRITEMODE ;
 		return 0 ;
 		} ;
@@ -1300,39 +1478,57 @@
 		return 0 ;
 		} ;
 	
-	if (! psf->write_int)
+	if (! psf->write_int || ! psf->new_seek)
 	{	psf->error = SFE_UNIMPLEMENTED ;
 		return 0 ;
 		} ;
 		
+	if (psf->last_op != SFM_WRITE)
+		if (psf->new_seek (psf, SFM_WRITE, psf->write_current) < 0)
+			return 0 ;
+		
 	count = psf->write_int (sndfile, ptr, len) ;
 
-	psf->current += count / psf->sf.channels ;
+	psf->write_current += count / psf->sf.channels ;
 	
+	if (psf->write_current > psf->sf.samples)
+		psf->sf.samples = psf->write_current ;	
+
+	psf->last_op = SFM_WRITE ;
+
 	return count ;
 } /* sf_write_int */
 
-size_t	
-sf_writef_int		(SNDFILE *sndfile, int *ptr, size_t frames)
+sf_count_t	
+sf_writef_int	(SNDFILE *sndfile, int *ptr, sf_count_t frames)
 {	SF_PRIVATE 	*psf ;
-	size_t		count ;
+	sf_count_t	count ;
 
 	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;
 
-	if (psf->mode != SF_MODE_WRITE)
+	if (psf->mode == SFM_READ)
 	{	psf->error = SFE_NOT_WRITEMODE ;
 		return 0 ;
 		} ;
 	
-	if (! psf->write_int)
+	if (! psf->write_int || ! psf->new_seek)
 	{	psf->error = SFE_UNIMPLEMENTED ;
 		return 0 ;
 		} ;
 		
+	if (psf->last_op != SFM_WRITE)
+		if (psf->new_seek (psf, SFM_WRITE, psf->write_current) < 0)
+			return 0 ;
+		
 	count = psf->write_int (sndfile, ptr, frames * psf->sf.channels) ;
 
-	psf->current += count / psf->sf.channels ;
+	psf->write_current += count / psf->sf.channels ;
 	
+	if (psf->write_current > psf->sf.samples)
+		psf->sf.samples = psf->write_current ;	
+
+	psf->last_op = SFM_WRITE ;
+
 	return count / psf->sf.channels ;
 } /* sf_writef_int */
 
@@ -1339,14 +1535,14 @@
 /*------------------------------------------------------------------------------
 */
 
-size_t	
-sf_write_float		(SNDFILE *sndfile, float *ptr, size_t len)
+sf_count_t	
+sf_write_float	(SNDFILE *sndfile, float *ptr, sf_count_t len)
 {	SF_PRIVATE 	*psf ;
-	size_t		count ;
+	sf_count_t	count ;
 
 	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;
 
-	if (psf->mode != SF_MODE_WRITE)
+	if (psf->mode == SFM_READ)
 	{	psf->error = SFE_NOT_WRITEMODE ;
 		return 0 ;
 		} ;
@@ -1356,39 +1552,58 @@
 		return 0 ;
 		} ;
 	
-	if (! psf->write_float)
+	if (! psf->write_float || ! psf->new_seek)
 	{	psf->error = SFE_UNIMPLEMENTED ;
 		return 0 ;
 		} ;
 		
+	if (psf->last_op != SFM_WRITE)
+		if (psf->new_seek (psf, SFM_WRITE, psf->write_current) < 0)
+			return 0 ;
+
+		
 	count = psf->write_float (sndfile, ptr, len) ;
 
-	psf->current += count / psf->sf.channels ;
+	psf->write_current += count / psf->sf.channels ;
 	
+	if (psf->write_current > psf->sf.samples)
+		psf->sf.samples = psf->write_current ;	
+
+	psf->last_op = SFM_WRITE ;
+
 	return count ;
 } /* sf_write_float */
 
-size_t	
-sf_writef_float		(SNDFILE *sndfile, float *ptr, size_t frames)
+sf_count_t	
+sf_writef_float	(SNDFILE *sndfile, float *ptr, sf_count_t frames)
 {	SF_PRIVATE 	*psf ;
-	size_t		count ;
+	sf_count_t	count ;
 
 	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;
 
-	if (psf->mode != SF_MODE_WRITE)
+	if (psf->mode == SFM_READ)
 	{	psf->error = SFE_NOT_WRITEMODE ;
 		return 0 ;
 		} ;
 	
-	if (! psf->write_float)
+	if (! psf->write_float || ! psf->new_seek)
 	{	psf->error = SFE_UNIMPLEMENTED ;
 		return 0 ;
 		} ;
 		
+	if (psf->last_op != SFM_WRITE)
+		if (psf->new_seek (psf, SFM_WRITE, psf->write_current) < 0)
+			return 0 ;
+		
 	count = psf->write_float (sndfile, ptr, frames * psf->sf.channels) ;
 
-	psf->current += count / psf->sf.channels ;
+	psf->write_current += count / psf->sf.channels ;
 	
+	if (psf->write_current > psf->sf.samples)
+		psf->sf.samples = psf->write_current ;	
+
+	psf->last_op = SFM_WRITE ;
+
 	return count / psf->sf.channels ;
 } /* sf_writef_float */
 
@@ -1395,14 +1610,14 @@
 /*------------------------------------------------------------------------------
 */
 
-size_t	
-sf_write_double		(SNDFILE *sndfile, double *ptr, size_t len, int normalize)
+sf_count_t	
+sf_write_double	(SNDFILE *sndfile, double *ptr, sf_count_t len)
 {	SF_PRIVATE 	*psf ;
-	size_t		count ;
+	sf_count_t	count ;
 
 	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;
 
-	if (psf->mode != SF_MODE_WRITE)
+	if (psf->mode == SFM_READ)
 	{	psf->error = SFE_NOT_WRITEMODE ;
 		return 0 ;
 		} ;
@@ -1412,39 +1627,57 @@
 		return	0 ;
 		} ;
 		
-	if (! psf->write_double)
+	if (! psf->write_double || ! psf->new_seek)
 	{	psf->error = SFE_UNIMPLEMENTED ;
 		return 0 ;
 		} ;
 		
-	count = psf->write_double (sndfile, ptr, len, normalize) ;
+	if (psf->last_op != SFM_WRITE)
+		if (psf->new_seek (psf, SFM_WRITE, psf->write_current) < 0)
+			return 0 ;
+		
+	count = psf->write_double (sndfile, ptr, len) ;
 	
-	psf->current += count / psf->sf.channels ;
+	psf->write_current += count / psf->sf.channels ;
 	
+	if (psf->write_current > psf->sf.samples)
+		psf->sf.samples = psf->write_current ;	
+
+	psf->last_op = SFM_WRITE ;
+
 	return count ;
 } /* sf_write_double */
 
-size_t	
-sf_writef_double		(SNDFILE *sndfile, double *ptr, size_t frames, int normalize)
+sf_count_t	
+sf_writef_double	(SNDFILE *sndfile, double *ptr, sf_count_t frames)
 {	SF_PRIVATE 	*psf ;
-	size_t		count ;
+	sf_count_t	count ;
 
 	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;
 
-	if (psf->mode != SF_MODE_WRITE)
+	if (psf->mode == SFM_READ)
 	{	psf->error = SFE_NOT_WRITEMODE ;
 		return 0 ;
 		} ;
 	
-	if (! psf->write_double)
+	if (! psf->write_double || ! psf->new_seek)
 	{	psf->error = SFE_UNIMPLEMENTED ;
 		return 0 ;
 		} ;
 		
-	count = psf->write_double (sndfile, ptr, frames * psf->sf.channels, normalize) ;
+	if (psf->last_op != SFM_WRITE)
+		if (psf->new_seek (psf, SFM_WRITE, psf->write_current) < 0)
+			return 0 ;
+		
+	count = psf->write_double (sndfile, ptr, frames * psf->sf.channels) ;
 	
-	psf->current += count / psf->sf.channels ;
+	psf->write_current += count / psf->sf.channels ;
 	
+	if (psf->write_current > psf->sf.samples)
+		psf->sf.samples = psf->write_current ;	
+
+	psf->last_op = SFM_WRITE ;
+
 	return count / psf->sf.channels ;
 } /* sf_writef_double */
 
@@ -1461,7 +1694,10 @@
 	if (psf->close)
 		error = psf->close (psf) ;
 	
-	fclose (psf->file) ;
+	psf_fclose (psf->filedes) ;
+	
+	if (psf->fdata)
+		free (psf->fdata) ;
 	memset (psf, 0, sizeof (SF_PRIVATE)) ;
 		
 	free (psf) ;
@@ -1469,7 +1705,6 @@
 	return 0 ;
 } /* sf_close */
 
-
 /*=========================================================================
 ** Private functions.
 */
@@ -1517,10 +1752,14 @@
 
 static int 
 guess_file_type (SF_PRIVATE *psf, const char *filename)
-{	unsigned int buffer [3] ;
+{	int 	buffer [3] ;
+	unsigned char	cptr [0x40] ;
+			
+	if (psf_binheader_readf (psf, "b", &buffer, sizeof (buffer)) != sizeof (buffer))
+	{	psf->error = SFE_BAD_FILE_READ ;
+		return 0 ;
+		} ;
 
-	psf_binheader_readf (psf, "B", &buffer, sizeof (buffer)) ;
-
 	if (buffer [0] == MAKE_MARKER ('R','I','F','F') && buffer [2] == MAKE_MARKER ('W','A','V','E'))
 		return SF_FORMAT_WAV ;
 		
@@ -1541,9 +1780,6 @@
 	if (buffer [0] == MAKE_MARKER ('N','I','S','T'))
 		return SF_FORMAT_NIST ;
 		
-	if (buffer [0] == MAKE_MARKER ('S','E','K','D') && buffer [1] == MAKE_MARKER ('S','A','M','R'))
-		return SF_FORMAT_SMPLTD ;
-		
 	if (buffer [0] == MAKE_MARKER ('C','r','e','a') && buffer [1] == MAKE_MARKER ('t','i','v','e'))
 		return SF_FORMAT_VOC ;
 		
@@ -1551,6 +1787,12 @@
 		(buffer [0] & MAKE_MARKER (0xFF, 0xF8, 0xFF, 0xFF)) == MAKE_MARKER (0x00, 0x00, 0xA3, 0x64))
 		return SF_FORMAT_IRCAM ;
 		
+	if ((buffer [0] == MAKE_MARKER ('r', 'i', 'f', 'f')))
+		return SF_FORMAT_W64 ;
+		
+	if (buffer [0] == MAKE_MARKER ('S','E','K','D') && buffer [1] == MAKE_MARKER ('S','A','M','R'))
+		return SF_FORMAT_SMPLTD ;
+		
 	if (buffer [0] == MAKE_MARKER ('C', 'A', 'T', ' ') && buffer [2] == MAKE_MARKER ('R', 'E', 'X', '2'))
 		return SF_FORMAT_REX2 ;
 
@@ -1557,6 +1799,32 @@
 	if (buffer [0] == MAKE_MARKER (0x30, 0x26, 0xB2, 0x75) && buffer [1] == MAKE_MARKER (0x8E, 0x66, 0xCF, 0x11))
 		return SF_FORMAT_WMA ;
 
+	/* Turtle Beach SMP 16-bit */
+	if (buffer [0] == MAKE_MARKER ('S', 'O', 'U', 'N') && buffer [1] == MAKE_MARKER ('D', ' ', 'S', 'A'))
+		return 0 ;
+
+	if (buffer [0] == MAKE_MARKER ('S', 'Y', '8', '0') || buffer [0] == MAKE_MARKER ('S', 'Y', '8', '5'))
+		return 0 ;
+
+	if (buffer [0] == MAKE_MARKER ('L', 'M', '8', '9'))
+		return SF_FORMAT_TXW ;
+
+	if (buffer [0] == MAKE_MARKER ('a', 'j', 'k', 'g'))
+		return SF_FORMAT_SHN ;
+
+	/*	Detect wacky MacOS header stuff. This might be "Sound Designer II". */
+	memcpy (cptr , buffer, sizeof (buffer)) ;
+	if (cptr [0] == 0 && cptr [1] > 0 && psf->sf.seekable)
+	{	psf_binheader_readf (psf, "pb", 0, &cptr, sizeof (cptr)) ;
+		
+		if (cptr [1] < (sizeof (cptr) - 3) && cptr [cptr [1] + 2] == 0 && strlen (((char*) cptr) + 2) == cptr [1])
+		{	psf_log_printf (psf, "Weird MacOS Header.\n") ;
+			psf_binheader_readf (psf, "em", &buffer) ;
+			if (buffer [0] == MAKE_MARKER (0, 'S', 'd', '2'))
+				return SF_FORMAT_SD2 ;
+			} ;
+		} ;
+
 	/* This must be the last one. */		
 	if (filename && is_au_snd_file (filename))
 		return SF_FORMAT_AU | SF_FORMAT_ULAW ;
@@ -1568,14 +1836,12 @@
 
 static int 
 validate_sfinfo (SF_INFO *sfinfo)
-{	if (! sfinfo->samplerate)
+{	if (sfinfo->samplerate < 0)
 		return 0 ;	
-	if (! sfinfo->samples)
+	if (sfinfo->samples < 0)
 		return 0 ;	
-	if (! sfinfo->channels)
+	if (sfinfo->channels < 0)
 		return 0 ;	
-	if (! sfinfo->pcmbitwidth)
-		return 0 ;	
 	if (! sfinfo->format & SF_FORMAT_TYPEMASK)
 		return 0 ;	
 	if (! sfinfo->format & SF_FORMAT_SUBMASK)
@@ -1587,14 +1853,20 @@
 
 static int
 validate_psf (SF_PRIVATE *psf)
-{	if (! psf->blockwidth)
-		return 0 ;	
-	if (! psf->bytewidth)
-		return 0 ;	
-	if (! psf->datalength)
+{	
+	if (psf->datalength < 0)
+	{	psf_log_printf (psf, "Invalid SF_PRIVATE field : datalength == %d.\n", psf->datalength) ;
 		return 0 ;
-	if (psf->blockwidth != psf->sf.channels * psf->bytewidth)
+		} ;
+	if (psf->dataoffset < 0)
+	{	psf_log_printf (psf, "Invalid SF_PRIVATE field : datalength == %d.\n", psf->datalength) ;
+		return 0 ;
+		} ;
+	if (psf->blockwidth && psf->blockwidth != psf->sf.channels * psf->bytewidth)
+	{	psf_log_printf (psf, "Invalid SF_PRIVATE field : channels * bytewidth == %d.\n", 
+								psf->sf.channels * psf->bytewidth) ;
 		return 0 ;	
+		} ;
 	return 1 ;
 } /* validate_psf */
 
@@ -1618,7 +1890,7 @@
 	psf->filename [SF_FILENAME_LEN - 1] = 0 ;
 } /* copy_filename */
 
-static int	
+/*-static int	
 hash_command (const char *cmd)
 {	int	hash = 0 ;
 
@@ -1625,11 +1897,11 @@
 	if (! cmd)
 		return 0 ;
 
-	while (*cmd)
-	{	hash = (hash<<1) ^ *cmd ;
+	while (cmd [0])
+	{	hash = (hash << 1) ^ cmd [0] ;
 		cmd ++ ;
 		} ;
 		
 	return hash ;
-} /* hash_command */
-
+} /+* hash_command *+/
+-*/
--- a/common/libsndfile/src/sndfile.h
+++ b/common/libsndfile/src/sndfile.h
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 1999-2001 Erik de Castro Lopo <[email protected]>
+** Copyright (C) 1999-2002 Erik de Castro Lopo <[email protected]>
 **  
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -21,9 +21,12 @@
 #ifndef SNDFILE_H
 #define SNDFILE_H
 
-#include	<stdio.h>
-#include	<stdlib.h>
+/* This is the version 1.0.X header file. */
+#define	SNDFILE_1
 
+#include <stdio.h>
+#include <stdlib.h>
+
 /* For the Metrowerks CodeWarrior Pro Compiler (mainly MacOS) */
 
 #if	(defined (__MWERKS__))
@@ -32,7 +35,7 @@
 #include	<sys/types.h>
 #endif
 
-#if defined (_WIN32)
+#ifdef _WIN32
 	#pragma pack(push,1)
 #endif
 
@@ -48,159 +51,225 @@
 */
 
 enum
-{	SF_FORMAT_WAV		= 0x10000,		/* Microsoft WAV format (little endian). */
-	SF_FORMAT_AIFF		= 0x20000,		/* Apple/SGI AIFF format (big endian). */
-	SF_FORMAT_AU		= 0x30000,		/* Sun/NeXT AU format (big endian). */
-	SF_FORMAT_AULE		= 0x40000,		/* DEC AU format (little endian). */
-	SF_FORMAT_RAW		= 0x50000,		/* RAW PCM data. */
-	SF_FORMAT_PAF		= 0x60000,		/* Ensoniq PARIS file format. */
-	SF_FORMAT_SVX		= 0x70000,		/* Amiga IFF / SVX8 / SV16 format. */
-	SF_FORMAT_NIST		= 0x80000,		/* Sphere NIST format. */
-	SF_FORMAT_WMA		= 0x90000,		/* Windows Media Audio. */
-	SF_FORMAT_SMPLTD	= 0xA0000,		/* Sekd Samplitude. */
-	SF_FORMAT_VOC		= 0xB0000,		/* VOC files. */
-	SF_FORMAT_SD2		= 0xC0000,		/* Sound Designer 2 */
-	SF_FORMAT_REX2		= 0xD0000,		/* Propellorheads Rex2 */
-	SF_FORMAT_IRCAM		= 0xE0000,		/* Berkeley/IRCAM/CARL */
+{	SF_FORMAT_WAV			= 0x010000,		/* Microsoft WAV format (little endian). */
+	SF_FORMAT_AIFF			= 0x020000,		/* Apple/SGI AIFF format (big endian). */
+	SF_FORMAT_AU			= 0x030000,		/* Sun/NeXT AU format (big endian). */
+	SF_FORMAT_RAW			= 0x040000,		/* RAW PCM data. */
+	SF_FORMAT_PAF			= 0x050000,		/* Ensoniq PARIS file format. */
+	SF_FORMAT_SVX			= 0x060000,		/* Amiga IFF / SVX8 / SV16 format. */
+	SF_FORMAT_NIST			= 0x070000,		/* Sphere NIST format. */
+	SF_FORMAT_VOC			= 0x080000,		/* VOC files. */
+	SF_FORMAT_REX			= 0x090000,		/* Propellorheads Rex/Rcy */
+	SF_FORMAT_IRCAM			= 0x0A0000,		/* Berkeley/IRCAM/CARL */
+	SF_FORMAT_W64			= 0x0B0000,		/* Sonic Foundry's 64 bit RIFF/WAV */
+	SF_FORMAT_SD2			= 0x0C0000,		/* Sound Designer 2 */
+	SF_FORMAT_REX2			= 0x0D0000,		/* Propellorheads Rex2 */
+	SF_FORMAT_TXW			= 0x0E0000,		/* Yamaha TX16 sampler file */
+	SF_FORMAT_KRZ			= 0x0F0000,		/* Kurzweil sampler file */
+	SF_FORMAT_OCT			= 0x100000,		/* Save as a GNU Octave data file */
+	SF_FORMAT_SMPLTD		= 0x110000,		/* Sekd Samplitude. */
+	SF_FORMAT_WMA			= 0x120000,		/* Windows Media Audio. */
+	SF_FORMAT_SHN			= 0x130000,		/* Shorten. */
 	
 	/* Subtypes from here on. */
 	
-	SF_FORMAT_PCM		= 0x0001,		/* PCM data in 8, 16, 24 or 32 bits. */
-	SF_FORMAT_FLOAT		= 0x0002,		/* 32 bit floats. */
-	SF_FORMAT_ULAW		= 0x0003,		/* U-Law encoded. */
-	SF_FORMAT_ALAW		= 0x0004,		/* A-Law encoded. */
-	SF_FORMAT_IMA_ADPCM = 0x0005,		/* IMA ADPCM. */
-	SF_FORMAT_MS_ADPCM  = 0x0006,		/* Microsoft ADPCM. */
+	SF_FORMAT_PCM_S8		= 0x0001,		/* Signed 8 bit data */
+	SF_FORMAT_PCM_16		= 0x0002,		/* Signed 16 bit data */
+	SF_FORMAT_PCM_24		= 0x0003,		/* Signed 24 bit data */
+	SF_FORMAT_PCM_32		= 0x0004,		/* Signed 32 bit data */
 
-	SF_FORMAT_PCM_BE	= 0x0007,		/* Big endian PCM data. */
-	SF_FORMAT_PCM_LE  	= 0x0008,		/* Little endian PCM data. */
-	SF_FORMAT_PCM_S8	= 0x0009,		/* Signed 8 bit PCM. */
-	SF_FORMAT_PCM_U8  	= 0x000A,		/* Unsigned 8 bit PCM. */
+	SF_FORMAT_PCM_U8		= 0x0005,		/* Unsigned 8 bit data (WAV and RAW only) */
 	
-	SF_FORMAT_SVX_FIB	= 0x000B, 		/* SVX Fibonacci Delta encoding. */
-	SF_FORMAT_SVX_EXP	= 0x000C, 		/* SVX Exponential Delta encoding. */
+	SF_FORMAT_FLOAT			= 0x0006,		/* 32 bit float data */
+	SF_FORMAT_DOUBLE		= 0x0007,		/* 64 bit float data */
+	
+	SF_FORMAT_ULAW			= 0x0008,		/* U-Law encoded. */
+	SF_FORMAT_ALAW			= 0x0009,		/* A-Law encoded. */
+	SF_FORMAT_IMA_ADPCM		= 0x000A,		/* IMA ADPCM. */
+	SF_FORMAT_MS_ADPCM		= 0x000B,		/* Microsoft ADPCM. */
 
-	SF_FORMAT_GSM610	= 0x000D, 		/* GSM 6.10 encoding. */
+	SF_FORMAT_GSM610		= 0x000C,		/* GSM 6.10 encoding. */
 
-	SF_FORMAT_G721_32	= 0x000E, 		/* 32kbs G721 ADPCM encoding. */
-	SF_FORMAT_G723_24	= 0x000F, 		/* 24kbs G723 ADPCM encoding. */
+	SF_FORMAT_G721_32		= 0x000D,		/* 32kbs G721 ADPCM encoding. */
+	SF_FORMAT_G723_24		= 0x000E,		/* 24kbs G723 ADPCM encoding. */
 
-	SF_FORMAT_FLOAT_BE	= 0x0010,		/* Big endian FLOAT data. */
-	SF_FORMAT_FLOAT_LE  = 0x0011,		/* Little endian FLOAT data. */
+	SF_FORMAT_DWVW_12		= 0x000F, 		/* 12 bit Delta Width Variable Word encoding. */
+	SF_FORMAT_DWVW_16		= 0x0010, 		/* 16 bit Delta Width Variable Word encoding. */
+	SF_FORMAT_DWVW_24		= 0x0011, 		/* 24 bit Delta Width Variable Word encoding. */
+	SF_FORMAT_DWVW_N		= 0x0012, 		/* N bit Delta Width Variable Word encoding. */
 
-	SF_FORMAT_SUBMASK	= 0xFFFF,		
-	SF_FORMAT_TYPEMASK	= 0x7FFF0000
+	SF_FORMAT_SVX_FIB		= 0x0020, 		/* SVX Fibonacci Delta encoding. */
+	SF_FORMAT_SVX_EXP		= 0x0021, 		/* SVX Exponential Delta encoding. */
+
+	/* Endian-ness options. */
+	
+	SF_ENDIAN_FILE			= 0x00000000,	/* Default file endian-ness. */
+	SF_ENDIAN_LITTLE		= 0x10000000,	/* Force little endian-ness. */
+	SF_ENDIAN_BIG			= 0x20000000,	/* Force big endian-ness. */
+	SF_ENDIAN_CPU			= 0x30000000,	/* Force CPU endian-ness. */
+
+	SF_FORMAT_SUBMASK		= 0x0000FFFF,		
+	SF_FORMAT_TYPEMASK		= 0x0FFF0000,
+	SF_FORMAT_ENDMASK		= 0x30000000
 } ;
 
-/* The following SF_FORMAT_RAW_* identifiers are deprecated. Use the
-** SF_FORMAT_PCM_* identifiers instead.
+/* The following are the valid command numbers for the sf_command()
+** interface. 
 */
-#define	SF_FORMAT_RAW_BE	SF_FORMAT_PCM_BE
-#define	SF_FORMAT_RAW_LE	SF_FORMAT_PCM_LE
-#define	SF_FORMAT_RAW_S8	SF_FORMAT_PCM_S8
-#define	SF_FORMAT_RAW_U8	SF_FORMAT_PCM_U8
 
+enum
+{	SFC_GET_LIB_VERSION	= 0x1000,
+	SFC_GET_LOG_INFO,
+
+	SFC_GET_NORM_DOUBLE,
+	SFC_GET_NORM_FLOAT,
+	SFC_SET_NORM_DOUBLE,
+	SFC_SET_NORM_FLOAT,
+	
+	SFC_GET_SIMPLE_FORMAT_COUNT,
+	SFC_GET_SIMPLE_FORMAT,
+
+	SFC_GET_FORMAT_MAJOR_COUNT,
+	SFC_GET_FORMAT_MAJOR,
+	SFC_GET_FORMAT_SUBTYPE_COUNT,
+	SFC_GET_FORMAT_SUBTYPE,
+	
+	SFC_CALC_SIGNAL_MAX
+} ;
+
+enum
+{	/* True and false */
+	SF_FALSE		= 0,
+	SF_TRUE			= 1,
+
+	/* Modes for opening files. */
+	SFM_READ	= 0x10, 
+	SFM_WRITE	= 0x20,
+	SFM_RDWR	= 0x30
+} ;
+
 /* A SNDFILE* pointer can be passed around much like stdio.h's FILE* pointer. */
 
-typedef	void	SNDFILE ;
+typedef	void		SNDFILE ;
 
+#if (defined (WIN32) || defined (_WIN32))
+	typedef __int64		sf_count_t ;
+#else
+	typedef off_t		sf_count_t ;
+#endif
+
 /* A pointer to a SF_INFO structure is passed to sf_open_read () and filled in. 
 ** On write, the SF_INFO structure is filled in by the user and passed into  
 ** sf_open_write ().
 */
 
-typedef	struct
-{	unsigned int	samplerate ;
-	unsigned int	samples ;
-	unsigned int	channels ;
-	unsigned int	pcmbitwidth ;  /* pcmbitwidth is deprecated. */
-	unsigned int	format ;
-	unsigned int	sections ;
-	unsigned int	seekable ;
-} SF_INFO ;
+struct SF_INFO
+{	sf_count_t	samples ;		/* -1 if unknown. */
+	int			samplerate ;
+	int			channels ;
+	int			format ;
+	int			sections ;
+	int			seekable ;
+} ;
 
-/* Open the specified file for read or write. On error, this will return 
-** a NULL pointer. To find the error number, pass a NULL SNDFILE to
-** sf_perror () or sf_error_str ().
+typedef	struct SF_INFO SF_INFO ;
+
+/* The SF_FORMAT_INFO struct is used to retrieve information about the sound 
+** file formats libsndfile supports using the sf_command () interface.
+**
+** Using this interface will allow applications to support new file formats 
+** and encoding types when libsndfile is upgraded, without requiring 
+** re-compilation of the application.
+** 
+** Please consult the libsndfile documentation (particularly the information
+** on the sf_command () interface) for examples of its use.
 */
 
-SNDFILE* 	sf_open_read	(const char *path, SF_INFO *sfinfo) ;
-SNDFILE* 	sf_open_write	(const char *path, const SF_INFO *sfinfo) ;
+typedef struct
+{	int			format ;
+	const char  *name ;
+	const char  *extension ;
+} SF_FORMAT_INFO ;
 
-/* sf_perror () prints out the current error state.
-** sf_error_str () returns the current error message to the caller in the 
-** string buffer provided. 
+/* Open the specified file for read, write or both. On error, this will 
+** return a NULL pointer. To find the error number, pass a NULL SNDFILE 
+** to sf_perror () or sf_error_str ().
 */
 
-int		sf_perror		(SNDFILE *sndfile) ;
-int		sf_error_str	(SNDFILE *sndfile, char* str, size_t len) ;
+SNDFILE* 	sf_open		(const char *path, int mode, SF_INFO *sfinfo) ;
 
-int		sf_error_number	(int errnum, char *str, size_t maxlen) ;
+/* sf_error () returns TRUE if an error has been recorded for the given SNDFILE. */
 
+int		sf_error		(SNDFILE *sndfile) ;
 
-size_t	sf_get_header_info	(SNDFILE *sndfile, char* buffer, size_t bufferlen, size_t offset) ;
+/* sf_perror () prints the current error string to stderr. */
 
-/* Get the library version string. */
+int		sf_perror		(SNDFILE *sndfile) ;
 
-size_t	sf_get_lib_version	(char* buffer, size_t bufferlen) ;
+/* sf_error_str () returns the current error message to the caller in the 
+** string buffer provided. 
+*/
 
+int		sf_error_str	(SNDFILE *sndfile, char* str, size_t len) ;
+
+/* sf_error_number () allows the retrieval of the error string for each internal
+** error number. This is provided mainly for testing purposes and most users of
+** this library will not need to use it.
+** 
+*/
+
+int		sf_error_number	(int errnum, char *str, size_t maxlen) ;
+
 /* Return TRUE if fields of the SF_INFO struct are a valid combination of values. */
 
-int		sf_command	(SNDFILE *sndfile, const char *cmd, void *data, int datasize) ;
+int		sf_command	(SNDFILE *sndfile, int command, void *data, int datasize) ;
 
 /* Return TRUE if fields of the SF_INFO struct are a valid combination of values. */
 
 int		sf_format_check	(const SF_INFO *info) ;
 
-/* Return the maximum absolute sample value in the SNDFILE. */
-
-double	sf_signal_max	(SNDFILE *sndfile) ;
-
 /* Seek within the waveform data chunk of the SNDFILE. sf_seek () uses 
 ** the same values for whence (SEEK_SET, SEEK_CUR and SEEK_END) as
-** stdio.h functions lseek () and fseek ().
+** stdio.h function fseek ().
 ** An offset of zero with whence set to SEEK_SET will position the 
 ** read / write pointer to the first data sample.
 ** On success sf_seek returns the current position in (multi-channel) 
 ** samples from the start of the file.
-** On error sf_seek returns -1.
+** The sf_read_seek() and sf_write_seek functions only work on files 
+** openned in read/write mode allowing the current read and write 
+** positions to be manipulated separately.
+** On error all of these functions return -1.
 */
 
-long	sf_seek 		(SNDFILE *sndfile, long frames, int whence) ;
+sf_count_t	sf_seek 		(SNDFILE *sndfile, sf_count_t frames, int whence) ;
 
 /* Functions for reading/writing the waveform data of a sound file.
 */
 
-size_t	sf_read_raw		(SNDFILE *sndfile, void *ptr, size_t bytes) ;
-size_t	sf_write_raw 	(SNDFILE *sndfile, void *ptr, size_t bytes) ;
+sf_count_t	sf_read_raw		(SNDFILE *sndfile, void *ptr, sf_count_t bytes) ;
+sf_count_t	sf_write_raw 	(SNDFILE *sndfile, void *ptr, sf_count_t bytes) ;
 
 /* Functions for reading and writing the data chunk in terms of frames. 
 ** The number of items actually read/written = frames * number of channels.
 **     sf_xxxx_raw		read/writes the raw data bytes from/to the file
-**     sf_xxxx_uchar	passes data in the unsigned char format
-**     sf_xxxx_char		passes data in the signed char format
 **     sf_xxxx_short	passes data in the native short format
 **     sf_xxxx_int		passes data in the native int format
 **     sf_xxxx_float	passes data in the native float format
 **     sf_xxxx_double	passes data in the native double format
-** For the double format, if the normalize flag is TRUE, the read/write 
-** operations will use floats/doubles in the rangs [-1.0 .. 1.0] to 
-** represent the minimum and maximum values of the waveform irrespective
-** of the bitwidth of the input/output file.
 ** All of these read/write function return number of frames read/written.
 */
 
-size_t	sf_readf_short	(SNDFILE *sndfile, short *ptr, size_t frames) ;
-size_t	sf_writef_short	(SNDFILE *sndfile, short *ptr, size_t frames) ;
+sf_count_t	sf_readf_short	(SNDFILE *sndfile, short *ptr, sf_count_t frames) ;
+sf_count_t	sf_writef_short	(SNDFILE *sndfile, short *ptr, sf_count_t frames) ;
 
-size_t	sf_readf_int	(SNDFILE *sndfile, int *ptr, size_t frames) ;
-size_t	sf_writef_int 	(SNDFILE *sndfile, int *ptr, size_t frames) ;
+sf_count_t	sf_readf_int	(SNDFILE *sndfile, int *ptr, sf_count_t frames) ;
+sf_count_t	sf_writef_int 	(SNDFILE *sndfile, int *ptr, sf_count_t frames) ;
 
-size_t	sf_readf_float	(SNDFILE *sndfile, float *ptr, size_t frames) ;
-size_t	sf_writef_float	(SNDFILE *sndfile, float *ptr, size_t frames) ;
+sf_count_t	sf_readf_float	(SNDFILE *sndfile, float *ptr, sf_count_t frames) ;
+sf_count_t	sf_writef_float	(SNDFILE *sndfile, float *ptr, sf_count_t frames) ;
 
-size_t	sf_readf_double	(SNDFILE *sndfile, double *ptr, size_t frames, int normalize) ;
-size_t	sf_writef_double(SNDFILE *sndfile, double *ptr, size_t frames, int normalize) ;
+sf_count_t	sf_readf_double	(SNDFILE *sndfile, double *ptr, sf_count_t frames) ;
+sf_count_t	sf_writef_double(SNDFILE *sndfile, double *ptr, sf_count_t frames) ;
 
 /* Functions for reading and writing the data chunk in terms of items. 
 ** Otherwise similar to above.
@@ -207,17 +276,17 @@
 ** All of these read/write function return number of items read/written.
 */
 
-size_t	sf_read_short	(SNDFILE *sndfile, short *ptr, size_t items) ;
-size_t	sf_write_short	(SNDFILE *sndfile, short *ptr, size_t items) ;
+sf_count_t	sf_read_short	(SNDFILE *sndfile, short *ptr, sf_count_t items) ;
+sf_count_t	sf_write_short	(SNDFILE *sndfile, short *ptr, sf_count_t items) ;
 
-size_t	sf_read_int		(SNDFILE *sndfile, int *ptr, size_t items) ;
-size_t	sf_write_int 	(SNDFILE *sndfile, int *ptr, size_t items) ;
+sf_count_t	sf_read_int		(SNDFILE *sndfile, int *ptr, sf_count_t items) ;
+sf_count_t	sf_write_int 	(SNDFILE *sndfile, int *ptr, sf_count_t items) ;
 
-size_t	sf_read_float	(SNDFILE *sndfile, float *ptr, size_t items) ;
-size_t	sf_write_float	(SNDFILE *sndfile, float *ptr, size_t items) ;
+sf_count_t	sf_read_float	(SNDFILE *sndfile, float *ptr, sf_count_t items) ;
+sf_count_t	sf_write_float	(SNDFILE *sndfile, float *ptr, sf_count_t items) ;
 
-size_t	sf_read_double	(SNDFILE *sndfile, double *ptr, size_t items, int normalize) ;
-size_t	sf_write_double	(SNDFILE *sndfile, double *ptr, size_t items, int normalize) ;
+sf_count_t	sf_read_double	(SNDFILE *sndfile, double *ptr, sf_count_t items) ;
+sf_count_t	sf_write_double	(SNDFILE *sndfile, double *ptr, sf_count_t items) ;
 
 /* Close the SNDFILE. Returns 0 on success, or an error number. */
 
@@ -232,7 +301,3 @@
 #endif
 
 #endif	/* SNDFILE_H */
-
-
-
-
--- a/common/libsndfile/src/svx.c
+++ b/common/libsndfile/src/svx.c
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 1999-2001 Erik de Castro Lopo <[email protected]>
+** Copyright (C) 1999-2002 Erik de Castro Lopo <[email protected]>
 **  
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -16,7 +16,6 @@
 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 */
 
-
 #include	<stdio.h>
 #include	<unistd.h>
 #include	<string.h>
@@ -71,22 +70,70 @@
  * Private static functions.
 */
 
-static int		svx_close	(SF_PRIVATE  *psf) ;
-static int		svx_write_header (SF_PRIVATE *psf) ;
+static int	svx_close	(SF_PRIVATE  *psf) ;
+static int	svx_write_header (SF_PRIVATE *psf) ;
+static int 	svx_read_header	(SF_PRIVATE *psf) ;
 
-/*
-static void 	endswap_vhdr_chunk (VHDR_CHUNK *vhdr) ;
+/*------------------------------------------------------------------------------
+** Public function.
 */
 
+int 	
+svx_open	(SF_PRIVATE *psf)
+{	int error, subformat ;
+
+	if (psf->mode == SFM_READ || (psf->mode == SFM_RDWR && psf->filelength > 0))
+	{	if ((error = svx_read_header (psf)))
+			return error ;
+
+		psf->endian = SF_ENDIAN_BIG ;			/* All SVX files are big endian. */
+
+		psf->blockwidth = psf->sf.channels * psf->bytewidth ;
+		if (psf->blockwidth)
+			psf->sf.samples  = psf->datalength / psf->blockwidth ;
+
+		psf_fseek (psf->filedes, psf->dataoffset, SEEK_SET) ;
+		} ;
+
+	subformat = psf->sf.format & SF_FORMAT_SUBMASK ;
+
+	if (psf->mode == SFM_WRITE || psf->mode == SFM_RDWR)
+	{	if ((psf->sf.format & SF_FORMAT_TYPEMASK) != SF_FORMAT_SVX)
+			return	SFE_BAD_OPEN_FORMAT ;
+		
+		psf->endian = psf->sf.format & SF_FORMAT_ENDMASK ;
+	
+		if (psf->endian == SF_ENDIAN_LITTLE || (CPU_IS_LITTLE_ENDIAN && psf->endian == SF_ENDIAN_CPU))
+			return SFE_BAD_ENDIAN ;
+	
+		psf->endian      = SF_ENDIAN_BIG ;			/* All SVX files are big endian. */
+
+		error = svx_write_header (psf) ;
+		if (error)
+			return error ;
+		
+		psf->write_header = svx_write_header ;
+		} ;
+
+	psf->close        = svx_close ;
+
+	if (psf->bytewidth == 1)
+		psf->chars = SF_CHARS_SIGNED ;
+
+	if ((error = pcm_init (psf)))
+		return error ;
+
+	return 0 ;
+} /* svx_open */
+
 /*------------------------------------------------------------------------------
-** Public functions.
 */
 
-int 	
-svx_open_read	(SF_PRIVATE *psf)
+static int 	
+svx_read_header	(SF_PRIVATE *psf)
 {	VHDR_CHUNK		vhdr ;
 	unsigned int	FORMsize, vhdrsize, dword, marker ;
-	int				filetype = 0, parsestage = 0, done = 0, error ;
+	int				filetype = 0, parsestage = 0, done = 0 ;
 	int 			bytecount = 0, channels ;
 
 	psf_binheader_readf (psf, "p", 0) ;
@@ -94,6 +141,8 @@
 	/* Set default number of channels. */
 	psf->sf.channels = 1 ;
 
+	psf->sf.format = SF_FORMAT_SVX ;
+
 	while (! done)
 	{	psf_binheader_readf (psf, "m", &marker) ;
 		switch (marker)
@@ -101,7 +150,7 @@
 					if (parsestage)
 						return SFE_SVX_NO_FORM ;
 
-					psf_binheader_readf (psf, "L", &FORMsize) ;
+					psf_binheader_readf (psf, "E4", &FORMsize) ;
 
 					if (FORMsize != psf->filelength - 2 * sizeof (dword))
 					{	dword = psf->filelength - 2 * sizeof (dword);
@@ -126,11 +175,11 @@
 					if (! (parsestage & (HAVE_FORM | HAVE_SVX)))
 						return SFE_SVX_NO_FORM ;
 					
-					psf_binheader_readf (psf, "L", &vhdrsize) ;
+					psf_binheader_readf (psf, "E4", &vhdrsize) ;
 
 					psf_log_printf (psf, " VHDR : %d\n", vhdrsize) ;
 
-					psf_binheader_readf (psf, "LLLWbbL", &(vhdr.oneShotHiSamples), &(vhdr.repeatHiSamples), 
+					psf_binheader_readf (psf, "E4442114", &(vhdr.oneShotHiSamples), &(vhdr.repeatHiSamples), 
 						&(vhdr.samplesPerHiCycle), &(vhdr.samplesPerSec), &(vhdr.octave), &(vhdr.compression),
 						&(vhdr.volume)) ;
 
@@ -156,9 +205,13 @@
 					psf->sf.samplerate 	= vhdr.samplesPerSec ;
 
 					if (filetype == SVX8_MARKER)
-						psf->sf.pcmbitwidth = 8 ;
+					{	psf->sf.format |= SF_FORMAT_PCM_S8 ;
+						psf->bytewidth = 1 ;
+						} 
 					else if (filetype == SV16_MARKER)
-						psf->sf.pcmbitwidth = 16 ;
+					{	psf->sf.format |= SF_FORMAT_PCM_16 ;
+						psf->bytewidth = 2 ;
+						} ;
 						
 					parsestage |= HAVE_VHDR ;
 					break ;
@@ -167,9 +220,11 @@
 					if (! (parsestage & HAVE_VHDR))
 						return SFE_SVX_NO_BODY ;
 					
-					psf_binheader_readf (psf, "L", &(psf->datalength)) ;
-					psf->dataoffset = ftell (psf->file) ;
+					psf_binheader_readf (psf, "E4", &dword) ;
+					psf->datalength = dword ;
 					
+					psf->dataoffset = psf_ftell (psf->filedes) ;
+					
 					if (psf->datalength > psf->filelength - psf->dataoffset)
 					{	psf_log_printf (psf, " BODY : %d (should be %d)\n", psf->datalength, psf->filelength - psf->dataoffset) ;
 						psf->datalength = psf->filelength - psf->dataoffset ;
@@ -182,7 +237,7 @@
 					if (! psf->sf.seekable)
 						break ;
 
-					fseek (psf->file, psf->datalength, SEEK_CUR) ;
+					psf_fseek (psf->filedes, psf->datalength, SEEK_CUR) ;
 					break ;
 
 			case NAME_MARKER :
@@ -190,7 +245,7 @@
 					if (! (parsestage & HAVE_SVX))
 						return SFE_SVX_NO_FORM ;
 
-					psf_binheader_readf (psf, "L", &dword) ;
+					psf_binheader_readf (psf, "E4", &dword) ;
 					
 					psf_log_printf (psf, " %D : %d\n", marker, dword) ;
 
@@ -201,11 +256,11 @@
 					if (! (parsestage & HAVE_SVX))
 						return SFE_SVX_NO_FORM ;
 
-					psf_binheader_readf (psf, "L", &dword) ;
+					psf_binheader_readf (psf, "E4", &dword) ;
 					
 					psf_log_printf (psf, " %D : %d\n", marker, dword) ;
 					
-					bytecount += psf_binheader_readf (psf, "L", &channels) ;
+					bytecount += psf_binheader_readf (psf, "E4", &channels) ;
 
 					psf_log_printf (psf, "  Channels : %d => %d\n", channels) ;
 					
@@ -218,7 +273,7 @@
 					if (! (parsestage & HAVE_SVX))
 						return SFE_SVX_NO_FORM ;
 
-					psf_binheader_readf (psf, "L", &dword) ;
+					psf_binheader_readf (psf, "E4", &dword) ;
 					
 					psf_log_printf (psf, " %D : %d\n", marker, dword) ;
 
@@ -228,7 +283,7 @@
 			default : 
 					if (isprint ((marker >> 24) & 0xFF) && isprint ((marker >> 16) & 0xFF)
 						&& isprint ((marker >> 8) & 0xFF) && isprint (marker & 0xFF))
-					{	psf_binheader_readf (psf, "L", &dword) ;
+					{	psf_binheader_readf (psf, "E4", &dword) ;
 					
 						psf_log_printf (psf, "%D : %d (unknown marker)\n", marker, dword) ;
 
@@ -235,7 +290,7 @@
 						psf_binheader_readf (psf, "j", dword) ;
 						break ;
 						} ;
-					if ((dword = ftell (psf->file)) & 0x03)
+					if ((dword = psf_ftell (psf->filedes)) & 0x03)
 					{	psf_log_printf (psf, "  Unknown chunk marker at position %d. Resynching.\n", dword - 4) ;
 
 						psf_binheader_readf (psf, "j", -3) ;
@@ -245,9 +300,9 @@
 					done = 1 ;
 			} ;	/* switch (marker) */
 
-		if (ferror (psf->file))
+		if (psf_ferror (psf->filedes))
 		{	psf_log_printf (psf, "*** Error on file handle. ***\n", marker) ;
-			clearerr (psf->file) ;
+			psf_fclearerr (psf->filedes) ;
 			break ;
 			} ;
 			
@@ -254,7 +309,7 @@
 		if (! psf->sf.seekable && (parsestage & HAVE_BODY))
 			break ;
 
-		if (ftell (psf->file) >= (long) (psf->filelength - (2 * sizeof (dword))))
+		if (psf_ftell (psf->filedes) >= (sf_count_t) (psf->filelength - (2 * sizeof (dword))))
 			break ;
 		} ; /* while (1) */
 		
@@ -264,77 +319,20 @@
 	if (! psf->dataoffset)
 		return SFE_SVX_NO_DATA ;
 
-	psf->sf.format   = (SF_FORMAT_SVX | SF_FORMAT_PCM);
-	psf->sf.sections = 1 ;
-					
-	psf->current     = 0 ;
-	psf->endian      = SF_ENDIAN_BIG ;			/* All SVX files are big endian. */
-	psf->sf.seekable = SF_TRUE ;
-	psf->bytewidth   = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
-
-	psf->blockwidth  = psf->sf.channels * psf->bytewidth ;
-	
-	if (psf->blockwidth)
-		psf->sf.samples  = psf->datalength / psf->blockwidth ;
-
-	fseek (psf->file, psf->dataoffset, SEEK_SET) ;
-
-	psf->close = (func_close) svx_close ;
-
-	psf->chars = SF_CHARS_SIGNED ;
-	if ((error = pcm_read_init (psf)))
-		return error ;
-
 	return 0 ;
-} /* svx_open_read */
+} /* svx_read_header */
 
-int 	
-svx_open_write	(SF_PRIVATE *psf)
-{	int error ;
-
-	if ((psf->sf.format & SF_FORMAT_TYPEMASK) != SF_FORMAT_SVX)
-		return	SFE_BAD_OPEN_FORMAT ;
-	if ((psf->sf.format & SF_FORMAT_SUBMASK) != SF_FORMAT_PCM)
-		return	SFE_BAD_OPEN_FORMAT ;
-	if (psf->sf.pcmbitwidth != 8 && psf->sf.pcmbitwidth != 16)
-		return	SFE_BAD_OPEN_FORMAT ;
-	
-	psf->endian      = SF_ENDIAN_BIG ;			/* All SVX files are big endian. */
-	psf->sf.seekable = SF_TRUE ;
-	psf->bytewidth   = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
-	psf->blockwidth  = psf->bytewidth * psf->sf.channels ;
-	psf->datalength  = psf->blockwidth * psf->sf.samples ;
-	psf->filelength  = psf->datalength + psf->dataoffset ;
-	psf->error       = 0 ;
-
-	error = svx_write_header (psf) ;
-	if (error)
-		return error ;
-		
-	psf->close        = (func_close)  svx_close ;
-	psf->write_header = (func_wr_hdr) svx_write_header ;
-
-	psf->chars = SF_CHARS_SIGNED ;
-	if ((error = pcm_write_init (psf)))
-		return error ;
-
-	return 0 ;
-} /* svx_open_write */
-
-/*------------------------------------------------------------------------------
-*/
-
 static int	
 svx_close	(SF_PRIVATE  *psf)
 {	
-	if (psf->mode == SF_MODE_WRITE)
+	if (psf->mode == SFM_WRITE || psf->mode == SFM_RDWR)
 	{	/*  Now we know for certain the length of the file we can re-write 
 		**	correct values for the FORM, 8SVX and BODY chunks.
 		*/
                 
-		fseek (psf->file, 0, SEEK_END) ;
-		psf->filelength = ftell (psf->file) ;
-		fseek (psf->file, 0, SEEK_SET) ;
+		psf_fseek (psf->filedes, 0, SEEK_END) ;
+		psf->filelength = psf_ftell (psf->filedes) ;
+		psf_fseek (psf->filedes, 0, SEEK_SET) ;
 		
 		psf->datalength = psf->filelength - psf->dataoffset ;
 
@@ -341,10 +339,6 @@
 		svx_write_header (psf) ;
 		} ;
 
-	if (psf->fdata)
-		free (psf->fdata) ;
-	psf->fdata = NULL ;
-	
 	return 0 ;
 } /* svx_close */
 
@@ -354,28 +348,28 @@
 	
 	psf->header [0] = 0 ;
 	psf->headindex = 0 ;
-	fseek (psf->file, 0, SEEK_SET) ;
+	psf_fseek (psf->filedes, 0, SEEK_SET) ;
 
 	/* FORM marker and FORM size. */	
-	psf_binheader_writef (psf, "mL", FORM_MARKER, psf->filelength - 8) ;
+	psf_binheader_writef (psf, "Etm8", FORM_MARKER, psf->filelength - 8) ;
 	psf_binheader_writef (psf, "m", (psf->bytewidth == 1) ? SVX8_MARKER : SV16_MARKER) ;
 
 	/* VHDR chunk. */
-	psf_binheader_writef (psf, "mL", VHDR_MARKER, sizeof (VHDR_CHUNK)) ;
+	psf_binheader_writef (psf, "Em4", VHDR_MARKER, sizeof (VHDR_CHUNK)) ;
 	/* VHDR : oneShotHiSamples, repeatHiSamples, samplesPerHiCycle */
-	psf_binheader_writef (psf, "LLL", psf->sf.samples, 0, 0) ;
+	psf_binheader_writef (psf, "E444", psf->sf.samples, 0, 0) ;
 	/* VHDR : samplesPerSec, octave, compression */
-	psf_binheader_writef (psf, "Wbb", psf->sf.samplerate, 1, 0) ;
+	psf_binheader_writef (psf, "E211", psf->sf.samplerate, 1, 0) ;
 	/* VHDR : volume */
-	psf_binheader_writef (psf, "L", (psf->bytewidth == 1) ? 255 : 0xFFFF) ;
+	psf_binheader_writef (psf, "E4", (psf->bytewidth == 1) ? 255 : 0xFFFF) ;
 
 	/* Filename and annotation strings. */
-	psf_binheader_writef (psf, "mSmS", NAME_MARKER, psf->filename, ANNO_MARKER, annotation) ;
+	psf_binheader_writef (psf, "Emsms", NAME_MARKER, psf->filename, ANNO_MARKER, annotation) ;
 	
 	/* BODY marker and size. */
-	psf_binheader_writef (psf, "mL", BODY_MARKER, psf->datalength) ;
+	psf_binheader_writef (psf, "Etm8", BODY_MARKER, psf->datalength) ;
 
-	fwrite (psf->header, psf->headindex, 1, psf->file) ;
+	psf_fwrite (psf->header, psf->headindex, 1, psf->filedes) ;
 
 	psf->dataoffset = psf->headindex ;
 	
@@ -382,14 +376,4 @@
 	return 0 ;
 } /* svx_write_header */
 
-/*-
-static void 
-endswap_vhdr_chunk (VHDR_CHUNK *vhdr)
-{	vhdr->oneShotHiSamples  = ENDSWAP_INT (vhdr->oneShotHiSamples) ;
-	vhdr->repeatHiSamples   = ENDSWAP_INT (vhdr->repeatHiSamples) ;
-	vhdr->samplesPerHiCycle = ENDSWAP_INT (vhdr->samplesPerHiCycle) ;
-	vhdr->samplesPerSec     = ENDSWAP_SHORT (vhdr->samplesPerSec) ;
-	vhdr->volume            = ENDSWAP_INT (vhdr->volume) ;
-} /+* endswap_vhdr_chunk *+/
--*/
 
--- /dev/null
+++ b/common/libsndfile/src/txw.c
@@ -1,0 +1,242 @@
+/*
+** Copyright (C) 2002 Erik de Castro Lopo <[email protected]>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+**
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+/*===========================================================================
+** Yamaha TX16 Sampler Files.
+**
+** This header parser was written using information from the SoX source code
+** and trial and error experimentation. The code here however is all original.
+*/
+
+#include	<stdio.h>
+#include	<unistd.h>
+#include	<fcntl.h>
+#include	<string.h>
+#include	<ctype.h>
+
+#include	"sndfile.h"
+#include	"config.h"
+#include	"sfendian.h"
+#include	"common.h"
+#include	"au.h"
+
+/*------------------------------------------------------------------------------
+** Markers.
+*/
+
+#define LM89_MARKER		(MAKE_MARKER ('L', 'M', '8', '9'))
+#define FIVE3_MARKER	(MAKE_MARKER ('5', '3', 0, 0))
+
+#define AU_DATA_OFFSET	24
+
+/*------------------------------------------------------------------------------
+** Known AU file encoding types.
+*/
+
+/*------------------------------------------------------------------------------
+** Private static functions.
+*/
+
+static int	txw_close	(SF_PRIVATE *psf) ;
+static int  txw_read_header	(SF_PRIVATE *psf) ;
+static int	txw_write_header (SF_PRIVATE *psf) ;
+
+/*------------------------------------------------------------------------------
+** Public functions.
+*/
+
+struct WaveHeader_ {
+  unsigned char
+    filetype [6],    /* = "LM8953", */
+    nulls [10],
+    dummy_aeg [6],   /* space for the AEG (never mind this) */
+    format,          /* 0x49 = looped, 0xC9 = non-looped */
+    sample_rate,     /* 1 = 33 kHz, 2 = 50 kHz, 3 = 16 kHz */
+    atc_length [3],  /* I'll get to this... */
+    rpt_length [3],
+    unused [2] ;     /* set these to null, to be on the safe side */
+} ;
+
+#define	ERROR_666	666
+
+int
+txw_open	(SF_PRIVATE *psf)
+{	int error ;
+
+	if (psf->mode == SFM_READ || (psf->mode == SFM_RDWR && psf->filelength > 0))
+	{	if ((error = txw_read_header (psf)))
+			return error ;
+		} ;
+
+	if (psf->mode == SFM_WRITE || psf->mode == SFM_RDWR)
+	{ 	psf->dataoffset = psf_ftell (psf->filedes) ;
+		psf->datalength = psf->filelength - psf->dataoffset ;
+
+	 	if (psf_fseek (psf->filedes, psf->dataoffset, SEEK_SET))
+			return SFE_BAD_SEEK ;
+
+		psf->close = txw_close ;
+
+		/* Only fill in type major. */
+		if (psf->endian == SF_ENDIAN_BIG)
+			psf->sf.format = SF_FORMAT_TXW ;
+		else if (psf->endian == SF_ENDIAN_LITTLE)
+			psf->sf.format = SF_ENDIAN_LITTLE | SF_FORMAT_TXW ;
+
+		psf->sf.format |= SF_FORMAT_PCM_16 ;
+
+		if ((error = txw_write_header (psf)))
+			return error ;
+
+		psf->write_header = txw_write_header ;
+		} ;
+
+	psf->close = txw_close ;
+
+	error = pcm_init (psf) ;
+
+	return error ;
+} /* txw_open */
+
+/*------------------------------------------------------------------------------
+*/
+
+static int
+txw_read_header	(SF_PRIVATE *psf)
+{	unsigned char byte ;
+	int		marker, dword ;
+	char	*strptr ;
+
+	psf_binheader_readf (psf, "pmm", 0, &marker, &dword) ;
+
+	if (marker != LM89_MARKER || dword != FIVE3_MARKER)
+		return ERROR_666 ;
+	psf_log_printf (psf, "LM8953\n") ;
+
+	/* Jump 8 bytes (nulls). */
+	psf_binheader_readf (psf, "j", 8) ;
+
+	/* Jump 6 bytes. (dummp_aeg) */
+	psf_binheader_readf (psf, "j", 6) ;
+
+	/* Read format. */
+	psf_binheader_readf (psf, "1", &byte) ;
+	switch (byte)
+	{	case 0x49 :
+				strptr = "looped" ;
+				break ;
+
+		case 0xC9 :
+				strptr = "non-looped" ;
+				break ;
+
+		default :
+				psf_log_printf (psf, " Format : 0x%02x => ?????\n", byte & 0xFF) ;
+				return ERROR_666 ;
+		} ;
+
+	psf_log_printf (psf, " Format : 0x%X => looped\n", byte & 0xFF, strptr) ;
+
+	/* Read format. */
+	psf_binheader_readf (psf, "1", &byte) ;
+	switch (byte)
+	{	case 1 :
+				strptr = "33kHz" ;
+				psf->sf.samplerate = 33000 ;
+				break ;
+
+		case 2 :
+				strptr = "50kHz" ;
+				psf->sf.samplerate = 50000 ;
+				break ;
+
+		case 3 :
+				strptr = "16kHz" ;
+				psf->sf.samplerate = 16000 ;
+				break ;
+
+		default :
+				psf_log_printf (psf, " Sample Rate : %d => Unknown\n", byte & 0xFF) ;
+				return ERROR_666 ;
+				break ;
+		} ;
+
+	psf_log_printf (psf, " Sample Rate : %d => %s\n", byte & 0xFF, strptr) ;
+
+	/* Jump 8 bytes (atc_length[3], rpt_length[3], unused[2]). */
+	psf_binheader_readf (psf, "j", 8) ;
+
+	psf->sf.channels = 1 ;
+
+	return 0 ;
+} /* txw_read_header */
+
+/*-
+int
+txw_open_write	(SF_PRIVATE *psf)
+{	int		subformat ;
+
+	if ((psf->sf.format & SF_FORMAT_TYPEMASK) != SF_FORMAT_AU)
+		return	SFE_BAD_OPEN_FORMAT ;
+
+	subformat = psf->sf.format & SF_FORMAT_SUBMASK ;
+
+	psf->endian = psf->sf.format & SF_FORMAT_ENDMASK ;
+	if (CPU_IS_LITTLE_ENDIAN && psf->endian == SF_ENDIAN_CPU)
+		psf->endian = SF_ENDIAN_LITTLE ;
+	else if (psf->endian != SF_ENDIAN_LITTLE)
+		psf->endian = SF_ENDIAN_BIG ;
+
+	psf->error       = 0 ;
+
+	return 0 ;
+} /+* txw_open_write *+/
+-*/
+
+static int
+txw_write_header (SF_PRIVATE *psf)
+{
+	return (psf ? 0 : 1) ;
+} /* txw_write_header */
+
+static int
+txw_close	(SF_PRIVATE  *psf)
+{
+	if (psf->mode == SFM_WRITE || psf->mode == SFM_RDWR)
+	{	/*  
+		**	Now we know for certain the length of the file we can
+		**  re-write correct values for the datasize header element.
+		*/
+
+		psf_fseek (psf->filedes, 0, SEEK_END) ;
+		psf->filelength = psf_ftell (psf->filedes) ;
+
+		psf->datalength = psf->filelength - AU_DATA_OFFSET ;
+		psf_fseek (psf->filedes, 0, SEEK_SET) ;
+
+		psf->sf.samples = psf->datalength / psf->blockwidth ;
+		txw_write_header (psf) ;
+		} ;
+
+	if (psf->fdata)
+		free (psf->fdata) ;
+	psf->fdata = NULL ;
+
+	return 0 ;
+} /* txw_close */
+
--- a/common/libsndfile/src/ulaw.c
+++ b/common/libsndfile/src/ulaw.c
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 1999-2001 Erik de Castro Lopo <[email protected]>
+** Copyright (C) 1999-2002 Erik de Castro Lopo <[email protected]>
 **  
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -20,64 +20,69 @@
 #include	<unistd.h>
 
 #include	"sndfile.h"
-#include	"floatcast.h"
+#include	"float_cast.h"
 #include	"common.h"
 
-static int		ulaw_read_ulaw2s (SF_PRIVATE *psf, short *ptr, unsigned int len) ;
-static int		ulaw_read_ulaw2i (SF_PRIVATE *psf, int *ptr, unsigned int len) ;
-static int		ulaw_read_ulaw2f (SF_PRIVATE *psf, float *ptr, unsigned int len) ;
-static int		ulaw_read_ulaw2d (SF_PRIVATE *psf, double *ptr, unsigned int len, int normalize) ;
+static sf_count_t		ulaw_read_ulaw2s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static sf_count_t		ulaw_read_ulaw2i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+static sf_count_t		ulaw_read_ulaw2f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+static sf_count_t		ulaw_read_ulaw2d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
 
-static int		ulaw_write_s2ulaw (SF_PRIVATE *psf, short *ptr, unsigned int len) ;
-static int		ulaw_write_i2ulaw (SF_PRIVATE *psf, int *ptr, unsigned int len) ;
-static int		ulaw_write_f2ulaw (SF_PRIVATE *psf, float *ptr, unsigned int len) ;
-static int		ulaw_write_d2ulaw (SF_PRIVATE *psf, double *ptr, unsigned int len, int normalize) ;
+static sf_count_t		ulaw_write_s2ulaw (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
+static sf_count_t		ulaw_write_i2ulaw (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
+static sf_count_t		ulaw_write_f2ulaw (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
+static sf_count_t		ulaw_write_d2ulaw (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
 
-static  void    ulaw2s_array      (unsigned char *buffer, unsigned int count, short *ptr, unsigned int index) ;
-static  void    ulaw2i_array      (unsigned char *buffer, unsigned int count, int *ptr, unsigned int index) ;
-static  void    ulaw2f_array      (unsigned char *buffer, unsigned int count, float *ptr, unsigned int index, float normfact) ;
-static  void    ulaw2d_array      (unsigned char *buffer, unsigned int count, double *ptr, unsigned int index, double normfact) ;
+static  void    ulaw2s_array      (unsigned char *buffer, unsigned int count, short *ptr) ;
+static  void    ulaw2i_array      (unsigned char *buffer, unsigned int count, int *ptr) ;
+static  void    ulaw2f_array      (unsigned char *buffer, unsigned int count, float *ptr, float normfact) ;
+static  void    ulaw2d_array      (unsigned char *buffer, unsigned int count, double *ptr, double normfact) ;
 
-static  void    s2ulaw_array      (short *buffer, unsigned int count, unsigned char *ptr, unsigned int index) ;
-static  void    i2ulaw_array      (int *buffer, unsigned int count, unsigned char *ptr, unsigned int index) ;
-static  void    f2ulaw_array      (float *buffer, unsigned int count, unsigned char *ptr, unsigned int index, float normfact) ;
-static  void    d2ulaw_array      (double *buffer, unsigned int count, unsigned char *ptr, unsigned int index, double normfact) ;
+static  void    s2ulaw_array      (short *buffer, unsigned int count, unsigned char *ptr) ;
+static  void    i2ulaw_array      (int *buffer, unsigned int count, unsigned char *ptr) ;
+static  void    f2ulaw_array      (float *buffer, unsigned int count, unsigned char *ptr, float normfact) ;
+static  void    d2ulaw_array      (double *buffer, unsigned int count, unsigned char *ptr, double normfact) ;
 
 
 int 
-ulaw_read_init (SF_PRIVATE *psf)
+ulaw_init (SF_PRIVATE *psf)
 {
-	psf->read_short  = (func_short)  ulaw_read_ulaw2s ;
-	psf->read_int    = (func_int)    ulaw_read_ulaw2i ;
-	psf->read_float  = (func_float)  ulaw_read_ulaw2f ;
-	psf->read_double = (func_double) ulaw_read_ulaw2d ;
+	if (psf->mode == SFM_READ || psf->mode == SFM_RDWR)
+	{	psf->read_short  = ulaw_read_ulaw2s ;
+		psf->read_int    = ulaw_read_ulaw2i ;
+		psf->read_float  = ulaw_read_ulaw2f ;
+		psf->read_double = ulaw_read_ulaw2d ;
+		} ;
+		
+	if (psf->mode == SFM_WRITE || psf->mode == SFM_RDWR)
+	{	psf->write_short  = ulaw_write_s2ulaw ;
+		psf->write_int    = ulaw_write_i2ulaw ;
+		psf->write_float  = ulaw_write_f2ulaw ;
+		psf->write_double = ulaw_write_d2ulaw ;
+		} ;
 
-	return 0 ;
-} /* ulaw_read_int */
+	psf->bytewidth  = 1 ;
+	psf->blockwidth = psf->sf.channels ;
 
-int 
-ulaw_write_init (SF_PRIVATE *psf)
-{
-	psf->write_short  = (func_short)  ulaw_write_s2ulaw ;
-	psf->write_int    = (func_int)    ulaw_write_i2ulaw ;
-	psf->write_float  = (func_float)  ulaw_write_f2ulaw ;
-	psf->write_double = (func_double) ulaw_write_d2ulaw ;
+	psf->filelength = psf_get_filelen (psf->filedes) ;
+	psf->datalength = (psf->dataend) ? psf->dataend - psf->dataoffset : 
+							psf->filelength - psf->dataoffset ;
+	psf->sf.samples = psf->datalength / psf->blockwidth ;
 
 	return 0 ;
-} /* ulaw_write_int */
+} /* ulaw_init */
 
-static int
-ulaw_read_ulaw2s (SF_PRIVATE *psf, short *ptr, unsigned int len)
-{	unsigned int readcount, thisread, index = 0 ;
-	int		bytecount, bufferlen ;
-	int		total = 0 ;
+static sf_count_t
+ulaw_read_ulaw2s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
+{	sf_count_t	readcount, thisread, index = 0, total = 0 ;
+	sf_count_t	bytecount, bufferlen ;
 
 	bufferlen = (SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth ;
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
-		ulaw2s_array ((unsigned char*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
+		thisread = psf_fread (psf->buffer, 1, readcount, psf->filedes) ;
+		ulaw2s_array ((unsigned char*) (psf->buffer), thisread / psf->bytewidth, ptr + index) ;
 		total += thisread ;
 		if (thisread < readcount)
 			break ;
@@ -92,18 +97,17 @@
 	return total ;
 } /* ulaw_read_ulaw2s */
 
-static int
-ulaw_read_ulaw2i (SF_PRIVATE *psf, int *ptr, unsigned int len)
-{	unsigned int readcount, thisread, index = 0 ;
-	int		bytecount, bufferlen ;
-	int		total = 0 ;
+static sf_count_t
+ulaw_read_ulaw2i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
+{	sf_count_t	readcount, thisread, index = 0, total = 0 ;
+	sf_count_t	bytecount, bufferlen ;
 
 	bufferlen = (SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth ;
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
-		ulaw2i_array ((unsigned char*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
+		thisread = psf_fread (psf->buffer, 1, readcount, psf->filedes) ;
+		ulaw2i_array ((unsigned char*) (psf->buffer), thisread / psf->bytewidth, ptr + index) ;
 		total += thisread ;
 		if (thisread < readcount)
 			break ;
@@ -118,11 +122,10 @@
 	return total ;
 } /* ulaw_read_ulaw2i */
 
-static int
-ulaw_read_ulaw2f (SF_PRIVATE *psf, float *ptr, unsigned int len)
-{	unsigned int readcount, thisread, index = 0 ;
-	int		bytecount, bufferlen ;
-	int		total = 0 ;
+static sf_count_t
+ulaw_read_ulaw2f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
+{	sf_count_t	readcount, thisread, index = 0, total = 0 ;
+	sf_count_t	bytecount, bufferlen ;
 	float	normfact ;
 
 	normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ;
@@ -131,8 +134,8 @@
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
-		ulaw2f_array ((unsigned char*) (psf->buffer), thisread / psf->bytewidth, ptr, index, normfact) ;
+		thisread = psf_fread (psf->buffer, 1, readcount, psf->filedes) ;
+		ulaw2f_array ((unsigned char*) (psf->buffer), thisread / psf->bytewidth, ptr + index, normfact) ;
 		total += thisread ;
 		if (thisread < readcount)
 			break ;
@@ -147,20 +150,19 @@
 	return total ;
 } /* ulaw_read_ulaw2f */
 
-static int
-ulaw_read_ulaw2d (SF_PRIVATE *psf, double *ptr, unsigned int len, int normalize)
-{	unsigned int readcount, thisread, index = 0 ;
-	int		bytecount, bufferlen ;
-	int		total = 0 ;
+static sf_count_t
+ulaw_read_ulaw2d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
+{	sf_count_t	readcount, thisread, index = 0, total = 0 ;
+	sf_count_t	bytecount, bufferlen ;
 	double	normfact ;
 	
-	normfact = (normalize ? 1.0 / ((double) 0x8000) : 1.0) ;
+	normfact = (psf->norm_double) ? 1.0 / ((double) 0x8000) : 1.0 ;
 	bufferlen = (SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth ;
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
-		ulaw2d_array ((unsigned char*) (psf->buffer), thisread / psf->bytewidth, ptr, index, normfact) ;
+		thisread = psf_fread (psf->buffer, 1, readcount, psf->filedes) ;
+		ulaw2d_array ((unsigned char*) (psf->buffer), thisread / psf->bytewidth, ptr + index, normfact) ;
 		total += thisread ;
 		if (thisread < readcount)
 			break ;
@@ -178,18 +180,17 @@
 /*=============================================================================================
 */
 
-static int
-ulaw_write_s2ulaw	(SF_PRIVATE *psf, short *ptr, unsigned int len)
-{	unsigned int	writecount, thiswrite, index = 0 ;
-	int		bytecount, bufferlen ;
-	int		total = 0 ;
+static sf_count_t
+ulaw_write_s2ulaw	(SF_PRIVATE *psf, short *ptr, sf_count_t len)
+{	sf_count_t	writecount, thiswrite, index = 0, total = 0 ;
+	sf_count_t	bytecount, bufferlen ;
 
 	bufferlen = (SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth ;
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		s2ulaw_array (ptr, index, (unsigned char*) (psf->buffer), writecount / psf->bytewidth) ;
-		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		s2ulaw_array (ptr + index, writecount / psf->bytewidth, (unsigned char*) (psf->buffer)) ;
+		thiswrite = psf_fwrite (psf->buffer, 1, writecount, psf->filedes) ;
 		total += thiswrite ;
 		if (thiswrite < writecount)
 			break ;
@@ -204,18 +205,17 @@
 	return total ;
 } /* ulaw_write_s2ulaw */
 
-static int
-ulaw_write_i2ulaw	(SF_PRIVATE *psf, int *ptr, unsigned int len)
-{	unsigned int	writecount, thiswrite, index = 0 ;
-	int		bytecount, bufferlen ;
-	int		total = 0 ;
+static sf_count_t
+ulaw_write_i2ulaw	(SF_PRIVATE *psf, int *ptr, sf_count_t len)
+{	sf_count_t	writecount, thiswrite, index = 0, total = 0 ;
+	sf_count_t	bytecount, bufferlen ;
 
 	bufferlen = (SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth ;
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		i2ulaw_array (ptr, index, (unsigned char*) (psf->buffer), writecount / psf->bytewidth) ;
-		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		i2ulaw_array (ptr + index, writecount / psf->bytewidth, (unsigned char*) (psf->buffer)) ;
+		thiswrite = psf_fwrite (psf->buffer, 1, writecount, psf->filedes) ;
 		total += thiswrite ;
 		if (thiswrite < writecount)
 			break ;
@@ -230,11 +230,10 @@
 	return total ;
 } /* ulaw_write_i2ulaw */
 
-static int
-ulaw_write_f2ulaw	(SF_PRIVATE *psf, float *ptr, unsigned int len)
-{	unsigned int	writecount, thiswrite, index = 0 ;
-	int		bytecount, bufferlen ;
-	int		total = 0 ;
+static sf_count_t
+ulaw_write_f2ulaw	(SF_PRIVATE *psf, float *ptr, sf_count_t len)
+{	sf_count_t	writecount, thiswrite, index = 0, total = 0 ;
+	sf_count_t	bytecount, bufferlen ;
 	float	normfact ;
 
 	normfact = (psf->norm_float == SF_TRUE) ? ((float) 0x8000) : 1.0 ;
@@ -243,8 +242,8 @@
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		f2ulaw_array (ptr, index, (unsigned char*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
-		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		f2ulaw_array (ptr + index, writecount / psf->bytewidth, (unsigned char*) (psf->buffer), normfact) ;
+		thiswrite = psf_fwrite (psf->buffer, 1, writecount, psf->filedes) ;
 		total += thiswrite ;
 		if (thiswrite < writecount)
 			break ;
@@ -259,21 +258,20 @@
 	return total ;
 } /* ulaw_write_f2ulaw */
 
-static int
-ulaw_write_d2ulaw	(SF_PRIVATE *psf, double *ptr, unsigned int len, int normalize)
-{	unsigned int	writecount, thiswrite, index = 0 ;
-	int		bytecount, bufferlen ;
-	int		total = 0 ;
+static sf_count_t
+ulaw_write_d2ulaw	(SF_PRIVATE *psf, double *ptr, sf_count_t len)
+{	sf_count_t	writecount, thiswrite, index = 0, total = 0 ;
+	sf_count_t	bytecount, bufferlen ;
 	double	normfact ;
 	
-	normfact = (normalize ? ((double) 0x8000) : 1.0) ;
+	normfact = (psf->norm_double) ? ((double) 0x8000) : 1.0 ;
 
 	bufferlen = (SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth ;
 	bytecount = len * psf->bytewidth ;
 	while (bytecount > 0)
 	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
-		d2ulaw_array (ptr, index, (unsigned char*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
-		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		d2ulaw_array (ptr + index, writecount / psf->bytewidth, (unsigned char*) (psf->buffer), normfact) ;
+		thiswrite = psf_fwrite (psf->buffer, 1, writecount, psf->filedes) ;
 		total += thiswrite ;
 		if (thiswrite < writecount)
 			break ;
@@ -999,102 +997,90 @@
 } ;
 
 static void	
-ulaw2s_array	(unsigned char *buffer, unsigned int count, short *ptr, unsigned int index)
-{	int 	k ;
-	for (k = 0 ; k < count ; k++)
-	{	if (buffer [k] & 0x80)
-			ptr [index] = -1 * ulaw_decode [((int) buffer [k]) & 0x7F] ;
+ulaw2s_array	(unsigned char *buffer, unsigned int count, short *ptr)
+{	while (count)
+	{	count -- ;
+		if (buffer [count] & 0x80)
+			ptr [count] = -1 * ulaw_decode [((int) buffer [count]) & 0x7F] ;
 		else
-			ptr [index] = ulaw_decode [((int) buffer [k]) & 0x7F] ;
-		index ++ ;
+			ptr [count] = ulaw_decode [((int) buffer [count]) & 0x7F] ;
 		} ;
 } /* ulaw2s_array */
 
 static void	
-ulaw2i_array	(unsigned char *buffer, unsigned int count, int *ptr, unsigned int index)
-{	int 	k ;
-	for (k = 0 ; k < count ; k++)
-	{	if (buffer [k] & 0x80)
-			ptr [index] = -1 * ulaw_decode [((int) buffer [k]) & 0x7F] ;
+ulaw2i_array	(unsigned char *buffer, unsigned int count, int *ptr)
+{	while (count)
+	{	count -- ;
+		if (buffer [count] & 0x80)
+			ptr [count] = -1 * ulaw_decode [buffer [count] & 0x7F] << 16 ;
 		else
-			ptr [index] = ulaw_decode [((int) buffer [k]) & 0x7F] ;
-		index ++ ;
+			ptr [count] = ulaw_decode [buffer [count] & 0x7F] << 16 ;
 		} ;
 } /* ulaw2i_array */
 
 static void	
-ulaw2f_array	(unsigned char *buffer, unsigned int count, float *ptr, unsigned int index, float normfact)
-{	int 	k ;
-	for (k = 0 ; k < count ; k++)
-	{	if (buffer [k] & 0x80)
-			ptr [index] = -normfact * ulaw_decode [((int) buffer [k]) & 0x7F] ;
+ulaw2f_array	(unsigned char *buffer, unsigned int count, float *ptr, float normfact)
+{	while (count)
+	{	count -- ;
+		if (buffer [count] & 0x80)
+			ptr [count] = -normfact * ulaw_decode [((int) buffer [count]) & 0x7F] ;
 		else
-			ptr [index] = normfact * ulaw_decode [((int) buffer [k]) & 0x7F] ;
-		index ++ ;
+			ptr [count] = normfact * ulaw_decode [((int) buffer [count]) & 0x7F] ;
 		} ;
 } /* ulaw2f_array */
 
 static void	
-ulaw2d_array	(unsigned char *buffer, unsigned int count, double *ptr, unsigned int index, double normfact)
-{	int 	k ;
-	for (k = 0 ; k < count ; k++)
-	{	if (buffer [k] & 0x80)
-			ptr [index] = -normfact * ulaw_decode [((int) buffer [k]) & 0x7F] ;
+ulaw2d_array	(unsigned char *buffer, unsigned int count, double *ptr, double normfact)
+{	while (count)
+	{	count -- ;
+		if (buffer [count] & 0x80)
+			ptr [count] = -normfact * ulaw_decode [((int) buffer [count]) & 0x7F] ;
 		else
-			ptr [index] = normfact * ulaw_decode [((int) buffer [k]) & 0x7F] ;
-		index ++ ;
+			ptr [count] = normfact * ulaw_decode [((int) buffer [count]) & 0x7F] ;
 		} ;
 } /* ulaw2d_array */
 
 static void    
-s2ulaw_array      (short *ptr, unsigned int index, unsigned char *buffer, unsigned int count)
-{	unsigned int	k ;
-
-	for (k = 0 ; k < count ; k++)
-	{	if (ptr [index] >= 0) 
-			buffer [k] = ulaw_encode [ptr [index] / 4] ;
+s2ulaw_array      (short *ptr, unsigned int count, unsigned char *buffer)
+{	while (count)
+	{	count -- ;
+		if (ptr [count] >= 0) 
+			buffer [count] = ulaw_encode [ptr [count] / 4] ;
 		else
-			buffer [k] = 0x7F & ulaw_encode [ptr [index] / -4] ;
-		index ++ ;
+			buffer [count] = 0x7F & ulaw_encode [ptr [count] / -4] ;
 		} ;
 } /* s2ulaw_array */
 
 static void    
-i2ulaw_array      (int *ptr, unsigned int index, unsigned char *buffer, unsigned int count)
-{	unsigned int	k ;
-
-	for (k = 0 ; k < count ; k++)
-	{	if (ptr [index] >= 0) 
-			buffer [k] = ulaw_encode [ptr [index] / 4] ;
+i2ulaw_array      (int *ptr, unsigned int count, unsigned char *buffer)
+{	while (count)
+	{	count -- ;
+		if (ptr [count] >= 0) 
+			buffer [count] = ulaw_encode [ptr [count] >> (16 + 2)] ;
 		else
-			buffer [k] = 0x7F & ulaw_encode [ptr [index] / -4] ;
-		index ++ ;
+			buffer [count] = 0x7F & ulaw_encode [-ptr [count] >> (16 + 2)] ;
 		} ;
 } /* i2ulaw_array */
 
 static void
-f2ulaw_array      (float *ptr, unsigned int index, unsigned char *buffer, unsigned int count, float normfact)
-{	unsigned int	k ;
-
-	for (k = 0 ; k < count ; k++)
-	{	if (ptr [index] >= 0) 
-			buffer [k] = ulaw_encode [(FLOAT_TO_INT (normfact * ptr [index])) / 4] ;
+f2ulaw_array      (float *ptr, unsigned int count, unsigned char *buffer, float normfact)
+{	while (count)
+	{	count -- ;
+		if (ptr [count] >= 0) 
+			buffer [count] = ulaw_encode [(lrintf (normfact * ptr [count])) / 4] ;
 		else
-			buffer [k] = 0x7F & ulaw_encode [(FLOAT_TO_INT (normfact * ptr [index])) / -4] ;
-		index ++ ;
+			buffer [count] = 0x7F & ulaw_encode [(lrintf (normfact * ptr [count])) / -4] ;
 		} ;
 } /* f2ulaw_array */
 
 static void
-d2ulaw_array      (double *ptr, unsigned int index, unsigned char *buffer, unsigned int count, double normfact)
-{	unsigned int	k ;
-
-	for (k = 0 ; k < count ; k++)
-	{	if (ptr [index] >= 0) 
-			buffer [k] = ulaw_encode [(DOUBLE_TO_INT (normfact * ptr [index])) / 4] ;
+d2ulaw_array      (double *ptr, unsigned int count, unsigned char *buffer, double normfact)
+{	while (count)
+	{	count -- ;
+		if (ptr [count] >= 0) 
+			buffer [count] = ulaw_encode [(lrint (normfact * ptr [count])) / 4] ;
 		else
-			buffer [k] = 0x7F & ulaw_encode [(DOUBLE_TO_INT (normfact * ptr [index])) / -4] ;
-		index ++ ;
+			buffer [count] = 0x7F & ulaw_encode [(lrint (normfact * ptr [count])) / -4] ;
 		} ;
 } /* d2ulaw_array */
 
--- a/common/libsndfile/src/voc.c
+++ b/common/libsndfile/src/voc.c
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 2001 Erik de Castro Lopo <[email protected]>
+** Copyright (C) 2001-2002 Erik de Castro Lopo <[email protected]>
 **  
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -16,12 +16,17 @@
 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 */
 
+/*	RANT:
+**	The VOC file format is the most brain damaged format I have yet had to deal 
+**	with. No one programmer could have bee stupid enough to put this together.
+**	Instead it looks like a series of manic, dyslexic assembly language programmers 
+**	hacked it to fit their needs.
+**	Utterly woeful.
+*/
 
 #include	<stdio.h>
 #include	<unistd.h>
 #include	<string.h>
-#include	<ctype.h>
-#include	<stdarg.h>
 
 #include	"sndfile.h"
 #include	"config.h"
@@ -30,51 +35,130 @@
 
 
 /*------------------------------------------------------------------------------
- * Macros to handle big/little endian issues.
-*/
-
-#if (CPU_IS_LITTLE_ENDIAN == 1)
-#	define	MAKE_MARKER(a,b,c,d)		((a)|((b)<<8)|((c)<<16)|((d)<<24))
-#elif (CPU_IS_BIG_ENDIAN == 1)
-#	define	MAKE_MARKER(a,b,c,d)		(((a)<<24)|((b)<<16)|((c)<<8)|(d))
-#else
-#	error "Cannot determine endian-ness of processor."
-#endif
-
-/*------------------------------------------------------------------------------
  * Typedefs for file chunks.
 */
 
+#define	VOC_MAX_SECTIONS	200
+
 enum
-{	VOC_TYPE_TERMINATOR		= 0,
-	VOC_TYPE_SOUND_DATA		= 1,
-	VOC_TYPE_SOUND_CONTINUE = 2,
-	VOC_TYPE_SILENCE		= 3,
-	VOC_TYPE_MARKER			= 4,
-	VOC_TYPE_ASCII			= 5,
-	VOC_TYPE_REPEAT			= 6,
-	VOC_TYPE_END_REPEAT		= 7,
-	VOC_TYPE_EXTENDED		= 8,
-	VOC_TYPE_9				= 9
+{	VOC_TERMINATOR		= 0,
+	VOC_SOUND_DATA		= 1,
+	VOC_SOUND_CONTINUE	= 2,
+	VOC_SILENCE			= 3,
+	VOC_MARKER			= 4,
+	VOC_ASCII			= 5,
+	VOC_REPEAT			= 6,
+	VOC_END_REPEAT		= 7,
+	VOC_EXTENDED		= 8,
+	VOC_EXTENDED_II		= 9
 } ;
 
+typedef struct
+{	int 	samples ;
+	int		offset ;	/* Offset of zero => silence. */
+} SND_DATA_BLOCKS ;
+
+typedef struct
+{	unsigned int 	sections, section_types ;
+	int				samplerate, channels, bitwidth ;
+	SND_DATA_BLOCKS	blocks [VOC_MAX_SECTIONS] ;
+} VOC_DATA ;
+
 /*------------------------------------------------------------------------------
  * Private static functions.
 */
 
-static	int		voc_close	(SF_PRIVATE  *psf) ;
+static	int	voc_close	(SF_PRIVATE  *psf) ;
+static	int voc_write_header (SF_PRIVATE *psf) ;
+static  int voc_read_header	(SF_PRIVATE *psf) ;
 
+static const char* voc_encoding2str (int encoding) ;
+
+#if 0
+
+/*	These functions would be required for files with more than one VOC_SOUND_DATA 
+**	segment. Not sure whether to bother implementing this.
+*/
+
+static int	voc_multi_init (SF_PRIVATE *psf, VOC_DATA *pvoc) ;
+
+static int	voc_multi_read_uc2s  (SF_PRIVATE *psf, short *ptr, int len) ;
+static int	voc_multi_read_les2s (SF_PRIVATE *psf, short *ptr, int len) ;
+
+static int	voc_multi_read_uc2i  (SF_PRIVATE *psf, int *ptr, int len) ;
+static int	voc_multi_read_les2i (SF_PRIVATE *psf, int *ptr, int len) ;
+
+static int	voc_multi_read_uc2f  (SF_PRIVATE *psf, float *ptr, int len) ;
+static int	voc_multi_read_les2f (SF_PRIVATE *psf, float *ptr, int len) ;
+
+static int	voc_multi_read_uc2d  (SF_PRIVATE *psf, double *ptr, int len) ;
+static int	voc_multi_read_les2d (SF_PRIVATE *psf, double *ptr, int len) ;
+#endif
+
 /*------------------------------------------------------------------------------
-** Public functions.
+** Public function.
 */
 
-int
-voc_open_read	(SF_PRIVATE *psf)
-{	char	creative [20], type ;
-	short	version ;
+int 	
+voc_open	(SF_PRIVATE *psf)
+{	int subformat, error = 0 ;
 
+	if (psf->mode == SFM_READ || (psf->mode == SFM_RDWR && psf->filelength > 0))
+	{	if ((error = voc_read_header (psf)))
+			return error ;
+		} ;
+
+	subformat = psf->sf.format & SF_FORMAT_SUBMASK ;
+	
+	if (psf->mode == SFM_WRITE || psf->mode == SFM_RDWR)
+	{	if ((psf->sf.format & SF_FORMAT_TYPEMASK) != SF_FORMAT_VOC)
+			return	SFE_BAD_OPEN_FORMAT ;
+		
+		psf->endian = SF_ENDIAN_LITTLE ;
+	
+		if ((error = voc_write_header (psf)))
+			return error ;
+	
+		psf->write_header = voc_write_header ;
+		} ;
+		
+	psf->blockwidth = psf->bytewidth * psf->sf.channels ;
+	
+	psf->close = voc_close ;
+
+	switch (subformat)
+	{	case SF_FORMAT_PCM_U8 :
+		case SF_FORMAT_PCM_16 :
+				error = pcm_init (psf) ;
+				break ;
+
+		case SF_FORMAT_ALAW :
+				error = alaw_init (psf) ;
+				break ;
+			
+		case SF_FORMAT_ULAW :
+				error = ulaw_init (psf) ;
+				break ;
+			
+		default : return SFE_UNIMPLEMENTED ;
+		} ;
+		
+	return error ; 
+} /* voc_open */
+
+/*------------------------------------------------------------------------------
+*/
+
+static int
+voc_read_header	(SF_PRIVATE *psf)
+{	VOC_DATA	*pvoc ;
+	char	creative [20] ;
+	unsigned char block_type, rate_byte ;
+	short	version, checksum, encoding, dataoffset ;
+	int		offset ;
+
 	/* Set position to start of file to begin reading header. */
-	psf_binheader_readf (psf, "pB", 0, creative, sizeof (creative)) ;
+	offset = psf_binheader_readf (psf, "pb", 0, creative, sizeof (creative)) ;
 		
 	if (creative [sizeof (creative) - 1] != 0x1A)
 		return SFE_VOC_NO_CREATIVE ;
@@ -87,188 +171,461 @@
 
 	psf_log_printf (psf, "%s\n", creative) ;
 
-	psf_binheader_readf (psf, "ww", &(psf->dataoffset), &version) ;
+	offset += psf_binheader_readf (psf, "e222", &dataoffset, &version, &checksum) ;
 
-	psf_log_printf (psf, "dataoffset : %d\n", psf->dataoffset) ;
-	psf_log_printf (psf, "version    : %X\n", version) ;
+	psf->dataoffset = dataoffset ;
 
+	psf_log_printf (psf, 	"dataoffset : %d\n"
+							"version    : 0x%X\n"
+							"checksum   : 0x%X\n", psf->dataoffset, version, checksum) ;
+
 	if (version != 0x010A && version != 0x0114)
 		return SFE_VOC_BAD_VERSION ;
+	
+	if (! (psf->fdata = malloc (sizeof (VOC_DATA))))
+		return SFE_MALLOC_FAILED ;
 
-	psf_binheader_readf (psf, "w", &version) ;
-	psf_log_printf (psf, "version 2  : %X\n", version) ;
+	pvoc = (VOC_DATA*) psf->fdata ;
 	
+	memset (pvoc, 0, sizeof (VOC_DATA)) ;
+	
+	/* Set the default encoding now. */
+	psf->sf.format = SF_FORMAT_VOC ; /* Major format */
+	encoding = SF_FORMAT_PCM_U8 ; /* Minor format */
+	psf->endian = SF_ENDIAN_LITTLE ;
+	
 	while (1)
-	{	psf_binheader_readf (psf, "b", &type) ;
+	{	offset += psf_binheader_readf (psf, "1", &block_type) ;
+		
+		switch (block_type)
+		{	case VOC_ASCII :
+					{	int size ;
+					
+						offset += psf_binheader_readf (psf, "e3", &size) ;
+						
+						psf_log_printf (psf, " ASCII : %d\n", size) ;
 	
-		switch (type)
-		{	case VOC_TYPE_TERMINATOR :
-					psf_log_printf (psf, " Terminator\n") ;
+						offset += psf_binheader_readf (psf, "b", psf->header, size) ;
+						psf->header [size] = 0 ;
+						psf_log_printf (psf, "  text : %s\n", psf->header) ;
+						} ;
+					continue ;
+		
+			case VOC_SOUND_DATA :
+			case VOC_EXTENDED :
+			case VOC_EXTENDED_II :
 					break ;
+			
+			default : psf_log_printf (psf, "*** Weird block marker (%d)\n", block_type) ;
+			} ;
+			
+		break ;
+		} ;
+	
+	if (block_type == VOC_SOUND_DATA)
+	{	unsigned char compression ;
+		int 	size ;
+						
+		offset += psf_binheader_readf (psf, "e311", &size, &rate_byte, &compression) ;
 
-			case VOC_TYPE_SOUND_DATA :
-					{	unsigned char rate_byte, compression ;
-						int		size ;
-
-						psf_binheader_readf (psf, "tbb", &size, &rate_byte, &compression) ;
-
-						psf_log_printf (psf, " Sound Data : %d\n", size) ;
-						psf_log_printf (psf, "  sr   : %d => %dHz\n", (rate_byte & 0xFF), 1000000 / (256 - rate_byte)) ;
-						psf_log_printf (psf, "  comp : %d\n", compression) ;
+		psf->sf.samplerate = 1000000 / (256 - (rate_byte & 0xFF)) ;
+						
+		psf_log_printf (psf,	" Sound Data : %d\n"
+								"  sr   : %d => %dHz\n"
+								"  comp : %d\n", 
+								size, rate_byte, psf->sf.samplerate, compression) ;
 	
-						psf_binheader_readf (psf, "j", size) ;
-						} ;
-					break ;
+		if (offset + size - 1 > psf->filelength)
+		{	psf_log_printf (psf, "Seems to be a truncated file.\n") ;
+			puts ("Seems to be a truncated file.\n") ;
+			psf_log_printf (psf, "offset : %d    size : %d    filelength : %d\n", offset, size, psf->filelength) ;
+			return SFE_VOC_BAD_SECTIONS ;
+			}
+		else if (offset + size - 1 < psf->filelength)
+		{	psf_log_printf (psf, "Seems to be a multi-segment file.\n") ;
+			psf_log_printf (psf, "offset : %d    size : %d    filelength : %d\n", offset, size, psf->filelength) ;
+			return SFE_VOC_BAD_SECTIONS ;
+			} ;
+			
+		psf->dataoffset = offset ;
+		psf->dataend    = psf->filelength - 1 ;
 
-			case VOC_TYPE_SOUND_CONTINUE :
-					{	int		size ;
+		psf->sf.channels = 1 ;
+		psf->bytewidth = 1 ;
 
-						psf_binheader_readf (psf, "t", &size) ;
-
-						psf_log_printf (psf, " Sound Continue : %d\n", size) ;
+		psf->sf.format = SF_FORMAT_VOC | SF_FORMAT_PCM_U8 ;
+		psf->chars = SF_CHARS_UNSIGNED ;
+		
+		return 0 ;
+		} ;
 	
-						psf_binheader_readf (psf, "j", size) ;
-						} ;
-					break ;
+	if (block_type == VOC_EXTENDED)
+	{	unsigned char pack, stereo, compression ;
+		unsigned short rate_short ;
+		int		size ;
 
-			case VOC_TYPE_SILENCE :
-					{	unsigned char rate_byte ;
-						short length ;
+		offset += psf_binheader_readf (psf, "e3211", &size, &rate_short, &pack, &stereo) ;
+		
+		psf_log_printf (psf, " Extended : %d\n", size) ;
+		if (size == 4)
+			psf_log_printf (psf, "  size   : 4\n") ;
+		else
+			psf_log_printf (psf, "  size   : %d (should be 4)\n", size) ;
+
+		psf_log_printf (psf,	"  pack   : %d\n"
+								"  stereo : %s\n", pack, (stereo ? "yes" : "no")) ;
 						
-						psf_log_printf (psf, " Silence\n") ;
-						psf_binheader_readf (psf, "wb", &length, &rate_byte) ;
-						psf_log_printf (psf, "  length : %d\n", length) ;
-						psf_log_printf (psf, "  sr     : %d => %dHz\n", (rate_byte & 0xFF), 1000000 / (256 - rate_byte)) ;
-		  				} ;
-					break ;
+		if (stereo)
+		{	psf->sf.channels = 2 ;
+			psf->sf.samplerate = 128000000 / (65536 - rate_short) ;
+			}
+		else
+		{	psf->sf.channels = 1 ;
+			psf->sf.samplerate = 256000000 / (65536 - rate_short) ;
+			} ;
 
-			case VOC_TYPE_MARKER :
-					{	int		size ;
-						short	value ;
+		psf_log_printf (psf, "  sr     : %d => %dHz\n", (rate_short & 0xFFFF), psf->sf.samplerate) ;
+			
+		offset += psf_binheader_readf (psf, "1", &block_type) ;
+		
+		if (block_type != VOC_SOUND_DATA)
+		{	psf_log_printf (psf, "*** Expecting VOC_SOUND_DATA section.\n") ;
+			return SFE_VOC_BAD_FORMAT ;
+			} ;
+		
+		offset += psf_binheader_readf (psf, "e311", &size, &rate_byte, &compression) ;
+		
+		psf_log_printf (psf,	" Sound Data : %d\n"
+								"  sr     : %d\n"
+								"  comp   : %d\n", size, rate_byte, compression) ;
 
-						psf_log_printf (psf, " Marker\n") ;
 
-						psf_binheader_readf (psf, "tw", &size, &value) ;
-						
-						psf_log_printf (psf, "  size  : %d\n", size) ;
-						psf_log_printf (psf, "  value : %d\n", value) ;
-						} ;
-					break ;
+		if (offset + size - 1 > psf->filelength)
+		{	psf_log_printf (psf, "Seems to be a truncated file.\n") ;
+			puts ("Seems to be a truncated file.\n") ;
+			/*-printf ("offset : %d    size : %d    filelength : %ld\n", offset, size, psf->filelength) ;-*/
+			return SFE_VOC_BAD_SECTIONS ;
+			}
+		else if (offset + size - 1 < psf->filelength)
+		{	/*-printf ("offset : %d    size : %d    filelength : %ld\n", offset, size, psf->filelength) ;-*/
+			psf_log_printf (psf, "Seems to be a multi-segment file.\n") ;
+			return SFE_VOC_BAD_SECTIONS ;
+			} ;
+			
+		psf->dataoffset = offset ;
+		psf->dataend = psf->filelength - 1 ;
 
-			case VOC_TYPE_ASCII :
-					{	int		size ;
+		psf->bytewidth = 1 ;
 
-						psf_binheader_readf (psf, "t", &size) ;
-
-						psf_log_printf (psf, " ASCII : %d\n", size) ;
+		psf->sf.format = SF_FORMAT_VOC | SF_FORMAT_PCM_U8 ;						
+		psf->chars = SF_CHARS_UNSIGNED ;
+		
+		return 0 ;
+		}
 	
-						psf_binheader_readf (psf, "B", psf->header, size) ;
-						psf->header [size] = 0 ;
-						psf_log_printf (psf, "  text : %s\n", psf->header) ;
-						} ;
-					break ;
+	if (block_type == VOC_EXTENDED_II)
+	{	unsigned char bitwidth, channels ;
+		int size, fourbytes ;
 
-			case VOC_TYPE_REPEAT :
-					{	int		size ;
-						short	count ;
+		offset += psf_binheader_readf (psf, "e341124", &size, &psf->sf.samplerate, 
+								&bitwidth, &channels, &encoding, &fourbytes) ;
 
-						psf_binheader_readf (psf, "tw", &size, &count) ;
+		if (size * 2 == psf->filelength - 39)
+		{	int temp_size = psf->filelength - 31 ;
 
-						psf_log_printf (psf, " Marker : %d\n", size) ;
-						psf_log_printf (psf, "  value : %d\n", count) ;
-						} ;
-					break ;
+			psf_log_printf (psf, " Extended II : %d (SoX bug: should be %d)\n", size, temp_size) ;
+			size = temp_size ;
+			}
+		else
+			psf_log_printf (psf, " Extended II : %d\n", size) ;
 
-			case VOC_TYPE_END_REPEAT :
-					psf_log_printf (psf, " End Repeat\n") ;
-					break ;
-						
-			case VOC_TYPE_EXTENDED :
-					{	unsigned char pack, mode ;
-						short 	rate_short ;
-						int		size, sample_rate ;
+		psf_log_printf (psf,	"  sample rate : %d\n"
+								"  bit width   : %d\n"
+								"  channels    : %d\n", psf->sf.samplerate, bitwidth, channels) ;
 
-						psf_binheader_readf (psf, "t", &size) ;
-						psf_log_printf (psf, " Extended : %d\n", size) ;
-						
-						psf_binheader_readf (psf, "wbb", &rate_short, &pack, &mode) ;
-						psf_log_printf (psf, "  size : %d\n", size) ;
-						psf_log_printf (psf, "  pack : %d\n", pack) ;
-						psf_log_printf (psf, "  mode : %d\n", mode) ;
-						
-						if (mode)
-							sample_rate = 128000000 / (65536 - rate_short) ;
-						else
-							sample_rate = 256000000 / (65536 - rate_short) ;
+		if (bitwidth == 16 && encoding == 0)
+		{	encoding = 4 ;
+			psf_log_printf (psf, "  encoding    : 0 (SoX bug: should be 4 for 16 bit signed PCM)\n") ;
+			}
+		else
+			psf_log_printf (psf, "  encoding    : %d => %s\n", encoding, voc_encoding2str (encoding)) ;
+		
+		
+		psf_log_printf (psf, "  fourbytes   : %X\n", fourbytes) ;
+								
+		psf->sf.channels = channels ;
 
-						psf_log_printf (psf, "  sr   : %d => %dHz\n", (rate_short & 0xFFFF), sample_rate) ;
-						psf_binheader_readf (psf, "j", size) ;
-						} ;
+		psf->dataoffset = offset ;
+		psf->dataend    = psf->filelength - 1 ;
+
+		if (size + 31 > psf->filelength)
+		{	psf_log_printf (psf, "Seems to be a truncated file.\n") ;
+			size = psf->filelength - 31 ;
+			}
+		else if (size + 31 < psf->filelength)
+			psf_log_printf (psf, "Seems to be a multi-segment file.\n") ;
+			
+		switch (encoding)
+		{	case 0 :
+					psf->sf.format = SF_FORMAT_VOC | SF_FORMAT_PCM_U8 ;
+					psf->bytewidth = 1 ;
 					break ;
+									
+			case 4 :
+					psf->sf.format = SF_FORMAT_VOC | SF_FORMAT_PCM_16 ;
+					psf->bytewidth = 2 ;
+					break ;
+									
+			case 6 :
+					psf->sf.format = SF_FORMAT_VOC | SF_FORMAT_ALAW ;
+					psf->bytewidth = 1 ;
+					break ;
+									
+			case 7 :
+					psf->sf.format = SF_FORMAT_VOC | SF_FORMAT_ULAW ;
+					psf->bytewidth = 1 ;
+					break ;
+									
+			default : /* Unknown */
+					return SFE_UNKNOWN_FORMAT ;
+					break ;
+			} ;
 
-			case VOC_TYPE_9 :
-					{	unsigned char bitwidth, channels, byte6 ;
-						int sample_rate, size, bytecount = 0 ;
-						
-						psf_binheader_readf (psf, "t", &size) ;
-						psf_log_printf (psf, " Type 9 : %d\n", size) ;
+		} ;
 
-						bytecount = psf_binheader_readf (psf, "lbbb", &sample_rate, &bitwidth, &channels, &byte6) ;
+	return 0 ;
+} /* voc_read_header */
 
-						psf_log_printf (psf, "  sample rate : %d\n", sample_rate) ;
-						psf_log_printf (psf, "  bit width   : %d\n", bitwidth) ;
-						psf_log_printf (psf, "  channels    : %d\n", channels) ;
+/*====================================================================================
+*/
 
-						psf_binheader_readf (psf, "j", size - bytecount) ;
-						} ;
-					break ;
+static int 
+voc_write_header (SF_PRIVATE *psf)
+{	int		rate_const, subformat ;
+	
+	subformat = psf->sf.format & SF_FORMAT_SUBMASK ;
+	/* Reset the current header length to zero. */
+	psf->header [0] = 0 ;
+	psf->headindex = 0 ;
+	psf_fseek (psf->filedes, 0, SEEK_SET) ;
 
-			default :
-				psf_log_printf (psf, "Unknown type : %d\n", type & 0xFF) ;
-				return SFE_VOC_BAD_MARKER ;
-			} ;
+	/* VOC marker and 0x1A byte. */
+	psf_binheader_writef (psf, "eb1", "Creative Voice File", 19, 0x1A) ;
+	
+	/* Data offset, version and other. */
+	psf_binheader_writef (psf, "e222", 26, 0x0114, 0x111F) ;
+	
+	/*	Use same logic as SOX. 
+	**	If the file is mono 8 bit data, use VOC_SOUND_DATA.
+	**	If the file is mono 16 bit data, use VOC_EXTENED.
+	**	Otherwise use VOC_EXTENED_2.
+	*/
 
-		if (ftell (psf->file) >= psf->filelength)
-			break ;
-		} ;
+	if (subformat == SF_FORMAT_PCM_U8 && psf->sf.channels == 1)
+	{	psf->chars = SF_CHARS_UNSIGNED ;
+	
+		/* samplerate = 1000000 / (256 - rate_const) ; */
+		rate_const = 256 - 1000000 / psf->sf.samplerate ;
 
+		/* First type marker, length, rate_const and compression */
+		psf_binheader_writef (psf, "e1311", VOC_SOUND_DATA, (int) (psf->datalength + 1), rate_const, 0) ;
+		}
+	else if (subformat == SF_FORMAT_PCM_U8 && psf->sf.channels == 2)
+	{	psf->chars = SF_CHARS_UNSIGNED ;
+	
+		/* sample_rate = 128000000 / (65536 - rate_short) ; */
+		rate_const = 65536 - 128000000 / psf->sf.samplerate ;
+	
+		/* First write the VOC_EXTENDED section
+		** 		marker, length, rate_const and compression 
+		*/
+		psf_binheader_writef (psf, "e13211", VOC_EXTENDED, 4, rate_const, 0, 1) ;
 
+		/* samplerate = 1000000 / (256 - rate_const) ; */
+		rate_const = 256 - 1000000 / psf->sf.samplerate ;
 
-	psf->sf.seekable = SF_TRUE ;
+		/*	Now write the VOC_SOUND_DATA section
+		** 		marker, length, rate_const and compression 
+		*/
+		psf_binheader_writef (psf, "e1311", VOC_SOUND_DATA, (int) (psf->datalength + 1), rate_const, 0) ;
+		}
+	else
+	{	int length ;
+	
+		if (psf->sf.channels < 1 || psf->sf.channels > 2)
+			return SFE_CHANNEL_COUNT ;
+	
+		switch (subformat)
+		{	case SF_FORMAT_PCM_U8 :
+					psf->bytewidth = 1 ;
+					length = psf->sf.samples * psf->sf.channels * psf->bytewidth + 12 ;
+					/* Marker, length, sample rate, bitwidth, stereo flag, encoding and fourt zero bytes. */
+					psf_binheader_writef (psf, "e1341124", VOC_EXTENDED_II, length, psf->sf.samplerate, 16, psf->sf.channels, 4, 0) ;
+					break ;
 
-	psf->close = (func_close) voc_close ;
+			case SF_FORMAT_PCM_16 :
+					psf->bytewidth = 2 ;
+					length = psf->sf.samples * psf->sf.channels * psf->bytewidth + 12;
+					/* Marker, length, sample rate, bitwidth, stereo flag, encoding and fourt zero bytes. */
+					psf_binheader_writef (psf, "e1341124", VOC_EXTENDED_II, length, psf->sf.samplerate, 16, psf->sf.channels, 4, 0) ;
+					break ;
 
-	return 0 ;
-} /* voc_open_read */
+			case SF_FORMAT_ALAW :
+					psf->bytewidth = 1 ;
+					length = psf->sf.samples * psf->sf.channels * psf->bytewidth + 12;
+					psf_binheader_writef (psf, "e1341124", VOC_EXTENDED_II, length, psf->sf.samplerate, 8, psf->sf.channels, 6, 0) ;
+					break ;
+				
+			case SF_FORMAT_ULAW :
+					psf->bytewidth = 1 ;
+					length = psf->sf.samples * psf->sf.channels * psf->bytewidth + 12 ;
+					psf_binheader_writef (psf, "e1341124", VOC_EXTENDED_II, length, psf->sf.samplerate, 8, psf->sf.channels, 7, 0) ;
+					break ;
 
-int 	
-voc_open_write	(SF_PRIVATE *psf)
-{	
+			default : return SFE_UNIMPLEMENTED ;
+			} ;
+		} ;
+		
+	psf_fwrite (psf->header, psf->headindex, 1, psf->filedes) ;
+	psf->dataoffset = psf->headindex ;
 
 	return 0 ;
-} /* voc_open_write */
+} /* voc_write_header */
 
-/*------------------------------------------------------------------------------
-*/
-
 static int	
 voc_close	(SF_PRIVATE  *psf)
 {	
-	if (psf->mode == SF_MODE_WRITE)
+	if (psf->mode == SFM_WRITE || psf->mode == SFM_RDWR)
 	{	/*  Now we know for certain the length of the file we can re-write 
 		**	correct values for the FORM, 8SVX and BODY chunks.
 		*/
-                
+		unsigned byte = VOC_TERMINATOR ;
+		
+		
+		psf_fseek (psf->filedes, 0, SEEK_END) ;
+		
+		/* Write terminator */
+		psf_fwrite (&byte, 1, 1, psf->filedes) ;
+		
+		psf->filelength = psf_ftell (psf->filedes) ;
+		psf_fseek (psf->filedes, 0, SEEK_SET) ;
+		
+		psf->datalength = psf->filelength - psf->dataoffset ;
+ 		psf->sf.samples = psf->datalength / (psf->bytewidth * psf->sf.channels) ;
+		
+		voc_write_header (psf) ;
+		} ;
+
+	return 0 ;
+} /* voc_close */
+
+static const 	char* 
+voc_encoding2str (int encoding)
+{
+	switch (encoding)
+	{	case 0 :	return "8 bit unsigned PCM" ;
+		case 4 :	return "16 bit signed PCM" ;
+		case 6 :	return "A-law" ;
+		case 7 :	return "u-law" ;
+		default :	break ;
+		}
+	return "*** Unknown ***" ;
+} /* voc_encoding2str */
+
+/*====================================================================================
+*/
+
+#if 0
+static int 
+voc_multi_init (SF_PRIVATE *psf, VOC_DATA *pvoc)
+{
+	psf->sf.samples = 0 ;
+
+	if (pvoc->bitwidth == 8)
+	{	psf->read_short  = voc_multi_read_uc2s ;
+		psf->read_int    = voc_multi_read_uc2i ;
+		psf->read_float  = voc_multi_read_uc2f ;
+		psf->read_double = voc_multi_read_uc2d ;
+		return 0 ;
 		} ;
+		
+	if (pvoc->bitwidth == 16)
+	{	psf->read_short  = voc_multi_read_les2s ;
+		psf->read_int    = voc_multi_read_les2i ;
+		psf->read_float  = voc_multi_read_les2f ;
+		psf->read_double = voc_multi_read_les2d ;
+		return 0 ;
+		} ;
 
-	if (psf->fdata)
-		free (psf->fdata) ;
-	psf->fdata = NULL ;
+	psf_log_printf (psf, "Error : bitwith != 8 && bitwidth != 16.\n") ;
 	
+	return SFE_UNIMPLEMENTED ;
+} /* voc_multi_read_int */
+
+/*------------------------------------------------------------------------------------
+*/
+
+static int
+voc_multi_read_uc2s  (SF_PRIVATE *psf, short *ptr, int len) 
+{
+
 	return 0 ;
-} /* voc_close */
+} /* voc_multi_read_uc2s */
 
+static int
+voc_multi_read_les2s (SF_PRIVATE *psf, short *ptr, int len) 
+{
 
+	return 0 ;
+} /* voc_multi_read_les2s */
+
+
+static int
+voc_multi_read_uc2i  (SF_PRIVATE *psf, int *ptr, int len) 
+{
+
+	return 0 ;
+} /* voc_multi_read_uc2i */
+
+static int
+voc_multi_read_les2i (SF_PRIVATE *psf, int *ptr, int len) 
+{
+
+	return 0 ;
+} /* voc_multi_read_les2i */
+
+
+static int
+voc_multi_read_uc2f  (SF_PRIVATE *psf, float *ptr, int len) 
+{
+
+	return 0 ;
+} /* voc_multi_read_uc2f */
+
+static int
+voc_multi_read_les2f (SF_PRIVATE *psf, float *ptr, int len) 
+{
+
+	return 0 ;
+} /* voc_multi_read_les2f */
+
+
+static int
+voc_multi_read_uc2d  (SF_PRIVATE *psf, double *ptr, int len) 
+{
+
+	return 0 ;
+} /* voc_multi_read_uc2d */
+
+static int
+voc_multi_read_les2d (SF_PRIVATE *psf, double *ptr, int len) 
+{
+
+	return 0 ;
+} /* voc_multi_read_les2d */
+
+#endif
+
 /*------------------------------------------------------------------------------------
 
 Creative Voice (VOC) file format
@@ -374,3 +731,125 @@
 
 -------------------------------------------------------------------------------------*/
 
+/*=====================================================================================
+**=====================================================================================
+**=====================================================================================
+**=====================================================================================
+*/
+
+/*------------------------------------------------------------------------
+The following is taken from the Audio File Formats FAQ dated 2-Jan-1995
+and submitted by Guido van Rossum <[email protected]>.
+--------------------------------------------------------------------------
+Creative Voice (VOC) file format
+--------------------------------
+
+From: [email protected]
+
+(byte numbers are hex!)
+
+    HEADER (bytes 00-19)
+    Series of DATA BLOCKS (bytes 1A+) [Must end w/ Terminator Block]
+
+- ---------------------------------------------------------------
+
+HEADER:
+-------
+     byte #     Description
+     ------     ------------------------------------------
+     00-12      "Creative Voice File"
+     13         1A (eof to abort printing of file)
+     14-15      Offset of first datablock in .voc file (std 1A 00
+                in Intel Notation)
+     16-17      Version number (minor,major) (VOC-HDR puts 0A 01)
+     18-19      2's Comp of Ver. # + 1234h (VOC-HDR puts 29 11)
+
+- ---------------------------------------------------------------
+
+DATA BLOCK:
+-----------
+
+   Data Block:  TYPE(1-byte), SIZE(3-bytes), INFO(0+ bytes)
+   NOTE: Terminator Block is an exception -- it has only the TYPE byte.
+
+      TYPE   Description     Size (3-byte int)   Info
+      ----   -----------     -----------------   -----------------------
+      00     Terminator      (NONE)              (NONE)
+      01     Sound data      2+length of data    *
+      02     Sound continue  length of data      Voice Data
+      03     Silence         3                   **
+      04     Marker          2                   Marker# (2 bytes)
+      05     ASCII           length of string    null terminated string
+      06     Repeat          2                   Count# (2 bytes)
+      07     End repeat      0                   (NONE)
+      08     Extended        4                   ***
+
+      *Sound Info Format:       **Silence Info Format:
+       ---------------------      ----------------------------
+       00   Sample Rate           00-01  Length of silence - 1
+       01   Compression Type      02     Sample Rate
+       02+  Voice Data
+
+    ***Extended Info Format:
+       ---------------------
+       00-01  Time Constant: Mono: 65536 - (256000000/sample_rate)
+                             Stereo: 65536 - (25600000/(2*sample_rate))
+       02     Pack
+       03     Mode: 0 = mono
+                    1 = stereo
+
+
+  Marker#           -- Driver keeps the most recent marker in a status byte
+  Count#            -- Number of repetitions + 1
+                         Count# may be 1 to FFFE for 0 - FFFD repetitions
+                         or FFFF for endless repetitions
+  Sample Rate       -- SR byte = 256-(1000000/sample_rate)
+  Length of silence -- in units of sampling cycle
+  Compression Type  -- of voice data
+                         8-bits    = 0
+                         4-bits    = 1
+                         2.6-bits  = 2
+                         2-bits    = 3
+                         Multi DAC = 3+(# of channels) [interesting--
+                                       this isn't in the developer's manual]
+
+Detailed description of new data blocks (VOC files version 1.20 and above):
+
+        (Source is fax from Barry Boone at Creative Labs, 405/742-6622)
+
+BLOCK 8 - digitized sound attribute extension, must preceed block 1.
+          Used to define stereo, 8 bit audio
+        BYTE bBlockID;       // = 8
+        BYTE nBlockLen[3];   // 3 byte length
+        WORD wTimeConstant;  // time constant = same as block 1
+        BYTE bPackMethod;    // same as in block 1
+        BYTE bVoiceMode;     // 0-mono, 1-stereo
+
+        Data is stored left, right
+
+BLOCK 9 - data block that supersedes blocks 1 and 8.  
+          Used for stereo, 16 bit.
+
+        BYTE bBlockID;          // = 9
+        BYTE nBlockLen[3];      // length 12 plus length of sound
+        DWORD dwSamplesPerSec;  // samples per second, not time const.
+        BYTE bBitsPerSample;    // e.g., 8 or 16
+        BYTE bChannels;         // 1 for mono, 2 for stereo
+        WORD wFormat;           // see below
+        BYTE reserved[4];       // pad to make block w/o data 
+                                // have a size of 16 bytes
+
+        Valid values of wFormat are:
+
+                0x0000  8-bit unsigned PCM
+                0x0001  Creative 8-bit to 4-bit ADPCM
+                0x0002  Creative 8-bit to 3-bit ADPCM
+                0x0003  Creative 8-bit to 2-bit ADPCM
+                0x0004  16-bit signed PCM
+                0x0006  CCITT a-Law
+                0x0007  CCITT u-Law
+                0x02000 Creative 16-bit to 4-bit ADPCM
+
+        Data is stored left, right
+
+------------------------------------------------------------------------*/
--- /dev/null
+++ b/common/libsndfile/src/w64.c
@@ -1,0 +1,549 @@
+/*
+** Copyright (C) 1999-2002 Erik de Castro Lopo <[email protected]>
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+** 
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+** 
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include	<stdio.h>
+#include	<unistd.h>
+#include	<string.h>
+#include	<ctype.h>
+#include	<time.h>
+
+#include	"sndfile.h"
+#include	"config.h"
+#include	"sfendian.h"
+#include	"common.h"
+#include	"wav_w64.h"
+
+/*------------------------------------------------------------------------------
+** W64 files use 16 byte markers as opposed to the four byte marker of
+** WAV files. 
+** For comparison purposes, an integer is required, so make an integer
+** hash for the 16 bytes using MAKE_HASH16 macro, but also create a 16
+** byte array containing the complete 16 bytes required when writing the
+** header.
+*/
+
+#define MAKE_HASH16(x0,x1,x2,x3,x4,x5,x6,x7,x8,x9,xa,xb,xc,xd,xe,xf)	\
+				( (x0)      ^((x1)<< 1)^((x2)<< 2)^((x3)<< 3)^	\
+				  ((x4)<< 4)^((x5)<< 5)^((x6)<< 6)^((x7)<< 7)^	\
+				  ((x8)<< 8)^((x9)<< 9)^((xa)<<10)^((xb)<<11)^	\
+				  ((xc)<<12)^((xd)<<13)^((xe)<<14)^((xf)<<15)	)
+
+#define MAKE_MARKER16(name,x0,x1,x2,x3,x4,x5,x6,x7,x8,x9,xa,xb,xc,xd,xe,xf)	\
+			static unsigned char name [16] = { (x0),(x1),(x2),(x3),(x4),(x5), \
+				(x6),(x7),(x8),(x9),(xa),(xb),(xc),(xd),(xe),(xf) }
+
+#define	riff_HASH16 MAKE_HASH16 ('r', 'i', 'f', 'f', 0x2E, 0x91, 0xCF, 0x11, 0xA5, \
+								0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00)
+
+#define	wave_HASH16 	MAKE_HASH16 ('w', 'a', 'v', 'e', 0xF3, 0xAC, 0xD3, 0x11, \
+								0x8C, 0xD1, 0x00, 0xC0, 0x4F, 0x8E, 0xDB, 0x8A)
+								
+#define	fmt_HASH16 		MAKE_HASH16 ('f', 'm', 't', ' ', 0xF3, 0xAC, 0xD3, 0x11, \
+								0x8C, 0xD1, 0x00, 0xC0, 0x4F, 0x8E, 0xDB, 0x8A)
+
+#define	fact_HASH16 	MAKE_HASH16 ('f', 'a', 'c', 't', 0xF3, 0xAC, 0xD3, 0x11, \
+								0x8C, 0xD1, 0x00, 0xC0, 0x4F, 0x8E, 0xDB, 0x8A) 
+
+#define	data_HASH16 	MAKE_HASH16 ('d', 'a', 't', 'a', 0xF3, 0xAC, 0xD3, 0x11, \
+								0x8C, 0xD1, 0x00, 0xC0, 0x4F, 0x8E, 0xDB, 0x8A) 
+
+
+MAKE_MARKER16 (riff_MARKER16, 'r', 'i', 'f', 'f', 0x2E, 0x91, 0xCF, 0x11, 
+								0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00) ;
+
+
+MAKE_MARKER16 (wave_MARKER16, 'w', 'a', 'v', 'e', 0xF3, 0xAC, 0xD3, 0x11, 
+								0x8C, 0xD1, 0x00, 0xC0, 0x4F, 0x8E, 0xDB, 0x8A) ;
+								
+MAKE_MARKER16 (fmt_MARKER16, 'f', 'm', 't', ' ', 0xF3, 0xAC, 0xD3, 0x11, 
+								0x8C, 0xD1, 0x00, 0xC0, 0x4F, 0x8E, 0xDB, 0x8A) ;
+
+MAKE_MARKER16 (fact_MARKER16, 'f', 'a', 'c', 't', 0xF3, 0xAC, 0xD3, 0x11, 
+								0x8C, 0xD1, 0x00, 0xC0, 0x4F, 0x8E, 0xDB, 0x8A) ;
+
+MAKE_MARKER16 (data_MARKER16, 'd', 'a', 't', 'a', 0xF3, 0xAC, 0xD3, 0x11, 
+								0x8C, 0xD1, 0x00, 0xC0, 0x4F, 0x8E, 0xDB, 0x8A) ;
+
+enum 
+{	HAVE_riff	= 0x01,
+	HAVE_wave	= 0x02,
+	HAVE_fmt	= 0x04,
+	HAVE_fact	= 0x08,
+	HAVE_data	= 0x20
+} ;
+
+/*------------------------------------------------------------------------------
+ * Private static functions.
+ */
+ 
+static int	w64_read_header	(SF_PRIVATE *psf, int *blockalign, int *samplesperblock) ;
+static int	w64_write_header (SF_PRIVATE *psf) ;
+static int	w64_close	(SF_PRIVATE  *psf) ;
+
+/*------------------------------------------------------------------------------
+** Public function.
+*/
+
+int
+w64_open	(SF_PRIVATE *psf)
+{	int	subformat, error, blockalign = 0, samplesperblock = 0 ;
+	
+	if (psf->mode == SFM_READ || (psf->mode == SFM_RDWR &&psf->filelength > 0))
+	{	if ((error = w64_read_header (psf, &blockalign, &samplesperblock)))
+			return error ;
+		};
+		
+	if ((psf->sf.format & SF_FORMAT_TYPEMASK) != SF_FORMAT_W64)
+		return	SFE_BAD_OPEN_FORMAT ;
+		
+	subformat = psf->sf.format & SF_FORMAT_SUBMASK ;
+
+	if (psf->mode == SFM_WRITE || psf->mode == SFM_RDWR)
+	{	psf->endian      = SF_ENDIAN_LITTLE ;		/* All W64 files are little endian. */
+	
+		psf->blockwidth  = psf->bytewidth * psf->sf.channels ;
+
+		if (subformat == SF_FORMAT_IMA_ADPCM || subformat == SF_FORMAT_MS_ADPCM)
+		{	blockalign = wav_w64_srate2blocksize (psf->sf.samplerate * psf->sf.channels) ;
+			samplesperblock = -1 ;
+
+			/* FIXME : This block must go */
+			psf->filelength = SF_MAX_UINT ;
+			psf->datalength = SF_MAX_UINT ;
+			if (psf->sf.samples <= 0)
+				psf->sf.samples = (psf->blockwidth) ? SF_MAX_COUNT / psf->blockwidth : SF_MAX_COUNT ; 
+			/* EMXIF : This block must go */
+			} ;
+
+		if ((error = w64_write_header (psf)))
+			return error ;
+
+		psf->write_header = w64_write_header ;
+		} ;
+
+	psf->close = w64_close ;
+
+	switch (subformat)
+	{	case SF_FORMAT_PCM_U8 :
+					psf->chars = SF_CHARS_UNSIGNED ;
+					error = pcm_init (psf) ;
+					break ;
+
+		case SF_FORMAT_PCM_16 : 
+		case SF_FORMAT_PCM_24 : 
+		case SF_FORMAT_PCM_32 : 
+					error = pcm_init (psf) ;
+					break ;
+
+		case SF_FORMAT_FLOAT : 
+					error = float32_init (psf) ;
+					break ;
+
+		case SF_FORMAT_DOUBLE : 
+					error = double64_init (psf) ;
+					break ;
+
+		case SF_FORMAT_ULAW : 
+					error = ulaw_init (psf) ;
+					break ;
+					
+		case SF_FORMAT_ALAW : 
+					error = alaw_init (psf) ;
+					break ;
+
+		case SF_FORMAT_IMA_ADPCM : 
+					error = wav_w64_ima_init (psf, blockalign, samplesperblock) ;
+					break ;
+
+		case SF_FORMAT_MS_ADPCM : 
+					error = wav_w64_msadpcm_init (psf, blockalign, samplesperblock) ;
+					break ;
+
+		case SF_FORMAT_GSM610 : 
+					error = gsm610_init (psf) ;
+					break ;
+
+		default : 	return SFE_UNIMPLEMENTED ;
+		} ;
+
+	return error ;
+} /* w64_open */
+
+/*=========================================================================
+** Private functions.
+*/
+
+static int
+w64_read_header	(SF_PRIVATE *psf, int *blockalign, int *samplesperblock)
+{	WAV_FMT wav_fmt ;
+	int		dword = 0, marker, format = 0 ;
+	sf_count_t	chunk_size, bytesread ;
+	int		parsestage = 0, error ;
+	/*-char	*cptr ;	-*/
+	
+	/* Set position to start of file to begin reading header. */
+	psf_binheader_readf (psf, "p", 0) ;	
+		
+	while (1)
+	{	/* Read the 4 byte marker and jump 12 bytes. */
+		bytesread = psf_binheader_readf (psf, "h", &marker) ;
+		chunk_size = 0 ;
+		
+		switch (marker)
+		{	case riff_HASH16 :
+					if (parsestage)
+						return SFE_W64_NO_RIFF ;
+
+					psf_binheader_readf (psf, "e8", &chunk_size) ;
+					
+					if (psf->filelength  < chunk_size)
+						psf_log_printf (psf, "riff : %d (should be %d)\n", chunk_size, psf->filelength) ;
+					else
+						psf_log_printf (psf, "riff : %d\n", chunk_size) ;
+
+					parsestage |= HAVE_riff ;
+					break ;
+					
+			case wave_HASH16 :
+					if ((parsestage & HAVE_riff) != HAVE_riff)
+						return SFE_W64_NO_WAVE ;
+					psf_log_printf (psf, "wave\n") ;
+					parsestage |= HAVE_wave ;
+					break ;
+
+			case fmt_HASH16 :
+					if ((parsestage & (HAVE_riff | HAVE_wave)) != (HAVE_riff | HAVE_wave))
+						return SFE_W64_NO_FMT ;
+						
+					bytesread += psf_binheader_readf (psf, "e8", &chunk_size) ;
+					psf_log_printf (psf, "   fmt : %d (0x%X)\n", chunk_size, chunk_size) ;
+						
+					/* size of 16 byte marker and 8 byte chunk_size value. */
+					chunk_size -= 24 ;
+
+					if ((error = wav_w64_read_fmt_chunk (psf, &wav_fmt, chunk_size)))
+						return error ;
+						
+					if (chunk_size % 8)
+						psf_binheader_readf (psf, "j", 8 - (chunk_size % 8)) ;
+						
+					format     = wav_fmt.format ;
+					parsestage |= HAVE_fmt ;
+					break ;
+
+			case fact_HASH16:
+					{	sf_count_t samples ;
+					
+						psf_binheader_readf (psf, "e88", &chunk_size, &samples) ;
+						psf_log_printf (psf, "   fact : 0x%X\n"
+											 "     samples : %d\n", 
+										chunk_size, samples) ;
+						} ;
+					break ;
+
+					
+			case data_HASH16 :
+					if ((parsestage & (HAVE_riff | HAVE_wave | HAVE_fmt)) != (HAVE_riff | HAVE_wave | HAVE_fmt))
+						return SFE_W64_NO_DATA ;
+					
+					psf_binheader_readf (psf, "e8", &chunk_size) ;
+
+					psf->dataoffset = psf_ftell (psf->filedes) ;
+					
+					psf->datalength = chunk_size - 24 ;
+
+					if (chunk_size % 8)
+						chunk_size += 8 - (chunk_size % 8) ;
+
+					psf_log_printf (psf, "data : %d (0x%X)\n", chunk_size, psf->datalength) ;
+
+					parsestage |= HAVE_data ;
+
+					if (! psf->sf.seekable)
+						break ;
+					
+					/* Seek past data and continue reading header. */
+					psf_fseek (psf->filedes, chunk_size, SEEK_CUR) ;
+					break ;
+
+			default : 
+					if (psf_ftell (psf->filedes) & 0x0F)
+					{	psf_log_printf (psf, "  Unknown chunk marker at position %d. Resynching.\n", dword - 4) ;
+						psf_binheader_readf (psf, "j", -3) ;
+						break ;
+						} ;
+					psf_log_printf (psf, "*** Unknown chunk marker : %X. Exiting parser.\n", marker) ;
+					break ;
+			} ;	/* switch (dword) */
+
+		if (! psf->sf.seekable && (parsestage & HAVE_data))
+			break ;
+
+		if (psf_ferror (psf->filedes))
+		{	psf_log_printf (psf, "*** Error on file handle. ***\n", marker) ;
+			psf_fclearerr (psf->filedes) ;
+			break ;
+			} ;
+
+		if (psf_ftell (psf->filedes) >= (int) (psf->filelength - (2 * sizeof (dword))))
+			break ;
+
+		if (psf->logindex >= sizeof (psf->logbuffer) - 2)
+			return SFE_LOG_OVERRUN ;
+		} ; /* while (1) */
+		
+	if (! psf->dataoffset)
+		return SFE_W64_NO_DATA ;
+
+	psf->endian = SF_ENDIAN_LITTLE ;		/* All WAV files are little endian. */
+	
+	psf_fseek (psf->filedes, psf->dataoffset, SEEK_SET) ;
+	
+	psf->close = w64_close ;
+
+	if (psf->blockwidth)
+	{	if (psf->filelength - psf->dataoffset < psf->datalength)
+			psf->sf.samples = (psf->filelength - psf->dataoffset) / psf->blockwidth ;
+		else
+			psf->sf.samples = psf->datalength / psf->blockwidth ;
+		} ;
+
+	switch (format)
+	{	case WAVE_FORMAT_PCM :
+		case WAVE_FORMAT_EXTENSIBLE :
+					psf->sf.format = SF_FORMAT_W64 | u_bitwidth_to_subformat (psf->bytewidth * 8) ;
+					break ;
+					
+		case WAVE_FORMAT_MULAW :
+					psf->sf.format = (SF_FORMAT_W64 | SF_FORMAT_ULAW) ;
+					break ;
+	
+		case WAVE_FORMAT_ALAW :
+					psf->sf.format = (SF_FORMAT_W64 | SF_FORMAT_ALAW) ;
+					break ;
+		
+		case WAVE_FORMAT_MS_ADPCM : 
+					psf->sf.format = (SF_FORMAT_W64 | SF_FORMAT_MS_ADPCM) ;
+					*blockalign = wav_fmt.msadpcm.blockalign ;
+					*samplesperblock = wav_fmt.msadpcm.samplesperblock ;
+					break ;
+
+		case WAVE_FORMAT_IMA_ADPCM :
+					psf->sf.format = (SF_FORMAT_W64 | SF_FORMAT_IMA_ADPCM) ;
+					*blockalign = wav_fmt.ima.blockalign ;
+					*samplesperblock = wav_fmt.ima.samplesperblock ;
+					break ;
+		
+		case WAVE_FORMAT_GSM610 :
+					psf->sf.format = (SF_FORMAT_W64 | SF_FORMAT_GSM610) ;
+					break ;
+		
+		case WAVE_FORMAT_IEEE_FLOAT :
+					psf->sf.format  = SF_FORMAT_W64 ;
+					psf->sf.format |= (psf->bytewidth == 8) ? SF_FORMAT_DOUBLE : SF_FORMAT_FLOAT ;
+					break ;
+		
+		default : return SFE_UNIMPLEMENTED ;
+		} ;
+
+	return 0 ;
+} /* w64_read_header */
+
+static int 
+w64_write_header (SF_PRIVATE *psf)
+{	sf_count_t 	fmt_size ;
+	int 	subformat, add_fact_chunk = SF_FALSE ;
+	
+	/* Reset the current header length to zero. */
+	psf->header [0] = 0 ;
+	psf->headindex = 0 ;
+	psf_fseek (psf->filedes, 0, SEEK_SET) ;
+
+	/* riff marker, length, wave and 'fmt ' markers. */		
+	psf_binheader_writef (psf, "eh8hh", riff_MARKER16, psf->filelength - 8, wave_MARKER16, fmt_MARKER16) ;
+
+	subformat = psf->sf.format & SF_FORMAT_SUBMASK ;
+
+	switch (subformat)
+	{	case	SF_FORMAT_PCM_U8 : 
+		case	SF_FORMAT_PCM_16 : 
+		case	SF_FORMAT_PCM_24 : 
+		case	SF_FORMAT_PCM_32 : 
+					fmt_size = 24 + 2 + 2 + 4 + 4 + 2 + 2 ;
+
+					/* fmt : format, channels, samplerate */
+					psf_binheader_writef (psf, "e8224", fmt_size, WAVE_FORMAT_PCM, psf->sf.channels, psf->sf.samplerate) ;
+					/*  fmt : bytespersec */
+					psf_binheader_writef (psf, "e4", psf->sf.samplerate * psf->bytewidth * psf->sf.channels) ;
+					/*  fmt : blockalign, bitwidth */
+					psf_binheader_writef (psf, "e22", psf->bytewidth * psf->sf.channels, psf->bytewidth * 8) ;
+					break ;
+
+		case SF_FORMAT_FLOAT : 
+		case SF_FORMAT_DOUBLE : 
+					fmt_size = 24 + 2 + 2 + 4 + 4 + 2 + 2 ;
+
+					/* fmt : format, channels, samplerate */
+					psf_binheader_writef (psf, "e8224", fmt_size, WAVE_FORMAT_IEEE_FLOAT, psf->sf.channels, psf->sf.samplerate) ;
+					/*  fmt : bytespersec */
+					psf_binheader_writef (psf, "e4", psf->sf.samplerate * psf->bytewidth * psf->sf.channels) ;
+					/*  fmt : blockalign, bitwidth */
+					psf_binheader_writef (psf, "e22", psf->bytewidth * psf->sf.channels, psf->bytewidth * 8) ;
+
+					add_fact_chunk = SF_TRUE ;
+					break ;
+
+		case SF_FORMAT_ULAW : 
+					fmt_size = 24 + 2 + 2 + 4 + 4 + 2 + 2 ;
+					
+					/* fmt : format, channels, samplerate */
+					psf_binheader_writef (psf, "e8224", fmt_size, WAVE_FORMAT_MULAW, psf->sf.channels, psf->sf.samplerate) ;
+					/*  fmt : bytespersec */
+					psf_binheader_writef (psf, "e4", psf->sf.samplerate * psf->bytewidth * psf->sf.channels) ;
+					/*  fmt : blockalign, bitwidth */
+					psf_binheader_writef (psf, "e22", psf->bytewidth * psf->sf.channels, 8) ;
+
+					add_fact_chunk = SF_TRUE ;
+					break ;
+					
+		case SF_FORMAT_ALAW : 
+					fmt_size = 24 + 2 + 2 + 4 + 4 + 2 + 2 ;
+
+					/* fmt : format, channels, samplerate */
+					psf_binheader_writef (psf, "e8224", fmt_size, WAVE_FORMAT_ALAW, psf->sf.channels, psf->sf.samplerate) ;
+					/*  fmt : bytespersec */
+					psf_binheader_writef (psf, "e4", psf->sf.samplerate * psf->bytewidth * psf->sf.channels) ;
+					/*  fmt : blockalign, bitwidth */
+					psf_binheader_writef (psf, "e22", psf->bytewidth * psf->sf.channels, 8) ;
+
+					add_fact_chunk = SF_TRUE ;
+					break ;
+
+		case SF_FORMAT_IMA_ADPCM : 
+					{	int		blockalign, samplesperblock, bytespersec ;
+
+						blockalign      = wav_w64_srate2blocksize (psf->sf.samplerate * psf->sf.channels) ;	
+						samplesperblock = 2 * (blockalign - 4 * psf->sf.channels) / psf->sf.channels + 1 ;
+						bytespersec     = (psf->sf.samplerate * blockalign) / samplesperblock ;
+
+						/* fmt chunk. */
+						fmt_size = 24 + 2 + 2 + 4 + 4 + 2 + 2 + 2 + 2 ;
+
+						/* fmt : size, WAV format type, channels. */
+						psf_binheader_writef (psf, "e822", fmt_size, WAVE_FORMAT_IMA_ADPCM, psf->sf.channels) ;
+
+						/* fmt : samplerate, bytespersec. */
+						psf_binheader_writef (psf, "e44", psf->sf.samplerate, bytespersec) ;
+
+						/* fmt : blockalign, bitwidth, extrabytes, samplesperblock. */
+						psf_binheader_writef (psf, "e2222", blockalign, 4, 2, samplesperblock) ;
+						} ;
+
+					add_fact_chunk = SF_TRUE ;
+					break ;
+
+		case SF_FORMAT_MS_ADPCM : 
+					{	int  blockalign, samplesperblock, bytespersec, extrabytes ;
+
+						blockalign      = wav_w64_srate2blocksize (psf->sf.samplerate * psf->sf.channels) ;	
+						samplesperblock = 2 + 2 * (blockalign - 7 * psf->sf.channels) / psf->sf.channels ;
+						bytespersec     = (psf->sf.samplerate * blockalign) / samplesperblock ;
+	
+						/* fmt chunk. */
+						extrabytes = 2 + 2 + MSADPCM_ADAPT_COEFF_COUNT * (2 + 2) ;
+						fmt_size   = 24 + 2 + 2 + 4 + 4 + 2 + 2 + 2 + extrabytes ;
+	
+						/* fmt : size, W64 format type, channels. */
+						psf_binheader_writef (psf, "e822", fmt_size, WAVE_FORMAT_MS_ADPCM, psf->sf.channels) ;
+
+						/* fmt : samplerate, bytespersec. */
+						psf_binheader_writef (psf, "e44", psf->sf.samplerate, bytespersec) ;
+
+						/* fmt : blockalign, bitwidth, extrabytes, samplesperblock. */
+						psf_binheader_writef (psf, "e22222", blockalign, 4, extrabytes, samplesperblock, 7) ;
+	
+						msadpcm_write_adapt_coeffs (psf) ;	
+						} ;
+
+					add_fact_chunk = SF_TRUE ;
+					break ;
+
+		case SF_FORMAT_GSM610 : 
+					{	int  bytespersec ;
+
+						bytespersec     = (psf->sf.samplerate * WAV_W64_GSM610_BLOCKSIZE) / WAV_W64_GSM610_SAMPLES ;
+
+						/* fmt chunk. */
+						fmt_size = 24 + 2 + 2 + 4 + 4 + 2 + 2 + 2 + 2 ;
+	
+						/* fmt : size, WAV format type, channels. */
+						psf_binheader_writef (psf, "e822", fmt_size, WAVE_FORMAT_GSM610, psf->sf.channels) ;
+
+						/* fmt : samplerate, bytespersec. */
+						psf_binheader_writef (psf, "e44", psf->sf.samplerate, bytespersec) ;
+
+						/* fmt : blockalign, bitwidth, extrabytes, samplesperblock. */
+						psf_binheader_writef (psf, "e2222", WAV_W64_GSM610_BLOCKSIZE, 0, 2, WAV_W64_GSM610_SAMPLES) ;
+						} ;
+
+					add_fact_chunk = SF_TRUE ;
+					break ;
+
+		default : 	return SFE_UNIMPLEMENTED ;
+		} ;
+
+	/* Pad to 8 bytes with zeros. */
+	if (fmt_size % 8)
+		psf_binheader_writef (psf, "z", 8 - (fmt_size % 8)) ;
+
+	if (add_fact_chunk)
+		psf_binheader_writef (psf, "eh88", fact_MARKER16, 16 + 8 + 8, psf->sf.samples) ;
+
+	psf_binheader_writef (psf, "eh8", data_MARKER16, psf->datalength + 24) ;
+	psf_fwrite (psf->header, psf->headindex, 1, psf->filedes) ;
+
+	psf->dataoffset = psf->headindex ;
+
+	return 0 ;
+} /* w64_write_header */
+
+static int	
+w64_close	(SF_PRIVATE  *psf)
+{	
+	if (psf->mode == SFM_WRITE || psf->mode == SFM_RDWR)
+	{	/*  Now we know for certain the length of the file we can
+		 *  re-write correct values for the riff and data chunks.
+		 */
+
+		psf_fseek (psf->filedes, 0, SEEK_END) ;
+		psf->dataend = psf_ftell (psf->filedes) ;
+
+		psf_fseek (psf->filedes, 0, SEEK_END) ;
+		psf->filelength = psf_ftell (psf->filedes) ;
+		psf_fseek (psf->filedes, 0, SEEK_SET) ;
+		
+		psf->datalength = psf->filelength - psf->dataoffset - (psf->filelength - psf->dataend) ;
+ 		psf->sf.samples = psf->datalength / (psf->bytewidth * psf->sf.channels) ;
+
+		w64_write_header (psf) ;
+		} ;
+
+	return 0 ;
+} /* w64_close */
+
+
--- a/common/libsndfile/src/wav.c
+++ b/common/libsndfile/src/wav.c
@@ -1,5 +1,5 @@
 /*
-** Copyright (C) 1999-2001 Erik de Castro Lopo <[email protected]>
+** Copyright (C) 1999-2002 Erik de Castro Lopo <[email protected]>
 **  
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published by
@@ -27,77 +27,9 @@
 #include	"config.h"
 #include	"sfendian.h"
 #include	"common.h"
-#include	"wav.h"
+#include	"wav_w64.h"
 
 /*------------------------------------------------------------------------------
-** List of known WAV format tags
-*/
-
-enum
-{	
-	WAVE_FORMAT_UNKNOWN				= 0x0000,		/* Microsoft Corporation */
-	WAVE_FORMAT_PCM     		    = 0x0001, 		/* Microsoft PCM format */
-
-	WAVE_FORMAT_MS_ADPCM			= 0x0002,		/* Microsoft ADPCM */
-	WAVE_FORMAT_IEEE_FLOAT			= 0x0003,		/* Micrososft 32 bit float format */
-	
-	WAVE_FORMAT_IBM_CVSD			= 0x0005,		/* IBM Corporation */
-	WAVE_FORMAT_ALAW				= 0x0006,		/* Microsoft Corporation */
-	WAVE_FORMAT_MULAW				= 0x0007,		/* Microsoft Corporation */
-	WAVE_FORMAT_OKI_ADPCM			= 0x0010,		/* OKI */
-	WAVE_FORMAT_IMA_ADPCM			= 0x0011,		/* Intel Corporation */
-	WAVE_FORMAT_MEDIASPACE_ADPCM	= 0x0012,		/* Videologic */
-	WAVE_FORMAT_SIERRA_ADPCM		= 0x0013,		/* Sierra Semiconductor Corp */
-	WAVE_FORMAT_G723_ADPCM			= 0x0014,		/* Antex Electronics Corporation */
-	WAVE_FORMAT_DIGISTD				= 0x0015,		/* DSP Solutions, Inc. */
-	WAVE_FORMAT_DIGIFIX				= 0x0016,		/* DSP Solutions, Inc. */
-	WAVE_FORMAT_DIALOGIC_OKI_ADPCM	= 0x0017,		/*  Dialogic Corporation  */
-	WAVE_FORMAT_MEDIAVISION_ADPCM	= 0x0018,		/*  Media Vision, Inc. */
-
-	WAVE_FORMAT_YAMAHA_ADPCM		= 0x0020,		/* Yamaha Corporation of America */
-	WAVE_FORMAT_SONARC				= 0x0021,		/* Speech Compression */
-	WAVE_FORMAT_DSPGROUP_TRUESPEECH = 0x0022,		/* DSP Group, Inc */
-	WAVE_FORMAT_ECHOSC1				= 0x0023,		/* Echo Speech Corporation */
-	WAVE_FORMAT_AUDIOFILE_AF18  	= 0x0024,		/* Audiofile, Inc. */
-	WAVE_FORMAT_APTX				= 0x0025,		/* Audio Processing Technology */
-	WAVE_FORMAT_AUDIOFILE_AF10  	= 0x0026,		/* Audiofile, Inc. */
-
-	WAVE_FORMAT_DOLBY_AC2			= 0x0030,		/* Dolby Laboratories */
-	WAVE_FORMAT_GSM610				= 0x0031,		/* Microsoft Corporation */
-	WAVE_FORMAT_MSNAUDIO			= 0x0032,		/* Microsoft Corporation */
-	WAVE_FORMAT_ANTEX_ADPCME		= 0x0033, 		/* Antex Electronics Corporation */
-	WAVE_FORMAT_CONTROL_RES_VQLPC	= 0x0034,		/* Control Resources Limited */
-	WAVE_FORMAT_DIGIREAL			= 0x0035,		/* DSP Solutions, Inc. */
-	WAVE_FORMAT_DIGIADPCM			= 0x0036,		/* DSP Solutions, Inc. */
-	WAVE_FORMAT_CONTROL_RES_CR10	= 0x0037,		/* Control Resources Limited */
-	WAVE_FORMAT_NMS_VBXADPCM		= 0x0038,		/* Natural MicroSystems */
-	WAVE_FORMAT_ROCKWELL_ADPCM		= 0x003B,		/* Rockwell International */
-	WAVE_FORMAT_ROCKWELL_DIGITALK	= 0x003C, 		/* Rockwell International */
-
-	WAVE_FORMAT_G721_ADPCM			= 0x0040,		/* Antex Electronics Corporation */
-	WAVE_FORMAT_MPEG				= 0x0050,		/* Microsoft Corporation */
-
-	WAVE_FORMAT_MPEGLAYER3			= 0x0055,		/* MPEG 3 Layer 1 */
-
-	IBM_FORMAT_MULAW				= 0x0101,		/* IBM mu-law format */
-	IBM_FORMAT_ALAW					= 0x0102,		/* IBM a-law format */
-	IBM_FORMAT_ADPCM				= 0x0103,		/* IBM AVC Adaptive Differential PCM format */
-
-	WAVE_FORMAT_CREATIVE_ADPCM		= 0x0200,		/* Creative Labs, Inc */
-
-	WAVE_FORMAT_FM_TOWNS_SND		= 0x0300,		/* Fujitsu Corp. */
-	WAVE_FORMAT_OLIGSM				= 0x1000,		/* Ing C. Olivetti & C., S.p.A. */
-	WAVE_FORMAT_OLIADPCM			= 0x1001,		/* Ing C. Olivetti & C., S.p.A. */
-	WAVE_FORMAT_OLICELP				= 0x1002,		/* Ing C. Olivetti & C., S.p.A. */
-	WAVE_FORMAT_OLISBC				= 0x1003,		/* Ing C. Olivetti & C., S.p.A. */
-	WAVE_FORMAT_OLIOPR				= 0x1004,		/* Ing C. Olivetti & C., S.p.A. */
-
-	WAVE_FORMAT_EXTENSIBLE			= 0xFFFE
-} ;
-
-#define	FACT_CHUNK_SIZE	sizeof (int)
-
-/*------------------------------------------------------------------------------
  * Macros to handle big/little endian issues.
  */
 
@@ -116,6 +48,7 @@
 #define plst_MARKER	(MAKE_MARKER ('p', 'l', 's', 't')) 
 #define adtl_MARKER	(MAKE_MARKER ('a', 'd', 't', 'l')) 
 #define labl_MARKER	(MAKE_MARKER ('l', 'a', 'b', 'l')) 
+#define ltxt_MARKER	(MAKE_MARKER ('l', 't', 'x', 't')) 
 #define note_MARKER	(MAKE_MARKER ('n', 'o', 't', 'e')) 
 #define smpl_MARKER	(MAKE_MARKER ('s', 'm', 'p', 'l')) 
 #define bext_MARKER	(MAKE_MARKER ('b', 'e', 'x', 't')) 
@@ -124,6 +57,7 @@
 #define acid_MARKER	(MAKE_MARKER ('a', 'c', 'i', 'd')) 
 #define PAD_MARKER	(MAKE_MARKER ('P', 'A', 'D', ' ')) 
 #define adtl_MARKER	(MAKE_MARKER ('a', 'd', 't', 'l')) 
+#define afsp_MARKER	(MAKE_MARKER ('a', 'f', 's', 'p'))
 
 #define ISFT_MARKER	(MAKE_MARKER ('I', 'S', 'F', 'T')) 
 #define ICRD_MARKER	(MAKE_MARKER ('I', 'C', 'R', 'D')) 
@@ -138,10 +72,8 @@
 #define ISBJ_MARKER	(MAKE_MARKER ('I', 'S', 'B', 'J')) 
 #define ICMT_MARKER	(MAKE_MARKER ('I', 'C', 'M', 'T')) 
 
-
-
-enum {
-	HAVE_RIFF	= 0x01,
+enum 
+{	HAVE_RIFF	= 0x01,
 	HAVE_WAVE	= 0x02,
 	HAVE_fmt	= 0x04,
 	HAVE_fact	= 0x08,
@@ -153,28 +85,115 @@
  * Private static functions.
  */
 
-static int		wav_close	(SF_PRIVATE  *psf) ;
+static int	wav_read_header	(SF_PRIVATE *psf, int *blockalign, int *samplesperblock) ;
+static int	wav_write_header (SF_PRIVATE *psf) ;
+static int	wav_write_tailer (SF_PRIVATE *psf) ;
 
-static int		read_fmt_chunk	(SF_PRIVATE *psf, WAV_FMT *wav_fmt) ;
-static int		wav_write_header (SF_PRIVATE *psf) ;
-static int		wav_write_tailer (SF_PRIVATE *psf) ;
+static int	wav_close	(SF_PRIVATE  *psf) ;
 
-static int 		wav_subchunk_parse	(SF_PRIVATE *psf, int chunk) ;
+static int 	wav_subchunk_parse	(SF_PRIVATE *psf, int chunk) ;
 
-static const 	char* wav_format_str (int k) ;
-
 /*------------------------------------------------------------------------------
-** Public functions.
+** Public function.
 */
 
 int
-wav_open_read	(SF_PRIVATE *psf)
-{	WAV_FMT			wav_fmt ;
-	FACT_CHUNK		fact_chunk ;
-	unsigned int	dword, marker, RIFFsize ;
-	int				parsestage = 0, error, format = 0 ;
-	char			*cptr ;	
+wav_open	(SF_PRIVATE *psf)
+{	int	subformat, error, blockalign = 0, samplesperblock = 0 ;
 	
+	if (psf->mode == SFM_READ || (psf->mode == SFM_RDWR && psf->filelength > 0))
+	{	if ((error = wav_read_header (psf, &blockalign, &samplesperblock)))
+			return error ;
+		};
+		
+	subformat = psf->sf.format & SF_FORMAT_SUBMASK ;
+
+	if (psf->mode == SFM_WRITE || psf->mode == SFM_RDWR)
+	{	if ((psf->sf.format & SF_FORMAT_TYPEMASK) != SF_FORMAT_WAV)
+			return	SFE_BAD_OPEN_FORMAT ;
+		
+		psf->endian = SF_ENDIAN_LITTLE ;	/* All WAV files are little endian. */
+	
+		psf->blockwidth  = psf->bytewidth * psf->sf.channels ;
+
+		if (subformat == SF_FORMAT_IMA_ADPCM || subformat == SF_FORMAT_MS_ADPCM)
+		{	blockalign = wav_w64_srate2blocksize (psf->sf.samplerate * psf->sf.channels) ;
+			samplesperblock = -1 ;
+
+			/* FIXME : This block must go */
+			psf->filelength = SF_MAX_UINT ;
+			psf->datalength = SF_MAX_UINT ;
+			if (psf->sf.samples <= 0)
+				psf->sf.samples = (psf->blockwidth) ? SF_MAX_COUNT / psf->blockwidth : SF_MAX_COUNT ; 
+			/* EMXIF : This block must go */
+			} ;
+
+		if ((error = wav_write_header (psf)))
+			return error ;
+
+		psf->write_header = wav_write_header ;
+		} ;
+	
+	psf->close = wav_close ;
+	
+	switch (subformat)
+	{	case SF_FORMAT_PCM_U8 :
+					psf->chars = SF_CHARS_UNSIGNED ;
+					error = pcm_init (psf) ;
+					break ;
+
+		case SF_FORMAT_PCM_16 : 
+		case SF_FORMAT_PCM_24 : 
+		case SF_FORMAT_PCM_32 : 
+					error = pcm_init (psf) ;
+					break ;
+
+		case SF_FORMAT_FLOAT : 
+					error = float32_init (psf) ;
+					break ;
+
+		case SF_FORMAT_DOUBLE : 
+					error = double64_init (psf) ;
+					break ;
+
+		case SF_FORMAT_ULAW : 
+					error = ulaw_init (psf) ;
+					break ;
+					
+		case SF_FORMAT_ALAW : 
+					error = alaw_init (psf) ;
+					break ;
+
+		case SF_FORMAT_IMA_ADPCM : 
+					error = wav_w64_ima_init (psf, blockalign, samplesperblock) ;
+					break ;
+
+		case SF_FORMAT_MS_ADPCM : 
+					error = wav_w64_msadpcm_init (psf, blockalign, samplesperblock) ;
+					break ;
+
+		case SF_FORMAT_GSM610 : 
+					error = gsm610_init (psf) ;
+					break ;
+
+		default : 	return SFE_UNIMPLEMENTED ;
+		} ;
+
+	return error ;
+} /* wav_open */
+
+/*=========================================================================
+** Private functions.
+*/
+
+static int
+wav_read_header	(SF_PRIVATE *psf, int *blockalign, int *samplesperblock)
+{	WAV_FMT		wav_fmt ;
+	FACT_CHUNK	fact_chunk ;
+	int			dword, marker, RIFFsize ;
+	int			parsestage = 0, error, format = 0 ;
+	char		*cptr ;	
+	
 	/* Set position to start of file to begin reading header. */
 	psf_binheader_readf (psf, "p", 0) ;	
 		
@@ -185,10 +204,10 @@
 					if (parsestage)
 						return SFE_WAV_NO_RIFF ;
 
-					psf_binheader_readf (psf, "l", &RIFFsize) ;
+					psf_binheader_readf (psf, "e4", &RIFFsize) ;
 					
-					if (psf->filelength  < RIFFsize + 2 * sizeof (dword))
-					{	dword = psf->filelength - 2 * sizeof (dword);
+					if (psf->filelength  < RIFFsize + 2 * SIGNED_SIZEOF (dword))
+					{	dword = psf->filelength - 2 * SIGNED_SIZEOF (dword);
 						psf_log_printf (psf, "RIFF : %d (should be %d)\n", RIFFsize, dword) ;
 						RIFFsize = dword ;
 						}
@@ -207,9 +226,13 @@
 			case fmt_MARKER :
 					if ((parsestage & (HAVE_RIFF | HAVE_WAVE)) != (HAVE_RIFF | HAVE_WAVE))
 						return SFE_WAV_NO_FMT ;
-					if ((error = read_fmt_chunk (psf, &wav_fmt)))
+
+					psf_binheader_readf (psf, "e4", &dword) ;
+					psf_log_printf (psf, "fmt  : %d\n", dword) ;
+	
+					if ((error = wav_w64_read_fmt_chunk (psf, &wav_fmt, dword)))
 						return error ;
-						
+
 					format     = wav_fmt.format ;
 					parsestage |= HAVE_fmt ;
 					break ;
@@ -218,11 +241,12 @@
 					if ((parsestage & (HAVE_RIFF | HAVE_WAVE | HAVE_fmt)) != (HAVE_RIFF | HAVE_WAVE | HAVE_fmt))
 						return SFE_WAV_NO_DATA ;
 					
-					psf_binheader_readf (psf, "l", &(psf->datalength)) ;
+					psf_binheader_readf (psf, "e4", &dword) ;
+					psf->datalength = dword ;
 
-					psf->dataoffset = ftell (psf->file) ;
+					psf->dataoffset = psf_ftell (psf->filedes) ;
 					
-					if (psf->filelength < psf->dataoffset + psf->datalength)
+					if (psf->datalength > psf->filelength - psf->dataoffset)
 					{	psf_log_printf (psf, "data : %d (should be %d)\n", psf->datalength, psf->filelength - psf->dataoffset) ;
 						psf->datalength = psf->filelength - psf->dataoffset ;
 						}
@@ -240,11 +264,11 @@
 						break ;
 					
 					/* Seek past data and continue reading header. */
-					fseek (psf->file, psf->datalength, SEEK_CUR) ;
+					psf_fseek (psf->filedes, psf->datalength, SEEK_CUR) ;
 
-					dword = ftell (psf->file) ;
-					if (dword != (long) (psf->dataoffset + psf->datalength))
-						psf_log_printf (psf, "*** fseek past end error ***\n", dword, psf->dataoffset + psf->datalength) ;
+					dword = psf_ftell (psf->filedes) ;
+					if (dword != (sf_count_t) (psf->dataoffset + psf->datalength))
+						psf_log_printf (psf, "*** psf_fseek past end error ***\n", dword, psf->dataoffset + psf->datalength) ;
 					break ;
 
 			case fact_MARKER :
@@ -251,12 +275,16 @@
 					if ((parsestage & (HAVE_RIFF | HAVE_WAVE | HAVE_fmt)) != (HAVE_RIFF | HAVE_WAVE | HAVE_fmt))
 						return SFE_WAV_BAD_FACT ;
 
-					psf_binheader_readf (psf, "ll", &dword, &(fact_chunk.samples)) ;
+					psf_binheader_readf (psf, "e44", &dword, &(fact_chunk.samples)) ;
 					
-					if (dword > sizeof (fact_chunk))
-						psf_binheader_readf (psf, "j", (int) (dword - sizeof (fact_chunk))) ;
-
-					psf_log_printf (psf, "%D : %d\n", marker, dword) ;
+					if (dword > SIGNED_SIZEOF (fact_chunk))
+						psf_binheader_readf (psf, "j", (int) (dword - SIGNED_SIZEOF (fact_chunk))) ;
+				
+					if (dword)
+						psf_log_printf (psf, "%D : %d\n", marker, dword) ;
+					else
+						psf_log_printf (psf, "%D : %d (should not be zero)\n", marker, dword) ;
+					
 					psf_log_printf (psf, "  samples : %d\n", fact_chunk.samples) ;
 					parsestage |= HAVE_fact ;
 					break ;
@@ -265,21 +293,21 @@
 					if ((parsestage & (HAVE_RIFF | HAVE_WAVE | HAVE_fmt)) != (HAVE_RIFF | HAVE_WAVE | HAVE_fmt))
 						return SFE_WAV_PEAK_B4_FMT ;
 
-					psf_binheader_readf (psf, "l", &dword) ;
+					psf_binheader_readf (psf, "e4", &dword) ;
 					
 					psf_log_printf (psf, "%D : %d\n", marker, dword) ;
-					if (dword > sizeof (psf->peak))
+					if (dword > SIGNED_SIZEOF (psf->peak))
 					{	psf_binheader_readf (psf, "j", dword) ;
 						psf_log_printf (psf, "*** File PEAK chunk bigger than sizeof (PEAK_CHUNK).\n") ;
 						return SFE_WAV_BAD_PEAK ;
 						} ;
-					if (dword != sizeof (psf->peak) - sizeof (psf->peak.peak) + psf->sf.channels * sizeof (PEAK_POS))
+					if (dword != SIGNED_SIZEOF (psf->peak) - SIGNED_SIZEOF (psf->peak.peak) + psf->sf.channels * SIGNED_SIZEOF (PEAK_POS))
 					{	psf_binheader_readf (psf, "j", dword) ;
 						psf_log_printf (psf, "*** File PEAK chunk size doesn't fit with number of channels.\n") ;
 						return SFE_WAV_BAD_PEAK ;
 						} ;
 					
-					psf_binheader_readf (psf, "ll", &(psf->peak.version), &(psf->peak.timestamp)) ;
+					psf_binheader_readf (psf, "e44", &(psf->peak.version), &(psf->peak.timestamp)) ;
 
 					if (psf->peak.version != 1)
 						psf_log_printf (psf, "  version    : %d *** (should be version 1)\n", psf->peak.version) ;
@@ -291,10 +319,10 @@
 
 					cptr = (char *) psf->buffer ;
 					for (dword = 0 ; dword < psf->sf.channels ; dword++)
-					{	psf_binheader_readf (psf, "fl", &(psf->peak.peak[dword].value), 
+					{	psf_binheader_readf (psf, "ef4", &(psf->peak.peak[dword].value), 
 														&(psf->peak.peak[dword].position)) ;
 					
-						snprintf (cptr, sizeof (psf->buffer), "    %2d   %-12d   %g\n", 
+						LSF_SNPRINTF (cptr, sizeof (psf->buffer), "    %2d   %-12d   %g\n", 
 								dword, psf->peak.peak[dword].position, psf->peak.peak[dword].value) ;
 						cptr [sizeof (psf->buffer) - 1] = 0 ;
 						psf_log_printf (psf, cptr) ;
@@ -305,7 +333,6 @@
 
 			case INFO_MARKER :
 			case LIST_MARKER :
-					psf_log_printf (psf, "%D\n", marker) ;
 					if ((error = wav_subchunk_parse (psf, marker)))
 						return error ;
 					break ;
@@ -314,7 +341,7 @@
 			case cue_MARKER :
 			case DISP_MARKER :
 			case MEXT_MARKER :
-					psf_binheader_readf (psf, "l", &dword);
+					psf_binheader_readf (psf, "e4", &dword);
 					psf_log_printf (psf, "%D : %d\n", marker, dword) ;
 					dword += (dword & 1) ;
 					psf_binheader_readf (psf, "j", dword) ;
@@ -323,7 +350,8 @@
 			case smpl_MARKER :
 			case acid_MARKER :
 			case PAD_MARKER :
-					psf_binheader_readf (psf, "l", &dword);
+			case afsp_MARKER :
+					psf_binheader_readf (psf, "e4", &dword);
 					psf_log_printf (psf, " *** %D : %d\n", marker, dword) ;
 					dword += (dword & 1) ;
 					psf_binheader_readf (psf, "j", dword) ;
@@ -333,13 +361,13 @@
 			default : 
 					if (isprint ((marker >> 24) & 0xFF) && isprint ((marker >> 16) & 0xFF)
 						&& isprint ((marker >> 8) & 0xFF) && isprint (marker & 0xFF))
-					{	psf_binheader_readf (psf, "l", &dword);
+					{	psf_binheader_readf (psf, "e4", &dword);
 						psf_log_printf (psf, "*** %D : %d (unknown marker)\n", marker, dword) ;
 
 						psf_binheader_readf (psf, "j", dword);
 						break ;
 						} ;
-					if (ftell (psf->file) & 0x03)
+					if (psf_ftell (psf->filedes) & 0x03)
 					{	psf_log_printf (psf, "  Unknown chunk marker at position %d. Resynching.\n", dword - 4) ;
 						psf_binheader_readf (psf, "j", -3) ;
 						break ;
@@ -351,26 +379,27 @@
 		if (! psf->sf.seekable && (parsestage & HAVE_data))
 			break ;
 
-		if (ferror (psf->file))
+		if (psf_ferror (psf->filedes))
 		{	psf_log_printf (psf, "*** Error on file handle. ***\n", marker) ;
-			clearerr (psf->file) ;
+			psf_fclearerr (psf->filedes) ;
 			break ;
 			} ;
 
-		if (ftell (psf->file) >= (int) (psf->filelength - (2 * sizeof (dword))))
+		if (psf_ftell (psf->filedes) >= (int) (psf->filelength - (2 * sizeof (dword))))
 			break ;
+
+		if (psf->logindex >= sizeof (psf->logbuffer) - 2)
+			return SFE_LOG_OVERRUN ;
 		} ; /* while (1) */
 		
 	if (! psf->dataoffset)
 		return SFE_WAV_NO_DATA ;
 
-	psf->current     = 0 ;
-	psf->endian      = SF_ENDIAN_LITTLE ;		/* All WAV files are little endian. */
-	psf->sf.sections = 1 ;
+	psf->endian = SF_ENDIAN_LITTLE ;		/* All WAV files are little endian. */
 	
-	fseek (psf->file, psf->dataoffset, SEEK_SET) ;
+	psf_fseek (psf->filedes, psf->dataoffset, SEEK_SET) ;
 	
-	psf->close = (func_close) wav_close ;
+	psf->close = wav_close ;
 
 	if (psf->blockwidth)
 	{	if (psf->filelength - psf->dataoffset < psf->datalength)
@@ -380,264 +409,204 @@
 		} ;
 
 	switch (format)
-	{	case 	WAVE_FORMAT_PCM :
-		case	WAVE_FORMAT_EXTENSIBLE :
-					psf->sf.format = (SF_FORMAT_WAV | SF_FORMAT_PCM) ;
-					if (psf->bytewidth == 1)
-						psf->chars = SF_CHARS_UNSIGNED ;
-	
-					if ((error = pcm_read_init (psf)))
-						return error ;
-					return 0 ;
+	{	case WAVE_FORMAT_PCM :
+		case WAVE_FORMAT_EXTENSIBLE :
+					psf->sf.format = SF_FORMAT_WAV | u_bitwidth_to_subformat (psf->bytewidth * 8) ;
+					break ;
 					
-		case	WAVE_FORMAT_IEEE_FLOAT :
-					psf->sf.format   = (SF_FORMAT_WAV | SF_FORMAT_FLOAT) ;
-					float32_read_init (psf) ;
-					return 0 ;
-		
-		default :	return SFE_UNIMPLEMENTED ;
-		} ;
-
-	return 0 ;
-} /* wav_open_read */
-
-/*------------------------------------------------------------------------------
- */
-
-int
-wav_open_write	(SF_PRIVATE *psf)
-{	unsigned int	subformat ;
-	int				error ;
+		case WAVE_FORMAT_MULAW :
+					psf->sf.format = (SF_FORMAT_WAV | SF_FORMAT_ULAW) ;
+					break ;
 	
-	if ((psf->sf.format & SF_FORMAT_TYPEMASK) != SF_FORMAT_WAV)
-		return	SFE_BAD_OPEN_FORMAT ;
-	
-	psf->endian      = SF_ENDIAN_LITTLE ;		/* All WAV files are little endian. */
-	psf->sf.seekable = SF_TRUE ;
-	psf->error       = 0 ;
-
-	subformat = psf->sf.format & SF_FORMAT_SUBMASK ;
-	if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW)
-		psf->bytewidth = 1 ;
-	else
-		psf->bytewidth = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
-
-	psf->blockwidth  = psf->bytewidth * psf->sf.channels ;
-
-	/* Set sample count artifically high and fix later. */ 
-	psf->sf.samples = 0x7FFFFFFF / psf->blockwidth ; 
-	psf->datalength = psf->blockwidth * psf->sf.samples ;
-	psf->filelength = 0x7FFFFFFF ;
-
-	/* Set standard wav_close and write_header now, may be overridden in wav_write_header. */
-	psf->close        = (func_close)  wav_close ;
-	psf->write_header = (func_wr_hdr) wav_write_header ;
-
-	if ((error = wav_write_header (psf)))
-		return error ;
-
-	return 0 ;
-} /* wav_open_write */
-
-/*------------------------------------------------------------------------------
- */
-
-static int	
-wav_close	(SF_PRIVATE  *psf)
-{	
-	if (psf->mode == SF_MODE_WRITE)
-	{	/*  Now we know for certain the length of the file we can
-		 *  re-write correct values for the RIFF and data chunks.
-		 */
-
-		fseek (psf->file, 0, SEEK_END) ;
-		psf->tailstart = ftell (psf->file) ;
-		wav_write_tailer (psf) ;
-
-		fseek (psf->file, 0, SEEK_END) ;
-		psf->filelength = ftell (psf->file) ;
-		fseek (psf->file, 0, SEEK_SET) ;
+		case WAVE_FORMAT_ALAW :
+					psf->sf.format = (SF_FORMAT_WAV | SF_FORMAT_ALAW) ;
+					break ;
 		
-		psf->datalength = psf->filelength - psf->dataoffset - (psf->filelength - psf->tailstart) ;
- 		psf->sf.samples = psf->datalength / (psf->bytewidth * psf->sf.channels) ;
+		case WAVE_FORMAT_MS_ADPCM : 
+					psf->sf.format = (SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM) ;
+					*blockalign = wav_fmt.msadpcm.blockalign ;
+					*samplesperblock = wav_fmt.msadpcm.samplesperblock ;
+					break ;
 
-		wav_write_header (psf) ;
-		} ;
-
-	if (psf->fdata)
-		free (psf->fdata) ;
-	psf->fdata = NULL ;
-
-	return 0 ;
-} /* wav_close */
-
-/*=========================================================================
-** Private functions.
-*/
-
-static int
-read_fmt_chunk (SF_PRIVATE *psf, WAV_FMT *wav_fmt)
-{	unsigned int	bytesread, k, structsize, bytespersec = 0  ;
-	
-	memset (wav_fmt, 0, sizeof (WAV_FMT)) ;
-
-	psf_binheader_readf (psf, "l", &structsize) ;
-	
-	psf_log_printf (psf, "fmt  : %d\n", structsize) ;
-	
-	if (structsize < 16)
-		return SFE_WAV_FMT_SHORT ;
-	if (structsize > sizeof (WAV_FMT))
-		return SFE_WAV_FMT_TOO_BIG ;
-
-	/* Read the minimal WAV file header here. */	
-	bytesread =
-	psf_binheader_readf (psf, "wwllww", &(wav_fmt->format), &(wav_fmt->min.channels),
-			&(wav_fmt->min.samplerate), &(wav_fmt->min.bytespersec), 
-			&(wav_fmt->min.blockalign), &(wav_fmt->min.bitwidth))  ;
-
-	psf_log_printf (psf, "  Format        : 0x%X => %s\n", wav_fmt->format, wav_format_str (wav_fmt->format)) ;
-	psf_log_printf (psf, "  Channels      : %d\n", wav_fmt->min.channels) ;
-	psf_log_printf (psf, "  Sample Rate   : %d\n", wav_fmt->min.samplerate) ;
-	psf_log_printf (psf, "  Block Align   : %d\n", wav_fmt->min.blockalign) ;
-	
-	if (wav_fmt->format == WAVE_FORMAT_GSM610 && wav_fmt->min.bitwidth != 0)
-		psf_log_printf (psf, "  Bit Width     : %d (should be 0)\n", wav_fmt->min.bitwidth) ;
-	else
-		psf_log_printf (psf, "  Bit Width     : %d\n", wav_fmt->min.bitwidth) ;
-	
-	psf->sf.samplerate		= wav_fmt->min.samplerate ;
-	psf->sf.samples 		= 0 ;					/* Correct this when reading data chunk. */
-	psf->sf.channels		= wav_fmt->min.channels ;
-	
-	switch (wav_fmt->format)
-	{	case WAVE_FORMAT_PCM :
+		case WAVE_FORMAT_IMA_ADPCM :
+					psf->sf.format = (SF_FORMAT_WAV | SF_FORMAT_IMA_ADPCM) ;
+					*blockalign = wav_fmt.ima.blockalign ;
+					*samplesperblock = wav_fmt.ima.samplesperblock ;
+					break ;
+		
+		case WAVE_FORMAT_GSM610 :
+					psf->sf.format = (SF_FORMAT_WAV | SF_FORMAT_GSM610) ;
+					break ;
+		
 		case WAVE_FORMAT_IEEE_FLOAT :
-				bytespersec = wav_fmt->min.samplerate * wav_fmt->min.blockalign ;
-				if (wav_fmt->min.bytespersec != bytespersec)
-					psf_log_printf (psf, "  Bytes/sec     : %d (should be %d)\n", wav_fmt->min.bytespersec, bytespersec) ;
-				else
-					psf_log_printf (psf, "  Bytes/sec     : %d\n", wav_fmt->min.bytespersec) ;
+					psf->sf.format  = SF_FORMAT_WAV ;
+					psf->sf.format |= (psf->bytewidth == 8) ? SF_FORMAT_DOUBLE : SF_FORMAT_FLOAT ;
+					break ;
 		
-				psf->sf.pcmbitwidth	= wav_fmt->min.bitwidth ;
-				psf->bytewidth      = BITWIDTH2BYTES (wav_fmt->min.bitwidth) ;
-				break ;
-
-		case WAVE_FORMAT_EXTENSIBLE :
-				if (wav_fmt->ext.bytespersec / wav_fmt->ext.blockalign != wav_fmt->ext.samplerate)
-					psf_log_printf (psf, "  Bytes/sec     : %d (should be %d)\n", wav_fmt->ext.bytespersec, wav_fmt->ext.samplerate * wav_fmt->ext.blockalign) ;
-				else
-					psf_log_printf (psf, "  Bytes/sec     : %d\n", wav_fmt->ext.bytespersec) ;
-
-				bytesread += 
-				psf_binheader_readf (psf, "wwl", &(wav_fmt->ext.extrabytes), &(wav_fmt->ext.validbits),
-						&(wav_fmt->ext.channelmask)) ;
-
-				psf_log_printf (psf, "  Valid Bits    : %d\n", wav_fmt->ext.validbits) ;
-				psf_log_printf (psf, "  Channel Mask  : 0x%X\n", wav_fmt->ext.channelmask) ;
-
-				bytesread += 
-				psf_binheader_readf (psf, "lww", &(wav_fmt->ext.esf.esf_field1), &(wav_fmt->ext.esf.esf_field2),
-						&(wav_fmt->ext.esf.esf_field3)) ;
-
-				psf_log_printf (psf, "  Subformat\n") ;
-				psf_log_printf (psf, "    esf_field1 : 0x%X\n", wav_fmt->ext.esf.esf_field1) ;
-				psf_log_printf (psf, "    esf_field2 : 0x%X\n", wav_fmt->ext.esf.esf_field2) ;
-				psf_log_printf (psf, "    esf_field3 : 0x%X\n", wav_fmt->ext.esf.esf_field3) ;
-				psf_log_printf (psf, "    esf_field4 : ") ;
-				for (k = 0 ; k < 8 ; k++)
-				{	bytesread += psf_binheader_readf (psf, "b", &(wav_fmt->ext.esf.esf_field4 [k])) ;
-					psf_log_printf (psf, "0x%X ", wav_fmt->ext.esf.esf_field4 [k] & 0xFF) ;
-					} ;
-				psf_log_printf (psf, "\n") ;
-				psf->sf.pcmbitwidth = wav_fmt->ext.bitwidth ;
-				psf->bytewidth      = BITWIDTH2BYTES (wav_fmt->ext.bitwidth) ;
-				break ;
-
-		default : break ;
+		default : return SFE_UNIMPLEMENTED ;
 		} ;
 
-	if (bytesread > structsize)	
-	{	psf_log_printf (psf, "*** read_fmt_chunk (bytesread > structsize)\n") ;
-		return SFE_WAV_FMT_SHORT ;
-		}
-	else
-		fread (psf->buffer, 1, structsize - bytesread, psf->file) ;
-
-	psf->blockwidth = wav_fmt->min.channels * psf->bytewidth ;
-
 	return 0 ;
-} /* read_fmt_chunk */
+} /* wav_read_header */
 
 static int 
 wav_write_header (SF_PRIVATE *psf)
-{	unsigned int 	fmt_size ;
-	int 			k, error, subformat ;
+{	int 	fmt_size, k, subformat, add_fact_chunk = SF_FALSE ;
 	
 	/* Reset the current header length to zero. */
 	psf->header [0] = 0 ;
 	psf->headindex = 0 ;
-	fseek (psf->file, 0, SEEK_SET) ;
+	psf_fseek (psf->filedes, 0, SEEK_SET) ;
 
 	/* RIFF marker, length, WAVE and 'fmt ' markers. */		
-	psf_binheader_writef (psf, "mlmm", RIFF_MARKER, psf->filelength - 8, WAVE_MARKER, fmt_MARKER) ;
+	psf_binheader_writef (psf, "etm8mm", RIFF_MARKER, psf->filelength - 8, WAVE_MARKER, fmt_MARKER) ;
 
 	subformat = psf->sf.format & SF_FORMAT_SUBMASK ;
 
 	switch (subformat)
-	{	case	SF_FORMAT_PCM : 
-					psf->sf.format = (SF_FORMAT_WAV | SF_FORMAT_PCM) ;
-
-					if (psf->bytewidth == 1)
-						psf->chars = SF_CHARS_UNSIGNED ;
-	
-					if ((error = pcm_write_init (psf)))
-						return error ;
-		
+	{	case SF_FORMAT_PCM_U8 :
+		case SF_FORMAT_PCM_16 : 
+		case SF_FORMAT_PCM_24 : 
+		case SF_FORMAT_PCM_32 : 
 					fmt_size = 2 + 2 + 4 + 4 + 2 + 2 ;
 
 					/* fmt : format, channels, samplerate */
-					psf_binheader_writef (psf, "lwwl", fmt_size, WAVE_FORMAT_PCM, psf->sf.channels, psf->sf.samplerate) ;
+					psf_binheader_writef (psf, "e4224", fmt_size, WAVE_FORMAT_PCM, psf->sf.channels, psf->sf.samplerate) ;
 					/*  fmt : bytespersec */
-					psf_binheader_writef (psf, "l", psf->sf.samplerate * psf->bytewidth * psf->sf.channels) ;
+					psf_binheader_writef (psf, "e4", psf->sf.samplerate * psf->bytewidth * psf->sf.channels) ;
 					/*  fmt : blockalign, bitwidth */
-					psf_binheader_writef (psf, "ww", psf->bytewidth * psf->sf.channels, psf->sf.pcmbitwidth) ;
+					psf_binheader_writef (psf, "e22", psf->bytewidth * psf->sf.channels, psf->bytewidth * 8) ;
 					break ;
 
-		case	SF_FORMAT_FLOAT : 
-					psf->sf.format = (SF_FORMAT_WAV | SF_FORMAT_FLOAT) ;
-
+		case SF_FORMAT_FLOAT : 
+		case SF_FORMAT_DOUBLE : 
 					/* Add the peak chunk to floating point files. */					
 					psf->has_peak = SF_TRUE ;
 					psf->peak_loc = SF_PEAK_START ;
-					float32_write_init (psf) ;
 					
 					fmt_size = 2 + 2 + 4 + 4 + 2 + 2 ;
 
 					/* fmt : format, channels, samplerate */
-					psf_binheader_writef (psf, "lwwl", fmt_size, WAVE_FORMAT_IEEE_FLOAT, psf->sf.channels, psf->sf.samplerate) ;
+					psf_binheader_writef (psf, "e4224", fmt_size, WAVE_FORMAT_IEEE_FLOAT, psf->sf.channels, psf->sf.samplerate) ;
 					/*  fmt : bytespersec */
-					psf_binheader_writef (psf, "l", psf->sf.samplerate * psf->bytewidth * psf->sf.channels) ;
+					psf_binheader_writef (psf, "e4", psf->sf.samplerate * psf->bytewidth * psf->sf.channels) ;
 					/*  fmt : blockalign, bitwidth */
-					psf_binheader_writef (psf, "ww", psf->bytewidth * psf->sf.channels, psf->sf.pcmbitwidth) ;
+					psf_binheader_writef (psf, "e22", psf->bytewidth * psf->sf.channels, psf->bytewidth * 8) ;
 
-					/* Write 'fact' chunk. */
-					psf_binheader_writef (psf, "mll", fact_MARKER, FACT_CHUNK_SIZE, psf->sf.samples) ;
+					add_fact_chunk = SF_TRUE ;
 					break ;
 
+		case SF_FORMAT_ULAW : 
+					fmt_size = 2 + 2 + 4 + 4 + 2 + 2 ;
+					
+					/* fmt : format, channels, samplerate */
+					psf_binheader_writef (psf, "e4224", fmt_size, WAVE_FORMAT_MULAW, psf->sf.channels, psf->sf.samplerate) ;
+					/*  fmt : bytespersec */
+					psf_binheader_writef (psf, "e4", psf->sf.samplerate * psf->bytewidth * psf->sf.channels) ;
+					/*  fmt : blockalign, bitwidth */
+					psf_binheader_writef (psf, "e22", psf->bytewidth * psf->sf.channels, 8) ;
+
+					add_fact_chunk = SF_TRUE ;
+					break ;
+					
+		case SF_FORMAT_ALAW : 
+					fmt_size = 2 + 2 + 4 + 4 + 2 + 2 ;
+
+					/* fmt : format, channels, samplerate */
+					psf_binheader_writef (psf, "e4224", fmt_size, WAVE_FORMAT_ALAW, psf->sf.channels, psf->sf.samplerate) ;
+					/*  fmt : bytespersec */
+					psf_binheader_writef (psf, "e4", psf->sf.samplerate * psf->bytewidth * psf->sf.channels) ;
+					/*  fmt : blockalign, bitwidth */
+					psf_binheader_writef (psf, "e22", psf->bytewidth * psf->sf.channels, 8) ;
+
+					add_fact_chunk = SF_TRUE ;
+					break ;
+
+		case SF_FORMAT_IMA_ADPCM : 
+					{	int  blockalign, samplesperblock, bytespersec ;
+
+						blockalign      = wav_w64_srate2blocksize (psf->sf.samplerate * psf->sf.channels) ;
+						samplesperblock = 2 * (blockalign - 4 * psf->sf.channels) / psf->sf.channels + 1 ;
+						bytespersec     = (psf->sf.samplerate * blockalign) / samplesperblock ;
+	
+						/* fmt chunk. */
+						fmt_size = 2 + 2 + 4 + 4 + 2 + 2 + 2 + 2 ;
+	
+						/* fmt : size, WAV format type, channels, samplerate, bytespersec */
+						psf_binheader_writef (psf, "e42244", fmt_size, WAVE_FORMAT_IMA_ADPCM, 
+									psf->sf.channels, psf->sf.samplerate, bytespersec) ;
+
+						/* fmt : blockalign, bitwidth, extrabytes, samplesperblock. */
+						psf_binheader_writef (psf, "e2222", blockalign, 4, 2, samplesperblock) ;
+						} ;
+					add_fact_chunk = SF_TRUE ;
+					break ;
+
+		case SF_FORMAT_MS_ADPCM : 
+					{	int  blockalign, samplesperblock, bytespersec, extrabytes ;
+
+						blockalign      = wav_w64_srate2blocksize (psf->sf.samplerate * psf->sf.channels) ;	
+						samplesperblock = 2 + 2 * (blockalign - 7 * psf->sf.channels) / psf->sf.channels ;
+						bytespersec     = (psf->sf.samplerate * blockalign) / samplesperblock ;
+	
+						/* fmt chunk. */
+						extrabytes = 2 + 2 + MSADPCM_ADAPT_COEFF_COUNT * (2 + 2) ;
+						fmt_size   = 2 + 2 + 4 + 4 + 2 + 2 + 2 + extrabytes ;
+	
+						/* fmt : size, WAV format type, channels. */
+						psf_binheader_writef (psf, "e422", fmt_size, WAVE_FORMAT_MS_ADPCM, psf->sf.channels) ;
+
+						/* fmt : samplerate, bytespersec. */
+						psf_binheader_writef (psf, "e44", psf->sf.samplerate, bytespersec) ;
+
+						/* fmt : blockalign, bitwidth, extrabytes, samplesperblock. */
+						psf_binheader_writef (psf, "e22222", blockalign, 4, extrabytes, samplesperblock, 7) ;
+
+						msadpcm_write_adapt_coeffs (psf) ;
+						} ;
+
+					add_fact_chunk = SF_TRUE ;
+					break ;
+
+		case SF_FORMAT_GSM610 : 
+					{	int  blockalign, samplesperblock, bytespersec ;
+
+						blockalign      = WAV_W64_GSM610_BLOCKSIZE ;
+						samplesperblock = WAV_W64_GSM610_SAMPLES ;
+						bytespersec     = (psf->sf.samplerate * blockalign) / samplesperblock ;
+
+						/* fmt chunk. */
+						fmt_size = 2 + 2 + 4 + 4 + 2 + 2 + 2 + 2 ;
+	
+						/* fmt : size, WAV format type, channels. */
+						psf_binheader_writef (psf, "e422", fmt_size, WAVE_FORMAT_GSM610, psf->sf.channels) ;
+	
+						/* fmt : samplerate, bytespersec. */
+						psf_binheader_writef (psf, "e44", psf->sf.samplerate, bytespersec) ;
+
+						/* fmt : blockalign, bitwidth, extrabytes, samplesperblock. */
+						psf_binheader_writef (psf, "e2222", blockalign, 0, 2, samplesperblock) ;
+						} ;
+	
+					add_fact_chunk = SF_TRUE ;
+					break ;
+
 		default : 	return SFE_UNIMPLEMENTED ;
 		} ;
 
+	if (add_fact_chunk)
+		psf_binheader_writef (psf, "em44", fact_MARKER, 4, psf->sf.samples) ;
+
 	if (psf->has_peak && psf->peak_loc == SF_PEAK_START)
-	{	psf_binheader_writef (psf, "ml", PEAK_MARKER, 
+	{	psf_binheader_writef (psf, "em4", PEAK_MARKER, 
 			sizeof (psf->peak) - sizeof (psf->peak.peak) + psf->sf.channels * sizeof (PEAK_POS)) ;
-		psf_binheader_writef (psf, "ll", 1, time (NULL)) ;
+		psf_binheader_writef (psf, "e44", 1, time (NULL)) ;
 		for (k = 0 ; k < psf->sf.channels ; k++)
-			psf_binheader_writef (psf, "fl", psf->peak.peak[k].value, psf->peak.peak[k].position) ;
+			psf_binheader_writef (psf, "ef4", psf->peak.peak[k].value, psf->peak.peak[k].position) ;
 		} ;
 
-	psf_binheader_writef (psf, "ml", data_MARKER, psf->datalength) ;
-	fwrite (psf->header, psf->headindex, 1, psf->file) ;
+	psf_binheader_writef (psf, "etm8", data_MARKER, psf->datalength) ;
+	psf_fwrite (psf->header, psf->headindex, 1, psf->filedes) ;
 
 	psf->dataoffset = psf->headindex ;
 
@@ -644,7 +613,7 @@
 	return 0 ;
 } /* wav_write_header */
 
-static int 
+static int
 wav_write_tailer (SF_PRIVATE *psf)
 {	int		k ;
 
@@ -651,28 +620,64 @@
 	/* Reset the current header buffer length to zero. */
 	psf->header [0] = 0 ;
 	psf->headindex = 0 ;
-	fseek (psf->file, 0, SEEK_END) ;
+	psf_fseek (psf->filedes, 0, SEEK_END) ;
 
 	if (psf->has_peak && psf->peak_loc == SF_PEAK_END)
-	{	psf_binheader_writef (psf, "ml", PEAK_MARKER, 
+	{	psf_binheader_writef (psf, "em4", PEAK_MARKER, 
 			sizeof (psf->peak) - sizeof (psf->peak.peak) + psf->sf.channels * sizeof (PEAK_POS)) ;
-		psf_binheader_writef (psf, "ll", 1, time (NULL)) ;
+		psf_binheader_writef (psf, "e44", 1, time (NULL)) ;
 		for (k = 0 ; k < psf->sf.channels ; k++)
-			psf_binheader_writef (psf, "fl", psf->peak.peak[k].value, psf->peak.peak[k].position) ; /* XXXXX */
+			psf_binheader_writef (psf, "ef4", psf->peak.peak[k].value, psf->peak.peak[k].position) ; /* XXXXX */
 		} ;
 
 	if (psf->headindex > 0)
-		fwrite (psf->header, psf->headindex, 1, psf->file) ;
+		psf_fwrite (psf->header, psf->headindex, 1, psf->filedes) ;
 
 	return 0 ;
 } /* wav_write_tailer */
 
+static int	
+wav_close	(SF_PRIVATE  *psf)
+{	
+	if (psf->mode == SFM_WRITE || psf->mode == SFM_RDWR)
+	{	/*  Now we know for certain the length of the file we can
+		 *  re-write correct values for the RIFF and data chunks.
+		 */
+
+		psf_fseek (psf->filedes, 0, SEEK_END) ;
+		psf->dataend = psf_ftell (psf->filedes) ;
+		wav_write_tailer (psf) ;
+
+		psf_fseek (psf->filedes, 0, SEEK_END) ;
+		psf->filelength = psf_ftell (psf->filedes) ;
+		psf_fseek (psf->filedes, 0, SEEK_SET) ;
+		
+		psf->datalength = psf->filelength - psf->dataoffset - (psf->filelength - psf->dataend) ;
+ 		psf->sf.samples = psf->datalength / (psf->bytewidth * psf->sf.channels) ;
+
+		wav_write_header (psf) ;
+		} ;
+
+	return 0 ;
+} /* wav_close */
+
 static int
 wav_subchunk_parse (SF_PRIVATE *psf, int chunk)
-{	unsigned int dword, bytesread, length ;
+{	sf_count_t	current_pos ;
+	int 		dword, bytesread, length ;
 
-	bytesread = psf_binheader_readf (psf, "l", &length);
+	current_pos = psf_fseek (psf->filedes, 0, SEEK_CUR) ;
 
+	bytesread = psf_binheader_readf (psf, "e4", &length);
+	
+	if (current_pos + length > psf->filelength)
+	{	psf_log_printf (psf, "%D : %d (should be %d)\n", chunk, length, (int) (psf->filelength - current_pos)) ;
+		length = psf->filelength - current_pos ;
+		}
+	else
+		psf_log_printf (psf, "%D : %d\n", chunk, length) ;
+	
+
 	while (bytesread < length)
 	{	bytesread += psf_binheader_readf (psf, "m", &chunk);
 
@@ -682,8 +687,13 @@
 					/* These markers don't contain anything. */
 					psf_log_printf (psf, "  %D\n", chunk) ;
 					break ;
+					
+			case data_MARKER:
+					psf_log_printf (psf, "  %D inside a LIST block??? Backing out.\n", chunk) ;
+					/* Jump back four bytes and return to caller. */
+					psf_binheader_readf (psf, "j", -4);
+					return 0 ;
 
-
 			case IART_MARKER :
 			case ICMT_MARKER : 
 			case ICOP_MARKER :
@@ -695,20 +705,21 @@
 			case ISBJ_MARKER :
 			case ISFT_MARKER :
 			case ISRC_MARKER :
-					bytesread += psf_binheader_readf (psf, "l", &dword);
+					bytesread += psf_binheader_readf (psf, "e4", &dword);
 					dword += (dword & 1) ;
-					if (dword > sizeof (psf->buffer))
+					if (dword > SIGNED_SIZEOF (psf->buffer))
 					{	psf_log_printf (psf, "  *** %D : %d (too big)\n", chunk, dword) ;
 						return SFE_INTERNAL ;
 						} ;
-					bytesread += psf_binheader_readf (psf, "B", psf->buffer, dword) ;
+					bytesread += psf_binheader_readf (psf, "b", psf->buffer, dword) ;
 					psf->buffer [dword - 1] = 0 ;
 					psf_log_printf (psf, "    %D : %s\n", chunk, psf->buffer) ;
 					break ;
 
 			case labl_MARKER :
+			case ltxt_MARKER :
 			case note_MARKER :
-					bytesread += psf_binheader_readf (psf, "l", &dword);
+					bytesread += psf_binheader_readf (psf, "e4", &dword);
 					dword += (dword & 1) ;
 					psf_binheader_readf (psf, "j", dword) ;
 					bytesread += dword ;
@@ -716,117 +727,19 @@
 					break ;
 
 			default : 
-					bytesread += psf_binheader_readf (psf, "l", &dword);
+					bytesread += psf_binheader_readf (psf, "e4", &dword);
 					dword += (dword & 1) ;
 					bytesread += psf_binheader_readf (psf, "j", dword) ;
 					psf_log_printf (psf, "    *** %D : %d\n", chunk, dword) ;
+					if (dword > length)
+						return 0 ;
 					break ;
 			} ;
+		if (psf->logindex >= sizeof (psf->logbuffer) - 2)
+			return SFE_LOG_OVERRUN ;
 		} ;
 
 	return 0 ;
 } /* wav_subchunk_parse */
 
-static char const* 
-wav_format_str (int k)
-{	switch (k)
-	{	case WAVE_FORMAT_UNKNOWN :
-			return "WAVE_FORMAT_UNKNOWN" ;
-		case WAVE_FORMAT_PCM          :
-			return "WAVE_FORMAT_PCM         " ;
-		case WAVE_FORMAT_MS_ADPCM :
-			return "WAVE_FORMAT_MS_ADPCM" ;
-		case WAVE_FORMAT_IEEE_FLOAT :
-			return "WAVE_FORMAT_IEEE_FLOAT" ;
-		case WAVE_FORMAT_IBM_CVSD :
-			return "WAVE_FORMAT_IBM_CVSD" ;
-		case WAVE_FORMAT_ALAW :
-			return "WAVE_FORMAT_ALAW" ;
-		case WAVE_FORMAT_MULAW :
-			return "WAVE_FORMAT_MULAW" ;
-		case WAVE_FORMAT_OKI_ADPCM :
-			return "WAVE_FORMAT_OKI_ADPCM" ;
-		case WAVE_FORMAT_IMA_ADPCM :
-			return "WAVE_FORMAT_IMA_ADPCM" ;
-		case WAVE_FORMAT_MEDIASPACE_ADPCM :
-			return "WAVE_FORMAT_MEDIASPACE_ADPCM" ;
-		case WAVE_FORMAT_SIERRA_ADPCM :
-			return "WAVE_FORMAT_SIERRA_ADPCM" ;
-		case WAVE_FORMAT_G723_ADPCM :
-			return "WAVE_FORMAT_G723_ADPCM" ;
-		case WAVE_FORMAT_DIGISTD :
-			return "WAVE_FORMAT_DIGISTD" ;
-		case WAVE_FORMAT_DIGIFIX :
-			return "WAVE_FORMAT_DIGIFIX" ;
-		case WAVE_FORMAT_DIALOGIC_OKI_ADPCM :
-			return "WAVE_FORMAT_DIALOGIC_OKI_ADPCM" ;
-		case WAVE_FORMAT_MEDIAVISION_ADPCM :
-			return "WAVE_FORMAT_MEDIAVISION_ADPCM" ;
-		case WAVE_FORMAT_YAMAHA_ADPCM :
-			return "WAVE_FORMAT_YAMAHA_ADPCM" ;
-		case WAVE_FORMAT_SONARC :
-			return "WAVE_FORMAT_SONARC" ;
-		case WAVE_FORMAT_DSPGROUP_TRUESPEECH  :
-			return "WAVE_FORMAT_DSPGROUP_TRUESPEECH " ;
-		case WAVE_FORMAT_ECHOSC1 :
-			return "WAVE_FORMAT_ECHOSC1" ;
-		case WAVE_FORMAT_AUDIOFILE_AF18   :
-			return "WAVE_FORMAT_AUDIOFILE_AF18  " ;
-		case WAVE_FORMAT_APTX :
-			return "WAVE_FORMAT_APTX" ;
-		case WAVE_FORMAT_AUDIOFILE_AF10   :
-			return "WAVE_FORMAT_AUDIOFILE_AF10  " ;
-		case WAVE_FORMAT_DOLBY_AC2 :
-			return "WAVE_FORMAT_DOLBY_AC2" ;
-		case WAVE_FORMAT_GSM610 :
-			return "WAVE_FORMAT_GSM610" ;
-		case WAVE_FORMAT_MSNAUDIO :
-			return "WAVE_FORMAT_MSNAUDIO" ;
-		case WAVE_FORMAT_ANTEX_ADPCME :
-			return "WAVE_FORMAT_ANTEX_ADPCME" ;
-		case WAVE_FORMAT_CONTROL_RES_VQLPC :
-			return "WAVE_FORMAT_CONTROL_RES_VQLPC" ;
-		case WAVE_FORMAT_DIGIREAL :
-			return "WAVE_FORMAT_DIGIREAL" ;
-		case WAVE_FORMAT_DIGIADPCM :
-			return "WAVE_FORMAT_DIGIADPCM" ;
-		case WAVE_FORMAT_CONTROL_RES_CR10 :
-			return "WAVE_FORMAT_CONTROL_RES_CR10" ;
-		case WAVE_FORMAT_NMS_VBXADPCM :
-			return "WAVE_FORMAT_NMS_VBXADPCM" ;
-		case WAVE_FORMAT_ROCKWELL_ADPCM :
-			return "WAVE_FORMAT_ROCKWELL_ADPCM" ;
-		case WAVE_FORMAT_ROCKWELL_DIGITALK :
-			return "WAVE_FORMAT_ROCKWELL_DIGITALK" ;
-		case WAVE_FORMAT_G721_ADPCM :
-			return "WAVE_FORMAT_G721_ADPCM" ;
-		case WAVE_FORMAT_MPEG :
-			return "WAVE_FORMAT_MPEG" ;
-		case WAVE_FORMAT_MPEGLAYER3 :
-			return "WAVE_FORMAT_MPEGLAYER3" ;
-		case IBM_FORMAT_MULAW :
-			return "IBM_FORMAT_MULAW" ;
-		case IBM_FORMAT_ALAW :
-			return "IBM_FORMAT_ALAW" ;
-		case IBM_FORMAT_ADPCM :
-			return "IBM_FORMAT_ADPCM" ;
-		case WAVE_FORMAT_CREATIVE_ADPCM :
-			return "WAVE_FORMAT_CREATIVE_ADPCM" ;
-		case WAVE_FORMAT_FM_TOWNS_SND :
-			return "WAVE_FORMAT_FM_TOWNS_SND" ;
-		case WAVE_FORMAT_OLIGSM :
-			return "WAVE_FORMAT_OLIGSM" ;
-		case WAVE_FORMAT_OLIADPCM :
-			return "WAVE_FORMAT_OLIADPCM" ;
-		case WAVE_FORMAT_OLICELP :
-			return "WAVE_FORMAT_OLICELP" ;
-		case WAVE_FORMAT_OLISBC :
-			return "WAVE_FORMAT_OLISBC" ;
-		case WAVE_FORMAT_OLIOPR :
-			return "WAVE_FORMAT_OLIOPR" ;
-		case WAVE_FORMAT_EXTENSIBLE :
-			return "WAVE_FORMAT_EXTENSIBLE" ;
-		break ;
-		} ;
-	return "Unknown format" ;
-} /* wav_format_str */
+
--- a/common/libsndfile/src/wav.h
+++ /dev/null
@@ -1,126 +1,0 @@
-#ifndef WAV_H_INCLUDED
-#define WAV_H_INCLUDED
-
-#ifdef _WIN32
-	#pragma pack(push,1)
-#endif
-
-typedef	struct
-{	unsigned short	format ;
-	unsigned short	channels ;
-	unsigned int	samplerate ;
-	unsigned int	bytespersec ;
-	unsigned short	blockalign ;
-	unsigned short	bitwidth ;
-} MIN_WAV_FMT ;
-
-typedef	struct 
-{	unsigned short	format ;
-	unsigned short	channels ;
-	unsigned int	samplerate ;
-	unsigned int	bytespersec ;
-	unsigned short	blockalign ;
-	unsigned short	bitwidth ;
-	unsigned short	extrabytes ;
-	unsigned short	dummy ;
-} WAV_FMT_SIZE20 ;
-
-typedef	struct
-{	unsigned short	format ;
-	unsigned short	channels ;
-	unsigned int	samplerate ;
-	unsigned int	bytespersec ;
-	unsigned short	blockalign ;
-	unsigned short	bitwidth ;
-	unsigned short	extrabytes ;
-	unsigned short	samplesperblock ;
-	unsigned short	numcoeffs ;
-	struct
-	{	short	coeff1 ;
-		short	coeff2 ;
-	}	coeffs [7] ;
-} MS_ADPCM_WAV_FMT ;
-
-typedef	struct
-{	unsigned short	format ;
-	unsigned short	channels ;
-	unsigned int	samplerate ;
-	unsigned int	bytespersec ;
-	unsigned short	blockalign ;
-	unsigned short	bitwidth ;
-	unsigned short	extrabytes ;
-	unsigned short	samplesperblock ;
-} IMA_ADPCM_WAV_FMT ;
-
-typedef	struct
-{	unsigned short	format ;
-	unsigned short	channels ;
-	unsigned int	samplerate ;
-	unsigned int	bytespersec ;
-	unsigned short	blockalign ;
-	unsigned short	bitwidth ;
-	unsigned short	extrabytes ;
-	unsigned short	samplesperblock ;
-} GSM610_WAV_FMT ;
-
-typedef struct
-{	unsigned int	esf_field1 ;
-	unsigned short	esf_field2 ;
-	unsigned short	esf_field3 ;
-	unsigned char	esf_field4 [8] ;
-} EXT_SUBFORMAT ;
-
-typedef	struct
-{	unsigned short	format ;
-	unsigned short	channels ;
-	unsigned int	samplerate ;
-	unsigned int	bytespersec ;
-	unsigned short	blockalign ;
-	unsigned short	bitwidth ;
-	unsigned short	extrabytes ;
-	unsigned short	validbits ;
-	unsigned int	channelmask ;
-	EXT_SUBFORMAT	esf ;
-} EXTENSIBLE_WAV_FMT ;
-
-typedef union
-{	unsigned short		format ;
-	MIN_WAV_FMT			min ;
-	IMA_ADPCM_WAV_FMT	ima ;
-	MS_ADPCM_WAV_FMT	msadpcm ;
-	EXTENSIBLE_WAV_FMT	ext ;
-	GSM610_WAV_FMT		gsm610 ;
-	WAV_FMT_SIZE20		size20 ;
-	char				padding [512] ;
-} WAV_FMT ;
-
-typedef struct
-{	unsigned int samples ;
-} FACT_CHUNK ;
-
-/*------------------------------------------------------------------------------------ 
-**	Functions defined in wav_ima_adpcm.c
-*/
-
-int		wav_ima_reader_init (SF_PRIVATE *psf, WAV_FMT *fmt) ;
-int		wav_ima_writer_init (SF_PRIVATE *psf) ;
-
-/*------------------------------------------------------------------------------------ 
-**	Functions defined in wav_ms_adpcm.c
-*/
-
-int		wav_msadpcm_reader_init (SF_PRIVATE *psf, WAV_FMT *fmt) ;
-int		wav_msadpcm_writer_init (SF_PRIVATE *psf) ;
-
-/*------------------------------------------------------------------------------------ 
-**	Functions defined in wav_gsm610.c
-*/
-
-int		wav_gsm610_reader_init (SF_PRIVATE *psf, WAV_FMT *fmt) ;
-int		wav_gsm610_writer_init (SF_PRIVATE *psf) ;
-
-#ifdef _WIN32
-	#pragma pack(pop,1)
-#endif
-
-#endif
--- a/common/libsndfile/src/wav_gsm610.c
+++ /dev/null
@@ -1,624 +1,0 @@
-/*
-** Copyright (C) 1999-2001 Erik de Castro Lopo <[email protected]>
-**  
-** This program is free software; you can redistribute it and/or modify
-** it under the terms of the GNU Lesser General Public License as published by
-** the Free Software Foundation; either version 2.1 of the License, or
-** (at your option) any later version.
-** 
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-** GNU Lesser General Public License for more details.
-** 
-** You should have received a copy of the GNU Lesser General Public License
-** along with this program; if not, write to the Free Software 
-** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-*/
-
-
-#include	<stdio.h>
-#include	<unistd.h>
-#include	<string.h>
-#include	<math.h>
-
-#include	"sndfile.h"
-#include	"config.h"
-#include	"sfendian.h"
-#include	"floatcast.h"
-#include	"common.h"
-#include	"wav.h"
-#include	"GSM610/gsm.h"
-
-#if (CPU_IS_LITTLE_ENDIAN == 1)
-#	define	MAKE_MARKER(a,b,c,d)		((a)|((b)<<8)|((c)<<16)|((d)<<24))
-#elif (CPU_IS_BIG_ENDIAN == 1)
-#	define	MAKE_MARKER(a,b,c,d)		(((a)<<24)|((b)<<16)|((c)<<8)|(d))
-#else
-#	error "Cannot determine endian-ness of processor."
-#endif
-
-#define RIFF_MARKER	(MAKE_MARKER ('R', 'I', 'F', 'F')) 
-#define WAVE_MARKER	(MAKE_MARKER ('W', 'A', 'V', 'E')) 
-#define fmt_MARKER	(MAKE_MARKER ('f', 'm', 't', ' ')) 
-#define fact_MARKER	(MAKE_MARKER ('f', 'a', 'c', 't')) 
-#define data_MARKER	(MAKE_MARKER ('d', 'a', 't', 'a')) 
-
-#define 	WAVE_FORMAT_GSM610	0x0031
-
-#define		GSM610_BLOCKSIZE	65
-#define		GSM610_SAMPLES		320
-
-typedef struct
-{	unsigned int	blocks ; 
-	int				blockcount, samplecount ;
-	unsigned char	block [GSM610_BLOCKSIZE] ;
-	short			samples [GSM610_SAMPLES] ;
-	gsm				gsm_data ;
-} GSM610_PRIVATE ;
-
-
-static	int	wav_gsm610_read_block (SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610) ;
-static	int wav_gsm610_read (SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610, short *ptr, int len) ;
-
-static	int	wav_gsm610_write_block (SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610) ;
-static	int wav_gsm610_write (SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610, short *ptr, int len) ;
-
-static long  wav_gsm610_seek   (SF_PRIVATE *psf, long offset, int whence) ;
-
-static int	wav_gsm610_read_s (SF_PRIVATE *psf, short *ptr, int len) ;
-static int	wav_gsm610_read_i (SF_PRIVATE *psf, int *ptr, int len) ;
-static int	wav_gsm610_read_f (SF_PRIVATE *psf, float *ptr, int len) ;
-static int	wav_gsm610_read_d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
-
-static int	wav_gsm610_write_s (SF_PRIVATE *psf, short *ptr, int len) ;
-static int	wav_gsm610_write_i (SF_PRIVATE *psf, int *ptr, int len) ;
-static int	wav_gsm610_write_f (SF_PRIVATE *psf, float *ptr, int len) ;
-static int	wav_gsm610_write_d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
-
-static int	wav_gsm610_close	(SF_PRIVATE  *psf) ;
-static int	wav_gsm610_write_header (SF_PRIVATE  *psf) ;
-
-/*============================================================================================
-** WAV GSM610 Reader initialisation function.
-*/
-
-int	
-wav_gsm610_reader_init (SF_PRIVATE *psf, WAV_FMT *fmt)
-{	GSM610_PRIVATE	*pgsm610 ;
-	int  true = 1 ;
-	
-	psf->sf.seekable = SF_FALSE ;
-	/*-psf->sf.seekable = SF_TRUE ;		-*/
-	psf->seek_func = (func_seek) wav_gsm610_seek ;
-
-	psf->read_short  = (func_short)  wav_gsm610_read_s ;
-	psf->read_int    = (func_int)    wav_gsm610_read_i ;
-	psf->read_float  = (func_float)  wav_gsm610_read_f ;
-	psf->read_double = (func_double) wav_gsm610_read_d ;
-
-	if (psf->mode != SF_MODE_READ)
-		return SFE_BAD_MODE_RW ;
-
-	if (! (pgsm610 = malloc (sizeof (GSM610_PRIVATE))))
-		return SFE_MALLOC_FAILED ;
-
-	psf->fdata = (void*) pgsm610 ;
-
-	memset (pgsm610, 0, sizeof (GSM610_PRIVATE)) ;
-
-	if (! (pgsm610->gsm_data = gsm_create ()))
-		return SFE_MALLOC_FAILED ;
-	gsm_option (pgsm610->gsm_data,  GSM_OPT_WAV49, &true) ;
-
-	if (psf->datalength % GSM610_BLOCKSIZE)
-	{	psf_log_printf (psf, "*** Warning : data chunk seems to be truncated.\n") ;
-		pgsm610->blocks = psf->datalength / GSM610_BLOCKSIZE + 1 ;
-		}
-	else
-		pgsm610->blocks = psf->datalength / GSM610_BLOCKSIZE ;
-	
-	psf->sf.samples = GSM610_SAMPLES * pgsm610->blocks ;
-	
-	wav_gsm610_read_block (psf, pgsm610) ;	/* Read first block. */
-	
-	return 0 ;	
-} /* wav_gsm610_reader_init */
-
-/*============================================================================================
-** WAV GSM610 writer initialisation function.
-*/
-
-int	
-wav_gsm610_writer_init (SF_PRIVATE *psf)
-{	GSM610_PRIVATE	*pgsm610 ;
-	int  true = 1, samplesperblock, bytespersec ;
-	
-	if (psf->mode != SF_MODE_WRITE)
-		return SFE_BAD_MODE_RW ;
-
-	if (! (pgsm610 = malloc (sizeof (GSM610_PRIVATE))))
-		return SFE_MALLOC_FAILED ;
-		
-	psf->fdata = (void*) pgsm610 ;
-
-	memset (pgsm610, 0, sizeof (GSM610_PRIVATE)) ;
-	
-	if (! (pgsm610->gsm_data = gsm_create ()))
-		return SFE_MALLOC_FAILED ;
-	gsm_option (pgsm610->gsm_data,  GSM_OPT_WAV49, &true) ;
-
-	pgsm610->blockcount  = 0 ;
-	pgsm610->samplecount = 0 ;
-	
-	samplesperblock = GSM610_SAMPLES ;
-	bytespersec     = psf->sf.samplerate * GSM610_BLOCKSIZE / GSM610_SAMPLES ;
-	
-	if (bytespersec * GSM610_SAMPLES / GSM610_BLOCKSIZE < psf->sf.samplerate) 
-		bytespersec ++ ;
-
-	psf->datalength  = (psf->sf.samples / samplesperblock) * samplesperblock ;
-	if (psf->sf.samples % samplesperblock)
-		psf->datalength += samplesperblock ;
-
-	wav_gsm610_write_header (psf) ;
-
-	psf->write_short  = (func_short)   wav_gsm610_write_s ;
-	psf->write_int    = (func_int)     wav_gsm610_write_i ;
-	psf->write_float  = (func_float)   wav_gsm610_write_f ;
-	psf->write_double = (func_double)  wav_gsm610_write_d ;
-	
-	psf->seek_func    = NULL ; /* Not seekable */
-	psf->close        = (func_close)   wav_gsm610_close ;
-	psf->write_header = (func_wr_hdr)  wav_gsm610_write_header ;
-					
-	return 0 ;
-} /* wav_gsm610_writer_init */
-
-/*============================================================================================
-** GSM 6.10 Read Functions.
-*/
-
-static int		
-wav_gsm610_read_block (SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610)
-{	int	k ;
-	
-	pgsm610->blockcount ++ ;
-	pgsm610->samplecount = 0 ;
-	
-	if (pgsm610->blockcount > pgsm610->blocks)
-	{	memset (pgsm610->samples, 0, GSM610_SAMPLES * sizeof (short)) ;
-		return 1 ;
-		} ;
-
-	if ((k = fread (pgsm610->block, 1, GSM610_BLOCKSIZE, psf->file)) != GSM610_BLOCKSIZE)
-		psf_log_printf (psf, "*** Warning : short read (%d != %d).\n", k, GSM610_BLOCKSIZE) ;
-
-	if (gsm_decode (pgsm610->gsm_data, pgsm610->block, pgsm610->samples) < 0)
-	{	psf_log_printf (psf, "Error from gsm_decode() on frame : %d\n", pgsm610->blockcount) ;
-		return 0 ;
-		} ;
-			
-	if (gsm_decode (pgsm610->gsm_data, pgsm610->block+(GSM610_BLOCKSIZE+1)/2, pgsm610->samples+GSM610_SAMPLES/2) < 0)
-	{	psf_log_printf (psf, "Error from gsm_decode() on frame : %d.5\n", pgsm610->blockcount) ;
-		return 0 ;
-		} ;
-
-	return 1 ;
-} /* wav_gsm610_read_block */
-
-static int 
-wav_gsm610_read (SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610, short *ptr, int len)
-{	int		count, total = 0, index = 0 ;
-
-	while (index < len)
-	{	if (pgsm610->blockcount >= pgsm610->blocks && pgsm610->samplecount >= GSM610_SAMPLES)
-		{	memset (&(ptr[index]), 0, (len - index) * sizeof (short)) ;
-			return total ;
-			} ;
-		
-		if (pgsm610->samplecount >= GSM610_SAMPLES)
-			wav_gsm610_read_block (psf, pgsm610) ;
-		
-		count = GSM610_SAMPLES - pgsm610->samplecount ;
-		count = (len - index > count) ? count : len - index ;
-		
-		memcpy (&(ptr[index]), &(pgsm610->samples [pgsm610->samplecount]), count * sizeof (short)) ;
-		index += count ;
-		pgsm610->samplecount += count ;
-		total = index ;
-		} ;
-
-	return total ;		
-} /* wav_gsm610_read */
-
-static int		
-wav_gsm610_read_s (SF_PRIVATE *psf, short *ptr, int len)
-{	GSM610_PRIVATE 	*pgsm610 ; 
-	int				total ;
-
-	if (! psf->fdata)
-		return 0 ;
-	pgsm610 = (GSM610_PRIVATE*) psf->fdata ;
-	
-	total = wav_gsm610_read (psf, pgsm610, ptr, len) ;
-
-	return total ;
-} /* wav_gsm610_read_s */
-
-static int		
-wav_gsm610_read_i  (SF_PRIVATE *psf, int *ptr, int len)
-{	GSM610_PRIVATE *pgsm610 ; 
-	short		*sptr ;
-	int			k, bufferlen, readcount = 0, count ;
-	int			index = 0, total = 0 ;
-
-	if (! psf->fdata)
-		return 0 ;
-	pgsm610 = (GSM610_PRIVATE*) psf->fdata ;
-	
-	sptr = (short*) psf->buffer ;
-	bufferlen = ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (short) ;
-	while (len > 0)
-	{	readcount = (len >= bufferlen) ? bufferlen : len ;
-		count = wav_gsm610_read (psf, pgsm610, sptr, readcount) ;
-		for (k = 0 ; k < readcount ; k++)
-			ptr [index+k] = (int) (sptr [k]) ;
-		index += readcount ;
-		total += count ;
-		len -= readcount ;
-		} ;
-	return total ;
-} /* wav_gsm610_read_i */
-
-static int		
-wav_gsm610_read_f  (SF_PRIVATE *psf, float *ptr, int len)
-{	GSM610_PRIVATE *pgsm610 ; 
-	short		*sptr ;
-	int			k, bufferlen, readcount = 0, count ;
-	int			index = 0, total = 0 ;
-	float		normfact ;
-
-	if (! psf->fdata)
-		return 0 ;
-	pgsm610 = (GSM610_PRIVATE*) psf->fdata ;
-	
-	normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ;
-
-	sptr = (short*) psf->buffer ;
-	bufferlen = ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (short) ;
-	while (len > 0)
-	{	readcount = (len >= bufferlen) ? bufferlen : len ;
-		count = wav_gsm610_read (psf, pgsm610, sptr, readcount) ;
-		for (k = 0 ; k < readcount ; k++)
-			ptr [index+k] = normfact * (sptr [k]) ;
-		index += readcount ;
-		total += count ;
-		len -= readcount ;
-		} ;
-	return total ;
-} /* wav_gsm610_read_d */
-
-static int		
-wav_gsm610_read_d  (SF_PRIVATE *psf, double *ptr, int len, int normalize)
-{	GSM610_PRIVATE *pgsm610 ; 
-	short		*sptr ;
-	int			k, bufferlen, readcount = 0, count ;
-	int			index = 0, total = 0 ;
-	double		normfact ;
-	
-	normfact = (normalize ? 1.0 / ((double) 0x8000) : 1.0) ;
-
-	if (! psf->fdata)
-		return 0 ;
-	pgsm610 = (GSM610_PRIVATE*) psf->fdata ;
-	
-	sptr = (short*) psf->buffer ;
-	bufferlen = ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (short) ;
-	while (len > 0)
-	{	readcount = (len >= bufferlen) ? bufferlen : len ;
-		count = wav_gsm610_read (psf, pgsm610, sptr, readcount) ;
-		for (k = 0 ; k < readcount ; k++)
-			ptr [index+k] = normfact * (double) (sptr [k]) ;
-		index += readcount ;
-		total += count ;
-		len -= readcount ;
-		} ;
-	return total ;
-} /* wav_gsm610_read_d */
-
-static long    
-wav_gsm610_seek   (SF_PRIVATE *psf, long offset, int whence)
-{	GSM610_PRIVATE *pgsm610 ; 
-	int			newblock, newsample ;
-	
-	if (! psf->fdata)
-		return 0 ;
-	pgsm610 = (GSM610_PRIVATE*) psf->fdata ;
-
-	if (! (psf->blockwidth && psf->datalength && psf->dataoffset))
-	{	psf->error = SFE_BAD_SEEK ;
-		return	((long) -1) ;
-		} ;
-		
-	switch (whence)
-	{	case SEEK_SET :
-				if (offset < 0 || offset > pgsm610->blocks * GSM610_SAMPLES)
-				{	psf->error = SFE_BAD_SEEK ;
-					return	((long) -1) ;
-					} ;
-				newblock  = offset / GSM610_SAMPLES ;
-				newsample = offset % GSM610_SAMPLES ;
-				break ;
-				
-		case SEEK_CUR :
-				if (psf->current + offset < 0 || psf->current + offset > pgsm610->blocks * GSM610_SAMPLES)
-				{	psf->error = SFE_BAD_SEEK ;
-					return	((long) -1) ;
-					} ;
-				newblock  = (psf->current + offset) / GSM610_SAMPLES ;
-				newsample = (psf->current + offset) % GSM610_SAMPLES ;
-				break ;
-				
-		case SEEK_END :
-				if (offset > 0 || GSM610_SAMPLES * pgsm610->blocks + offset < 0)
-				{	psf->error = SFE_BAD_SEEK ;
-					return	((long) -1) ;
-					} ;
-				newblock  = (GSM610_SAMPLES * pgsm610->blocks + offset) / GSM610_SAMPLES ;
-				newsample = (GSM610_SAMPLES * pgsm610->blocks + offset) % GSM610_SAMPLES ;
-				break ;
-				
-		default : 
-				psf->error = SFE_BAD_SEEK ;
-				return	((long) -1) ;
-		} ;
-		
-	if (psf->mode == SF_MODE_READ)
-	{	fseek (psf->file, (int) (psf->dataoffset + newblock * GSM610_BLOCKSIZE), SEEK_SET) ;
-		pgsm610->blockcount  = newblock ;
-		wav_gsm610_read_block (psf, pgsm610) ;
-		pgsm610->samplecount = newsample ;
-		}
-	else
-	{	/* What to do about write??? */ 
-		psf->error = SFE_BAD_SEEK ;
-		return	((long) -1) ;
-		} ;
-
-	psf->current = newblock * GSM610_SAMPLES + newsample ;
-	return psf->current ;
-} /* wav_gsm610_seek */
-
-/*==========================================================================================
-** GSM 6.10 Write Functions.
-*/
-
-
-
-/*==========================================================================================
-*/
-
-static int
-wav_gsm610_write_block (SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610)
-{	int k ;
-
-	/* Encode the samples. */
-	gsm_encode (pgsm610->gsm_data, pgsm610->samples, pgsm610->block) ;
-	gsm_encode (pgsm610->gsm_data, pgsm610->samples+GSM610_SAMPLES/2, pgsm610->block+GSM610_BLOCKSIZE/2) ;
-
-	/* Write the block to disk. */
-	if ((k = fwrite (pgsm610->block, 1, GSM610_BLOCKSIZE, psf->file)) != GSM610_BLOCKSIZE)
-		psf_log_printf (psf, "*** Warning : short write (%d != %d).\n", k, GSM610_BLOCKSIZE) ;
-
-	pgsm610->samplecount = 0 ;
-	pgsm610->blockcount ++ ;
-
-	/* Set samples to zero for next block. */
-	memset (pgsm610->samples, 0, GSM610_SAMPLES * sizeof (short)) ;
-
-	return 1 ;
-} /* wav_gsm610_write_block */
-
-static int 
-wav_gsm610_write (SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610, short *ptr, int len)
-{	int		count, total = 0, index = 0 ;
-	
-	while (index < len)
-	{	count = GSM610_SAMPLES - pgsm610->samplecount ;
-
-		if (count > len - index)
-			count = len - index ;
-
-		memcpy (&(pgsm610->samples [pgsm610->samplecount]), &(ptr [index]), count * sizeof (short)) ;
-		index += count ;
-		pgsm610->samplecount += count ;
-		total = index ;
-
-		if (pgsm610->samplecount >= GSM610_SAMPLES)
-			wav_gsm610_write_block (psf, pgsm610) ;	
-		} ;
-
-	return total ;		
-} /* wav_gsm610_write */
-
-static int		
-wav_gsm610_write_s (SF_PRIVATE *psf, short *ptr, int len)
-{	GSM610_PRIVATE 	*pgsm610 ; 
-	int				total ;
-
-	if (! psf->fdata)
-		return 0 ;
-	pgsm610 = (GSM610_PRIVATE*) psf->fdata ;
-	
-	total = wav_gsm610_write (psf, pgsm610, ptr, len) ;
-
-	return total ;
-} /* wav_gsm610_write_s */
-
-static int		
-wav_gsm610_write_i  (SF_PRIVATE *psf, int *ptr, int len)
-{	GSM610_PRIVATE *pgsm610 ; 
-	short		*sptr ;
-	int			k, bufferlen, writecount = 0, count ;
-	int			index = 0, total = 0 ;
-
-	if (! psf->fdata)
-		return 0 ;
-	pgsm610 = (GSM610_PRIVATE*) psf->fdata ;
-	
-	sptr = (short*) psf->buffer ;
-	bufferlen = ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (short) ;
-	while (len > 0)
-	{	writecount = (len >= bufferlen) ? bufferlen : len ;
-		for (k = 0 ; k < writecount ; k++)
-			sptr [k] = (short) ptr [index+k] ;
-		count = wav_gsm610_write (psf, pgsm610, sptr, writecount) ;
-		index += writecount ;
-		total += count ;
-		len -= writecount ;
-		} ;
-	return total ;
-} /* wav_gsm610_write_i */
-
-static int		
-wav_gsm610_write_f  (SF_PRIVATE *psf, float *ptr, int len)
-{	GSM610_PRIVATE *pgsm610 ; 
-	short		*sptr ;
-	int			k, bufferlen, writecount = 0, count ;
-	int			index = 0, total = 0 ;
-	float		normfact ;
-	
-	if (! psf->fdata)
-		return 0 ;
-	pgsm610 = (GSM610_PRIVATE*) psf->fdata ;
-	
-	normfact = (psf->norm_float == SF_TRUE) ? ((float) 0x8000) : 1.0 ;
-	
-	sptr = (short*) psf->buffer ;
-	bufferlen = ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (short) ;
-	while (len > 0)
-	{	writecount = (len >= bufferlen) ? bufferlen : len ;
-		for (k = 0 ; k < writecount ; k++)
-			sptr [k] = FLOAT_TO_SHORT (normfact * ptr [index+k])  ;
-		count = wav_gsm610_write (psf, pgsm610, sptr, writecount) ;
-		index += writecount ;
-		total += count ;
-		len -= writecount ;
-		} ;
-	return total ;
-} /* wav_gsm610_write_f */
-
-static int		
-wav_gsm610_write_d  (SF_PRIVATE *psf, double *ptr, int len, int normalize)
-{	GSM610_PRIVATE *pgsm610 ; 
-	short		*sptr ;
-	int			k, bufferlen, writecount = 0, count ;
-	int			index = 0, total = 0 ;
-	double		normfact ;
-	
-	normfact = (normalize ? (double) 0x8000 : 1.0) ;
-
-	if (! psf->fdata)
-		return 0 ;
-	pgsm610 = (GSM610_PRIVATE*) psf->fdata ;
-	
-	sptr = (short*) psf->buffer ;
-	bufferlen = ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (short) ;
-	while (len > 0)
-	{	writecount = (len >= bufferlen) ? bufferlen : len ;
-		for (k = 0 ; k < writecount ; k++)
-			sptr [k] = DOUBLE_TO_SHORT (normfact * ptr [index+k])  ;
-		count = wav_gsm610_write (psf, pgsm610, sptr, writecount) ;
-		index += writecount ;
-		total += count ;
-		len -= writecount ;
-		} ;
-	return total ;
-} /* wav_gsm610_write_d */
-
-static int
-wav_gsm610_write_header (SF_PRIVATE  *psf)
-{	int  fmt_size, blockalign, samplesperblock, bytespersec ;
-
-	blockalign      = GSM610_BLOCKSIZE ;
-	samplesperblock = GSM610_SAMPLES ;
-	bytespersec     = (psf->sf.samplerate * blockalign) / samplesperblock ;
-
-	/* Reset the current header length to zero. */
-	psf->header [0] = 0 ;
-	psf->headindex = 0 ;
-	fseek (psf->file, 0, SEEK_SET) ;
-
-	/* RIFF marker, length, WAVE and 'fmt ' markers. */		
-	psf_binheader_writef (psf, "mlmm", RIFF_MARKER, psf->filelength - 8, WAVE_MARKER, fmt_MARKER) ;
-
-	/* fmt chunk. */
-	fmt_size = 2 + 2 + 4 + 4 + 2 + 2 + 2 + 2 ;
-	
-	/* fmt : size, WAV format type, channels. */
-	psf_binheader_writef (psf, "lww", fmt_size, WAVE_FORMAT_GSM610, psf->sf.channels) ;
-
-	/* fmt : samplerate, bytespersec. */
-	psf_binheader_writef (psf, "ll", psf->sf.samplerate, bytespersec) ;
-
-	/* fmt : blockalign, bitwidth, extrabytes, samplesperblock. */
-	psf_binheader_writef (psf, "wwww", blockalign, 0, 2, samplesperblock) ;
-
-	/* Fact chunk : marker, chunk size, samples */	
-	psf_binheader_writef (psf, "mll", fact_MARKER, sizeof (int), psf->sf.samples) ;
-
-	/* DATA chunk : marker, datalength. */
-	psf_binheader_writef (psf, "ml", data_MARKER, psf->datalength) ;
-
-	fwrite (psf->header, psf->headindex, 1, psf->file) ;
-
-	psf->dataoffset = psf->headindex ;
-
-	psf->datalength  = (psf->sf.samples / samplesperblock) * samplesperblock ;
-	if (psf->sf.samples % samplesperblock)
-		psf->datalength += samplesperblock ;
-
-	return 0 ;
-} /* wav_gsm610_write_header */
-
-int	
-wav_gsm610_close	(SF_PRIVATE  *psf)
-{	GSM610_PRIVATE *pgsm610 ; 
-
-	if (! psf->fdata)
-		return 0 ;
-
-	pgsm610 = (GSM610_PRIVATE*) psf->fdata ;
-
-	if (psf->mode == SF_MODE_WRITE)
-	{	/*	If a block has been partially assembled, write it out
-		**	as the final block.
-		*/
-	
-		if (pgsm610->samplecount && pgsm610->samplecount < GSM610_SAMPLES)
-			wav_gsm610_write_block (psf, pgsm610) ;	
-
-		/*  Now we know for certain the length of the file we can
-		**  re-write correct values for the RIFF and data chunks.
-		*/
-		 
-		fseek (psf->file, 0, SEEK_END) ;
-		psf->filelength = ftell (psf->file) ;
-
-		psf->sf.samples = GSM610_SAMPLES * pgsm610->blockcount ;
-		psf->datalength = psf->filelength - psf->dataoffset ;
-
-		wav_gsm610_write_header (psf) ;
-		} ;
-
-	if (pgsm610->gsm_data)
-		gsm_destroy (pgsm610->gsm_data) ;
-
-	if (psf->fdata)
-		free (psf->fdata) ;
-	psf->fdata = NULL ;
-
-	return 0 ;
-} /* wav_gsm610_close */
-
--- a/common/libsndfile/src/wav_ima_adpcm.c
+++ /dev/null
@@ -1,816 +1,0 @@
-/*
-** Copyright (C) 1999-2001 Erik de Castro Lopo <[email protected]>
-**  
-** This program is free software; you can redistribute it and/or modify
-** it under the terms of the GNU Lesser General Public License as published by
-** the Free Software Foundation; either version 2.1 of the License, or
-** (at your option) any later version.
-** 
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-** GNU Lesser General Public License for more details.
-** 
-** You should have received a copy of the GNU Lesser General Public License
-** along with this program; if not, write to the Free Software 
-** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-*/
-
-
-#include	<stdio.h>
-#include	<unistd.h>
-#include	<string.h>
-#include	<math.h>
-
-#include	"sndfile.h"
-#include	"config.h"
-#include	"sfendian.h"
-#include	"floatcast.h"
-#include	"common.h"
-#include	"wav.h"
-
-#define RIFF_MARKER	(MAKE_MARKER ('R', 'I', 'F', 'F')) 
-#define WAVE_MARKER	(MAKE_MARKER ('W', 'A', 'V', 'E')) 
-#define fmt_MARKER	(MAKE_MARKER ('f', 'm', 't', ' ')) 
-#define fact_MARKER	(MAKE_MARKER ('f', 'a', 'c', 't')) 
-#define data_MARKER	(MAKE_MARKER ('d', 'a', 't', 'a')) 
-
-#define WAVE_FORMAT_IMA_ADPCM		0x0011		/* Intel Corporation */
-
-typedef struct
-{	unsigned int	channels ;
-	unsigned int	blocksize ;
-	unsigned int	samplesperblock ; 
-} IMA_ADPCM_PUBLIC ;
-
-typedef struct
-{	unsigned int	channels, blocksize, samplesperblock, blocks ; 
-	int				blockcount, samplecount ;
-	int				previous [2] ;
-	int				stepindex [2] ;
-	unsigned char	*block ;
-	short			*samples ;
-	unsigned char	data	[4] ; /* Dummy size */
-} IMA_ADPCM_PRIVATE ;
-
-/*============================================================================================
-** Predefined IMA ADPCM data.
-*/
-
-static int ima_index_adjust [16] = 
-{	-1, -1, -1, -1,		/* +0 - +3, decrease the step size */
-     2,  4,  6,  8,     /* +4 - +7, increase the step size */
-    -1, -1, -1, -1,		/* -0 - -3, decrease the step size */
-     2,  4,  6,  8,		/* -4 - -7, increase the step size */
-} ;
-
-static int ima_step_size [89] = 
-{	7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 19, 21, 23, 25, 28, 31, 34, 37, 41, 45, 
-	50, 55, 60, 66, 73, 80, 88, 97, 107, 118, 130, 143, 157, 173, 190, 209, 230, 
-	253, 279, 307, 337, 371, 408, 449, 494, 544, 598, 658, 724, 796, 876, 963, 
-	1060, 1166, 1282, 1411, 1552, 1707, 1878, 2066, 2272, 2499, 2749, 3024, 3327, 
-	3660, 4026, 4428, 4871, 5358, 5894, 6484, 7132, 7845, 8630, 9493, 10442,
-	11487, 12635, 13899, 15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794, 
-	32767
-} ;
-
-static int	ima_reader_init (SF_PRIVATE *psf, IMA_ADPCM_PUBLIC *public) ;
-static int	ima_writer_init (SF_PRIVATE *psf, IMA_ADPCM_PUBLIC *public) ;
-
-static int ima_read_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima) ;
-static int ima_read (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima, short *ptr, int len) ;
-
-static int ima_write_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima) ;
-static int ima_write (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima, short *ptr, int len) ;
-
-static int ima_read_s (SF_PRIVATE *psf, short *ptr, int len) ;
-static int ima_read_i (SF_PRIVATE *psf, int *ptr, int len) ;
-static int ima_read_f (SF_PRIVATE *psf, float *ptr, int len) ;
-static int ima_read_d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
-
-static int ima_write_s (SF_PRIVATE *psf, short *ptr, int len) ;
-static int ima_write_i (SF_PRIVATE *psf, int *ptr, int len) ;
-static int ima_write_f (SF_PRIVATE *psf, float *ptr, int len) ;
-static int ima_write_d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
-
-static long	ima_seek   (SF_PRIVATE *psf, long offset, int whence) ;
-static int		wav_ima_close			(SF_PRIVATE  *psf) ;
-static int		wav_ima_write_header 	(SF_PRIVATE  *psf) ;
-
-static	unsigned int wav_srate2blocksize (unsigned int srate) ;
-
-/*============================================================================================
-** IMA ADPCM Reader initialisation function.
-*/
-
-int	
-wav_ima_reader_init (SF_PRIVATE *psf, WAV_FMT *fmt)
-{	IMA_ADPCM_PUBLIC public ;
-
-	public.blocksize       = fmt->ima.blockalign ;
-	public.channels        = fmt->ima.channels ;
-	public.samplesperblock = fmt->ima.samplesperblock ;
-	return ima_reader_init (psf, &public) ;
-} /* wav_ima_reader_init */
-
-int	
-wav_ima_writer_init (SF_PRIVATE *psf)
-{	IMA_ADPCM_PUBLIC 	public ;
-	int					error ;
-	
-	public.blocksize = wav_srate2blocksize (psf->sf.samplerate) ;	
-	public.channels  = psf->sf.channels ;
-	public.samplesperblock = 2 * (public.blocksize - 4 * psf->sf.channels) / psf->sf.channels + 1 ;
-	
-	if ((error = ima_writer_init (psf, &public)))
-		return error ;
-		
-	wav_ima_write_header (psf) ;
-
-	psf->write_short  = (func_short)  ima_write_s ;
-	psf->write_int    = (func_int)    ima_write_i ;
-	psf->write_float  = (func_float)  ima_write_f ;
-	psf->write_double = (func_double) ima_write_d ;
-	psf->seek_func    = (func_seek)   ima_seek ;
-	psf->close        = (func_close)  wav_ima_close ;
-	psf->write_header = (func_wr_hdr) wav_ima_write_header ;
-		
-	return 0 ;
-} /* wav_ima_writer_init */
-
-/*============================================================================================
-** IMA ADPCM Read Functions.
-*/
-
-static int
-ima_reader_init (SF_PRIVATE *psf, IMA_ADPCM_PUBLIC *public)
-{	IMA_ADPCM_PRIVATE	*pima ;
-	unsigned int		pimasize, count ;
-	
-	if (psf->mode != SF_MODE_READ)
-		return SFE_BAD_MODE_RW ;
-
-	pimasize = sizeof (IMA_ADPCM_PRIVATE) + public->blocksize + 3 * public->channels * public->samplesperblock ;
-
-	if (! (pima = malloc (pimasize)))
-		return SFE_MALLOC_FAILED ;
-
-	psf->fdata = (void*) pima ;
-
-	memset (pima, 0, pimasize) ;
-
-	pima->block   = (unsigned char*) pima->data ;
-	pima->samples = (short*) (pima->data + public->blocksize) ;
-	
-	pima->channels        = public->channels ;
-	pima->blocksize       = public->blocksize ;
-	pima->samplesperblock = public->samplesperblock ;
-	
-	if (psf->datalength % pima->blocksize)
-	{	psf_log_printf (psf, "*** Warning : data chunk seems to be truncated.\n") ;
-		pima->blocks = psf->datalength / pima->blocksize  + 1 ;
-		}
-	else
-		pima->blocks = psf->datalength / pima->blocksize ;
-	
-	count = 2 * (pima->blocksize - 4 * pima->channels) / pima->channels + 1 ;
-	if (pima->samplesperblock != count)
-		psf_log_printf (psf, "*** Warning : samplesperblock should be %d.\n", count) ;
-
-	psf->sf.samples = pima->samplesperblock * pima->blocks ;
-
-	ima_read_block (psf, pima) ;	/* Read first block. */
-	
-	psf->read_short  = (func_short)  ima_read_s ;
-	psf->read_int    = (func_int)    ima_read_i ;
-	psf->read_float  = (func_float)  ima_read_f ;
-	psf->read_double = (func_double) ima_read_d ;
-
-	psf->seek_func = (func_seek) ima_seek ;
-
-	return 0 ;	
-} /* ima_reader_init */
-
-static int
-ima_read_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima)
-{	int		chan, k, current, blockindex, index, indexstart ;
-	short	step, diff, bytecode, stepindex [2] ;
-	
-	pima->blockcount ++ ;
-	pima->samplecount = 0 ;
-	
-	if (pima->blockcount > pima->blocks)
-	{	memset (pima->samples, 0, pima->samplesperblock * pima->channels * sizeof (short)) ;
-		return 1 ;
-		} ;
-
-	if ((k = fread (pima->block, 1, pima->blocksize, psf->file)) != pima->blocksize)
-		psf_log_printf (psf, "*** Warning : short read (%d != %d).\n", k, pima->blocksize) ;
-
-	/* Read and check the block header. */
-	
-	for (chan = 0 ; chan < pima->channels ; chan++)
-	{	current = pima->block [chan*4] | (pima->block [chan*4+1] << 8) ;
-		if (current & 0x8000)
-			current -= 0x10000 ;
-			
-		stepindex [chan] = pima->block [chan*4+2] ;
-		if (stepindex [chan] < 0)
-			stepindex [chan] = 0 ;
-		else if (stepindex [chan] > 88)
-			stepindex [chan] = 88 ;
-
-		if (pima->block [chan*4+3] != 0)
-			psf_log_printf (psf, "IMA ADPCM synchronisation error.\n") ;
-		
-		pima->samples [chan] = current ;
-
-		/* psf_log_printf (psf, "block %d : channel %d (current, index) : (%d, %d)\n", 
-		**	pima->blockcount, chan,  current, stepindex [chan]) ;
-		*/
-		} ;
-		
-	/* Pull apart the packed 4 bit samples and store them in their
-	** correct sample positions.
-	*/
-	
-	blockindex = 4 * pima->channels ;
-	
-	indexstart = pima->channels ;
-	while (blockindex <  pima->blocksize)
-	{	for (chan = 0 ; chan < pima->channels ; chan++)
-		{	index = indexstart + chan ;
-			for (k = 0 ; k < 4 ; k++)
-			{	bytecode = pima->block [blockindex++] ;
-				pima->samples [index] = bytecode & 0x0F ;
-				index += pima->channels ;
-				pima->samples [index] = (bytecode >> 4) & 0x0F ;
-				index += pima->channels ;
-				} ;
-			} ;
-		indexstart += 8 * pima->channels ;
-		} ;
-		
-	/* Decode the encoded 4 bit samples. */
-	
-	for (k = pima->channels ; k < (pima->samplesperblock * pima->channels) ; k ++)
-	{	chan = (pima->channels > 1) ? (k % 2) : 0 ;
-
-		bytecode = pima->samples [k] & 0xF ;
-		
-		step = ima_step_size [stepindex [chan]] ;
-		current = pima->samples [k - pima->channels] ;
-  
-		diff = step >> 3 ;
-		if (bytecode & 1) 
-			diff += step >> 2 ;
-		if (bytecode & 2) 
-			diff += step >> 1 ;
-		if (bytecode & 4) 
-			diff += step ;
-		if (bytecode & 8) 
-			diff = -diff ;
-
-		current += diff ;
-
-		if (current > 32767) 
-			current = 32767;
-		else if (current < -32768) 
-			current = -32768 ;
-
-		stepindex [chan] += ima_index_adjust [bytecode] ;
-	
-		if (stepindex [chan] < 0) 
-			stepindex [chan] = 0 ;
-		else if (stepindex [chan] > 88) 
-			stepindex [chan] = 88 ;
-
-		pima->samples [k] = current ;
-		} ;
-
-	return 1 ;
-} /* ima_read_block */
-
-static int 
-ima_read (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima, short *ptr, int len)
-{	int		count, total = 0, index = 0 ;
-
-	while (index < len)
-	{	if (pima->blockcount >= pima->blocks && pima->samplecount >= pima->samplesperblock)
-		{	memset (&(ptr[index]), 0, (len - index) * sizeof (short)) ;
-			return total ;
-			} ;
-		
-		if (pima->samplecount >= pima->samplesperblock)
-			ima_read_block (psf, pima) ;
-		
-		count = (pima->samplesperblock - pima->samplecount) * pima->channels ;
-		count = (len - index > count) ? count : len - index ;
-		
-		memcpy (&(ptr[index]), &(pima->samples [pima->samplecount * pima->channels]), count * sizeof (short)) ;
-		index += count ;
-		pima->samplecount += count / pima->channels ;
-		total = index ;
-		} ;
-
-	return total ;		
-} /* ima_read */
-
-static int		
-ima_read_s (SF_PRIVATE *psf, short *ptr, int len)
-{	IMA_ADPCM_PRIVATE 	*pima ; 
-	int				total ;
-
-	if (! psf->fdata)
-		return 0 ;
-	pima = (IMA_ADPCM_PRIVATE*) psf->fdata ;
-	
-	total = ima_read (psf, pima, ptr, len) ;
-
-	return total ;
-} /* ima_read_s */
-
-static int		
-ima_read_i  (SF_PRIVATE *psf, int *ptr, int len)
-{	IMA_ADPCM_PRIVATE *pima ; 
-	short		*sptr ;
-	int			k, bufferlen, readcount = 0, count ;
-	int			index = 0, total = 0 ;
-
-	if (! psf->fdata)
-		return 0 ;
-	pima = (IMA_ADPCM_PRIVATE*) psf->fdata ;
-	
-	sptr = (short*) psf->buffer ;
-	bufferlen = ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (short) ;
-	while (len > 0)
-	{	readcount = (len >= bufferlen) ? bufferlen : len ;
-		count = ima_read (psf, pima, sptr, readcount) ;
-		for (k = 0 ; k < readcount ; k++)
-			ptr [index+k] = (int) (sptr [k]) ;
-		index += readcount ;
-		total += count ;
-		len -= readcount ;
-		} ;
-	return total ;
-} /* ima_read_i */
-
-static int
-ima_read_f  (SF_PRIVATE *psf, float *ptr, int len)
-{	IMA_ADPCM_PRIVATE *pima ; 
-	short		*sptr ;
-	int			k, bufferlen, readcount = 0, count ;
-	int			index = 0, total = 0 ;
-	float		normfact ;
-
-	if (! psf->fdata)
-		return 0 ;
-	pima = (IMA_ADPCM_PRIVATE*) psf->fdata ;
-	
-	normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ;
-
-	sptr = (short*) psf->buffer ;
-	bufferlen = ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (short) ;
-	while (len > 0)
-	{	readcount = (len >= bufferlen) ? bufferlen : len ;
-		count = ima_read (psf, pima, sptr, readcount) ;
-		for (k = 0 ; k < readcount ; k++)
-			ptr [index+k] = normfact * (float) (sptr [k]) ;
-		index += readcount ;
-		total += count ;
-		len -= readcount ;
-		} ;
-	return total ;
-} /* ima_read_f */
-
-static int
-ima_read_d  (SF_PRIVATE *psf, double *ptr, int len, int normalize)
-{	IMA_ADPCM_PRIVATE *pima ; 
-	short		*sptr ;
-	int			k, bufferlen, readcount = 0, count ;
-	int			index = 0, total = 0 ;
-	double 		normfact ;
-	
-	normfact = (normalize ? 1.0 / ((double) 0x8000) : 1.0) ;
-
-	if (! psf->fdata)
-		return 0 ;
-	pima = (IMA_ADPCM_PRIVATE*) psf->fdata ;
-	
-	sptr = (short*) psf->buffer ;
-	bufferlen = ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (short) ;
-	while (len > 0)
-	{	readcount = (len >= bufferlen) ? bufferlen : len ;
-		count = ima_read (psf, pima, sptr, readcount) ;
-		for (k = 0 ; k < readcount ; k++)
-			ptr [index+k] = normfact * (double) (sptr [k]) ;
-		index += readcount ;
-		total += count ;
-		len -= readcount ;
-		} ;
-	return total ;
-} /* ima_read_d */
-
-static long    
-ima_seek   (SF_PRIVATE *psf, long offset, int whence)
-{	IMA_ADPCM_PRIVATE *pima ; 
-	int			newblock, newsample ;
-	
-	if (! psf->fdata)
-		return 0 ;
-	pima = (IMA_ADPCM_PRIVATE*) psf->fdata ;
-
-	if (! (psf->blockwidth && psf->datalength && psf->dataoffset))
-	{	psf->error = SFE_BAD_SEEK ;
-		return	((long) -1) ;
-		} ;
-		
-	switch (whence)
-	{	case SEEK_SET :
-				if (offset < 0 || offset > pima->blocks * pima->samplesperblock)
-				{	psf->error = SFE_BAD_SEEK ;
-					return	((long) -1) ;
-					} ;
-				newblock  = offset / pima->samplesperblock ;
-				newsample = offset % pima->samplesperblock ;
-				break ;
-				
-		case SEEK_CUR :
-				if (psf->current + offset < 0 || psf->current + offset > pima->blocks * pima->samplesperblock)
-				{	psf->error = SFE_BAD_SEEK ;
-					return	((long) -1) ;
-					} ;
-				newblock  = (psf->current + offset) / pima->samplesperblock ;
-				newsample = (psf->current + offset) % pima->samplesperblock ;
-				break ;
-				
-		case SEEK_END :
-				if (offset > 0 || pima->samplesperblock * pima->blocks + offset < 0)
-				{	psf->error = SFE_BAD_SEEK ;
-					return	((long) -1) ;
-					} ;
-				newblock  = (pima->samplesperblock * pima->blocks + offset) / pima->samplesperblock ;
-				newsample = (pima->samplesperblock * pima->blocks + offset) % pima->samplesperblock ;
-				break ;
-				
-		default : 
-				psf->error = SFE_BAD_SEEK ;
-				return	((long) -1) ;
-		} ;
-		
-	if (psf->mode == SF_MODE_READ)
-	{	fseek (psf->file, (int) (psf->dataoffset + newblock * pima->blocksize), SEEK_SET) ;
-		pima->blockcount  = newblock ;
-		ima_read_block (psf, pima) ;
-		pima->samplecount = newsample ;
-		}
-	else
-	{	/* What to do about write??? */ 
-		psf->error = SFE_BAD_SEEK ;
-		return	((long) -1) ;
-		} ;
-
-	psf->current = newblock * pima->samplesperblock + newsample ;
-	return psf->current ;
-} /* ima_seek */
-
-/*==========================================================================================
-** IMA ADPCM Write Functions.
-*/
-
-static int	
-ima_writer_init (SF_PRIVATE *psf, IMA_ADPCM_PUBLIC *public)
-{	IMA_ADPCM_PRIVATE	*pima ;
-	unsigned int 		pimasize ;
-	
-	if (psf->mode != SF_MODE_WRITE)
-		return SFE_BAD_MODE_RW ;
-
-	public->blocksize       = wav_srate2blocksize (psf->sf.samplerate) ;	
-	public->samplesperblock = 2 * (public->blocksize - 4 * public->channels) / public->channels + 1 ;
-
-	pimasize = sizeof (IMA_ADPCM_PRIVATE) + public->blocksize + 3 * public->channels * public->samplesperblock ;
-
-	if (! (pima = malloc (pimasize)))
-		return SFE_MALLOC_FAILED ;
-		
-	psf->fdata = (void*) pima ;
-
-	memset (pima, 0, pimasize) ;
-	
-	pima->channels        = public->channels ;
-	pima->blocksize       = public->blocksize ;
-	pima->samplesperblock = public->samplesperblock ;
-
-	pima->block   = (unsigned char*) pima->data ;
-	pima->samples = (short*) (pima->data + public->blocksize) ;
-	
-	pima->samplecount = 0 ;
-	
-	return 0 ;
-} /* ima_writer_init */
-
-
-
-/*==========================================================================================
-*/
-
-static int		
-ima_write_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima)
-{	int		chan, k, step, diff, vpdiff, blockindex, index, indexstart ;
-	short	bytecode, mask ;
-	
-	/* Write the block header. */
-
-	for (chan = 0 ; chan < pima->channels ; chan++)
-	{	pima->block [chan*4]   = pima->samples [chan] & 0xFF ;
-		pima->block [chan*4+1] = (pima->samples [chan] >> 8) & 0xFF ;
-		
-		pima->block [chan*4+2] = pima->stepindex [chan] ;
-		pima->block [chan*4+3] = 0 ;
-		} ;
-		
-	pima->previous  [0] = pima->samples [0] ;
-	pima->previous  [1] = pima->samples [1] ;
-
-	/* Encode the samples as 4 bit. */
-
-	for (k = pima->channels ; k < (pima->samplesperblock * pima->channels) ; k ++)
-	{	chan = (pima->channels > 1) ? (k % 2) : 0 ;
-	
-		diff = pima->samples [k] - pima->previous [chan] ;
-	
-		bytecode = 0 ;
-		step = ima_step_size [pima->stepindex [chan]] ;
-		vpdiff = step >> 3 ;
-		if (diff < 0) 
-		{	bytecode = 8 ; 
-			diff = -diff ;
-			} ;
-		mask = 4 ;
-		while (mask)
-		{	if (diff >= step)
-			{	bytecode |= mask ;
-				diff -= step ;
-				vpdiff += step ;
-				} ;
-			step >>= 1 ;
-			mask >>= 1 ;
-			} ;
-
-		if (bytecode & 8)
-			pima->previous [chan] -= vpdiff ;
-		else
-			pima->previous [chan] += vpdiff ;
-
-		if (pima->previous [chan] > 32767) 
-			pima->previous [chan] = 32767;
-		else if (pima->previous [chan] < -32768) 
-			pima->previous [chan] = -32768;
-
-		pima->stepindex [chan] += ima_index_adjust [bytecode] ;
-		if (pima->stepindex [chan] < 0)
-			pima->stepindex [chan] = 0 ;
-		else if (pima->stepindex [chan] > 88)
-			pima->stepindex [chan] = 88 ;
-		
-		pima->samples [k] = bytecode ;
-		} ;
-
-	/* Pack the 4 bit encoded samples. */
-
-	blockindex = 4 * pima->channels ;
-	
-	indexstart = pima->channels ;
-	while (blockindex <  pima->blocksize)
-	{	for (chan = 0 ; chan < pima->channels ; chan++)
-		{	index = indexstart + chan ;
-			for (k = 0 ; k < 4 ; k++)
-			{	pima->block [blockindex] = pima->samples [index] & 0x0F ;
-				index += pima->channels ;
-				pima->block [blockindex] |= (pima->samples [index] << 4) & 0xF0 ;
-				index += pima->channels ;
-				blockindex ++ ;
-				} ;
-			} ;
-		indexstart += 8 * pima->channels ;
-		} ;
-		
-	/* Write the block to disk. */
-
-	if ((k = fwrite (pima->block, 1, pima->blocksize, psf->file)) != pima->blocksize)
-		psf_log_printf (psf, "*** Warning : short write (%d != %d).\n", k, pima->blocksize) ;
-		
-	memset (pima->samples, 0, pima->samplesperblock * sizeof (short)) ;
-	pima->samplecount = 0 ;
-			
-	return 1 ;
-} /* ima_write_block */
-
-static int 
-ima_write (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima, short *ptr, int len)
-{	int		count, total = 0, index = 0 ;
-	
-	while (index < len)
-	{	count = (pima->samplesperblock - pima->samplecount) * pima->channels ;
-
-		if (count > len - index)
-			count = len - index ;
-
-		memcpy (&(pima->samples [pima->samplecount * pima->channels]), &(ptr [index]), count * sizeof (short)) ;
-		index += count ;
-		pima->samplecount += count / pima->channels ;
-		total = index ;
-
-		if (pima->samplecount >= pima->samplesperblock)
-			ima_write_block (psf, pima) ;	
-		} ;
-
-	return total ;		
-} /* ima_write */
-
-static int		
-ima_write_s (SF_PRIVATE *psf, short *ptr, int len)
-{	IMA_ADPCM_PRIVATE 	*pima ; 
-	int				total ;
-
-	if (! psf->fdata)
-		return 0 ;
-	pima = (IMA_ADPCM_PRIVATE*) psf->fdata ;
-	
-	total = ima_write (psf, pima, ptr, len) ;
-
-	return total ;
-} /* ima_write_s */
-
-static int		
-ima_write_i  (SF_PRIVATE *psf, int *ptr, int len)
-{	IMA_ADPCM_PRIVATE *pima ; 
-	short		*sptr ;
-	int			k, bufferlen, writecount = 0, count ;
-	int			index = 0, total = 0 ;
-
-	if (! psf->fdata)
-		return 0 ;
-	pima = (IMA_ADPCM_PRIVATE*) psf->fdata ;
-	
-	sptr = (short*) psf->buffer ;
-	bufferlen = ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (short) ;
-	while (len > 0)
-	{	writecount = (len >= bufferlen) ? bufferlen : len ;
-		for (k = 0 ; k < writecount ; k++)
-			sptr [k] = (short) ptr [index+k] ;
-		count = ima_write (psf, pima, sptr, writecount) ;
-		index += writecount ;
-		total += count ;
-		len -= writecount ;
-		} ;
-	return total ;
-} /* ima_write_i */
-
-static int		
-ima_write_f  (SF_PRIVATE *psf, float *ptr, int len)
-{	IMA_ADPCM_PRIVATE *pima ; 
-	short		*sptr ;
-	int			k, bufferlen, writecount = 0, count ;
-	int			index = 0, total = 0 ;
-	float		normfact ;
-
-	if (! psf->fdata)
-		return 0 ;
-	pima = (IMA_ADPCM_PRIVATE*) psf->fdata ;
-	
-	normfact = (psf->norm_float == SF_TRUE) ? ((float) 0x8000) : 1.0 ;
-	
-	sptr = (short*) psf->buffer ;
-	bufferlen = ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (short) ;
-	while (len > 0)
-	{	writecount = (len >= bufferlen) ? bufferlen : len ;
-		for (k = 0 ; k < writecount ; k++)
-			sptr [k] = FLOAT_TO_SHORT (normfact * ptr [index+k])  ;
-		count = ima_write (psf, pima, sptr, writecount) ;
-		index += writecount ;
-		total += count ;
-		len -= writecount ;
-		} ;
-	return total ;
-} /* ima_write_f */
-
-static int		
-ima_write_d  (SF_PRIVATE *psf, double *ptr, int len, int normalize)
-{	IMA_ADPCM_PRIVATE *pima ; 
-	short		*sptr ;
-	int			k, bufferlen, writecount = 0, count ;
-	int			index = 0, total = 0 ;
-	double 		normfact ;
-	
-	normfact = (normalize ? ((double) 0x8000) : 1.0) ;
-
-	if (! psf->fdata)
-		return 0 ;
-	pima = (IMA_ADPCM_PRIVATE*) psf->fdata ;
-	
-	sptr = (short*) psf->buffer ;
-	bufferlen = ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (short) ;
-	while (len > 0)
-	{	writecount = (len >= bufferlen) ? bufferlen : len ;
-		for (k = 0 ; k < writecount ; k++)
-			sptr [k] = DOUBLE_TO_SHORT (normfact * ptr [index+k])  ;
-		count = ima_write (psf, pima, sptr, writecount) ;
-		index += writecount ;
-		total += count ;
-		len -= writecount ;
-		} ;
-	return total ;
-} /* ima_write_d */
-
-static int
-wav_ima_write_header (SF_PRIVATE  *psf)
-{	int  fmt_size, blockalign, samplesperblock, bytespersec ;
-
-	blockalign      = wav_srate2blocksize (psf->sf.samplerate) ;
-	samplesperblock = 2 * (blockalign - 4 * psf->sf.channels) / psf->sf.channels + 1 ;
-	bytespersec     = (psf->sf.samplerate * blockalign) / samplesperblock ;
-
-	/* Reset the current header length to zero. */
-	psf->header [0] = 0 ;
-	psf->headindex = 0 ;
-	fseek (psf->file, 0, SEEK_SET) ;
-
-	/* RIFF marker, length, WAVE and 'fmt ' markers. */		
-	psf_binheader_writef (psf, "mlmm", RIFF_MARKER, psf->filelength - 8, WAVE_MARKER, fmt_MARKER) ;
-
-	/* fmt chunk. */
-	fmt_size = 2 + 2 + 4 + 4 + 2 + 2 + 2 + 2 ;
-	
-	/* fmt : size, WAV format type, channels. */
-	psf_binheader_writef (psf, "lww", fmt_size, WAVE_FORMAT_IMA_ADPCM, psf->sf.channels) ;
-
-	/* fmt : samplerate, bytespersec. */
-	psf_binheader_writef (psf, "ll", psf->sf.samplerate, bytespersec) ;
-
-	/* fmt : blockalign, bitwidth, extrabytes, samplesperblock. */
-	psf_binheader_writef (psf, "wwww", blockalign, 4, 2, samplesperblock) ;
-
-	/* Fact chunk. */	
-	psf_binheader_writef (psf, "mll", fact_MARKER, sizeof (int), psf->sf.samples) ;
-
-	/* DATA chunk. */
-	psf_binheader_writef (psf, "ml", data_MARKER, psf->datalength) ;
-
-	fwrite (psf->header, psf->headindex, 1, psf->file) ;
-
-	psf->dataoffset = psf->headindex ;
-
-	psf->datalength  = (psf->sf.samples / samplesperblock) * samplesperblock ;
-	if (psf->sf.samples % samplesperblock)
-		psf->datalength += samplesperblock ;
-
-	return 0 ;
-} /* wav_ima_write_header */
-
-static int	
-wav_ima_close	(SF_PRIVATE  *psf)
-{	IMA_ADPCM_PRIVATE *pima ; 
-
-	if (! psf->fdata)
-		return 0 ;
-
-	pima = (IMA_ADPCM_PRIVATE*) psf->fdata ;
-
-	if (psf->mode == SF_MODE_WRITE)
-	{	/*	If a block has been partially assembled, write it out
-		**	as the final block.
-		*/
-	
-		if (pima->samplecount && pima->samplecount < pima->samplesperblock)
-			ima_write_block (psf, pima) ;	
-
-		/*  Now we know for certain the length of the file we can
-		**  re-write the header.
-		*/
-		 
-		fseek (psf->file, 0, SEEK_END) ;
-		psf->filelength = ftell (psf->file) ;
-
-		psf->sf.samples = pima->samplesperblock * pima->blockcount ;
-		psf->datalength = psf->filelength - psf->dataoffset ;
-
-		wav_ima_write_header (psf) ;
-		} ;
-
-	if (psf->fdata)
-		free (psf->fdata) ;
-	psf->fdata = NULL ;
-
-	return 0 ;
-} /* wav_ima_close */
-
-static unsigned 
-int wav_srate2blocksize (unsigned int srate)
-{	if (srate < 12000)
-		return 256 ;
-	if (srate < 23000)
-		return 512 ;
-	return 1024 ;
-} /* wav_srate2blocksize */
--- a/common/libsndfile/src/wav_ms_adpcm.c
+++ /dev/null
@@ -1,895 +1,0 @@
-/*
-** Copyright (C) 1999-2001 Erik de Castro Lopo <[email protected]>
-**  
-** This program is free software; you can redistribute it and/or modify
-** it under the terms of the GNU Lesser General Public License as published by
-** the Free Software Foundation; either version 2.1 of the License, or
-** (at your option) any later version.
-** 
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-** GNU Lesser General Public License for more details.
-** 
-** You should have received a copy of the GNU Lesser General Public License
-** along with this program; if not, write to the Free Software 
-** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-*/
-
-
-#include	<stdio.h>
-#include	<unistd.h>
-#include	<string.h>
-#include	<math.h>
-
-#include	"sndfile.h"
-#include	"config.h"
-#include	"sfendian.h"
-#include	"floatcast.h"
-#include	"common.h"
-#include	"wav.h"
-
-/* These required here because we write the header in this file. */
-
-#define RIFF_MARKER	(MAKE_MARKER ('R', 'I', 'F', 'F')) 
-#define WAVE_MARKER	(MAKE_MARKER ('W', 'A', 'V', 'E')) 
-#define fmt_MARKER	(MAKE_MARKER ('f', 'm', 't', ' ')) 
-#define fact_MARKER	(MAKE_MARKER ('f', 'a', 'c', 't')) 
-#define data_MARKER	(MAKE_MARKER ('d', 'a', 't', 'a')) 
-
-#define WAVE_FORMAT_MS_ADPCM	0x0002
-
-typedef struct
-{	unsigned int	channels, blocksize, samplesperblock, blocks, dataremaining ; 
-	int				blockcount, samplecount ;
-	unsigned char	*block ;
-	short			*samples ;
-	unsigned char	dummydata [4] ; /* Dummy size */
-} MSADPCM_PRIVATE ;
-
-/*============================================================================================
-** MS ADPCM static data and functions.
-*/
-
-static int AdaptationTable []    = 
-{	230, 230, 230, 230, 307, 409, 512, 614,
-	768, 614, 512, 409, 307, 230, 230, 230 
-} ;
-
-/* TODO : The first 7 coef's are are always hardcode and must
-   appear in the actual WAVE file.  They should be read in
-   in case a sound program added extras to the list. */
-
-static int AdaptCoeff1 [] = 
-{	256, 512, 0, 192, 240, 460, 392 
-} ;
-
-static int AdaptCoeff2 [] = 
-{	0, -256, 0, 64, 0, -208, -232
-} ;
-
-/*============================================================================================
-**	MS ADPCM Block Layout.
-**	======================
-**	Block is usually 256, 512 or 1024 bytes depending on sample rate.
-**	For a mono file, the block is laid out as follows:
-**		byte	purpose
-**		0		block predictor [0..6]
-**		1,2		initial idelta (positive)
-**		3,4		sample 1
-**		5,6		sample 0
-**		7..n	packed bytecodes
-**
-**	For a stereo file, the block is laid out as follows:
-**		byte	purpose
-**		0		block predictor [0..6] for left channel
-**		1		block predictor [0..6] for right channel
-**		2,3		initial idelta (positive) for left channel
-**		4,5		initial idelta (positive) for right channel
-**		6,7		sample 1 for left channel
-**		8,9		sample 1 for right channel
-**		10,11	sample 0 for left channel
-**		12,13	sample 0 for right channel
-**		14..n	packed bytecodes
-*/
-
-/*============================================================================================
-** Static functions.
-*/
-
-static	int	msadpcm_decode_block (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms) ;
-static	int msadpcm_read (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms, short *ptr, int len) ;
-
-static	int	msadpcm_encode_block (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms) ;
-static	int msadpcm_write (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms, short *ptr, int len) ;
-
-static	int	msadpcm_read_s (SF_PRIVATE *psf, short *ptr, int len) ;
-static	int	msadpcm_read_i (SF_PRIVATE *psf, int *ptr, int len) ;
-static	int	msadpcm_read_f (SF_PRIVATE *psf, float *ptr, int len) ;
-static	int	msadpcm_read_d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
-
-static int	msadpcm_write_s (SF_PRIVATE *psf, short *ptr, int len) ;
-static int	msadpcm_write_i  (SF_PRIVATE *psf, int *ptr, int len) ;
-static int	msadpcm_write_f  (SF_PRIVATE *psf, float *ptr, int len) ;
-static int	msadpcm_write_d  (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
-
-static long msadpcm_seek   (SF_PRIVATE *psf, long offset, int whence) ;
-static	int	msadpcm_close	(SF_PRIVATE  *psf) ;
-
-static int	msadpcm_write_header (SF_PRIVATE  *psf) ;
-
-static	unsigned int srate2blocksize (unsigned int srate_chan_product) ;
-static	void	choose_predictor (unsigned int channels, short *data, int *bpred, int *idelta) ;
-
-/*============================================================================================
-** MS ADPCM Read Functions.
-*/
-
-int	
-wav_msadpcm_reader_init (SF_PRIVATE *psf, WAV_FMT *fmt)
-{	MSADPCM_PRIVATE	*pms ;
-	unsigned int	pmssize ;
-	int				count ;
-	
-	pmssize = sizeof (MSADPCM_PRIVATE) + fmt->msadpcm.blockalign + 3 * fmt->msadpcm.channels * fmt->msadpcm.samplesperblock ;
-
-	if (! (psf->fdata = malloc (pmssize)))
-		return SFE_MALLOC_FAILED ;
-	pms = (MSADPCM_PRIVATE*) psf->fdata ;
-	memset (pms, 0, pmssize) ;
-	
-	pms->block   = (unsigned char*) pms->dummydata ;
-	pms->samples = (short*) (pms->dummydata + fmt->msadpcm.blockalign) ;
-	
-	pms->channels        = fmt->msadpcm.channels ;
-	pms->blocksize       = fmt->msadpcm.blockalign ;
-	pms->samplesperblock = fmt->msadpcm.samplesperblock ;
-
-	pms->dataremaining	 = psf->datalength ;
-
-	if (psf->datalength % pms->blocksize)
-		pms->blocks = psf->datalength / pms->blocksize  + 1 ;
-	else
-		pms->blocks = psf->datalength / pms->blocksize ;
-
-	count = 2 * (pms->blocksize - 6 * pms->channels) / pms->channels ;
-	if (pms->samplesperblock != count)
-		psf_log_printf (psf, "*** Warning : samplesperblock shoud be %d.\n", count) ;
-
-	psf->sf.samples = (psf->datalength / pms->blocksize) * pms->samplesperblock ;
-
-	psf_log_printf (psf, " bpred   idelta\n") ;
-
-	msadpcm_decode_block (psf, pms) ;
-	
-	psf->read_short  = (func_short)  msadpcm_read_s ;
-	psf->read_int    = (func_int)    msadpcm_read_i ;
-	psf->read_float  = (func_float)  msadpcm_read_f ;
-	psf->read_double = (func_double) msadpcm_read_d ;
-
-	psf->seek_func   = (func_seek)   msadpcm_seek ;
-
-	return 0 ;
-} /* wav_msadpcm_reader_init */
-
-static int		
-msadpcm_decode_block (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms)
-{	int		chan, k, blockindex, sampleindex ;
-	short	bytecode, bpred [2], chan_idelta [2] ;
-	
-    int predict ;
-    int current ;
-    int idelta ;
-
-	pms->blockcount ++ ;
-	pms->samplecount = 0 ;
-	
-	if (pms->blockcount > pms->blocks)
-	{	memset (pms->samples, 0, pms->samplesperblock * pms->channels) ;
-		return 1 ;
-		} ;
-
-	if ((k = fread (pms->block, 1, pms->blocksize, psf->file)) != pms->blocksize)
-		psf_log_printf (psf, "*** Warning : short read (%d != %d).\n", k, pms->blocksize) ;
-
-	/* Read and check the block header. */
-	
-	if (pms->channels == 1)
-	{	bpred [0] = pms->block [0] ;
-	
-		if (bpred [0] >= 7)
-			psf_log_printf (psf, "MS ADPCM synchronisation error (%d).\n", bpred [0]) ;
-	
-		chan_idelta [0] = pms->block [1] | (pms->block [2] << 8) ;
-		chan_idelta [1] = 0 ;
-
-		psf_log_printf (psf, "(%d) (%d)\n", bpred [0], chan_idelta [0]) ;
-
-		pms->samples [1] = pms->block [3] | (pms->block [4] << 8) ;
-		pms->samples [0] = pms->block [5] | (pms->block [6] << 8) ;
-		blockindex = 7 ;
-		}
-	else
-	{	bpred [0] = pms->block [0] ;
-		bpred [1] = pms->block [1] ;
-	
-		if (bpred [0] >= 7 || bpred [1] >= 7)
-			psf_log_printf (psf, "MS ADPCM synchronisation error (%d %d).\n", bpred [0], bpred [1]) ;
-	
-		chan_idelta [0] = pms->block [2] | (pms->block [3] << 8) ;
-		chan_idelta [1] = pms->block [4] | (pms->block [5] << 8) ;
-
-		psf_log_printf (psf, "(%d, %d) (%d, %d)\n", bpred [0], bpred [1], chan_idelta [0], chan_idelta [1]) ;
-
-		pms->samples [2] = pms->block [6] | (pms->block [7] << 8) ;
-		pms->samples [3] = pms->block [8] | (pms->block [9] << 8) ;
-
-		pms->samples [0] = pms->block [10] | (pms->block [11] << 8) ;
-		pms->samples [1] = pms->block [12] | (pms->block [13] << 8) ;
-
-		blockindex = 14 ;
-		} ;
-
-    if (chan_idelta [0] & 0x8000) 
-		chan_idelta [0] -= 0x10000 ;
-    if (chan_idelta [1] & 0x8000) 
-		chan_idelta [1] -= 0x10000 ;
-		
-	/* Pull apart the packed 4 bit samples and store them in their
-	** correct sample positions.
-	*/
-	
-	sampleindex = 2 * pms->channels ;
-	while (blockindex <  pms->blocksize)
-	{	bytecode = pms->block [blockindex++] ;
-  		pms->samples [sampleindex++] = (bytecode >> 4) & 0x0F ;
-		pms->samples [sampleindex++] = bytecode & 0x0F ;
-		} ;
-		
-	/* Decode the encoded 4 bit samples. */
-	
-	for (k = 2 * pms->channels ; k < (pms->samplesperblock * pms->channels) ; k ++)
-	{	chan = (pms->channels > 1) ? (k % 2) : 0 ;
-
-		bytecode = pms->samples [k] & 0xF ;
-
-	    /** Compute next Adaptive Scale Factor (ASF) **/
-	    idelta = chan_idelta [chan] ;
-	    chan_idelta [chan] = (AdaptationTable [bytecode] * idelta) >> 8 ; /* => / 256 => FIXED_POINT_ADAPTATION_BASE == 256 */
-	    if (chan_idelta [chan] < 16) 
-			chan_idelta [chan] = 16 ;
-	    if (bytecode & 0x8) 
-			bytecode -= 0x10 ;
-		
-    	predict = ((pms->samples [k - pms->channels] * AdaptCoeff1 [bpred [chan]]) 
-					+ (pms->samples [k - 2 * pms->channels] * AdaptCoeff2 [bpred [chan]])) >> 8 ; /* => / 256 => FIXED_POINT_COEFF_BASE == 256 */
-    	current = (bytecode * idelta) + predict;
-    
-	    if (current > 32767) 
-			current = 32767 ;
-	    else if (current < -32768) 
-			current = -32768 ;
-    
-		pms->samples [k] = current ;
-		} ;
-
-	return 1 ;
-} /* msadpcm_decode_block */
-
-static int 
-msadpcm_read (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms, short *ptr, int len)
-{	int		count, total = 0, index = 0 ;
-	
-	while (index < len)
-	{	if (pms->blockcount >= pms->blocks && pms->samplecount >= pms->samplesperblock)
-		{	memset (&(ptr[index]), 0, (len - index) * sizeof (short)) ;
-			return total ;
-			} ;
-		
-		if (pms->samplecount >= pms->samplesperblock)
-			msadpcm_decode_block (psf, pms) ;
-		
-		count = (pms->samplesperblock - pms->samplecount) * pms->channels ;
-		count = (len - index > count) ? count : len - index ;
-		
-		memcpy (&(ptr[index]), &(pms->samples [pms->samplecount * pms->channels]), count * sizeof (short)) ;
-		index += count ;
-		pms->samplecount += count / pms->channels ;
-		total = index ;
-		} ;
-
-	return total ;		
-} /* msadpcm_read */
-
-static int		
-msadpcm_read_s (SF_PRIVATE *psf, short *ptr, int len)
-{	MSADPCM_PRIVATE 	*pms ; 
-	int				total ;
-
-	if (! psf->fdata)
-		return 0 ;
-	pms = (MSADPCM_PRIVATE*) psf->fdata ;
-	
-	total = msadpcm_read (psf, pms, ptr, len) ;
-
-	return total ;
-} /* msadpcm_read_s */
-
-static int		
-msadpcm_read_i  (SF_PRIVATE *psf, int *ptr, int len)
-{	MSADPCM_PRIVATE *pms ; 
-	short		*sptr ;
-	int			k, bufferlen, readcount = 0, count ;
-	int			index = 0, total = 0 ;
-
-	if (! psf->fdata)
-		return 0 ;
-	pms = (MSADPCM_PRIVATE*) psf->fdata ;
-	
-	sptr = (short*) psf->buffer ;
-	bufferlen = ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (short) ;
-	while (len > 0)
-	{	readcount = (len >= bufferlen) ? bufferlen : len ;
-		count = msadpcm_read (psf, pms, sptr, readcount) ;
-		for (k = 0 ; k < readcount ; k++)
-			ptr [index+k] = (int) (sptr [k]) ;
-		index += readcount ;
-		total += count ;
-		len -= readcount ;
-		} ;
-	return total ;
-} /* msadpcm_read_i */
-
-static int
-msadpcm_read_f  (SF_PRIVATE *psf, float *ptr, int len)
-{	MSADPCM_PRIVATE *pms ; 
-	short		*sptr ;
-	int			k, bufferlen, readcount = 0, count ;
-	int			index = 0, total = 0 ;
-	float		normfact ;
-
-	if (! psf->fdata)
-		return 0 ;
-	pms = (MSADPCM_PRIVATE*) psf->fdata ;
-	
-	normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ;
-	sptr = (short*) psf->buffer ;
-	bufferlen = ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (short) ;
-	while (len > 0)
-	{	readcount = (len >= bufferlen) ? bufferlen : len ;
-		count = msadpcm_read (psf, pms, sptr, readcount) ;
-		for (k = 0 ; k < readcount ; k++)
-			ptr [index+k] = normfact * (float) (sptr [k]) ;
-		index += readcount ;
-		total += count ;
-		len -= readcount ;
-		} ;
-	return total ;
-} /* msadpcm_read_f */
-
-static int		
-msadpcm_read_d  (SF_PRIVATE *psf, double *ptr, int len, int normalize)
-{	MSADPCM_PRIVATE *pms ; 
-	short		*sptr ;
-	int			k, bufferlen, readcount = 0, count ;
-	int			index = 0, total = 0 ;
-	double 		normfact ;
-	
-	normfact = (normalize ? 1.0 / ((double) 0x8000) : 1.0) ;
-
-	if (! psf->fdata)
-		return 0 ;
-	pms = (MSADPCM_PRIVATE*) psf->fdata ;
-	
-	sptr = (short*) psf->buffer ;
-	bufferlen = ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (short) ;
-	while (len > 0)
-	{	readcount = (len >= bufferlen) ? bufferlen : len ;
-		count = msadpcm_read (psf, pms, sptr, readcount) ;
-		for (k = 0 ; k < readcount ; k++)
-			ptr [index+k] = normfact * (double) (sptr [k]) ;
-		index += readcount ;
-		total += count ;
-		len -= readcount ;
-		} ;
-	return total ;
-} /* msadpcm_read_d */
-
-static long    
-msadpcm_seek   (SF_PRIVATE *psf, long offset, int whence)
-{	MSADPCM_PRIVATE *pms ; 
-	int			newblock, newsample ;
-	
-	if (! psf->fdata)
-		return 0 ;
-	pms = (MSADPCM_PRIVATE*) psf->fdata ;
-
-	if (! (psf->blockwidth && psf->datalength && psf->dataoffset))
-	{	psf->error = SFE_BAD_SEEK ;
-		return	((long) -1) ;
-		} ;
-		
-	switch (whence)
-	{	case SEEK_SET :
-				if (offset < 0 || offset > pms->blocks * pms->samplesperblock)
-				{	psf->error = SFE_BAD_SEEK ;
-					return	((long) -1) ;
-					} ;
-				newblock  = offset / pms->samplesperblock ;
-				newsample = offset % pms->samplesperblock ;
-				break ;
-				
-		case SEEK_CUR :
-				if (psf->current + offset < 0 || psf->current + offset > pms->blocks * pms->samplesperblock)
-				{	psf->error = SFE_BAD_SEEK ;
-					return	((long) -1) ;
-					} ;
-				newblock  = (psf->current + offset) / pms->samplesperblock ;
-				newsample = (psf->current + offset) % pms->samplesperblock ;
-				break ;
-				
-		case SEEK_END :
-				if (offset > 0 || pms->samplesperblock * pms->blocks + offset < 0)
-				{	psf->error = SFE_BAD_SEEK ;
-					return	((long) -1) ;
-					} ;
-				newblock  = (pms->samplesperblock * pms->blocks + offset) / pms->samplesperblock ;
-				newsample = (pms->samplesperblock * pms->blocks + offset) % pms->samplesperblock ;
-				break ;
-				
-		default : 
-				psf->error = SFE_BAD_SEEK ;
-				return	((long) -1) ;
-		} ;
-		
-	if (psf->mode == SF_MODE_READ)
-	{	fseek (psf->file, (int) (psf->dataoffset + newblock * pms->blocksize), SEEK_SET) ;
-		pms->blockcount  = newblock ;
-		msadpcm_decode_block (psf, pms) ;
-		pms->samplecount = newsample ;
-		}
-	else
-	{	/* What to do about write??? */ 
-		psf->error = SFE_BAD_SEEK ;
-		return	((long) -1) ;
-		} ;
-
-	psf->current = newblock * pms->samplesperblock + newsample ;
-	return psf->current ;
-} /* msadpcm_seek */
-
-/*==========================================================================================
-** MS ADPCM Write Functions.
-*/
-
-int	
-wav_msadpcm_writer_init (SF_PRIVATE *psf)
-{	MSADPCM_PRIVATE	*pms ;
-	unsigned int 	pmssize, blockalign, samplesperblock ;
-	
-	blockalign      = srate2blocksize (psf->sf.samplerate * psf->sf.channels) ;	
-	samplesperblock = 2 + 2 * (blockalign - 7 * psf->sf.channels) / psf->sf.channels ;
-	
-	pmssize = sizeof (MSADPCM_PRIVATE) + blockalign + 3 * psf->sf.channels * samplesperblock ;
-
-	if (! (psf->fdata = malloc (pmssize)))
-		return SFE_MALLOC_FAILED ;
-	pms = (MSADPCM_PRIVATE*) psf->fdata ;
-	memset (pms, 0, pmssize) ;
-	
-	pms->channels        = psf->sf.channels ;
-	pms->blocksize       = blockalign ;
-	pms->samplesperblock = samplesperblock ;
-
-	pms->block   = (unsigned char*) pms->dummydata ;
-	pms->samples = (short*) (pms->dummydata + blockalign) ;
-	
-	pms->samplecount = 0 ;
-	
-	msadpcm_write_header (psf) ;
-	
-	psf->write_short  = (func_short)   msadpcm_write_s ;
-	psf->write_int    = (func_int)     msadpcm_write_i ;
-	psf->write_float  = (func_float)   msadpcm_write_f ;
-	psf->write_double = (func_double)  msadpcm_write_d ;
-	
-	psf->seek_func    = (func_seek)    msadpcm_seek ;
-	psf->close        = (func_close)   msadpcm_close ;
-	psf->write_header = (func_wr_hdr)  msadpcm_write_header ;
-
-	return 0 ;
-} /* wav_msadpcm_writer_init */
-
-/*==========================================================================================
-*/
-
-static int		
-msadpcm_encode_block (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms)
-{	unsigned int	blockindex ;
-	unsigned char	byte ;
-	int				chan, k, predict, bpred [2], idelta [2], errordelta, newsamp ;
-	
-	choose_predictor (pms->channels, pms->samples, bpred, idelta) ;
-
-	/* Write the block header. */
-
-	if (pms->channels == 1)
-	{	pms->block [0]	= bpred [0] ;	
-		pms->block [1]	= idelta [0] & 0xFF ;
-		pms->block [2]	= idelta [0] >> 8 ;
-		pms->block [3]	= pms->samples [1] & 0xFF ;
-		pms->block [4]	= pms->samples [1] >> 8 ;
-		pms->block [5]	= pms->samples [0] & 0xFF ;
-		pms->block [6]	= pms->samples [0] >> 8 ;
-
-		blockindex = 7 ;
-		byte = 0 ;
-
-		/* Encode the samples as 4 bit. */
-		
-		for (k = 2 ; k < pms->samplesperblock ; k++)
-		{	predict = (pms->samples [k-1] * AdaptCoeff1 [bpred [0]] + pms->samples [k-2] * AdaptCoeff2 [bpred [0]]) >> 8 ;
-			errordelta = (pms->samples [k] - predict) / idelta [0] ;
-			if (errordelta < -8)
-				errordelta = -8 ;
-			else if (errordelta > 7)
-				errordelta = 7 ;
-			newsamp = predict + (idelta [0] * errordelta) ;
-			if (newsamp > 32767)
-				newsamp = 32767 ;
-			else if (newsamp < -32768)
-				newsamp = -32768 ;
-			if (errordelta < 0)
-				errordelta += 0x10 ;
-				
-			byte = (byte << 4) | (errordelta & 0xF) ;
-			if (k % 2)
-			{	pms->block [blockindex++] = byte ;
-				byte = 0 ;
-				} ;
-
-			idelta [0] = (idelta [0] * AdaptationTable [errordelta]) >> 8 ;
-			if (idelta [0] < 16)
-				idelta [0] = 16 ;
-			pms->samples [k] = newsamp ;
-			} ;
-		}
-	else
-	{	/* Stereo file. */
-		pms->block [0]	= bpred [0] ;	
-		pms->block [1]	= bpred [1] ;	
-
-		pms->block [2]	= idelta [0] & 0xFF ;
-		pms->block [3]	= idelta [0] >> 8 ;
-		pms->block [4]	= idelta [1] & 0xFF ;
-		pms->block [5]	= idelta [1] >> 8 ;
-		
-		pms->block [6]	= pms->samples [2] & 0xFF ;
-		pms->block [7]	= pms->samples [2] >> 8 ;
-		pms->block [8]	= pms->samples [3] & 0xFF ;
-		pms->block [9]	= pms->samples [3] >> 8 ;
-
-		pms->block [10]	= pms->samples [0] & 0xFF ;
-		pms->block [11]	= pms->samples [0] >> 8 ;
-		pms->block [12]	= pms->samples [1] & 0xFF ;
-		pms->block [13]	= pms->samples [1] >> 8 ;
-	
-		blockindex = 14 ;
-		byte = 0 ;
-		chan = 1 ;
-		
-		for (k = 4 ; k < 2 * pms->samplesperblock ; k++)
-		{	chan = k & 1 ;
-
-			predict = (pms->samples [k-2] * AdaptCoeff1 [bpred [chan]] + pms->samples [k-4] * AdaptCoeff2 [bpred [chan]]) >> 8 ;
-			errordelta = (pms->samples [k] - predict) / idelta [chan] ;
-
-
-			if (errordelta < -8)
-				errordelta = -8 ;
-			else if (errordelta > 7)
-				errordelta = 7 ;
-			newsamp = predict + (idelta [chan] * errordelta) ;
-			if (newsamp > 32767)
-				newsamp = 32767 ;
-			else if (newsamp < -32768)
-				newsamp = -32768 ;
-			if (errordelta < 0)
-				errordelta += 0x10 ;
-				
-			byte = (byte << 4) | (errordelta & 0xF) ;
-
-			if (chan)
-			{	pms->block [blockindex++] = byte ;
-				byte = 0 ;
-				} ;
-
-			idelta [chan] = (idelta [chan] * AdaptationTable [errordelta]) >> 8 ;
-			if (idelta [chan] < 16)
-				idelta [chan] = 16 ;
-			pms->samples [k] = newsamp ;
-			} ;
-		} ;
-
-	/* Write the block to disk. */
-
-	if ((k = fwrite (pms->block, 1, pms->blocksize, psf->file)) != pms->blocksize)
-		psf_log_printf (psf, "*** Warning : short write (%d != %d).\n", k, pms->blocksize) ;
-		
-	memset (pms->samples, 0, pms->samplesperblock * sizeof (short)) ;
-
-	pms->blockcount ++ ;
-	pms->samplecount = 0 ;
-			
-	return 1 ;
-} /* msadpcm_encode_block */
-
-static int 
-msadpcm_write (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms, short *ptr, int len)
-{	int		count, total = 0, index = 0 ;
-	
-	while (index < len)
-	{	count = (pms->samplesperblock - pms->samplecount) * pms->channels ;
-
-		if (count > len - index)
-			count = len - index ;
-
-		memcpy (&(pms->samples [pms->samplecount * pms->channels]), &(ptr [index]), count * sizeof (short)) ;
-		index += count ;
-		pms->samplecount += count / pms->channels ;
-		total = index ;
-
-		if (pms->samplecount >= pms->samplesperblock)
-			msadpcm_encode_block (psf, pms) ;	
-		} ;
-
-	return total ;		
-} /* msadpcm_write */
-
-static int		
-msadpcm_write_s (SF_PRIVATE *psf, short *ptr, int len)
-{	MSADPCM_PRIVATE *pms ; 
-	int				total ;
-
-	if (! psf->fdata)
-		return 0 ;
-	pms = (MSADPCM_PRIVATE*) psf->fdata ;
-	
-	total = msadpcm_write (psf, pms, ptr, len) ;
-
-	return total ;
-} /* msadpcm_write_s */
-
-static int		
-msadpcm_write_i  (SF_PRIVATE *psf, int *ptr, int len)
-{	MSADPCM_PRIVATE *pms ; 
-	short		*sptr ;
-	int			k, bufferlen, writecount = 0, count ;
-	int			index = 0, total = 0 ;
-
-	if (! psf->fdata)
-		return 0 ;
-	pms = (MSADPCM_PRIVATE*) psf->fdata ;
-	
-	sptr = (short*) psf->buffer ;
-	bufferlen = ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (short) ;
-	while (len > 0)
-	{	writecount = (len >= bufferlen) ? bufferlen : len ;
-		for (k = 0 ; k < writecount ; k++)
-			sptr [k] = (short) ptr [index+k] ;
-		count = msadpcm_write (psf, pms, sptr, writecount) ;
-		index += writecount ;
-		total += count ;
-		len -= writecount ;
-		} ;
-	return total ;
-} /* msadpcm_write_i */
-
-static int
-msadpcm_write_f  (SF_PRIVATE *psf, float *ptr, int len)
-{	MSADPCM_PRIVATE *pms ; 
-	short		*sptr ;
-	int			k, bufferlen, writecount = 0, count ;
-	int			index = 0, total = 0 ;
-	float		normfact ;
-	
-	if (! psf->fdata)
-		return 0 ;
-	pms = (MSADPCM_PRIVATE*) psf->fdata ;
-	
-	normfact = (psf->norm_float == SF_TRUE) ? ((float) 0x8000) : 1.0 ;
-	
-	sptr = (short*) psf->buffer ;
-	bufferlen = ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (short) ;
-	while (len > 0)
-	{	writecount = (len >= bufferlen) ? bufferlen : len ;
-		for (k = 0 ; k < writecount ; k++)
-			sptr [k] = FLOAT_TO_SHORT (normfact * ptr [index+k]) ;
-		count = msadpcm_write (psf, pms, sptr, writecount) ;
-		index += writecount ;
-		total += count ;
-		len -= writecount ;
-		} ;
-	return total ;
-} /* msadpcm_write_f */
-
-static int		
-msadpcm_write_d  (SF_PRIVATE *psf, double *ptr, int len, int normalize)
-{	MSADPCM_PRIVATE *pms ; 
-	short		*sptr ;
-	int			k, bufferlen, writecount = 0, count ;
-	int			index = 0, total = 0 ;
-	double 		normfact ;
-	
-	normfact = (normalize ? ((double) 0x8000) : 1.0) ;
-
-	if (! psf->fdata)
-		return 0 ;
-	pms = (MSADPCM_PRIVATE*) psf->fdata ;
-	
-	sptr = (short*) psf->buffer ;
-	bufferlen = ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (short) ;
-	while (len > 0)
-	{	writecount = (len >= bufferlen) ? bufferlen : len ;
-		for (k = 0 ; k < writecount ; k++)
-			sptr [k] = DOUBLE_TO_SHORT (normfact * ptr [index+k]) ;
-		count = msadpcm_write (psf, pms, sptr, writecount) ;
-		index += writecount ;
-		total += count ;
-		len -= writecount ;
-		} ;
-	return total ;
-} /* msadpcm_write_d */
-
-/*========================================================================================
-*/
-
-static int
-msadpcm_write_header (SF_PRIVATE  *psf)
-{	int  k, fmt_size, blockalign, samplesperblock, bytespersec, extrabytes ;
-
-	blockalign      = srate2blocksize (psf->sf.samplerate * psf->sf.channels) ;	
-	samplesperblock = 2 + 2 * (blockalign - 7 * psf->sf.channels) / psf->sf.channels ;
-	bytespersec     = (psf->sf.samplerate * blockalign) / samplesperblock ;
-	
-	/* Reset the current header length to zero. */
-	psf->header [0] = 0 ;
-	psf->headindex = 0 ;
-	fseek (psf->file, 0, SEEK_SET) ;
-
-	/* RIFF marker, length, WAVE and 'fmt ' markers. */		
-	psf_binheader_writef (psf, "mlmm", RIFF_MARKER, psf->filelength - 8, WAVE_MARKER, fmt_MARKER) ;
-
-	/* fmt chunk. */
-	extrabytes = 2 + 2 + 7 * (2 + 2) ;
-	fmt_size   = 2 + 2 + 4 + 4 + 2 + 2 + 2 + extrabytes ;
-	
-	/* fmt : size, WAV format type, channels. */
-	psf_binheader_writef (psf, "lww", fmt_size, WAVE_FORMAT_MS_ADPCM, psf->sf.channels) ;
-
-	/* fmt : samplerate, bytespersec. */
-	psf_binheader_writef (psf, "ll", psf->sf.samplerate, bytespersec) ;
-
-	/* fmt : blockalign, bitwidth, extrabytes, samplesperblock. */
-	psf_binheader_writef (psf, "wwwww", blockalign, 4, extrabytes, samplesperblock, 7) ;
-	
-	for (k = 0 ; k < 7 ; k++)
-		psf_binheader_writef (psf, "ww", AdaptCoeff1 [k], AdaptCoeff2 [k]) ;
-
-	/* Fact chunk. */	
-	psf_binheader_writef (psf, "mll", fact_MARKER, sizeof (int), psf->sf.samples) ;
-
-	/* DATA chunk. */
-	psf_binheader_writef (psf, "ml", data_MARKER, psf->datalength) ;
-
-	fwrite (psf->header, psf->headindex, 1, psf->file) ;
-
-	psf->dataoffset = psf->headindex ;
-
-	psf->datalength  = (psf->sf.samples / samplesperblock) * samplesperblock ;
-	if (psf->sf.samples % samplesperblock)
-		psf->datalength += samplesperblock ;
-
-	return 0 ;
-} /* msadpcm_write_header */
-
-static int	
-msadpcm_close	(SF_PRIVATE  *psf)
-{	MSADPCM_PRIVATE *pms ; 
-
-	if (! psf->fdata)
-		return 0 ;
-
-	pms = (MSADPCM_PRIVATE*) psf->fdata ;
-
-	if (psf->mode == SF_MODE_WRITE)
-	{	/*  Now we know static int for certain the length of the file we can
-		**  re-write the header.
-		*/
-		 
-		if (pms->samplecount && pms->samplecount < pms->samplesperblock)
-			msadpcm_encode_block (psf, pms) ;	
-
-		fseek (psf->file, 0, SEEK_END) ;
-		psf->filelength = ftell (psf->file) ;
-
-		psf->sf.samples = pms->samplesperblock * pms->blockcount ;
-		psf->datalength = psf->filelength - psf->dataoffset ;
-
-		msadpcm_write_header (psf) ;
-		} ;
-
-	if (psf->fdata)
-		free (psf->fdata) ;
-	psf->fdata = NULL ;
-
-	return 0 ;
-} /* msadpcm_close */
-
-/*========================================================================================
-** Static functions.
-*/
-
-static	unsigned int 
-srate2blocksize (unsigned int srate_chan_product)
-{	if (srate_chan_product < 12000)
-		return 256 ;
-	if (srate_chan_product < 23000)
-		return 512 ;
-	if (srate_chan_product < 44000)
-		return 1024 ;
-	return 2048 ;
-} /* srate2blocksize */
-
-/*----------------------------------------------------------------------------------------
-**	Choosing the block predictor.
-**	Each block requires a predictor and an idelta for each channel. 
-**	The predictor is in the range [0..6] which is an index into the	two AdaptCoeff tables. 
-**	The predictor is chosen by trying all of the possible predictors on a small set of
-**	samples at the beginning of the block. The predictor with the smallest average
-**	abs (idelta) is chosen as the best predictor for this block. 
-**	The value of idelta is chosen to to give a 4 bit code value of +/- 4 (approx. half the 
-**	max. code value). If the average abs (idelta) is zero, the sixth predictor is chosen.
-**	If the value of idelta is less then 16 it is set to 16.
-**
-**	Microsoft uses an IDELTA_COUNT (number of sample pairs used to choose best predictor)
-**	value of 3. The best possible results would be obtained by using all the samples to
-**	choose the predictor.
-*/
-
-#define		IDELTA_COUNT	3
-
-static	void	
-choose_predictor (unsigned int channels, short *data, int *block_pred, int *idelta)
-{	unsigned int	chan, k, bpred, idelta_sum, best_bpred, best_idelta ;
-	
-	for (chan = 0 ; chan < channels; chan++)
-	{	best_bpred = best_idelta = 0 ;
-
-		for (bpred = 0 ; bpred < 7 ; bpred++)
-		{	idelta_sum = 0 ;
-			for (k = 2 ; k < 2 + IDELTA_COUNT ; k++)
-				idelta_sum += abs (data [k*channels] - ((data [(k-1)*channels] * AdaptCoeff1 [bpred] + data [(k-2)*channels] * AdaptCoeff2 [bpred]) >> 8)) ;
-			idelta_sum /= (4 * IDELTA_COUNT) ;
-			
-			if (bpred == 0 || idelta_sum < best_idelta)
-			{	best_bpred = bpred ;
-				best_idelta = idelta_sum ;
-				} ;
-				
-			if (! idelta_sum)
-			{	best_bpred = bpred ;
-				best_idelta = 16 ;
-				break ;
-				} ;
-		
-			} ; /* for bpred ... */
-		if (best_idelta < 16)
-			best_idelta = 16 ;
-	
-		block_pred [chan] = best_bpred ;
-		idelta [chan]     = best_idelta ;
-		} ;
-
-	return ;
-} /* choose_predictor */
--- /dev/null
+++ b/common/libsndfile/src/wav_w64.c
@@ -1,0 +1,330 @@
+/*
+** Copyright (C) 1999-2002 Erik de Castro Lopo <[email protected]>
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+** 
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+** 
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include	<stdio.h>
+#include	<unistd.h>
+#include	<string.h>
+#include	<ctype.h>
+#include	<time.h>
+
+#include	"sndfile.h"
+#include	"config.h"
+#include	"sfendian.h"
+#include	"common.h"
+#include	"wav_w64.h"
+
+/*------------------------------------------------------------------------------
+ * Private static functions.
+ */
+
+int
+wav_w64_read_fmt_chunk (SF_PRIVATE *psf, WAV_FMT *wav_fmt, int structsize)
+{	int	bytesread, k, bytespersec = 0  ;
+	
+	memset (wav_fmt, 0, sizeof (WAV_FMT)) ;
+
+	if (structsize < 16)
+		return SFE_WAV_FMT_SHORT ;
+	if (structsize > SIGNED_SIZEOF (WAV_FMT))
+		return SFE_WAV_FMT_TOO_BIG ;
+
+	/* Read the minimal WAV file header here. */	
+	bytesread =
+	psf_binheader_readf (psf, "e224422", &(wav_fmt->format), &(wav_fmt->min.channels),
+			&(wav_fmt->min.samplerate), &(wav_fmt->min.bytespersec), 
+			&(wav_fmt->min.blockalign), &(wav_fmt->min.bitwidth))  ;
+
+	psf_log_printf (psf, "  Format        : 0x%X => %s\n", wav_fmt->format, wav_w64_format_str (wav_fmt->format)) ;
+	psf_log_printf (psf, "  Channels      : %d\n", wav_fmt->min.channels) ;
+	psf_log_printf (psf, "  Sample Rate   : %d\n", wav_fmt->min.samplerate) ;
+	psf_log_printf (psf, "  Block Align   : %d\n", wav_fmt->min.blockalign) ;
+	
+	if (wav_fmt->format == WAVE_FORMAT_GSM610 && wav_fmt->min.bitwidth != 0)
+		psf_log_printf (psf, "  Bit Width     : %d (should be 0)\n", wav_fmt->min.bitwidth) ;
+	else
+		psf_log_printf (psf, "  Bit Width     : %d\n", wav_fmt->min.bitwidth) ;
+	
+	psf->sf.samplerate		= wav_fmt->min.samplerate ;
+	psf->sf.samples 		= 0 ;					/* Correct this when reading data chunk. */
+	psf->sf.channels		= wav_fmt->min.channels ;
+	
+	switch (wav_fmt->format)
+	{	case WAVE_FORMAT_PCM :
+		case WAVE_FORMAT_IEEE_FLOAT :
+				bytespersec = wav_fmt->min.samplerate * wav_fmt->min.blockalign ;
+				if (wav_fmt->min.bytespersec != (unsigned) bytespersec)
+					psf_log_printf (psf, "  Bytes/sec     : %d (should be %d)\n", wav_fmt->min.bytespersec, bytespersec) ;
+				else
+					psf_log_printf (psf, "  Bytes/sec     : %d\n", wav_fmt->min.bytespersec) ;
+		
+				psf->bytewidth = BITWIDTH2BYTES (wav_fmt->min.bitwidth) ;
+				break ;
+
+		case WAVE_FORMAT_ALAW :
+		case WAVE_FORMAT_MULAW :
+				if (wav_fmt->min.bytespersec / wav_fmt->min.blockalign != wav_fmt->min.samplerate)
+					psf_log_printf (psf, "  Bytes/sec     : %d (should be %d)\n", wav_fmt->min.bytespersec, wav_fmt->min.samplerate * wav_fmt->min.blockalign) ;
+				else
+					psf_log_printf (psf, "  Bytes/sec     : %d\n", wav_fmt->min.bytespersec) ;
+
+				psf->bytewidth = 1 ;
+				if (structsize >= 18)
+				{	bytesread += psf_binheader_readf (psf, "e2", &(wav_fmt->size20.extrabytes)) ;
+					psf_log_printf (psf, "  Extra Bytes   : %d\n", wav_fmt->size20.extrabytes) ;
+					} ;
+				break ;
+
+		case WAVE_FORMAT_IMA_ADPCM :
+				if (wav_fmt->min.bitwidth != 4)
+					return SFE_WAV_ADPCM_NOT4BIT ;
+				if (wav_fmt->min.channels < 1 || wav_fmt->min.channels > 2)
+					return SFE_WAV_ADPCM_CHANNELS ;
+
+				bytesread += 
+				psf_binheader_readf (psf, "e22", &(wav_fmt->ima.extrabytes), &(wav_fmt->ima.samplesperblock)) ;
+
+				bytespersec = (wav_fmt->ima.samplerate * wav_fmt->ima.blockalign) / wav_fmt->ima.samplesperblock ;
+				if (wav_fmt->ima.bytespersec != (unsigned) bytespersec)
+					psf_log_printf (psf, "  Bytes/sec     : %d (should be %d)\n", wav_fmt->ima.bytespersec, bytespersec) ;
+				else
+					psf_log_printf (psf, "  Bytes/sec     : %d\n", wav_fmt->ima.bytespersec) ;
+
+				psf->bytewidth = 2 ;
+				psf_log_printf (psf, "  Extra Bytes   : %d\n", wav_fmt->ima.extrabytes) ;
+				psf_log_printf (psf, "  Samples/Block : %d\n", wav_fmt->ima.samplesperblock) ;
+				break ;
+				
+		case WAVE_FORMAT_MS_ADPCM :
+				if (wav_fmt->msadpcm.bitwidth != 4)
+					return SFE_WAV_ADPCM_NOT4BIT ;
+				if (wav_fmt->msadpcm.channels < 1 || wav_fmt->msadpcm.channels > 2)
+					return SFE_WAV_ADPCM_CHANNELS ;
+
+				bytesread += 
+				psf_binheader_readf (psf, "e222", &(wav_fmt->msadpcm.extrabytes), 
+						&(wav_fmt->msadpcm.samplesperblock), &(wav_fmt->msadpcm.numcoeffs)) ;
+
+				bytespersec = (wav_fmt->min.samplerate * wav_fmt->min.blockalign) / wav_fmt->msadpcm.samplesperblock ;
+				if (wav_fmt->min.bytespersec == (unsigned) bytespersec)
+					psf_log_printf (psf, "  Bytes/sec     : %d\n", wav_fmt->min.bytespersec) ;
+				else if (wav_fmt->min.bytespersec == (wav_fmt->min.samplerate / wav_fmt->msadpcm.samplesperblock) * wav_fmt->min.blockalign) 
+					psf_log_printf (psf, "  Bytes/sec     : %d (should be %d (MS BUG!))\n", wav_fmt->min.bytespersec, bytespersec) ;
+				else
+					psf_log_printf (psf, "  Bytes/sec     : %d (should be %d)\n", wav_fmt->min.bytespersec, bytespersec) ;
+				
+					
+				psf->bytewidth = 2 ;
+				psf_log_printf (psf, "  Extra Bytes   : %d\n", wav_fmt->msadpcm.extrabytes) ;
+				psf_log_printf (psf, "  Samples/Block : %d\n", wav_fmt->msadpcm.samplesperblock) ;
+				if (wav_fmt->msadpcm.numcoeffs > SIGNED_SIZEOF (MS_ADPCM_WAV_FMT) / SIGNED_SIZEOF (int))
+				{	psf_log_printf (psf, "  No. of Coeffs : %d ****\n", wav_fmt->msadpcm.numcoeffs) ;
+					wav_fmt->msadpcm.numcoeffs = SIGNED_SIZEOF (MS_ADPCM_WAV_FMT) / SIGNED_SIZEOF (int) ;
+					}
+				else
+					psf_log_printf (psf, "  No. of Coeffs : %d\n", wav_fmt->msadpcm.numcoeffs) ;
+
+				psf_log_printf (psf, "    Index   Coeffs1   Coeffs2\n") ;
+				for (k = 0 ; k < wav_fmt->msadpcm.numcoeffs ; k++)
+				{	bytesread += 
+					psf_binheader_readf (psf, "e22", &(wav_fmt->msadpcm.coeffs [k].coeff1), &(wav_fmt->msadpcm.coeffs [k].coeff2)) ;
+					LSF_SNPRINTF ((char*) psf->buffer, sizeof (psf->buffer), "     %2d     %7d   %7d\n", k, wav_fmt->msadpcm.coeffs [k].coeff1, wav_fmt->msadpcm.coeffs [k].coeff2) ;
+					psf_log_printf (psf, (char*) psf->buffer) ;
+					} ;
+				break ;
+				
+		case WAVE_FORMAT_GSM610 :
+				if (wav_fmt->gsm610.channels != 1 || wav_fmt->gsm610.blockalign != 65)
+					return SFE_WAV_GSM610_FORMAT ;
+
+				bytesread += 
+				psf_binheader_readf (psf, "e22", &(wav_fmt->gsm610.extrabytes), &(wav_fmt->gsm610.samplesperblock)) ;
+
+				if (wav_fmt->gsm610.samplesperblock != 320)
+					return SFE_WAV_GSM610_FORMAT ;
+
+				bytespersec = (wav_fmt->gsm610.samplerate * wav_fmt->gsm610.blockalign) / wav_fmt->gsm610.samplesperblock ;
+				if (wav_fmt->gsm610.bytespersec != (unsigned) bytespersec)
+					psf_log_printf (psf, "  Bytes/sec     : %d (should be %d)\n", wav_fmt->gsm610.bytespersec, bytespersec) ;
+				else
+					psf_log_printf (psf, "  Bytes/sec     : %d\n", wav_fmt->gsm610.bytespersec) ;
+
+				psf->bytewidth = 2 ;
+				psf_log_printf (psf, "  Extra Bytes   : %d\n", wav_fmt->gsm610.extrabytes) ;
+				psf_log_printf (psf, "  Samples/Block : %d\n", wav_fmt->gsm610.samplesperblock) ;
+				break ;
+
+		case WAVE_FORMAT_EXTENSIBLE :
+				if (wav_fmt->ext.bytespersec / wav_fmt->ext.blockalign != wav_fmt->ext.samplerate)
+					psf_log_printf (psf, "  Bytes/sec     : %d (should be %d)\n", wav_fmt->ext.bytespersec, wav_fmt->ext.samplerate * wav_fmt->ext.blockalign) ;
+				else
+					psf_log_printf (psf, "  Bytes/sec     : %d\n", wav_fmt->ext.bytespersec) ;
+
+				bytesread += 
+				psf_binheader_readf (psf, "e224", &(wav_fmt->ext.extrabytes), &(wav_fmt->ext.validbits),
+						&(wav_fmt->ext.channelmask)) ;
+
+				psf_log_printf (psf, "  Valid Bits    : %d\n", wav_fmt->ext.validbits) ;
+				psf_log_printf (psf, "  Channel Mask  : 0x%X\n", wav_fmt->ext.channelmask) ;
+
+				bytesread += 
+				psf_binheader_readf (psf, "e422", &(wav_fmt->ext.esf.esf_field1), &(wav_fmt->ext.esf.esf_field2),
+						&(wav_fmt->ext.esf.esf_field3)) ;
+
+				psf_log_printf (psf, "  Subformat\n") ;
+				psf_log_printf (psf, "    esf_field1 : 0x%X\n", wav_fmt->ext.esf.esf_field1) ;
+				psf_log_printf (psf, "    esf_field2 : 0x%X\n", wav_fmt->ext.esf.esf_field2) ;
+				psf_log_printf (psf, "    esf_field3 : 0x%X\n", wav_fmt->ext.esf.esf_field3) ;
+				psf_log_printf (psf, "    esf_field4 : ") ;
+				for (k = 0 ; k < 8 ; k++)
+				{	bytesread += psf_binheader_readf (psf, "1", &(wav_fmt->ext.esf.esf_field4 [k])) ;
+					psf_log_printf (psf, "0x%X ", wav_fmt->ext.esf.esf_field4 [k] & 0xFF) ;
+					} ;
+				psf_log_printf (psf, "\n") ;
+				psf->bytewidth = BITWIDTH2BYTES (wav_fmt->ext.bitwidth) ;
+				break ;
+
+		default : break ;
+		} ;
+
+	if (bytesread > structsize)	
+	{	psf_log_printf (psf, "*** wav_w64_read_fmt_chunk (bytesread > structsize)\n") ;
+		return SFE_W64_FMT_SHORT ;
+		}
+	else
+		psf_binheader_readf (psf, "j", structsize - bytesread) ;
+
+	psf->blockwidth = wav_fmt->min.channels * psf->bytewidth ;
+
+	return 0 ;
+} /* wav_w64_read_fmt_chunk */
+
+
+char const* 
+wav_w64_format_str (int k)
+{	switch (k)
+	{	case WAVE_FORMAT_UNKNOWN :
+			return "WAVE_FORMAT_UNKNOWN" ;
+		case WAVE_FORMAT_PCM          :
+			return "WAVE_FORMAT_PCM" ;
+		case WAVE_FORMAT_MS_ADPCM :
+			return "WAVE_FORMAT_MS_ADPCM" ;
+		case WAVE_FORMAT_IEEE_FLOAT :
+			return "WAVE_FORMAT_IEEE_FLOAT" ;
+		case WAVE_FORMAT_IBM_CVSD :
+			return "WAVE_FORMAT_IBM_CVSD" ;
+		case WAVE_FORMAT_ALAW :
+			return "WAVE_FORMAT_ALAW" ;
+		case WAVE_FORMAT_MULAW :
+			return "WAVE_FORMAT_MULAW" ;
+		case WAVE_FORMAT_OKI_ADPCM :
+			return "WAVE_FORMAT_OKI_ADPCM" ;
+		case WAVE_FORMAT_IMA_ADPCM :
+			return "WAVE_FORMAT_IMA_ADPCM" ;
+		case WAVE_FORMAT_MEDIASPACE_ADPCM :
+			return "WAVE_FORMAT_MEDIASPACE_ADPCM" ;
+		case WAVE_FORMAT_SIERRA_ADPCM :
+			return "WAVE_FORMAT_SIERRA_ADPCM" ;
+		case WAVE_FORMAT_G723_ADPCM :
+			return "WAVE_FORMAT_G723_ADPCM" ;
+		case WAVE_FORMAT_DIGISTD :
+			return "WAVE_FORMAT_DIGISTD" ;
+		case WAVE_FORMAT_DIGIFIX :
+			return "WAVE_FORMAT_DIGIFIX" ;
+		case WAVE_FORMAT_DIALOGIC_OKI_ADPCM :
+			return "WAVE_FORMAT_DIALOGIC_OKI_ADPCM" ;
+		case WAVE_FORMAT_MEDIAVISION_ADPCM :
+			return "WAVE_FORMAT_MEDIAVISION_ADPCM" ;
+		case WAVE_FORMAT_YAMAHA_ADPCM :
+			return "WAVE_FORMAT_YAMAHA_ADPCM" ;
+		case WAVE_FORMAT_SONARC :
+			return "WAVE_FORMAT_SONARC" ;
+		case WAVE_FORMAT_DSPGROUP_TRUESPEECH  :
+			return "WAVE_FORMAT_DSPGROUP_TRUESPEECH " ;
+		case WAVE_FORMAT_ECHOSC1 :
+			return "WAVE_FORMAT_ECHOSC1" ;
+		case WAVE_FORMAT_AUDIOFILE_AF18   :
+			return "WAVE_FORMAT_AUDIOFILE_AF18  " ;
+		case WAVE_FORMAT_APTX :
+			return "WAVE_FORMAT_APTX" ;
+		case WAVE_FORMAT_AUDIOFILE_AF10   :
+			return "WAVE_FORMAT_AUDIOFILE_AF10  " ;
+		case WAVE_FORMAT_DOLBY_AC2 :
+			return "WAVE_FORMAT_DOLBY_AC2" ;
+		case WAVE_FORMAT_GSM610 :
+			return "WAVE_FORMAT_GSM610" ;
+		case WAVE_FORMAT_MSNAUDIO :
+			return "WAVE_FORMAT_MSNAUDIO" ;
+		case WAVE_FORMAT_ANTEX_ADPCME :
+			return "WAVE_FORMAT_ANTEX_ADPCME" ;
+		case WAVE_FORMAT_CONTROL_RES_VQLPC :
+			return "WAVE_FORMAT_CONTROL_RES_VQLPC" ;
+		case WAVE_FORMAT_DIGIREAL :
+			return "WAVE_FORMAT_DIGIREAL" ;
+		case WAVE_FORMAT_DIGIADPCM :
+			return "WAVE_FORMAT_DIGIADPCM" ;
+		case WAVE_FORMAT_CONTROL_RES_CR10 :
+			return "WAVE_FORMAT_CONTROL_RES_CR10" ;
+		case WAVE_FORMAT_NMS_VBXADPCM :
+			return "WAVE_FORMAT_NMS_VBXADPCM" ;
+		case WAVE_FORMAT_ROCKWELL_ADPCM :
+			return "WAVE_FORMAT_ROCKWELL_ADPCM" ;
+		case WAVE_FORMAT_ROCKWELL_DIGITALK :
+			return "WAVE_FORMAT_ROCKWELL_DIGITALK" ;
+		case WAVE_FORMAT_G721_ADPCM :
+			return "WAVE_FORMAT_G721_ADPCM" ;
+		case WAVE_FORMAT_MPEG :
+			return "WAVE_FORMAT_MPEG" ;
+		case WAVE_FORMAT_MPEGLAYER3 :
+			return "WAVE_FORMAT_MPEGLAYER3" ;
+		case IBM_FORMAT_MULAW :
+			return "IBM_FORMAT_MULAW" ;
+		case IBM_FORMAT_ALAW :
+			return "IBM_FORMAT_ALAW" ;
+		case IBM_FORMAT_ADPCM :
+			return "IBM_FORMAT_ADPCM" ;
+		case WAVE_FORMAT_CREATIVE_ADPCM :
+			return "WAVE_FORMAT_CREATIVE_ADPCM" ;
+		case WAVE_FORMAT_FM_TOWNS_SND :
+			return "WAVE_FORMAT_FM_TOWNS_SND" ;
+		case WAVE_FORMAT_OLIGSM :
+			return "WAVE_FORMAT_OLIGSM" ;
+		case WAVE_FORMAT_OLIADPCM :
+			return "WAVE_FORMAT_OLIADPCM" ;
+		case WAVE_FORMAT_OLICELP :
+			return "WAVE_FORMAT_OLICELP" ;
+		case WAVE_FORMAT_OLISBC :
+			return "WAVE_FORMAT_OLISBC" ;
+		case WAVE_FORMAT_OLIOPR :
+			return "WAVE_FORMAT_OLIOPR" ;
+		case WAVE_FORMAT_EXTENSIBLE :
+			return "WAVE_FORMAT_EXTENSIBLE" ;
+		break ;
+		} ;
+	return "Unknown format" ;
+} /* wav_w64_format_str */
+
+int 
+wav_w64_srate2blocksize (int srate_chan_product)
+{	if (srate_chan_product < 12000)
+		return 256 ;
+	if (srate_chan_product < 23000)
+		return 512 ;
+	if (srate_chan_product < 44000)
+		return 1024 ;
+	return 2048 ;
+} /* srate2blocksize */
--- /dev/null
+++ b/common/libsndfile/src/wav_w64.h
@@ -1,0 +1,203 @@
+/*
+** Copyright (C) 1999-2002 Erik de Castro Lopo <[email protected]>
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 of the License, or
+** (at your option) any later version.
+** 
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Lesser General Public License for more details.
+** 
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+/* This file contains definitions commong to WAV and W64 files. */
+
+
+#ifndef WAV_W64_H_INCLUDED
+#define WAV_W64_H_INCLUDED
+
+/*------------------------------------------------------------------------------
+** List of known WAV format tags
+*/
+
+enum
+{	
+	WAVE_FORMAT_UNKNOWN				= 0x0000,		/* Microsoft Corporation */
+	WAVE_FORMAT_PCM     		    = 0x0001, 		/* Microsoft PCM format */
+
+	WAVE_FORMAT_MS_ADPCM			= 0x0002,		/* Microsoft ADPCM */
+	WAVE_FORMAT_IEEE_FLOAT			= 0x0003,		/* Micrososft 32 bit float format */
+	
+	WAVE_FORMAT_IBM_CVSD			= 0x0005,		/* IBM Corporation */
+	WAVE_FORMAT_ALAW				= 0x0006,		/* Microsoft Corporation */
+	WAVE_FORMAT_MULAW				= 0x0007,		/* Microsoft Corporation */
+	WAVE_FORMAT_OKI_ADPCM			= 0x0010,		/* OKI */
+	WAVE_FORMAT_IMA_ADPCM			= 0x0011,		/* Intel Corporation */
+	WAVE_FORMAT_MEDIASPACE_ADPCM	= 0x0012,		/* Videologic */
+	WAVE_FORMAT_SIERRA_ADPCM		= 0x0013,		/* Sierra Semiconductor Corp */
+	WAVE_FORMAT_G723_ADPCM			= 0x0014,		/* Antex Electronics Corporation */
+	WAVE_FORMAT_DIGISTD				= 0x0015,		/* DSP Solutions, Inc. */
+	WAVE_FORMAT_DIGIFIX				= 0x0016,		/* DSP Solutions, Inc. */
+	WAVE_FORMAT_DIALOGIC_OKI_ADPCM	= 0x0017,		/*  Dialogic Corporation  */
+	WAVE_FORMAT_MEDIAVISION_ADPCM	= 0x0018,		/*  Media Vision, Inc. */
+
+	WAVE_FORMAT_YAMAHA_ADPCM		= 0x0020,		/* Yamaha Corporation of America */
+	WAVE_FORMAT_SONARC				= 0x0021,		/* Speech Compression */
+	WAVE_FORMAT_DSPGROUP_TRUESPEECH = 0x0022,		/* DSP Group, Inc */
+	WAVE_FORMAT_ECHOSC1				= 0x0023,		/* Echo Speech Corporation */
+	WAVE_FORMAT_AUDIOFILE_AF18  	= 0x0024,		/* Audiofile, Inc. */
+	WAVE_FORMAT_APTX				= 0x0025,		/* Audio Processing Technology */
+	WAVE_FORMAT_AUDIOFILE_AF10  	= 0x0026,		/* Audiofile, Inc. */
+
+	WAVE_FORMAT_DOLBY_AC2			= 0x0030,		/* Dolby Laboratories */
+	WAVE_FORMAT_GSM610				= 0x0031,		/* Microsoft Corporation */
+	WAVE_FORMAT_MSNAUDIO			= 0x0032,		/* Microsoft Corporation */
+	WAVE_FORMAT_ANTEX_ADPCME		= 0x0033, 		/* Antex Electronics Corporation */
+	WAVE_FORMAT_CONTROL_RES_VQLPC	= 0x0034,		/* Control Resources Limited */
+	WAVE_FORMAT_DIGIREAL			= 0x0035,		/* DSP Solutions, Inc. */
+	WAVE_FORMAT_DIGIADPCM			= 0x0036,		/* DSP Solutions, Inc. */
+	WAVE_FORMAT_CONTROL_RES_CR10	= 0x0037,		/* Control Resources Limited */
+	WAVE_FORMAT_NMS_VBXADPCM		= 0x0038,		/* Natural MicroSystems */
+	WAVE_FORMAT_ROCKWELL_ADPCM		= 0x003B,		/* Rockwell International */
+	WAVE_FORMAT_ROCKWELL_DIGITALK	= 0x003C, 		/* Rockwell International */
+
+	WAVE_FORMAT_G721_ADPCM			= 0x0040,		/* Antex Electronics Corporation */
+	WAVE_FORMAT_MPEG				= 0x0050,		/* Microsoft Corporation */
+
+	WAVE_FORMAT_MPEGLAYER3			= 0x0055,		/* MPEG 3 Layer 1 */
+
+	IBM_FORMAT_MULAW				= 0x0101,		/* IBM mu-law format */
+	IBM_FORMAT_ALAW					= 0x0102,		/* IBM a-law format */
+	IBM_FORMAT_ADPCM				= 0x0103,		/* IBM AVC Adaptive Differential PCM format */
+
+	WAVE_FORMAT_CREATIVE_ADPCM		= 0x0200,		/* Creative Labs, Inc */
+
+	WAVE_FORMAT_FM_TOWNS_SND		= 0x0300,		/* Fujitsu Corp. */
+	WAVE_FORMAT_OLIGSM				= 0x1000,		/* Ing C. Olivetti & C., S.p.A. */
+	WAVE_FORMAT_OLIADPCM			= 0x1001,		/* Ing C. Olivetti & C., S.p.A. */
+	WAVE_FORMAT_OLICELP				= 0x1002,		/* Ing C. Olivetti & C., S.p.A. */
+	WAVE_FORMAT_OLISBC				= 0x1003,		/* Ing C. Olivetti & C., S.p.A. */
+	WAVE_FORMAT_OLIOPR				= 0x1004,		/* Ing C. Olivetti & C., S.p.A. */
+
+	WAVE_FORMAT_EXTENSIBLE			= 0xFFFE
+} ;
+
+typedef	struct
+{	unsigned short	format ;
+	unsigned short	channels ;
+	unsigned int	samplerate ;
+	unsigned int	bytespersec ;
+	unsigned short	blockalign ;
+	unsigned short	bitwidth ;
+} MIN_WAV_FMT ;
+
+typedef	struct 
+{	unsigned short	format ;
+	unsigned short	channels ;
+	unsigned int	samplerate ;
+	unsigned int	bytespersec ;
+	unsigned short	blockalign ;
+	unsigned short	bitwidth ;
+	unsigned short	extrabytes ;
+	unsigned short	dummy ;
+} WAV_FMT_SIZE20 ;
+
+typedef	struct
+{	unsigned short	format ;
+	unsigned short	channels ;
+	unsigned int	samplerate ;
+	unsigned int	bytespersec ;
+	unsigned short	blockalign ;
+	unsigned short	bitwidth ;
+	unsigned short	extrabytes ;
+	unsigned short	samplesperblock ;
+	unsigned short	numcoeffs ;
+	struct
+	{	short	coeff1 ;
+		short	coeff2 ;
+	}	coeffs [7] ;
+} MS_ADPCM_WAV_FMT ;
+
+typedef	struct
+{	unsigned short	format ;
+	unsigned short	channels ;
+	unsigned int	samplerate ;
+	unsigned int	bytespersec ;
+	unsigned short	blockalign ;
+	unsigned short	bitwidth ;
+	unsigned short	extrabytes ;
+	unsigned short	samplesperblock ;
+} IMA_ADPCM_WAV_FMT ;
+
+typedef	struct
+{	unsigned short	format ;
+	unsigned short	channels ;
+	unsigned int	samplerate ;
+	unsigned int	bytespersec ;
+	unsigned short	blockalign ;
+	unsigned short	bitwidth ;
+	unsigned short	extrabytes ;
+	unsigned short	samplesperblock ;
+} GSM610_WAV_FMT ;
+
+typedef struct
+{	unsigned int	esf_field1 ;
+	unsigned short	esf_field2 ;
+	unsigned short	esf_field3 ;
+	char	esf_field4 [8] ;
+} EXT_SUBFORMAT ;
+
+typedef	struct
+{	unsigned short	format ;
+	unsigned short	channels ;
+	unsigned int	samplerate ;
+	unsigned int	bytespersec ;
+	unsigned short	blockalign ;
+	unsigned short	bitwidth ;
+	unsigned short	extrabytes ;
+	unsigned short	validbits ;
+	unsigned int	channelmask ;
+	EXT_SUBFORMAT	esf ;
+} EXTENSIBLE_WAV_FMT ;
+
+typedef union
+{	unsigned short		format ;
+	MIN_WAV_FMT			min ;
+	IMA_ADPCM_WAV_FMT	ima ;
+	MS_ADPCM_WAV_FMT	msadpcm ;
+	EXTENSIBLE_WAV_FMT	ext ;
+	GSM610_WAV_FMT		gsm610 ;
+	WAV_FMT_SIZE20		size20 ;
+	char				padding [512] ;
+} WAV_FMT ;
+
+typedef struct
+{	int samples ;
+} FACT_CHUNK ;
+
+#define		WAV_W64_GSM610_BLOCKSIZE	65
+#define		WAV_W64_GSM610_SAMPLES		320
+
+/*------------------------------------------------------------------------------------ 
+**	Functions defined in wav_ms_adpcm.c
+*/
+
+#define	MSADPCM_ADAPT_COEFF_COUNT	7
+
+void	msadpcm_write_adapt_coeffs (SF_PRIVATE *psf) ;
+
+/*------------------------------------------------------------------------------------ 
+**	Functions defined in wav_gsm610.c
+*/
+
+int 	wav_w64_srate2blocksize (int srate_chan_product) ;
+char const* wav_w64_format_str (int k) ;
+int		wav_w64_read_fmt_chunk (SF_PRIVATE *psf, WAV_FMT *wav_fmt, int structsize) ;
+
+#endif
--- a/frontend/audio.c
+++ b/frontend/audio.c
@@ -16,7 +16,7 @@
 ** along with this program; if not, write to the Free Software 
 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 **
-** $Id: audio.c,v 1.2 2002/01/21 23:19:54 menno Exp $
+** $Id: audio.c,v 1.3 2002/07/25 12:22:13 menno Exp $
 **/
 
 #ifdef _WIN32
@@ -39,20 +39,16 @@
     switch (outputFormat)
     {
     case FAAD_FMT_16BIT:
-        aufile->sfinfo.pcmbitwidth = 16;
-        aufile->sfinfo.format      = ((1<<(fileType+15)) | SF_FORMAT_PCM);
+        aufile->sfinfo.format = ((1<<(fileType+15)) | SF_FORMAT_PCM_16);
         break;
     case FAAD_FMT_24BIT:
-        aufile->sfinfo.pcmbitwidth = 24;
-        aufile->sfinfo.format      = ((1<<(fileType+15)) | SF_FORMAT_PCM);
+        aufile->sfinfo.format = ((1<<(fileType+15)) | SF_FORMAT_PCM_24);
         break;
     case FAAD_FMT_32BIT:
-        aufile->sfinfo.pcmbitwidth = 32;
-        aufile->sfinfo.format      = ((1<<(fileType+15)) | SF_FORMAT_PCM);
+        aufile->sfinfo.format = ((1<<(fileType+15)) | SF_FORMAT_PCM_32);
         break;
     case FAAD_FMT_FLOAT:
-        aufile->sfinfo.pcmbitwidth = 32;
-        aufile->sfinfo.format      = ((1<<(fileType+15)) | SF_FORMAT_FLOAT);
+        aufile->sfinfo.format = ((1<<(fileType+15)) | SF_FORMAT_FLOAT);
         break;
     }
     aufile->sfinfo.channels = channels;
@@ -63,7 +59,7 @@
         setmode(fileno(stdout), O_BINARY);
     }
 #endif
-    aufile->sndfile = sf_open_write(infile, &aufile->sfinfo);
+    aufile->sndfile = sf_open(infile, SFM_WRITE, &aufile->sfinfo);
 
     if (aufile->sndfile == NULL)
     {