[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 ? ®s : (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