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;
 }
openSUSE Build Service is sponsored by