[SCM] Debian packaging for jack-audio-connection-kit branch, master.jackd2, updated. debian/1.9.4+svn3842-2-80-g15935e8

js at users.alioth.debian.org js at users.alioth.debian.org
Mon Apr 5 14:07:51 UTC 2010


The following commit has been merged in the master.jackd2 branch:
commit 4b2cdd3116c580d24ffe69807e14ea093956a01a
Author: Jonas Smedegaard <dr at jones.dk>
Date:   Mon Apr 5 15:24:08 2010 +0200

    Add patch 0000 to sync with upstream SVN trunk revision 3968.

diff --git a/debian/patches/0000_sync_upstream_VCS.patch b/debian/patches/0000_sync_upstream_VCS.patch
new file mode 100644
index 0000000..d3dc64f
--- /dev/null
+++ b/debian/patches/0000_sync_upstream_VCS.patch
@@ -0,0 +1,9184 @@
+Description: Sync with upstream SVN trunk revision 3968
+From: Jonas Smedegaard <dr at jones.dk>
+Forwarded: yes
+Last-Update: 2010-04-05
+--- a/ChangeLog
++++ b/ChangeLog
+@@ -19,194 +19,230 @@
+ Florian Faber
+ Michael Voigt
+ Torben Hohn  
+-Paul Davis
+-Peter L Jones
+-Devin Anderson
+-Josh Green
++Paul Davis
++Peter L Jones
++Devin Anderson
++Josh Green
+ Mario Lang
++Arnold Krille
+ 
+ ---------------------------
+   Jackdmp changes log
+----------------------------
++---------------------------
+ 
+-2010-01-29 Gabriel M. Beddingfield <gabriel at teuton.org>
++2010-03-26 Stephane Letz  <letz at grame.fr>
++
++	* ffado-portname-sync.patch from ticket #163 applied.
+ 
+-	* Change JackEngineProfiling and JackAudioAdapterInterface gnuplot scripts to output SVG instead of PDF.
++2010-03-24 Stephane Letz  <letz at grame.fr>
++
++	* On Windows, now use TRE library for regexp (BSD license instead of GPL license).
+ 
++2010-03-19 Stephane Letz  <letz at grame.fr>
++
++	* Fix some file header to have library side code use LGPL.
++	* Apply srcfactor.diff patch for ticket #162.
++
++2010-03-06 Stephane Letz  <letz at grame.fr>
++
++	* Arnold Krille firewire patch.
++	* Raise JACK_DRIVER_PARAM_STRING_MAX and JACK_PARAM_STRING_MAX to 127 otherwise some audio drivers cannot be loaded on OSX.
++
++2010-03-04 Stephane Letz  <letz at grame.fr>
++
++	* Correct JackMachServerChannel::Execute : keep running even in error cases.
++	* Raise JACK_PROTOCOL_VERSION number.
++
++2010-03-03 Stephane Letz  <letz at grame.fr>
++
++	* Correct JackGraphManager::DeactivatePort.
++
++2010-03-02 Stephane Letz  <letz at grame.fr>
++
++	* Improve JackCoreAudioDriver and JackCoreAudioAdapter : when no devices are described, takes default input and output and aggregate them.
++
++2010-02-15 Stephane Letz  <letz at grame.fr>
++
++	* Version 1.9.6 started.
++
++2010-01-29 Gabriel M. Beddingfield <gabriel at teuton.org>
++
++	* Change JackEngineProfiling and JackAudioAdapterInterface gnuplot scripts to output SVG instead of PDF.
++
+ 2009-12-15 Stephane Letz  <letz at grame.fr>
+ 
+-	* Shared memory manager was calling abort in case of fatal error, now return an error in caller.
+-
++	* Shared memory manager was calling abort in case of fatal error, now return an error in caller.
++
+ 2009-12-13 Stephane Letz  <letz at grame.fr>
+ 
+-	* Mario Lang alsa_io time calculation overflow patch.
+-
++	* Mario Lang alsa_io time calculation overflow patch.
++
+ 2009-12-10 Stephane Letz  <letz at grame.fr>
+ 
+-	* Use a QUIT notification to properly quit the server channel, the server channel thread can then be 'stopped' instead of 'canceled'.
+-
++	* Use a QUIT notification to properly quit the server channel, the server channel thread can then be 'stopped' instead of 'canceled'.
++
+ 2009-12-09 Stephane Letz  <letz at grame.fr>
+ 
+-	* When threads are cancelled, the exception has to be rethrown. 
+-
++	* When threads are cancelled, the exception has to be rethrown. 
++
+ 2009-12-08 Stephane Letz  <letz at grame.fr>
+ 
+-	* Josh Green ALSA driver capture only patch.  
+-
++	* Josh Green ALSA driver capture only patch.  
++
+ 2009-12-03 Stephane Letz  <letz at grame.fr>
+ 
+-	* Fix JackCoreMidiDriver::ReadProcAux when ring buffer is full (thanks Devin Anderson).  
+-
++	* Fix JackCoreMidiDriver::ReadProcAux when ring buffer is full (thanks Devin Anderson).  
++
+ 2009-12-02 Stephane Letz  <letz at grame.fr>
+ 
+-	* Special code in JackCoreAudio driver to handle completely buggy Digidesign CoreAudio user-land driver. 
+-	* Ensure that client-side message buffer thread calls thread_init callback if/when it is set by the client (backport of JACK1 rev 3838).
+-	* Check dynamic port-max value.
+-
++	* Special code in JackCoreAudio driver to handle completely buggy Digidesign CoreAudio user-land driver. 
++	* Ensure that client-side message buffer thread calls thread_init callback if/when it is set by the client (backport of JACK1 rev 3838).
++	* Check dynamic port-max value.
++
+ 2009-12-01 Stephane Letz  <letz at grame.fr>
+ 
+-	* Fix port_rename callback : now both old name and new name are given as parameters.
+-
++	* Fix port_rename callback : now both old name and new name are given as parameters.
++
+ 2009-11-30 Stephane Letz  <letz at grame.fr>
+ 
+-	* Devin Anderson patch for Jack FFADO driver issues with lost MIDI bytes between periods (and more). 
+-
++	* Devin Anderson patch for Jack FFADO driver issues with lost MIDI bytes between periods (and more). 
++
+ 2009-11-29 Stephane Letz  <letz at grame.fr>
+ 
+-	* More robust sample rate change handling code in JackCoreAudioDriver.
+-
++	* More robust sample rate change handling code in JackCoreAudioDriver.
++
+ 2009-11-24 Stephane Letz  <letz at grame.fr>
+ 
+-	* Dynamic choice of maximum port number.
+-
++	* Dynamic choice of maximum port number.
++
+ 2009-11-23 Stephane Letz  <letz at grame.fr>
+ 
+-	* Peter L Jones patch for NetJack1 compilation on Windows.
+-
++	* Peter L Jones patch for NetJack1 compilation on Windows.
++
+ 2009-11-20 Stephane Letz  <letz at grame.fr>
+ 
+-	* Version 1.9.5 started.
+-	* Client debugging code improved.
+-
++	* Version 1.9.5 started.
++	* Client debugging code improved.
++
+ 2009-11-18 Stephane Letz  <letz at grame.fr>
+ 
+-	* Sync JackCoreAudioAdapter code with JackCoreAudioDriver.
+-
++	* Sync JackCoreAudioAdapter code with JackCoreAudioDriver.
++
+ 2009-11-17 Stephane Letz  <letz at grame.fr>
+ 
+-	* In JackCoreAudio driver, clock drift compensation in aggregated devices working.
+-	* In JackCoreAudio driver, clock drift compensation semantic changed a bit : when on, does not activate if not needed (same clock domain).
+-
++	* In JackCoreAudio driver, clock drift compensation in aggregated devices working.
++	* In JackCoreAudio driver, clock drift compensation semantic changed a bit : when on, does not activate if not needed (same clock domain).
++
+ 2009-11-16 Stephane Letz  <letz at grame.fr>
+ 
+-	* In JackCoreAudio driver, (possibly) clock drift compensation when needed in aggregated devices.
+-
++	* In JackCoreAudio driver, (possibly) clock drift compensation when needed in aggregated devices.
++
+ 2009-11-14 Stephane Letz  <letz at grame.fr>
+ 
+-	* Sync with JACK1 : -r parameter now used for no-realtime, realtime (-R) is now default, usable backend given vie platform.
+-
++	* Sync with JACK1 : -r parameter now used for no-realtime, realtime (-R) is now default, usable backend given vie platform.
++
+ 2009-11-13 Stephane Letz  <letz at grame.fr>
+ 
+-	* Better memory allocation error checking in ringbuffer.c, weak import improvements.
+-	* Memory allocation error checking for jack_client_new and jack_client_open (server and client side).
+-	* Memory allocation error checking in server for RPC.
+-	* Simplify server temporary mode : now use a JackTemporaryException.
+-	* Lock/Unlock shared memory segments (to test...).
+-
++	* Better memory allocation error checking in ringbuffer.c, weak import improvements.
++	* Memory allocation error checking for jack_client_new and jack_client_open (server and client side).
++	* Memory allocation error checking in server for RPC.
++	* Simplify server temporary mode : now use a JackTemporaryException.
++	* Lock/Unlock shared memory segments (to test...).
++
+ 2009-11-12 Stephane Letz  <letz at grame.fr>
+ 
+-	* Better memory allocation error checking on client (library) side. 
+-
++	* Better memory allocation error checking on client (library) side. 
++
+ 2009-11-11 Stephane Letz  <letz at grame.fr>
+ 
+-	* Correct JackCoreAudio driver when empty strings are given as -C, -P or -d parameter. 
+-
++	* Correct JackCoreAudio driver when empty strings are given as -C, -P or -d parameter. 
++
+ 2009-11-10 Stephane Letz  <letz at grame.fr>
+ 
+-	* Correct JackInfoShutdownCallback prototype, two new JackClientProcessFailure and JackClientZombie JackStatus code.  
+-
++	* Correct JackInfoShutdownCallback prototype, two new JackClientProcessFailure and JackClientZombie JackStatus code.  
++
+ 2009-11-09 Stephane Letz  <letz at grame.fr>
+ 
+-	* Correct JackGraphManager::GetBuffer for the "client loop with one connection" case : buffer must be copied.
+-
++	* Correct JackGraphManager::GetBuffer for the "client loop with one connection" case : buffer must be copied.
++
+ 2009-11-07 Stephane Letz  <letz at grame.fr>
+ 
+-	* Fix AcquireRealTime and DropRealTime: now distinguish when called from another thread (AcquireRealTime/DropRealTime) and from the thread itself (AcquireSelfRealTime/DropSelfRealTime).
+-	* Correct JackPosixThread::StartImp : thread priority setting now done in the RT case only.
+-
++	* Fix AcquireRealTime and DropRealTime: now distinguish when called from another thread (AcquireRealTime/DropRealTime) and from the thread itself (AcquireSelfRealTime/DropSelfRealTime).
++	* Correct JackPosixThread::StartImp : thread priority setting now done in the RT case only.
++
+ 2009-11-06 Stephane Letz  <letz at grame.fr>
+ 
+-	* Correctly save and restore RT mode state in freewheel mode.
+-	* Correct freewheel code on client side.
+-
++	* Correctly save and restore RT mode state in freewheel mode.
++	* Correct freewheel code on client side.
++
+ 2009-11-05 Stephane Letz  <letz at grame.fr>
+ 
+-	* No reason to make jack_on_shutdown deprecated, so revert the incorrect change.
+-	* Thread AcquireRealTime and DropRealTime were (incorrectly) using fThread field. Use pthread_self()) (or GetCurrentThread() on Windows) to get the calling thread.
+-
++	* No reason to make jack_on_shutdown deprecated, so revert the incorrect change.
++	* Thread AcquireRealTime and DropRealTime were (incorrectly) using fThread field. Use pthread_self()) (or GetCurrentThread() on Windows) to get the calling thread.
++
+ 2009-10-30 Stephane Letz  <letz at grame.fr>
+ 
+-	* In JackCoreAudioDriver, improve management of input/output channels: -1 is now used internally to indicate a wanted max value. 
+-	* In JackCoreAudioDriver::OpenAUHAL, correct stream format setup and cleanup. 
+-	* Correct crash bug in JackAudioAdapterInterface when not input is used in adapter (temporary fix...)
+-	* Sync JackCoreAudioAdapter code on JackCoreAudioDriver one.
+-	* JACK_SCHED_POLICY switched to SCHED_FIFO.
+-	* Now can aggregate device that are themselves AD.
+-
++	* In JackCoreAudioDriver, improve management of input/output channels: -1 is now used internally to indicate a wanted max value. 
++	* In JackCoreAudioDriver::OpenAUHAL, correct stream format setup and cleanup. 
++	* Correct crash bug in JackAudioAdapterInterface when not input is used in adapter (temporary fix...)
++	* Sync JackCoreAudioAdapter code on JackCoreAudioDriver one.
++	* JACK_SCHED_POLICY switched to SCHED_FIFO.
++	* Now can aggregate device that are themselves AD.
++
+ 2009-10-29 Stephane Letz  <letz at grame.fr>
+ 
+-	* In JackCoreAudioDriver::Start, wait for the audio driver to effectively start (use the MeasureCallback).
+-
++	* In JackCoreAudioDriver::Start, wait for the audio driver to effectively start (use the MeasureCallback).
++
+ 2009-10-28 Stephane Letz  <letz at grame.fr>
+ 
+-	* In JackCoreAudioDriver, force the SR value to the wanted one *before* creating aggregate device (otherwise creation will fail). 
+-	* In JackCoreAudioDriver, better cleanup of AD when intermediate open failure.
+-
++	* In JackCoreAudioDriver, force the SR value to the wanted one *before* creating aggregate device (otherwise creation will fail). 
++	* In JackCoreAudioDriver, better cleanup of AD when intermediate open failure.
++
+ 2009-10-27 Stephane Letz  <letz at grame.fr>
+ 
+-	* Dynamic system version detection in JackCoreAudioDriver to either create public or private aggregate device.
+-
++	* Dynamic system version detection in JackCoreAudioDriver to either create public or private aggregate device.
++
+ 2009-10-26 Stephane Letz  <letz at grame.fr>
+ 
+-	* Implement "hog mode" (exclusive access of the audio device) in JackCoreAudioDriver.
+-	* Fix jack_set_sample_rate_callback to have he same behavior as in JACK1.
+-
++	* Implement "hog mode" (exclusive access of the audio device) in JackCoreAudioDriver.
++	* Fix jack_set_sample_rate_callback to have he same behavior as in JACK1.
++
+ 2009-10-25 Stephane Letz  <letz at grame.fr>
+ 
+-	* Improve aggregate device management in JackCoreAudioDriver : now a "private" device only and cleanup properly.
+-	* Aggregate device code added to JackCoreAudioAdapter.
+-
++	* Improve aggregate device management in JackCoreAudioDriver : now a "private" device only and cleanup properly.
++	* Aggregate device code added to JackCoreAudioAdapter.
++
+ 2009-10-23 Stephane Letz  <letz at grame.fr>
+ 
+-	* Correct JackProcessSync::LockedTimedWait.
+-	* Correct JACK_MESSAGE_SIZE value, particularly in OSX RPC code.
+-	* Now start server channel thread only when backend has been started (so in JackServer::Start). Should solve race conditions at start time.
+-	* jack_verbose moved to JackGlobals class.
+-
++	* Correct JackProcessSync::LockedTimedWait.
++	* Correct JACK_MESSAGE_SIZE value, particularly in OSX RPC code.
++	* Now start server channel thread only when backend has been started (so in JackServer::Start). Should solve race conditions at start time.
++	* jack_verbose moved to JackGlobals class.
++
+ 2009-10-22 Stephane Letz  <letz at grame.fr>
+ 
+-	* Correct jackdmp.cpp (failures case were not correct..). Improve JackCoreAudioDriver code. Raise default port number to 2048.
+-
++	* Correct jackdmp.cpp (failures case were not correct..). Improve JackCoreAudioDriver code. Raise default port number to 2048.
++
+ 2009-10-20 Stephane Letz  <letz at grame.fr>
+ 
+-	* Add a string parameter to server ==> client notification, add a new JackInfoShutdownCallback type.
+-	* CoreAudio backend now issue a JackInfoShutdownCallback when an unrecoverable error is detected (sampling rate change, stream configuration changeÉ)
++	* Add a string parameter to server ==> client notification, add a new JackInfoShutdownCallback type.
++	* CoreAudio backend now issue a JackInfoShutdownCallback when an unrecoverable error is detected (sampling rate change, stream configuration changeÉ)
+ 
+ 2009-10-17 Stephane Letz  <letz at grame.fr>
+ 
+-	* Correct server temporary mode : now set a global and quit after server/client message handling is finished.
+-
++	* Correct server temporary mode : now set a global and quit after server/client message handling is finished.
++
+ 2009-10-15 Stephane Letz  <letz at grame.fr>
+ 
+-	* Change CoreAudio notification thread setup for OSX Snow Leopard.
+-
++	* Change CoreAudio notification thread setup for OSX Snow Leopard.
++
+ 2009-09-18 Stephane Letz  <letz at grame.fr>
+ 
+-	* Simplify transport in NetJack2: master only can control transport.
++	* Simplify transport in NetJack2: master only can control transport.
+ 
+ 2009-09-15 Stephane Letz  <letz at grame.fr>
+ 
+-	* Correct CPU timing in JackNetDriver, now take cycle begin time after Read.
++	* Correct CPU timing in JackNetDriver, now take cycle begin time after Read.
+ 	* Fix issues in JackNetDriver::DecodeTransportData and JackNetDriver::Initialize.
+ 
+ 2009-08-28 Stephane Letz  <letz at grame.fr>
+@@ -557,7 +593,7 @@
+ 2008-11-21 Stephane Letz  <letz at grame.fr>
+ 
+ 	* Report ringbuffer.c fixes from JACK1.
+-	* Better isolation of server and clients system resources to allow starting the server in several user account at the same time.
++	* Better isolation of server and clients system resources to allow starting the server in several user account at the same time.
+ 	* Correct ressource cleanup in case of driver open failure.
+ 
+ 2008-11-19 Stephane Letz  <letz at grame.fr>
+--- a/common/JackAtomicArrayState.h
++++ b/common/JackAtomicArrayState.h
+@@ -1,21 +1,21 @@
+ /*
+-Copyright (C) 2004-2006 Grame
+-
+-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., 675 Mass Ave, Cambridge, MA 02139, USA.
+-
+-*/
++ Copyright (C) 2004-2008 Grame
++ 
++ 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 __JackAtomicArrayState__
+ #define __JackAtomicArrayState__
+--- a/common/JackConstants.h
++++ b/common/JackConstants.h
+@@ -24,7 +24,7 @@
+ #include "config.h"
+ #endif
+ 
+-#define VERSION "1.9.5"
++#define VERSION "1.9.6"
+ 
+ #define BUFFER_SIZE_MAX 8192
+ 
+@@ -88,7 +88,7 @@
+ 
+ #define ALL_CLIENTS -1 // for notification
+ 
+-#define JACK_PROTOCOL_VERSION 7  
++#define JACK_PROTOCOL_VERSION 8
+ 
+ #define SOCKET_TIME_OUT 5               // in sec
+ #define DRIVER_OPEN_TIMEOUT 5           // in sec
+--- a/common/JackControlAPI.h
++++ b/common/JackControlAPI.h
+@@ -47,7 +47,7 @@
+ #define JACK_PARAM_MAX (JackParamBool + 1)
+ 
+ /** @brief Max length of string parameter value, excluding terminating nul char */
+-#define JACK_PARAM_STRING_MAX  63
++#define JACK_PARAM_STRING_MAX  127
+ 
+ /** @brief Type for parameter value */
+ /* intentionally similar to jack_driver_param_value_t */
+--- a/common/JackError.cpp
++++ b/common/JackError.cpp
+@@ -1,23 +1,23 @@
+ /*
+-    Copyright (C) 2001 Paul Davis
+-	Copyright (C) 2004-2008 Grame
+-    Copyright (C) 2008 Nedko Arnaudov
+-
+-    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., 675 Mass Ave, Cambridge, MA 02139, USA.
+-
+-*/
++ Copyright (C) 2001 Paul Davis
++ Copyright (C) 2004-2008 Grame
++ Copyright (C) 2008 Nedko Arnaudov
++ 
++ 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 <stdarg.h>
+ #include <stdio.h>
+--- a/common/JackError.h
++++ b/common/JackError.h
+@@ -1,22 +1,21 @@
+ /*
+-Copyright (C) 2001 Paul Davis
+-Copyright (C) 2004-2008 Grame
+-Copyright (C) 2008 Nedko Arnaudov
+-
+-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., 675 Mass Ave, Cambridge, MA 02139, USA.
+-
++ Copyright (C) 2001 Paul Davis
++ Copyright (C) 2004-2008 Grame
++ Copyright (C) 2008 Nedko Arnaudov
++
++ 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.
+ 
+ */
+ 
+--- a/common/JackGraphManager.cpp
++++ b/common/JackGraphManager.cpp
+@@ -385,7 +385,7 @@
+ void JackGraphManager::DeactivatePort(jack_port_id_t port_index)
+ {
+     JackPort* port = GetPort(port_index);
+-    port->fFlags = (JackPortFlags)(port->fFlags | ~JackPortIsActive);
++    port->fFlags = (JackPortFlags)(port->fFlags & ~JackPortIsActive);
+ }
+ 
+ void JackGraphManager::GetInputPorts(int refnum, jack_int_t* res)
+--- a/common/JackNetTool.cpp
++++ b/common/JackNetTool.cpp
+@@ -283,7 +283,7 @@
+         jack_info ( "Sample rate : %u frames per second", params->fSampleRate );
+         jack_info ( "Period size : %u frames per period", params->fPeriodSize );
+         jack_info ( "Frames per packet : %u", params->fFramesPerPacket );
+-        jack_info ( "Packet per period : %u", params->fPeriodSize / params->fFramesPerPacket );
++        jack_info ( "Packet per period : %u", (params->fFramesPerPacket != 0) ? params->fPeriodSize / params->fFramesPerPacket : 0);
+         jack_info ( "Bitdepth : %s", bitdepth );
+         jack_info ( "Slave mode : %s", ( params->fSlaveSyncMode ) ? "sync" : "async" );
+         jack_info ( "Network mode : %s", mode );
+--- a/common/JackShmMem.cpp
++++ b/common/JackShmMem.cpp
+@@ -1,22 +1,21 @@
+ /*
+-Copyright (C) 2001 Paul Davis
+-Copyright (C) 2004-2009 Grame
+-
+-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., 675 Mass Ave, Cambridge, MA 02139, USA.
+-
+-*/
++ Copyright (C) 2004-2008 Grame
++ 
++ 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 "JackError.h"
+ #include "JackShmMem.h"
+--- a/common/JackShmMem.h
++++ b/common/JackShmMem.h
+@@ -1,22 +1,21 @@
+ /*
+-Copyright (C) 2001 Paul Davis
+-Copyright (C) 2004-2009 Grame
+-
+-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., 675 Mass Ave, Cambridge, MA 02139, USA.
+-
+-*/
++ Copyright (C) 2004-2008 Grame
++ 
++ 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 __JackShmMem__
+ #define __JackShmMem__
+--- a/common/JackTools.cpp
++++ b/common/JackTools.cpp
+@@ -194,7 +194,7 @@
+         }
+ 
+         if (fgets(buf, sizeof(buf), in) == NULL) {
+-            fclose(in);
++            pclose(in);
+             return -1;
+         }
+ 
+@@ -202,7 +202,7 @@
+ 
+         if (buf[len - 1] != '\n') {
+             /* didn't get a whole line */
+-            fclose(in);
++            pclose(in);
+             return -1;
+         }
+ 
+@@ -210,7 +210,7 @@
+         memcpy(jack_tmpdir, buf, len - 1);
+         jack_tmpdir[len - 1] = '\0';
+ 
+-        fclose(in);
++        pclose(in);
+         return 0;
+     }
+ #endif
+--- a/common/JackWeakAPI.cpp
++++ b/common/JackWeakAPI.cpp
+@@ -1,33 +1,36 @@
+-/*
+-Copyright (C) 2009 Grame
+-
+-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.
++//=============================================================================
++//  MuseScore
++//  Linux Music Score Editor
++//  $Id:
++//
++//  jackWeakAPI based on code from Stéphane Letz (Grame)
++//  partly based on Julien Pommier (PianoTeq : http://www.pianoteq.com/) code.
++//
++//  Copyright (C) 2002-2007 Werner Schweer and others
++//  Copyright (C) 2009 Grame
+ 
+-*/
+-
+-/*
+-    Completed from Julien Pommier (PianoTeq : http://www.pianoteq.com/) code.
+-*/
++//  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 <jack/jack.h>
+ #include <jack/thread.h>
+ #include <jack/midiport.h>
+ #include <math.h>
++#ifndef WIN32
+ #include <dlfcn.h>
++#endif
+ #include <stdlib.h>
+-#include <cassert>
+ #include <iostream>
+ 
+ /* dynamically load libjack and forward all registered calls to libjack 
+@@ -40,13 +43,21 @@
+ using std::cerr;
+ 
+ int libjack_is_present = 0;     // public symbol, similar to what relaytool does.
++
++#ifdef WIN32
++HMODULE libjack_handle = 0;
++#else
+ static void *libjack_handle = 0;
++#endif
++
+ 
+ static void __attribute__((constructor)) tryload_libjack()
+ {
+     if (getenv("SKIP_LIBJACK") == 0) { // just in case libjack is causing troubles..
+     #ifdef __APPLE__
+         libjack_handle = dlopen("libjack.0.dylib", RTLD_LAZY);
++    #elif defined(WIN32)
++        libjack_handle = LoadLibrary("libjack.dll");
+     #else
+         libjack_handle = dlopen("libjack.so.0", RTLD_LAZY);
+     #endif
+@@ -59,12 +70,22 @@
+ {
+     void *fn = 0;
+     if (!libjack_handle) { 
+-        std::cerr << "libjack not found, so do not try to load " << fn_name << " ffs !\n";
++        fprintf (stderr, "libjack not found, so do not try to load  %s ffs  !\n", fn_name);
+         return 0;
+     }
++#ifdef WIN32
++    fn = (void*)GetProcAddress(libjack_handle, fn_name);
++#else
+     fn = dlsym(libjack_handle, fn_name);
++#endif
+     if (!fn) { 
+-        std::cerr << "could not dlsym(" << libjack_handle << "), " << dlerror() << "\n"; 
++#ifdef WIN32
++        char* lpMsgBuf;
++        FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,NULL,GetLastError(),MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),(LPTSTR) &lpMsgBuf,0,NULL );
++        fprintf (stderr, "could not GetProcAddress( %s ), %s \n", fn_name, lpMsgBuf) ;
++#else        
++        fprintf (stderr, "could not dlsym( %s ), %s \n", fn_name, dlerror()) ; 
++#endif
+     }
+     return fn;
+ }
+@@ -78,6 +99,15 @@
+     else return (return_type)-1;                                                      \
+   }
+ 
++#define DECL_FUNCTION_NULL(return_type, fn_name, arguments_types, arguments) \
++  typedef return_type (*fn_name##_ptr_t)arguments_types;                \
++  return_type fn_name arguments_types {                                 \
++    static fn_name##_ptr_t fn = 0;                                      \
++    if (fn == 0) { fn = (fn_name##_ptr_t)load_jack_function(#fn_name); } \
++    if (fn) return (*fn)arguments;                                      \
++    else return (return_type)0;                                                      \
++  }
++  
+ #define DECL_VOID_FUNCTION(fn_name, arguments_types, arguments)         \
+   typedef void (*fn_name##_ptr_t)arguments_types;                       \
+   void fn_name arguments_types {                                        \
+@@ -86,14 +116,15 @@
+     if (fn) (*fn)arguments;                                             \
+   }
+ 
++
+ DECL_VOID_FUNCTION(jack_get_version, (int *major_ptr, int *minor_ptr, int *micro_ptr, int *proto_ptr), (major_ptr, minor_ptr, micro_ptr, proto_ptr));
+-DECL_FUNCTION(const char *, jack_get_version_string, (), ());      
+-DECL_FUNCTION(jack_client_t *, jack_client_open, (const char *client_name, jack_options_t options, jack_status_t *status, ...), 
++DECL_FUNCTION_NULL(const char *, jack_get_version_string, (), ());      
++DECL_FUNCTION_NULL(jack_client_t *, jack_client_open, (const char *client_name, jack_options_t options, jack_status_t *status, ...), 
+               (client_name, options, status));
+ DECL_FUNCTION(int, jack_client_close, (jack_client_t *client), (client));
+-DECL_FUNCTION(jack_client_t *, jack_client_new, (const char *client_name), (client_name));
++DECL_FUNCTION_NULL(jack_client_t *, jack_client_new, (const char *client_name), (client_name));
+ DECL_FUNCTION(int, jack_client_name_size, (), ());
+-DECL_FUNCTION(char*, jack_get_client_name, (jack_client_t *client), (client));
++DECL_FUNCTION_NULL(char*, jack_get_client_name, (jack_client_t *client), (client));
+ DECL_FUNCTION(int, jack_internal_client_new, (const char *client_name,
+                                             const char *load_name,
+                                             const char *load_init), (client_name, load_name, load_init));
+@@ -146,21 +177,21 @@
+                                             void *arg), (client, xrun_callback, arg));
+ DECL_FUNCTION(int, jack_activate, (jack_client_t *client), (client));
+ DECL_FUNCTION(int, jack_deactivate, (jack_client_t *client), (client));
+-DECL_FUNCTION(jack_port_t *, jack_port_register, (jack_client_t *client, const char *port_name, const char *port_type,
++DECL_FUNCTION_NULL(jack_port_t *, jack_port_register, (jack_client_t *client, const char *port_name, const char *port_type,
+                                                   unsigned long flags, unsigned long buffer_size),
+               (client, port_name, port_type, flags, buffer_size));
+ DECL_FUNCTION(int, jack_port_unregister, (jack_client_t *client, jack_port_t* port), (client, port));
+-DECL_FUNCTION(void *, jack_port_get_buffer, (jack_port_t *port, jack_nframes_t nframes), (port, nframes));
+-DECL_FUNCTION(const char*, jack_port_name, (const jack_port_t *port), (port));
+-DECL_FUNCTION(const char*, jack_port_short_name, (const jack_port_t *port), (port));
++DECL_FUNCTION_NULL(void *, jack_port_get_buffer, (jack_port_t *port, jack_nframes_t nframes), (port, nframes));
++DECL_FUNCTION_NULL(const char*, jack_port_name, (const jack_port_t *port), (port));
++DECL_FUNCTION_NULL(const char*, jack_port_short_name, (const jack_port_t *port), (port));
+ DECL_FUNCTION(int, jack_port_flags, (const jack_port_t *port), (port));
+-DECL_FUNCTION(const char*, jack_port_type, (const jack_port_t *port), (port));
++DECL_FUNCTION_NULL(const char*, jack_port_type, (const jack_port_t *port), (port));
+ DECL_FUNCTION(jack_port_type_id_t, jack_port_type_id, (const jack_port_t *port), (port));
+ DECL_FUNCTION(int, jack_port_is_mine, (const jack_client_t *client, const jack_port_t* port), (client, port));
+ DECL_FUNCTION(int, jack_port_connected, (const jack_port_t *port), (port));
+ DECL_FUNCTION(int, jack_port_connected_to, (const jack_port_t *port, const char *port_name), (port, port_name));
+-DECL_FUNCTION(const char**, jack_port_get_connections, (const jack_port_t *port), (port));
+-DECL_FUNCTION(const char**, jack_port_get_all_connections, (const jack_client_t *client,const jack_port_t *port), (client, port));
++DECL_FUNCTION_NULL(const char**, jack_port_get_connections, (const jack_port_t *port), (port));
++DECL_FUNCTION_NULL(const char**, jack_port_get_all_connections, (const jack_client_t *client,const jack_port_t *port), (client, port));
+ DECL_FUNCTION(int, jack_port_tie, (jack_port_t *src, jack_port_t *dst), (src, dst));
+ DECL_FUNCTION(int, jack_port_untie, (jack_port_t *port), (port));
+ DECL_FUNCTION(jack_nframes_t, jack_port_get_latency, (jack_port_t *port), (port));
+@@ -185,10 +216,10 @@
+             
+ DECL_FUNCTION(jack_nframes_t, jack_get_sample_rate, (jack_client_t *client), (client));
+ DECL_FUNCTION(jack_nframes_t, jack_get_buffer_size, (jack_client_t *client), (client));
+-DECL_FUNCTION(const char**, jack_get_ports, (jack_client_t *client, const char *port_name_pattern, const char *	type_name_pattern,
++DECL_FUNCTION_NULL(const char**, jack_get_ports, (jack_client_t *client, const char *port_name_pattern, const char *	type_name_pattern,
+                                              unsigned long flags), (client, port_name_pattern, type_name_pattern, flags));
+-DECL_FUNCTION(jack_port_t *, jack_port_by_name, (jack_client_t * client, const char *port_name), (client, port_name));
+-DECL_FUNCTION(jack_port_t *, jack_port_by_id, (jack_client_t *client, jack_port_id_t port_id), (client, port_id));
++DECL_FUNCTION_NULL(jack_port_t *, jack_port_by_name, (jack_client_t * client, const char *port_name), (client, port_name));
++DECL_FUNCTION_NULL(jack_port_t *, jack_port_by_id, (jack_client_t *client, jack_port_id_t port_id), (client, port_id));
+ 
+ DECL_FUNCTION(int, jack_engine_takeover_timebase, (jack_client_t * client), (client));
+ DECL_FUNCTION(jack_nframes_t, jack_frames_since_cycle_start, (const jack_client_t * client), (client));
+@@ -198,7 +229,7 @@
+ DECL_FUNCTION(jack_nframes_t, jack_frame_time, (const jack_client_t *client), (client));
+ DECL_FUNCTION(jack_nframes_t, jack_last_frame_time, (const jack_client_t *client), (client));
+ DECL_FUNCTION(float, jack_cpu_load, (jack_client_t *client), (client));
+-DECL_FUNCTION(pthread_t, jack_client_thread_id, (jack_client_t *client), (client));
++DECL_FUNCTION_NULL(pthread_t, jack_client_thread_id, (jack_client_t *client), (client));
+ DECL_VOID_FUNCTION(jack_set_error_function, (print_function fun), (fun));
+ DECL_VOID_FUNCTION(jack_set_info_function, (print_function fun), (fun));
+ 
+@@ -256,6 +287,6 @@
+ DECL_FUNCTION(int, jack_midi_event_get, (jack_midi_event_t* event, void* port_buffer, jack_nframes_t event_index), (event, port_buffer, event_index)) ;
+ DECL_VOID_FUNCTION(jack_midi_clear_buffer, (void* port_buffer), (port_buffer));
+ DECL_FUNCTION(size_t, jack_midi_max_event_size, (void* port_buffer), (port_buffer));
+-DECL_FUNCTION(jack_midi_data_t*, jack_midi_event_reserve, (void* port_buffer, jack_nframes_t time, size_t data_size), (port_buffer, time, data_size));
++DECL_FUNCTION_NULL(jack_midi_data_t*, jack_midi_event_reserve, (void* port_buffer, jack_nframes_t time, size_t data_size), (port_buffer, time, data_size));
+ DECL_FUNCTION(int, jack_midi_event_write, (void* port_buffer, jack_nframes_t time, const jack_midi_data_t* data, size_t data_size), (port_buffer, time, data, data_size));
+ DECL_FUNCTION(jack_nframes_t, jack_midi_get_lost_event_count, (void* port_buffer), (port_buffer));
+--- a/common/driver_interface.h
++++ b/common/driver_interface.h
+@@ -33,7 +33,7 @@
+ 
+ #define JACK_DRIVER_NAME_MAX          15
+ #define JACK_DRIVER_PARAM_NAME_MAX    15
+-#define JACK_DRIVER_PARAM_STRING_MAX  63
++#define JACK_DRIVER_PARAM_STRING_MAX  127
+ #define JACK_DRIVER_PARAM_DESC        255
+ #define JACK_PATH_MAX                 511
+ 
+--- a/common/jack/control.h
++++ b/common/jack/control.h
+@@ -48,8 +48,8 @@
+ /** @brief Max value that jackctl_param_type_t type can have */
+ #define JACK_PARAM_MAX (JackParamBool + 1)
+ 
+-/** @brief Max length of string parameter value, excluding terminating nul char */
+-#define JACK_PARAM_STRING_MAX  63
++/** @brief Max length of string parameter value, excluding terminating null char */
++#define JACK_PARAM_STRING_MAX  127
+ 
+ /** @brief Type for parameter value */
+ /* intentionally similar to jack_driver_param_value_t */
+--- a/common/shm.c
++++ b/common/shm.c
+@@ -1,24 +1,3 @@
+-/*
+- * Copyright (C) 2003 Paul Davis
+- * Copyright (C) 2004 Jack O'Quin
+- * Copyright (C) 2006-2007 Grame
+- *
+- * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+- *
+- */
+-
+ /* This module provides a set of abstract shared memory interfaces
+  * with support using both System V and POSIX shared memory
+  * implementations.  The code is divided into three sections:
+@@ -31,6 +10,25 @@
+  * set in the ./configure step.
+  */
+ 
++/*
++ Copyright (C) 2001-2003 Paul Davis
++ 
++ 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 "JackConstants.h"
+ 
+ #ifdef WIN32
+@@ -148,7 +146,7 @@
+ static int
+ semaphore_init () {return 0;}
+ 
+-static  int
++static  int
+ semaphore_add (int value) {return 0;}
+ 
+ #else
+@@ -534,7 +532,7 @@
+ 		}
+ 	}
+ 
+-	jack_shm_unlock_registry ();
++	jack_shm_unlock_registry ();
+ 	return 0;
+ }
+ 
+--- a/dbus/controller_iface_control.c
++++ b/dbus/controller_iface_control.c
+@@ -87,34 +87,31 @@
+     {
+         if (!jack_controller_start_server(controller_ptr, call))
+         {
+-            jack_error ("Failed to start server");
+-        }
+-        else
+-        {
+-            jack_controller_control_send_signal_server_started();
++            jack_dbus_error(call, JACK_DBUS_ERROR_GENERIC, "Failed to start server");
++            return true;
+         }
++
++        jack_controller_control_send_signal_server_started();
+     }
+     else if (strcmp (call->method_name, "StopServer") == 0)
+     {
+         if (!jack_controller_stop_server(controller_ptr, call))
+         {
+-            jack_error ("Failed to stop server");
+-        }
+-        else
+-        {
+-            jack_controller_control_send_signal_server_stopped();
++            jack_dbus_error(call, JACK_DBUS_ERROR_GENERIC, "Failed to stop server");
++            return true;
+         }
++
++        jack_controller_control_send_signal_server_stopped();
+     }
+     else if (strcmp (call->method_name, "SwitchMaster") == 0)
+     {
+         if (!jack_controller_switch_master(controller_ptr, call))
+         {
+-            jack_error ("Failed to switch master");
+-        }
+-        else
+-        {
+-            jack_controller_control_send_signal_server_stopped();
++            jack_dbus_error(call, JACK_DBUS_ERROR_GENERIC, "Failed to switch master");
++            return true;
+         }
++
++        jack_controller_control_send_signal_server_stopped();
+     }
+     else if (strcmp (call->method_name, "GetLoad") == 0)
+     {
+--- a/doxyfile
++++ b/doxyfile
+@@ -23,7 +23,7 @@
+ # This could be handy for archiving the generated documentation or 
+ # if some version control system is used.
+ 
+-PROJECT_NUMBER         = 1.9.5
++PROJECT_NUMBER         = 1.9.6
+ 
+ # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) 
+ # base path where the generated documentation will be put. 
+--- a/example-clients/alsa_in.c
++++ b/example-clients/alsa_in.c
+@@ -38,6 +38,8 @@
+ int quit = 0;
+ double resample_mean = 1.0;
+ double static_resample_factor = 1.0;
++double resample_lower_limit = 0.25;
++double resample_upper_limit = 4.0;
+ 
+ double *offset_array;
+ double *window_array;
+@@ -388,8 +390,8 @@
+     output_offset = (float) offset;
+ 
+     // Clamp a bit.
+-    if( current_resample_factor < 0.25 ) current_resample_factor = 0.25;
+-    if( current_resample_factor > 4 ) current_resample_factor = 4;
++    if( current_resample_factor < resample_lower_limit ) current_resample_factor = resample_lower_limit;
++    if( current_resample_factor > resample_upper_limit ) current_resample_factor = resample_upper_limit;
+ 
+     // Now Calculate how many samples we need.
+     rlen = ceil( ((double)nframes) / current_resample_factor )+2;
+@@ -675,6 +677,8 @@
+     printf( "selected sample format: %s\n", formats[format].name );
+ 
+     static_resample_factor = (double) jack_sample_rate / (double) sample_rate;
++    resample_lower_limit = static_resample_factor * 0.25;
++    resample_upper_limit = static_resample_factor * 4.0;
+     resample_mean = static_resample_factor;
+ 
+     offset_array = malloc( sizeof(double) * smooth_size );
+--- a/example-clients/alsa_out.c
++++ b/example-clients/alsa_out.c
+@@ -37,6 +37,8 @@
+ 
+ double resample_mean = 1.0;
+ double static_resample_factor = 1.0;
++double resample_lower_limit = 0.25;
++double resample_upper_limit = 4.0;
+ 
+ double *offset_array;
+ double *window_array;
+@@ -395,8 +397,8 @@
+     output_offset = (float) offset;
+ 
+     // Clamp a bit.
+-    if( current_resample_factor < 0.25 ) current_resample_factor = 0.25;
+-    if( current_resample_factor > 4 ) current_resample_factor = 4;
++    if( current_resample_factor < resample_lower_limit ) current_resample_factor = resample_lower_limit;
++    if( current_resample_factor > resample_upper_limit ) current_resample_factor = resample_upper_limit;
+ 
+     // Now Calculate how many samples we need.
+     rlen = ceil( ((double)nframes) * current_resample_factor )+2;
+@@ -666,6 +668,8 @@
+ 	sample_rate = jack_sample_rate;
+ 
+     static_resample_factor =  (double) sample_rate / (double) jack_sample_rate;
++    resample_lower_limit = static_resample_factor * 0.25;
++    resample_upper_limit = static_resample_factor * 4.0;
+     resample_mean = static_resample_factor;
+ 
+     offset_array = malloc( sizeof(double) * smooth_size );
+--- a/example-clients/internal_metro.cpp
++++ b/example-clients/internal_metro.cpp
+@@ -46,7 +46,6 @@
+ {
+     sample_t scale;
+     int i, attack_length, decay_length;
+-    double *amp;
+     int attack_percent = 1, decay_percent = 10;
+     const char *bpm_string = "bpm";
+ 
+@@ -59,7 +58,7 @@
+     }
+     if ((client = jack_client_open (client_name, JackNullOption, NULL)) == 0) {
+         fprintf (stderr, "jack server not running?\n");
+-        return ;
++        return;
+     }
+ 
+     jack_set_process_callback (client, process_audio, this);
+@@ -81,11 +80,11 @@
+         	 ", wave length = %" PRIu32 "\n", tone_length,
+         	 wave_length);
+         */ 
+-        return ;
++        return;
+     }
+     if (attack_length + decay_length > (int)tone_length) {
+         fprintf (stderr, "invalid attack/decay\n");
+-        return ;
++        return;
+     }
+ 
+     /* Build the wave table */
+@@ -110,7 +109,6 @@
+ 
+     if (jack_activate (client)) {
+         fprintf(stderr, "cannot activate client");
+-        return;
+     }
+ }
+ 
+@@ -120,4 +118,6 @@
+     jack_port_unregister(client, input_port);
+     jack_port_unregister(client, output_port);
+     jack_client_close(client);
++    free(amp);
++    free(wave);
+ }
+--- a/example-clients/internal_metro.h
++++ b/example-clients/internal_metro.h
+@@ -53,6 +53,7 @@
+         int bpm;
+         jack_nframes_t tone_length, wave_length;
+         sample_t *wave;
++        double *amp;
+         long offset ;
+ 
+         InternalMetro(int freq, double max_amp, int dur_arg, int bpm, char* client_name);
+--- a/example-clients/metro.c
++++ b/example-clients/metro.c
+@@ -257,7 +257,7 @@
+ 
+ 	if (jack_activate (client)) {
+ 		fprintf (stderr, "cannot activate client\n");
+-		return 1;
++		goto error;
+ 	}
+     
+     /* install a signal handler to properly quits jack client */
+@@ -282,5 +282,9 @@
+ 	};
+ 	
+     jack_client_close(client);
++    
++error:
++    free(amp);
++    free(wave);
+     exit (0);
+ }
+--- a/linux/firewire/JackFFADODriver.cpp
++++ b/linux/firewire/JackFFADODriver.cpp
+@@ -429,7 +429,7 @@
+ 
+         driver->capture_channels[chn].stream_type = ffado_streaming_get_capture_stream_type(driver->dev, chn);
+         if (driver->capture_channels[chn].stream_type == ffado_stream_type_audio) {
+-            snprintf(buf, sizeof(buf) - 1, "%s:%s", fClientControl.fName, portname);
++            snprintf(buf, sizeof(buf) - 1, "firewire_pcm:%s_in", portname);
+             printMessage ("Registering audio capture port %s", buf);
+             if ((port_index = fGraphManager->AllocatePort(fClientControl.fRefNum, buf,
+                               JACK_DEFAULT_AUDIO_TYPE,
+@@ -455,7 +455,7 @@
+             fCaptureChannels++;
+ 
+         } else if (driver->capture_channels[chn].stream_type == ffado_stream_type_midi) {
+-            snprintf(buf, sizeof(buf) - 1, "%s:%s", fClientControl.fName, portname);
++            snprintf(buf, sizeof(buf) - 1, "firewire_pcm:%s_in", portname);
+             printMessage ("Registering midi capture port %s", buf);
+             if ((port_index = fGraphManager->AllocatePort(fClientControl.fRefNum, buf,
+                               JACK_DEFAULT_MIDI_TYPE,
+@@ -502,7 +502,7 @@
+         driver->playback_channels[chn].stream_type = ffado_streaming_get_playback_stream_type(driver->dev, chn);
+ 
+         if (driver->playback_channels[chn].stream_type == ffado_stream_type_audio) {
+-            snprintf(buf, sizeof(buf) - 1, "%s:%s", fClientControl.fName, portname);
++            snprintf(buf, sizeof(buf) - 1, "firewire_pcm:%s_out", portname);
+             printMessage ("Registering audio playback port %s", buf);
+             if ((port_index = fGraphManager->AllocatePort(fClientControl.fRefNum, buf,
+                               JACK_DEFAULT_AUDIO_TYPE,
+@@ -530,7 +530,7 @@
+             jack_log("JackFFADODriver::Attach fPlaybackPortList[i] %ld ", port_index);
+             fPlaybackChannels++;
+         } else if (driver->playback_channels[chn].stream_type == ffado_stream_type_midi) {
+-            snprintf(buf, sizeof(buf) - 1, "%s:%s", fClientControl.fName, portname);
++            snprintf(buf, sizeof(buf) - 1, "firewire_pcm:%s_out", portname);
+             printMessage ("Registering midi playback port %s", buf);
+             if ((port_index = fGraphManager->AllocatePort(fClientControl.fRefNum, buf,
+                               JACK_DEFAULT_MIDI_TYPE,
+@@ -753,12 +753,20 @@
+         strcpy (desc->name, "firewire");                               // size MUST be less then JACK_DRIVER_NAME_MAX + 1
+         strcpy(desc->desc, "Linux FFADO API based audio backend");     // size MUST be less then JACK_DRIVER_PARAM_DESC + 1
+        
+-        desc->nparams = 11;
++        desc->nparams = 12;
+ 
+         params = (jack_driver_param_desc_t *)calloc (desc->nparams, sizeof (jack_driver_param_desc_t));
+         desc->params = params;
+ 
+         i = 0;
++        strcpy (params[i].name, "device");
++        params[i].character  = 'd';
++        params[i].type       = JackDriverParamString;
++        strcpy (params[i].value.str,  "hw:0");
++        strcpy (params[i].short_desc, "The FireWire device to use.");
++        strcpy (params[i].long_desc,  "The FireWire device to use. Please consult the FFADO documentation for more info.");
++
++        i++;
+         strcpy (params[i].name, "period");
+         params[i].character  = 'p';
+         params[i].type       = JackDriverParamUInt;
+@@ -881,7 +889,7 @@
+ 
+             switch (param->character) {
+                 case 'd':
+-                    device_name = strdup (param->value.str);
++                    device_name = const_cast<char*>(param->value.str);
+                     break;
+                 case 'p':
+                     cmlparams.period_size = param->value.ui;
+--- a/macosx/Jack-Info.plist
++++ b/macosx/Jack-Info.plist
+@@ -7,7 +7,7 @@
+ 	<key>CFBundleExecutable</key>
+ 	<string>Jackservermp</string>
+ 	<key>CFBundleGetInfoString</key>
+-	<string>Jackdmp 1.9.5, @03-09 Paul Davis, Grame</string>
++	<string>Jackdmp 1.9.6, @03-10 Paul Davis, Grame</string>
+ 	<key>CFBundleIdentifier</key>
+ 	<string>com.grame.Jackmp</string>
+ 	<key>CFBundleInfoDictionaryVersion</key>
+@@ -19,6 +19,6 @@
+ 	<key>CFBundleSignature</key>
+ 	<string>????</string>
+ 	<key>CFBundleVersion</key>
+-	<string>1.9.5</string>
++	<string>1.9.6</string>
+ </dict>
+ </plist>
+--- a/macosx/JackMachServerChannel.cpp
++++ b/macosx/JackMachServerChannel.cpp
+@@ -159,7 +159,7 @@
+         kern_return_t res;
+         if ((res = mach_msg_server(MessageHandler, 1024, fServerPort.GetPortSet(), 0)) != KERN_SUCCESS) {
+             jack_log("JackMachServerChannel::Execute: err = %s", mach_error_string(res));
+-            return false;
++            // A recoverable error, so keep running...
+         }
+         return true;
+         
+--- a/macosx/Jackdmp.xcodeproj/project.pbxproj
++++ b/macosx/Jackdmp.xcodeproj/project.pbxproj
+@@ -106,7 +106,6 @@
+ 		4B19B3140E2362E800DD4A82 /* JackAudioAdapter.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B19B3070E2362E700DD4A82 /* JackAudioAdapter.h */; };
+ 		4B19B3150E2362E800DD4A82 /* JackAudioAdapterInterface.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B19B3080E2362E700DD4A82 /* JackAudioAdapterInterface.cpp */; };
+ 		4B19B3160E2362E800DD4A82 /* JackAudioAdapterInterface.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B19B3090E2362E700DD4A82 /* JackAudioAdapterInterface.h */; };
+-		4B19B3190E2362E800DD4A82 /* JackException.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B19B30C0E2362E700DD4A82 /* JackException.h */; };
+ 		4B19B31B0E2362E800DD4A82 /* JackLibSampleRateResampler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B19B30E0E2362E700DD4A82 /* JackLibSampleRateResampler.cpp */; };
+ 		4B19B31C0E2362E800DD4A82 /* JackLibSampleRateResampler.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B19B30F0E2362E700DD4A82 /* JackLibSampleRateResampler.h */; };
+ 		4B19B31F0E2362E800DD4A82 /* JackResampler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B19B3120E2362E700DD4A82 /* JackResampler.cpp */; };
+@@ -423,15 +422,12 @@
+ 		4B5DB9830CD2429A00EBA5EE /* JackDebugClient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B98AE000931D30C0091932A /* JackDebugClient.cpp */; };
+ 		4B5DB9840CD2429B00EBA5EE /* JackDebugClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B98AE010931D30C0091932A /* JackDebugClient.h */; };
+ 		4B5E08C30E5B66EE00BEE4E0 /* JackAudioAdapterInterface.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B19B3090E2362E700DD4A82 /* JackAudioAdapterInterface.h */; };
+-		4B5E08C40E5B66EE00BEE4E0 /* JackException.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B19B30C0E2362E700DD4A82 /* JackException.h */; };
+ 		4B5E08C60E5B66EE00BEE4E0 /* JackLibSampleRateResampler.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B19B30F0E2362E700DD4A82 /* JackLibSampleRateResampler.h */; };
+ 		4B5E08CC0E5B66EE00BEE4E0 /* JackAudioAdapterInterface.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B19B3080E2362E700DD4A82 /* JackAudioAdapterInterface.cpp */; };
+ 		4B5E08CD0E5B66EE00BEE4E0 /* JackLibSampleRateResampler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B19B30E0E2362E700DD4A82 /* JackLibSampleRateResampler.cpp */; };
+ 		4B5E08CE0E5B66EE00BEE4E0 /* JackResampler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B19B3120E2362E700DD4A82 /* JackResampler.cpp */; };
+ 		4B5E08E10E5B676C00BEE4E0 /* JackNetAdapter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B5E08DF0E5B676C00BEE4E0 /* JackNetAdapter.cpp */; };
+ 		4B5E08E20E5B676D00BEE4E0 /* JackNetAdapter.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B5E08E00E5B676C00BEE4E0 /* JackNetAdapter.h */; };
+-		4B5E08EB0E5B67EA00BEE4E0 /* JackNetInterface.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B76C7680E5AB2DB00E2AC21 /* JackNetInterface.cpp */; };
+-		4B5E08EC0E5B67EB00BEE4E0 /* JackNetInterface.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B76C7690E5AB2DB00E2AC21 /* JackNetInterface.h */; };
+ 		4B5E08EE0E5B680200BEE4E0 /* JackAudioAdapter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B19B3060E2362E700DD4A82 /* JackAudioAdapter.cpp */; };
+ 		4B5E08EF0E5B680200BEE4E0 /* JackAudioAdapter.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B19B3070E2362E700DD4A82 /* JackAudioAdapter.h */; };
+ 		4B5F253E0DEE9B8F0041E486 /* JackLockedEngine.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B5F253D0DEE9B8F0041E486 /* JackLockedEngine.h */; };
+@@ -570,16 +566,24 @@
+ 		4B6C738A0CC60A85001AFFD4 /* thread.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B6C737D0CC60A6D001AFFD4 /* thread.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 		4B6C738B0CC60A86001AFFD4 /* transport.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B6C737E0CC60A6D001AFFD4 /* transport.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 		4B6F7AEE0CD0CDBD00F48A9D /* JackEngineControl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B6F7AEC0CD0CDBD00F48A9D /* JackEngineControl.cpp */; };
+-		4B76C76A0E5AB2DB00E2AC21 /* JackNetInterface.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B76C7680E5AB2DB00E2AC21 /* JackNetInterface.cpp */; };
+-		4B76C76B0E5AB2DB00E2AC21 /* JackNetInterface.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B76C7690E5AB2DB00E2AC21 /* JackNetInterface.h */; };
+-		4B76C76C0E5AB2DB00E2AC21 /* JackNetInterface.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B76C7680E5AB2DB00E2AC21 /* JackNetInterface.cpp */; };
+-		4B76C76D0E5AB2DB00E2AC21 /* JackNetInterface.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B76C7690E5AB2DB00E2AC21 /* JackNetInterface.h */; };
+ 		4B80D7E80BA0D17400F035BB /* JackMidiPort.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B80D7E50BA0D17400F035BB /* JackMidiPort.h */; };
+ 		4B80D7E90BA0D17400F035BB /* JackMidiPort.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B80D7E60BA0D17400F035BB /* JackMidiPort.cpp */; };
+ 		4B80D7EA0BA0D17400F035BB /* JackMidiAPI.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B80D7E70BA0D17400F035BB /* JackMidiAPI.cpp */; };
+ 		4B80D7EB0BA0D17400F035BB /* JackMidiPort.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B80D7E50BA0D17400F035BB /* JackMidiPort.h */; };
+ 		4B80D7EC0BA0D17400F035BB /* JackMidiPort.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B80D7E60BA0D17400F035BB /* JackMidiPort.cpp */; };
+ 		4B80D7ED0BA0D17400F035BB /* JackMidiAPI.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B80D7E70BA0D17400F035BB /* JackMidiAPI.cpp */; };
++		4B88D03B11298BEE007A87C1 /* weakjack.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B88D03911298BEE007A87C1 /* weakjack.h */; settings = {ATTRIBUTES = (Public, ); }; };
++		4B88D03C11298BEE007A87C1 /* weakmacros.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B88D03A11298BEE007A87C1 /* weakmacros.h */; settings = {ATTRIBUTES = (Public, ); }; };
++		4B88D03D11298BEE007A87C1 /* weakjack.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B88D03911298BEE007A87C1 /* weakjack.h */; settings = {ATTRIBUTES = (Public, ); }; };
++		4B88D03E11298BEE007A87C1 /* weakmacros.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B88D03A11298BEE007A87C1 /* weakmacros.h */; settings = {ATTRIBUTES = (Public, ); }; };
++		4B88D03F11298BEE007A87C1 /* weakjack.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B88D03911298BEE007A87C1 /* weakjack.h */; settings = {ATTRIBUTES = (Public, ); }; };
++		4B88D04011298BEE007A87C1 /* weakmacros.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B88D03A11298BEE007A87C1 /* weakmacros.h */; settings = {ATTRIBUTES = (Public, ); }; };
++		4B88D04111298BEE007A87C1 /* weakjack.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B88D03911298BEE007A87C1 /* weakjack.h */; settings = {ATTRIBUTES = (Public, ); }; };
++		4B88D04211298BEE007A87C1 /* weakmacros.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B88D03A11298BEE007A87C1 /* weakmacros.h */; settings = {ATTRIBUTES = (Public, ); }; };
++		4B88D04311298BEE007A87C1 /* weakjack.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B88D03911298BEE007A87C1 /* weakjack.h */; settings = {ATTRIBUTES = (Public, ); }; };
++		4B88D04411298BEE007A87C1 /* weakmacros.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B88D03A11298BEE007A87C1 /* weakmacros.h */; settings = {ATTRIBUTES = (Public, ); }; };
++		4B88D04511298BEE007A87C1 /* weakjack.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B88D03911298BEE007A87C1 /* weakjack.h */; settings = {ATTRIBUTES = (Public, ); }; };
++		4B88D04611298BEE007A87C1 /* weakmacros.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B88D03A11298BEE007A87C1 /* weakmacros.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 		4B93F1990E87992100E4ECCD /* JackPosixThread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BC3B6A20E703B2E0066E42F /* JackPosixThread.cpp */; };
+ 		4B93F19A0E87992200E4ECCD /* JackPosixThread.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BC3B6A30E703B2E0066E42F /* JackPosixThread.h */; };
+ 		4B93F19C0E87998200E4ECCD /* JackPosixServerLaunch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BF5FBBA0E878B9C003D2374 /* JackPosixServerLaunch.cpp */; };
+@@ -743,16 +747,22 @@
+ 		4BC216850A444BAD00BDA09F /* JackServerAPI.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BF8D1F50834EFB000C94B91 /* JackServerAPI.cpp */; };
+ 		4BC216890A444BDE00BDA09F /* JackServerGlobals.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BC216880A444BDE00BDA09F /* JackServerGlobals.cpp */; };
+ 		4BC2168E0A444BED00BDA09F /* JackServerGlobals.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BC2168D0A444BED00BDA09F /* JackServerGlobals.h */; };
++		4BC2CA55113C6C930076717C /* JackNetInterface.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B76C7680E5AB2DB00E2AC21 /* JackNetInterface.cpp */; };
++		4BC2CA56113C6C940076717C /* JackNetInterface.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B76C7690E5AB2DB00E2AC21 /* JackNetInterface.h */; };
++		4BC2CA57113C6C9B0076717C /* JackNetUnixSocket.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BC3B6B90E703BCC0066E42F /* JackNetUnixSocket.cpp */; };
++		4BC2CA58113C6C9C0076717C /* JackNetUnixSocket.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BC3B6BA0E703BCC0066E42F /* JackNetUnixSocket.h */; };
++		4BC2CA59113C6CB60076717C /* JackNetInterface.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B76C7680E5AB2DB00E2AC21 /* JackNetInterface.cpp */; };
++		4BC2CA5A113C6CB80076717C /* JackNetInterface.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B76C7690E5AB2DB00E2AC21 /* JackNetInterface.h */; };
++		4BC2CA5B113C6CBE0076717C /* JackNetUnixSocket.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BC3B6B90E703BCC0066E42F /* JackNetUnixSocket.cpp */; };
++		4BC2CA5C113C6CC00076717C /* JackNetUnixSocket.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BC3B6BA0E703BCC0066E42F /* JackNetUnixSocket.h */; };
++		4BC2CA5D113C6CC90076717C /* JackNetInterface.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B76C7680E5AB2DB00E2AC21 /* JackNetInterface.cpp */; };
++		4BC2CA5E113C6CCA0076717C /* JackNetInterface.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B76C7690E5AB2DB00E2AC21 /* JackNetInterface.h */; };
++		4BC2CA5F113C6CD10076717C /* JackNetUnixSocket.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BC3B6B90E703BCC0066E42F /* JackNetUnixSocket.cpp */; };
++		4BC2CA60113C6CD20076717C /* JackNetUnixSocket.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BC3B6BA0E703BCC0066E42F /* JackNetUnixSocket.h */; };
+ 		4BC3B6A40E703B2E0066E42F /* JackPosixThread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BC3B6A20E703B2E0066E42F /* JackPosixThread.cpp */; };
+ 		4BC3B6A50E703B2E0066E42F /* JackPosixThread.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BC3B6A30E703B2E0066E42F /* JackPosixThread.h */; };
+ 		4BC3B6A60E703B2E0066E42F /* JackPosixThread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BC3B6A20E703B2E0066E42F /* JackPosixThread.cpp */; };
+ 		4BC3B6A70E703B2E0066E42F /* JackPosixThread.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BC3B6A30E703B2E0066E42F /* JackPosixThread.h */; };
+-		4BC3B6BB0E703BCC0066E42F /* JackNetUnixSocket.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BC3B6B90E703BCC0066E42F /* JackNetUnixSocket.cpp */; };
+-		4BC3B6BC0E703BCC0066E42F /* JackNetUnixSocket.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BC3B6BA0E703BCC0066E42F /* JackNetUnixSocket.h */; };
+-		4BC3B6BD0E703BCC0066E42F /* JackNetUnixSocket.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BC3B6B90E703BCC0066E42F /* JackNetUnixSocket.cpp */; };
+-		4BC3B6BE0E703BCC0066E42F /* JackNetUnixSocket.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BC3B6BA0E703BCC0066E42F /* JackNetUnixSocket.h */; };
+-		4BC3B6BF0E703BCC0066E42F /* JackNetUnixSocket.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BC3B6B90E703BCC0066E42F /* JackNetUnixSocket.cpp */; };
+-		4BC3B6C00E703BCC0066E42F /* JackNetUnixSocket.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BC3B6BA0E703BCC0066E42F /* JackNetUnixSocket.h */; };
+ 		4BCBCE5D10C4FE3F00450FFE /* JackPhysicalMidiInput.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BCBCE5910C4FE3F00450FFE /* JackPhysicalMidiInput.cpp */; };
+ 		4BCBCE5E10C4FE3F00450FFE /* JackPhysicalMidiInput.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BCBCE5A10C4FE3F00450FFE /* JackPhysicalMidiInput.h */; };
+ 		4BCBCE5F10C4FE3F00450FFE /* JackPhysicalMidiOutput.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BCBCE5B10C4FE3F00450FFE /* JackPhysicalMidiOutput.cpp */; };
+@@ -775,25 +785,13 @@
+ 		4BDCDB951001FB9C00B15929 /* JackCoreMidiDriver.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BF339140F8B86DC0080FB5B /* JackCoreMidiDriver.h */; };
+ 		4BDCDB971001FB9C00B15929 /* JackCoreMidiDriver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BF339150F8B86DC0080FB5B /* JackCoreMidiDriver.cpp */; };
+ 		4BDCDBB91001FCC000B15929 /* JackNetDriver.h in Headers */ = {isa = PBXBuildFile; fileRef = BA222ADD0DC882A5001A17F4 /* JackNetDriver.h */; };
+-		4BDCDBBA1001FCC000B15929 /* JackNetInterface.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B76C7690E5AB2DB00E2AC21 /* JackNetInterface.h */; };
+-		4BDCDBBB1001FCC000B15929 /* JackNetUnixSocket.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BC3B6BA0E703BCC0066E42F /* JackNetUnixSocket.h */; };
+ 		4BDCDBBD1001FCC000B15929 /* JackNetDriver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BA222ADC0DC882A5001A17F4 /* JackNetDriver.cpp */; };
+-		4BDCDBBE1001FCC000B15929 /* JackNetInterface.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B76C7680E5AB2DB00E2AC21 /* JackNetInterface.cpp */; };
+-		4BDCDBBF1001FCC000B15929 /* JackNetUnixSocket.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BC3B6B90E703BCC0066E42F /* JackNetUnixSocket.cpp */; };
+ 		4BDCDBD11001FD0100B15929 /* JackWaitThreadedDriver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BBC93B80DF9736C002DF220 /* JackWaitThreadedDriver.cpp */; };
+ 		4BDCDBD21001FD0200B15929 /* JackWaitThreadedDriver.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BBC93B90DF9736C002DF220 /* JackWaitThreadedDriver.h */; };
+ 		4BDCDBD91001FD2D00B15929 /* JackNetManager.h in Headers */ = {isa = PBXBuildFile; fileRef = BA222AEC0DC883B3001A17F4 /* JackNetManager.h */; };
+-		4BDCDBDA1001FD2D00B15929 /* JackNetInterface.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B76C7690E5AB2DB00E2AC21 /* JackNetInterface.h */; };
+-		4BDCDBDB1001FD2D00B15929 /* JackNetUnixSocket.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BC3B6BA0E703BCC0066E42F /* JackNetUnixSocket.h */; };
+-		4BDCDBDC1001FD2D00B15929 /* JackArgParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BF284170F31B4BC00B05BE3 /* JackArgParser.h */; };
+ 		4BDCDBDE1001FD2D00B15929 /* JackNetManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BA222AEB0DC883B3001A17F4 /* JackNetManager.cpp */; };
+-		4BDCDBDF1001FD2D00B15929 /* JackNetInterface.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B76C7680E5AB2DB00E2AC21 /* JackNetInterface.cpp */; };
+-		4BDCDBE01001FD2D00B15929 /* JackNetUnixSocket.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BC3B6B90E703BCC0066E42F /* JackNetUnixSocket.cpp */; };
+-		4BDCDBE11001FD2D00B15929 /* JackMachTime.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BF5FBC80E878D24003D2374 /* JackMachTime.c */; };
+-		4BDCDBE21001FD2D00B15929 /* JackArgParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BF284160F31B4BC00B05BE3 /* JackArgParser.cpp */; };
+ 		4BDCDBEE1001FD7300B15929 /* JackAudioAdapter.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B19B3070E2362E700DD4A82 /* JackAudioAdapter.h */; };
+ 		4BDCDBEF1001FD7300B15929 /* JackAudioAdapterInterface.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B19B3090E2362E700DD4A82 /* JackAudioAdapterInterface.h */; };
+-		4BDCDBF01001FD7300B15929 /* JackException.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B19B30C0E2362E700DD4A82 /* JackException.h */; };
+ 		4BDCDBF11001FD7300B15929 /* JackLibSampleRateResampler.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B19B30F0E2362E700DD4A82 /* JackLibSampleRateResampler.h */; };
+ 		4BDCDBF21001FD7300B15929 /* JackCoreAudioAdapter.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BE5FED00E725C320020B576 /* JackCoreAudioAdapter.h */; };
+ 		4BDCDBF41001FD7300B15929 /* JackAudioAdapter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B19B3060E2362E700DD4A82 /* JackAudioAdapter.cpp */; };
+@@ -805,19 +803,14 @@
+ 		4BDCDC091001FDA800B15929 /* JackArgParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BF284160F31B4BC00B05BE3 /* JackArgParser.cpp */; };
+ 		4BDCDC0A1001FDA800B15929 /* JackArgParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BF284170F31B4BC00B05BE3 /* JackArgParser.h */; };
+ 		4BDCDC111001FDE300B15929 /* JackAudioAdapterInterface.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B19B3090E2362E700DD4A82 /* JackAudioAdapterInterface.h */; };
+-		4BDCDC121001FDE300B15929 /* JackException.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B19B30C0E2362E700DD4A82 /* JackException.h */; };
+ 		4BDCDC131001FDE300B15929 /* JackLibSampleRateResampler.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B19B30F0E2362E700DD4A82 /* JackLibSampleRateResampler.h */; };
+ 		4BDCDC141001FDE300B15929 /* JackNetAdapter.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B5E08E00E5B676C00BEE4E0 /* JackNetAdapter.h */; };
+-		4BDCDC151001FDE300B15929 /* JackNetInterface.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B76C7690E5AB2DB00E2AC21 /* JackNetInterface.h */; };
+ 		4BDCDC161001FDE300B15929 /* JackAudioAdapter.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B19B3070E2362E700DD4A82 /* JackAudioAdapter.h */; };
+-		4BDCDC171001FDE300B15929 /* JackNetUnixSocket.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BC3B6BA0E703BCC0066E42F /* JackNetUnixSocket.h */; };
+ 		4BDCDC191001FDE300B15929 /* JackAudioAdapterInterface.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B19B3080E2362E700DD4A82 /* JackAudioAdapterInterface.cpp */; };
+ 		4BDCDC1A1001FDE300B15929 /* JackLibSampleRateResampler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B19B30E0E2362E700DD4A82 /* JackLibSampleRateResampler.cpp */; };
+ 		4BDCDC1B1001FDE300B15929 /* JackResampler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B19B3120E2362E700DD4A82 /* JackResampler.cpp */; };
+ 		4BDCDC1C1001FDE300B15929 /* JackNetAdapter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B5E08DF0E5B676C00BEE4E0 /* JackNetAdapter.cpp */; };
+-		4BDCDC1D1001FDE300B15929 /* JackNetInterface.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B76C7680E5AB2DB00E2AC21 /* JackNetInterface.cpp */; };
+ 		4BDCDC1E1001FDE300B15929 /* JackAudioAdapter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B19B3060E2362E700DD4A82 /* JackAudioAdapter.cpp */; };
+-		4BDCDC1F1001FDE300B15929 /* JackNetUnixSocket.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BC3B6B90E703BCC0066E42F /* JackNetUnixSocket.cpp */; };
+ 		4BE3225A0CC611EF00AFA640 /* types.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B6C737F0CC60A6D001AFFD4 /* types.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 		4BE3225B0CC611F500AFA640 /* types.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B6C737F0CC60A6D001AFFD4 /* types.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 		4BE4CC010CDA153400CCF5BB /* JackTools.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BE4CBFF0CDA153400CCF5BB /* JackTools.cpp */; };
+@@ -837,8 +830,6 @@
+ 		4BECB2FA0F4451C10091B70A /* JackProcessSync.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BECB2F40F4451C10091B70A /* JackProcessSync.h */; };
+ 		4BECB2FB0F4451C10091B70A /* JackProcessSync.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BECB2F30F4451C10091B70A /* JackProcessSync.cpp */; };
+ 		4BECB2FC0F4451C10091B70A /* JackProcessSync.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BECB2F40F4451C10091B70A /* JackProcessSync.h */; };
+-		4BF284180F31B4BC00B05BE3 /* JackArgParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BF284160F31B4BC00B05BE3 /* JackArgParser.cpp */; };
+-		4BF284190F31B4BC00B05BE3 /* JackArgParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BF284170F31B4BC00B05BE3 /* JackArgParser.h */; };
+ 		4BF2841A0F31B4BC00B05BE3 /* JackArgParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BF284160F31B4BC00B05BE3 /* JackArgParser.cpp */; };
+ 		4BF2841B0F31B4BC00B05BE3 /* JackArgParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BF284170F31B4BC00B05BE3 /* JackArgParser.h */; };
+ 		4BF3391A0F8B86DC0080FB5B /* JackCoreMidiDriver.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BF339140F8B86DC0080FB5B /* JackCoreMidiDriver.h */; };
+@@ -853,7 +844,6 @@
+ 		4BF520590CB8D1010037470E /* timestamps.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BF520580CB8D1010037470E /* timestamps.h */; settings = {ATTRIBUTES = (); }; };
+ 		4BF5205A0CB8D1010037470E /* timestamps.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BF520580CB8D1010037470E /* timestamps.h */; settings = {ATTRIBUTES = (); }; };
+ 		4BF5FBBC0E878B9C003D2374 /* JackPosixServerLaunch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BF5FBBA0E878B9C003D2374 /* JackPosixServerLaunch.cpp */; };
+-		4BF5FBC90E878D24003D2374 /* JackMachTime.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BF5FBC80E878D24003D2374 /* JackMachTime.c */; };
+ 		4BF5FBCA0E878D24003D2374 /* JackMachTime.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BF5FBC80E878D24003D2374 /* JackMachTime.c */; };
+ 		4BF5FBCB0E878D24003D2374 /* JackMachTime.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BF5FBC80E878D24003D2374 /* JackMachTime.c */; };
+ 		4BFA5E9F0DEC4DD900FA4CDB /* testMutex.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BFA5E9E0DEC4DD900FA4CDB /* testMutex.cpp */; };
+@@ -1567,6 +1557,8 @@
+ 		4B869B3D08C8D21C001CF041 /* driver_interface.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = driver_interface.h; path = ../common/driver_interface.h; sourceTree = SOURCE_ROOT; };
+ 		4B869B4208C8D22F001CF041 /* JackDriverLoader.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = JackDriverLoader.h; path = ../common/JackDriverLoader.h; sourceTree = SOURCE_ROOT; };
+ 		4B869D7F08C9CB00001CF041 /* JackDriverLoader.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = JackDriverLoader.cpp; path = ../common/JackDriverLoader.cpp; sourceTree = SOURCE_ROOT; };
++		4B88D03911298BEE007A87C1 /* weakjack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = weakjack.h; path = ../common/jack/weakjack.h; sourceTree = SOURCE_ROOT; };
++		4B88D03A11298BEE007A87C1 /* weakmacros.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = weakmacros.h; path = ../common/jack/weakmacros.h; sourceTree = SOURCE_ROOT; };
+ 		4B89B759076B731100D170DE /* JackRPCClientUser.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = JackRPCClientUser.c; path = RPC/JackRPCClientUser.c; sourceTree = SOURCE_ROOT; };
+ 		4B89B769076B74D200D170DE /* JackRPCEngineUser.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = JackRPCEngineUser.c; path = RPC/JackRPCEngineUser.c; sourceTree = SOURCE_ROOT; };
+ 		4B940B9B06DDDE5B00D77F60 /* AudioHardware.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = AudioHardware.h; path = /System/Library/Frameworks/CoreAudio.framework/Versions/A/Headers/AudioHardware.h; sourceTree = "<absolute>"; };
+@@ -2711,6 +2703,8 @@
+ 				4B6C737D0CC60A6D001AFFD4 /* thread.h */,
+ 				4B6C737E0CC60A6D001AFFD4 /* transport.h */,
+ 				4B6C737F0CC60A6D001AFFD4 /* types.h */,
++				4B88D03911298BEE007A87C1 /* weakjack.h */,
++				4B88D03A11298BEE007A87C1 /* weakmacros.h */,
+ 			);
+ 			name = jack;
+ 			path = ../common/jack;
+@@ -3061,7 +3055,6 @@
+ 			files = (
+ 				4B19B3140E2362E800DD4A82 /* JackAudioAdapter.h in Headers */,
+ 				4B19B3160E2362E800DD4A82 /* JackAudioAdapterInterface.h in Headers */,
+-				4B19B3190E2362E800DD4A82 /* JackException.h in Headers */,
+ 				4B19B31C0E2362E800DD4A82 /* JackLibSampleRateResampler.h in Headers */,
+ 				4BE5FED20E725C320020B576 /* JackCoreAudioAdapter.h in Headers */,
+ 			);
+@@ -3159,6 +3152,8 @@
+ 				4B4F9C910DC20C0400706CB0 /* JackMessageBuffer.h in Headers */,
+ 				4B93F19E0E87998400E4ECCD /* JackPosixThread.h in Headers */,
+ 				4BECB2FA0F4451C10091B70A /* JackProcessSync.h in Headers */,
++				4B88D03F11298BEE007A87C1 /* weakjack.h in Headers */,
++				4B88D04011298BEE007A87C1 /* weakmacros.h in Headers */,
+ 			);
+ 			runOnlyForDeploymentPostprocessing = 0;
+ 		};
+@@ -3227,6 +3222,10 @@
+ 				4BDCDC0A1001FDA800B15929 /* JackArgParser.h in Headers */,
+ 				4BCBCE6210C4FE3F00450FFE /* JackPhysicalMidiInput.h in Headers */,
+ 				4BCBCE6410C4FE3F00450FFE /* JackPhysicalMidiOutput.h in Headers */,
++				4B88D04311298BEE007A87C1 /* weakjack.h in Headers */,
++				4B88D04411298BEE007A87C1 /* weakmacros.h in Headers */,
++				4BC2CA5A113C6CB80076717C /* JackNetInterface.h in Headers */,
++				4BC2CA5C113C6CC00076717C /* JackNetUnixSocket.h in Headers */,
+ 			);
+ 			runOnlyForDeploymentPostprocessing = 0;
+ 		};
+@@ -3507,6 +3506,8 @@
+ 				4B47ACA910B5890100469C67 /* JackMessageBuffer.h in Headers */,
+ 				4B47ACAA10B5890100469C67 /* JackPosixThread.h in Headers */,
+ 				4B47ACAB10B5890100469C67 /* JackProcessSync.h in Headers */,
++				4B88D04111298BEE007A87C1 /* weakjack.h in Headers */,
++				4B88D04211298BEE007A87C1 /* weakmacros.h in Headers */,
+ 			);
+ 			runOnlyForDeploymentPostprocessing = 0;
+ 		};
+@@ -3529,12 +3530,9 @@
+ 			buildActionMask = 2147483647;
+ 			files = (
+ 				4B5E08C30E5B66EE00BEE4E0 /* JackAudioAdapterInterface.h in Headers */,
+-				4B5E08C40E5B66EE00BEE4E0 /* JackException.h in Headers */,
+ 				4B5E08C60E5B66EE00BEE4E0 /* JackLibSampleRateResampler.h in Headers */,
+ 				4B5E08E20E5B676D00BEE4E0 /* JackNetAdapter.h in Headers */,
+-				4B5E08EC0E5B67EB00BEE4E0 /* JackNetInterface.h in Headers */,
+ 				4B5E08EF0E5B680200BEE4E0 /* JackAudioAdapter.h in Headers */,
+-				4BC3B6C00E703BCC0066E42F /* JackNetUnixSocket.h in Headers */,
+ 			);
+ 			runOnlyForDeploymentPostprocessing = 0;
+ 		};
+@@ -3592,6 +3590,8 @@
+ 				4BC3B6A50E703B2E0066E42F /* JackPosixThread.h in Headers */,
+ 				4BECB2F80F4451C10091B70A /* JackProcessSync.h in Headers */,
+ 				4B94334A10A5E666002A187F /* systemdeps.h in Headers */,
++				4B88D03B11298BEE007A87C1 /* weakjack.h in Headers */,
++				4B88D03C11298BEE007A87C1 /* weakmacros.h in Headers */,
+ 			);
+ 			runOnlyForDeploymentPostprocessing = 0;
+ 		};
+@@ -3664,6 +3664,10 @@
+ 				4B94334B10A5E666002A187F /* systemdeps.h in Headers */,
+ 				4BCBCE5E10C4FE3F00450FFE /* JackPhysicalMidiInput.h in Headers */,
+ 				4BCBCE6010C4FE3F00450FFE /* JackPhysicalMidiOutput.h in Headers */,
++				4B88D03D11298BEE007A87C1 /* weakjack.h in Headers */,
++				4B88D03E11298BEE007A87C1 /* weakmacros.h in Headers */,
++				4BC2CA56113C6C940076717C /* JackNetInterface.h in Headers */,
++				4BC2CA58113C6C9C0076717C /* JackNetUnixSocket.h in Headers */,
+ 			);
+ 			runOnlyForDeploymentPostprocessing = 0;
+ 		};
+@@ -3841,6 +3845,10 @@
+ 				4BA3396F10B2E36800190E3B /* JackArgParser.h in Headers */,
+ 				4BCBCE6610C4FE3F00450FFE /* JackPhysicalMidiInput.h in Headers */,
+ 				4BCBCE6810C4FE3F00450FFE /* JackPhysicalMidiOutput.h in Headers */,
++				4B88D04511298BEE007A87C1 /* weakjack.h in Headers */,
++				4B88D04611298BEE007A87C1 /* weakmacros.h in Headers */,
++				4BC2CA5E113C6CCA0076717C /* JackNetInterface.h in Headers */,
++				4BC2CA60113C6CD20076717C /* JackNetUnixSocket.h in Headers */,
+ 			);
+ 			runOnlyForDeploymentPostprocessing = 0;
+ 		};
+@@ -3885,8 +3893,6 @@
+ 			buildActionMask = 2147483647;
+ 			files = (
+ 				4BDCDBB91001FCC000B15929 /* JackNetDriver.h in Headers */,
+-				4BDCDBBA1001FCC000B15929 /* JackNetInterface.h in Headers */,
+-				4BDCDBBB1001FCC000B15929 /* JackNetUnixSocket.h in Headers */,
+ 			);
+ 			runOnlyForDeploymentPostprocessing = 0;
+ 		};
+@@ -3895,9 +3901,6 @@
+ 			buildActionMask = 2147483647;
+ 			files = (
+ 				4BDCDBD91001FD2D00B15929 /* JackNetManager.h in Headers */,
+-				4BDCDBDA1001FD2D00B15929 /* JackNetInterface.h in Headers */,
+-				4BDCDBDB1001FD2D00B15929 /* JackNetUnixSocket.h in Headers */,
+-				4BDCDBDC1001FD2D00B15929 /* JackArgParser.h in Headers */,
+ 			);
+ 			runOnlyForDeploymentPostprocessing = 0;
+ 		};
+@@ -3907,7 +3910,6 @@
+ 			files = (
+ 				4BDCDBEE1001FD7300B15929 /* JackAudioAdapter.h in Headers */,
+ 				4BDCDBEF1001FD7300B15929 /* JackAudioAdapterInterface.h in Headers */,
+-				4BDCDBF01001FD7300B15929 /* JackException.h in Headers */,
+ 				4BDCDBF11001FD7300B15929 /* JackLibSampleRateResampler.h in Headers */,
+ 				4BDCDBF21001FD7300B15929 /* JackCoreAudioAdapter.h in Headers */,
+ 			);
+@@ -3918,12 +3920,9 @@
+ 			buildActionMask = 2147483647;
+ 			files = (
+ 				4BDCDC111001FDE300B15929 /* JackAudioAdapterInterface.h in Headers */,
+-				4BDCDC121001FDE300B15929 /* JackException.h in Headers */,
+ 				4BDCDC131001FDE300B15929 /* JackLibSampleRateResampler.h in Headers */,
+ 				4BDCDC141001FDE300B15929 /* JackNetAdapter.h in Headers */,
+-				4BDCDC151001FDE300B15929 /* JackNetInterface.h in Headers */,
+ 				4BDCDC161001FDE300B15929 /* JackAudioAdapter.h in Headers */,
+-				4BDCDC171001FDE300B15929 /* JackNetUnixSocket.h in Headers */,
+ 			);
+ 			runOnlyForDeploymentPostprocessing = 0;
+ 		};
+@@ -4010,8 +4009,6 @@
+ 			buildActionMask = 2147483647;
+ 			files = (
+ 				BA222ADF0DC882A5001A17F4 /* JackNetDriver.h in Headers */,
+-				4B76C76B0E5AB2DB00E2AC21 /* JackNetInterface.h in Headers */,
+-				4BC3B6BC0E703BCC0066E42F /* JackNetUnixSocket.h in Headers */,
+ 			);
+ 			runOnlyForDeploymentPostprocessing = 0;
+ 		};
+@@ -4020,9 +4017,6 @@
+ 			buildActionMask = 2147483647;
+ 			files = (
+ 				BA222AEE0DC883B3001A17F4 /* JackNetManager.h in Headers */,
+-				4B76C76D0E5AB2DB00E2AC21 /* JackNetInterface.h in Headers */,
+-				4BC3B6BE0E703BCC0066E42F /* JackNetUnixSocket.h in Headers */,
+-				4BF284190F31B4BC00B05BE3 /* JackArgParser.h in Headers */,
+ 			);
+ 			runOnlyForDeploymentPostprocessing = 0;
+ 		};
+@@ -6425,6 +6419,8 @@
+ 				4BDCDC091001FDA800B15929 /* JackArgParser.cpp in Sources */,
+ 				4BCBCE6110C4FE3F00450FFE /* JackPhysicalMidiInput.cpp in Sources */,
+ 				4BCBCE6310C4FE3F00450FFE /* JackPhysicalMidiOutput.cpp in Sources */,
++				4BC2CA59113C6CB60076717C /* JackNetInterface.cpp in Sources */,
++				4BC2CA5B113C6CBE0076717C /* JackNetUnixSocket.cpp in Sources */,
+ 			);
+ 			runOnlyForDeploymentPostprocessing = 0;
+ 		};
+@@ -6751,9 +6747,7 @@
+ 				4B5E08CD0E5B66EE00BEE4E0 /* JackLibSampleRateResampler.cpp in Sources */,
+ 				4B5E08CE0E5B66EE00BEE4E0 /* JackResampler.cpp in Sources */,
+ 				4B5E08E10E5B676C00BEE4E0 /* JackNetAdapter.cpp in Sources */,
+-				4B5E08EB0E5B67EA00BEE4E0 /* JackNetInterface.cpp in Sources */,
+ 				4B5E08EE0E5B680200BEE4E0 /* JackAudioAdapter.cpp in Sources */,
+-				4BC3B6BF0E703BCC0066E42F /* JackNetUnixSocket.cpp in Sources */,
+ 			);
+ 			runOnlyForDeploymentPostprocessing = 0;
+ 		};
+@@ -6863,6 +6857,8 @@
+ 				4BF339230F8B873E0080FB5B /* JackMidiDriver.cpp in Sources */,
+ 				4BCBCE5D10C4FE3F00450FFE /* JackPhysicalMidiInput.cpp in Sources */,
+ 				4BCBCE5F10C4FE3F00450FFE /* JackPhysicalMidiOutput.cpp in Sources */,
++				4BC2CA55113C6C930076717C /* JackNetInterface.cpp in Sources */,
++				4BC2CA57113C6C9B0076717C /* JackNetUnixSocket.cpp in Sources */,
+ 			);
+ 			runOnlyForDeploymentPostprocessing = 0;
+ 		};
+@@ -7043,6 +7039,8 @@
+ 				4BA339A410B2E36800190E3B /* JackArgParser.cpp in Sources */,
+ 				4BCBCE6510C4FE3F00450FFE /* JackPhysicalMidiInput.cpp in Sources */,
+ 				4BCBCE6710C4FE3F00450FFE /* JackPhysicalMidiOutput.cpp in Sources */,
++				4BC2CA5D113C6CC90076717C /* JackNetInterface.cpp in Sources */,
++				4BC2CA5F113C6CD10076717C /* JackNetUnixSocket.cpp in Sources */,
+ 			);
+ 			runOnlyForDeploymentPostprocessing = 0;
+ 		};
+@@ -7091,8 +7089,6 @@
+ 			buildActionMask = 2147483647;
+ 			files = (
+ 				4BDCDBBD1001FCC000B15929 /* JackNetDriver.cpp in Sources */,
+-				4BDCDBBE1001FCC000B15929 /* JackNetInterface.cpp in Sources */,
+-				4BDCDBBF1001FCC000B15929 /* JackNetUnixSocket.cpp in Sources */,
+ 			);
+ 			runOnlyForDeploymentPostprocessing = 0;
+ 		};
+@@ -7101,10 +7097,6 @@
+ 			buildActionMask = 2147483647;
+ 			files = (
+ 				4BDCDBDE1001FD2D00B15929 /* JackNetManager.cpp in Sources */,
+-				4BDCDBDF1001FD2D00B15929 /* JackNetInterface.cpp in Sources */,
+-				4BDCDBE01001FD2D00B15929 /* JackNetUnixSocket.cpp in Sources */,
+-				4BDCDBE11001FD2D00B15929 /* JackMachTime.c in Sources */,
+-				4BDCDBE21001FD2D00B15929 /* JackArgParser.cpp in Sources */,
+ 			);
+ 			runOnlyForDeploymentPostprocessing = 0;
+ 		};
+@@ -7129,9 +7121,7 @@
+ 				4BDCDC1A1001FDE300B15929 /* JackLibSampleRateResampler.cpp in Sources */,
+ 				4BDCDC1B1001FDE300B15929 /* JackResampler.cpp in Sources */,
+ 				4BDCDC1C1001FDE300B15929 /* JackNetAdapter.cpp in Sources */,
+-				4BDCDC1D1001FDE300B15929 /* JackNetInterface.cpp in Sources */,
+ 				4BDCDC1E1001FDE300B15929 /* JackAudioAdapter.cpp in Sources */,
+-				4BDCDC1F1001FDE300B15929 /* JackNetUnixSocket.cpp in Sources */,
+ 			);
+ 			runOnlyForDeploymentPostprocessing = 0;
+ 		};
+@@ -7228,8 +7218,6 @@
+ 			buildActionMask = 2147483647;
+ 			files = (
+ 				BA222ADE0DC882A5001A17F4 /* JackNetDriver.cpp in Sources */,
+-				4B76C76A0E5AB2DB00E2AC21 /* JackNetInterface.cpp in Sources */,
+-				4BC3B6BB0E703BCC0066E42F /* JackNetUnixSocket.cpp in Sources */,
+ 			);
+ 			runOnlyForDeploymentPostprocessing = 0;
+ 		};
+@@ -7238,10 +7226,6 @@
+ 			buildActionMask = 2147483647;
+ 			files = (
+ 				BA222AED0DC883B3001A17F4 /* JackNetManager.cpp in Sources */,
+-				4B76C76C0E5AB2DB00E2AC21 /* JackNetInterface.cpp in Sources */,
+-				4BC3B6BD0E703BCC0066E42F /* JackNetUnixSocket.cpp in Sources */,
+-				4BF5FBC90E878D24003D2374 /* JackMachTime.c in Sources */,
+-				4BF284180F31B4BC00B05BE3 /* JackArgParser.cpp in Sources */,
+ 			);
+ 			runOnlyForDeploymentPostprocessing = 0;
+ 		};
+--- a/macosx/coreaudio/JackCoreAudioAdapter.cpp
++++ b/macosx/coreaudio/JackCoreAudioAdapter.cpp
+@@ -545,10 +545,23 @@
+         
+             // Creates aggregate device
+             AudioDeviceID captureID, playbackID;
+-            if (GetDeviceIDFromUID(capture_driver_uid, &captureID) != noErr)
+-                return -1;
+-            if (GetDeviceIDFromUID(playback_driver_uid, &playbackID) != noErr) 
+-                return -1;
++            
++            if (GetDeviceIDFromUID(capture_driver_uid, &captureID) != noErr) {
++                jack_log("Will take default input");
++                if (GetDefaultInputDevice(&captureID) != noErr) {
++                    jack_error("Cannot open default input device");
++                    return -1;
++                }
++            }
++            
++            if (GetDeviceIDFromUID(playback_driver_uid, &playbackID) != noErr) {
++                jack_log("Will take default output");
++                if (GetDefaultOutputDevice(&playbackID) != noErr) {
++                    jack_error("Cannot open default output device");
++                    return -1;
++                }
++            }
++            
+             if (CreateAggregateDevice(captureID, playbackID, samplerate, &fDeviceID) != noErr)
+                 return -1;
+         }
+@@ -558,7 +571,7 @@
+         jack_log("JackCoreAudioAdapter::Open capture only");
+         if (GetDeviceIDFromUID(capture_driver_uid, &fDeviceID) != noErr) {
+             if (GetDefaultInputDevice(&fDeviceID) != noErr) {
+-                jack_error("Cannot open default device");
++                jack_error("Cannot open default input device");
+                 return -1;
+             }
+         }
+@@ -572,7 +585,7 @@
+         jack_log("JackCoreAudioAdapter::Open playback only");
+         if (GetDeviceIDFromUID(playback_driver_uid, &fDeviceID) != noErr) {
+             if (GetDefaultOutputDevice(&fDeviceID) != noErr) {
+-                jack_error("Cannot open default device");
++                jack_error("Cannot open default output device");
+                 return -1;
+             }
+         }
+@@ -583,14 +596,31 @@
+ 
+     // Use default driver in duplex mode
+     } else {
+-        jack_log("JackCoreAudioAdapter::Open default driver");
++        jack_log("JackCoreAudioDriver::Open default driver");
+         if (GetDefaultDevice(&fDeviceID) != noErr) {
+-            jack_error("Cannot open default device");
+-            return -1;
+-        }
+-        if (GetDeviceNameFromID(fDeviceID, capture_driver_name) != noErr || GetDeviceNameFromID(fDeviceID, playback_driver_name) != noErr) {
+-            jack_error("Cannot get device name from device ID");
+-            return -1;
++            jack_error("Cannot open default device in duplex mode, so aggregate default input and default output");
++            
++            // Creates aggregate device
++            AudioDeviceID captureID, playbackID;
++            
++            if (GetDeviceIDFromUID(capture_driver_uid, &captureID) != noErr) {
++                jack_log("Will take default input");
++                if (GetDefaultInputDevice(&captureID) != noErr) {
++                    jack_error("Cannot open default input device");
++                    return -1;
++                }
++            }
++            
++            if (GetDeviceIDFromUID(playback_driver_uid, &playbackID) != noErr) {
++                jack_log("Will take default output");
++                if (GetDefaultOutputDevice(&playbackID) != noErr) {
++                    jack_error("Cannot open default output device");
++                    return -1;
++                }
++            }
++            
++            if (CreateAggregateDevice(captureID, playbackID, samplerate, &fDeviceID) != noErr)
++                return -1;
+         }
+     }
+ 
+--- a/macosx/coreaudio/JackCoreAudioDriver.cpp
++++ b/macosx/coreaudio/JackCoreAudioDriver.cpp
+@@ -922,7 +922,7 @@
+             if (GetDeviceIDFromUID(capture_driver_uid, &captureID) != noErr) {
+                 jack_log("Will take default input");
+                 if (GetDefaultInputDevice(&captureID) != noErr) {
+-                    jack_error("Cannot open default device");
++                    jack_error("Cannot open default input device");
+                     return -1;
+                 }
+             }
+@@ -930,7 +930,7 @@
+             if (GetDeviceIDFromUID(playback_driver_uid, &playbackID) != noErr) {
+                 jack_log("Will take default output");
+                 if (GetDefaultOutputDevice(&playbackID) != noErr) {
+-                    jack_error("Cannot open default device");
++                    jack_error("Cannot open default output device");
+                     return -1;
+                 }
+             }
+@@ -945,7 +945,7 @@
+         if (GetDeviceIDFromUID(capture_driver_uid, &fDeviceID) != noErr) {
+             jack_log("Will take default input");
+             if (GetDefaultInputDevice(&fDeviceID) != noErr) {
+-                jack_error("Cannot open default device");
++                jack_error("Cannot open default input device");
+                 return -1;
+             }
+         }
+@@ -960,7 +960,7 @@
+         if (GetDeviceIDFromUID(playback_driver_uid, &fDeviceID) != noErr) {
+             jack_log("Will take default output");
+             if (GetDefaultOutputDevice(&fDeviceID) != noErr) {
+-                jack_error("Cannot open default device");
++                jack_error("Cannot open default output device");
+                 return -1;
+             }
+         }
+@@ -973,12 +973,29 @@
+     } else {
+         jack_log("JackCoreAudioDriver::Open default driver");
+         if (GetDefaultDevice(&fDeviceID) != noErr) {
+-            jack_error("Cannot open default device");
+-            return -1;
+-        }
+-        if (GetDeviceNameFromID(fDeviceID, capture_driver_name) != noErr || GetDeviceNameFromID(fDeviceID, playback_driver_name) != noErr) {
+-            jack_error("Cannot get device name from device ID");
+-            return -1;
++            jack_error("Cannot open default device in duplex mode, so aggregate default input and default output");
++            
++            // Creates aggregate device
++            AudioDeviceID captureID, playbackID;
++            
++            if (GetDeviceIDFromUID(capture_driver_uid, &captureID) != noErr) {
++                jack_log("Will take default input");
++                if (GetDefaultInputDevice(&captureID) != noErr) {
++                    jack_error("Cannot open default input device");
++                    return -1;
++                }
++            }
++            
++            if (GetDeviceIDFromUID(playback_driver_uid, &playbackID) != noErr) {
++                jack_log("Will take default output");
++                if (GetDefaultOutputDevice(&playbackID) != noErr) {
++                    jack_error("Cannot open default output device");
++                    return -1;
++                }
++            }
++            
++            if (CreateAggregateDevice(captureID, playbackID, samplerate, &fDeviceID) != noErr)
++                return -1;
+         }
+     }
+     
+@@ -1985,8 +2002,8 @@
+             switch (param->character) {
+ 
+                 case 'd':
+-                    capture_driver_uid = strdup(param->value.str);
+-                    playback_driver_uid = strdup(param->value.str);
++                    capture_driver_uid = param->value.str;
++                    playback_driver_uid = param->value.str;
+                     break;
+ 
+                 case 'D':
+@@ -2009,14 +2026,14 @@
+                 case 'C':
+                     capture = true;
+                     if (strcmp(param->value.str, "none") != 0) {
+-                        capture_driver_uid = strdup(param->value.str);
++                        capture_driver_uid = param->value.str;
+                     }
+                     break;
+ 
+                 case 'P':
+                     playback = true;
+                     if (strcmp(param->value.str, "none") != 0) {
+-                        playback_driver_uid = strdup(param->value.str);
++                        playback_driver_uid = param->value.str;
+                     }
+                     break;
+ 
+--- a/posix/JackNetUnixSocket.cpp
++++ b/posix/JackNetUnixSocket.cpp
+@@ -99,6 +99,13 @@
+             Reset();
+         }
+         fSockfd = socket ( AF_INET, SOCK_DGRAM, 0 );
++        
++        /* Enable address reuse */
++        int res, on = 1;
++        if ((res = setsockopt( fSockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on))) < 0) {
++            StrError(NET_ERROR_CODE);
++        }
++            
+         return fSockfd;
+     }
+ 
+--- a/solaris/oss/JackBoomerDriver.cpp
++++ b/solaris/oss/JackBoomerDriver.cpp
+@@ -985,20 +985,20 @@
+         case 'C':
+             capture = true;
+             if (strcmp(param->value.str, "none") != 0) {
+-                capture_pcm_name = strdup(param->value.str);
++                capture_pcm_name = param->value.str;
+             }
+             break;
+ 
+         case 'P':
+             playback = true;
+             if (strcmp(param->value.str, "none") != 0) {
+-                playback_pcm_name = strdup(param->value.str);
++                playback_pcm_name = param->value.str;
+             }
+             break;
+ 
+         case 'd':
+-            playback_pcm_name = strdup (param->value.str);
+-            capture_pcm_name = strdup (param->value.str);
++            playback_pcm_name = param->value.str;
++            capture_pcm_name = param->value.str;
+             break;
+             
+         case 'e':
+--- a/solaris/oss/JackOSSDriver.cpp
++++ b/solaris/oss/JackOSSDriver.cpp
+@@ -904,20 +904,20 @@
+         case 'C':
+             capture = true;
+             if (strcmp(param->value.str, "none") != 0) {
+-                capture_pcm_name = strdup(param->value.str);
++                capture_pcm_name = param->value.str;
+             }
+             break;
+ 
+         case 'P':
+             playback = true;
+             if (strcmp(param->value.str, "none") != 0) {
+-                playback_pcm_name = strdup(param->value.str);
++                playback_pcm_name = param->value.str;
+             }
+             break;
+ 
+         case 'd':
+-            playback_pcm_name = strdup (param->value.str);
+-            capture_pcm_name = strdup (param->value.str);
++            playback_pcm_name = param->value.str;
++            capture_pcm_name = param->value.str;
+             break;
+     
+         case 'b':
+--- a/tests/external_metro.cpp
++++ b/tests/external_metro.cpp
+@@ -60,7 +60,6 @@
+ {
+     sample_t scale;
+     int i, attack_length, decay_length;
+-    double *amp;
+     int attack_percent = 1, decay_percent = 10;
+     const char *bpm_string = "bpm";
+     jack_options_t options = JackNullOption;
+@@ -131,6 +130,8 @@
+     jack_port_unregister(client, input_port);
+     jack_port_unregister(client, output_port);
+     jack_client_close(client);
++    free(amp);
++    free(wave);
+ }
+ 
+ int main (int argc, char *argv[])
+--- a/tests/external_metro.h
++++ b/tests/external_metro.h
+@@ -53,6 +53,7 @@
+         int bpm;
+         jack_nframes_t tone_length, wave_length;
+         sample_t *wave;
++        double *amp;
+         long offset ;
+ 
+         ExternalMetro(int freq, double max_amp, int dur_arg, int bpm, const char* client_name = "metro");
+--- a/windows/JackCompilerDeps_os.h
++++ b/windows/JackCompilerDeps_os.h
+@@ -1,21 +1,22 @@
+ /*
+-Copyright (C) 2004-2005 Grame
++ Copyright (C) 2004-2008 Grame
++ 
++ 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 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+-
+-*/
+ 
+ #ifndef __JackCompilerDeps_WIN32__
+ #define __JackCompilerDeps_WIN32__
+--- a/windows/JackNetWinSocket.cpp
++++ b/windows/JackNetWinSocket.cpp
+@@ -1,21 +1,22 @@
+ /*
+-Copyright (C) 2008 Romain Moret at Grame
++ Copyright (C) 2004-2008 Grame
++ 
++ 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 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+-
+-*/
+ 
+ #include "JackNetWinSocket.h"
+ 
+--- a/windows/JackNetWinSocket.h
++++ b/windows/JackNetWinSocket.h
+@@ -1,21 +1,21 @@
+ /*
+-Copyright (C) 2008 Romain Moret at Grame
+-
+-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., 675 Mass Ave, Cambridge, MA 02139, USA.
+-
+-*/
++ Copyright (C) 2004-2008 Grame
++ 
++ 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 __JackNetWinSocket__
+ #define __JackNetWinSocket__
+--- a/windows/JackPlatformPlug_os.h
++++ b/windows/JackPlatformPlug_os.h
+@@ -1,21 +1,22 @@
+ /*
+-Copyright (C) 2004-2008 Grame
++ Copyright (C) 2004-2008 Grame
++ 
++ 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 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 __JackPlatformPlug_WIN32__
+ #define __JackPlatformPlug_WIN32__
+--- a/windows/JackShmMem_os.h
++++ b/windows/JackShmMem_os.h
+@@ -1,28 +1,28 @@
+ /*
+-Copyright (C) 2001 Paul Davis
+-Copyright (C) 2004-2008 Grame
++ Copyright (C) 2004-2008 Grame
++ 
++ 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 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+-
+-*/
+ 
+ #ifndef __JackShmMem_WIN32__
+ #define __JackShmMem_WIN32__
+ 
+-#include <windows.h>
+-
++#include <windows.h>
++
+ // See GetProcessWorkingSetSize and SetProcessWorkingSetSize
+ 
+ #define CHECK_MLOCK(ptr, size) (VirtualLock((ptr), (size)) != 0)
+--- a/windows/JackSystemDeps_os.h
++++ b/windows/JackSystemDeps_os.h
+@@ -1,21 +1,22 @@
+ /*
+-Copyright (C) 2004-2006 Grame
++ Copyright (C) 2004-2008 Grame
++ 
++ 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 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+-
+-*/
+ 
+ #ifndef __JackSystemDeps_WIN32__
+ #define __JackSystemDeps_WIN32__
+--- a/windows/JackTypes_os.h
++++ b/windows/JackTypes_os.h
+@@ -1,21 +1,22 @@
+ /*
+-  Copyright (C) 2001 Paul Davis
++ Copyright (C) 2004-2008 Grame
++ 
++ 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 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 __JackTypes_WIN32__
+ #define __JackTypes_WIN32__
+--- a/windows/JackWinEvent.cpp
++++ b/windows/JackWinEvent.cpp
+@@ -1,21 +1,22 @@
+ /*
+-Copyright (C) 2004-2005 Grame
++ Copyright (C) 2004-2008 Grame
++ 
++ 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 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+-
+-*/
+ 
+ #include "JackWinEvent.h"
+ #include "JackTools.h"
+--- a/windows/JackWinEvent.h
++++ b/windows/JackWinEvent.h
+@@ -1,21 +1,21 @@
+ /*
+-Copyright (C) 2004-2005 Grame
+-
+-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., 675 Mass Ave, Cambridge, MA 02139, USA.
+-
+-*/
++ Copyright (C) 2004-2008 Grame
++ 
++ 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 __JackWinEvent__
+ #define __JackWinEvent__
+--- a/windows/JackWinMutex.h
++++ b/windows/JackWinMutex.h
+@@ -1,23 +1,22 @@
+ /*
+- Copyright (C) 2006 Grame
+-
+- This library 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 library is distributed in the hope that it will be useful,
++ Copyright (C) 2004-2008 Grame
++ 
++ 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 library; if not, write to the Free Software
+- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
++ 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.
++ 
++ */
+ 
+- Grame Research Laboratory, 9 rue du Garet, 69001 Lyon - France
+- grame at grame.fr
+-*/
+ 
+ #ifndef __JackWinMutex__
+ #define __JackWinMutex__
+--- a/windows/JackWinNamedPipe.cpp
++++ b/windows/JackWinNamedPipe.cpp
+@@ -1,21 +1,22 @@
+ /*
+-Copyright (C) 2004-2006 Grame
++ Copyright (C) 2004-2008 Grame
++ 
++ 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 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+-
+-*/
+ 
+ #include "JackWinNamedPipe.h"
+ #include "JackError.h"
+--- a/windows/JackWinNamedPipe.h
++++ b/windows/JackWinNamedPipe.h
+@@ -1,21 +1,22 @@
+ /*
+-Copyright (C) 2004-2006 Grame
++ Copyright (C) 2004-2008 Grame
++ 
++ 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 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+-
+-*/
+ 
+ #ifndef __JackWinNamedPipe__
+ #define __JackWinNamedPipe__
+--- a/windows/JackWinNamedPipeClientChannel.cpp
++++ b/windows/JackWinNamedPipeClientChannel.cpp
+@@ -1,21 +1,22 @@
+ /*
+-Copyright (C) 2004-2006 Grame
++ Copyright (C) 2004-2008 Grame
++ 
++ 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 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 "JackWinNamedPipeClientChannel.h"
+ #include "JackRequest.h"
+--- a/windows/JackWinNamedPipeClientChannel.h
++++ b/windows/JackWinNamedPipeClientChannel.h
+@@ -1,21 +1,22 @@
+ /*
+-Copyright (C) 2004-2006 Grame
++ Copyright (C) 2004-2008 Grame
++ 
++ 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 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 __JackWinNamedPipeClientChannel__
+ #define __JackWinNamedPipeClientChannel__
+--- a/windows/JackWinNamedPipeNotifyChannel.cpp
++++ b/windows/JackWinNamedPipeNotifyChannel.cpp
+@@ -1,21 +1,22 @@
+ /*
+-Copyright (C) 2004-2006 Grame
++ Copyright (C) 2004-2008 Grame
++ 
++ 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 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 "JackRequest.h"
+ #include "JackWinNamedPipeNotifyChannel.h"
+--- a/windows/JackWinNamedPipeNotifyChannel.h
++++ b/windows/JackWinNamedPipeNotifyChannel.h
+@@ -1,21 +1,22 @@
+ /*
+-Copyright (C) 2004-2006 Grame
++ Copyright (C) 2004-2008 Grame
++ 
++ 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 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 __JackWinNamedPipeNotifyChannel__
+ #define __JackWinNamedPipeNotifyChannel__
+--- a/windows/JackWinNamedPipeServerChannel.cpp
++++ b/windows/JackWinNamedPipeServerChannel.cpp
+@@ -1,21 +1,22 @@
+ /*
+-Copyright (C) 2004-2006 Grame
++ Copyright (C) 2004-2008 Grame
+ 
+-  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 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 "JackWinNamedPipeServerChannel.h"
+ #include "JackNotification.h"
+@@ -73,7 +74,7 @@
+     	all ressources will be desallocated at the end.
+     */
+ 
+-    fThread.Stop();
++    fThread.Kill();
+     fPipe->Close();
+     fRefNum = -1;
+ }
+--- a/windows/JackWinNamedPipeServerChannel.h
++++ b/windows/JackWinNamedPipeServerChannel.h
+@@ -1,21 +1,22 @@
+ /*
+-Copyright (C) 2004-2006 Grame
++ Copyright (C) 2004-2008 Grame
++ 
++ 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 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 __JackWinNamedPipeServerChannel__
+ #define __JackWinNamedPipeServerChannel__
+--- a/windows/JackWinNamedPipeServerNotifyChannel.h
++++ b/windows/JackWinNamedPipeServerNotifyChannel.h
+@@ -1,21 +1,22 @@
+ /*
+-Copyright (C) 2004-2006 Grame
++ Copyright (C) 2004-2008 Grame
++ 
++ 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 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 __JackWinNamedPipeServerNotifyChannel__
+ #define __JackWinNamedPipeServerNotifyChannel__
+--- a/windows/JackWinProcessSync.cpp
++++ b/windows/JackWinProcessSync.cpp
+@@ -1,21 +1,22 @@
+ /*
+-Copyright (C) 2004-2006 Grame
++ Copyright (C) 2004-2008 Grame
++ 
++ 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 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+-
+-*/
+ 
+ #include "JackWinProcessSync.h"
+ #include "JackError.h"
+--- a/windows/JackWinProcessSync.h
++++ b/windows/JackWinProcessSync.h
+@@ -1,21 +1,22 @@
+ /*
+-Copyright (C) 2004-2006 Grame
++ Copyright (C) 2004-2008 Grame
++ 
++ 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 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+-
+-*/
+ 
+ #ifndef __JackWinProcessSync__
+ #define __JackWinProcessSync__
+--- a/windows/JackWinSemaphore.cpp
++++ b/windows/JackWinSemaphore.cpp
+@@ -1,21 +1,21 @@
+ /*
+-Copyright (C) 2004-2005 Grame
+-
+-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., 675 Mass Ave, Cambridge, MA 02139, USA.
+-
+-*/
++ Copyright (C) 2004-2008 Grame
++ 
++ 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 "JackWinSemaphore.h"
+ #include "JackConstants.h"
+--- a/windows/JackWinSemaphore.h
++++ b/windows/JackWinSemaphore.h
+@@ -1,21 +1,22 @@
+ /*
+-Copyright (C) 2004-2005 Grame
++ Copyright (C) 2004-2008 Grame
++ 
++ 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 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+-
+-*/
+ 
+ #ifndef __JackWinSemaphore__
+ #define __JackWinSemaphore__
+--- a/windows/JackWinThread.cpp
++++ b/windows/JackWinThread.cpp
+@@ -1,22 +1,22 @@
+ /*
+-Copyright (C) 2001 Paul Davis
+-Copyright (C) 2004-2006 Grame
++ Copyright (C) 2004-2008 Grame
++ 
++ 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 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+-
+-*/
+ 
+ #include "JackWinThread.h"
+ #include "JackError.h"
+--- a/windows/JackWinThread.h
++++ b/windows/JackWinThread.h
+@@ -1,22 +1,22 @@
+ /*
+-Copyright (C) 2001 Paul Davis
+-Copyright (C) 2004-2006 Grame
++ Copyright (C) 2004-2008 Grame
++ 
++ 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 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+-
+-*/
+ 
+ 
+ #ifndef __JackWinThread__
+--- a/windows/JackWinTime.c
++++ b/windows/JackWinTime.c
+@@ -1,22 +1,22 @@
+ /*
+-Copyright (C) 2001-2003 Paul Davis
+-Copyright (C) 2004-2008 Grame
++ Copyright (C) 2004-2008 Grame
++ 
++ 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 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 "JackTime.h"
+ 
+--- a/windows/README
++++ b/windows/README
+@@ -1,32 +1,35 @@
+ -------------------------------
+-Jackmp on Windows
++JACK2 on Windows
+ -------------------------------
+ 
+ This folder contains all the windows specific sources.
+ You will also find two sets of files :
+-- VisualC++6 workspace and project files, in order to compile Jack with MSVC
+-- Code::Blocks (8.02) workspace and project files, in order to compile Jack with MingW
++- VisualC++6 workspace and project files, in order to compile JACK with MSVC
++- Code::Blocks (8.02) workspace and project files, in order to compile JACK with MingW
+ 
+ The built binaries will be located in '/Release/bin' (or '/Debug/bin' if you build the Debug target). Once compiled, you'll find there everything you need :
+ - the two 'libjackmp.dll' and 'libjackservermp.dll', client and server jack libraries
+-- the 'jackdmp.exe', main application : the jack server
++- the 'jackdmp.exe', main application : the JACK server
+ - the 'jack_xxx.exe' utilities and examples
+-- in the jackmp directory, you'll find the driver's DLL's ('jack_portaudio.dll' and 'jack_netdriver.dll') and some tools ( 'netmanager.dll', 'audioadapter.dll', 'netadapter.dll' for example )
++- in the jackmp directory, you'll find the driver's DLL's ('jack_portaudio.dll' and 'jack_netdriver.dll') and some tools ('netmanager.dll', 'audioadapter.dll', 'netadapter.dll' for example)
+ 
+ In Code::Blocks all the projects are automatically built in a correct order (dll's then apps) by doing 'build->build workspace'.
+ In VC6, you'll have to build the projects one by one.
+ 
++The needed regexp library TRE can be found here http://laurikari.net/tre/. Unzip and place the "tre-0.8.0" folder into the "windows" folder. 
++Then edit and comment "#define snprintf sprintf_s" at the end off the "tre-0.8.0/win32/config.h" file before building the JACK project.
++
+ -------------------------------
+ Notes about VC and GCC versions
+ -------------------------------
+ 
+-The Visual Studio workspace is limited to VC6. Jack will not compile on most recent MSVC's. The fact is recent compilers (MSVC7, 8 or 9) don't agree with some of the Jack sources.
+-But now you can compile Jack using GCC, with MingW.
++The Visual Studio workspace is limited to VC6. JACK will not compile on most recent MSVC's. The fact is recent compilers (MSVC7, 8 or 9) don't agree with some of the JACK sources.
++But now you can compile JACK using GCC, with MingW.
+ The project is actually organized in a Code::Blocks workspace. This is a simple and efficient way to compile the whole project.
+ 
+-But for some reasons, you need to compile Jack using a SJLJ version of G++ (available on MingW website).
++But for some reasons, you need to compile JACK using a SJLJ version of G++ (available on MingW website).
+ Current GCC/G++ version (3.4.5) doesn't includes SJLJ so you'll have to use another one.
+-Jack needs the use of SJLJ exceptions instead of DW2 because exceptions are exchanged between DLL's, and DW2 does not allow to throw an exception out of a DLL, so it wouldn't be cought.
++JACK needs the use of SJLJ exceptions instead of DW2 because exceptions are exchanged between DLL's, and DW2 does not allow to throw an exception out of a DLL, so it wouldn't be cought.
+ 
+ The ressources files has been created with ResEdit (ANSI build). VisualStudio uses 'ressource.rc' and 'ressource_vc.h'. The other files are used by MingW.
+ 
+@@ -34,20 +37,19 @@
+ A binary version of qjackctl is also included.
+ 
+ -------------------------------
+-Running Jack on Windows
++Running JACK on Windows
+ -------------------------------
+ 
+ You can use two drivers : PortAudio and NetDriver.
+ The PortAudio backend allow the use of many soundcards, using ASIO, DirectSound or WMME drivers (any ASIO driver can be seen by PortAudio).
+ The NetDriver allow you to use NetJack2 on windows. Thus you can easily exchange midi and audio streams bitween computers (Linux, MacOSX or Windows).
+ In both cases, you have to use the minimalist :
+-    'jackd -R -d ...'
+-        command. With PortAudio, you can have a list of supported drivers with :
++    'jackd -R -d ...' command. With PortAudio, you can have a list of supported drivers with :
+     'jackd -R -S -d portaudio -l'
+ 
+ Other options still stay the same.
+-You can also pick a binary of Qjackctl, but this is still in development.
+-
++You can also pick a binary of Qjackctl, but this is still in development.
++
+ -------------------------------
+ Running Jack on windows
+ -------------------------------
+@@ -55,4 +57,4 @@
+ More information at : 'http://www.grame.fr/~letz/jackdmp.html'.
+ 
+ For any question or suggestion, you can refer to the mailing list 'jack-devel at jackaudio.org'
+-Enjoy Jack on windows... ;-)
++Enjoy JACK on windows... ;-)
+--- a/windows/Setup/jack.ci
++++ b/windows/Setup/jack.ci
+@@ -1,9 +1,9 @@
+ <*project
+       version = 4 civer = "Free v4.14.5" winver = "2.6/5.1.2600" > 
+    <output> .</>
+-   <exename> Jack_v1.9.5_setup.exe</>
++   <exename> Jack_v1.9.6_setup.exe</>
+    <digitsign> </>
+-   <appname> Jack v1.9.5</>
++   <appname> Jack v1.9.6</>
+    <password> </>
+    <addlang> </>
+    <icon> Default - 2</>
+@@ -92,6 +92,8 @@
+ <_><src>..\..\common\jack\transport.h</><dest>inst</><custom>includes\jack</><ifexist>overnewer</><recurs>0</></>
+ <_><src>..\..\common\jack\types.h</><dest>inst</><custom>includes\jack</><ifexist>overnewer</><recurs>0</></>
+ <_><src>..\..\common\jack\systemdeps.h</><dest>inst</><custom>includes\jack</><ifexist>overnewer</><recurs>1</></>
++<_><src>..\..\common\jack\weakjack.h</><dest>inst</><custom>includes\jack</><ifexist>overnewer</><recurs>1</></>
++<_><src>..\..\common\jack\weakmacros.h</><dest>inst</><custom>includes\jack</><ifexist>overnewer</><recurs>1</></>
+ <_><src>.\JackRouter.dll</><dest>inst</><custom></><ifexist>overnewer</><recurs>0</></>
+ <_><src>.\JackRouter.ini</><dest>inst</><custom></><ifexist>overnewer</><recurs>0</></>
+ <_><src>.\qjackctl\mingwm10.dll</><dest>inst</><custom></><ifexist>overnewer</><recurs>0</></>
+--- a/windows/jackaudioadapter.rc
++++ b/windows/jackaudioadapter.rc
+@@ -11,8 +11,8 @@
+ //
+ LANGUAGE LANG_FRENCH, SUBLANG_DEFAULT
+ 1 VERSIONINFO
+-    FILEVERSION     1,9,5,0
+-    PRODUCTVERSION  1,9,5,0
++    FILEVERSION     1,9,6,0
++    PRODUCTVERSION  1,9,6,0
+     FILEOS          VOS_UNKNOWN
+     FILETYPE        VFT_DLL
+ BEGIN
+@@ -23,14 +23,14 @@
+             VALUE "Comments", "\0"
+             VALUE "CompanyName", "Grame\0"
+             VALUE "FileDescription", "Jackmp Audio Adapter for Windows\0"
+-            VALUE "FileVersion", "1, 9, 5, 0\0"
++            VALUE "FileVersion", "1, 9, 6, 0\0"
+             VALUE "InternalName", "audioadapter\0"
+-            VALUE "LegalCopyright", "Copyright Grame © 2006-2009\0"
++            VALUE "LegalCopyright", "Copyright Grame © 2006-2010\0"
+             VALUE "LegalTrademarks", "\0"
+             VALUE "OriginalFilename", "audioadapter.dll\0"
+             VALUE "PrivateBuild", "\0"
+             VALUE "ProductName", "audioadapter\0"
+-            VALUE "ProductVersion", "1, 9, 5, 0\0"
++            VALUE "ProductVersion", "1, 9, 6, 0\0"
+             VALUE "SpecialBuild", "\0"
+         END
+     END
+--- a/windows/jackd.rc
++++ b/windows/jackd.rc
+@@ -11,8 +11,8 @@
+ //
+ LANGUAGE LANG_FRENCH, SUBLANG_DEFAULT
+ 1 VERSIONINFO
+-    FILEVERSION     1,9,5,0
+-    PRODUCTVERSION  1,9,5,0
++    FILEVERSION     1,9,6,0
++    PRODUCTVERSION  1,9,6,0
+     FILEOS          VOS_UNKNOWN
+     FILETYPE        VFT_APP
+ BEGIN
+@@ -23,14 +23,14 @@
+             VALUE "Comments", "\0"
+             VALUE "CompanyName", "Grame\0"
+             VALUE "FileDescription", "Jack server for Windows\0"
+-            VALUE "FileVersion", "1, 9, 5, 0\0"
++            VALUE "FileVersion", "1, 9, 6, 0\0"
+             VALUE "InternalName", "jackd\0"
+-            VALUE "LegalCopyright", "Copyright Grame © 2006-2009\0"
++            VALUE "LegalCopyright", "Copyright Grame © 2006-2010\0"
+             VALUE "LegalTrademarks", "\0"
+             VALUE "OriginalFilename", "jackd.exe\0"
+             VALUE "PrivateBuild", "\0"
+             VALUE "ProductName", "jackd\0"
+-            VALUE "ProductVersion", "1, 9, 5, 0\0"
++            VALUE "ProductVersion", "1, 9, 6, 0\0"
+             VALUE "SpecialBuild", "\0"
+         END
+     END
+--- a/windows/jackd.workspace
++++ b/windows/jackd.workspace
+@@ -20,7 +20,7 @@
+ 		<Project filename="jack_netmanager.cbp">
+ 			<Depends filename="libjackserver.cbp" />
+ 		</Project>
+-		<Project filename="jack_audioadapter.cbp">
++		<Project filename="jack_audioadapter.cbp" active="1">
+ 			<Depends filename="libjackserver.cbp" />
+ 		</Project>
+ 		<Project filename="jack_netadapter.cbp">
+@@ -36,7 +36,7 @@
+ 		<Project filename="jack_lsp.cbp">
+ 			<Depends filename="libjack.cbp" />
+ 		</Project>
+-		<Project filename="jack_netsource.cbp" active="1">
++		<Project filename="jack_netsource.cbp">
+ 			<Depends filename="libjack.cbp" />
+ 			<Depends filename="jack_netonedriver.cbp" />
+ 		</Project>
+--- a/windows/jacknetadapter.rc
++++ b/windows/jacknetadapter.rc
+@@ -11,8 +11,8 @@
+ //
+ LANGUAGE LANG_FRENCH, SUBLANG_DEFAULT
+ 1 VERSIONINFO
+-    FILEVERSION     1,9,5,0
+-    PRODUCTVERSION  1,9,5,0
++    FILEVERSION     1,9,6,0
++    PRODUCTVERSION  1,9,6,0
+     FILEOS          VOS_UNKNOWN
+     FILETYPE        VFT_DLL
+ BEGIN
+@@ -23,14 +23,14 @@
+             VALUE "Comments", "\0"
+             VALUE "CompanyName", "Grame\0"
+             VALUE "FileDescription", "Jackmp Net Adapter for Windows\0"
+-            VALUE "FileVersion", "1, 9, 5, 0\0"
++            VALUE "FileVersion", "1, 9, 6, 0\0"
+             VALUE "InternalName", "netadapter\0"
+-            VALUE "LegalCopyright", "Copyright Grame © 2006-2009\0"
++            VALUE "LegalCopyright", "Copyright Grame © 2006-2010\0"
+             VALUE "LegalTrademarks", "\0"
+             VALUE "OriginalFilename", "netadapter.dll\0"
+             VALUE "PrivateBuild", "\0"
+             VALUE "ProductName", "netadapter\0"
+-            VALUE "ProductVersion", "1, 9, 5, 0\0"
++            VALUE "ProductVersion", "1, 9, 6, 0\0"
+             VALUE "SpecialBuild", "\0"
+         END
+     END
+--- a/windows/jacknetdriver.rc
++++ b/windows/jacknetdriver.rc
+@@ -11,8 +11,8 @@
+ //
+ LANGUAGE LANG_FRENCH, SUBLANG_DEFAULT
+ 1 VERSIONINFO
+-    FILEVERSION     1,9,5,0
+-    PRODUCTVERSION  1,9,5,0
++    FILEVERSION     1,9,6,0
++    PRODUCTVERSION  1,9,6,0
+     FILEOS          VOS_UNKNOWN
+     FILETYPE        VFT_DLL
+ BEGIN
+@@ -23,14 +23,14 @@
+             VALUE "Comments", "\0"
+             VALUE "CompanyName", "Grame\0"
+             VALUE "FileDescription", "Jackmp Net Driver for Windows\0"
+-            VALUE "FileVersion", "1, 9, 5, 0\0"
++            VALUE "FileVersion", "1, 9, 6, 0\0"
+             VALUE "InternalName", "jack_netdriver\0"
+-            VALUE "LegalCopyright", "Copyright Grame © 2006-2009\0"
++            VALUE "LegalCopyright", "Copyright Grame © 2006-2010\0"
+             VALUE "LegalTrademarks", "\0"
+             VALUE "OriginalFilename", "jack_netdriver.dll\0"
+             VALUE "PrivateBuild", "\0"
+             VALUE "ProductName", "jack_netdriver\0"
+-            VALUE "ProductVersion", "1, 9, 5, 0\0"
++            VALUE "ProductVersion", "1, 9, 6, 0\0"
+             VALUE "SpecialBuild", "\0"
+         END
+     END
+--- a/windows/jacknetmanager.rc
++++ b/windows/jacknetmanager.rc
+@@ -11,8 +11,8 @@
+ //
+ LANGUAGE LANG_FRENCH, SUBLANG_DEFAULT
+ 1 VERSIONINFO
+-    FILEVERSION     1,9,5,0
+-    PRODUCTVERSION  1,9,5,0
++    FILEVERSION     1,9,6,0
++    PRODUCTVERSION  1,9,6,0
+     FILEOS          VOS_UNKNOWN
+     FILETYPE        VFT_DLL
+ BEGIN
+@@ -23,14 +23,14 @@
+             VALUE "Comments", "\0"
+             VALUE "CompanyName", "Grame\0"
+             VALUE "FileDescription", "Jackmp Net Manager for Windows\0"
+-            VALUE "FileVersion", "1, 9, 5, 0\0"
++            VALUE "FileVersion", "1, 9, 6, 0\0"
+             VALUE "InternalName", "netmanager\0"
+-            VALUE "LegalCopyright", "Copyright Grame © 2006-2009\0"
++            VALUE "LegalCopyright", "Copyright Grame © 2006-2010\0"
+             VALUE "LegalTrademarks", "\0"
+             VALUE "OriginalFilename", "netmanager.dll\0"
+             VALUE "PrivateBuild", "\0"
+             VALUE "ProductName", "netmanager\0"
+-            VALUE "ProductVersion", "1, 9, 5, 0\0"
++            VALUE "ProductVersion", "1, 9, 6, 0\0"
+             VALUE "SpecialBuild", "\0"
+         END
+     END
+--- a/windows/jackportaudio.rc
++++ b/windows/jackportaudio.rc
+@@ -11,8 +11,8 @@
+ //
+ LANGUAGE LANG_FRENCH, SUBLANG_DEFAULT
+ 1 VERSIONINFO
+-    FILEVERSION     1,9,5,0
+-    PRODUCTVERSION  1,9,5,0
++    FILEVERSION     1,9,6,0
++    PRODUCTVERSION  1,9,6,0
+     FILEOS          VOS_UNKNOWN
+     FILETYPE        VFT_DLL
+ BEGIN
+@@ -23,14 +23,14 @@
+             VALUE "Comments", "\0"
+             VALUE "CompanyName", "Grame\0"
+             VALUE "FileDescription", "Jackmp PortAudio Driver for Windows\0"
+-            VALUE "FileVersion", "1, 9, 5, 0\0"
++            VALUE "FileVersion", "1, 9, 6, 0\0"
+             VALUE "InternalName", "jack_portaudio\0"
+-            VALUE "LegalCopyright", "Copyright Grame © 2006-2009\0"
++            VALUE "LegalCopyright", "Copyright Grame © 2006-2010\0"
+             VALUE "LegalTrademarks", "\0"
+             VALUE "OriginalFilename", "jack_portaudio.dll\0"
+             VALUE "PrivateBuild", "\0"
+             VALUE "ProductName", "jack_portaudio\0"
+-            VALUE "ProductVersion", "1, 9, 5, 0\0"
++            VALUE "ProductVersion", "1, 9, 6, 0\0"
+             VALUE "SpecialBuild", "\0"
+         END
+     END
+--- a/windows/jackwinmme.rc
++++ b/windows/jackwinmme.rc
+@@ -11,8 +11,8 @@
+ //
+ LANGUAGE LANG_FRENCH, SUBLANG_DEFAULT
+ 1 VERSIONINFO
+-    FILEVERSION     1,9,5,0
+-    PRODUCTVERSION  1,9,5,0
++    FILEVERSION     1,9,6,0
++    PRODUCTVERSION  1,9,6,0
+     FILEOS          VOS_UNKNOWN
+     FILETYPE        VFT_DLL
+ BEGIN
+@@ -23,14 +23,14 @@
+             VALUE "Comments", "\0"
+             VALUE "CompanyName", "Grame\0"
+             VALUE "FileDescription", "Jackmp WinMMEo Driver for Windows\0"
+-            VALUE "FileVersion", "1, 9, 5, 0\0"
++            VALUE "FileVersion", "1, 9, 6, 0\0"
+             VALUE "InternalName", "jack_portaudio\0"
+-            VALUE "LegalCopyright", "Copyright Grame © 2006-2009\0"
++            VALUE "LegalCopyright", "Copyright Grame © 2006-2010\0"
+             VALUE "LegalTrademarks", "\0"
+             VALUE "OriginalFilename", "jack_winmme.dll\0"
+             VALUE "PrivateBuild", "\0"
+             VALUE "ProductName", "jack_winmme\0"
+-            VALUE "ProductVersion", "1, 9, 5, 0\0"
++            VALUE "ProductVersion", "1, 9, 6, 0\0"
+             VALUE "SpecialBuild", "\0"
+         END
+     END
+--- a/windows/libjack.cbp
++++ b/windows/libjack.cbp
+@@ -25,10 +25,13 @@
+ 					<Add option="-DREGEX_MALLOC" />
+ 					<Add option="-DSTDC_HEADERS" />
+ 					<Add option="-D__SMP__" />
++					<Add option="-DHAVE_CONFIG_H" />
+ 					<Add directory="." />
+ 					<Add directory="..\windows" />
+ 					<Add directory="..\common\jack" />
+ 					<Add directory="..\common" />
++					<Add directory="tre-0.8.0\win32" />
++					<Add directory="tre-0.8.0\lib" />
+ 				</Compiler>
+ 				<Linker>
+ 					<Add library="kernel32" />
+@@ -64,10 +67,13 @@
+ 					<Add option="-DREGEX_MALLOC" />
+ 					<Add option="-DSTDC_HEADERS" />
+ 					<Add option="-D__SMP__" />
++					<Add option="-DHAVE_CONFIG_H" />
+ 					<Add directory="." />
+ 					<Add directory="..\windows" />
+ 					<Add directory="..\common\jack" />
+ 					<Add directory="..\common" />
++					<Add directory="tre-0.8.0\win32" />
++					<Add directory="tre-0.8.0\lib" />
+ 				</Compiler>
+ 				<Linker>
+ 					<Add library="kernel32" />
+@@ -104,10 +110,13 @@
+ 					<Add option="-DSTDC_HEADERS" />
+ 					<Add option="-D__SMP__" />
+ 					<Add option="-DJACK_MONITOR" />
++					<Add option="-DHAVE_CONFIG_H" />
+ 					<Add directory="." />
+ 					<Add directory="..\windows" />
+ 					<Add directory="..\common\jack" />
+ 					<Add directory="..\common" />
++					<Add directory="tre-0.8.0\win32" />
++					<Add directory="tre-0.8.0\lib" />
+ 				</Compiler>
+ 				<Linker>
+ 					<Add library="kernel32" />
+@@ -180,9 +189,52 @@
+ 		<Unit filename="libjack.rc">
+ 			<Option compilerVar="WINDRES" />
+ 		</Unit>
+-		<Unit filename="regex.c">
++		<Unit filename="tre-0.8.0\lib\regcomp.c">
+ 			<Option compilerVar="CC" />
+ 		</Unit>
++		<Unit filename="tre-0.8.0\lib\regerror.c">
++			<Option compilerVar="CC" />
++		</Unit>
++		<Unit filename="tre-0.8.0\lib\regex.h" />
++		<Unit filename="tre-0.8.0\lib\regexec.c">
++			<Option compilerVar="CC" />
++		</Unit>
++		<Unit filename="tre-0.8.0\lib\tre-ast.c">
++			<Option compilerVar="CC" />
++		</Unit>
++		<Unit filename="tre-0.8.0\lib\tre-ast.h" />
++		<Unit filename="tre-0.8.0\lib\tre-compile.c">
++			<Option compilerVar="CC" />
++		</Unit>
++		<Unit filename="tre-0.8.0\lib\tre-compile.h" />
++		<Unit filename="tre-0.8.0\lib\tre-internal.h" />
++		<Unit filename="tre-0.8.0\lib\tre-match-approx.c">
++			<Option compilerVar="CC" />
++		</Unit>
++		<Unit filename="tre-0.8.0\lib\tre-match-backtrack.c">
++			<Option compilerVar="CC" />
++		</Unit>
++		<Unit filename="tre-0.8.0\lib\tre-match-parallel.c">
++			<Option compilerVar="CC" />
++		</Unit>
++		<Unit filename="tre-0.8.0\lib\tre-match-utils.h" />
++		<Unit filename="tre-0.8.0\lib\tre-mem.c">
++			<Option compilerVar="CC" />
++		</Unit>
++		<Unit filename="tre-0.8.0\lib\tre-mem.h" />
++		<Unit filename="tre-0.8.0\lib\tre-parse.c">
++			<Option compilerVar="CC" />
++		</Unit>
++		<Unit filename="tre-0.8.0\lib\tre-parse.h" />
++		<Unit filename="tre-0.8.0\lib\tre-stack.c">
++			<Option compilerVar="CC" />
++		</Unit>
++		<Unit filename="tre-0.8.0\lib\tre-stack.h" />
++		<Unit filename="tre-0.8.0\lib\tre.h" />
++		<Unit filename="tre-0.8.0\lib\xmalloc.c">
++			<Option compilerVar="CC" />
++		</Unit>
++		<Unit filename="tre-0.8.0\lib\xmalloc.h" />
+ 		<Extensions>
+ 			<code_completion />
+ 			<envvars />
+--- a/windows/libjack.rc
++++ b/windows/libjack.rc
+@@ -11,8 +11,8 @@
+ //
+ LANGUAGE LANG_FRENCH, SUBLANG_DEFAULT
+ 1 VERSIONINFO
+-    FILEVERSION     1,9,5,0
+-    PRODUCTVERSION  1,9,5,0
++    FILEVERSION     1,9,6,0
++    PRODUCTVERSION  1,9,6,0
+     FILEOS          VOS_UNKNOWN
+     FILETYPE        VFT_DLL
+ BEGIN
+@@ -23,14 +23,14 @@
+             VALUE "Comments", "\0"
+             VALUE "CompanyName", "Grame\0"
+             VALUE "FileDescription", "Jack client library for Windows\0"
+-            VALUE "FileVersion", "1, 9, 5, 0\0"
++            VALUE "FileVersion", "1, 9, 6, 0\0"
+             VALUE "InternalName", "libjack\0"
+-            VALUE "LegalCopyright", "Copyright Grame © 2006-2009\0"
++            VALUE "LegalCopyright", "Copyright Grame © 2006-2010\0"
+             VALUE "LegalTrademarks", "\0"
+             VALUE "OriginalFilename", "libjack.dll\0"
+             VALUE "PrivateBuild", "\0"
+             VALUE "ProductName", "libjack\0"
+-            VALUE "ProductVersion", "1, 9, 5, 0\0"
++            VALUE "ProductVersion", "1, 9, 6, 0\0"
+             VALUE "SpecialBuild", "\0"
+         END
+     END
+--- a/windows/libjackserver.cbp
++++ b/windows/libjackserver.cbp
+@@ -26,10 +26,13 @@
+ 					<Add option="-DSTDC_HEADERS" />
+ 					<Add option="-DSERVER_SIDE" />
+ 					<Add option="-D__SMP__" />
++					<Add option="-DHAVE_CONFIG_H" />
+ 					<Add directory="." />
+ 					<Add directory="..\windows" />
+ 					<Add directory="..\common\jack" />
+ 					<Add directory="..\common" />
++					<Add directory="tre-0.8.0\win32" />
++					<Add directory="tre-0.8.0\lib" />
+ 				</Compiler>
+ 				<Linker>
+ 					<Add directory="Release\bin" />
+@@ -55,10 +58,13 @@
+ 					<Add option="-DSTDC_HEADERS" />
+ 					<Add option="-DSERVER_SIDE" />
+ 					<Add option="-D__SMP__" />
++					<Add option="-DHAVE_CONFIG_H" />
+ 					<Add directory="." />
+ 					<Add directory="..\windows" />
+ 					<Add directory="..\common\jack" />
+ 					<Add directory="..\common" />
++					<Add directory="tre-0.8.0\win32" />
++					<Add directory="tre-0.8.0\lib" />
+ 				</Compiler>
+ 				<Linker>
+ 					<Add directory="Debug\bin" />
+@@ -85,10 +91,13 @@
+ 					<Add option="-DSERVER_SIDE" />
+ 					<Add option="-D__SMP__" />
+ 					<Add option="-DJACK_MONITOR" />
++					<Add option="-DHAVE_CONFIG_H" />
+ 					<Add directory="." />
+ 					<Add directory="..\windows" />
+ 					<Add directory="..\common\jack" />
+ 					<Add directory="..\common" />
++					<Add directory="tre-0.8.0\win32" />
++					<Add directory="tre-0.8.0\lib" />
+ 				</Compiler>
+ 				<Linker>
+ 					<Add directory="Release\bin" />
+@@ -145,6 +154,8 @@
+ 		<Unit filename="..\common\JackMidiPort.cpp" />
+ 		<Unit filename="..\common\JackNetInterface.cpp" />
+ 		<Unit filename="..\common\JackNetTool.cpp" />
++		<Unit filename="..\common\JackPhysicalMidiInput.cpp" />
++		<Unit filename="..\common\JackPhysicalMidiOutput.cpp" />
+ 		<Unit filename="..\common\JackPort.cpp" />
+ 		<Unit filename="..\common\JackPortType.cpp" />
+ 		<Unit filename="..\common\JackRestartThreadedDriver.cpp" />
+@@ -156,8 +167,6 @@
+ 		<Unit filename="..\common\JackTools.cpp" />
+ 		<Unit filename="..\common\JackTransportEngine.cpp" />
+ 		<Unit filename="..\common\JackWaitThreadedDriver.cpp" />
+-		<Unit filename="..\common\JackPhysicalMidiInput.cpp" />
+-		<Unit filename="..\common\JackPhysicalMidiOutput.cpp" />
+ 		<Unit filename="..\common\ringbuffer.c">
+ 			<Option compilerVar="CC" />
+ 		</Unit>
+@@ -185,9 +194,52 @@
+ 		<Unit filename="libjackserver.rc">
+ 			<Option compilerVar="WINDRES" />
+ 		</Unit>
+-		<Unit filename="regex.c">
++		<Unit filename="tre-0.8.0\lib\regcomp.c">
++			<Option compilerVar="CC" />
++		</Unit>
++		<Unit filename="tre-0.8.0\lib\regerror.c">
++			<Option compilerVar="CC" />
++		</Unit>
++		<Unit filename="tre-0.8.0\lib\regex.h" />
++		<Unit filename="tre-0.8.0\lib\regexec.c">
++			<Option compilerVar="CC" />
++		</Unit>
++		<Unit filename="tre-0.8.0\lib\tre-ast.c">
++			<Option compilerVar="CC" />
++		</Unit>
++		<Unit filename="tre-0.8.0\lib\tre-ast.h" />
++		<Unit filename="tre-0.8.0\lib\tre-compile.c">
++			<Option compilerVar="CC" />
++		</Unit>
++		<Unit filename="tre-0.8.0\lib\tre-compile.h" />
++		<Unit filename="tre-0.8.0\lib\tre-internal.h" />
++		<Unit filename="tre-0.8.0\lib\tre-match-approx.c">
++			<Option compilerVar="CC" />
++		</Unit>
++		<Unit filename="tre-0.8.0\lib\tre-match-backtrack.c">
++			<Option compilerVar="CC" />
++		</Unit>
++		<Unit filename="tre-0.8.0\lib\tre-match-parallel.c">
++			<Option compilerVar="CC" />
++		</Unit>
++		<Unit filename="tre-0.8.0\lib\tre-match-utils.h" />
++		<Unit filename="tre-0.8.0\lib\tre-mem.c">
++			<Option compilerVar="CC" />
++		</Unit>
++		<Unit filename="tre-0.8.0\lib\tre-mem.h" />
++		<Unit filename="tre-0.8.0\lib\tre-parse.c">
++			<Option compilerVar="CC" />
++		</Unit>
++		<Unit filename="tre-0.8.0\lib\tre-parse.h" />
++		<Unit filename="tre-0.8.0\lib\tre-stack.c">
++			<Option compilerVar="CC" />
++		</Unit>
++		<Unit filename="tre-0.8.0\lib\tre-stack.h" />
++		<Unit filename="tre-0.8.0\lib\tre.h" />
++		<Unit filename="tre-0.8.0\lib\xmalloc.c">
+ 			<Option compilerVar="CC" />
+ 		</Unit>
++		<Unit filename="tre-0.8.0\lib\xmalloc.h" />
+ 		<Extensions>
+ 			<code_completion />
+ 			<envvars />
+--- a/windows/libjackserver.rc
++++ b/windows/libjackserver.rc
+@@ -11,8 +11,8 @@
+ //
+ LANGUAGE LANG_FRENCH, SUBLANG_DEFAULT
+ 1 VERSIONINFO
+-    FILEVERSION     1,9,5,0
+-    PRODUCTVERSION  1,9,5,0
++    FILEVERSION     1,9,6,0
++    PRODUCTVERSION  1,9,6,0
+     FILEOS          VOS_UNKNOWN
+     FILETYPE        VFT_DLL
+ BEGIN
+@@ -23,14 +23,14 @@
+             VALUE "Comments", "\0"
+             VALUE "CompanyName", "Grame\0"
+             VALUE "FileDescription", "Jack server library for Windows\0"
+-            VALUE "FileVersion", "1, 9, 5, 0\0"
++            VALUE "FileVersion", "1, 9, 56, 0\0"
+             VALUE "InternalName", "libjackserver\0"
+-            VALUE "LegalCopyright", "Copyright Grame © 2006-2009\0"
++            VALUE "LegalCopyright", "Copyright Grame © 2006-2010\0"
+             VALUE "LegalTrademarks", "\0"
+             VALUE "OriginalFilename", "libjackserver.dll\0"
+             VALUE "PrivateBuild", "\0"
+             VALUE "ProductName", "libjackserver\0"
+-            VALUE "ProductVersion", "1, 9, 5, 0\0"
++            VALUE "ProductVersion", "1, 9, 6, 0\0"
+             VALUE "SpecialBuild", "\0"
+         END
+     END
+--- a/windows/portaudio/JackPortAudioDriver.cpp
++++ b/windows/portaudio/JackPortAudioDriver.cpp
+@@ -404,8 +404,8 @@
+             {
+ 
+             case 'd':
+-                capture_pcm_name = strdup(param->value.str);
+-                playback_pcm_name = strdup(param->value.str);
++                capture_pcm_name = param->value.str;
++                playback_pcm_name = param->value.str;
+                 break;
+ 
+             case 'D':
+@@ -428,14 +428,14 @@
+             case 'C':
+                 capture = true;
+                 if (strcmp(param->value.str, "none") != 0) {
+-                    capture_pcm_name = strdup(param->value.str);
++                    capture_pcm_name = param->value.str;
+                 }
+                 break;
+ 
+             case 'P':
+                 playback = TRUE;
+                 if (strcmp(param->value.str, "none") != 0) {
+-                    playback_pcm_name = strdup(param->value.str);
++                    playback_pcm_name = param->value.str;
+                 }
+                 break;
+ 
+--- a/windows/regex.c
++++ /dev/null
+@@ -1,4949 +0,0 @@
+-/* Extended regular expression matching and search library,
+-   version 0.12.
+-   (Implements POSIX draft P10003.2/D11.2, except for
+-   internationalization features.)
+-
+-   Copyright (C) 1993 Free Software Foundation, Inc.
+-
+-   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, 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., 675 Mass Ave, Cambridge, MA 02139, USA.  */
+-
+-/* AIX requires this to be the first thing in the file. */
+-#if defined (_AIX) && !defined (REGEX_MALLOC)
+-  #pragma alloca
+-#endif
+-
+-#define _GNU_SOURCE
+-
+-/* We need this for `regex.h', and perhaps for the Emacs include files.  */
+-#include <sys/types.h>
+-
+-#ifdef HAVE_CONFIG_H
+-#include "config.h"
+-#endif
+-
+-/* The `emacs' switch turns on certain matching commands
+-   that make sense only in Emacs. */
+-#ifdef emacs
+-
+-#include "lisp.h"
+-#include "buffer.h"
+-#include "syntax.h"
+-
+-/* Emacs uses `NULL' as a predicate.  */
+-#undef NULL
+-
+-#else  /* not emacs */
+-
+-/* We used to test for `BSTRING' here, but only GCC and Emacs define
+-   `BSTRING', as far as I know, and neither of them use this code.  */
+-#if HAVE_STRING_H || STDC_HEADERS
+-#include <string.h>
+-#ifndef bcmp
+-#define bcmp(s1, s2, n)	memcmp ((s1), (s2), (n))
+-#endif
+-#ifndef bcopy
+-#define bcopy(s, d, n)	memcpy ((d), (s), (n))
+-#endif
+-#ifndef bzero
+-#define bzero(s, n)	memset ((s), 0, (n))
+-#endif
+-#else
+-#include <strings.h>
+-#endif
+-
+-#ifdef STDC_HEADERS
+-#include <stdlib.h>
+-#else
+-char *malloc ();
+-char *realloc ();
+-#endif
+-
+-
+-/* Define the syntax stuff for \<, \>, etc.  */
+-
+-/* This must be nonzero for the wordchar and notwordchar pattern
+-   commands in re_match_2.  */
+-#ifndef Sword 
+-#define Sword 1
+-#endif
+-
+-#ifdef SYNTAX_TABLE
+-
+-extern char *re_syntax_table;
+-
+-#else /* not SYNTAX_TABLE */
+-
+-/* How many characters in the character set.  */
+-#define CHAR_SET_SIZE 256
+-
+-static char re_syntax_table[CHAR_SET_SIZE];
+-
+-static void
+-init_syntax_once ()
+-{
+-   register int c;
+-   static int done = 0;
+-
+-   if (done)
+-     return;
+-
+-   bzero (re_syntax_table, sizeof re_syntax_table);
+-
+-   for (c = 'a'; c <= 'z'; c++)
+-     re_syntax_table[c] = Sword;
+-
+-   for (c = 'A'; c <= 'Z'; c++)
+-     re_syntax_table[c] = Sword;
+-
+-   for (c = '0'; c <= '9'; c++)
+-     re_syntax_table[c] = Sword;
+-
+-   re_syntax_table['_'] = Sword;
+-
+-   done = 1;
+-}
+-
+-#endif /* not SYNTAX_TABLE */
+-
+-#define SYNTAX(c) re_syntax_table[c]
+-
+-#endif /* not emacs */
+-
+-/* Get the interface, including the syntax bits.  */
+-#include "regex.h"
+-
+-/* isalpha etc. are used for the character classes.  */
+-#include <ctype.h>
+-
+-#ifndef isascii
+-#define isascii(c) 1
+-#endif
+-
+-#ifdef isblank
+-#define ISBLANK(c) (isascii (c) && isblank (c))
+-#else
+-#define ISBLANK(c) ((c) == ' ' || (c) == '\t')
+-#endif
+-#ifdef isgraph
+-#define ISGRAPH(c) (isascii (c) && isgraph (c))
+-#else
+-#define ISGRAPH(c) (isascii (c) && isprint (c) && !isspace (c))
+-#endif
+-
+-#define ISPRINT(c) (isascii (c) && isprint (c))
+-#define ISDIGIT(c) (isascii (c) && isdigit (c))
+-#define ISALNUM(c) (isascii (c) && isalnum (c))
+-#define ISALPHA(c) (isascii (c) && isalpha (c))
+-#define ISCNTRL(c) (isascii (c) && iscntrl (c))
+-#define ISLOWER(c) (isascii (c) && islower (c))
+-#define ISPUNCT(c) (isascii (c) && ispunct (c))
+-#define ISSPACE(c) (isascii (c) && isspace (c))
+-#define ISUPPER(c) (isascii (c) && isupper (c))
+-#define ISXDIGIT(c) (isascii (c) && isxdigit (c))
+-
+-#ifndef NULL
+-#define NULL 0
+-#endif
+-
+-/* We remove any previous definition of `SIGN_EXTEND_CHAR',
+-   since ours (we hope) works properly with all combinations of
+-   machines, compilers, `char' and `unsigned char' argument types.
+-   (Per Bothner suggested the basic approach.)  */
+-#undef SIGN_EXTEND_CHAR
+-#if __STDC__
+-#define SIGN_EXTEND_CHAR(c) ((signed char) (c))
+-#else  /* not __STDC__ */
+-/* As in Harbison and Steele.  */
+-#define SIGN_EXTEND_CHAR(c) ((((unsigned char) (c)) ^ 128) - 128)
+-#endif
+-
+-/* Should we use malloc or alloca?  If REGEX_MALLOC is not defined, we
+-   use `alloca' instead of `malloc'.  This is because using malloc in
+-   re_search* or re_match* could cause memory leaks when C-g is used in
+-   Emacs; also, malloc is slower and causes storage fragmentation.  On
+-   the other hand, malloc is more portable, and easier to debug.  
+-   
+-   Because we sometimes use alloca, some routines have to be macros,
+-   not functions -- `alloca'-allocated space disappears at the end of the
+-   function it is called in.  */
+-
+-#ifdef REGEX_MALLOC
+-
+-#define REGEX_ALLOCATE malloc
+-#define REGEX_REALLOCATE(source, osize, nsize) realloc (source, nsize)
+-
+-#else /* not REGEX_MALLOC  */
+-
+-/* Emacs already defines alloca, sometimes.  */
+-#ifndef alloca
+-
+-/* Make alloca work the best possible way.  */
+-#ifdef __GNUC__
+-#define alloca __builtin_alloca
+-#else /* not __GNUC__ */
+-#if HAVE_ALLOCA_H
+-#include <alloca.h>
+-#else /* not __GNUC__ or HAVE_ALLOCA_H */
+-#ifndef _AIX /* Already did AIX, up at the top.  */
+-char *alloca ();
+-#endif /* not _AIX */
+-#endif /* not HAVE_ALLOCA_H */ 
+-#endif /* not __GNUC__ */
+-
+-#endif /* not alloca */
+-
+-#define REGEX_ALLOCATE alloca
+-
+-/* Assumes a `char *destination' variable.  */
+-#define REGEX_REALLOCATE(source, osize, nsize)				\
+-  (destination = (char *) alloca (nsize),				\
+-   bcopy (source, destination, osize),					\
+-   destination)
+-
+-#endif /* not REGEX_MALLOC */
+-
+-
+-/* True if `size1' is non-NULL and PTR is pointing anywhere inside
+-   `string1' or just past its end.  This works if PTR is NULL, which is
+-   a good thing.  */
+-#define FIRST_STRING_P(ptr) 					\
+-  (size1 && string1 <= (ptr) && (ptr) <= string1 + size1)
+-
+-/* (Re)Allocate N items of type T using malloc, or fail.  */
+-#define TALLOC(n, t) ((t *) malloc ((n) * sizeof (t)))
+-#define RETALLOC(addr, n, t) ((addr) = (t *) realloc (addr, (n) * sizeof (t)))
+-#define REGEX_TALLOC(n, t) ((t *) REGEX_ALLOCATE ((n) * sizeof (t)))
+-
+-#define BYTEWIDTH 8 /* In bits.  */
+-
+-#define STREQ(s1, s2) ((strcmp (s1, s2) == 0))
+-
+-#define MAX(a, b) ((a) > (b) ? (a) : (b))
+-#define MIN(a, b) ((a) < (b) ? (a) : (b))
+-
+-typedef char boolean;
+-#define false 0
+-#define true 1
+-
+-/* These are the command codes that appear in compiled regular
+-   expressions.  Some opcodes are followed by argument bytes.  A
+-   command code can specify any interpretation whatsoever for its
+-   arguments.  Zero bytes may appear in the compiled regular expression.
+-
+-   The value of `exactn' is needed in search.c (search_buffer) in Emacs.
+-   So regex.h defines a symbol `RE_EXACTN_VALUE' to be 1; the value of
+-   `exactn' we use here must also be 1.  */
+-
+-typedef enum
+-{
+-  no_op = 0,
+-
+-        /* Followed by one byte giving n, then by n literal bytes.  */
+-  exactn = 1,
+-
+-        /* Matches any (more or less) character.  */
+-  anychar,
+-
+-        /* Matches any one char belonging to specified set.  First
+-           following byte is number of bitmap bytes.  Then come bytes
+-           for a bitmap saying which chars are in.  Bits in each byte
+-           are ordered low-bit-first.  A character is in the set if its
+-           bit is 1.  A character too large to have a bit in the map is
+-           automatically not in the set.  */
+-  charset,
+-
+-        /* Same parameters as charset, but match any character that is
+-           not one of those specified.  */
+-  charset_not,
+-
+-        /* Start remembering the text that is matched, for storing in a
+-           register.  Followed by one byte with the register number, in
+-           the range 0 to one less than the pattern buffer's re_nsub
+-           field.  Then followed by one byte with the number of groups
+-           inner to this one.  (This last has to be part of the
+-           start_memory only because we need it in the on_failure_jump
+-           of re_match_2.)  */
+-  start_memory,
+-
+-        /* Stop remembering the text that is matched and store it in a
+-           memory register.  Followed by one byte with the register
+-           number, in the range 0 to one less than `re_nsub' in the
+-           pattern buffer, and one byte with the number of inner groups,
+-           just like `start_memory'.  (We need the number of inner
+-           groups here because we don't have any easy way of finding the
+-           corresponding start_memory when we're at a stop_memory.)  */
+-  stop_memory,
+-
+-        /* Match a duplicate of something remembered. Followed by one
+-           byte containing the register number.  */
+-  duplicate,
+-
+-        /* Fail unless at beginning of line.  */
+-  begline,
+-
+-        /* Fail unless at end of line.  */
+-  endline,
+-
+-        /* Succeeds if at beginning of buffer (if emacs) or at beginning
+-           of string to be matched (if not).  */
+-  begbuf,
+-
+-        /* Analogously, for end of buffer/string.  */
+-  endbuf,
+- 
+-        /* Followed by two byte relative address to which to jump.  */
+-  jump, 
+-
+-	/* Same as jump, but marks the end of an alternative.  */
+-  jump_past_alt,
+-
+-        /* Followed by two-byte relative address of place to resume at
+-           in case of failure.  */
+-  on_failure_jump,
+-	
+-        /* Like on_failure_jump, but pushes a placeholder instead of the
+-           current string position when executed.  */
+-  on_failure_keep_string_jump,
+-  
+-        /* Throw away latest failure point and then jump to following
+-           two-byte relative address.  */
+-  pop_failure_jump,
+-
+-        /* Change to pop_failure_jump if know won't have to backtrack to
+-           match; otherwise change to jump.  This is used to jump
+-           back to the beginning of a repeat.  If what follows this jump
+-           clearly won't match what the repeat does, such that we can be
+-           sure that there is no use backtracking out of repetitions
+-           already matched, then we change it to a pop_failure_jump.
+-           Followed by two-byte address.  */
+-  maybe_pop_jump,
+-
+-        /* Jump to following two-byte address, and push a dummy failure
+-           point. This failure point will be thrown away if an attempt
+-           is made to use it for a failure.  A `+' construct makes this
+-           before the first repeat.  Also used as an intermediary kind
+-           of jump when compiling an alternative.  */
+-  dummy_failure_jump,
+-
+-	/* Push a dummy failure point and continue.  Used at the end of
+-	   alternatives.  */
+-  push_dummy_failure,
+-
+-        /* Followed by two-byte relative address and two-byte number n.
+-           After matching N times, jump to the address upon failure.  */
+-  succeed_n,
+-
+-        /* Followed by two-byte relative address, and two-byte number n.
+-           Jump to the address N times, then fail.  */
+-  jump_n,
+-
+-        /* Set the following two-byte relative address to the
+-           subsequent two-byte number.  The address *includes* the two
+-           bytes of number.  */
+-  set_number_at,
+-
+-  wordchar,	/* Matches any word-constituent character.  */
+-  notwordchar,	/* Matches any char that is not a word-constituent.  */
+-
+-  wordbeg,	/* Succeeds if at word beginning.  */
+-  wordend,	/* Succeeds if at word end.  */
+-
+-  wordbound,	/* Succeeds if at a word boundary.  */
+-  notwordbound	/* Succeeds if not at a word boundary.  */
+-
+-#ifdef emacs
+-  ,before_dot,	/* Succeeds if before point.  */
+-  at_dot,	/* Succeeds if at point.  */
+-  after_dot,	/* Succeeds if after point.  */
+-
+-	/* Matches any character whose syntax is specified.  Followed by
+-           a byte which contains a syntax code, e.g., Sword.  */
+-  syntaxspec,
+-
+-	/* Matches any character whose syntax is not that specified.  */
+-  notsyntaxspec
+-#endif /* emacs */
+-} re_opcode_t;
+-
+-/* Common operations on the compiled pattern.  */
+-
+-/* Store NUMBER in two contiguous bytes starting at DESTINATION.  */
+-
+-#define STORE_NUMBER(destination, number)				\
+-  do {									\
+-    (destination)[0] = (number) & 0377;					\
+-    (destination)[1] = (number) >> 8;					\
+-  } while (0)
+-
+-/* Same as STORE_NUMBER, except increment DESTINATION to
+-   the byte after where the number is stored.  Therefore, DESTINATION
+-   must be an lvalue.  */
+-
+-#define STORE_NUMBER_AND_INCR(destination, number)			\
+-  do {									\
+-    STORE_NUMBER (destination, number);					\
+-    (destination) += 2;							\
+-  } while (0)
+-
+-/* Put into DESTINATION a number stored in two contiguous bytes starting
+-   at SOURCE.  */
+-
+-#define EXTRACT_NUMBER(destination, source)				\
+-  do {									\
+-    (destination) = *(source) & 0377;					\
+-    (destination) += SIGN_EXTEND_CHAR (*((source) + 1)) << 8;		\
+-  } while (0)
+-
+-#ifdef DEBUG
+-static void
+-extract_number (dest, source)
+-    int *dest;
+-    unsigned char *source;
+-{
+-  int temp = SIGN_EXTEND_CHAR (*(source + 1)); 
+-  *dest = *source & 0377;
+-  *dest += temp << 8;
+-}
+-
+-#ifndef EXTRACT_MACROS /* To debug the macros.  */
+-#undef EXTRACT_NUMBER
+-#define EXTRACT_NUMBER(dest, src) extract_number (&dest, src)
+-#endif /* not EXTRACT_MACROS */
+-
+-#endif /* DEBUG */
+-
+-/* Same as EXTRACT_NUMBER, except increment SOURCE to after the number.
+-   SOURCE must be an lvalue.  */
+-
+-#define EXTRACT_NUMBER_AND_INCR(destination, source)			\
+-  do {									\
+-    EXTRACT_NUMBER (destination, source);				\
+-    (source) += 2; 							\
+-  } while (0)
+-
+-#ifdef DEBUG
+-static void
+-extract_number_and_incr (destination, source)
+-    int *destination;
+-    unsigned char **source;
+-{ 
+-  extract_number (destination, *source);
+-  *source += 2;
+-}
+-
+-#ifndef EXTRACT_MACROS
+-#undef EXTRACT_NUMBER_AND_INCR
+-#define EXTRACT_NUMBER_AND_INCR(dest, src) \
+-  extract_number_and_incr (&dest, &src)
+-#endif /* not EXTRACT_MACROS */
+-
+-#endif /* DEBUG */
+-
+-/* If DEBUG is defined, Regex prints many voluminous messages about what
+-   it is doing (if the variable `debug' is nonzero).  If linked with the
+-   main program in `iregex.c', you can enter patterns and strings
+-   interactively.  And if linked with the main program in `main.c' and
+-   the other test files, you can run the already-written tests.  */
+-
+-#ifdef DEBUG
+-
+-/* We use standard I/O for debugging.  */
+-#include <stdio.h>
+-
+-/* It is useful to test things that ``must'' be true when debugging.  */
+-#include <assert.h>
+-
+-static int debug = 0;
+-
+-#define DEBUG_STATEMENT(e) e
+-#define DEBUG_PRINT1(x) if (debug) printf (x)
+-#define DEBUG_PRINT2(x1, x2) if (debug) printf (x1, x2)
+-#define DEBUG_PRINT3(x1, x2, x3) if (debug) printf (x1, x2, x3)
+-#define DEBUG_PRINT4(x1, x2, x3, x4) if (debug) printf (x1, x2, x3, x4)
+-#define DEBUG_PRINT_COMPILED_PATTERN(p, s, e) 				\
+-  if (debug) print_partial_compiled_pattern (s, e)
+-#define DEBUG_PRINT_DOUBLE_STRING(w, s1, sz1, s2, sz2)			\
+-  if (debug) print_double_string (w, s1, sz1, s2, sz2)
+-
+-
+-//extern void printchar ();
+-void printchar( int i ) {}
+-
+-/* Print the fastmap in human-readable form.  */
+-
+-void
+-print_fastmap (fastmap)
+-    char *fastmap;
+-{
+-  unsigned was_a_range = 0;
+-  unsigned i = 0;  
+-  
+-  while (i < (1 << BYTEWIDTH))
+-    {
+-      if (fastmap[i++])
+-	{
+-	  was_a_range = 0;
+-          printchar (i - 1);
+-          while (i < (1 << BYTEWIDTH)  &&  fastmap[i])
+-            {
+-              was_a_range = 1;
+-              i++;
+-            }
+-	  if (was_a_range)
+-            {
+-              printf ("-");
+-              printchar (i - 1);
+-            }
+-        }
+-    }
+-  putchar ('\n'); 
+-}
+-
+-
+-/* Print a compiled pattern string in human-readable form, starting at
+-   the START pointer into it and ending just before the pointer END.  */
+-
+-void
+-print_partial_compiled_pattern (start, end)
+-    unsigned char *start;
+-    unsigned char *end;
+-{
+-  int mcnt, mcnt2;
+-  unsigned char *p = start;
+-  unsigned char *pend = end;
+-
+-  if (start == NULL)
+-    {
+-      printf ("(null)\n");
+-      return;
+-    }
+-    
+-  /* Loop over pattern commands.  */
+-  while (p < pend)
+-    {
+-      switch ((re_opcode_t) *p++)
+-	{
+-        case no_op:
+-          printf ("/no_op");
+-          break;
+-
+-	case exactn:
+-	  mcnt = *p++;
+-          printf ("/exactn/%d", mcnt);
+-          do
+-	    {
+-              putchar ('/');
+-	      printchar (*p++);
+-            }
+-          while (--mcnt);
+-          break;
+-
+-	case start_memory:
+-          mcnt = *p++;
+-          printf ("/start_memory/%d/%d", mcnt, *p++);
+-          break;
+-
+-	case stop_memory:
+-          mcnt = *p++;
+-	  printf ("/stop_memory/%d/%d", mcnt, *p++);
+-          break;
+-
+-	case duplicate:
+-	  printf ("/duplicate/%d", *p++);
+-	  break;
+-
+-	case anychar:
+-	  printf ("/anychar");
+-	  break;
+-
+-	case charset:
+-        case charset_not:
+-          {
+-            register int c;
+-
+-            printf ("/charset%s",
+-	            (re_opcode_t) *(p - 1) == charset_not ? "_not" : "");
+-            
+-            assert (p + *p < pend);
+-
+-            for (c = 0; c < *p; c++)
+-              {
+-                unsigned bit;
+-                unsigned char map_byte = p[1 + c];
+-                
+-                putchar ('/');
+-
+-		for (bit = 0; bit < BYTEWIDTH; bit++)
+-                  if (map_byte & (1 << bit))
+-                    printchar (c * BYTEWIDTH + bit);
+-              }
+-	    p += 1 + *p;
+-	    break;
+-	  }
+-
+-	case begline:
+-	  printf ("/begline");
+-          break;
+-
+-	case endline:
+-          printf ("/endline");
+-          break;
+-
+-	case on_failure_jump:
+-          extract_number_and_incr (&mcnt, &p);
+-  	  printf ("/on_failure_jump/0/%d", mcnt);
+-          break;
+-
+-	case on_failure_keep_string_jump:
+-          extract_number_and_incr (&mcnt, &p);
+-  	  printf ("/on_failure_keep_string_jump/0/%d", mcnt);
+-          break;
+-
+-	case dummy_failure_jump:
+-          extract_number_and_incr (&mcnt, &p);
+-  	  printf ("/dummy_failure_jump/0/%d", mcnt);
+-          break;
+-
+-	case push_dummy_failure:
+-          printf ("/push_dummy_failure");
+-          break;
+-          
+-        case maybe_pop_jump:
+-          extract_number_and_incr (&mcnt, &p);
+-  	  printf ("/maybe_pop_jump/0/%d", mcnt);
+-	  break;
+-
+-        case pop_failure_jump:
+-	  extract_number_and_incr (&mcnt, &p);
+-  	  printf ("/pop_failure_jump/0/%d", mcnt);
+-	  break;          
+-          
+-        case jump_past_alt:
+-	  extract_number_and_incr (&mcnt, &p);
+-  	  printf ("/jump_past_alt/0/%d", mcnt);
+-	  break;          
+-          
+-        case jump:
+-	  extract_number_and_incr (&mcnt, &p);
+-  	  printf ("/jump/0/%d", mcnt);
+-	  break;
+-
+-        case succeed_n: 
+-          extract_number_and_incr (&mcnt, &p);
+-          extract_number_and_incr (&mcnt2, &p);
+- 	  printf ("/succeed_n/0/%d/0/%d", mcnt, mcnt2);
+-          break;
+-        
+-        case jump_n: 
+-          extract_number_and_incr (&mcnt, &p);
+-          extract_number_and_incr (&mcnt2, &p);
+- 	  printf ("/jump_n/0/%d/0/%d", mcnt, mcnt2);
+-          break;
+-        
+-        case set_number_at: 
+-          extract_number_and_incr (&mcnt, &p);
+-          extract_number_and_incr (&mcnt2, &p);
+- 	  printf ("/set_number_at/0/%d/0/%d", mcnt, mcnt2);
+-          break;
+-        
+-        case wordbound:
+-	  printf ("/wordbound");
+-	  break;
+-
+-	case notwordbound:
+-	  printf ("/notwordbound");
+-          break;
+-
+-	case wordbeg:
+-	  printf ("/wordbeg");
+-	  break;
+-          
+-	case wordend:
+-	  printf ("/wordend");
+-          
+-#ifdef emacs
+-	case before_dot:
+-	  printf ("/before_dot");
+-          break;
+-
+-	case at_dot:
+-	  printf ("/at_dot");
+-          break;
+-
+-	case after_dot:
+-	  printf ("/after_dot");
+-          break;
+-
+-	case syntaxspec:
+-          printf ("/syntaxspec");
+-	  mcnt = *p++;
+-	  printf ("/%d", mcnt);
+-          break;
+-	  
+-	case notsyntaxspec:
+-          printf ("/notsyntaxspec");
+-	  mcnt = *p++;
+-	  printf ("/%d", mcnt);
+-	  break;
+-#endif /* emacs */
+-
+-	case wordchar:
+-	  printf ("/wordchar");
+-          break;
+-	  
+-	case notwordchar:
+-	  printf ("/notwordchar");
+-          break;
+-
+-	case begbuf:
+-	  printf ("/begbuf");
+-          break;
+-
+-	case endbuf:
+-	  printf ("/endbuf");
+-          break;
+-
+-        default:
+-          printf ("?%d", *(p-1));
+-	}
+-    }
+-  printf ("/\n");
+-}
+-
+-
+-void
+-print_compiled_pattern (bufp)
+-    struct re_pattern_buffer *bufp;
+-{
+-  unsigned char *buffer = bufp->buffer;
+-
+-  print_partial_compiled_pattern (buffer, buffer + bufp->used);
+-  printf ("%d bytes used/%d bytes allocated.\n", bufp->used, bufp->allocated);
+-
+-  if (bufp->fastmap_accurate && bufp->fastmap)
+-    {
+-      printf ("fastmap: ");
+-      print_fastmap (bufp->fastmap);
+-    }
+-
+-  printf ("re_nsub: %d\t", bufp->re_nsub);
+-  printf ("regs_alloc: %d\t", bufp->regs_allocated);
+-  printf ("can_be_null: %d\t", bufp->can_be_null);
+-  printf ("newline_anchor: %d\n", bufp->newline_anchor);
+-  printf ("no_sub: %d\t", bufp->no_sub);
+-  printf ("not_bol: %d\t", bufp->not_bol);
+-  printf ("not_eol: %d\t", bufp->not_eol);
+-  printf ("syntax: %d\n", bufp->syntax);
+-  /* Perhaps we should print the translate table?  */
+-}
+-
+-
+-void
+-print_double_string (where, string1, size1, string2, size2)
+-    const char *where;
+-    const char *string1;
+-    const char *string2;
+-    int size1;
+-    int size2;
+-{
+-  unsigned this_char;
+-  
+-  if (where == NULL)
+-    printf ("(null)");
+-  else
+-    {
+-      if (FIRST_STRING_P (where))
+-        {
+-          for (this_char = where - string1; this_char < size1; this_char++)
+-            printchar (string1[this_char]);
+-
+-          where = string2;    
+-        }
+-
+-      for (this_char = where - string2; this_char < size2; this_char++)
+-        printchar (string2[this_char]);
+-    }
+-}
+-
+-#else /* not DEBUG */
+-
+-#undef assert
+-#define assert(e)
+-
+-#define DEBUG_STATEMENT(e)
+-#define DEBUG_PRINT1(x)
+-#define DEBUG_PRINT2(x1, x2)
+-#define DEBUG_PRINT3(x1, x2, x3)
+-#define DEBUG_PRINT4(x1, x2, x3, x4)
+-#define DEBUG_PRINT_COMPILED_PATTERN(p, s, e)
+-#define DEBUG_PRINT_DOUBLE_STRING(w, s1, sz1, s2, sz2)
+-
+-#endif /* not DEBUG */
+-
+-/* Set by `re_set_syntax' to the current regexp syntax to recognize.  Can
+-   also be assigned to arbitrarily: each pattern buffer stores its own
+-   syntax, so it can be changed between regex compilations.  */
+-reg_syntax_t re_syntax_options = RE_SYNTAX_EMACS;
+-
+-
+-/* Specify the precise syntax of regexps for compilation.  This provides
+-   for compatibility for various utilities which historically have
+-   different, incompatible syntaxes.
+-
+-   The argument SYNTAX is a bit mask comprised of the various bits
+-   defined in regex.h.  We return the old syntax.  */
+-
+-reg_syntax_t
+-re_set_syntax (syntax)
+-    reg_syntax_t syntax;
+-{
+-  reg_syntax_t ret = re_syntax_options;
+-  
+-  re_syntax_options = syntax;
+-  return ret;
+-}
+-
+-/* This table gives an error message for each of the error codes listed
+-   in regex.h.  Obviously the order here has to be same as there.  */
+-
+-static const char *re_error_msg[] =
+-  { NULL,					/* REG_NOERROR */
+-    "No match",					/* REG_NOMATCH */
+-    "Invalid regular expression",		/* REG_BADPAT */
+-    "Invalid collation character",		/* REG_ECOLLATE */
+-    "Invalid character class name",		/* REG_ECTYPE */
+-    "Trailing backslash",			/* REG_EESCAPE */
+-    "Invalid back reference",			/* REG_ESUBREG */
+-    "Unmatched [ or [^",			/* REG_EBRACK */
+-    "Unmatched ( or \\(",			/* REG_EPAREN */
+-    "Unmatched \\{",				/* REG_EBRACE */
+-    "Invalid content of \\{\\}",		/* REG_BADBR */
+-    "Invalid range end",			/* REG_ERANGE */
+-    "Memory exhausted",				/* REG_ESPACE */
+-    "Invalid preceding regular expression",	/* REG_BADRPT */
+-    "Premature end of regular expression",	/* REG_EEND */
+-    "Regular expression too big",		/* REG_ESIZE */
+-    "Unmatched ) or \\)",			/* REG_ERPAREN */
+-  };
+-
+-/* Subroutine declarations and macros for regex_compile.  */
+-
+-static void store_op1 (), store_op2 ();
+-static void insert_op1 (), insert_op2 ();
+-static boolean at_begline_loc_p (), at_endline_loc_p ();
+-static boolean group_in_compile_stack ();
+-static reg_errcode_t compile_range ();
+-
+-/* Fetch the next character in the uncompiled pattern---translating it 
+-   if necessary.  Also cast from a signed character in the constant
+-   string passed to us by the user to an unsigned char that we can use
+-   as an array index (in, e.g., `translate').  */
+-#define PATFETCH(c)							\
+-  do {if (p == pend) return REG_EEND;					\
+-    c = (unsigned char) *p++;						\
+-    if (translate) c = translate[c]; 					\
+-  } while (0)
+-
+-/* Fetch the next character in the uncompiled pattern, with no
+-   translation.  */
+-#define PATFETCH_RAW(c)							\
+-  do {if (p == pend) return REG_EEND;					\
+-    c = (unsigned char) *p++; 						\
+-  } while (0)
+-
+-/* Go backwards one character in the pattern.  */
+-#define PATUNFETCH p--
+-
+-
+-/* If `translate' is non-null, return translate[D], else just D.  We
+-   cast the subscript to translate because some data is declared as
+-   `char *', to avoid warnings when a string constant is passed.  But
+-   when we use a character as a subscript we must make it unsigned.  */
+-#define TRANSLATE(d) (translate ? translate[(unsigned char) (d)] : (d))
+-
+-
+-/* Macros for outputting the compiled pattern into `buffer'.  */
+-
+-/* If the buffer isn't allocated when it comes in, use this.  */
+-#define INIT_BUF_SIZE  32
+-
+-/* Make sure we have at least N more bytes of space in buffer.  */
+-#define GET_BUFFER_SPACE(n)						\
+-    while (b - bufp->buffer + (n) > bufp->allocated)			\
+-      EXTEND_BUFFER ()
+-
+-/* Make sure we have one more byte of buffer space and then add C to it.  */
+-#define BUF_PUSH(c)							\
+-  do {									\
+-    GET_BUFFER_SPACE (1);						\
+-    *b++ = (unsigned char) (c);						\
+-  } while (0)
+-
+-
+-/* Ensure we have two more bytes of buffer space and then append C1 and C2.  */
+-#define BUF_PUSH_2(c1, c2)						\
+-  do {									\
+-    GET_BUFFER_SPACE (2);						\
+-    *b++ = (unsigned char) (c1);					\
+-    *b++ = (unsigned char) (c2);					\
+-  } while (0)
+-
+-
+-/* As with BUF_PUSH_2, except for three bytes.  */
+-#define BUF_PUSH_3(c1, c2, c3)						\
+-  do {									\
+-    GET_BUFFER_SPACE (3);						\
+-    *b++ = (unsigned char) (c1);					\
+-    *b++ = (unsigned char) (c2);					\
+-    *b++ = (unsigned char) (c3);					\
+-  } while (0)
+-
+-
+-/* Store a jump with opcode OP at LOC to location TO.  We store a
+-   relative address offset by the three bytes the jump itself occupies.  */
+-#define STORE_JUMP(op, loc, to) \
+-  store_op1 (op, loc, (to) - (loc) - 3)
+-
+-/* Likewise, for a two-argument jump.  */
+-#define STORE_JUMP2(op, loc, to, arg) \
+-  store_op2 (op, loc, (to) - (loc) - 3, arg)
+-
+-/* Like `STORE_JUMP', but for inserting.  Assume `b' is the buffer end.  */
+-#define INSERT_JUMP(op, loc, to) \
+-  insert_op1 (op, loc, (to) - (loc) - 3, b)
+-
+-/* Like `STORE_JUMP2', but for inserting.  Assume `b' is the buffer end.  */
+-#define INSERT_JUMP2(op, loc, to, arg) \
+-  insert_op2 (op, loc, (to) - (loc) - 3, arg, b)
+-
+-
+-/* This is not an arbitrary limit: the arguments which represent offsets
+-   into the pattern are two bytes long.  So if 2^16 bytes turns out to
+-   be too small, many things would have to change.  */
+-#define MAX_BUF_SIZE (1L << 16)
+-
+-
+-/* Extend the buffer by twice its current size via realloc and
+-   reset the pointers that pointed into the old block to point to the
+-   correct places in the new one.  If extending the buffer results in it
+-   being larger than MAX_BUF_SIZE, then flag memory exhausted.  */
+-#define EXTEND_BUFFER()							\
+-  do { 									\
+-    unsigned char *old_buffer = bufp->buffer;				\
+-    if (bufp->allocated == MAX_BUF_SIZE) 				\
+-      return REG_ESIZE;							\
+-    bufp->allocated <<= 1;						\
+-    if (bufp->allocated > MAX_BUF_SIZE)					\
+-      bufp->allocated = MAX_BUF_SIZE; 					\
+-    bufp->buffer = (unsigned char *) realloc (bufp->buffer, bufp->allocated);\
+-    if (bufp->buffer == NULL)						\
+-      return REG_ESPACE;						\
+-    /* If the buffer moved, move all the pointers into it.  */		\
+-    if (old_buffer != bufp->buffer)					\
+-      {									\
+-        b = (b - old_buffer) + bufp->buffer;				\
+-        begalt = (begalt - old_buffer) + bufp->buffer;			\
+-        if (fixup_alt_jump)						\
+-          fixup_alt_jump = (fixup_alt_jump - old_buffer) + bufp->buffer;\
+-        if (laststart)							\
+-          laststart = (laststart - old_buffer) + bufp->buffer;		\
+-        if (pending_exact)						\
+-          pending_exact = (pending_exact - old_buffer) + bufp->buffer;	\
+-      }									\
+-  } while (0)
+-
+-
+-/* Since we have one byte reserved for the register number argument to
+-   {start,stop}_memory, the maximum number of groups we can report
+-   things about is what fits in that byte.  */
+-#define MAX_REGNUM 255
+-
+-/* But patterns can have more than `MAX_REGNUM' registers.  We just
+-   ignore the excess.  */
+-typedef unsigned regnum_t;
+-
+-
+-/* Macros for the compile stack.  */
+-
+-/* Since offsets can go either forwards or backwards, this type needs to
+-   be able to hold values from -(MAX_BUF_SIZE - 1) to MAX_BUF_SIZE - 1.  */
+-typedef int pattern_offset_t;
+-
+-typedef struct
+-{
+-  pattern_offset_t begalt_offset;
+-  pattern_offset_t fixup_alt_jump;
+-  pattern_offset_t inner_group_offset;
+-  pattern_offset_t laststart_offset;  
+-  regnum_t regnum;
+-} compile_stack_elt_t;
+-
+-
+-typedef struct
+-{
+-  compile_stack_elt_t *stack;
+-  unsigned size;
+-  unsigned avail;			/* Offset of next open position.  */
+-} compile_stack_type;
+-
+-
+-#define INIT_COMPILE_STACK_SIZE 32
+-
+-#define COMPILE_STACK_EMPTY  (compile_stack.avail == 0)
+-#define COMPILE_STACK_FULL  (compile_stack.avail == compile_stack.size)
+-
+-/* The next available element.  */
+-#define COMPILE_STACK_TOP (compile_stack.stack[compile_stack.avail])
+-
+-
+-/* Set the bit for character C in a list.  */
+-#define SET_LIST_BIT(c)                               \
+-  (b[((unsigned char) (c)) / BYTEWIDTH]               \
+-   |= 1 << (((unsigned char) c) % BYTEWIDTH))
+-
+-
+-/* Get the next unsigned number in the uncompiled pattern.  */
+-#define GET_UNSIGNED_NUMBER(num) 					\
+-  { if (p != pend)							\
+-     {									\
+-       PATFETCH (c); 							\
+-       while (ISDIGIT (c)) 						\
+-         { 								\
+-           if (num < 0)							\
+-              num = 0;							\
+-           num = num * 10 + c - '0'; 					\
+-           if (p == pend) 						\
+-              break; 							\
+-           PATFETCH (c);						\
+-         } 								\
+-       } 								\
+-    }		
+-
+-#define CHAR_CLASS_MAX_LENGTH  6 /* Namely, `xdigit'.  */
+-
+-#define IS_CHAR_CLASS(string)						\
+-   (STREQ (string, "alpha") || STREQ (string, "upper")			\
+-    || STREQ (string, "lower") || STREQ (string, "digit")		\
+-    || STREQ (string, "alnum") || STREQ (string, "xdigit")		\
+-    || STREQ (string, "space") || STREQ (string, "print")		\
+-    || STREQ (string, "punct") || STREQ (string, "graph")		\
+-    || STREQ (string, "cntrl") || STREQ (string, "blank"))
+-
+-/* `regex_compile' compiles PATTERN (of length SIZE) according to SYNTAX.
+-   Returns one of error codes defined in `regex.h', or zero for success.
+-
+-   Assumes the `allocated' (and perhaps `buffer') and `translate'
+-   fields are set in BUFP on entry.
+-
+-   If it succeeds, results are put in BUFP (if it returns an error, the
+-   contents of BUFP are undefined):
+-     `buffer' is the compiled pattern;
+-     `syntax' is set to SYNTAX;
+-     `used' is set to the length of the compiled pattern;
+-     `fastmap_accurate' is zero;
+-     `re_nsub' is the number of subexpressions in PATTERN;
+-     `not_bol' and `not_eol' are zero;
+-   
+-   The `fastmap' and `newline_anchor' fields are neither
+-   examined nor set.  */
+-
+-static reg_errcode_t
+-regex_compile (pattern, size, syntax, bufp)
+-     const char *pattern;
+-     int size;
+-     reg_syntax_t syntax;
+-     struct re_pattern_buffer *bufp;
+-{
+-  /* We fetch characters from PATTERN here.  Even though PATTERN is
+-     `char *' (i.e., signed), we declare these variables as unsigned, so
+-     they can be reliably used as array indices.  */
+-  register unsigned char c, c1;
+-  
+-  /* A random tempory spot in PATTERN.  */
+-  const char *p1;
+-
+-  /* Points to the end of the buffer, where we should append.  */
+-  register unsigned char *b;
+-  
+-  /* Keeps track of unclosed groups.  */
+-  compile_stack_type compile_stack;
+-
+-  /* Points to the current (ending) position in the pattern.  */
+-  const char *p = pattern;
+-  const char *pend = pattern + size;
+-  
+-  /* How to translate the characters in the pattern.  */
+-  char *translate = bufp->translate;
+-
+-  /* Address of the count-byte of the most recently inserted `exactn'
+-     command.  This makes it possible to tell if a new exact-match
+-     character can be added to that command or if the character requires
+-     a new `exactn' command.  */
+-  unsigned char *pending_exact = 0;
+-
+-  /* Address of start of the most recently finished expression.
+-     This tells, e.g., postfix * where to find the start of its
+-     operand.  Reset at the beginning of groups and alternatives.  */
+-  unsigned char *laststart = 0;
+-
+-  /* Address of beginning of regexp, or inside of last group.  */
+-  unsigned char *begalt;
+-
+-  /* Place in the uncompiled pattern (i.e., the {) to
+-     which to go back if the interval is invalid.  */
+-  const char *beg_interval;
+-                
+-  /* Address of the place where a forward jump should go to the end of
+-     the containing expression.  Each alternative of an `or' -- except the
+-     last -- ends with a forward jump of this sort.  */
+-  unsigned char *fixup_alt_jump = 0;
+-
+-  /* Counts open-groups as they are encountered.  Remembered for the
+-     matching close-group on the compile stack, so the same register
+-     number is put in the stop_memory as the start_memory.  */
+-  regnum_t regnum = 0;
+-
+-#ifdef DEBUG
+-  DEBUG_PRINT1 ("\nCompiling pattern: ");
+-  if (debug)
+-    {
+-      unsigned debug_count;
+-      
+-      for (debug_count = 0; debug_count < size; debug_count++)
+-        printchar (pattern[debug_count]);
+-      putchar ('\n');
+-    }
+-#endif /* DEBUG */
+-
+-  /* Initialize the compile stack.  */
+-  compile_stack.stack = TALLOC (INIT_COMPILE_STACK_SIZE, compile_stack_elt_t);
+-  if (compile_stack.stack == NULL)
+-    return REG_ESPACE;
+-
+-  compile_stack.size = INIT_COMPILE_STACK_SIZE;
+-  compile_stack.avail = 0;
+-
+-  /* Initialize the pattern buffer.  */
+-  bufp->syntax = syntax;
+-  bufp->fastmap_accurate = 0;
+-  bufp->not_bol = bufp->not_eol = 0;
+-
+-  /* Set `used' to zero, so that if we return an error, the pattern
+-     printer (for debugging) will think there's no pattern.  We reset it
+-     at the end.  */
+-  bufp->used = 0;
+-  
+-  /* Always count groups, whether or not bufp->no_sub is set.  */
+-  bufp->re_nsub = 0;				
+-
+-#if !defined (emacs) && !defined (SYNTAX_TABLE)
+-  /* Initialize the syntax table.  */
+-   init_syntax_once ();
+-#endif
+-
+-  if (bufp->allocated == 0)
+-    {
+-      if (bufp->buffer)
+-	{ /* If zero allocated, but buffer is non-null, try to realloc
+-             enough space.  This loses if buffer's address is bogus, but
+-             that is the user's responsibility.  */
+-          RETALLOC (bufp->buffer, INIT_BUF_SIZE, unsigned char);
+-        }
+-      else
+-        { /* Caller did not allocate a buffer.  Do it for them.  */
+-          bufp->buffer = TALLOC (INIT_BUF_SIZE, unsigned char);
+-        }
+-      if (!bufp->buffer) return REG_ESPACE;
+-
+-      bufp->allocated = INIT_BUF_SIZE;
+-    }
+-
+-  begalt = b = bufp->buffer;
+-
+-  /* Loop through the uncompiled pattern until we're at the end.  */
+-  while (p != pend)
+-    {
+-      PATFETCH (c);
+-
+-      switch (c)
+-        {
+-        case '^':
+-          {
+-            if (   /* If at start of pattern, it's an operator.  */
+-                   p == pattern + 1
+-                   /* If context independent, it's an operator.  */
+-                || syntax & RE_CONTEXT_INDEP_ANCHORS
+-                   /* Otherwise, depends on what's come before.  */
+-                || at_begline_loc_p (pattern, p, syntax))
+-              BUF_PUSH (begline);
+-            else
+-              goto normal_char;
+-          }
+-          break;
+-
+-
+-        case '$':
+-          {
+-            if (   /* If at end of pattern, it's an operator.  */
+-                   p == pend 
+-                   /* If context independent, it's an operator.  */
+-                || syntax & RE_CONTEXT_INDEP_ANCHORS
+-                   /* Otherwise, depends on what's next.  */
+-                || at_endline_loc_p (p, pend, syntax))
+-               BUF_PUSH (endline);
+-             else
+-               goto normal_char;
+-           }
+-           break;
+-
+-
+-	case '+':
+-        case '?':
+-          if ((syntax & RE_BK_PLUS_QM)
+-              || (syntax & RE_LIMITED_OPS))
+-            goto normal_char;
+-        handle_plus:
+-        case '*':
+-          /* If there is no previous pattern... */
+-          if (!laststart)
+-            {
+-              if (syntax & RE_CONTEXT_INVALID_OPS)
+-                return REG_BADRPT;
+-              else if (!(syntax & RE_CONTEXT_INDEP_OPS))
+-                goto normal_char;
+-            }
+-
+-          {
+-            /* Are we optimizing this jump?  */
+-            boolean keep_string_p = false;
+-            
+-            /* 1 means zero (many) matches is allowed.  */
+-            char zero_times_ok = 0, many_times_ok = 0;
+-
+-            /* If there is a sequence of repetition chars, collapse it
+-               down to just one (the right one).  We can't combine
+-               interval operators with these because of, e.g., `a{2}*',
+-               which should only match an even number of `a's.  */
+-
+-            for (;;)
+-              {
+-                zero_times_ok |= c != '+';
+-                many_times_ok |= c != '?';
+-
+-                if (p == pend)
+-                  break;
+-
+-                PATFETCH (c);
+-
+-                if (c == '*'
+-                    || (!(syntax & RE_BK_PLUS_QM) && (c == '+' || c == '?')))
+-                  ;
+-
+-                else if (syntax & RE_BK_PLUS_QM  &&  c == '\\')
+-                  {
+-                    if (p == pend) return REG_EESCAPE;
+-
+-                    PATFETCH (c1);
+-                    if (!(c1 == '+' || c1 == '?'))
+-                      {
+-                        PATUNFETCH;
+-                        PATUNFETCH;
+-                        break;
+-                      }
+-
+-                    c = c1;
+-                  }
+-                else
+-                  {
+-                    PATUNFETCH;
+-                    break;
+-                  }
+-
+-                /* If we get here, we found another repeat character.  */
+-               }
+-
+-            /* Star, etc. applied to an empty pattern is equivalent
+-               to an empty pattern.  */
+-            if (!laststart)  
+-              break;
+-
+-            /* Now we know whether or not zero matches is allowed
+-               and also whether or not two or more matches is allowed.  */
+-            if (many_times_ok)
+-              { /* More than one repetition is allowed, so put in at the
+-                   end a backward relative jump from `b' to before the next
+-                   jump we're going to put in below (which jumps from
+-                   laststart to after this jump).  
+-
+-                   But if we are at the `*' in the exact sequence `.*\n',
+-                   insert an unconditional jump backwards to the .,
+-                   instead of the beginning of the loop.  This way we only
+-                   push a failure point once, instead of every time
+-                   through the loop.  */
+-                assert (p - 1 > pattern);
+-
+-                /* Allocate the space for the jump.  */
+-                GET_BUFFER_SPACE (3);
+-
+-                /* We know we are not at the first character of the pattern,
+-                   because laststart was nonzero.  And we've already
+-                   incremented `p', by the way, to be the character after
+-                   the `*'.  Do we have to do something analogous here
+-                   for null bytes, because of RE_DOT_NOT_NULL?  */
+-                if (TRANSLATE (*(p - 2)) == TRANSLATE ('.')
+-		    && zero_times_ok
+-                    && p < pend && TRANSLATE (*p) == TRANSLATE ('\n')
+-                    && !(syntax & RE_DOT_NEWLINE))
+-                  { /* We have .*\n.  */
+-                    STORE_JUMP (jump, b, laststart);
+-                    keep_string_p = true;
+-                  }
+-                else
+-                  /* Anything else.  */
+-                  STORE_JUMP (maybe_pop_jump, b, laststart - 3);
+-
+-                /* We've added more stuff to the buffer.  */
+-                b += 3;
+-              }
+-
+-            /* On failure, jump from laststart to b + 3, which will be the
+-               end of the buffer after this jump is inserted.  */
+-            GET_BUFFER_SPACE (3);
+-            INSERT_JUMP (keep_string_p ? on_failure_keep_string_jump
+-                                       : on_failure_jump,
+-                         laststart, b + 3);
+-            pending_exact = 0;
+-            b += 3;
+-
+-            if (!zero_times_ok)
+-              {
+-                /* At least one repetition is required, so insert a
+-                   `dummy_failure_jump' before the initial
+-                   `on_failure_jump' instruction of the loop. This
+-                   effects a skip over that instruction the first time
+-                   we hit that loop.  */
+-                GET_BUFFER_SPACE (3);
+-                INSERT_JUMP (dummy_failure_jump, laststart, laststart + 6);
+-                b += 3;
+-              }
+-            }
+-	  break;
+-
+-
+-	case '.':
+-          laststart = b;
+-          BUF_PUSH (anychar);
+-          break;
+-
+-
+-        case '[':
+-          {
+-            boolean had_char_class = false;
+-
+-            if (p == pend) return REG_EBRACK;
+-
+-            /* Ensure that we have enough space to push a charset: the
+-               opcode, the length count, and the bitset; 34 bytes in all.  */
+-	    GET_BUFFER_SPACE (34);
+-
+-            laststart = b;
+-
+-            /* We test `*p == '^' twice, instead of using an if
+-               statement, so we only need one BUF_PUSH.  */
+-            BUF_PUSH (*p == '^' ? charset_not : charset); 
+-            if (*p == '^')
+-              p++;
+-
+-            /* Remember the first position in the bracket expression.  */
+-            p1 = p;
+-
+-            /* Push the number of bytes in the bitmap.  */
+-            BUF_PUSH ((1 << BYTEWIDTH) / BYTEWIDTH);
+-
+-            /* Clear the whole map.  */
+-            bzero (b, (1 << BYTEWIDTH) / BYTEWIDTH);
+-
+-            /* charset_not matches newline according to a syntax bit.  */
+-            if ((re_opcode_t) b[-2] == charset_not
+-                && (syntax & RE_HAT_LISTS_NOT_NEWLINE))
+-              SET_LIST_BIT ('\n');
+-
+-            /* Read in characters and ranges, setting map bits.  */
+-            for (;;)
+-              {
+-                if (p == pend) return REG_EBRACK;
+-
+-                PATFETCH (c);
+-
+-                /* \ might escape characters inside [...] and [^...].  */
+-                if ((syntax & RE_BACKSLASH_ESCAPE_IN_LISTS) && c == '\\')
+-                  {
+-                    if (p == pend) return REG_EESCAPE;
+-
+-                    PATFETCH (c1);
+-                    SET_LIST_BIT (c1);
+-                    continue;
+-                  }
+-
+-                /* Could be the end of the bracket expression.  If it's
+-                   not (i.e., when the bracket expression is `[]' so
+-                   far), the ']' character bit gets set way below.  */
+-                if (c == ']' && p != p1 + 1)
+-                  break;
+-
+-                /* Look ahead to see if it's a range when the last thing
+-                   was a character class.  */
+-                if (had_char_class && c == '-' && *p != ']')
+-                  return REG_ERANGE;
+-
+-                /* Look ahead to see if it's a range when the last thing
+-                   was a character: if this is a hyphen not at the
+-                   beginning or the end of a list, then it's the range
+-                   operator.  */
+-                if (c == '-' 
+-                    && !(p - 2 >= pattern && p[-2] == '[') 
+-                    && !(p - 3 >= pattern && p[-3] == '[' && p[-2] == '^')
+-                    && *p != ']')
+-                  {
+-                    reg_errcode_t ret
+-                      = compile_range (&p, pend, translate, syntax, b);
+-                    if (ret != REG_NOERROR) return ret;
+-                  }
+-
+-                else if (p[0] == '-' && p[1] != ']')
+-                  { /* This handles ranges made up of characters only.  */
+-                    reg_errcode_t ret;
+-
+-		    /* Move past the `-'.  */
+-                    PATFETCH (c1);
+-                    
+-                    ret = compile_range (&p, pend, translate, syntax, b);
+-                    if (ret != REG_NOERROR) return ret;
+-                  }
+-
+-                /* See if we're at the beginning of a possible character
+-                   class.  */
+-
+-                else if (syntax & RE_CHAR_CLASSES && c == '[' && *p == ':')
+-                  { /* Leave room for the null.  */
+-                    char str[CHAR_CLASS_MAX_LENGTH + 1];
+-
+-                    PATFETCH (c);
+-                    c1 = 0;
+-
+-                    /* If pattern is `[[:'.  */
+-                    if (p == pend) return REG_EBRACK;
+-
+-                    for (;;)
+-                      {
+-                        PATFETCH (c);
+-                        if (c == ':' || c == ']' || p == pend
+-                            || c1 == CHAR_CLASS_MAX_LENGTH)
+-                          break;
+-                        str[c1++] = c;
+-                      }
+-                    str[c1] = '\0';
+-
+-                    /* If isn't a word bracketed by `[:' and:`]':
+-                       undo the ending character, the letters, and leave 
+-                       the leading `:' and `[' (but set bits for them).  */
+-                    if (c == ':' && *p == ']')
+-                      {
+-                        int ch;
+-                        boolean is_alnum = STREQ (str, "alnum");
+-                        boolean is_alpha = STREQ (str, "alpha");
+-                        boolean is_blank = STREQ (str, "blank");
+-                        boolean is_cntrl = STREQ (str, "cntrl");
+-                        boolean is_digit = STREQ (str, "digit");
+-                        boolean is_graph = STREQ (str, "graph");
+-                        boolean is_lower = STREQ (str, "lower");
+-                        boolean is_print = STREQ (str, "print");
+-                        boolean is_punct = STREQ (str, "punct");
+-                        boolean is_space = STREQ (str, "space");
+-                        boolean is_upper = STREQ (str, "upper");
+-                        boolean is_xdigit = STREQ (str, "xdigit");
+-                        
+-                        if (!IS_CHAR_CLASS (str)) return REG_ECTYPE;
+-
+-                        /* Throw away the ] at the end of the character
+-                           class.  */
+-                        PATFETCH (c);					
+-
+-                        if (p == pend) return REG_EBRACK;
+-
+-                        for (ch = 0; ch < 1 << BYTEWIDTH; ch++)
+-                          {
+-                            if (   (is_alnum  && ISALNUM (ch))
+-                                || (is_alpha  && ISALPHA (ch))
+-                                || (is_blank  && ISBLANK (ch))
+-                                || (is_cntrl  && ISCNTRL (ch))
+-                                || (is_digit  && ISDIGIT (ch))
+-                                || (is_graph  && ISGRAPH (ch))
+-                                || (is_lower  && ISLOWER (ch))
+-                                || (is_print  && ISPRINT (ch))
+-                                || (is_punct  && ISPUNCT (ch))
+-                                || (is_space  && ISSPACE (ch))
+-                                || (is_upper  && ISUPPER (ch))
+-                                || (is_xdigit && ISXDIGIT (ch)))
+-                            SET_LIST_BIT (ch);
+-                          }
+-                        had_char_class = true;
+-                      }
+-                    else
+-                      {
+-                        c1++;
+-                        while (c1--)    
+-                          PATUNFETCH;
+-                        SET_LIST_BIT ('[');
+-                        SET_LIST_BIT (':');
+-                        had_char_class = false;
+-                      }
+-                  }
+-                else
+-                  {
+-                    had_char_class = false;
+-                    SET_LIST_BIT (c);
+-                  }
+-              }
+-
+-            /* Discard any (non)matching list bytes that are all 0 at the
+-               end of the map.  Decrease the map-length byte too.  */
+-            while ((int) b[-1] > 0 && b[b[-1] - 1] == 0) 
+-              b[-1]--; 
+-            b += b[-1];
+-          }
+-          break;
+-
+-
+-	case '(':
+-          if (syntax & RE_NO_BK_PARENS)
+-            goto handle_open;
+-          else
+-            goto normal_char;
+-
+-
+-        case ')':
+-          if (syntax & RE_NO_BK_PARENS)
+-            goto handle_close;
+-          else
+-            goto normal_char;
+-
+-
+-        case '\n':
+-          if (syntax & RE_NEWLINE_ALT)
+-            goto handle_alt;
+-          else
+-            goto normal_char;
+-
+-
+-	case '|':
+-          if (syntax & RE_NO_BK_VBAR)
+-            goto handle_alt;
+-          else
+-            goto normal_char;
+-
+-
+-        case '{':
+-           if (syntax & RE_INTERVALS && syntax & RE_NO_BK_BRACES)
+-             goto handle_interval;
+-           else
+-             goto normal_char;
+-
+-
+-        case '\\':
+-          if (p == pend) return REG_EESCAPE;
+-
+-          /* Do not translate the character after the \, so that we can
+-             distinguish, e.g., \B from \b, even if we normally would
+-             translate, e.g., B to b.  */
+-          PATFETCH_RAW (c);
+-
+-          switch (c)
+-            {
+-            case '(':
+-              if (syntax & RE_NO_BK_PARENS)
+-                goto normal_backslash;
+-
+-            handle_open:
+-              bufp->re_nsub++;
+-              regnum++;
+-
+-              if (COMPILE_STACK_FULL)
+-                { 
+-                  RETALLOC (compile_stack.stack, compile_stack.size << 1,
+-                            compile_stack_elt_t);
+-                  if (compile_stack.stack == NULL) return REG_ESPACE;
+-
+-                  compile_stack.size <<= 1;
+-                }
+-
+-              /* These are the values to restore when we hit end of this
+-                 group.  They are all relative offsets, so that if the
+-                 whole pattern moves because of realloc, they will still
+-                 be valid.  */
+-              COMPILE_STACK_TOP.begalt_offset = begalt - bufp->buffer;
+-              COMPILE_STACK_TOP.fixup_alt_jump 
+-                = fixup_alt_jump ? fixup_alt_jump - bufp->buffer + 1 : 0;
+-              COMPILE_STACK_TOP.laststart_offset = b - bufp->buffer;
+-              COMPILE_STACK_TOP.regnum = regnum;
+-
+-              /* We will eventually replace the 0 with the number of
+-                 groups inner to this one.  But do not push a
+-                 start_memory for groups beyond the last one we can
+-                 represent in the compiled pattern.  */
+-              if (regnum <= MAX_REGNUM)
+-                {
+-                  COMPILE_STACK_TOP.inner_group_offset = b - bufp->buffer + 2;
+-                  BUF_PUSH_3 (start_memory, regnum, 0);
+-                }
+-                
+-              compile_stack.avail++;
+-
+-              fixup_alt_jump = 0;
+-              laststart = 0;
+-              begalt = b;
+-	      /* If we've reached MAX_REGNUM groups, then this open
+-		 won't actually generate any code, so we'll have to
+-		 clear pending_exact explicitly.  */
+-	      pending_exact = 0;
+-              break;
+-
+-
+-            case ')':
+-              if (syntax & RE_NO_BK_PARENS) goto normal_backslash;
+-
+-              if (COMPILE_STACK_EMPTY)
+-                if (syntax & RE_UNMATCHED_RIGHT_PAREN_ORD)
+-                  goto normal_backslash;
+-                else
+-                  return REG_ERPAREN;
+-
+-            handle_close:
+-              if (fixup_alt_jump)
+-                { /* Push a dummy failure point at the end of the
+-                     alternative for a possible future
+-                     `pop_failure_jump' to pop.  See comments at
+-                     `push_dummy_failure' in `re_match_2'.  */
+-                  BUF_PUSH (push_dummy_failure);
+-                  
+-                  /* We allocated space for this jump when we assigned
+-                     to `fixup_alt_jump', in the `handle_alt' case below.  */
+-                  STORE_JUMP (jump_past_alt, fixup_alt_jump, b - 1);
+-                }
+-
+-              /* See similar code for backslashed left paren above.  */
+-              if (COMPILE_STACK_EMPTY)
+-                if (syntax & RE_UNMATCHED_RIGHT_PAREN_ORD)
+-                  goto normal_char;
+-                else
+-                  return REG_ERPAREN;
+-
+-              /* Since we just checked for an empty stack above, this
+-                 ``can't happen''.  */
+-              assert (compile_stack.avail != 0);
+-              {
+-                /* We don't just want to restore into `regnum', because
+-                   later groups should continue to be numbered higher,
+-                   as in `(ab)c(de)' -- the second group is #2.  */
+-                regnum_t this_group_regnum;
+-
+-                compile_stack.avail--;		
+-                begalt = bufp->buffer + COMPILE_STACK_TOP.begalt_offset;
+-                fixup_alt_jump
+-                  = COMPILE_STACK_TOP.fixup_alt_jump
+-                    ? bufp->buffer + COMPILE_STACK_TOP.fixup_alt_jump - 1 
+-                    : 0;
+-                laststart = bufp->buffer + COMPILE_STACK_TOP.laststart_offset;
+-                this_group_regnum = COMPILE_STACK_TOP.regnum;
+-		/* If we've reached MAX_REGNUM groups, then this open
+-		   won't actually generate any code, so we'll have to
+-		   clear pending_exact explicitly.  */
+-		pending_exact = 0;
+-
+-                /* We're at the end of the group, so now we know how many
+-                   groups were inside this one.  */
+-                if (this_group_regnum <= MAX_REGNUM)
+-                  {
+-                    unsigned char *inner_group_loc
+-                      = bufp->buffer + COMPILE_STACK_TOP.inner_group_offset;
+-                    
+-                    *inner_group_loc = regnum - this_group_regnum;
+-                    BUF_PUSH_3 (stop_memory, this_group_regnum,
+-                                regnum - this_group_regnum);
+-                  }
+-              }
+-              break;
+-
+-
+-            case '|':					/* `\|'.  */
+-              if (syntax & RE_LIMITED_OPS || syntax & RE_NO_BK_VBAR)
+-                goto normal_backslash;
+-            handle_alt:
+-              if (syntax & RE_LIMITED_OPS)
+-                goto normal_char;
+-
+-              /* Insert before the previous alternative a jump which
+-                 jumps to this alternative if the former fails.  */
+-              GET_BUFFER_SPACE (3);
+-              INSERT_JUMP (on_failure_jump, begalt, b + 6);
+-              pending_exact = 0;
+-              b += 3;
+-
+-              /* The alternative before this one has a jump after it
+-                 which gets executed if it gets matched.  Adjust that
+-                 jump so it will jump to this alternative's analogous
+-                 jump (put in below, which in turn will jump to the next
+-                 (if any) alternative's such jump, etc.).  The last such
+-                 jump jumps to the correct final destination.  A picture:
+-                          _____ _____ 
+-                          |   | |   |   
+-                          |   v |   v 
+-                         a | b   | c   
+-
+-                 If we are at `b', then fixup_alt_jump right now points to a
+-                 three-byte space after `a'.  We'll put in the jump, set
+-                 fixup_alt_jump to right after `b', and leave behind three
+-                 bytes which we'll fill in when we get to after `c'.  */
+-
+-              if (fixup_alt_jump)
+-                STORE_JUMP (jump_past_alt, fixup_alt_jump, b);
+-
+-              /* Mark and leave space for a jump after this alternative,
+-                 to be filled in later either by next alternative or
+-                 when know we're at the end of a series of alternatives.  */
+-              fixup_alt_jump = b;
+-              GET_BUFFER_SPACE (3);
+-              b += 3;
+-
+-              laststart = 0;
+-              begalt = b;
+-              break;
+-
+-
+-            case '{': 
+-              /* If \{ is a literal.  */
+-              if (!(syntax & RE_INTERVALS)
+-                     /* If we're at `\{' and it's not the open-interval 
+-                        operator.  */
+-                  || ((syntax & RE_INTERVALS) && (syntax & RE_NO_BK_BRACES))
+-                  || (p - 2 == pattern  &&  p == pend))
+-                goto normal_backslash;
+-
+-            handle_interval:
+-              {
+-                /* If got here, then the syntax allows intervals.  */
+-
+-                /* At least (most) this many matches must be made.  */
+-                int lower_bound = -1, upper_bound = -1;
+-
+-                beg_interval = p - 1;
+-
+-                if (p == pend)
+-                  {
+-                    if (syntax & RE_NO_BK_BRACES)
+-                      goto unfetch_interval;
+-                    else
+-                      return REG_EBRACE;
+-                  }
+-
+-                GET_UNSIGNED_NUMBER (lower_bound);
+-
+-                if (c == ',')
+-                  {
+-                    GET_UNSIGNED_NUMBER (upper_bound);
+-                    if (upper_bound < 0) upper_bound = RE_DUP_MAX;
+-                  }
+-                else
+-                  /* Interval such as `{1}' => match exactly once. */
+-                  upper_bound = lower_bound;
+-
+-                if (lower_bound < 0 || upper_bound > RE_DUP_MAX
+-                    || lower_bound > upper_bound)
+-                  {
+-                    if (syntax & RE_NO_BK_BRACES)
+-                      goto unfetch_interval;
+-                    else 
+-                      return REG_BADBR;
+-                  }
+-
+-                if (!(syntax & RE_NO_BK_BRACES)) 
+-                  {
+-                    if (c != '\\') return REG_EBRACE;
+-
+-                    PATFETCH (c);
+-                  }
+-
+-                if (c != '}')
+-                  {
+-                    if (syntax & RE_NO_BK_BRACES)
+-                      goto unfetch_interval;
+-                    else 
+-                      return REG_BADBR;
+-                  }
+-
+-                /* We just parsed a valid interval.  */
+-
+-                /* If it's invalid to have no preceding re.  */
+-                if (!laststart)
+-                  {
+-                    if (syntax & RE_CONTEXT_INVALID_OPS)
+-                      return REG_BADRPT;
+-                    else if (syntax & RE_CONTEXT_INDEP_OPS)
+-                      laststart = b;
+-                    else
+-                      goto unfetch_interval;
+-                  }
+-
+-                /* If the upper bound is zero, don't want to succeed at
+-                   all; jump from `laststart' to `b + 3', which will be
+-                   the end of the buffer after we insert the jump.  */
+-                 if (upper_bound == 0)
+-                   {
+-                     GET_BUFFER_SPACE (3);
+-                     INSERT_JUMP (jump, laststart, b + 3);
+-                     b += 3;
+-                   }
+-
+-                 /* Otherwise, we have a nontrivial interval.  When
+-                    we're all done, the pattern will look like:
+-                      set_number_at <jump count> <upper bound>
+-                      set_number_at <succeed_n count> <lower bound>
+-                      succeed_n <after jump addr> <succed_n count>
+-                      <body of loop>
+-                      jump_n <succeed_n addr> <jump count>
+-                    (The upper bound and `jump_n' are omitted if
+-                    `upper_bound' is 1, though.)  */
+-                 else 
+-                   { /* If the upper bound is > 1, we need to insert
+-                        more at the end of the loop.  */
+-                     unsigned nbytes = 10 + (upper_bound > 1) * 10;
+-
+-                     GET_BUFFER_SPACE (nbytes);
+-
+-                     /* Initialize lower bound of the `succeed_n', even
+-                        though it will be set during matching by its
+-                        attendant `set_number_at' (inserted next),
+-                        because `re_compile_fastmap' needs to know.
+-                        Jump to the `jump_n' we might insert below.  */
+-                     INSERT_JUMP2 (succeed_n, laststart,
+-                                   b + 5 + (upper_bound > 1) * 5,
+-                                   lower_bound);
+-                     b += 5;
+-
+-                     /* Code to initialize the lower bound.  Insert 
+-                        before the `succeed_n'.  The `5' is the last two
+-                        bytes of this `set_number_at', plus 3 bytes of
+-                        the following `succeed_n'.  */
+-                     insert_op2 (set_number_at, laststart, 5, lower_bound, b);
+-                     b += 5;
+-
+-                     if (upper_bound > 1)
+-                       { /* More than one repetition is allowed, so
+-                            append a backward jump to the `succeed_n'
+-                            that starts this interval.
+-                            
+-                            When we've reached this during matching,
+-                            we'll have matched the interval once, so
+-                            jump back only `upper_bound - 1' times.  */
+-                         STORE_JUMP2 (jump_n, b, laststart + 5,
+-                                      upper_bound - 1);
+-                         b += 5;
+-
+-                         /* The location we want to set is the second
+-                            parameter of the `jump_n'; that is `b-2' as
+-                            an absolute address.  `laststart' will be
+-                            the `set_number_at' we're about to insert;
+-                            `laststart+3' the number to set, the source
+-                            for the relative address.  But we are
+-                            inserting into the middle of the pattern --
+-                            so everything is getting moved up by 5.
+-                            Conclusion: (b - 2) - (laststart + 3) + 5,
+-                            i.e., b - laststart.
+-                            
+-                            We insert this at the beginning of the loop
+-                            so that if we fail during matching, we'll
+-                            reinitialize the bounds.  */
+-                         insert_op2 (set_number_at, laststart, b - laststart,
+-                                     upper_bound - 1, b);
+-                         b += 5;
+-                       }
+-                   }
+-                pending_exact = 0;
+-                beg_interval = NULL;
+-              }
+-              break;
+-
+-            unfetch_interval:
+-              /* If an invalid interval, match the characters as literals.  */
+-               assert (beg_interval);
+-               p = beg_interval;
+-               beg_interval = NULL;
+-
+-               /* normal_char and normal_backslash need `c'.  */
+-               PATFETCH (c);	
+-
+-               if (!(syntax & RE_NO_BK_BRACES))
+-                 {
+-                   if (p > pattern  &&  p[-1] == '\\')
+-                     goto normal_backslash;
+-                 }
+-               goto normal_char;
+-
+-#ifdef emacs
+-            /* There is no way to specify the before_dot and after_dot
+-               operators.  rms says this is ok.  --karl  */
+-            case '=':
+-              BUF_PUSH (at_dot);
+-              break;
+-
+-            case 's':	
+-              laststart = b;
+-              PATFETCH (c);
+-              BUF_PUSH_2 (syntaxspec, syntax_spec_code[c]);
+-              break;
+-
+-            case 'S':
+-              laststart = b;
+-              PATFETCH (c);
+-              BUF_PUSH_2 (notsyntaxspec, syntax_spec_code[c]);
+-              break;
+-#endif /* emacs */
+-
+-
+-            case 'w':
+-              laststart = b;
+-              BUF_PUSH (wordchar);
+-              break;
+-
+-
+-            case 'W':
+-              laststart = b;
+-              BUF_PUSH (notwordchar);
+-              break;
+-
+-
+-            case '<':
+-              BUF_PUSH (wordbeg);
+-              break;
+-
+-            case '>':
+-              BUF_PUSH (wordend);
+-              break;
+-
+-            case 'b':
+-              BUF_PUSH (wordbound);
+-              break;
+-
+-            case 'B':
+-              BUF_PUSH (notwordbound);
+-              break;
+-
+-            case '`':
+-              BUF_PUSH (begbuf);
+-              break;
+-
+-            case '\'':
+-              BUF_PUSH (endbuf);
+-              break;
+-
+-            case '1': case '2': case '3': case '4': case '5':
+-            case '6': case '7': case '8': case '9':
+-              if (syntax & RE_NO_BK_REFS)
+-                goto normal_char;
+-
+-              c1 = c - '0';
+-
+-              if (c1 > regnum)
+-                return REG_ESUBREG;
+-
+-              /* Can't back reference to a subexpression if inside of it.  */
+-              if (group_in_compile_stack (compile_stack, c1))
+-                goto normal_char;
+-
+-              laststart = b;
+-              BUF_PUSH_2 (duplicate, c1);
+-              break;
+-
+-
+-            case '+':
+-            case '?':
+-              if (syntax & RE_BK_PLUS_QM)
+-                goto handle_plus;
+-              else
+-                goto normal_backslash;
+-
+-            default:
+-            normal_backslash:
+-              /* You might think it would be useful for \ to mean
+-                 not to translate; but if we don't translate it
+-                 it will never match anything.  */
+-              c = TRANSLATE (c);
+-              goto normal_char;
+-            }
+-          break;
+-
+-
+-	default:
+-        /* Expects the character in `c'.  */
+-	normal_char:
+-	      /* If no exactn currently being built.  */
+-          if (!pending_exact 
+-
+-              /* If last exactn not at current position.  */
+-              || pending_exact + *pending_exact + 1 != b
+-              
+-              /* We have only one byte following the exactn for the count.  */
+-	      || *pending_exact == (1 << BYTEWIDTH) - 1
+-
+-              /* If followed by a repetition operator.  */
+-              || *p == '*' || *p == '^'
+-	      || ((syntax & RE_BK_PLUS_QM)
+-		  ? *p == '\\' && (p[1] == '+' || p[1] == '?')
+-		  : (*p == '+' || *p == '?'))
+-	      || ((syntax & RE_INTERVALS)
+-                  && ((syntax & RE_NO_BK_BRACES)
+-		      ? *p == '{'
+-                      : (p[0] == '\\' && p[1] == '{'))))
+-	    {
+-	      /* Start building a new exactn.  */
+-              
+-              laststart = b;
+-
+-	      BUF_PUSH_2 (exactn, 0);
+-	      pending_exact = b - 1;
+-            }
+-            
+-	  BUF_PUSH (c);
+-          (*pending_exact)++;
+-	  break;
+-        } /* switch (c) */
+-    } /* while p != pend */
+-
+-  
+-  /* Through the pattern now.  */
+-  
+-  if (fixup_alt_jump)
+-    STORE_JUMP (jump_past_alt, fixup_alt_jump, b);
+-
+-  if (!COMPILE_STACK_EMPTY) 
+-    return REG_EPAREN;
+-
+-  free (compile_stack.stack);
+-
+-  /* We have succeeded; set the length of the buffer.  */
+-  bufp->used = b - bufp->buffer;
+-
+-#ifdef DEBUG
+-  if (debug)
+-    {
+-      DEBUG_PRINT1 ("\nCompiled pattern: ");
+-      print_compiled_pattern (bufp);
+-    }
+-#endif /* DEBUG */
+-
+-  return REG_NOERROR;
+-} /* regex_compile */
+-
+-/* Subroutines for `regex_compile'.  */
+-
+-/* Store OP at LOC followed by two-byte integer parameter ARG.  */
+-
+-static void
+-store_op1 (op, loc, arg)
+-    re_opcode_t op;
+-    unsigned char *loc;
+-    int arg;
+-{
+-  *loc = (unsigned char) op;
+-  STORE_NUMBER (loc + 1, arg);
+-}
+-
+-
+-/* Like `store_op1', but for two two-byte parameters ARG1 and ARG2.  */
+-
+-static void
+-store_op2 (op, loc, arg1, arg2)
+-    re_opcode_t op;
+-    unsigned char *loc;
+-    int arg1, arg2;
+-{
+-  *loc = (unsigned char) op;
+-  STORE_NUMBER (loc + 1, arg1);
+-  STORE_NUMBER (loc + 3, arg2);
+-}
+-
+-
+-/* Copy the bytes from LOC to END to open up three bytes of space at LOC
+-   for OP followed by two-byte integer parameter ARG.  */
+-
+-static void
+-insert_op1 (op, loc, arg, end)
+-    re_opcode_t op;
+-    unsigned char *loc;
+-    int arg;
+-    unsigned char *end;    
+-{
+-  register unsigned char *pfrom = end;
+-  register unsigned char *pto = end + 3;
+-
+-  while (pfrom != loc)
+-    *--pto = *--pfrom;
+-    
+-  store_op1 (op, loc, arg);
+-}
+-
+-
+-/* Like `insert_op1', but for two two-byte parameters ARG1 and ARG2.  */
+-
+-static void
+-insert_op2 (op, loc, arg1, arg2, end)
+-    re_opcode_t op;
+-    unsigned char *loc;
+-    int arg1, arg2;
+-    unsigned char *end;    
+-{
+-  register unsigned char *pfrom = end;
+-  register unsigned char *pto = end + 5;
+-
+-  while (pfrom != loc)
+-    *--pto = *--pfrom;
+-    
+-  store_op2 (op, loc, arg1, arg2);
+-}
+-
+-
+-/* P points to just after a ^ in PATTERN.  Return true if that ^ comes
+-   after an alternative or a begin-subexpression.  We assume there is at
+-   least one character before the ^.  */
+-
+-static boolean
+-at_begline_loc_p (pattern, p, syntax)
+-    const char *pattern, *p;
+-    reg_syntax_t syntax;
+-{
+-  const char *prev = p - 2;
+-  boolean prev_prev_backslash = prev > pattern && prev[-1] == '\\';
+-  
+-  return
+-       /* After a subexpression?  */
+-       (*prev == '(' && (syntax & RE_NO_BK_PARENS || prev_prev_backslash))
+-       /* After an alternative?  */
+-    || (*prev == '|' && (syntax & RE_NO_BK_VBAR || prev_prev_backslash));
+-}
+-
+-
+-/* The dual of at_begline_loc_p.  This one is for $.  We assume there is
+-   at least one character after the $, i.e., `P < PEND'.  */
+-
+-static boolean
+-at_endline_loc_p (p, pend, syntax)
+-    const char *p, *pend;
+-    int syntax;
+-{
+-  const char *next = p;
+-  boolean next_backslash = *next == '\\';
+-  const char *next_next = p + 1 < pend ? p + 1 : NULL;
+-  
+-  return
+-       /* Before a subexpression?  */
+-       (syntax & RE_NO_BK_PARENS ? *next == ')'
+-        : next_backslash && next_next && *next_next == ')')
+-       /* Before an alternative?  */
+-    || (syntax & RE_NO_BK_VBAR ? *next == '|'
+-        : next_backslash && next_next && *next_next == '|');
+-}
+-
+-
+-/* Returns true if REGNUM is in one of COMPILE_STACK's elements and 
+-   false if it's not.  */
+-
+-static boolean
+-group_in_compile_stack (compile_stack, regnum)
+-    compile_stack_type compile_stack;
+-    regnum_t regnum;
+-{
+-  int this_element;
+-
+-  for (this_element = compile_stack.avail - 1;  
+-       this_element >= 0; 
+-       this_element--)
+-    if (compile_stack.stack[this_element].regnum == regnum)
+-      return true;
+-
+-  return false;
+-}
+-
+-
+-/* Read the ending character of a range (in a bracket expression) from the
+-   uncompiled pattern *P_PTR (which ends at PEND).  We assume the
+-   starting character is in `P[-2]'.  (`P[-1]' is the character `-'.)
+-   Then we set the translation of all bits between the starting and
+-   ending characters (inclusive) in the compiled pattern B.
+-   
+-   Return an error code.
+-   
+-   We use these short variable names so we can use the same macros as
+-   `regex_compile' itself.  */
+-
+-static reg_errcode_t
+-compile_range (p_ptr, pend, translate, syntax, b)
+-    const char **p_ptr, *pend;
+-    char *translate;
+-    reg_syntax_t syntax;
+-    unsigned char *b;
+-{
+-  unsigned this_char;
+-
+-  const char *p = *p_ptr;
+-  int range_start, range_end;
+-  
+-  if (p == pend)
+-    return REG_ERANGE;
+-
+-  /* Even though the pattern is a signed `char *', we need to fetch
+-     with unsigned char *'s; if the high bit of the pattern character
+-     is set, the range endpoints will be negative if we fetch using a
+-     signed char *.
+-
+-     We also want to fetch the endpoints without translating them; the 
+-     appropriate translation is done in the bit-setting loop below.  */
+-  range_start = ((unsigned char *) p)[-2];
+-  range_end   = ((unsigned char *) p)[0];
+-
+-  /* Have to increment the pointer into the pattern string, so the
+-     caller isn't still at the ending character.  */
+-  (*p_ptr)++;
+-
+-  /* If the start is after the end, the range is empty.  */
+-  if (range_start > range_end)
+-    return syntax & RE_NO_EMPTY_RANGES ? REG_ERANGE : REG_NOERROR;
+-
+-  /* Here we see why `this_char' has to be larger than an `unsigned
+-     char' -- the range is inclusive, so if `range_end' == 0xff
+-     (assuming 8-bit characters), we would otherwise go into an infinite
+-     loop, since all characters <= 0xff.  */
+-  for (this_char = range_start; this_char <= range_end; this_char++)
+-    {
+-      SET_LIST_BIT (TRANSLATE (this_char));
+-    }
+-  
+-  return REG_NOERROR;
+-}
+-
+-/* Failure stack declarations and macros; both re_compile_fastmap and
+-   re_match_2 use a failure stack.  These have to be macros because of
+-   REGEX_ALLOCATE.  */
+-   
+-
+-/* Number of failure points for which to initially allocate space
+-   when matching.  If this number is exceeded, we allocate more
+-   space, so it is not a hard limit.  */
+-#ifndef INIT_FAILURE_ALLOC
+-#define INIT_FAILURE_ALLOC 5
+-#endif
+-
+-/* Roughly the maximum number of failure points on the stack.  Would be
+-   exactly that if always used MAX_FAILURE_SPACE each time we failed.
+-   This is a variable only so users of regex can assign to it; we never
+-   change it ourselves.  */
+-int re_max_failures = 2000;
+-
+-typedef const unsigned char *fail_stack_elt_t;
+-
+-typedef struct
+-{
+-  fail_stack_elt_t *stack;
+-  unsigned size;
+-  unsigned avail;			/* Offset of next open position.  */
+-} fail_stack_type;
+-
+-#define FAIL_STACK_EMPTY()     (fail_stack.avail == 0)
+-#define FAIL_STACK_PTR_EMPTY() (fail_stack_ptr->avail == 0)
+-#define FAIL_STACK_FULL()      (fail_stack.avail == fail_stack.size)
+-#define FAIL_STACK_TOP()       (fail_stack.stack[fail_stack.avail])
+-
+-
+-/* Initialize `fail_stack'.  Do `return -2' if the alloc fails.  */
+-
+-#define INIT_FAIL_STACK()						\
+-  do {									\
+-    fail_stack.stack = (fail_stack_elt_t *)				\
+-      REGEX_ALLOCATE (INIT_FAILURE_ALLOC * sizeof (fail_stack_elt_t));	\
+-									\
+-    if (fail_stack.stack == NULL)					\
+-      return -2;							\
+-									\
+-    fail_stack.size = INIT_FAILURE_ALLOC;				\
+-    fail_stack.avail = 0;						\
+-  } while (0)
+-
+-
+-/* Double the size of FAIL_STACK, up to approximately `re_max_failures' items.
+-
+-   Return 1 if succeeds, and 0 if either ran out of memory
+-   allocating space for it or it was already too large.  
+-   
+-   REGEX_REALLOCATE requires `destination' be declared.   */
+-
+-#define DOUBLE_FAIL_STACK(fail_stack)					\
+-  ((fail_stack).size > re_max_failures * MAX_FAILURE_ITEMS		\
+-   ? 0									\
+-   : ((fail_stack).stack = (fail_stack_elt_t *)				\
+-        REGEX_REALLOCATE ((fail_stack).stack, 				\
+-          (fail_stack).size * sizeof (fail_stack_elt_t),		\
+-          ((fail_stack).size << 1) * sizeof (fail_stack_elt_t)),	\
+-									\
+-      (fail_stack).stack == NULL					\
+-      ? 0								\
+-      : ((fail_stack).size <<= 1, 					\
+-         1)))
+-
+-
+-/* Push PATTERN_OP on FAIL_STACK. 
+-
+-   Return 1 if was able to do so and 0 if ran out of memory allocating
+-   space to do so.  */
+-#define PUSH_PATTERN_OP(pattern_op, fail_stack)				\
+-  ((FAIL_STACK_FULL ()							\
+-    && !DOUBLE_FAIL_STACK (fail_stack))					\
+-    ? 0									\
+-    : ((fail_stack).stack[(fail_stack).avail++] = pattern_op,		\
+-       1))
+-
+-/* This pushes an item onto the failure stack.  Must be a four-byte
+-   value.  Assumes the variable `fail_stack'.  Probably should only
+-   be called from within `PUSH_FAILURE_POINT'.  */
+-#define PUSH_FAILURE_ITEM(item)						\
+-  fail_stack.stack[fail_stack.avail++] = (fail_stack_elt_t) item
+-
+-/* The complement operation.  Assumes `fail_stack' is nonempty.  */
+-#define POP_FAILURE_ITEM() fail_stack.stack[--fail_stack.avail]
+-
+-/* Used to omit pushing failure point id's when we're not debugging.  */
+-#ifdef DEBUG
+-#define DEBUG_PUSH PUSH_FAILURE_ITEM
+-#define DEBUG_POP(item_addr) *(item_addr) = POP_FAILURE_ITEM ()
+-#else
+-#define DEBUG_PUSH(item)
+-#define DEBUG_POP(item_addr)
+-#endif
+-
+-
+-/* Push the information about the state we will need
+-   if we ever fail back to it.  
+-   
+-   Requires variables fail_stack, regstart, regend, reg_info, and
+-   num_regs be declared.  DOUBLE_FAIL_STACK requires `destination' be
+-   declared.
+-   
+-   Does `return FAILURE_CODE' if runs out of memory.  */
+-
+-#define PUSH_FAILURE_POINT(pattern_place, string_place, failure_code)	\
+-  do {									\
+-    char *destination;							\
+-    /* Must be int, so when we don't save any registers, the arithmetic	\
+-       of 0 + -1 isn't done as unsigned.  */				\
+-    int this_reg;							\
+-    									\
+-    DEBUG_STATEMENT (failure_id++);					\
+-    DEBUG_STATEMENT (nfailure_points_pushed++);				\
+-    DEBUG_PRINT2 ("\nPUSH_FAILURE_POINT #%u:\n", failure_id);		\
+-    DEBUG_PRINT2 ("  Before push, next avail: %d\n", (fail_stack).avail);\
+-    DEBUG_PRINT2 ("                     size: %d\n", (fail_stack).size);\
+-									\
+-    DEBUG_PRINT2 ("  slots needed: %d\n", NUM_FAILURE_ITEMS);		\
+-    DEBUG_PRINT2 ("     available: %d\n", REMAINING_AVAIL_SLOTS);	\
+-									\
+-    /* Ensure we have enough space allocated for what we will push.  */	\
+-    while (REMAINING_AVAIL_SLOTS < NUM_FAILURE_ITEMS)			\
+-      {									\
+-        if (!DOUBLE_FAIL_STACK (fail_stack))			\
+-          return failure_code;						\
+-									\
+-        DEBUG_PRINT2 ("\n  Doubled stack; size now: %d\n",		\
+-		       (fail_stack).size);				\
+-        DEBUG_PRINT2 ("  slots available: %d\n", REMAINING_AVAIL_SLOTS);\
+-      }									\
+-									\
+-    /* Push the info, starting with the registers.  */			\
+-    DEBUG_PRINT1 ("\n");						\
+-									\
+-    for (this_reg = lowest_active_reg; this_reg <= highest_active_reg;	\
+-         this_reg++)							\
+-      {									\
+-	DEBUG_PRINT2 ("  Pushing reg: %d\n", this_reg);			\
+-        DEBUG_STATEMENT (num_regs_pushed++);				\
+-									\
+-	DEBUG_PRINT2 ("    start: 0x%x\n", regstart[this_reg]);		\
+-        PUSH_FAILURE_ITEM (regstart[this_reg]);				\
+-                                                                        \
+-	DEBUG_PRINT2 ("    end: 0x%x\n", regend[this_reg]);		\
+-        PUSH_FAILURE_ITEM (regend[this_reg]);				\
+-									\
+-	DEBUG_PRINT2 ("    info: 0x%x\n      ", reg_info[this_reg]);	\
+-        DEBUG_PRINT2 (" match_null=%d",					\
+-                      REG_MATCH_NULL_STRING_P (reg_info[this_reg]));	\
+-        DEBUG_PRINT2 (" active=%d", IS_ACTIVE (reg_info[this_reg]));	\
+-        DEBUG_PRINT2 (" matched_something=%d",				\
+-                      MATCHED_SOMETHING (reg_info[this_reg]));		\
+-        DEBUG_PRINT2 (" ever_matched=%d",				\
+-                      EVER_MATCHED_SOMETHING (reg_info[this_reg]));	\
+-	DEBUG_PRINT1 ("\n");						\
+-        PUSH_FAILURE_ITEM (reg_info[this_reg].word);			\
+-      }									\
+-									\
+-    DEBUG_PRINT2 ("  Pushing  low active reg: %d\n", lowest_active_reg);\
+-    PUSH_FAILURE_ITEM (lowest_active_reg);				\
+-									\
+-    DEBUG_PRINT2 ("  Pushing high active reg: %d\n", highest_active_reg);\
+-    PUSH_FAILURE_ITEM (highest_active_reg);				\
+-									\
+-    DEBUG_PRINT2 ("  Pushing pattern 0x%x: ", pattern_place);		\
+-    DEBUG_PRINT_COMPILED_PATTERN (bufp, pattern_place, pend);		\
+-    PUSH_FAILURE_ITEM (pattern_place);					\
+-									\
+-    DEBUG_PRINT2 ("  Pushing string 0x%x: `", string_place);		\
+-    DEBUG_PRINT_DOUBLE_STRING (string_place, string1, size1, string2,   \
+-				 size2);				\
+-    DEBUG_PRINT1 ("'\n");						\
+-    PUSH_FAILURE_ITEM (string_place);					\
+-									\
+-    DEBUG_PRINT2 ("  Pushing failure id: %u\n", failure_id);		\
+-    DEBUG_PUSH (failure_id);						\
+-  } while (0)
+-
+-/* This is the number of items that are pushed and popped on the stack
+-   for each register.  */
+-#define NUM_REG_ITEMS  3
+-
+-/* Individual items aside from the registers.  */
+-#ifdef DEBUG
+-#define NUM_NONREG_ITEMS 5 /* Includes failure point id.  */
+-#else
+-#define NUM_NONREG_ITEMS 4
+-#endif
+-
+-/* We push at most this many items on the stack.  */
+-#define MAX_FAILURE_ITEMS ((num_regs - 1) * NUM_REG_ITEMS + NUM_NONREG_ITEMS)
+-
+-/* We actually push this many items.  */
+-#define NUM_FAILURE_ITEMS						\
+-  ((highest_active_reg - lowest_active_reg + 1) * NUM_REG_ITEMS 	\
+-    + NUM_NONREG_ITEMS)
+-
+-/* How many items can still be added to the stack without overflowing it.  */
+-#define REMAINING_AVAIL_SLOTS ((fail_stack).size - (fail_stack).avail)
+-
+-
+-/* Pops what PUSH_FAIL_STACK pushes.
+-
+-   We restore into the parameters, all of which should be lvalues:
+-     STR -- the saved data position.
+-     PAT -- the saved pattern position.
+-     LOW_REG, HIGH_REG -- the highest and lowest active registers.
+-     REGSTART, REGEND -- arrays of string positions.
+-     REG_INFO -- array of information about each subexpression.
+-   
+-   Also assumes the variables `fail_stack' and (if debugging), `bufp',
+-   `pend', `string1', `size1', `string2', and `size2'.  */
+-
+-#define POP_FAILURE_POINT(str, pat, low_reg, high_reg, regstart, regend, reg_info)\
+-{									\
+-  DEBUG_STATEMENT (fail_stack_elt_t failure_id;)			\
+-  int this_reg;								\
+-  const unsigned char *string_temp;					\
+-									\
+-  assert (!FAIL_STACK_EMPTY ());					\
+-									\
+-  /* Remove failure points and point to how many regs pushed.  */	\
+-  DEBUG_PRINT1 ("POP_FAILURE_POINT:\n");				\
+-  DEBUG_PRINT2 ("  Before pop, next avail: %d\n", fail_stack.avail);	\
+-  DEBUG_PRINT2 ("                    size: %d\n", fail_stack.size);	\
+-									\
+-  assert (fail_stack.avail >= NUM_NONREG_ITEMS);			\
+-									\
+-  DEBUG_POP (&failure_id);						\
+-  DEBUG_PRINT2 ("  Popping failure id: %u\n", failure_id);		\
+-									\
+-  /* If the saved string location is NULL, it came from an		\
+-     on_failure_keep_string_jump opcode, and we want to throw away the	\
+-     saved NULL, thus retaining our current position in the string.  */	\
+-  string_temp = POP_FAILURE_ITEM ();					\
+-  if (string_temp != NULL)						\
+-    str = (const char *) string_temp;					\
+-									\
+-  DEBUG_PRINT2 ("  Popping string 0x%x: `", str);			\
+-  DEBUG_PRINT_DOUBLE_STRING (str, string1, size1, string2, size2);	\
+-  DEBUG_PRINT1 ("'\n");							\
+-									\
+-  pat = (unsigned char *) POP_FAILURE_ITEM ();				\
+-  DEBUG_PRINT2 ("  Popping pattern 0x%x: ", pat);			\
+-  DEBUG_PRINT_COMPILED_PATTERN (bufp, pat, pend);			\
+-									\
+-  /* Restore register info.  */						\
+-  high_reg = (unsigned) POP_FAILURE_ITEM ();				\
+-  DEBUG_PRINT2 ("  Popping high active reg: %d\n", high_reg);		\
+-									\
+-  low_reg = (unsigned) POP_FAILURE_ITEM ();				\
+-  DEBUG_PRINT2 ("  Popping  low active reg: %d\n", low_reg);		\
+-									\
+-  for (this_reg = high_reg; this_reg >= low_reg; this_reg--)		\
+-    {									\
+-      DEBUG_PRINT2 ("    Popping reg: %d\n", this_reg);			\
+-									\
+-      reg_info[this_reg].word = POP_FAILURE_ITEM ();			\
+-      DEBUG_PRINT2 ("      info: 0x%x\n", reg_info[this_reg]);		\
+-									\
+-      regend[this_reg] = (const char *) POP_FAILURE_ITEM ();		\
+-      DEBUG_PRINT2 ("      end: 0x%x\n", regend[this_reg]);		\
+-									\
+-      regstart[this_reg] = (const char *) POP_FAILURE_ITEM ();		\
+-      DEBUG_PRINT2 ("      start: 0x%x\n", regstart[this_reg]);		\
+-    }									\
+-									\
+-  DEBUG_STATEMENT (nfailure_points_popped++);				\
+-} /* POP_FAILURE_POINT */
+-
+-/* re_compile_fastmap computes a ``fastmap'' for the compiled pattern in
+-   BUFP.  A fastmap records which of the (1 << BYTEWIDTH) possible
+-   characters can start a string that matches the pattern.  This fastmap
+-   is used by re_search to skip quickly over impossible starting points.
+-
+-   The caller must supply the address of a (1 << BYTEWIDTH)-byte data
+-   area as BUFP->fastmap.
+-   
+-   We set the `fastmap', `fastmap_accurate', and `can_be_null' fields in
+-   the pattern buffer.
+-
+-   Returns 0 if we succeed, -2 if an internal error.   */
+-
+-int
+-re_compile_fastmap (bufp)
+-     struct re_pattern_buffer *bufp;
+-{
+-  int j, k;
+-  fail_stack_type fail_stack;
+-#ifndef REGEX_MALLOC
+-  char *destination;
+-#endif
+-  /* We don't push any register information onto the failure stack.  */
+-  unsigned num_regs = 0;
+-  
+-  register char *fastmap = bufp->fastmap;
+-  unsigned char *pattern = bufp->buffer;
+-  unsigned long size = bufp->used;
+-  const unsigned char *p = pattern;
+-  register unsigned char *pend = pattern + size;
+-
+-  /* Assume that each path through the pattern can be null until
+-     proven otherwise.  We set this false at the bottom of switch
+-     statement, to which we get only if a particular path doesn't
+-     match the empty string.  */
+-  boolean path_can_be_null = true;
+-
+-  /* We aren't doing a `succeed_n' to begin with.  */
+-  boolean succeed_n_p = false;
+-
+-  assert (fastmap != NULL && p != NULL);
+-  
+-  INIT_FAIL_STACK ();
+-  bzero (fastmap, 1 << BYTEWIDTH);  /* Assume nothing's valid.  */
+-  bufp->fastmap_accurate = 1;	    /* It will be when we're done.  */
+-  bufp->can_be_null = 0;
+-      
+-  while (p != pend || !FAIL_STACK_EMPTY ())
+-    {
+-      if (p == pend)
+-        {
+-          bufp->can_be_null |= path_can_be_null;
+-          
+-          /* Reset for next path.  */
+-          path_can_be_null = true;
+-          
+-          p = fail_stack.stack[--fail_stack.avail];
+-	}
+-
+-      /* We should never be about to go beyond the end of the pattern.  */
+-      assert (p < pend);
+-      
+-#ifdef SWITCH_ENUM_BUG
+-      switch ((int) ((re_opcode_t) *p++))
+-#else
+-      switch ((re_opcode_t) *p++)
+-#endif
+-	{
+-
+-        /* I guess the idea here is to simply not bother with a fastmap
+-           if a backreference is used, since it's too hard to figure out
+-           the fastmap for the corresponding group.  Setting
+-           `can_be_null' stops `re_search_2' from using the fastmap, so
+-           that is all we do.  */
+-	case duplicate:
+-	  bufp->can_be_null = 1;
+-          return 0;
+-
+-
+-      /* Following are the cases which match a character.  These end
+-         with `break'.  */
+-
+-	case exactn:
+-          fastmap[p[1]] = 1;
+-	  break;
+-
+-
+-        case charset:
+-          for (j = *p++ * BYTEWIDTH - 1; j >= 0; j--)
+-	    if (p[j / BYTEWIDTH] & (1 << (j % BYTEWIDTH)))
+-              fastmap[j] = 1;
+-	  break;
+-
+-
+-	case charset_not:
+-	  /* Chars beyond end of map must be allowed.  */
+-	  for (j = *p * BYTEWIDTH; j < (1 << BYTEWIDTH); j++)
+-            fastmap[j] = 1;
+-
+-	  for (j = *p++ * BYTEWIDTH - 1; j >= 0; j--)
+-	    if (!(p[j / BYTEWIDTH] & (1 << (j % BYTEWIDTH))))
+-              fastmap[j] = 1;
+-          break;
+-
+-
+-	case wordchar:
+-	  for (j = 0; j < (1 << BYTEWIDTH); j++)
+-	    if (SYNTAX (j) == Sword)
+-	      fastmap[j] = 1;
+-	  break;
+-
+-
+-	case notwordchar:
+-	  for (j = 0; j < (1 << BYTEWIDTH); j++)
+-	    if (SYNTAX (j) != Sword)
+-	      fastmap[j] = 1;
+-	  break;
+-
+-
+-        case anychar:
+-          /* `.' matches anything ...  */
+-	  for (j = 0; j < (1 << BYTEWIDTH); j++)
+-            fastmap[j] = 1;
+-
+-          /* ... except perhaps newline.  */
+-          if (!(bufp->syntax & RE_DOT_NEWLINE))
+-            fastmap['\n'] = 0;
+-
+-          /* Return if we have already set `can_be_null'; if we have,
+-             then the fastmap is irrelevant.  Something's wrong here.  */
+-	  else if (bufp->can_be_null)
+-	    return 0;
+-
+-          /* Otherwise, have to check alternative paths.  */
+-	  break;
+-
+-
+-#ifdef emacs
+-        case syntaxspec:
+-	  k = *p++;
+-	  for (j = 0; j < (1 << BYTEWIDTH); j++)
+-	    if (SYNTAX (j) == (enum syntaxcode) k)
+-	      fastmap[j] = 1;
+-	  break;
+-
+-
+-	case notsyntaxspec:
+-	  k = *p++;
+-	  for (j = 0; j < (1 << BYTEWIDTH); j++)
+-	    if (SYNTAX (j) != (enum syntaxcode) k)
+-	      fastmap[j] = 1;
+-	  break;
+-
+-
+-      /* All cases after this match the empty string.  These end with
+-         `continue'.  */
+-
+-
+-	case before_dot:
+-	case at_dot:
+-	case after_dot:
+-          continue;
+-#endif /* not emacs */
+-
+-
+-        case no_op:
+-        case begline:
+-        case endline:
+-	case begbuf:
+-	case endbuf:
+-	case wordbound:
+-	case notwordbound:
+-	case wordbeg:
+-	case wordend:
+-        case push_dummy_failure:
+-          continue;
+-
+-
+-	case jump_n:
+-        case pop_failure_jump:
+-	case maybe_pop_jump:
+-	case jump:
+-        case jump_past_alt:
+-	case dummy_failure_jump:
+-          EXTRACT_NUMBER_AND_INCR (j, p);
+-	  p += j;	
+-	  if (j > 0)
+-	    continue;
+-            
+-          /* Jump backward implies we just went through the body of a
+-             loop and matched nothing.  Opcode jumped to should be
+-             `on_failure_jump' or `succeed_n'.  Just treat it like an
+-             ordinary jump.  For a * loop, it has pushed its failure
+-             point already; if so, discard that as redundant.  */
+-          if ((re_opcode_t) *p != on_failure_jump
+-	      && (re_opcode_t) *p != succeed_n)
+-	    continue;
+-
+-          p++;
+-          EXTRACT_NUMBER_AND_INCR (j, p);
+-          p += j;		
+-	  
+-          /* If what's on the stack is where we are now, pop it.  */
+-          if (!FAIL_STACK_EMPTY () 
+-	      && fail_stack.stack[fail_stack.avail - 1] == p)
+-            fail_stack.avail--;
+-
+-          continue;
+-
+-
+-        case on_failure_jump:
+-        case on_failure_keep_string_jump:
+-	handle_on_failure_jump:
+-          EXTRACT_NUMBER_AND_INCR (j, p);
+-
+-          /* For some patterns, e.g., `(a?)?', `p+j' here points to the
+-             end of the pattern.  We don't want to push such a point,
+-             since when we restore it above, entering the switch will
+-             increment `p' past the end of the pattern.  We don't need
+-             to push such a point since we obviously won't find any more
+-             fastmap entries beyond `pend'.  Such a pattern can match
+-             the null string, though.  */
+-          if (p + j < pend)
+-            {
+-              if (!PUSH_PATTERN_OP (p + j, fail_stack))
+-                return -2;
+-            }
+-          else
+-            bufp->can_be_null = 1;
+-
+-          if (succeed_n_p)
+-            {
+-              EXTRACT_NUMBER_AND_INCR (k, p);	/* Skip the n.  */
+-              succeed_n_p = false;
+-	    }
+-
+-          continue;
+-
+-
+-	case succeed_n:
+-          /* Get to the number of times to succeed.  */
+-          p += 2;		
+-
+-          /* Increment p past the n for when k != 0.  */
+-          EXTRACT_NUMBER_AND_INCR (k, p);
+-          if (k == 0)
+-	    {
+-              p -= 4;
+-  	      succeed_n_p = true;  /* Spaghetti code alert.  */
+-              goto handle_on_failure_jump;
+-            }
+-          continue;
+-
+-
+-	case set_number_at:
+-          p += 4;
+-          continue;
+-
+-
+-	case start_memory:
+-        case stop_memory:
+-	  p += 2;
+-	  continue;
+-
+-
+-	default:
+-          abort (); /* We have listed all the cases.  */
+-        } /* switch *p++ */
+-
+-      /* Getting here means we have found the possible starting
+-         characters for one path of the pattern -- and that the empty
+-         string does not match.  We need not follow this path further.
+-         Instead, look at the next alternative (remembered on the
+-         stack), or quit if no more.  The test at the top of the loop
+-         does these things.  */
+-      path_can_be_null = false;
+-      p = pend;
+-    } /* while p */
+-
+-  /* Set `can_be_null' for the last path (also the first path, if the
+-     pattern is empty).  */
+-  bufp->can_be_null |= path_can_be_null;
+-  return 0;
+-} /* re_compile_fastmap */
+-
+-/* Set REGS to hold NUM_REGS registers, storing them in STARTS and
+-   ENDS.  Subsequent matches using PATTERN_BUFFER and REGS will use
+-   this memory for recording register information.  STARTS and ENDS
+-   must be allocated using the malloc library routine, and must each
+-   be at least NUM_REGS * sizeof (regoff_t) bytes long.
+-
+-   If NUM_REGS == 0, then subsequent matches should allocate their own
+-   register data.
+-
+-   Unless this function is called, the first search or match using
+-   PATTERN_BUFFER will allocate its own register data, without
+-   freeing the old data.  */
+-
+-void
+-re_set_registers (bufp, regs, num_regs, starts, ends)
+-    struct re_pattern_buffer *bufp;
+-    struct re_registers *regs;
+-    unsigned num_regs;
+-    regoff_t *starts, *ends;
+-{
+-  if (num_regs)
+-    {
+-      bufp->regs_allocated = REGS_REALLOCATE;
+-      regs->num_regs = num_regs;
+-      regs->start = starts;
+-      regs->end = ends;
+-    }
+-  else
+-    {
+-      bufp->regs_allocated = REGS_UNALLOCATED;
+-      regs->num_regs = 0;
+-      regs->start = regs->end = (regoff_t) 0;
+-    }
+-}
+-
+-/* Searching routines.  */
+-
+-/* Like re_search_2, below, but only one string is specified, and
+-   doesn't let you say where to stop matching. */
+-
+-int
+-re_search (bufp, string, size, startpos, range, regs)
+-     struct re_pattern_buffer *bufp;
+-     const char *string;
+-     int size, startpos, range;
+-     struct re_registers *regs;
+-{
+-  return re_search_2 (bufp, NULL, 0, string, size, startpos, range, 
+-		      regs, size);
+-}
+-
+-
+-/* Using the compiled pattern in BUFP->buffer, first tries to match the
+-   virtual concatenation of STRING1 and STRING2, starting first at index
+-   STARTPOS, then at STARTPOS + 1, and so on.
+-   
+-   STRING1 and STRING2 have length SIZE1 and SIZE2, respectively.
+-   
+-   RANGE is how far to scan while trying to match.  RANGE = 0 means try
+-   only at STARTPOS; in general, the last start tried is STARTPOS +
+-   RANGE.
+-   
+-   In REGS, return the indices of the virtual concatenation of STRING1
+-   and STRING2 that matched the entire BUFP->buffer and its contained
+-   subexpressions.
+-   
+-   Do not consider matching one past the index STOP in the virtual
+-   concatenation of STRING1 and STRING2.
+-
+-   We return either the position in the strings at which the match was
+-   found, -1 if no match, or -2 if error (such as failure
+-   stack overflow).  */
+-
+-int
+-re_search_2 (bufp, string1, size1, string2, size2, startpos, range, regs, stop)
+-     struct re_pattern_buffer *bufp;
+-     const char *string1, *string2;
+-     int size1, size2;
+-     int startpos;
+-     int range;
+-     struct re_registers *regs;
+-     int stop;
+-{
+-  int val;
+-  register char *fastmap = bufp->fastmap;
+-  register char *translate = bufp->translate;
+-  int total_size = size1 + size2;
+-  int endpos = startpos + range;
+-
+-  /* Check for out-of-range STARTPOS.  */
+-  if (startpos < 0 || startpos > total_size)
+-    return -1;
+-    
+-  /* Fix up RANGE if it might eventually take us outside
+-     the virtual concatenation of STRING1 and STRING2.  */
+-  if (endpos < -1)
+-    range = -1 - startpos;
+-  else if (endpos > total_size)
+-    range = total_size - startpos;
+-
+-  /* If the search isn't to be a backwards one, don't waste time in a
+-     search for a pattern that must be anchored.  */
+-  if (bufp->used > 0 && (re_opcode_t) bufp->buffer[0] == begbuf && range > 0)
+-    {
+-      if (startpos > 0)
+-	return -1;
+-      else
+-	range = 1;
+-    }
+-
+-  /* Update the fastmap now if not correct already.  */
+-  if (fastmap && !bufp->fastmap_accurate)
+-    if (re_compile_fastmap (bufp) == -2)
+-      return -2;
+-  
+-  /* Loop through the string, looking for a place to start matching.  */
+-  for (;;)
+-    { 
+-      /* If a fastmap is supplied, skip quickly over characters that
+-         cannot be the start of a match.  If the pattern can match the
+-         null string, however, we don't need to skip characters; we want
+-         the first null string.  */
+-      if (fastmap && startpos < total_size && !bufp->can_be_null)
+-	{
+-	  if (range > 0)	/* Searching forwards.  */
+-	    {
+-	      register const char *d;
+-	      register int lim = 0;
+-	      int irange = range;
+-
+-              if (startpos < size1 && startpos + range >= size1)
+-                lim = range - (size1 - startpos);
+-
+-	      d = (startpos >= size1 ? string2 - size1 : string1) + startpos;
+-   
+-              /* Written out as an if-else to avoid testing `translate'
+-                 inside the loop.  */
+-	      if (translate)
+-                while (range > lim
+-                       && !fastmap[(unsigned char)
+-				   translate[(unsigned char) *d++]])
+-                  range--;
+-	      else
+-                while (range > lim && !fastmap[(unsigned char) *d++])
+-                  range--;
+-
+-	      startpos += irange - range;
+-	    }
+-	  else				/* Searching backwards.  */
+-	    {
+-	      register char c = (size1 == 0 || startpos >= size1
+-                                 ? string2[startpos - size1] 
+-                                 : string1[startpos]);
+-
+-	      if (!fastmap[(unsigned char) TRANSLATE (c)])
+-		goto advance;
+-	    }
+-	}
+-
+-      /* If can't match the null string, and that's all we have left, fail.  */
+-      if (range >= 0 && startpos == total_size && fastmap
+-          && !bufp->can_be_null)
+-	return -1;
+-
+-      val = re_match_2 (bufp, string1, size1, string2, size2,
+-	                startpos, regs, stop);
+-      if (val >= 0)
+-	return startpos;
+-        
+-      if (val == -2)
+-	return -2;
+-
+-    advance:
+-      if (!range) 
+-        break;
+-      else if (range > 0) 
+-        {
+-          range--; 
+-          startpos++;
+-        }
+-      else
+-        {
+-          range++; 
+-          startpos--;
+-        }
+-    }
+-  return -1;
+-} /* re_search_2 */
+-
+-/* Declarations and macros for re_match_2.  */
+-
+-static int bcmp_translate ();
+-static boolean alt_match_null_string_p (),
+-               common_op_match_null_string_p (),
+-               group_match_null_string_p ();
+-
+-/* Structure for per-register (a.k.a. per-group) information.
+-   This must not be longer than one word, because we push this value
+-   onto the failure stack.  Other register information, such as the
+-   starting and ending positions (which are addresses), and the list of
+-   inner groups (which is a bits list) are maintained in separate
+-   variables.  
+-   
+-   We are making a (strictly speaking) nonportable assumption here: that
+-   the compiler will pack our bit fields into something that fits into
+-   the type of `word', i.e., is something that fits into one item on the
+-   failure stack.  */
+-typedef union
+-{
+-  fail_stack_elt_t word;
+-  struct
+-  {
+-      /* This field is one if this group can match the empty string,
+-         zero if not.  If not yet determined,  `MATCH_NULL_UNSET_VALUE'.  */
+-#define MATCH_NULL_UNSET_VALUE 3
+-    unsigned match_null_string_p : 2;
+-    unsigned is_active : 1;
+-    unsigned matched_something : 1;
+-    unsigned ever_matched_something : 1;
+-  } bits;
+-} register_info_type;
+-
+-#define REG_MATCH_NULL_STRING_P(R)  ((R).bits.match_null_string_p)
+-#define IS_ACTIVE(R)  ((R).bits.is_active)
+-#define MATCHED_SOMETHING(R)  ((R).bits.matched_something)
+-#define EVER_MATCHED_SOMETHING(R)  ((R).bits.ever_matched_something)
+-
+-
+-/* Call this when have matched a real character; it sets `matched' flags
+-   for the subexpressions which we are currently inside.  Also records
+-   that those subexprs have matched.  */
+-#define SET_REGS_MATCHED()						\
+-  do									\
+-    {									\
+-      unsigned r;							\
+-      for (r = lowest_active_reg; r <= highest_active_reg; r++)		\
+-        {								\
+-          MATCHED_SOMETHING (reg_info[r])				\
+-            = EVER_MATCHED_SOMETHING (reg_info[r])			\
+-            = 1;							\
+-        }								\
+-    }									\
+-  while (0)
+-
+-
+-/* This converts PTR, a pointer into one of the search strings `string1'
+-   and `string2' into an offset from the beginning of that string.  */
+-#define POINTER_TO_OFFSET(ptr)						\
+-  (FIRST_STRING_P (ptr) ? (ptr) - string1 : (ptr) - string2 + size1)
+-
+-/* Registers are set to a sentinel when they haven't yet matched.  */
+-#define REG_UNSET_VALUE ((char *) -1)
+-#define REG_UNSET(e) ((e) == REG_UNSET_VALUE)
+-
+-
+-/* Macros for dealing with the split strings in re_match_2.  */
+-
+-#define MATCHING_IN_FIRST_STRING  (dend == end_match_1)
+-
+-/* Call before fetching a character with *d.  This switches over to
+-   string2 if necessary.  */
+-#define PREFETCH()							\
+-  while (d == dend)						    	\
+-    {									\
+-      /* End of string2 => fail.  */					\
+-      if (dend == end_match_2) 						\
+-        goto fail;							\
+-      /* End of string1 => advance to string2.  */ 			\
+-      d = string2;						        \
+-      dend = end_match_2;						\
+-    }
+-
+-
+-/* Test if at very beginning or at very end of the virtual concatenation
+-   of `string1' and `string2'.  If only one string, it's `string2'.  */
+-#define AT_STRINGS_BEG(d) ((d) == (size1 ? string1 : string2) || !size2)
+-#define AT_STRINGS_END(d) ((d) == end2)	
+-
+-
+-/* Test if D points to a character which is word-constituent.  We have
+-   two special cases to check for: if past the end of string1, look at
+-   the first character in string2; and if before the beginning of
+-   string2, look at the last character in string1.  */
+-#define WORDCHAR_P(d)							\
+-  (SYNTAX ((d) == end1 ? *string2					\
+-           : (d) == string2 - 1 ? *(end1 - 1) : *(d))			\
+-   == Sword)
+-
+-/* Test if the character before D and the one at D differ with respect
+-   to being word-constituent.  */
+-#define AT_WORD_BOUNDARY(d)						\
+-  (AT_STRINGS_BEG (d) || AT_STRINGS_END (d)				\
+-   || WORDCHAR_P (d - 1) != WORDCHAR_P (d))
+-
+-
+-/* Free everything we malloc.  */
+-#ifdef REGEX_MALLOC
+-#define FREE_VAR(var) if (var) free (var); var = NULL
+-#define FREE_VARIABLES()						\
+-  do {									\
+-    FREE_VAR (fail_stack.stack);					\
+-    FREE_VAR (regstart);						\
+-    FREE_VAR (regend);							\
+-    FREE_VAR (old_regstart);						\
+-    FREE_VAR (old_regend);						\
+-    FREE_VAR (best_regstart);						\
+-    FREE_VAR (best_regend);						\
+-    FREE_VAR (reg_info);						\
+-    FREE_VAR (reg_dummy);						\
+-    FREE_VAR (reg_info_dummy);						\
+-  } while (0)
+-#else /* not REGEX_MALLOC */
+-/* Some MIPS systems (at least) want this to free alloca'd storage.  */
+-#define FREE_VARIABLES() alloca (0)
+-#endif /* not REGEX_MALLOC */
+-
+-
+-/* These values must meet several constraints.  They must not be valid
+-   register values; since we have a limit of 255 registers (because
+-   we use only one byte in the pattern for the register number), we can
+-   use numbers larger than 255.  They must differ by 1, because of
+-   NUM_FAILURE_ITEMS above.  And the value for the lowest register must
+-   be larger than the value for the highest register, so we do not try
+-   to actually save any registers when none are active.  */
+-#define NO_HIGHEST_ACTIVE_REG (1 << BYTEWIDTH)
+-#define NO_LOWEST_ACTIVE_REG (NO_HIGHEST_ACTIVE_REG + 1)
+-
+-/* Matching routines.  */
+-
+-#ifndef emacs   /* Emacs never uses this.  */
+-/* re_match is like re_match_2 except it takes only a single string.  */
+-
+-int
+-re_match (bufp, string, size, pos, regs)
+-     struct re_pattern_buffer *bufp;
+-     const char *string;
+-     int size, pos;
+-     struct re_registers *regs;
+- {
+-  return re_match_2 (bufp, NULL, 0, string, size, pos, regs, size); 
+-}
+-#endif /* not emacs */
+-
+-
+-/* re_match_2 matches the compiled pattern in BUFP against the
+-   the (virtual) concatenation of STRING1 and STRING2 (of length SIZE1
+-   and SIZE2, respectively).  We start matching at POS, and stop
+-   matching at STOP.
+-   
+-   If REGS is non-null and the `no_sub' field of BUFP is nonzero, we
+-   store offsets for the substring each group matched in REGS.  See the
+-   documentation for exactly how many groups we fill.
+-
+-   We return -1 if no match, -2 if an internal error (such as the
+-   failure stack overflowing).  Otherwise, we return the length of the
+-   matched substring.  */
+-
+-int
+-re_match_2 (bufp, string1, size1, string2, size2, pos, regs, stop)
+-     struct re_pattern_buffer *bufp;
+-     const char *string1, *string2;
+-     int size1, size2;
+-     int pos;
+-     struct re_registers *regs;
+-     int stop;
+-{
+-  /* General temporaries.  */
+-  int mcnt;
+-  unsigned char *p1;
+-
+-  /* Just past the end of the corresponding string.  */
+-  const char *end1, *end2;
+-
+-  /* Pointers into string1 and string2, just past the last characters in
+-     each to consider matching.  */
+-  const char *end_match_1, *end_match_2;
+-
+-  /* Where we are in the data, and the end of the current string.  */
+-  const char *d, *dend;
+-  
+-  /* Where we are in the pattern, and the end of the pattern.  */
+-  unsigned char *p = bufp->buffer;
+-  register unsigned char *pend = p + bufp->used;
+-
+-  /* We use this to map every character in the string.  */
+-  char *translate = bufp->translate;
+-
+-  /* Failure point stack.  Each place that can handle a failure further
+-     down the line pushes a failure point on this stack.  It consists of
+-     restart, regend, and reg_info for all registers corresponding to
+-     the subexpressions we're currently inside, plus the number of such
+-     registers, and, finally, two char *'s.  The first char * is where
+-     to resume scanning the pattern; the second one is where to resume
+-     scanning the strings.  If the latter is zero, the failure point is
+-     a ``dummy''; if a failure happens and the failure point is a dummy,
+-     it gets discarded and the next next one is tried.  */
+-  fail_stack_type fail_stack;
+-#ifdef DEBUG
+-  static unsigned failure_id = 0;
+-  unsigned nfailure_points_pushed = 0, nfailure_points_popped = 0;
+-#endif
+-
+-  /* We fill all the registers internally, independent of what we
+-     return, for use in backreferences.  The number here includes
+-     an element for register zero.  */
+-  unsigned num_regs = bufp->re_nsub + 1;
+-  
+-  /* The currently active registers.  */
+-  unsigned lowest_active_reg = NO_LOWEST_ACTIVE_REG;
+-  unsigned highest_active_reg = NO_HIGHEST_ACTIVE_REG;
+-
+-  /* Information on the contents of registers. These are pointers into
+-     the input strings; they record just what was matched (on this
+-     attempt) by a subexpression part of the pattern, that is, the
+-     regnum-th regstart pointer points to where in the pattern we began
+-     matching and the regnum-th regend points to right after where we
+-     stopped matching the regnum-th subexpression.  (The zeroth register
+-     keeps track of what the whole pattern matches.)  */
+-  const char **regstart, **regend;
+-
+-  /* If a group that's operated upon by a repetition operator fails to
+-     match anything, then the register for its start will need to be
+-     restored because it will have been set to wherever in the string we
+-     are when we last see its open-group operator.  Similarly for a
+-     register's end.  */
+-  const char **old_regstart, **old_regend;
+-
+-  /* The is_active field of reg_info helps us keep track of which (possibly
+-     nested) subexpressions we are currently in. The matched_something
+-     field of reg_info[reg_num] helps us tell whether or not we have
+-     matched any of the pattern so far this time through the reg_num-th
+-     subexpression.  These two fields get reset each time through any
+-     loop their register is in.  */
+-  register_info_type *reg_info; 
+-
+-  /* The following record the register info as found in the above
+-     variables when we find a match better than any we've seen before. 
+-     This happens as we backtrack through the failure points, which in
+-     turn happens only if we have not yet matched the entire string. */
+-  unsigned best_regs_set = false;
+-  const char **best_regstart, **best_regend;
+-  
+-  /* Logically, this is `best_regend[0]'.  But we don't want to have to
+-     allocate space for that if we're not allocating space for anything
+-     else (see below).  Also, we never need info about register 0 for
+-     any of the other register vectors, and it seems rather a kludge to
+-     treat `best_regend' differently than the rest.  So we keep track of
+-     the end of the best match so far in a separate variable.  We
+-     initialize this to NULL so that when we backtrack the first time
+-     and need to test it, it's not garbage.  */
+-  const char *match_end = NULL;
+-
+-  /* Used when we pop values we don't care about.  */
+-  const char **reg_dummy;
+-  register_info_type *reg_info_dummy;
+-
+-#ifdef DEBUG
+-  /* Counts the total number of registers pushed.  */
+-  unsigned num_regs_pushed = 0; 	
+-#endif
+-
+-  DEBUG_PRINT1 ("\n\nEntering re_match_2.\n");
+-  
+-  INIT_FAIL_STACK ();
+-  
+-  /* Do not bother to initialize all the register variables if there are
+-     no groups in the pattern, as it takes a fair amount of time.  If
+-     there are groups, we include space for register 0 (the whole
+-     pattern), even though we never use it, since it simplifies the
+-     array indexing.  We should fix this.  */
+-  if (bufp->re_nsub)
+-    {
+-      regstart = REGEX_TALLOC (num_regs, const char *);
+-      regend = REGEX_TALLOC (num_regs, const char *);
+-      old_regstart = REGEX_TALLOC (num_regs, const char *);
+-      old_regend = REGEX_TALLOC (num_regs, const char *);
+-      best_regstart = REGEX_TALLOC (num_regs, const char *);
+-      best_regend = REGEX_TALLOC (num_regs, const char *);
+-      reg_info = REGEX_TALLOC (num_regs, register_info_type);
+-      reg_dummy = REGEX_TALLOC (num_regs, const char *);
+-      reg_info_dummy = REGEX_TALLOC (num_regs, register_info_type);
+-
+-      if (!(regstart && regend && old_regstart && old_regend && reg_info 
+-            && best_regstart && best_regend && reg_dummy && reg_info_dummy)) 
+-        {
+-          FREE_VARIABLES ();
+-          return -2;
+-        }
+-    }
+-#ifdef REGEX_MALLOC
+-  else
+-    {
+-      /* We must initialize all our variables to NULL, so that
+-         `FREE_VARIABLES' doesn't try to free them.  */
+-      regstart = regend = old_regstart = old_regend = best_regstart
+-        = best_regend = reg_dummy = NULL;
+-      reg_info = reg_info_dummy = (register_info_type *) NULL;
+-    }
+-#endif /* REGEX_MALLOC */
+-
+-  /* The starting position is bogus.  */
+-  if (pos < 0 || pos > size1 + size2)
+-    {
+-      FREE_VARIABLES ();
+-      return -1;
+-    }
+-    
+-  /* Initialize subexpression text positions to -1 to mark ones that no
+-     start_memory/stop_memory has been seen for. Also initialize the
+-     register information struct.  */
+-  for (mcnt = 1; mcnt < num_regs; mcnt++)
+-    {
+-      regstart[mcnt] = regend[mcnt] 
+-        = old_regstart[mcnt] = old_regend[mcnt] = REG_UNSET_VALUE;
+-        
+-      REG_MATCH_NULL_STRING_P (reg_info[mcnt]) = MATCH_NULL_UNSET_VALUE;
+-      IS_ACTIVE (reg_info[mcnt]) = 0;
+-      MATCHED_SOMETHING (reg_info[mcnt]) = 0;
+-      EVER_MATCHED_SOMETHING (reg_info[mcnt]) = 0;
+-    }
+-  
+-  /* We move `string1' into `string2' if the latter's empty -- but not if
+-     `string1' is null.  */
+-  if (size2 == 0 && string1 != NULL)
+-    {
+-      string2 = string1;
+-      size2 = size1;
+-      string1 = 0;
+-      size1 = 0;
+-    }
+-  end1 = string1 + size1;
+-  end2 = string2 + size2;
+-
+-  /* Compute where to stop matching, within the two strings.  */
+-  if (stop <= size1)
+-    {
+-      end_match_1 = string1 + stop;
+-      end_match_2 = string2;
+-    }
+-  else
+-    {
+-      end_match_1 = end1;
+-      end_match_2 = string2 + stop - size1;
+-    }
+-
+-  /* `p' scans through the pattern as `d' scans through the data. 
+-     `dend' is the end of the input string that `d' points within.  `d'
+-     is advanced into the following input string whenever necessary, but
+-     this happens before fetching; therefore, at the beginning of the
+-     loop, `d' can be pointing at the end of a string, but it cannot
+-     equal `string2'.  */
+-  if (size1 > 0 && pos <= size1)
+-    {
+-      d = string1 + pos;
+-      dend = end_match_1;
+-    }
+-  else
+-    {
+-      d = string2 + pos - size1;
+-      dend = end_match_2;
+-    }
+-
+-  DEBUG_PRINT1 ("The compiled pattern is: ");
+-  DEBUG_PRINT_COMPILED_PATTERN (bufp, p, pend);
+-  DEBUG_PRINT1 ("The string to match is: `");
+-  DEBUG_PRINT_DOUBLE_STRING (d, string1, size1, string2, size2);
+-  DEBUG_PRINT1 ("'\n");
+-  
+-  /* This loops over pattern commands.  It exits by returning from the
+-     function if the match is complete, or it drops through if the match
+-     fails at this starting point in the input data.  */
+-  for (;;)
+-    {
+-      DEBUG_PRINT2 ("\n0x%x: ", p);
+-
+-      if (p == pend)
+-	{ /* End of pattern means we might have succeeded.  */
+-          DEBUG_PRINT1 ("end of pattern ... ");
+-          
+-	  /* If we haven't matched the entire string, and we want the
+-             longest match, try backtracking.  */
+-          if (d != end_match_2)
+-	    {
+-              DEBUG_PRINT1 ("backtracking.\n");
+-              
+-              if (!FAIL_STACK_EMPTY ())
+-                { /* More failure points to try.  */
+-                  boolean same_str_p = (FIRST_STRING_P (match_end) 
+-	        	                == MATCHING_IN_FIRST_STRING);
+-
+-                  /* If exceeds best match so far, save it.  */
+-                  if (!best_regs_set
+-                      || (same_str_p && d > match_end)
+-                      || (!same_str_p && !MATCHING_IN_FIRST_STRING))
+-                    {
+-                      best_regs_set = true;
+-                      match_end = d;
+-                      
+-                      DEBUG_PRINT1 ("\nSAVING match as best so far.\n");
+-                      
+-                      for (mcnt = 1; mcnt < num_regs; mcnt++)
+-                        {
+-                          best_regstart[mcnt] = regstart[mcnt];
+-                          best_regend[mcnt] = regend[mcnt];
+-                        }
+-                    }
+-                  goto fail;	       
+-                }
+-
+-              /* If no failure points, don't restore garbage.  */
+-              else if (best_regs_set)   
+-                {
+-  	        restore_best_regs:
+-                  /* Restore best match.  It may happen that `dend ==
+-                     end_match_1' while the restored d is in string2.
+-                     For example, the pattern `x.*y.*z' against the
+-                     strings `x-' and `y-z-', if the two strings are
+-                     not consecutive in memory.  */
+-                  DEBUG_PRINT1 ("Restoring best registers.\n");
+-                  
+-                  d = match_end;
+-                  dend = ((d >= string1 && d <= end1)
+-		           ? end_match_1 : end_match_2);
+-
+-		  for (mcnt = 1; mcnt < num_regs; mcnt++)
+-		    {
+-		      regstart[mcnt] = best_regstart[mcnt];
+-		      regend[mcnt] = best_regend[mcnt];
+-		    }
+-                }
+-            } /* d != end_match_2 */
+-
+-          DEBUG_PRINT1 ("Accepting match.\n");
+-
+-          /* If caller wants register contents data back, do it.  */
+-          if (regs && !bufp->no_sub)
+-	    {
+-              /* Have the register data arrays been allocated?  */
+-              if (bufp->regs_allocated == REGS_UNALLOCATED)
+-                { /* No.  So allocate them with malloc.  We need one
+-                     extra element beyond `num_regs' for the `-1' marker
+-                     GNU code uses.  */
+-                  regs->num_regs = MAX (RE_NREGS, num_regs + 1);
+-                  regs->start = TALLOC (regs->num_regs, regoff_t);
+-                  regs->end = TALLOC (regs->num_regs, regoff_t);
+-                  if (regs->start == NULL || regs->end == NULL)
+-                    return -2;
+-                  bufp->regs_allocated = REGS_REALLOCATE;
+-                }
+-              else if (bufp->regs_allocated == REGS_REALLOCATE)
+-                { /* Yes.  If we need more elements than were already
+-                     allocated, reallocate them.  If we need fewer, just
+-                     leave it alone.  */
+-                  if (regs->num_regs < num_regs + 1)
+-                    {
+-                      regs->num_regs = num_regs + 1;
+-                      RETALLOC (regs->start, regs->num_regs, regoff_t);
+-                      RETALLOC (regs->end, regs->num_regs, regoff_t);
+-                      if (regs->start == NULL || regs->end == NULL)
+-                        return -2;
+-                    }
+-                }
+-              else
+-                assert (bufp->regs_allocated == REGS_FIXED);
+-
+-              /* Convert the pointer data in `regstart' and `regend' to
+-                 indices.  Register zero has to be set differently,
+-                 since we haven't kept track of any info for it.  */
+-              if (regs->num_regs > 0)
+-                {
+-                  regs->start[0] = pos;
+-                  regs->end[0] = (MATCHING_IN_FIRST_STRING ? d - string1
+-			          : d - string2 + size1);
+-                }
+-              
+-              /* Go through the first `min (num_regs, regs->num_regs)'
+-                 registers, since that is all we initialized.  */
+-	      for (mcnt = 1; mcnt < MIN (num_regs, regs->num_regs); mcnt++)
+-		{
+-                  if (REG_UNSET (regstart[mcnt]) || REG_UNSET (regend[mcnt]))
+-                    regs->start[mcnt] = regs->end[mcnt] = -1;
+-                  else
+-                    {
+-		      regs->start[mcnt] = POINTER_TO_OFFSET (regstart[mcnt]);
+-                      regs->end[mcnt] = POINTER_TO_OFFSET (regend[mcnt]);
+-                    }
+-		}
+-              
+-              /* If the regs structure we return has more elements than
+-                 were in the pattern, set the extra elements to -1.  If
+-                 we (re)allocated the registers, this is the case,
+-                 because we always allocate enough to have at least one
+-                 -1 at the end.  */
+-              for (mcnt = num_regs; mcnt < regs->num_regs; mcnt++)
+-                regs->start[mcnt] = regs->end[mcnt] = -1;
+-	    } /* regs && !bufp->no_sub */
+-
+-          FREE_VARIABLES ();
+-          DEBUG_PRINT4 ("%u failure points pushed, %u popped (%u remain).\n",
+-                        nfailure_points_pushed, nfailure_points_popped,
+-                        nfailure_points_pushed - nfailure_points_popped);
+-          DEBUG_PRINT2 ("%u registers pushed.\n", num_regs_pushed);
+-
+-          mcnt = d - pos - (MATCHING_IN_FIRST_STRING 
+-			    ? string1 
+-			    : string2 - size1);
+-
+-          DEBUG_PRINT2 ("Returning %d from re_match_2.\n", mcnt);
+-
+-          return mcnt;
+-        }
+-
+-      /* Otherwise match next pattern command.  */
+-#ifdef SWITCH_ENUM_BUG
+-      switch ((int) ((re_opcode_t) *p++))
+-#else
+-      switch ((re_opcode_t) *p++)
+-#endif
+-	{
+-        /* Ignore these.  Used to ignore the n of succeed_n's which
+-           currently have n == 0.  */
+-        case no_op:
+-          DEBUG_PRINT1 ("EXECUTING no_op.\n");
+-          break;
+-
+-
+-        /* Match the next n pattern characters exactly.  The following
+-           byte in the pattern defines n, and the n bytes after that
+-           are the characters to match.  */
+-	case exactn:
+-	  mcnt = *p++;
+-          DEBUG_PRINT2 ("EXECUTING exactn %d.\n", mcnt);
+-
+-          /* This is written out as an if-else so we don't waste time
+-             testing `translate' inside the loop.  */
+-          if (translate)
+-	    {
+-	      do
+-		{
+-		  PREFETCH ();
+-		  if (translate[(unsigned char) *d++] != (char) *p++)
+-                    goto fail;
+-		}
+-	      while (--mcnt);
+-	    }
+-	  else
+-	    {
+-	      do
+-		{
+-		  PREFETCH ();
+-		  if (*d++ != (char) *p++) goto fail;
+-		}
+-	      while (--mcnt);
+-	    }
+-	  SET_REGS_MATCHED ();
+-          break;
+-
+-
+-        /* Match any character except possibly a newline or a null.  */
+-	case anychar:
+-          DEBUG_PRINT1 ("EXECUTING anychar.\n");
+-
+-          PREFETCH ();
+-
+-          if ((!(bufp->syntax & RE_DOT_NEWLINE) && TRANSLATE (*d) == '\n')
+-              || (bufp->syntax & RE_DOT_NOT_NULL && TRANSLATE (*d) == '\000'))
+-	    goto fail;
+-
+-          SET_REGS_MATCHED ();
+-          DEBUG_PRINT2 ("  Matched `%d'.\n", *d);
+-          d++;
+-	  break;
+-
+-
+-	case charset:
+-	case charset_not:
+-	  {
+-	    register unsigned char c;
+-	    boolean not = (re_opcode_t) *(p - 1) == charset_not;
+-
+-            DEBUG_PRINT2 ("EXECUTING charset%s.\n", not ? "_not" : "");
+-
+-	    PREFETCH ();
+-	    c = TRANSLATE (*d); /* The character to match.  */
+-
+-            /* Cast to `unsigned' instead of `unsigned char' in case the
+-               bit list is a full 32 bytes long.  */
+-	    if (c < (unsigned) (*p * BYTEWIDTH)
+-		&& p[1 + c / BYTEWIDTH] & (1 << (c % BYTEWIDTH)))
+-	      not = !not;
+-
+-	    p += 1 + *p;
+-
+-	    if (!not) goto fail;
+-            
+-	    SET_REGS_MATCHED ();
+-            d++;
+-	    break;
+-	  }
+-
+-
+-        /* The beginning of a group is represented by start_memory.
+-           The arguments are the register number in the next byte, and the
+-           number of groups inner to this one in the next.  The text
+-           matched within the group is recorded (in the internal
+-           registers data structure) under the register number.  */
+-        case start_memory:
+-	  DEBUG_PRINT3 ("EXECUTING start_memory %d (%d):\n", *p, p[1]);
+-
+-          /* Find out if this group can match the empty string.  */
+-	  p1 = p;		/* To send to group_match_null_string_p.  */
+-          
+-          if (REG_MATCH_NULL_STRING_P (reg_info[*p]) == MATCH_NULL_UNSET_VALUE)
+-            REG_MATCH_NULL_STRING_P (reg_info[*p]) 
+-              = group_match_null_string_p (&p1, pend, reg_info);
+-
+-          /* Save the position in the string where we were the last time
+-             we were at this open-group operator in case the group is
+-             operated upon by a repetition operator, e.g., with `(a*)*b'
+-             against `ab'; then we want to ignore where we are now in
+-             the string in case this attempt to match fails.  */
+-          old_regstart[*p] = REG_MATCH_NULL_STRING_P (reg_info[*p])
+-                             ? REG_UNSET (regstart[*p]) ? d : regstart[*p]
+-                             : regstart[*p];
+-	  DEBUG_PRINT2 ("  old_regstart: %d\n", 
+-			 POINTER_TO_OFFSET (old_regstart[*p]));
+-
+-          regstart[*p] = d;
+-	  DEBUG_PRINT2 ("  regstart: %d\n", POINTER_TO_OFFSET (regstart[*p]));
+-
+-          IS_ACTIVE (reg_info[*p]) = 1;
+-          MATCHED_SOMETHING (reg_info[*p]) = 0;
+-          
+-          /* This is the new highest active register.  */
+-          highest_active_reg = *p;
+-          
+-          /* If nothing was active before, this is the new lowest active
+-             register.  */
+-          if (lowest_active_reg == NO_LOWEST_ACTIVE_REG)
+-            lowest_active_reg = *p;
+-
+-          /* Move past the register number and inner group count.  */
+-          p += 2;
+-          break;
+-
+-
+-        /* The stop_memory opcode represents the end of a group.  Its
+-           arguments are the same as start_memory's: the register
+-           number, and the number of inner groups.  */
+-	case stop_memory:
+-	  DEBUG_PRINT3 ("EXECUTING stop_memory %d (%d):\n", *p, p[1]);
+-             
+-          /* We need to save the string position the last time we were at
+-             this close-group operator in case the group is operated
+-             upon by a repetition operator, e.g., with `((a*)*(b*)*)*'
+-             against `aba'; then we want to ignore where we are now in
+-             the string in case this attempt to match fails.  */
+-          old_regend[*p] = REG_MATCH_NULL_STRING_P (reg_info[*p])
+-                           ? REG_UNSET (regend[*p]) ? d : regend[*p]
+-			   : regend[*p];
+-	  DEBUG_PRINT2 ("      old_regend: %d\n", 
+-			 POINTER_TO_OFFSET (old_regend[*p]));
+-
+-          regend[*p] = d;
+-	  DEBUG_PRINT2 ("      regend: %d\n", POINTER_TO_OFFSET (regend[*p]));
+-
+-          /* This register isn't active anymore.  */
+-          IS_ACTIVE (reg_info[*p]) = 0;
+-          
+-          /* If this was the only register active, nothing is active
+-             anymore.  */
+-          if (lowest_active_reg == highest_active_reg)
+-            {
+-              lowest_active_reg = NO_LOWEST_ACTIVE_REG;
+-              highest_active_reg = NO_HIGHEST_ACTIVE_REG;
+-            }
+-          else
+-            { /* We must scan for the new highest active register, since
+-                 it isn't necessarily one less than now: consider
+-                 (a(b)c(d(e)f)g).  When group 3 ends, after the f), the
+-                 new highest active register is 1.  */
+-              unsigned char r = *p - 1;
+-              while (r > 0 && !IS_ACTIVE (reg_info[r]))
+-                r--;
+-              
+-              /* If we end up at register zero, that means that we saved
+-                 the registers as the result of an `on_failure_jump', not
+-                 a `start_memory', and we jumped to past the innermost
+-                 `stop_memory'.  For example, in ((.)*) we save
+-                 registers 1 and 2 as a result of the *, but when we pop
+-                 back to the second ), we are at the stop_memory 1.
+-                 Thus, nothing is active.  */
+-	      if (r == 0)
+-                {
+-                  lowest_active_reg = NO_LOWEST_ACTIVE_REG;
+-                  highest_active_reg = NO_HIGHEST_ACTIVE_REG;
+-                }
+-              else
+-                highest_active_reg = r;
+-            }
+-          
+-          /* If just failed to match something this time around with a
+-             group that's operated on by a repetition operator, try to
+-             force exit from the ``loop'', and restore the register
+-             information for this group that we had before trying this
+-             last match.  */
+-          if ((!MATCHED_SOMETHING (reg_info[*p])
+-               || (re_opcode_t) p[-3] == start_memory)
+-	      && (p + 2) < pend)              
+-            {
+-              boolean is_a_jump_n = false;
+-              
+-              p1 = p + 2;
+-              mcnt = 0;
+-              switch ((re_opcode_t) *p1++)
+-                {
+-                  case jump_n:
+-		    is_a_jump_n = true;
+-                  case pop_failure_jump:
+-		  case maybe_pop_jump:
+-		  case jump:
+-		  case dummy_failure_jump:
+-                    EXTRACT_NUMBER_AND_INCR (mcnt, p1);
+-		    if (is_a_jump_n)
+-		      p1 += 2;
+-                    break;
+-                  
+-                  default:
+-                    /* do nothing */ ;
+-                }
+-	      p1 += mcnt;
+-        
+-              /* If the next operation is a jump backwards in the pattern
+-	         to an on_failure_jump right before the start_memory
+-                 corresponding to this stop_memory, exit from the loop
+-                 by forcing a failure after pushing on the stack the
+-                 on_failure_jump's jump in the pattern, and d.  */
+-              if (mcnt < 0 && (re_opcode_t) *p1 == on_failure_jump
+-                  && (re_opcode_t) p1[3] == start_memory && p1[4] == *p)
+-		{
+-                  /* If this group ever matched anything, then restore
+-                     what its registers were before trying this last
+-                     failed match, e.g., with `(a*)*b' against `ab' for
+-                     regstart[1], and, e.g., with `((a*)*(b*)*)*'
+-                     against `aba' for regend[3].
+-                     
+-                     Also restore the registers for inner groups for,
+-                     e.g., `((a*)(b*))*' against `aba' (register 3 would
+-                     otherwise get trashed).  */
+-                     
+-                  if (EVER_MATCHED_SOMETHING (reg_info[*p]))
+-		    {
+-		      unsigned r; 
+-        
+-                      EVER_MATCHED_SOMETHING (reg_info[*p]) = 0;
+-                      
+-		      /* Restore this and inner groups' (if any) registers.  */
+-                      for (r = *p; r < *p + *(p + 1); r++)
+-                        {
+-                          regstart[r] = old_regstart[r];
+-
+-                          /* xx why this test?  */
+-                          if ((int) old_regend[r] >= (int) regstart[r])
+-                            regend[r] = old_regend[r];
+-                        }     
+-                    }
+-		  p1++;
+-                  EXTRACT_NUMBER_AND_INCR (mcnt, p1);
+-                  PUSH_FAILURE_POINT (p1 + mcnt, d, -2);
+-
+-                  goto fail;
+-                }
+-            }
+-          
+-          /* Move past the register number and the inner group count.  */
+-          p += 2;
+-          break;
+-
+-
+-	/* \<digit> has been turned into a `duplicate' command which is
+-           followed by the numeric value of <digit> as the register number.  */
+-        case duplicate:
+-	  {
+-	    register const char *d2, *dend2;
+-	    int regno = *p++;   /* Get which register to match against.  */
+-	    DEBUG_PRINT2 ("EXECUTING duplicate %d.\n", regno);
+-
+-	    /* Can't back reference a group which we've never matched.  */
+-            if (REG_UNSET (regstart[regno]) || REG_UNSET (regend[regno]))
+-              goto fail;
+-              
+-            /* Where in input to try to start matching.  */
+-            d2 = regstart[regno];
+-            
+-            /* Where to stop matching; if both the place to start and
+-               the place to stop matching are in the same string, then
+-               set to the place to stop, otherwise, for now have to use
+-               the end of the first string.  */
+-
+-            dend2 = ((FIRST_STRING_P (regstart[regno]) 
+-		      == FIRST_STRING_P (regend[regno]))
+-		     ? regend[regno] : end_match_1);
+-	    for (;;)
+-	      {
+-		/* If necessary, advance to next segment in register
+-                   contents.  */
+-		while (d2 == dend2)
+-		  {
+-		    if (dend2 == end_match_2) break;
+-		    if (dend2 == regend[regno]) break;
+-
+-                    /* End of string1 => advance to string2. */
+-                    d2 = string2;
+-                    dend2 = regend[regno];
+-		  }
+-		/* At end of register contents => success */
+-		if (d2 == dend2) break;
+-
+-		/* If necessary, advance to next segment in data.  */
+-		PREFETCH ();
+-
+-		/* How many characters left in this segment to match.  */
+-		mcnt = dend - d;
+-                
+-		/* Want how many consecutive characters we can match in
+-                   one shot, so, if necessary, adjust the count.  */
+-                if (mcnt > dend2 - d2)
+-		  mcnt = dend2 - d2;
+-                  
+-		/* Compare that many; failure if mismatch, else move
+-                   past them.  */
+-		if (translate 
+-                    ? bcmp_translate (d, d2, mcnt, translate) 
+-                    : bcmp (d, d2, mcnt))
+-		  goto fail;
+-		d += mcnt, d2 += mcnt;
+-	      }
+-	  }
+-	  break;
+-
+-
+-        /* begline matches the empty string at the beginning of the string
+-           (unless `not_bol' is set in `bufp'), and, if
+-           `newline_anchor' is set, after newlines.  */
+-	case begline:
+-          DEBUG_PRINT1 ("EXECUTING begline.\n");
+-          
+-          if (AT_STRINGS_BEG (d))
+-            {
+-              if (!bufp->not_bol) break;
+-            }
+-          else if (d[-1] == '\n' && bufp->newline_anchor)
+-            {
+-              break;
+-            }
+-          /* In all other cases, we fail.  */
+-          goto fail;
+-
+-
+-        /* endline is the dual of begline.  */
+-	case endline:
+-          DEBUG_PRINT1 ("EXECUTING endline.\n");
+-
+-          if (AT_STRINGS_END (d))
+-            {
+-              if (!bufp->not_eol) break;
+-            }
+-          
+-          /* We have to ``prefetch'' the next character.  */
+-          else if ((d == end1 ? *string2 : *d) == '\n'
+-                   && bufp->newline_anchor)
+-            {
+-              break;
+-            }
+-          goto fail;
+-
+-
+-	/* Match at the very beginning of the data.  */
+-        case begbuf:
+-          DEBUG_PRINT1 ("EXECUTING begbuf.\n");
+-          if (AT_STRINGS_BEG (d))
+-            break;
+-          goto fail;
+-
+-
+-	/* Match at the very end of the data.  */
+-        case endbuf:
+-          DEBUG_PRINT1 ("EXECUTING endbuf.\n");
+-	  if (AT_STRINGS_END (d))
+-	    break;
+-          goto fail;
+-
+-
+-        /* on_failure_keep_string_jump is used to optimize `.*\n'.  It
+-           pushes NULL as the value for the string on the stack.  Then
+-           `pop_failure_point' will keep the current value for the
+-           string, instead of restoring it.  To see why, consider
+-           matching `foo\nbar' against `.*\n'.  The .* matches the foo;
+-           then the . fails against the \n.  But the next thing we want
+-           to do is match the \n against the \n; if we restored the
+-           string value, we would be back at the foo.
+-           
+-           Because this is used only in specific cases, we don't need to
+-           check all the things that `on_failure_jump' does, to make
+-           sure the right things get saved on the stack.  Hence we don't
+-           share its code.  The only reason to push anything on the
+-           stack at all is that otherwise we would have to change
+-           `anychar's code to do something besides goto fail in this
+-           case; that seems worse than this.  */
+-        case on_failure_keep_string_jump:
+-          DEBUG_PRINT1 ("EXECUTING on_failure_keep_string_jump");
+-          
+-          EXTRACT_NUMBER_AND_INCR (mcnt, p);
+-          DEBUG_PRINT3 (" %d (to 0x%x):\n", mcnt, p + mcnt);
+-
+-          PUSH_FAILURE_POINT (p + mcnt, NULL, -2);
+-          break;
+-
+-
+-	/* Uses of on_failure_jump:
+-        
+-           Each alternative starts with an on_failure_jump that points
+-           to the beginning of the next alternative.  Each alternative
+-           except the last ends with a jump that in effect jumps past
+-           the rest of the alternatives.  (They really jump to the
+-           ending jump of the following alternative, because tensioning
+-           these jumps is a hassle.)
+-
+-           Repeats start with an on_failure_jump that points past both
+-           the repetition text and either the following jump or
+-           pop_failure_jump back to this on_failure_jump.  */
+-	case on_failure_jump:
+-        on_failure:
+-          DEBUG_PRINT1 ("EXECUTING on_failure_jump");
+-
+-          EXTRACT_NUMBER_AND_INCR (mcnt, p);
+-          DEBUG_PRINT3 (" %d (to 0x%x)", mcnt, p + mcnt);
+-
+-          /* If this on_failure_jump comes right before a group (i.e.,
+-             the original * applied to a group), save the information
+-             for that group and all inner ones, so that if we fail back
+-             to this point, the group's information will be correct.
+-             For example, in \(a*\)*\1, we need the preceding group,
+-             and in \(\(a*\)b*\)\2, we need the inner group.  */
+-
+-          /* We can't use `p' to check ahead because we push
+-             a failure point to `p + mcnt' after we do this.  */
+-          p1 = p;
+-
+-          /* We need to skip no_op's before we look for the
+-             start_memory in case this on_failure_jump is happening as
+-             the result of a completed succeed_n, as in \(a\)\{1,3\}b\1
+-             against aba.  */
+-          while (p1 < pend && (re_opcode_t) *p1 == no_op)
+-            p1++;
+-
+-          if (p1 < pend && (re_opcode_t) *p1 == start_memory)
+-            {
+-              /* We have a new highest active register now.  This will
+-                 get reset at the start_memory we are about to get to,
+-                 but we will have saved all the registers relevant to
+-                 this repetition op, as described above.  */
+-              highest_active_reg = *(p1 + 1) + *(p1 + 2);
+-              if (lowest_active_reg == NO_LOWEST_ACTIVE_REG)
+-                lowest_active_reg = *(p1 + 1);
+-            }
+-
+-          DEBUG_PRINT1 (":\n");
+-          PUSH_FAILURE_POINT (p + mcnt, d, -2);
+-          break;
+-
+-
+-        /* A smart repeat ends with `maybe_pop_jump'.
+-	   We change it to either `pop_failure_jump' or `jump'.  */
+-        case maybe_pop_jump:
+-          EXTRACT_NUMBER_AND_INCR (mcnt, p);
+-          DEBUG_PRINT2 ("EXECUTING maybe_pop_jump %d.\n", mcnt);
+-          {
+-	    register unsigned char *p2 = p;
+-
+-            /* Compare the beginning of the repeat with what in the
+-               pattern follows its end. If we can establish that there
+-               is nothing that they would both match, i.e., that we
+-               would have to backtrack because of (as in, e.g., `a*a')
+-               then we can change to pop_failure_jump, because we'll
+-               never have to backtrack.
+-               
+-               This is not true in the case of alternatives: in
+-               `(a|ab)*' we do need to backtrack to the `ab' alternative
+-               (e.g., if the string was `ab').  But instead of trying to
+-               detect that here, the alternative has put on a dummy
+-               failure point which is what we will end up popping.  */
+-
+-	    /* Skip over open/close-group commands.  */
+-	    while (p2 + 2 < pend
+-		   && ((re_opcode_t) *p2 == stop_memory
+-		       || (re_opcode_t) *p2 == start_memory))
+-	      p2 += 3;			/* Skip over args, too.  */
+-
+-            /* If we're at the end of the pattern, we can change.  */
+-            if (p2 == pend)
+-	      {
+-		/* Consider what happens when matching ":\(.*\)"
+-		   against ":/".  I don't really understand this code
+-		   yet.  */
+-  	        p[-3] = (unsigned char) pop_failure_jump;
+-                DEBUG_PRINT1
+-                  ("  End of pattern: change to `pop_failure_jump'.\n");
+-              }
+-
+-            else if ((re_opcode_t) *p2 == exactn
+-		     || (bufp->newline_anchor && (re_opcode_t) *p2 == endline))
+-	      {
+-		register unsigned char c
+-                  = *p2 == (unsigned char) endline ? '\n' : p2[2];
+-		p1 = p + mcnt;
+-
+-                /* p1[0] ... p1[2] are the `on_failure_jump' corresponding
+-                   to the `maybe_finalize_jump' of this case.  Examine what 
+-                   follows.  */
+-                if ((re_opcode_t) p1[3] == exactn && p1[5] != c)
+-                  {
+-  		    p[-3] = (unsigned char) pop_failure_jump;
+-                    DEBUG_PRINT3 ("  %c != %c => pop_failure_jump.\n",
+-                                  c, p1[5]);
+-                  }
+-                  
+-		else if ((re_opcode_t) p1[3] == charset
+-			 || (re_opcode_t) p1[3] == charset_not)
+-		  {
+-		    int not = (re_opcode_t) p1[3] == charset_not;
+-                    
+-		    if (c < (unsigned char) (p1[4] * BYTEWIDTH)
+-			&& p1[5 + c / BYTEWIDTH] & (1 << (c % BYTEWIDTH)))
+-		      not = !not;
+-
+-                    /* `not' is equal to 1 if c would match, which means
+-                        that we can't change to pop_failure_jump.  */
+-		    if (!not)
+-                      {
+-  		        p[-3] = (unsigned char) pop_failure_jump;
+-                        DEBUG_PRINT1 ("  No match => pop_failure_jump.\n");
+-                      }
+-		  }
+-	      }
+-	  }
+-	  p -= 2;		/* Point at relative address again.  */
+-	  if ((re_opcode_t) p[-1] != pop_failure_jump)
+-	    {
+-	      p[-1] = (unsigned char) jump;
+-              DEBUG_PRINT1 ("  Match => jump.\n");
+-	      goto unconditional_jump;
+-	    }
+-        /* Note fall through.  */
+-
+-
+-	/* The end of a simple repeat has a pop_failure_jump back to
+-           its matching on_failure_jump, where the latter will push a
+-           failure point.  The pop_failure_jump takes off failure
+-           points put on by this pop_failure_jump's matching
+-           on_failure_jump; we got through the pattern to here from the
+-           matching on_failure_jump, so didn't fail.  */
+-        case pop_failure_jump:
+-          {
+-            /* We need to pass separate storage for the lowest and
+-               highest registers, even though we don't care about the
+-               actual values.  Otherwise, we will restore only one
+-               register from the stack, since lowest will == highest in
+-               `pop_failure_point'.  */
+-            unsigned dummy_low_reg, dummy_high_reg;
+-            unsigned char *pdummy;
+-            const char *sdummy;
+-
+-            DEBUG_PRINT1 ("EXECUTING pop_failure_jump.\n");
+-            POP_FAILURE_POINT (sdummy, pdummy,
+-                               dummy_low_reg, dummy_high_reg,
+-                               reg_dummy, reg_dummy, reg_info_dummy);
+-          }
+-          /* Note fall through.  */
+-
+-          
+-        /* Unconditionally jump (without popping any failure points).  */
+-        case jump:
+-	unconditional_jump:
+-	  EXTRACT_NUMBER_AND_INCR (mcnt, p);	/* Get the amount to jump.  */
+-          DEBUG_PRINT2 ("EXECUTING jump %d ", mcnt);
+-	  p += mcnt;				/* Do the jump.  */
+-          DEBUG_PRINT2 ("(to 0x%x).\n", p);
+-	  break;
+-
+-	
+-        /* We need this opcode so we can detect where alternatives end
+-           in `group_match_null_string_p' et al.  */
+-        case jump_past_alt:
+-          DEBUG_PRINT1 ("EXECUTING jump_past_alt.\n");
+-          goto unconditional_jump;
+-
+-
+-        /* Normally, the on_failure_jump pushes a failure point, which
+-           then gets popped at pop_failure_jump.  We will end up at
+-           pop_failure_jump, also, and with a pattern of, say, `a+', we
+-           are skipping over the on_failure_jump, so we have to push
+-           something meaningless for pop_failure_jump to pop.  */
+-        case dummy_failure_jump:
+-          DEBUG_PRINT1 ("EXECUTING dummy_failure_jump.\n");
+-          /* It doesn't matter what we push for the string here.  What
+-             the code at `fail' tests is the value for the pattern.  */
+-          PUSH_FAILURE_POINT (0, 0, -2);
+-          goto unconditional_jump;
+-
+-
+-        /* At the end of an alternative, we need to push a dummy failure
+-           point in case we are followed by a `pop_failure_jump', because
+-           we don't want the failure point for the alternative to be
+-           popped.  For example, matching `(a|ab)*' against `aab'
+-           requires that we match the `ab' alternative.  */
+-        case push_dummy_failure:
+-          DEBUG_PRINT1 ("EXECUTING push_dummy_failure.\n");
+-          /* See comments just above at `dummy_failure_jump' about the
+-             two zeroes.  */
+-          PUSH_FAILURE_POINT (0, 0, -2);
+-          break;
+-
+-        /* Have to succeed matching what follows at least n times.
+-           After that, handle like `on_failure_jump'.  */
+-        case succeed_n: 
+-          EXTRACT_NUMBER (mcnt, p + 2);
+-          DEBUG_PRINT2 ("EXECUTING succeed_n %d.\n", mcnt);
+-
+-          assert (mcnt >= 0);
+-          /* Originally, this is how many times we HAVE to succeed.  */
+-          if (mcnt > 0)
+-            {
+-               mcnt--;
+-	       p += 2;
+-               STORE_NUMBER_AND_INCR (p, mcnt);
+-               DEBUG_PRINT3 ("  Setting 0x%x to %d.\n", p, mcnt);
+-            }
+-	  else if (mcnt == 0)
+-            {
+-              DEBUG_PRINT2 ("  Setting two bytes from 0x%x to no_op.\n", p+2);
+-	      p[2] = (unsigned char) no_op;
+-              p[3] = (unsigned char) no_op;
+-              goto on_failure;
+-            }
+-          break;
+-        
+-        case jump_n: 
+-          EXTRACT_NUMBER (mcnt, p + 2);
+-          DEBUG_PRINT2 ("EXECUTING jump_n %d.\n", mcnt);
+-
+-          /* Originally, this is how many times we CAN jump.  */
+-          if (mcnt)
+-            {
+-               mcnt--;
+-               STORE_NUMBER (p + 2, mcnt);
+-	       goto unconditional_jump;	     
+-            }
+-          /* If don't have to jump any more, skip over the rest of command.  */
+-	  else      
+-	    p += 4;		     
+-          break;
+-        
+-	case set_number_at:
+-	  {
+-            DEBUG_PRINT1 ("EXECUTING set_number_at.\n");
+-
+-            EXTRACT_NUMBER_AND_INCR (mcnt, p);
+-            p1 = p + mcnt;
+-            EXTRACT_NUMBER_AND_INCR (mcnt, p);
+-            DEBUG_PRINT3 ("  Setting 0x%x to %d.\n", p1, mcnt);
+-	    STORE_NUMBER (p1, mcnt);
+-            break;
+-          }
+-
+-        case wordbound:
+-          DEBUG_PRINT1 ("EXECUTING wordbound.\n");
+-          if (AT_WORD_BOUNDARY (d))
+-	    break;
+-          goto fail;
+-
+-	case notwordbound:
+-          DEBUG_PRINT1 ("EXECUTING notwordbound.\n");
+-	  if (AT_WORD_BOUNDARY (d))
+-	    goto fail;
+-          break;
+-
+-	case wordbeg:
+-          DEBUG_PRINT1 ("EXECUTING wordbeg.\n");
+-	  if (WORDCHAR_P (d) && (AT_STRINGS_BEG (d) || !WORDCHAR_P (d - 1)))
+-	    break;
+-          goto fail;
+-
+-	case wordend:
+-          DEBUG_PRINT1 ("EXECUTING wordend.\n");
+-	  if (!AT_STRINGS_BEG (d) && WORDCHAR_P (d - 1)
+-              && (!WORDCHAR_P (d) || AT_STRINGS_END (d)))
+-	    break;
+-          goto fail;
+-
+-#ifdef emacs
+-#ifdef emacs19
+-  	case before_dot:
+-          DEBUG_PRINT1 ("EXECUTING before_dot.\n");
+- 	  if (PTR_CHAR_POS ((unsigned char *) d) >= point)
+-  	    goto fail;
+-  	  break;
+-  
+-  	case at_dot:
+-          DEBUG_PRINT1 ("EXECUTING at_dot.\n");
+- 	  if (PTR_CHAR_POS ((unsigned char *) d) != point)
+-  	    goto fail;
+-  	  break;
+-  
+-  	case after_dot:
+-          DEBUG_PRINT1 ("EXECUTING after_dot.\n");
+-          if (PTR_CHAR_POS ((unsigned char *) d) <= point)
+-  	    goto fail;
+-  	  break;
+-#else /* not emacs19 */
+-	case at_dot:
+-          DEBUG_PRINT1 ("EXECUTING at_dot.\n");
+-	  if (PTR_CHAR_POS ((unsigned char *) d) + 1 != point)
+-	    goto fail;
+-	  break;
+-#endif /* not emacs19 */
+-
+-	case syntaxspec:
+-          DEBUG_PRINT2 ("EXECUTING syntaxspec %d.\n", mcnt);
+-	  mcnt = *p++;
+-	  goto matchsyntax;
+-
+-        case wordchar:
+-          DEBUG_PRINT1 ("EXECUTING Emacs wordchar.\n");
+-	  mcnt = (int) Sword;
+-        matchsyntax:
+-	  PREFETCH ();
+-	  if (SYNTAX (*d++) != (enum syntaxcode) mcnt)
+-            goto fail;
+-          SET_REGS_MATCHED ();
+-	  break;
+-
+-	case notsyntaxspec:
+-          DEBUG_PRINT2 ("EXECUTING notsyntaxspec %d.\n", mcnt);
+-	  mcnt = *p++;
+-	  goto matchnotsyntax;
+-
+-        case notwordchar:
+-          DEBUG_PRINT1 ("EXECUTING Emacs notwordchar.\n");
+-	  mcnt = (int) Sword;
+-        matchnotsyntax:
+-	  PREFETCH ();
+-	  if (SYNTAX (*d++) == (enum syntaxcode) mcnt)
+-            goto fail;
+-	  SET_REGS_MATCHED ();
+-          break;
+-
+-#else /* not emacs */
+-	case wordchar:
+-          DEBUG_PRINT1 ("EXECUTING non-Emacs wordchar.\n");
+-	  PREFETCH ();
+-          if (!WORDCHAR_P (d))
+-            goto fail;
+-	  SET_REGS_MATCHED ();
+-          d++;
+-	  break;
+-	  
+-	case notwordchar:
+-          DEBUG_PRINT1 ("EXECUTING non-Emacs notwordchar.\n");
+-	  PREFETCH ();
+-	  if (WORDCHAR_P (d))
+-            goto fail;
+-          SET_REGS_MATCHED ();
+-          d++;
+-	  break;
+-#endif /* not emacs */
+-          
+-        default:
+-          abort ();
+-	}
+-      continue;  /* Successfully executed one pattern command; keep going.  */
+-
+-
+-    /* We goto here if a matching operation fails. */
+-    fail:
+-      if (!FAIL_STACK_EMPTY ())
+-	{ /* A restart point is known.  Restore to that state.  */
+-          DEBUG_PRINT1 ("\nFAIL:\n");
+-          POP_FAILURE_POINT (d, p,
+-                             lowest_active_reg, highest_active_reg,
+-                             regstart, regend, reg_info);
+-
+-          /* If this failure point is a dummy, try the next one.  */
+-          if (!p)
+-	    goto fail;
+-
+-          /* If we failed to the end of the pattern, don't examine *p.  */
+-	  assert (p <= pend);
+-          if (p < pend)
+-            {
+-              boolean is_a_jump_n = false;
+-              
+-              /* If failed to a backwards jump that's part of a repetition
+-                 loop, need to pop this failure point and use the next one.  */
+-              switch ((re_opcode_t) *p)
+-                {
+-                case jump_n:
+-                  is_a_jump_n = true;
+-                case maybe_pop_jump:
+-                case pop_failure_jump:
+-                case jump:
+-                  p1 = p + 1;
+-                  EXTRACT_NUMBER_AND_INCR (mcnt, p1);
+-                  p1 += mcnt;	
+-
+-                  if ((is_a_jump_n && (re_opcode_t) *p1 == succeed_n)
+-                      || (!is_a_jump_n
+-                          && (re_opcode_t) *p1 == on_failure_jump))
+-                    goto fail;
+-                  break;
+-                default:
+-                  /* do nothing */ ;
+-                }
+-            }
+-
+-          if (d >= string1 && d <= end1)
+-	    dend = end_match_1;
+-        }
+-      else
+-        break;   /* Matching at this starting point really fails.  */
+-    } /* for (;;) */
+-
+-  if (best_regs_set)
+-    goto restore_best_regs;
+-
+-  FREE_VARIABLES ();
+-
+-  return -1;         			/* Failure to match.  */
+-} /* re_match_2 */
+-
+-/* Subroutine definitions for re_match_2.  */
+-
+-
+-/* We are passed P pointing to a register number after a start_memory.
+-   
+-   Return true if the pattern up to the corresponding stop_memory can
+-   match the empty string, and false otherwise.
+-   
+-   If we find the matching stop_memory, sets P to point to one past its number.
+-   Otherwise, sets P to an undefined byte less than or equal to END.
+-
+-   We don't handle duplicates properly (yet).  */
+-
+-static boolean
+-group_match_null_string_p (p, end, reg_info)
+-    unsigned char **p, *end;
+-    register_info_type *reg_info;
+-{
+-  int mcnt;
+-  /* Point to after the args to the start_memory.  */
+-  unsigned char *p1 = *p + 2;
+-  
+-  while (p1 < end)
+-    {
+-      /* Skip over opcodes that can match nothing, and return true or
+-	 false, as appropriate, when we get to one that can't, or to the
+-         matching stop_memory.  */
+-      
+-      switch ((re_opcode_t) *p1)
+-        {
+-        /* Could be either a loop or a series of alternatives.  */
+-        case on_failure_jump:
+-          p1++;
+-          EXTRACT_NUMBER_AND_INCR (mcnt, p1);
+-          
+-          /* If the next operation is not a jump backwards in the
+-	     pattern.  */
+-
+-	  if (mcnt >= 0)
+-	    {
+-              /* Go through the on_failure_jumps of the alternatives,
+-                 seeing if any of the alternatives cannot match nothing.
+-                 The last alternative starts with only a jump,
+-                 whereas the rest start with on_failure_jump and end
+-                 with a jump, e.g., here is the pattern for `a|b|c':
+-
+-                 /on_failure_jump/0/6/exactn/1/a/jump_past_alt/0/6
+-                 /on_failure_jump/0/6/exactn/1/b/jump_past_alt/0/3
+-                 /exactn/1/c						
+-
+-                 So, we have to first go through the first (n-1)
+-                 alternatives and then deal with the last one separately.  */
+-
+-
+-              /* Deal with the first (n-1) alternatives, which start
+-                 with an on_failure_jump (see above) that jumps to right
+-                 past a jump_past_alt.  */
+-
+-              while ((re_opcode_t) p1[mcnt-3] == jump_past_alt)
+-                {
+-                  /* `mcnt' holds how many bytes long the alternative
+-                     is, including the ending `jump_past_alt' and
+-                     its number.  */
+-
+-                  if (!alt_match_null_string_p (p1, p1 + mcnt - 3, 
+-				                      reg_info))
+-                    return false;
+-
+-                  /* Move to right after this alternative, including the
+-		     jump_past_alt.  */
+-                  p1 += mcnt;	
+-
+-                  /* Break if it's the beginning of an n-th alternative
+-                     that doesn't begin with an on_failure_jump.  */
+-                  if ((re_opcode_t) *p1 != on_failure_jump)
+-                    break;
+-		
+-		  /* Still have to check that it's not an n-th
+-		     alternative that starts with an on_failure_jump.  */
+-		  p1++;
+-                  EXTRACT_NUMBER_AND_INCR (mcnt, p1);
+-                  if ((re_opcode_t) p1[mcnt-3] != jump_past_alt)
+-                    {
+-		      /* Get to the beginning of the n-th alternative.  */
+-                      p1 -= 3;
+-                      break;
+-                    }
+-                }
+-
+-              /* Deal with the last alternative: go back and get number
+-                 of the `jump_past_alt' just before it.  `mcnt' contains
+-                 the length of the alternative.  */
+-              EXTRACT_NUMBER (mcnt, p1 - 2);
+-
+-              if (!alt_match_null_string_p (p1, p1 + mcnt, reg_info))
+-                return false;
+-
+-              p1 += mcnt;	/* Get past the n-th alternative.  */
+-            } /* if mcnt > 0 */
+-          break;
+-
+-          
+-        case stop_memory:
+-	  assert (p1[1] == **p);
+-          *p = p1 + 2;
+-          return true;
+-
+-        
+-        default: 
+-          if (!common_op_match_null_string_p (&p1, end, reg_info))
+-            return false;
+-        }
+-    } /* while p1 < end */
+-
+-  return false;
+-} /* group_match_null_string_p */
+-
+-
+-/* Similar to group_match_null_string_p, but doesn't deal with alternatives:
+-   It expects P to be the first byte of a single alternative and END one
+-   byte past the last. The alternative can contain groups.  */
+-   
+-static boolean
+-alt_match_null_string_p (p, end, reg_info)
+-    unsigned char *p, *end;
+-    register_info_type *reg_info;
+-{
+-  int mcnt;
+-  unsigned char *p1 = p;
+-  
+-  while (p1 < end)
+-    {
+-      /* Skip over opcodes that can match nothing, and break when we get 
+-         to one that can't.  */
+-      
+-      switch ((re_opcode_t) *p1)
+-        {
+-	/* It's a loop.  */
+-        case on_failure_jump:
+-          p1++;
+-          EXTRACT_NUMBER_AND_INCR (mcnt, p1);
+-          p1 += mcnt;
+-          break;
+-          
+-	default: 
+-          if (!common_op_match_null_string_p (&p1, end, reg_info))
+-            return false;
+-        }
+-    }  /* while p1 < end */
+-
+-  return true;
+-} /* alt_match_null_string_p */
+-
+-
+-/* Deals with the ops common to group_match_null_string_p and
+-   alt_match_null_string_p.  
+-   
+-   Sets P to one after the op and its arguments, if any.  */
+-
+-static boolean
+-common_op_match_null_string_p (p, end, reg_info)
+-    unsigned char **p, *end;
+-    register_info_type *reg_info;
+-{
+-  int mcnt;
+-  boolean ret;
+-  int reg_no;
+-  unsigned char *p1 = *p;
+-
+-  switch ((re_opcode_t) *p1++)
+-    {
+-    case no_op:
+-    case begline:
+-    case endline:
+-    case begbuf:
+-    case endbuf:
+-    case wordbeg:
+-    case wordend:
+-    case wordbound:
+-    case notwordbound:
+-#ifdef emacs
+-    case before_dot:
+-    case at_dot:
+-    case after_dot:
+-#endif
+-      break;
+-
+-    case start_memory:
+-      reg_no = *p1;
+-      assert (reg_no > 0 && reg_no <= MAX_REGNUM);
+-      ret = group_match_null_string_p (&p1, end, reg_info);
+-      
+-      /* Have to set this here in case we're checking a group which
+-         contains a group and a back reference to it.  */
+-
+-      if (REG_MATCH_NULL_STRING_P (reg_info[reg_no]) == MATCH_NULL_UNSET_VALUE)
+-        REG_MATCH_NULL_STRING_P (reg_info[reg_no]) = ret;
+-
+-      if (!ret)
+-        return false;
+-      break;
+-          
+-    /* If this is an optimized succeed_n for zero times, make the jump.  */
+-    case jump:
+-      EXTRACT_NUMBER_AND_INCR (mcnt, p1);
+-      if (mcnt >= 0)
+-        p1 += mcnt;
+-      else
+-        return false;
+-      break;
+-
+-    case succeed_n:
+-      /* Get to the number of times to succeed.  */
+-      p1 += 2;		
+-      EXTRACT_NUMBER_AND_INCR (mcnt, p1);
+-
+-      if (mcnt == 0)
+-        {
+-          p1 -= 4;
+-          EXTRACT_NUMBER_AND_INCR (mcnt, p1);
+-          p1 += mcnt;
+-        }
+-      else
+-        return false;
+-      break;
+-
+-    case duplicate: 
+-      if (!REG_MATCH_NULL_STRING_P (reg_info[*p1]))
+-        return false;
+-      break;
+-
+-    case set_number_at:
+-      p1 += 4;
+-
+-    default:
+-      /* All other opcodes mean we cannot match the empty string.  */
+-      return false;
+-  }
+-
+-  *p = p1;
+-  return true;
+-} /* common_op_match_null_string_p */
+-
+-
+-/* Return zero if TRANSLATE[S1] and TRANSLATE[S2] are identical for LEN
+-   bytes; nonzero otherwise.  */
+-   
+-static int
+-bcmp_translate (s1, s2, len, translate)
+-     unsigned char *s1, *s2;
+-     register int len;
+-     char *translate;
+-{
+-  register unsigned char *p1 = s1, *p2 = s2;
+-  while (len)
+-    {
+-      if (translate[*p1++] != translate[*p2++]) return 1;
+-      len--;
+-    }
+-  return 0;
+-}
+-
+-/* Entry points for GNU code.  */
+-
+-/* re_compile_pattern is the GNU regular expression compiler: it
+-   compiles PATTERN (of length SIZE) and puts the result in BUFP.
+-   Returns 0 if the pattern was valid, otherwise an error string.
+-   
+-   Assumes the `allocated' (and perhaps `buffer') and `translate' fields
+-   are set in BUFP on entry.
+-   
+-   We call regex_compile to do the actual compilation.  */
+-
+-const char *
+-re_compile_pattern (pattern, length, bufp)
+-     const char *pattern;
+-     int length;
+-     struct re_pattern_buffer *bufp;
+-{
+-  reg_errcode_t ret;
+-  
+-  /* GNU code is written to assume at least RE_NREGS registers will be set
+-     (and at least one extra will be -1).  */
+-  bufp->regs_allocated = REGS_UNALLOCATED;
+-  
+-  /* And GNU code determines whether or not to get register information
+-     by passing null for the REGS argument to re_match, etc., not by
+-     setting no_sub.  */
+-  bufp->no_sub = 0;
+-  
+-  /* Match anchors at newline.  */
+-  bufp->newline_anchor = 1;
+-  
+-  ret = regex_compile (pattern, length, re_syntax_options, bufp);
+-
+-  return re_error_msg[(int) ret];
+-}     
+-
+-/* Entry points compatible with 4.2 BSD regex library.  We don't define
+-   them if this is an Emacs or POSIX compilation.  */
+-
+-#if !defined (emacs) && !defined (_POSIX_SOURCE)
+-
+-/* BSD has one and only one pattern buffer.  */
+-static struct re_pattern_buffer re_comp_buf;
+-
+-char *
+-re_comp (s)
+-    const char *s;
+-{
+-  reg_errcode_t ret;
+-  
+-  if (!s)
+-    {
+-      if (!re_comp_buf.buffer)
+-	return "No previous regular expression";
+-      return 0;
+-    }
+-
+-  if (!re_comp_buf.buffer)
+-    {
+-      re_comp_buf.buffer = (unsigned char *) malloc (200);
+-      if (re_comp_buf.buffer == NULL)
+-        return "Memory exhausted";
+-      re_comp_buf.allocated = 200;
+-
+-      re_comp_buf.fastmap = (char *) malloc (1 << BYTEWIDTH);
+-      if (re_comp_buf.fastmap == NULL)
+-	return "Memory exhausted";
+-    }
+-
+-  /* Since `re_exec' always passes NULL for the `regs' argument, we
+-     don't need to initialize the pattern buffer fields which affect it.  */
+-
+-  /* Match anchors at newlines.  */
+-  re_comp_buf.newline_anchor = 1;
+-
+-  ret = regex_compile (s, strlen (s), re_syntax_options, &re_comp_buf);
+-  
+-  /* Yes, we're discarding `const' here.  */
+-  return (char *) re_error_msg[(int) ret];
+-}
+-
+-
+-int
+-re_exec (s)
+-    const char *s;
+-{
+-  const int len = strlen (s);
+-  return
+-    0 <= re_search (&re_comp_buf, s, len, 0, len, (struct re_registers *) 0);
+-}
+-#endif /* not emacs and not _POSIX_SOURCE */
+-
+-/* POSIX.2 functions.  Don't define these for Emacs.  */
+-
+-#ifndef emacs
+-
+-/* regcomp takes a regular expression as a string and compiles it.
+-
+-   PREG is a regex_t *.  We do not expect any fields to be initialized,
+-   since POSIX says we shouldn't.  Thus, we set
+-
+-     `buffer' to the compiled pattern;
+-     `used' to the length of the compiled pattern;
+-     `syntax' to RE_SYNTAX_POSIX_EXTENDED if the
+-       REG_EXTENDED bit in CFLAGS is set; otherwise, to
+-       RE_SYNTAX_POSIX_BASIC;
+-     `newline_anchor' to REG_NEWLINE being set in CFLAGS;
+-     `fastmap' and `fastmap_accurate' to zero;
+-     `re_nsub' to the number of subexpressions in PATTERN.
+-
+-   PATTERN is the address of the pattern string.
+-
+-   CFLAGS is a series of bits which affect compilation.
+-
+-     If REG_EXTENDED is set, we use POSIX extended syntax; otherwise, we
+-     use POSIX basic syntax.
+-
+-     If REG_NEWLINE is set, then . and [^...] don't match newline.
+-     Also, regexec will try a match beginning after every newline.
+-
+-     If REG_ICASE is set, then we considers upper- and lowercase
+-     versions of letters to be equivalent when matching.
+-
+-     If REG_NOSUB is set, then when PREG is passed to regexec, that
+-     routine will report only success or failure, and nothing about the
+-     registers.
+-
+-   It returns 0 if it succeeds, nonzero if it doesn't.  (See regex.h for
+-   the return codes and their meanings.)  */
+-
+-int
+-regcomp (preg, pattern, cflags)
+-    regex_t *preg;
+-    const char *pattern; 
+-    int cflags;
+-{
+-  reg_errcode_t ret;
+-  unsigned syntax
+-    = (cflags & REG_EXTENDED) ?
+-      RE_SYNTAX_POSIX_EXTENDED : RE_SYNTAX_POSIX_BASIC;
+-
+-  /* regex_compile will allocate the space for the compiled pattern.  */
+-  preg->buffer = 0;
+-  preg->allocated = 0;
+-  
+-  /* Don't bother to use a fastmap when searching.  This simplifies the
+-     REG_NEWLINE case: if we used a fastmap, we'd have to put all the
+-     characters after newlines into the fastmap.  This way, we just try
+-     every character.  */
+-  preg->fastmap = 0;
+-  
+-  if (cflags & REG_ICASE)
+-    {
+-      unsigned i;
+-      
+-      preg->translate = (char *) malloc (CHAR_SET_SIZE);
+-      if (preg->translate == NULL)
+-        return (int) REG_ESPACE;
+-
+-      /* Map uppercase characters to corresponding lowercase ones.  */
+-      for (i = 0; i < CHAR_SET_SIZE; i++)
+-        preg->translate[i] = ISUPPER (i) ? tolower (i) : i;
+-    }
+-  else
+-    preg->translate = NULL;
+-
+-  /* If REG_NEWLINE is set, newlines are treated differently.  */
+-  if (cflags & REG_NEWLINE)
+-    { /* REG_NEWLINE implies neither . nor [^...] match newline.  */
+-      syntax &= ~RE_DOT_NEWLINE;
+-      syntax |= RE_HAT_LISTS_NOT_NEWLINE;
+-      /* It also changes the matching behavior.  */
+-      preg->newline_anchor = 1;
+-    }
+-  else
+-    preg->newline_anchor = 0;
+-
+-  preg->no_sub = !!(cflags & REG_NOSUB);
+-
+-  /* POSIX says a null character in the pattern terminates it, so we 
+-     can use strlen here in compiling the pattern.  */
+-  ret = regex_compile (pattern, strlen (pattern), syntax, preg);
+-  
+-  /* POSIX doesn't distinguish between an unmatched open-group and an
+-     unmatched close-group: both are REG_EPAREN.  */
+-  if (ret == REG_ERPAREN) ret = REG_EPAREN;
+-  
+-  return (int) ret;
+-}
+-
+-
+-/* regexec searches for a given pattern, specified by PREG, in the
+-   string STRING.
+-   
+-   If NMATCH is zero or REG_NOSUB was set in the cflags argument to
+-   `regcomp', we ignore PMATCH.  Otherwise, we assume PMATCH has at
+-   least NMATCH elements, and we set them to the offsets of the
+-   corresponding matched substrings.
+-   
+-   EFLAGS specifies `execution flags' which affect matching: if
+-   REG_NOTBOL is set, then ^ does not match at the beginning of the
+-   string; if REG_NOTEOL is set, then $ does not match at the end.
+-   
+-   We return 0 if we find a match and REG_NOMATCH if not.  */
+-
+-int
+-regexec (preg, string, nmatch, pmatch, eflags)
+-    const regex_t *preg;
+-    const char *string; 
+-    size_t nmatch; 
+-    regmatch_t pmatch[]; 
+-    int eflags;
+-{
+-  int ret;
+-  struct re_registers regs;
+-  regex_t private_preg;
+-  int len = strlen (string);
+-  boolean want_reg_info = !preg->no_sub && nmatch > 0;
+-
+-  private_preg = *preg;
+-  
+-  private_preg.not_bol = !!(eflags & REG_NOTBOL);
+-  private_preg.not_eol = !!(eflags & REG_NOTEOL);
+-  
+-  /* The user has told us exactly how many registers to return
+-     information about, via `nmatch'.  We have to pass that on to the
+-     matching routines.  */
+-  private_preg.regs_allocated = REGS_FIXED;
+-  
+-  if (want_reg_info)
+-    {
+-      regs.num_regs = nmatch;
+-      regs.start = TALLOC (nmatch, regoff_t);
+-      regs.end = TALLOC (nmatch, regoff_t);
+-      if (regs.start == NULL || regs.end == NULL)
+-        return (int) REG_NOMATCH;
+-    }
+-
+-  /* Perform the searching operation.  */
+-  ret = re_search (&private_preg, string, len,
+-                   /* start: */ 0, /* range: */ len,
+-                   want_reg_info ? &regs : (struct re_registers *) 0);
+-  
+-  /* Copy the register information to the POSIX structure.  */
+-  if (want_reg_info)
+-    {
+-      if (ret >= 0)
+-        {
+-          unsigned r;
+-
+-          for (r = 0; r < nmatch; r++)
+-            {
+-              pmatch[r].rm_so = regs.start[r];
+-              pmatch[r].rm_eo = regs.end[r];
+-            }
+-        }
+-
+-      /* If we needed the temporary register info, free the space now.  */
+-      free (regs.start);
+-      free (regs.end);
+-    }
+-
+-  /* We want zero return to mean success, unlike `re_search'.  */
+-  return ret >= 0 ? (int) REG_NOERROR : (int) REG_NOMATCH;
+-}
+-
+-
+-/* Returns a message corresponding to an error code, ERRCODE, returned
+-   from either regcomp or regexec.   We don't use PREG here.  */
+-
+-size_t
+-regerror (errcode_vc, preg, errbuf, errbuf_size)
+-    int errcode_vc; 
+-    const regex_t *preg; 
+-    char *errbuf; 
+-    size_t errbuf_size; 
+-{
+-  const char *msg;
+-  size_t msg_size;
+-
+-  if (errcode_vc < 0
+-      || errcode_vc >= (sizeof (re_error_msg) / sizeof (re_error_msg[0])))
+-    /* Only error codes returned by the rest of the code should be passed 
+-       to this routine.  If we are given anything else, or if other regex
+-       code generates an invalid error code, then the program has a bug.
+-       Dump core so we can fix it.  */
+-    abort ();
+-
+-  msg = re_error_msg[errcode_vc];
+-
+-  /* POSIX doesn't require that we do anything in this case, but why
+-     not be nice.  */
+-  if (! msg)
+-    msg = "Success";
+-
+-  msg_size = strlen (msg) + 1; /* Includes the null.  */
+-  
+-  if (errbuf_size != 0)
+-    {
+-      if (msg_size > errbuf_size)
+-        {
+-          strncpy (errbuf, msg, errbuf_size - 1);
+-          errbuf[errbuf_size - 1] = 0;
+-        }
+-      else
+-        strcpy (errbuf, msg);
+-    }
+-
+-  return msg_size;
+-}
+-
+-
+-/* Free dynamically allocated space used by PREG.  */
+-
+-void
+-regfree (preg)
+-    regex_t *preg;
+-{
+-  if (preg->buffer != NULL)
+-    free (preg->buffer);
+-  preg->buffer = NULL;
+-  
+-  preg->allocated = 0;
+-  preg->used = 0;
+-
+-  if (preg->fastmap != NULL)
+-    free (preg->fastmap);
+-  preg->fastmap = NULL;
+-  preg->fastmap_accurate = 0;
+-
+-  if (preg->translate != NULL)
+-    free (preg->translate);
+-  preg->translate = NULL;
+-}
+-
+-#endif /* not emacs  */
+-
+-/*
+-Local variables:
+-make-backup-files: t
+-version-control: t
+-trim-versions-without-asking: nil
+-End:
+-*/
+--- a/windows/regex.h
++++ /dev/null
+@@ -1,506 +0,0 @@
+-/* Definitions for data structures and routines for the regular
+-  expression library, version 0.12.
+-
+-  Copyright (C) 1985, 1989, 1990, 1991, 1992, 1993 Free Software Foundation, Inc.
+-
+-  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, 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., 675 Mass Ave, Cambridge, MA 02139, USA.  */
+-
+-#ifndef __REGEXP_LIBRARY_H__
+-#define __REGEXP_LIBRARY_H__
+-
+-#ifdef __cplusplus
+-extern "C"
+-{
+-#endif
+-
+-    /* POSIX says that <sys/types.h> must be included (by the caller) before
+-       <regex.h>.  */
+-
+-#ifdef VMS
+-    /* VMS doesn't have `size_t' in <sys/types.h>, even though POSIX says it
+-       should be there.  */
+-#include <stddef.h>
+-#endif
+-
+-
+-    /* The following bits are used to determine the regexp syntax we
+-       recognize.  The set/not-set meanings are chosen so that Emacs syntax
+-       remains the value 0.  The bits are given in alphabetical order, and
+-       the definitions shifted by one from the previous bit; thus, when we
+-       add or remove a bit, only one other definition need change.  */
+-    typedef unsigned reg_syntax_t;
+-
+-    /* If this bit is not set, then \ inside a bracket expression is literal.
+-       If set, then such a \ quotes the following character.  */
+-#define RE_BACKSLASH_ESCAPE_IN_LISTS (1)
+-
+-    /* If this bit is not set, then + and ? are operators, and \+ and \? are
+-         literals. 
+-       If set, then \+ and \? are operators and + and ? are literals.  */
+-#define RE_BK_PLUS_QM (RE_BACKSLASH_ESCAPE_IN_LISTS << 1)
+-
+-    /* If this bit is set, then character classes are supported.  They are:
+-         [:alpha:], [:upper:], [:lower:],  [:digit:], [:alnum:], [:xdigit:],
+-         [:space:], [:print:], [:punct:], [:graph:], and [:cntrl:].
+-       If not set, then character classes are not supported.  */
+-#define RE_CHAR_CLASSES (RE_BK_PLUS_QM << 1)
+-
+-    /* If this bit is set, then ^ and $ are always anchors (outside bracket
+-         expressions, of course).
+-       If this bit is not set, then it depends:
+-            ^  is an anchor if it is at the beginning of a regular
+-               expression or after an open-group or an alternation operator;
+-            $  is an anchor if it is at the end of a regular expression, or
+-               before a close-group or an alternation operator.  
+-     
+-       This bit could be (re)combined with RE_CONTEXT_INDEP_OPS, because
+-       POSIX draft 11.2 says that * etc. in leading positions is undefined.
+-       We already implemented a previous draft which made those constructs
+-       invalid, though, so we haven't changed the code back.  */
+-#define RE_CONTEXT_INDEP_ANCHORS (RE_CHAR_CLASSES << 1)
+-
+-    /* If this bit is set, then special characters are always special
+-         regardless of where they are in the pattern.
+-       If this bit is not set, then special characters are special only in
+-         some contexts; otherwise they are ordinary.  Specifically, 
+-         * + ? and intervals are only special when not after the beginning,
+-         open-group, or alternation operator.  */
+-#define RE_CONTEXT_INDEP_OPS (RE_CONTEXT_INDEP_ANCHORS << 1)
+-
+-    /* If this bit is set, then *, +, ?, and { cannot be first in an re or
+-         immediately after an alternation or begin-group operator.  */
+-#define RE_CONTEXT_INVALID_OPS (RE_CONTEXT_INDEP_OPS << 1)
+-
+-    /* If this bit is set, then . matches newline.
+-       If not set, then it doesn't.  */
+-#define RE_DOT_NEWLINE (RE_CONTEXT_INVALID_OPS << 1)
+-
+-    /* If this bit is set, then . doesn't match NUL.
+-       If not set, then it does.  */
+-#define RE_DOT_NOT_NULL (RE_DOT_NEWLINE << 1)
+-
+-    /* If this bit is set, nonmatching lists [^...] do not match newline.
+-       If not set, they do.  */
+-#define RE_HAT_LISTS_NOT_NEWLINE (RE_DOT_NOT_NULL << 1)
+-
+-    /* If this bit is set, either \{...\} or {...} defines an
+-         interval, depending on RE_NO_BK_BRACES. 
+-       If not set, \{, \}, {, and } are literals.  */
+-#define RE_INTERVALS (RE_HAT_LISTS_NOT_NEWLINE << 1)
+-
+-    /* If this bit is set, +, ? and | aren't recognized as operators.
+-       If not set, they are.  */
+-#define RE_LIMITED_OPS (RE_INTERVALS << 1)
+-
+-    /* If this bit is set, newline is an alternation operator.
+-       If not set, newline is literal.  */
+-#define RE_NEWLINE_ALT (RE_LIMITED_OPS << 1)
+-
+-    /* If this bit is set, then `{...}' defines an interval, and \{ and \}
+-         are literals.
+-      If not set, then `\{...\}' defines an interval.  */
+-#define RE_NO_BK_BRACES (RE_NEWLINE_ALT << 1)
+-
+-    /* If this bit is set, (...) defines a group, and \( and \) are literals.
+-       If not set, \(...\) defines a group, and ( and ) are literals.  */
+-#define RE_NO_BK_PARENS (RE_NO_BK_BRACES << 1)
+-
+-    /* If this bit is set, then \<digit> matches <digit>.
+-       If not set, then \<digit> is a back-reference.  */
+-#define RE_NO_BK_REFS (RE_NO_BK_PARENS << 1)
+-
+-    /* If this bit is set, then | is an alternation operator, and \| is literal.
+-       If not set, then \| is an alternation operator, and | is literal.  */
+-#define RE_NO_BK_VBAR (RE_NO_BK_REFS << 1)
+-
+-    /* If this bit is set, then an ending range point collating higher
+-         than the starting range point, as in [z-a], is invalid.
+-       If not set, then when ending range point collates higher than the
+-         starting range point, the range is ignored.  */
+-#define RE_NO_EMPTY_RANGES (RE_NO_BK_VBAR << 1)
+-
+-    /* If this bit is set, then an unmatched ) is ordinary.
+-       If not set, then an unmatched ) is invalid.  */
+-#define RE_UNMATCHED_RIGHT_PAREN_ORD (RE_NO_EMPTY_RANGES << 1)
+-
+-    /* This global variable defines the particular regexp syntax to use (for
+-       some interfaces).  When a regexp is compiled, the syntax used is
+-       stored in the pattern buffer, so changing this does not affect
+-       already-compiled regexps.  */
+-    extern reg_syntax_t re_syntax_options;
+-    
+-    /* Define combinations of the above bits for the standard possibilities.
+-       (The [[[ comments delimit what gets put into the Texinfo file, so
+-       don't delete them!)  */
+-    /* [[[begin syntaxes]]] */
+-#define RE_SYNTAX_EMACS 0
+-
+-#define RE_SYNTAX_AWK							\
+-  (RE_BACKSLASH_ESCAPE_IN_LISTS | RE_DOT_NOT_NULL			\
+-   | RE_NO_BK_PARENS            | RE_NO_BK_REFS				\
+-   | RE_NO_BK_VBAR               | RE_NO_EMPTY_RANGES			\
+-   | RE_UNMATCHED_RIGHT_PAREN_ORD)
+-
+-#define RE_SYNTAX_POSIX_AWK 						\
+-  (RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS)
+-
+-#define RE_SYNTAX_GREP							\
+-  (RE_BK_PLUS_QM              | RE_CHAR_CLASSES				\
+-   | RE_HAT_LISTS_NOT_NEWLINE | RE_INTERVALS				\
+-   | RE_NEWLINE_ALT)
+-
+-#define RE_SYNTAX_EGREP							\
+-  (RE_CHAR_CLASSES        | RE_CONTEXT_INDEP_ANCHORS			\
+-   | RE_CONTEXT_INDEP_OPS | RE_HAT_LISTS_NOT_NEWLINE			\
+-   | RE_NEWLINE_ALT       | RE_NO_BK_PARENS				\
+-   | RE_NO_BK_VBAR)
+-
+-#define RE_SYNTAX_POSIX_EGREP						\
+-  (RE_SYNTAX_EGREP | RE_INTERVALS | RE_NO_BK_BRACES)
+-
+-    /* P1003.2/D11.2, section 4.20.7.1, lines 5078ff.  */
+-#define RE_SYNTAX_ED RE_SYNTAX_POSIX_BASIC
+-
+-#define RE_SYNTAX_SED RE_SYNTAX_POSIX_BASIC
+-
+-    /* Syntax bits common to both basic and extended POSIX regex syntax.  */
+-#define _RE_SYNTAX_POSIX_COMMON						\
+-  (RE_CHAR_CLASSES | RE_DOT_NEWLINE      | RE_DOT_NOT_NULL		\
+-   | RE_INTERVALS  | RE_NO_EMPTY_RANGES)
+-
+-#define RE_SYNTAX_POSIX_BASIC						\
+-  (_RE_SYNTAX_POSIX_COMMON | RE_BK_PLUS_QM)
+-
+-    /* Differs from ..._POSIX_BASIC only in that RE_BK_PLUS_QM becomes
+-       RE_LIMITED_OPS, i.e., \? \+ \| are not recognized.  Actually, this
+-       isn't minimal, since other operators, such as \`, aren't disabled.  */
+-#define RE_SYNTAX_POSIX_MINIMAL_BASIC					\
+-  (_RE_SYNTAX_POSIX_COMMON | RE_LIMITED_OPS)
+-
+-#define RE_SYNTAX_POSIX_EXTENDED					\
+-  (_RE_SYNTAX_POSIX_COMMON | RE_CONTEXT_INDEP_ANCHORS			\
+-   | RE_CONTEXT_INDEP_OPS  | RE_NO_BK_BRACES				\
+-   | RE_NO_BK_PARENS       | RE_NO_BK_VBAR				\
+-   | RE_UNMATCHED_RIGHT_PAREN_ORD)
+-
+-    /* Differs from ..._POSIX_EXTENDED in that RE_CONTEXT_INVALID_OPS
+-       replaces RE_CONTEXT_INDEP_OPS and RE_NO_BK_REFS is added.  */
+-#define RE_SYNTAX_POSIX_MINIMAL_EXTENDED				\
+-  (_RE_SYNTAX_POSIX_COMMON  | RE_CONTEXT_INDEP_ANCHORS			\
+-   | RE_CONTEXT_INVALID_OPS | RE_NO_BK_BRACES				\
+-   | RE_NO_BK_PARENS        | RE_NO_BK_REFS				\
+-   | RE_NO_BK_VBAR	    | RE_UNMATCHED_RIGHT_PAREN_ORD)
+-    /* [[[end syntaxes]]] */
+-    
+-    /* Maximum number of duplicates an interval can allow.  Some systems
+-       (erroneously) define this in other header files, but we want our
+-       value, so remove any previous define.  */
+-#ifdef RE_DUP_MAX
+-#undef RE_DUP_MAX
+-#endif
+-#define RE_DUP_MAX ((1 << 15) - 1)
+-
+-
+-    /* POSIX `cflags' bits (i.e., information for `regcomp').  */
+-
+-    /* If this bit is set, then use extended regular expression syntax.
+-       If not set, then use basic regular expression syntax.  */
+-#define REG_EXTENDED 1
+-
+-    /* If this bit is set, then ignore case when matching.
+-       If not set, then case is significant.  */
+-#define REG_ICASE (REG_EXTENDED << 1)
+-
+-    /* If this bit is set, then anchors do not match at newline
+-         characters in the string.
+-       If not set, then anchors do match at newlines.  */
+-#define REG_NEWLINE (REG_ICASE << 1)
+-
+-    /* If this bit is set, then report only success or fail in regexec.
+-       If not set, then returns differ between not matching and errors.  */
+-#define REG_NOSUB (REG_NEWLINE << 1)
+-
+-
+-    /* POSIX `eflags' bits (i.e., information for regexec).  */
+-
+-    /* If this bit is set, then the beginning-of-line operator doesn't match
+-         the beginning of the string (presumably because it's not the
+-         beginning of a line).
+-       If not set, then the beginning-of-line operator does match the
+-         beginning of the string.  */
+-#define REG_NOTBOL 1
+-
+-    /* Like REG_NOTBOL, except for the end-of-line.  */
+-#define REG_NOTEOL (1 << 1)
+-
+-
+-    /* If any error codes are removed, changed, or added, update the
+-       `re_error_msg' table in regex.c.  */
+-    typedef enum {
+-        REG_NOERROR = 0, 	/* Success.  */
+-        REG_NOMATCH, 		/* Didn't find a match (for regexec).  */
+-
+-        /* POSIX regcomp return error codes.  (In the order listed in the
+-           standard.)  */
+-        REG_BADPAT, 		/* Invalid pattern.  */
+-        REG_ECOLLATE, 		/* Not implemented.  */
+-        REG_ECTYPE, 		/* Invalid character class name.  */
+-        REG_EESCAPE, 		/* Trailing backslash.  */
+-        REG_ESUBREG, 		/* Invalid back reference.  */
+-        REG_EBRACK, 		/* Unmatched left bracket.  */
+-        REG_EPAREN, 		/* Parenthesis imbalance.  */
+-        REG_EBRACE, 		/* Unmatched \{.  */
+-        REG_BADBR, 		/* Invalid contents of \{\}.  */
+-        REG_ERANGE, 		/* Invalid range end.  */
+-        REG_ESPACE, 		/* Ran out of memory.  */
+-        REG_BADRPT, 		/* No preceding re for repetition op.  */
+-
+-        /* Error codes we've added.  */
+-        REG_EEND, 		/* Premature end.  */
+-        REG_ESIZE, 		/* Compiled pattern bigger than 2^16 bytes.  */
+-        REG_ERPAREN		/* Unmatched ) or \); not returned from regcomp.  */
+-    }
+-    reg_errcode_t;
+-    
+-    /* This data structure represents a compiled pattern.  Before calling
+-       the pattern compiler, the fields `buffer', `allocated', `fastmap',
+-       `translate', and `no_sub' can be set.  After the pattern has been
+-       compiled, the `re_nsub' field is available.  All other fields are
+-       private to the regex routines.  */
+-
+-    struct re_pattern_buffer {
+-        /* [[[begin pattern_buffer]]] */
+-        /* Space that holds the compiled pattern.  It is declared as
+-                 `unsigned char *' because its elements are
+-                  sometimes used as array indexes.  */
+-        unsigned char *buffer;
+-
+-        /* Number of bytes to which `buffer' points.  */
+-        unsigned long allocated;
+-
+-        /* Number of bytes actually used in `buffer'.  */
+-        unsigned long used;
+-
+-        /* Syntax setting with which the pattern was compiled.  */
+-        reg_syntax_t syntax;
+-
+-        /* Pointer to a fastmap, if any, otherwise zero.  re_search uses
+-           the fastmap, if there is one, to skip over impossible
+-           starting points for matches.  */
+-        char *fastmap;
+-
+-        /* Either a translate table to apply to all characters before
+-           comparing them, or zero for no translation.  The translation
+-           is applied to a pattern when it is compiled and to a string
+-           when it is matched.  */
+-        char *translate;
+-
+-        /* Number of subexpressions found by the compiler.  */
+-        size_t re_nsub;
+-
+-        /* Zero if this pattern cannot match the empty string, one else.
+-           Well, in truth it's used only in `re_search_2', to see
+-           whether or not we should use the fastmap, so we don't set
+-           this absolutely perfectly; see `re_compile_fastmap' (the
+-           `duplicate' case).  */
+-unsigned can_be_null :
+-        1;
+-
+-        /* If REGS_UNALLOCATED, allocate space in the `regs' structure
+-             for `max (RE_NREGS, re_nsub + 1)' groups.
+-           If REGS_REALLOCATE, reallocate space if necessary.
+-           If REGS_FIXED, use what's there.  */
+-#define REGS_UNALLOCATED 0
+-#define REGS_REALLOCATE 1
+-#define REGS_FIXED 2
+-
+-unsigned regs_allocated :
+-        2;
+-
+-        /* Set to zero when `regex_compile' compiles a pattern; set to one
+-           by `re_compile_fastmap' if it updates the fastmap.  */
+-unsigned fastmap_accurate :
+-        1;
+-
+-        /* If set, `re_match_2' does not return information about
+-           subexpressions.  */
+-unsigned no_sub :
+-        1;
+-
+-        /* If set, a beginning-of-line anchor doesn't match at the
+-           beginning of the string.  */
+-unsigned not_bol :
+-        1;
+-
+-        /* Similarly for an end-of-line anchor.  */
+-unsigned not_eol :
+-        1;
+-
+-        /* If true, an anchor at a newline matches.  */
+-unsigned newline_anchor :
+-        1;
+-
+-        /* [[[end pattern_buffer]]] */
+-    };
+-
+-    typedef struct re_pattern_buffer regex_t;
+-
+-
+-    /* search.c (search_buffer) in Emacs needs this one opcode value.  It is
+-       defined both in `regex.c' and here.  */
+-#define RE_EXACTN_VALUE 1
+-    
+-    /* Type for byte offsets within the string.  POSIX mandates this.  */
+-    typedef int regoff_t;
+-
+-
+-    /* This is the structure we store register match data in.  See
+-       regex.texinfo for a full description of what registers match.  */
+-    struct re_registers {
+-        unsigned num_regs;
+-        regoff_t *start;
+-        regoff_t *end;
+-    };
+-
+-
+-    /* If `regs_allocated' is REGS_UNALLOCATED in the pattern buffer,
+-       `re_match_2' returns information about at least this many registers
+-       the first time a `regs' structure is passed.  */
+-#ifndef RE_NREGS
+-#define RE_NREGS 30
+-#endif
+-
+-
+-    /* POSIX specification for registers.  Aside from the different names than
+-       `re_registers', POSIX uses an array of structures, instead of a
+-       structure of arrays.  */
+-    typedef struct {
+-        regoff_t rm_so;  /* Byte offset from string's start to substring's start.  */
+-        regoff_t rm_eo;  /* Byte offset from string's start to substring's end.  */
+-    }
+-    regmatch_t;
+-    
+-    /* Declarations for routines.  */
+-
+-    /* To avoid duplicating every routine declaration -- once with a
+-       prototype (if we are ANSI), and once without (if we aren't) -- we
+-       use the following macro to declare argument types.  This
+-       unfortunately clutters up the declarations a bit, but I think it's
+-       worth it.  */
+-
+-#if __STDC__
+-
+-#define _RE_ARGS(args) args
+-
+-#else /* not __STDC__ */
+-
+-#define _RE_ARGS(args) ()
+-
+-#endif /* not __STDC__ */
+-
+-    /* Sets the current default syntax to SYNTAX, and return the old syntax.
+-       You can also simply assign to the `re_syntax_options' variable.  */
+-    extern reg_syntax_t re_set_syntax _RE_ARGS ((reg_syntax_t syntax));
+-
+-    /* Compile the regular expression PATTERN, with length LENGTH
+-       and syntax given by the global `re_syntax_options', into the buffer
+-       BUFFER.  Return NULL if successful, and an error string if not.  */
+-    extern const char *re_compile_pattern
+-        _RE_ARGS ((const char *pattern, int length,
+-                   struct re_pattern_buffer *buffer));
+-
+-
+-    /* Compile a fastmap for the compiled pattern in BUFFER; used to
+-       accelerate searches.  Return 0 if successful and -2 if was an
+-       internal error.  */
+-    extern int re_compile_fastmap _RE_ARGS ((struct re_pattern_buffer *buffer));
+-
+-
+-    /* Search in the string STRING (with length LENGTH) for the pattern
+-       compiled into BUFFER.  Start searching at position START, for RANGE
+-       characters.  Return the starting position of the match, -1 for no
+-       match, or -2 for an internal error.  Also return register
+-       information in REGS (if REGS and BUFFER->no_sub are nonzero).  */
+-    extern int re_search
+-        _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string,
+-                   int length, int start, int range, struct re_registers *regs));
+-
+-
+-    /* Like `re_search', but search in the concatenation of STRING1 and
+-       STRING2.  Also, stop searching at index START + STOP.  */
+-    extern int re_search_2
+-        _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string1,
+-                   int length1, const char *string2, int length2,
+-                   int start, int range, struct re_registers *regs, int stop));
+-
+-
+-    /* Like `re_search', but return how many characters in STRING the regexp
+-       in BUFFER matched, starting at position START.  */
+-    extern int re_match
+-        _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string,
+-                   int length, int start, struct re_registers *regs));
+-
+-
+-    /* Relates to `re_match' as `re_search_2' relates to `re_search'.  */
+-    extern int re_match_2
+-        _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string1,
+-                   int length1, const char *string2, int length2,
+-                   int start, struct re_registers *regs, int stop));
+-
+-
+-    /* Set REGS to hold NUM_REGS registers, storing them in STARTS and
+-       ENDS.  Subsequent matches using BUFFER and REGS will use this memory
+-       for recording register information.  STARTS and ENDS must be
+-       allocated with malloc, and must each be at least `NUM_REGS * sizeof
+-       (regoff_t)' bytes long.
+-     
+-       If NUM_REGS == 0, then subsequent matches should allocate their own
+-       register data.
+-     
+-       Unless this function is called, the first search or match using
+-       PATTERN_BUFFER will allocate its own register data, without
+-       freeing the old data.  */
+-    extern void re_set_registers
+-        _RE_ARGS ((struct re_pattern_buffer *buffer, struct re_registers *regs,
+-                   unsigned num_regs, regoff_t *starts, regoff_t *ends));
+-
+-    /* 4.2 bsd compatibility.  */
+-    extern char *re_comp _RE_ARGS ((const char *));
+-    extern int re_exec _RE_ARGS ((const char *));
+-
+-    /* POSIX compatibility.  */
+-    extern int regcomp _RE_ARGS ((regex_t *preg, const char *pattern, int cflags));
+-    extern int regexec
+-        _RE_ARGS ((const regex_t *preg, const char *string, size_t nmatch,
+-                   regmatch_t pmatch[], int eflags));
+-    extern size_t regerror
+-        _RE_ARGS ((int errcode, const regex_t *preg, char *errbuf,
+-                   size_t errbuf_size));
+-    extern void regfree _RE_ARGS ((regex_t *preg));
+-
+-#endif /* not __REGEXP_LIBRARY_H__ */
+-
+-#ifdef __cplusplus
+-}
+-#endif
+-
+-
+-/*
+-Local variables:
+-make-backup-files: t
+-version-control: t
+-trim-versions-without-asking: nil
+-End:
+-*/
+--- a/windows/resource.rc
++++ b/windows/resource.rc
+@@ -14,8 +14,8 @@
+ 
+ #ifndef _MAC
+ VS_VERSION_INFO VERSIONINFO
+- FILEVERSION 1,9,5,0
+- PRODUCTVERSION 1,9,5,0
++ FILEVERSION 1,9,6,0
++ PRODUCTVERSION 1,9,6,0
+  FILEFLAGSMASK 0x3fL
+ #ifdef _DEBUG
+  FILEFLAGS 0x1L
+@@ -33,14 +33,14 @@
+             VALUE "Comments", "\0"
+             VALUE "CompanyName", "Grame\0"
+             VALUE "FileDescription", "Jackmp for Windows\0"
+-            VALUE "FileVersion", "1, 9, 5, 0\0"
++            VALUE "FileVersion", "1, 9, 6, 0\0"
+             VALUE "InternalName", "libjackmp\0"
+-            VALUE "LegalCopyright", "Copyright Grame © 2006-2009\0"
++            VALUE "LegalCopyright", "Copyright Grame © 2006-2010\0"
+             VALUE "LegalTrademarks", "\0"
+             VALUE "OriginalFilename", "libjackmp.dll\0"
+             VALUE "PrivateBuild", "\0"
+             VALUE "ProductName", "libjackmp\0"
+-            VALUE "ProductVersion", "1, 9, 5, 0\0"
++            VALUE "ProductVersion", "1, 9, 6, 0\0"
+             VALUE "SpecialBuild", "\0"
+         END
+     END
+--- a/wscript
++++ b/wscript
+@@ -11,7 +11,7 @@
+ import re
+ import Logs
+ 
+-VERSION='1.9.5'
++VERSION='1.9.6'
+ APPNAME='jack'
+ JACK_API_VERSION = '0.1.0'
+ 
+@@ -69,7 +69,10 @@
+     opt.add_option('--mixed', action='store_true', default=False, help='Build with 32/64 bits mixed mode')
+     opt.add_option('--clients', default=64, type="int", dest="clients", help='Maximum number of JACK clients')
+     opt.add_option('--ports-per-application', default=768, type="int", dest="application_ports", help='Maximum number of ports per application')
+-    opt.add_option('--debug', action='store_true', default=False, dest='debug', help="Build debuggable binaries")
++    opt.add_option('--debug', action='store_true', default=False, dest='debug', help='Build debuggable binaries')
++    opt.add_option('--firewire', action='store_true', default=False, help='Enable FireWire driver (FFADO)')
++    opt.add_option('--freebob', action='store_true', default=False, help='Enable FreeBob driver')
++    opt.add_option('--alsa', action='store_true', default=False, help='Enable ALSA driver')
+     opt.sub_options('dbus')
+ 
+ def configure(conf):
+@@ -110,6 +113,15 @@
+     conf.sub_config('common')
+     if conf.env['IS_LINUX']:
+         conf.sub_config('linux')
++        if Options.options.alsa and not conf.env['BUILD_DRIVER_ALSA']:
++            conf.fatal('ALSA driver was explicitly requested but cannot be built')
++        if Options.options.freebob and not conf.env['BUILD_DRIVER_FREEBOB']:
++            conf.fatal('FreeBob driver was explicitly requested but cannot be built')
++        if Options.options.firewire and not conf.env['BUILD_DRIVER_FFADO']:
++            conf.fatal('FFADO driver was explicitly requested but cannot be built')
++        conf.env['BUILD_DRIVER_ALSA'] = Options.options.alsa
++        conf.env['BUILD_DRIVER_FFADO'] = Options.options.firewire
++        conf.env['BUILD_DRIVER_FREEBOB'] = Options.options.freebob
+     if Options.options.dbus:
+         conf.sub_config('dbus')
+         if conf.env['BUILD_JACKDBUS'] != True:
diff --git a/debian/patches/series b/debian/patches/series
index ab7587e..79377fe 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -1,3 +1,4 @@
+0000_sync_upstream_VCS.patch
 0001_jackrec-rename.patch
 0002_manpages.patch
 1001_connect.patch

-- 
Debian packaging for jack-audio-connection-kit



More information about the pkg-multimedia-commits mailing list