pcrs: Use the D flag to disable JIT-compilation
authorFabian Keil <fk@fabiankeil.de>
Fri, 25 Sep 2020 20:35:29 +0000 (22:35 +0200)
committerFabian Keil <fk@fabiankeil.de>
Fri, 9 Oct 2020 07:40:39 +0000 (09:40 +0200)
... and use it in pcrs_compile_dynamic_command().

pcrs.c
pcrs.h

diff --git a/pcrs.c b/pcrs.c
index 67b7b35..ca6ba68 100644 (file)
--- a/pcrs.c
+++ b/pcrs.c
@@ -168,6 +168,7 @@ static int pcrs_parse_perl_options(const char *optstring, int *flags)
          case 'o': break;
          case 's': rc |= PCRE_DOTALL; break;
          case 'x': rc |= PCRE_EXTENDED; break;
+         case 'D': *flags |= PCRS_DYNAMIC; break;
          case 'U': rc |= PCRE_UNGREEDY; break;
          case 'T': *flags |= PCRS_TRIVIAL; break;
          default: break;
@@ -669,7 +670,10 @@ pcrs_job *pcrs_compile(const char *pattern, const char *substitute, const char *
 
 
 #ifdef PCRE_STUDY_JIT_COMPILE
-   pcre_study_options = PCRE_STUDY_JIT_COMPILE;
+   if (!(flags & PCRS_DYNAMIC))
+   {
+      pcre_study_options = PCRE_STUDY_JIT_COMPILE;
+   }
 #endif
 
    /*
@@ -1174,7 +1178,7 @@ pcrs_job *pcrs_compile_dynamic_command(char *pcrs_command, const struct pcrs_var
        */
       assert(NULL == strchr(v->name, d));
 
-      ret = snprintf(buf, sizeof(buf), "s%c\\$%s%c%s%cgT", d, v->name, d, v->value, d);
+      ret = snprintf(buf, sizeof(buf), "s%c\\$%s%c%s%cDgT", d, v->name, d, v->value, d);
       assert(ret >= 0);
       if (ret >= sizeof(buf))
       {
@@ -1185,10 +1189,10 @@ pcrs_job *pcrs_compile_dynamic_command(char *pcrs_command, const struct pcrs_var
           * properly.
           */
          static const char warning[] = "... [too long, truncated]";
-         const size_t trailer_size = sizeof(warning) + 3; /* 3 for d + "gT" */
+         const size_t trailer_size = sizeof(warning) + 4; /* 4 for d + "DgT" */
          char *trailer_start = buf + sizeof(buf) - trailer_size;
 
-         ret = snprintf(trailer_start, trailer_size, "%s%cgT", warning, d);
+         ret = snprintf(trailer_start, trailer_size, "%s%cDgT", warning, d);
          assert(ret == trailer_size - 1);
          assert(sizeof(buf) == strlen(buf) + 1);
          truncation = 1;
diff --git a/pcrs.h b/pcrs.h
index e7699ab..abff3ca 100644 (file)
--- a/pcrs.h
+++ b/pcrs.h
@@ -70,6 +70,7 @@
 #define PCRS_GLOBAL          1      /* Job should be applied globally, as with perl's g option */
 #define PCRS_TRIVIAL         2      /* Backreferences in the substitute are ignored */
 #define PCRS_SUCCESS         4      /* Job did previously match */
+#define PCRS_DYNAMIC         8      /* Job is dynamic (used to disable JIT compilation) */
 
 
 /*