File gambas2-pcre2.patch of Package gambas2
diff -Naru gambas2-2.24.0_orig/gb.pcre/configure.ac gambas2-2.24.0/gb.pcre/configure.ac
--- gambas2-2.24.0_orig/gb.pcre/configure.ac 2012-04-09 03:34:47.000000000 +0900
+++ gambas2-2.24.0/gb.pcre/configure.ac 2025-04-27 15:03:58.965003377 +0900
@@ -10,9 +10,9 @@
PCRE,
[Perl Compatible Regular Expression component],
[src],
- [GB_FIND(pcre.h, /usr/local/lib /usr/local /usr/lib /usr, include)],
- [GB_FIND(libpcre.$SHLIBEXT, /usr/local /usr /, lib)],
- [-lpcre])
+ [GB_FIND(pcre2.h, /usr/local/lib /usr/local /usr/lib /usr, include)],
+ [GB_FIND(libpcre2-8.$SHLIBEXT, /usr/local /usr /, lib)],
+ [-lpcre2-8])
AC_OUTPUT( \
Makefile \
diff -Naru gambas2-2.24.0_orig/gb.pcre/src/regexp.c gambas2-2.24.0/gb.pcre/src/regexp.c
--- gambas2-2.24.0_orig/gb.pcre/src/regexp.c 2012-04-09 03:34:47.000000000 +0900
+++ gambas2-2.24.0/gb.pcre/src/regexp.c 2025-04-27 14:58:15.822518959 +0900
@@ -57,8 +57,8 @@
BEGIN_METHOD_VOID(CREGEXP_private_compile)
// fprintf(stderr, "debug 21\n");
- int errptr;
- const char *errstr;
+ int errcode;
+ PCRE2_SIZE erroffset;
// fprintf(stderr, "debug 22\n");
// compile the pattern
@@ -67,7 +67,7 @@
// fprintf(stderr, "debug 23\n");
// fprintf(stderr, "debug 24\n");
- THIS->code = pcre_compile(THIS->pattern, THIS->copts, &errstr, &errptr, NULL);
+ THIS->code = pcre2_compile((PCRE2_SPTR) THIS->pattern, PCRE2_ZERO_TERMINATED, THIS->copts, &errcode, &erroffset, NULL);
// fprintf(stderr, "debug 25\n");
if (THIS->code) {
@@ -75,7 +75,9 @@
// fprintf(stderr, "compiled OK\n");
// fprintf(stderr, "compiled is %d\n", THIS->compiled);
} else {
- GB.Error(errstr);
+ PCRE2_UCHAR errmsg[256];
+ pcre2_get_error_message(errcode, errmsg, sizeof(errmsg));
+ GB.Error((const char *)errmsg);
// fprintf(stderr, "didn't compile: %s\n", errstr);
}
// fprintf(stderr, "debug 26\n");
@@ -95,20 +97,18 @@
return;
}
- int *ovector = THIS->ovector;
-
// fprintf(stderr, "debug 12\n");
// fprintf(stderr, "debug 13\n");
// do the actual match
// fprintf(stderr, "debug 14\n");
- THIS->rc = pcre_exec(THIS->code,
- NULL,
- THIS->subject,
+ THIS->match_data = pcre2_match_data_create_from_pattern(THIS->code, NULL);
+ THIS->rc = pcre2_match(THIS->code,
+ (PCRE2_SPTR) THIS->subject,
strlen(THIS->subject),
0,
THIS->eopts,
- ovector,
- 99);
+ THIS->match_data,
+ 0);
// fprintf(stderr, "debug 15\n");
@@ -138,14 +138,9 @@
GB.NewArray((void *) &(THIS->smcache), sizeof(*(THIS->smcache)), 0); // smcache is where i keep track of what to free later
THIS->compiled = 0;
- THIS->ovector = NULL;
+ THIS->match_data = NULL;
THIS->rc = 0;
- int *ovector = NULL;
- // fprintf(stderr, "debug 11a\n");
- GB.Alloc((void *) &ovector, sizeof(int) * 99);
- THIS->ovector = ovector;
-
// fprintf(stderr, "debug 1\n");
if (MISSING(pattern)) { // the user didn't provide a pattern.
return;
@@ -214,13 +209,13 @@
GB.FreeString(&(THIS->smcache[i]));
}
GB.FreeArray((void *) &(THIS->smcache));
- GB.Free((void *) &(THIS->ovector));
+ pcre2_match_data_free(THIS->match_data);
END_METHOD
BEGIN_PROPERTY(CREGEXP_Offset)
- GB.ReturnInteger((THIS->ovector)[0]);
+ GB.ReturnInteger((int) pcre2_get_startchar(THIS->match_data));
END_PROPERTY
@@ -232,8 +227,9 @@
BEGIN_PROPERTY(CREGEXP_Text)
- const char *substring_start = THIS->subject + (THIS->ovector)[0];
- long substring_length = (THIS->ovector)[1] - (THIS->ovector)[0];
+ PCRE2_SIZE *ovector = pcre2_get_ovector_pointer(THIS->match_data);
+ const char *substring_start = THIS->subject + ovector[0];
+ long substring_length = ovector[1] - ovector[0];
char *str = NULL;
char **tmp = NULL;
@@ -247,18 +243,18 @@
BEGIN_PROPERTY(CREGEXPSUBMATCH_Text)
int i = THIS->_submatch;
- int *ovector = THIS->ovector;
int rc = THIS->rc;
- const char *str = NULL;
+ PCRE2_UCHAR *str = NULL;
+ PCRE2_SIZE strlen;
char *submatch = NULL;
char **tmp = NULL;
if (i < rc) {
- pcre_get_substring(THIS->subject, ovector, rc, i, &str);
- GB.NewString(&submatch, str, 0);
+ pcre2_substring_get_bynumber(THIS->match_data, i, &str, &strlen);
+ GB.NewString(&submatch, (const char *) str, (int) strlen);
tmp = (char **) GB.Add((void *) &(THIS->smcache));
*tmp = submatch;
- pcre_free_substring(str);
+ pcre2_substring_free(str);
} else {
GB.Error("Submatch index out of bounds");
return;
@@ -278,10 +274,10 @@
BEGIN_PROPERTY(CREGEXPSUBMATCH_Offset)
int i = THIS->_submatch;
- int *ovector = THIS->ovector;
int rc = THIS->rc;
if (i < rc) {
+ PCRE2_SIZE *ovector = pcre2_get_ovector_pointer(THIS->match_data);
GB.ReturnInteger(ovector[2*i]);
} else {
GB.Error("Submatch index out of bounds");
@@ -321,30 +317,30 @@
GB_METHOD("_free", NULL, CREGEXP_free, NULL),
GB_METHOD("Compile", NULL, CREGEXP_compile, "(Pattern)s[(CompileOptions)i]"),
GB_METHOD("Exec", NULL, CREGEXP_exec, "(Subject)s[(ExecOptions)i]"),
- GB_CONSTANT("Caseless", "i", PCRE_CASELESS),
- GB_CONSTANT("MultiLine", "i", PCRE_MULTILINE),
- GB_CONSTANT("DotAll", "i", PCRE_DOTALL),
- GB_CONSTANT("Extended", "i", PCRE_EXTENDED),
- GB_CONSTANT("Anchored", "i", PCRE_ANCHORED),
- GB_CONSTANT("DollarEndOnly", "i", PCRE_DOLLAR_ENDONLY),
- GB_CONSTANT("Extra", "i", PCRE_EXTRA),
- GB_CONSTANT("NotBOL", "i", PCRE_NOTBOL),
- GB_CONSTANT("NotEOL", "i", PCRE_NOTEOL),
- GB_CONSTANT("Ungreedy", "i", PCRE_UNGREEDY),
- GB_CONSTANT("NotEmpty", "i", PCRE_NOTEMPTY),
- GB_CONSTANT("UTF8", "i", PCRE_UTF8),
- GB_CONSTANT("NoAutoCapture", "i", PCRE_NO_AUTO_CAPTURE),
- GB_CONSTANT("NoUTF8Check", "i", PCRE_NO_UTF8_CHECK),
- GB_CONSTANT("NoMatch", "i", PCRE_ERROR_NOMATCH),
- GB_CONSTANT("Null", "i", PCRE_ERROR_NULL),
- GB_CONSTANT("BadOption", "i", PCRE_ERROR_BADOPTION),
- GB_CONSTANT("BadMagic", "i", PCRE_ERROR_BADMAGIC),
- GB_CONSTANT("UnknownNode", "i", PCRE_ERROR_UNKNOWN_NODE),
- GB_CONSTANT("NoMemory", "i", PCRE_ERROR_NOMEMORY),
- GB_CONSTANT("NoSubstring", "i", PCRE_ERROR_NOSUBSTRING),
- GB_CONSTANT("MatchLimit", "i", PCRE_ERROR_MATCHLIMIT),
- GB_CONSTANT("Callout", "i", PCRE_ERROR_CALLOUT),
- GB_CONSTANT("BadUTF8", "i", PCRE_ERROR_BADUTF8),
+ GB_CONSTANT("Caseless", "i", PCRE2_CASELESS),
+ GB_CONSTANT("MultiLine", "i", PCRE2_MULTILINE),
+ GB_CONSTANT("DotAll", "i", PCRE2_DOTALL),
+ GB_CONSTANT("Extended", "i", PCRE2_EXTENDED),
+ GB_CONSTANT("Anchored", "i", PCRE2_ANCHORED),
+ GB_CONSTANT("DollarEndOnly", "i", PCRE2_DOLLAR_ENDONLY),
+ // GB_CONSTANT("Extra", "i", PCRE_EXTRA),
+ GB_CONSTANT("NotBOL", "i", PCRE2_NOTBOL),
+ GB_CONSTANT("NotEOL", "i", PCRE2_NOTEOL),
+ GB_CONSTANT("Ungreedy", "i", PCRE2_UNGREEDY),
+ GB_CONSTANT("NotEmpty", "i", PCRE2_NOTEMPTY),
+ GB_CONSTANT("UTF8", "i", PCRE2_UTF),
+ GB_CONSTANT("NoAutoCapture", "i", PCRE2_NO_AUTO_CAPTURE),
+ GB_CONSTANT("NoUTF8Check", "i", PCRE2_NO_UTF_CHECK),
+ GB_CONSTANT("NoMatch", "i", PCRE2_ERROR_NOMATCH),
+ GB_CONSTANT("Null", "i", PCRE2_ERROR_NULL),
+ GB_CONSTANT("BadOption", "i", PCRE2_ERROR_BADOPTION),
+ GB_CONSTANT("BadMagic", "i", PCRE2_ERROR_BADMAGIC),
+ // GB_CONSTANT("UnknownNode", "i", PCRE_ERROR_UNKNOWN_NODE),
+ GB_CONSTANT("NoMemory", "i", PCRE2_ERROR_NOMEMORY),
+ GB_CONSTANT("NoSubstring", "i", PCRE2_ERROR_NOSUBSTRING),
+ GB_CONSTANT("MatchLimit", "i", PCRE2_ERROR_MATCHLIMIT),
+ GB_CONSTANT("Callout", "i", PCRE2_ERROR_CALLOUT),
+ GB_CONSTANT("BadUTF8", "i", PCRE2_ERROR_BADDATA),
#if (((PCRE_MAJOR == 4) && (PCRE_MINOR < 5)) || (PCRE_MAJOR < 4))
GB_CONSTANT("BadUTF8Offset", "i", 65535), /* PCRE_ERROR_BADUTF8_OFFSET not defined < 4.5 */
#else
diff -Naru gambas2-2.24.0_orig/gb.pcre/src/regexp.h gambas2-2.24.0/gb.pcre/src/regexp.h
--- gambas2-2.24.0_orig/gb.pcre/src/regexp.h 2012-04-09 03:34:47.000000000 +0900
+++ gambas2-2.24.0/gb.pcre/src/regexp.h 2025-04-27 13:31:08.722205336 +0900
@@ -28,7 +28,8 @@
#include "gambas.h"
-#include "pcre.h"
+#define PCRE2_CODE_UNIT_WIDTH 8
+#include "pcre2.h"
#ifndef __REGEXP_C
@@ -43,12 +44,12 @@
GB_BASE ob;
char *subject;
char *pattern;
- int *ovector;
+ pcre2_match_data *match_data;
int rc;
int compiled;
int eopts;
int copts;
- pcre *code;
+ pcre2_code *code;
char **smcache;
int _submatch;
}