summaryrefslogtreecommitdiff
path: root/backport-PCRE2.patch
blob: 8cd84f28cf337ddd8eecb81e9e5443fd869c0588 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
From 15515f390c5e3316a7faf0cf85d661a297d45a50 Mon Sep 17 00:00:00 2001
From: Julien Schueller <schueller@phimeca.com>
Date: Tue, 4 Jan 2022 13:50:02 +0100
Subject: [PATCH] PCRE2

Closes #2120
---
 Doc/Manual/Preface.html     |  6 +++---
 Source/Swig/misc.c          | 41 +++++++++++++++++++++++++++--------------
 Source/Swig/naming.c        | 22 ++++++++++++++--------
 Tools/mkwindows.sh          |  2 +-
 Tools/nuget-install.cmd     | 28 ----------------------------
 Tools/pcre-build.sh         |  4 ++--
 configure.ac                | 19 ++++++++++---------
 7 files changed, 60 insertions(+), 65 deletions(-)
 delete mode 100644 Tools/nuget-install.cmd

diff --git a/Doc/Manual/Preface.html b/Doc/Manual/Preface.html
index 36a99bd..24e844c 100644
--- a/Doc/Manual/Preface.html
+++ b/Doc/Manual/Preface.html
@@ -283,9 +283,9 @@ You must use <a href="http://www.gnu.org/software/make/">GNU make</a> to build a
 <p>
 <a href="http://www.pcre.org/">PCRE</a>
 needs to be installed on your system to build SWIG, in particular
-pcre-config must be available. If you have PCRE headers and libraries but not
-pcre-config itself or, alternatively, wish to override the compiler or linker
-flags returned by pcre-config, you may set PCRE_LIBS and PCRE_CFLAGS variables
+pcre2-config must be available. If you have PCRE headers and libraries but not
+pcre2-config itself or, alternatively, wish to override the compiler or linker
+flags returned by pcre-config, you may set PCRE2_LIBS and PCRE2_CFLAGS variables
 to be used instead. And if you don't have PCRE at all, the configure script
 will provide instructions for obtaining it.
 </p>
 
diff --git a/Source/Swig/misc.c b/Source/Swig/misc.c
index ef6fcc0..1324f4d 100644
--- a/Source/Swig/misc.c
+++ b/Source/Swig/misc.c
@@ -1312,7 +1312,8 @@ void Swig_offset_string(String *s, int number) {
 
 
 #ifdef HAVE_PCRE
-#include <pcre.h>
+#define PCRE2_CODE_UNIT_WIDTH 8
+#include <pcre2.h>
 
 static int split_regex_pattern_subst(String *s, String **pattern, String **subst, const char **input)
 {
@@ -1375,7 +1376,7 @@ static void copy_with_maybe_case_conversion(String *dst, const char *src, int le
   }
 }
 
-String *replace_captures(int num_captures, const char *input, String *subst, int captures[], String *pattern, String *s)
+String *replace_captures(int num_captures, const char *input, String *subst, size_t captures[], String *pattern, String *s)
 {
   int convertCase = 0, convertNextOnly = 0;
   String *result = NewStringEmpty();
@@ -1397,7 +1398,7 @@ String *replace_captures(int num_captures, const char *input, String *subst, int
     } else if (isdigit((unsigned char)*p)) {
       int group = *p++ - '0';
       if (group < num_captures) {
-	int l = captures[group*2], r = captures[group*2 + 1];
+	int l = (int)captures[group*2], r = (int)captures[group*2 + 1];
 	if (l != -1) {
 	  copy_with_maybe_case_conversion(result, input + l, r - l, &convertCase, convertNextOnly);
 	}
@@ -1449,26 +1450,31 @@ String *Swig_string_regex(String *s) {
   const int pcre_options = 0;
 
   String *res = 0;
-  pcre *compiled_pat = 0;
-  const char *pcre_error, *input;
-  int pcre_errorpos;
+  pcre2_code *compiled_pat = 0;
+  const char *input;
+  PCRE2_UCHAR pcre_error[256];
+  int pcre_errornum;
+  size_t pcre_errorpos;
   String *pattern = 0, *subst = 0;
-  int captures[30];
-
+  size_t *captures = 0;
+  pcre2_match_data *match_data = 0;
   if (split_regex_pattern_subst(s, &pattern, &subst, &input)) {
     int rc;
 
-    compiled_pat = pcre_compile(
-          Char(pattern), pcre_options, &pcre_error, &pcre_errorpos, NULL);
+    compiled_pat = pcre2_compile(
+          (PCRE2_SPTR8)Char(pattern), PCRE2_ZERO_TERMINATED, pcre_options, &pcre_errornum, &pcre_errorpos, NULL);
     if (!compiled_pat) {
+      pcre2_get_error_message (pcre_errornum, pcre_error, sizeof pcre_error);
       Swig_error("SWIG", Getline(s), "PCRE compilation failed: '%s' in '%s':%i.\n",
           pcre_error, Char(pattern), pcre_errorpos);
       SWIG_exit(EXIT_FAILURE);
     }
-    rc = pcre_exec(compiled_pat, NULL, input, (int)strlen(input), 0, 0, captures, 30);
+    match_data = pcre2_match_data_create_from_pattern (compiled_pat, NULL);
+    rc = pcre2_match(compiled_pat, (PCRE2_SPTR8)input, PCRE2_ZERO_TERMINATED, 0, 0, match_data, NULL);
+    captures = pcre2_get_ovector_pointer (match_data);
     if (rc >= 0) {
       res = replace_captures(rc, input, subst, captures, pattern, s);
-    } else if (rc != PCRE_ERROR_NOMATCH) {
+    } else if (rc != PCRE2_ERROR_NOMATCH) {
       Swig_error("SWIG", Getline(s), "PCRE execution failed: error %d while matching \"%s\" using \"%s\".\n",
 	rc, Char(pattern), input);
       SWIG_exit(EXIT_FAILURE);
@@ -1477,12 +1483,19 @@ String *Swig_string_regex(String *s) {
 
   DohDelete(pattern);
   DohDelete(subst);
-  pcre_free(compiled_pat);
+  pcre2_code_free(compiled_pat);
+  pcre2_match_data_free(match_data);
   return res ? res : NewStringEmpty();
 }
 
 String *Swig_pcre_version(void) {
-  return NewStringf("PCRE Version: %s", pcre_version());
+  int len = pcre2_config(PCRE2_CONFIG_VERSION, NULL);
+  char *buf = malloc(len);
+  String *result;
+  pcre2_config(PCRE2_CONFIG_VERSION, buf);
+  result = NewStringf("PCRE Version: %s", buf);
+  free(buf);
+  return result;
 }
 
 #else
diff --git a/Source/Swig/naming.c b/Source/Swig/naming.c
index 871a9e5..a1a0381 100644
--- a/Source/Swig/naming.c
+++ b/Source/Swig/naming.c
@@ -1092,26 +1092,32 @@ static DOH *get_lattr(Node *n, List *lattr) {
 }
 
 #ifdef HAVE_PCRE
-#include <pcre.h>
+#define PCRE2_CODE_UNIT_WIDTH 8
+#include <pcre2.h>
 
 static int name_regexmatch_value(Node *n, String *pattern, String *s) {
-  pcre *compiled_pat;
-  const char *err;
-  int errpos;
+  pcre2_code *compiled_pat;
+  PCRE2_UCHAR err[256];
+  int errornum;
+  size_t errpos;
   int rc;
 
-  compiled_pat = pcre_compile(Char(pattern), 0, &err, &errpos, NULL);
+  compiled_pat = pcre2_compile((PCRE2_SPTR8)Char(pattern), PCRE2_ZERO_TERMINATED, 0, &errornum, &errpos, NULL);
   if (!compiled_pat) {
+    pcre2_get_error_message (errornum, err, sizeof err);
     Swig_error("SWIG", Getline(n),
                "Invalid regex \"%s\": compilation failed at %d: %s\n",
                Char(pattern), errpos, err);
     SWIG_exit(EXIT_FAILURE);
   }
 
-  rc = pcre_exec(compiled_pat, NULL, Char(s), Len(s), 0, 0, NULL, 0);
-  pcre_free(compiled_pat);
+  pcre2_match_data *match_data = 0;
+  match_data = pcre2_match_data_create_from_pattern (compiled_pat, NULL);
+  rc = pcre2_match(compiled_pat, (PCRE2_SPTR8)Char(s), PCRE2_ZERO_TERMINATED, 0, 0, match_data, 0);
+  pcre2_code_free(compiled_pat);
+  pcre2_match_data_free(match_data);
 
-  if (rc == PCRE_ERROR_NOMATCH)
+  if (rc == PCRE2_ERROR_NOMATCH)
     return 0;
 
   if (rc < 0 ) {
diff --git a/Tools/mkwindows.sh b/Tools/mkwindows.sh
index 5e4d2f0..4717e1c 100755
--- a/Tools/mkwindows.sh
+++ b/Tools/mkwindows.sh
@@ -84,7 +84,7 @@ export CXXFLAGS="$compileflags"
 swigbasename=swig-$version
 swigwinbasename=swigwin-$version
 tarball=$swigbasename.tar.gz
-pcre_tarball=`ls pcre-*.tar.*`
+pcre_tarball=`ls pcre2-*.tar.*`
 
 if ! test -f "$pcre_tarball"; then
   echo "Could not find PCRE tarball. Please download a PCRE source tarball from http://www.pcre.org"
diff --git a/Tools/nuget-install.cmd b/Tools/nuget-install.cmd
deleted file mode 100644
index eec7f87..0000000
--- a/Tools/nuget-install.cmd
+++ /dev/null
@@ -1,28 +0,0 @@
-rem Workaround 'nuget install' not being reliable by retrying a few times
-@echo off
-rem initiate the retry number
-set errorCode=1
-set retryNumber=0
-set maxRetries=5
-
-:RESTORE
-nuget install %*
-
-rem problem?
-IF ERRORLEVEL %errorCode% GOTO :RETRY
-
-rem everything is fine!
-@echo Installed nuget, retries: %reTryNumber%
-GOTO :EXIT
-
-:RETRY
-@echo Oops, nuget restore exited with code %errorCode% - let us try again!
-set /a retryNumber=%retryNumber%+1
-IF %reTryNumber% LSS %maxRetries% (GOTO :RESTORE)
-IF %retryNumber% EQU %maxRetries% (GOTO :ERR)
-
-:ERR
-@echo Sorry, we tried restoring nuget packages for %maxRetries% times and all attempts were unsuccessful!
-EXIT /B 1
-
-:EXIT
diff --git a/Tools/pcre-build.sh b/Tools/pcre-build.sh
index 92f645d..ffa7a69 100755
--- a/Tools/pcre-build.sh
+++ b/Tools/pcre-build.sh
@@ -37,8 +37,8 @@ fi
 
 echo "Looking for PCRE tarball..."
 rm -rf pcre
-pcre_tarball=`ls pcre-*.tar*`
-test -n "$pcre_tarball" || bail "Could not find tarball matching pattern: pcre-*.tar*"
+pcre_tarball=`ls pcre2-*.tar*`
+test -n "$pcre_tarball" || bail "Could not find tarball matching pattern: pcre2-*.tar*"
 test -f "$pcre_tarball" || bail "Could not find a single PCRE tarball. Found: $pcre_tarball"
 
 echo "Extracting tarball: $pcre_tarball"

diff --git a/configure.ac b/configure.ac
index ed83620..c5ae9fc 100644
--- a/configure.ac
+++ b/configure.ac
@@ -59,24 +59,24 @@ dnl To make configuring easier, check for a locally built PCRE using the Tools/p
 if test x"${with_pcre}" = xyes ; then
   AC_MSG_CHECKING([whether to use local PCRE])
   local_pcre_config=no
-  if test -z $PCRE_CONFIG; then
-    if test -f `pwd`/pcre/pcre-swig-install/bin/pcre-config; then
-      PCRE_CONFIG=`pwd`/pcre/pcre-swig-install/bin/pcre-config
-      local_pcre_config=$PCRE_CONFIG
+  if test -z $PCRE2_CONFIG; then
+    if test -f `pwd`/pcre/pcre-swig-install/bin/pcre2-config; then
+      PCRE2_CONFIG=`pwd`/pcre/pcre-swig-install/bin/pcre2-config
+      local_pcre_config=$PCRE2_CONFIG
     fi
   fi
   AC_MSG_RESULT([$local_pcre_config])
 fi
 AS_IF([test "x$with_pcre" != xno],
-  [AX_PATH_GENERIC([pcre],
+  [AX_PATH_GENERIC([pcre2],
     [], dnl Minimal version of PCRE we need -- accept any
     [], dnl custom sed script for version parsing is not needed
     [AC_DEFINE([HAVE_PCRE], [1], [Define if you have PCRE library])
-     LIBS="$LIBS $PCRE_LIBS"
-     CPPFLAGS="$CPPFLAGS $PCRE_CFLAGS"
+     LIBS="$LIBS $PCRE2_LIBS"
+     CPPFLAGS="$CPPFLAGS $PCRE2_CFLAGS"
     ],
     [AC_MSG_FAILURE([
-        Cannot find pcre-config script from PCRE (Perl Compatible Regular Expressions)
+        Cannot find pcre2-config script from PCRE (Perl Compatible Regular Expressions)
         library package. This dependency is needed for configure to complete,
         Either:
         - Install the PCRE developer package on your system (preferred approach).
@@ -87,7 +87,8 @@ AS_IF([test "x$with_pcre" != xno],
           (quite easy and does not require privileges to install PCRE on your system)
         - Use configure --without-pcre to disable regular expressions support in SWIG
           (not recommended).])
-    ])
+    ],
+    [],[],[--libs8])
   ])
 
 
-- 
1.8.3.1