Improve JACK regex pattern escape code (see ticket #534). Improves previously merged PR #405 master commit eec7bb7 by performing string conversion directly in to the target buffer, thus avoiding one allocation and one strncpy per client/device name. (#536)

diff --git a/src/hostapi/jack/pa_jack.c b/src/hostapi/jack/pa_jack.c
index 88926f4..124c0f8 100644
--- a/src/hostapi/jack/pa_jack.c
+++ b/src/hostapi/jack/pa_jack.c
@@ -506,7 +506,6 @@
     const char **jack_ports = NULL;
     char **client_names = NULL;
     char *port_regex_string = NULL;
-    char *device_name_regex_escaped = NULL;
     // In the worst case scenario, every character would be escaped, doubling the string size.
     // Add 1 for null terminator.
     size_t device_name_regex_escaped_size = jack_client_name_size() * 2 + 1;
@@ -529,8 +528,6 @@
     PaUtil_FreeAllAllocations( jackApi->deviceInfoMemory );
 
     port_regex_string = PaUtil_GroupAllocateMemory( jackApi->deviceInfoMemory, port_regex_size );
-    device_name_regex_escaped = PaUtil_GroupAllocateMemory(
-        jackApi->deviceInfoMemory, device_name_regex_escaped_size );
     tmp_client_name = PaUtil_GroupAllocateMemory( jackApi->deviceInfoMemory, jack_client_name_size() );
 
     /* We can only retrieve the list of clients indirectly, by first
@@ -625,10 +622,9 @@
 
         /* To determine how many input and output channels are available,
          * we re-query jackd with more specific parameters. */
-        copy_string_and_escape_regex_chars( device_name_regex_escaped,
+        copy_string_and_escape_regex_chars( port_regex_string,
                             client_names[client_index],
                             device_name_regex_escaped_size );
-        strncpy( port_regex_string, device_name_regex_escaped, port_regex_size );
         strncat( port_regex_string, port_regex_suffix, port_regex_size );
 
         /* ... what are your output ports (that we could input from)? */
@@ -1131,10 +1127,8 @@
     char *port_string = PaUtil_GroupAllocateMemory( jackHostApi->deviceInfoMemory, jack_port_name_size() );
     // In the worst case every character would be escaped which would double the string length.
     // Add 1 for null terminator
-    size_t regex_escaped_client_name_length = jack_client_name_size() * 2 + 1;
-    char *regex_escaped_client_name = PaUtil_GroupAllocateMemory(
-        jackHostApi->deviceInfoMemory, regex_escaped_client_name_length );
-    unsigned long regex_size = jack_client_name_size() * 2 + 1 + strlen(port_regex_suffix);
+    size_t regex_escaped_client_name_size = jack_client_name_size() * 2 + 1;
+    unsigned long regex_size = regex_escaped_client_name_size + strlen(port_regex_suffix);
     char *regex_pattern = PaUtil_GroupAllocateMemory( jackHostApi->deviceInfoMemory, regex_size );
     const char **jack_ports = NULL;
     /* int jack_max_buffer_size = jack_get_buffer_size( jackHostApi->jack_client ); */
@@ -1293,10 +1287,9 @@
         int err = 0;
 
         /* Get output ports of our capture device */
-        copy_string_and_escape_regex_chars( regex_escaped_client_name,
+        copy_string_and_escape_regex_chars( regex_pattern,
                  hostApi->deviceInfos[ inputParameters->device ]->name,
-                 regex_escaped_client_name_length );
-        strncpy( regex_pattern, regex_escaped_client_name, regex_size );
+                 regex_escaped_client_name_size );
         strncat( regex_pattern, port_regex_suffix, regex_size );
         UNLESS( jack_ports = jack_get_ports( jackHostApi->jack_client, regex_pattern,
                                      JACK_PORT_TYPE_FILTER, JackPortIsOutput ), paUnanticipatedHostError );
@@ -1321,10 +1314,9 @@
         int err = 0;
 
         /* Get input ports of our playback device */
-        copy_string_and_escape_regex_chars( regex_escaped_client_name,
+        copy_string_and_escape_regex_chars( regex_pattern,
                  hostApi->deviceInfos[ outputParameters->device ]->name,
-                 regex_escaped_client_name_length );
-        strncpy( regex_pattern, regex_escaped_client_name, regex_size );
+                 regex_escaped_client_name_size );
         strncat( regex_pattern, port_regex_suffix, regex_size );
         UNLESS( jack_ports = jack_get_ports( jackHostApi->jack_client, regex_pattern,
                                      JACK_PORT_TYPE_FILTER, JackPortIsInput ), paUnanticipatedHostError );