[Pcre-svn] [790] code/trunk: Implement starstar in glob conv…

Top Page
Delete this message
Author: Subversion repository
Date:  
To: pcre-svn
Subject: [Pcre-svn] [790] code/trunk: Implement starstar in glob conversion.
Revision: 790
          http://www.exim.org/viewvc/pcre2?view=rev&revision=790
Author:   zherczeg
Date:     2017-05-19 04:55:39 +0100 (Fri, 19 May 2017)
Log Message:
-----------
Implement starstar in glob conversion.


Modified Paths:
--------------
    code/trunk/src/pcre2_convert.c
    code/trunk/testdata/testinput24
    code/trunk/testdata/testoutput24


Modified: code/trunk/src/pcre2_convert.c
===================================================================
--- code/trunk/src/pcre2_convert.c    2017-05-18 14:42:19 UTC (rev 789)
+++ code/trunk/src/pcre2_convert.c    2017-05-19 03:55:39 UTC (rev 790)
@@ -359,286 +359,10 @@
 }



-
 /*************************************************
 *           Convert a glob pattern               *
 *************************************************/


-/* For a basic glob, only * ? and [...] are recognized.
-
-Arguments:
-  pattype        the pattern type
-  pattern        the pattern
-  plength        length in code units
-  utf            TRUE if UTF
-  use_buffer     where to put the output
-  use_length     length of use_buffer
-  bufflenptr     where to put the used length
-  dummyrun       TRUE if a dummy run
-  ccontext       the convert context
-
-Returns:         0 => success
-                !0 => error code
-*/
-
-static int
-convert_glob(uint32_t pattype, PCRE2_SPTR pattern, PCRE2_SIZE plength,
-  BOOL utf, PCRE2_UCHAR *use_buffer, PCRE2_SIZE use_length,
-  PCRE2_SIZE *bufflenptr, BOOL dummyrun, pcre2_convert_context *ccontext)
-{
-char *s;
-char not_sep_class[8];
-char lookbehind_not_sep[12];
-PCRE2_SPTR glob = pattern;
-PCRE2_UCHAR *p = use_buffer;
-PCRE2_UCHAR *pp = p;
-PCRE2_UCHAR *endp = p + use_length - 1;  /* Allow for trailing zero */
-PCRE2_SIZE convlength = 0;
-uint32_t range_start = 0;
-uint32_t range_state = RANGE_NOT_STARTED;
-uint32_t posix_class_state = POSIX_CLASS_NOT_STARTED;
-BOOL inclass = FALSE;
-BOOL nextisliteral = FALSE;
-BOOL endswith = FALSE;
-BOOL sep_in_range = FALSE;
-
-(void)utf;  /* Not used when Unicode not supported */
-(void)pattype; /* Pro tem */
-
-/* Set up a string containing [^<sep>] where <sep> is the possibly escaped part
-separator. */
-
-s = not_sep_class;
-*s++ = CHAR_LEFT_SQUARE_BRACKET;
-*s++ = CHAR_CIRCUMFLEX_ACCENT;
-if (ccontext->glob_separator == CHAR_BACKSLASH) *s++ = CHAR_BACKSLASH;
-*s++ = ccontext->glob_separator;
-*s++ = CHAR_RIGHT_SQUARE_BRACKET;
-*s++ = 0;
-
-/* Set up a string containing (?<!<sep>) where <sep> is the possibly escaped
-part separator. */
-
-s = lookbehind_not_sep;
-*s++ = CHAR_LEFT_PARENTHESIS;
-*s++ = CHAR_QUESTION_MARK;
-*s++ = CHAR_LESS_THAN_SIGN;
-*s++ = CHAR_EXCLAMATION_MARK;
-if (ccontext->glob_separator == CHAR_BACKSLASH) *s++ = CHAR_BACKSLASH;
-*s++ = ccontext->glob_separator;
-*s++ = CHAR_RIGHT_PARENTHESIS;
-*s++ = 0;
-
-/* Initialize default for error offset as end of input. */
-
-*bufflenptr = plength;
-
-/* If the pattern starts with * and contains at least one more character but no
-other asterisks or part separators, it means "ends with what follows". This can
-be optimized. */
-
-if (plength > 1 && *glob == CHAR_ASTERISK)
-  {
-  PCRE2_SPTR pt;
-  for (pt = glob + plength - 1; pt > glob; pt--)
-    if (*pt == ccontext->glob_separator || *pt == CHAR_ASTERISK) break;
-  endswith = pt == glob;
-  if (endswith) PUTCHARS(STR_QUERY_s);
-  }
-
-/* Output starts with \A and ends with \z and a binary zero. */
-
-PUTCHARS(STR_BACKSLASH_A);
-
-/* If the pattern starts with a wildcard, it must not match a subject that 
-starts with a dot. */
-
-if (plength > 1 && 
-    (*glob == CHAR_ASTERISK || *glob == CHAR_QUESTION_MARK ||
-     *glob == CHAR_LEFT_SQUARE_BRACKET))
-  PUTCHARS(STR_LOOKAHEAD_NOT_DOT);
-
-/* Now scan the input */
-
-while (plength > 0)
-  {
-  uint32_t c, sc;
-  int clength = 1;
-
-  /* Add in the length of the last item, then, if in the dummy run, pull the
-  pointer back to the start of the (temporary) buffer and then remember the
-  start of the next item. */
-
-  convlength += p - pp;
-  if (dummyrun) p = use_buffer;
-  pp = p;
-
-  /* Pick up the next character */
-
-#ifndef SUPPORT_UNICODE
-  c = *glob;
-#else
-  GETCHARLENTEST(c, glob, clength);
-#endif
-  glob += clength;
-  plength -= clength;
-
-  sc = nextisliteral? 0 : c;
-  nextisliteral = FALSE;
-
-  /* Handle a character within a class. */
-
-  if (inclass)
-    {
-    /* A literal part separator is a syntax error */
-      
-    if (c == ccontext->glob_separator)
-      {
-      *bufflenptr = glob - pattern - 1;
-      return PCRE2_ERROR_CONVERT_SYNTAX;
-      }
-      
-    /* At the end of the class, add a lookbehind for not the separator if any
-    range in the class includes the separator. */ 
-          
-    if (c == CHAR_RIGHT_SQUARE_BRACKET) 
-      {
-      PUTCHARS(STR_RIGHT_SQUARE_BRACKET); 
-      if (sep_in_range) PUTCHARS(lookbehind_not_sep);
-      inclass = FALSE;
-      }
-      
-    /* Not the end of the class */
-       
-    else 
-      {
-      switch (posix_class_state)
-        {
-        case POSIX_CLASS_STARTED:
-        if (c <= 127 && islower(c)) break;  /* Remain in started state */
-        posix_class_state = POSIX_CLASS_NOT_STARTED;       
-        if (c == CHAR_COLON  && plength > 0 && 
-            *glob == CHAR_RIGHT_SQUARE_BRACKET)
-          {
-          PUTCHARS(STR_COLON_RIGHT_SQUARE_BRACKET);
-          plength--; 
-          glob++;
-          continue;    /* With next character after :] */ 
-          }
-        /* Fall through */  
-          
-        case POSIX_CLASS_NOT_STARTED:  
-        if (c == CHAR_LEFT_SQUARE_BRACKET) 
-          posix_class_state = POSIX_CLASS_STARTING;
-        break;
-        
-        case POSIX_CLASS_STARTING:
-        if (c == CHAR_COLON) posix_class_state = POSIX_CLASS_STARTED;
-        break;
-        }   
- 
-      if (range_state == RANGE_STARTING && c == CHAR_MINUS)
-        range_state = RANGE_STARTED;
-      else if (range_state == RANGE_STARTED)
-        { 
-        if (range_start <= ccontext->glob_separator &&
-            c >= ccontext->glob_separator)
-          sep_in_range = TRUE;   
-        range_state = RANGE_NOT_STARTED;
-        }
-      else
-        {      
-        range_state = RANGE_STARTING;
-        range_start = c; 
-        }
-         
-      if (c == CHAR_BACKSLASH) PUTCHARS(STR_BACKSLASH);
-      if (p + clength > endp) return PCRE2_ERROR_NOMEMORY;
-      memcpy(p, glob - clength, CU2BYTES(clength));
-      p += clength;
-      } 
-    }
-
-  /* Handle a character not within a class. */
-
-  else switch(sc)
-    {
-    case CHAR_ASTERISK:
-    if (endswith)
-      {
-      PUTCHARS(STR_DOT_STAR_LOOKBEHIND);
-      }
-    else
-      {
-      PUTCHARS(not_sep_class);
-      PUTCHARS(STR_ASTERISK);
-      }
-    break;
-
-    case CHAR_QUESTION_MARK:
-    PUTCHARS(not_sep_class);
-    break;
-
-    case CHAR_LEFT_SQUARE_BRACKET:
-    posix_class_state = POSIX_CLASS_NOT_STARTED; 
-    range_state = RANGE_NOT_STARTED; 
-    sep_in_range = FALSE;
-    inclass = TRUE;
-    PUTCHARS(STR_LEFT_SQUARE_BRACKET);
-
-    /* Handle ! and ] as first characters */
-
-    if (plength > 0)
-      {
-      if (*glob == CHAR_EXCLAMATION_MARK)
-        {
-        glob++;
-        plength--;
-        PUTCHARS(STR_CIRCUMFLEX_ACCENT);
-        }
-      if (plength > 0 && *glob == CHAR_RIGHT_SQUARE_BRACKET)
-        {
-        glob++;
-        plength--;
-        PUTCHARS(STR_RIGHT_SQUARE_BRACKET);
-        range_start = CHAR_RIGHT_SQUARE_BRACKET;
-        range_state = RANGE_STARTING;
-        }    
-      }
-    break;
-
-    case CHAR_BACKSLASH:
-    if (plength <= 0) return ERROR_END_BACKSLASH;
-    nextisliteral = TRUE;
-    break;
-
-    default:
-    if (c < 128 && strchr(pcre2_escaped_literals, c) != NULL)
-      {
-      PUTCHARS(STR_BACKSLASH);
-      }
-    if (p + clength > endp) return PCRE2_ERROR_NOMEMORY;
-    memcpy(p, glob - clength, CU2BYTES(clength));
-    p += clength;
-    break;
-    }
-  }
-
-if (inclass) return ERROR_MISSING_SQUARE_BRACKET;
-
-if (endswith) PUTCHARS(STR_RIGHT_PARENTHESIS);
-PUTCHARS(STR_BACKSLASH_z);
-convlength += p - pp;        /* Final segment */
-*bufflenptr = convlength;
-*p++ = 0;
-return 0;
-}
-
-
-/*************************************************
-*           Convert a glob pattern               *
-*************************************************/
-
 /* Context for writing the output into a buffer. */


typedef struct pcre2_output_context {
@@ -657,7 +381,7 @@
*/

static void
-convert_glob_bash_write(pcre2_output_context *out, PCRE2_UCHAR chr)
+convert_glob_write(pcre2_output_context *out, PCRE2_UCHAR chr)
{
out->output_size++;

@@ -674,7 +398,7 @@
*/

static void
-convert_glob_bash_write_str(pcre2_output_context *out, PCRE2_SIZE length)
+convert_glob_write_str(pcre2_output_context *out, PCRE2_SIZE length)
{
uint8_t *out_str = out->out_str;
PCRE2_UCHAR *output = out->output;
@@ -707,7 +431,7 @@
*/

static int
-convert_glob_bash_parse_class(PCRE2_SPTR *from, PCRE2_SPTR pattern_end,
+convert_glob_parse_class(PCRE2_SPTR *from, PCRE2_SPTR pattern_end,
pcre2_output_context *out)
{
static const char *posix_classes = "alnum:alpha:ascii:blank:cntrl:digit:"
@@ -719,7 +443,7 @@

out->out_str[0] = CHAR_LEFT_SQUARE_BRACKET;
out->out_str[1] = CHAR_COLON;
-convert_glob_bash_write_str(out, 2);
+convert_glob_write_str(out, 2);

 while (TRUE)
   {
@@ -744,7 +468,7 @@
     return ERROR_MISSING_SQUARE_BRACKET;
     }


- convert_glob_bash_write(out, c);
+ convert_glob_write(out, c);
}

 start = *from;
@@ -763,7 +487,7 @@
       {
       out->out_str[0] = CHAR_COLON;
       out->out_str[1] = CHAR_RIGHT_SQUARE_BRACKET;
-      convert_glob_bash_write_str(out, 2);
+      convert_glob_write_str(out, 2);
       return 0;
       }
     pattern++;
@@ -783,6 +507,7 @@
   pattern_end    end of pattern
   out            output context
   separator      glob separator
+  with_escape    backslash is needed before separator


 Returns:         0 => success
                 !0 => error code
@@ -789,8 +514,8 @@
 */


static int
-convert_glob_bash_parse_range(PCRE2_SPTR *from, PCRE2_SPTR pattern_end,
- pcre2_output_context *out, PCRE2_UCHAR separator)
+convert_glob_parse_range(PCRE2_SPTR *from, PCRE2_SPTR pattern_end,
+ pcre2_output_context *out, PCRE2_UCHAR separator, BOOL with_escape)
{
PCRE2_SPTR pattern = *from;
PCRE2_UCHAR c;
@@ -819,15 +544,16 @@
len = 3;
}

-if (separator < 128 && strchr(pcre2_escaped_literals, separator) != NULL)
+if (with_escape)
{
out->out_str[len] = CHAR_BACKSLASH;
len++;
}

-convert_glob_bash_write_str(out, len);
-convert_glob_bash_write(out, separator);
+out->out_str[len] = (uint8_t) separator;

+convert_glob_write_str(out, len + 1);
+
 if (c == CHAR_EXCLAMATION_MARK
     || c == CHAR_CIRCUMFLEX_ACCENT)
   {
@@ -843,13 +569,13 @@
   {
   out->out_str[0] = CHAR_RIGHT_PARENTHESIS;
   out->out_str[1] = CHAR_LEFT_SQUARE_BRACKET;
-  convert_glob_bash_write_str(out, 2);
+  convert_glob_write_str(out, 2);
   }


if (c == CHAR_MINUS || c == CHAR_RIGHT_SQUARE_BRACKET)
{
- convert_glob_bash_write(out, CHAR_BACKSLASH);
- convert_glob_bash_write(out, c);
+ convert_glob_write(out, CHAR_BACKSLASH);
+ convert_glob_write(out, c);
pattern++;
}

@@ -859,38 +585,48 @@

   if (c == CHAR_RIGHT_SQUARE_BRACKET)
     {
-    convert_glob_bash_write(out, c);
+    convert_glob_write(out, c);
     *from = pattern;
     return 0;
     }


-  if (c == CHAR_LEFT_SQUARE_BRACKET && pattern < pattern_end &&
-      *pattern == CHAR_COLON)
+  if (pattern >= pattern_end) break;
+
+  if (c == CHAR_LEFT_SQUARE_BRACKET && *pattern == CHAR_COLON)
     {
     *from = pattern + 1;


-    result = convert_glob_bash_parse_class(from, pattern_end, out);
+    result = convert_glob_parse_class(from, pattern_end, out);
     if (result != 0) return result;


     pattern = *from;
-    continue;
+
+    /* A dash after a character class is a normal character. */
+    if (pattern >= pattern_end || *pattern != CHAR_MINUS)
+      continue;
+
+    c = CHAR_MINUS;
+    pattern++;
     }
+  else if (c == CHAR_MINUS)
+    {
+    convert_glob_write(out, CHAR_MINUS);
+    c = *pattern++;


-  if (c == CHAR_BACKSLASH)
-    {
-    if (pattern >= pattern_end)
+    if (c == CHAR_BACKSLASH)
       {
-      *from = pattern;
-      return ERROR_END_BACKSLASH;
+      if (pattern >= pattern_end) break;
+        c = *pattern++;
       }
+    }
+  else if (c == CHAR_BACKSLASH)
     c = *pattern++;
-    }


   if (c == CHAR_LEFT_SQUARE_BRACKET || c == CHAR_RIGHT_SQUARE_BRACKET ||
       c == CHAR_BACKSLASH || c == CHAR_MINUS)
-    convert_glob_bash_write(out, CHAR_BACKSLASH);
+    convert_glob_write(out, CHAR_BACKSLASH);


- convert_glob_bash_write(out, c);
+ convert_glob_write(out, c);
}

*from = pattern;
@@ -898,32 +634,66 @@
}


+/* Prints the separator into the output.
+
+Arguments:
+  out            output context
+  separator      glob separator
+  with_escape    backslash is needed before separator
+*/
+
+static void
+convert_glob_print_separator(pcre2_output_context *out,
+  PCRE2_UCHAR separator, BOOL with_escape)
+{
+if (with_escape)
+  convert_glob_write(out, CHAR_BACKSLASH);
+
+convert_glob_write(out, separator);
+}
+
+
 /* Prints a wildcard into the output.


 Arguments:
   out            output context
   separator      glob separator
+  with_escape    backslash is needed before separator
 */


static void
-convert_glob_bash_wildcard(pcre2_output_context *out,
- PCRE2_UCHAR separator)
+convert_glob_print_wildcard(pcre2_output_context *out,
+ PCRE2_UCHAR separator, BOOL with_escape)
{
-int len = 2;
-
out->out_str[0] = CHAR_LEFT_SQUARE_BRACKET;
out->out_str[1] = CHAR_CIRCUMFLEX_ACCENT;
+convert_glob_write_str(out, 2);

-if (separator < 128 && strchr(pcre2_escaped_literals, separator) != NULL)
- {
- out->out_str[2] = CHAR_BACKSLASH;
- len = 3;
- }
+convert_glob_print_separator(out, separator, with_escape);

-convert_glob_bash_write_str(out, len);
+convert_glob_write(out, CHAR_RIGHT_SQUARE_BRACKET);
+}

-convert_glob_bash_write(out, separator);
-convert_glob_bash_write(out, CHAR_RIGHT_SQUARE_BRACKET);
+
+/* Prints a (*COMMIT) into the output.
+
+Arguments:
+  out            output context
+*/
+
+static void
+convert_glob_print_commit(pcre2_output_context *out)
+{
+out->out_str[0] = CHAR_LEFT_PARENTHESIS;
+out->out_str[1] = CHAR_ASTERISK;
+out->out_str[2] = CHAR_C;
+out->out_str[3] = CHAR_O;
+out->out_str[4] = CHAR_M;
+out->out_str[5] = CHAR_M;
+out->out_str[6] = CHAR_I;
+out->out_str[7] = CHAR_T;
+convert_glob_write_str(out, 8);
+convert_glob_write(out, CHAR_RIGHT_PARENTHESIS);
 }



@@ -945,7 +715,7 @@
*/

static int
-convert_glob_bash(uint32_t options, PCRE2_SPTR pattern, PCRE2_SIZE plength,
+convert_glob(uint32_t options, PCRE2_SPTR pattern, PCRE2_SIZE plength,
BOOL utf, PCRE2_UCHAR *use_buffer, PCRE2_SIZE use_length,
PCRE2_SIZE *bufflenptr, BOOL dummyrun, pcre2_convert_context *ccontext)
{
@@ -952,9 +722,20 @@
pcre2_output_context out;
PCRE2_SPTR pattern_start = pattern;
PCRE2_SPTR pattern_end = pattern + plength;
+PCRE2_UCHAR separator = ccontext->glob_separator;
PCRE2_UCHAR c;
-int result;
+BOOL with_escape, is_start;
+int result, len;

+if (separator >= 128)
+ {
+ /* Currently only ASCII separators are supported. */
+ *bufflenptr = 0;
+ return PCRE2_ERROR_CONVERT_SYNTAX;
+ }
+
+with_escape = strchr(pcre2_escaped_literals, separator) != NULL;
+
/* Initialize default for error offset as end of input. */
out.output = use_buffer;
out.output_end = use_buffer + use_length;
@@ -964,10 +745,16 @@
out.out_str[1] = CHAR_QUESTION_MARK;
out.out_str[2] = CHAR_s;
out.out_str[3] = CHAR_RIGHT_PARENTHESIS;
-out.out_str[4] = CHAR_BACKSLASH;
-out.out_str[5] = CHAR_A;
-convert_glob_bash_write_str(&out, 6);
+convert_glob_write_str(&out, 4);

+if (pattern + 1 >= pattern_end ||
+    pattern[0] != CHAR_ASTERISK || pattern[1] != CHAR_ASTERISK)
+  {
+  out.out_str[0] = CHAR_BACKSLASH;
+  out.out_str[1] = CHAR_A;
+  convert_glob_write_str(&out, 2);
+  }
+
 result = 0;


while (pattern < pattern_end)
@@ -976,37 +763,112 @@

   if (c == CHAR_ASTERISK)
     {
-    if (pattern != pattern_start + 1)
+    if (pattern < pattern_end && *pattern == CHAR_ASTERISK)
       {
+      is_start = pattern == pattern_start + 1;
+
+      if (!is_start && pattern[-2] != separator)
+        {
+        result = PCRE2_ERROR_CONVERT_SYNTAX;
+        break;
+        }
+
+      do pattern++; while (pattern < pattern_end &&
+                           *pattern == CHAR_ASTERISK);
+
+      if (pattern >= pattern_end)
+        {
+        convert_glob_write(&out, CHAR_NULL);
+
+        if (!dummyrun &&
+            out.output_size != (PCRE2_SIZE) (out.output - use_buffer))
+          {
+          result = PCRE2_ERROR_NOMEMORY;
+          break;
+          }
+        *bufflenptr = out.output_size - 1;
+        return 0;
+        }
+
+      if (*pattern == CHAR_BACKSLASH)
+        {
+        pattern++;
+        if (pattern >= pattern_end)
+          {
+          result = PCRE2_ERROR_CONVERT_SYNTAX;
+          break;
+          }
+        }
+
+      if (*pattern != separator)
+        {
+        result = PCRE2_ERROR_CONVERT_SYNTAX;
+        break;
+        }
+
+      pattern++;
+
+      if (is_start)
+        {
+        out.out_str[0] = CHAR_LEFT_PARENTHESIS;
+        out.out_str[1] = CHAR_QUESTION_MARK;
+        out.out_str[2] = CHAR_COLON;
+        out.out_str[3] = CHAR_BACKSLASH;
+        out.out_str[4] = CHAR_A;
+        out.out_str[5] = CHAR_VERTICAL_LINE;
+        convert_glob_write_str(&out, 6);
+
+        convert_glob_print_wildcard(&out, separator, with_escape);
+        convert_glob_write(&out, CHAR_RIGHT_PARENTHESIS);
+        continue;
+        }
+
+      convert_glob_print_commit(&out);
+
       out.out_str[0] = CHAR_LEFT_PARENTHESIS;
-      out.out_str[1] = CHAR_ASTERISK;
-      out.out_str[2] = CHAR_C;
-      out.out_str[3] = CHAR_O;
-      out.out_str[4] = CHAR_M;
-      out.out_str[5] = CHAR_M;
-      out.out_str[6] = CHAR_I;
-      out.out_str[7] = CHAR_T;
-      convert_glob_bash_write_str(&out, 8);
-      convert_glob_bash_write(&out, CHAR_RIGHT_PARENTHESIS);
+      out.out_str[1] = CHAR_QUESTION_MARK;
+      out.out_str[2] = CHAR_COLON;
+      out.out_str[3] = CHAR_DOT;
+      out.out_str[4] = CHAR_ASTERISK;
+      out.out_str[5] = CHAR_QUESTION_MARK;
+      len = 6;
+
+      if (with_escape)
+        {
+        out.out_str[6] = CHAR_BACKSLASH;
+        len = 7;
+        }
+
+      convert_glob_write_str(&out, len);
+
+      out.out_str[0] = (uint8_t) separator;
+      out.out_str[1] = CHAR_RIGHT_PARENTHESIS;
+      out.out_str[2] = CHAR_QUESTION_MARK;
+      out.out_str[3] = CHAR_QUESTION_MARK;
+      convert_glob_write_str(&out, 4);
+      continue;
       }


-    convert_glob_bash_wildcard(&out, ccontext->glob_separator);
+    if (pattern != pattern_start + 1)
+      convert_glob_print_commit(&out);
+
+    convert_glob_print_wildcard(&out, separator, with_escape);
     out.out_str[0] = CHAR_ASTERISK;
     out.out_str[1] = CHAR_QUESTION_MARK;
-    convert_glob_bash_write_str(&out, 2);
+    convert_glob_write_str(&out, 2);
     continue;
     }


   if (c == CHAR_QUESTION_MARK)
     {
-    convert_glob_bash_wildcard(&out, ccontext->glob_separator);
+    convert_glob_print_wildcard(&out, separator, with_escape);
     continue;
     }


   if (c == CHAR_LEFT_SQUARE_BRACKET)
     {
-    result = convert_glob_bash_parse_range(&pattern, pattern_end,
-      &out, ccontext->glob_separator);
+    result = convert_glob_parse_range(&pattern, pattern_end,
+      &out, separator, with_escape);
     if (result != 0) break;
     continue;
     }
@@ -1022,9 +884,9 @@
     }


   if (c < 128 && strchr(pcre2_escaped_literals, c) != NULL)
-    convert_glob_bash_write(&out, CHAR_BACKSLASH);
+    convert_glob_write(&out, CHAR_BACKSLASH);


- convert_glob_bash_write(&out, c);
+ convert_glob_write(&out, c);
}

if (result == 0)
@@ -1032,9 +894,9 @@
out.out_str[0] = CHAR_BACKSLASH;
out.out_str[1] = CHAR_z;
out.out_str[2] = CHAR_NULL;
- convert_glob_bash_write_str(&out, 3);
+ convert_glob_write_str(&out, 3);

-  if (!dummyrun && out.output_size != (out.output - use_buffer))
+  if (!dummyrun && out.output_size != (PCRE2_SIZE) (out.output - use_buffer))
     result = PCRE2_ERROR_NOMEMORY;
   }


@@ -1130,17 +992,10 @@
   switch(pattype)
     {
     case PCRE2_CONVERT_GLOB:
-    rc = convert_glob(pattype, pattern, plength, utf, use_buffer, use_length,
+    rc = convert_glob(options, pattern, plength, utf, use_buffer, use_length,
       bufflenptr, dummyrun, ccontext);
     break;


-/*
-    case PCRE2_CONVERT_GLOB_BASH:
-    rc = convert_glob_bash(options, pattern, plength, utf, use_buffer, use_length,
-      bufflenptr, dummyrun, ccontext);
-    break;
-*/     
-
     case PCRE2_CONVERT_POSIX_BASIC:
     case PCRE2_CONVERT_POSIX_EXTENDED:
     rc = convert_posix(pattype, pattern, plength, utf, use_buffer, use_length,


Modified: code/trunk/testdata/testinput24
===================================================================
--- code/trunk/testdata/testinput24    2017-05-18 14:42:19 UTC (rev 789)
+++ code/trunk/testdata/testinput24    2017-05-19 03:55:39 UTC (rev 790)
@@ -13,10 +13,6 @@


/abc/posix

-# More than one glob type is an error.
-
-/abc/convert=glob_bash
-
# Separator must be / \ or .

/a*b/convert_glob_separator=%
@@ -213,13 +209,8 @@

/a*b/convert_glob_separator=/

-#pattern convert=unset
-#pattern convert=glob_bash,convert_glob_separator=/
-
# Non control character checking

-//
-
/A\B\\C\D/

/\\{}\?\*+\[\]()|.^$/
@@ -244,7 +235,14 @@

/[[:xdigit::]]/

+/****/

+/**\/abc/
+
+/abc\/**/
+
+/abc\/**\/abc/
+
#pattern convert=unset
#pattern convert=posix_extended


Modified: code/trunk/testdata/testoutput24
===================================================================
--- code/trunk/testdata/testoutput24    2017-05-18 14:42:19 UTC (rev 789)
+++ code/trunk/testdata/testoutput24    2017-05-19 03:55:39 UTC (rev 790)
@@ -14,11 +14,6 @@
 /abc/posix
 ** The convert and posix modifiers are mutually exclusive


-# More than one glob type is an error.
-
-/abc/convert=glob_bash
-** Pattern conversion error at offset 0: bad option value
-
# Separator must be / \ or .

/a*b/convert_glob_separator=%
@@ -53,7 +48,7 @@
# Tests from the gitwildmatch list, with some additions

 /foo/
-\Afoo\z
+(?s)\Afoo\z
     foo
  0: foo
 /= Expect no match
@@ -62,7 +57,7 @@
 No match


 //
-\A\z
+(?s)\A\z
     \
  0: 


@@ -75,7 +70,7 @@
No match

 /*/
-\A[^/]*\z
+(?s)\A[^\/]*?\z
     foo
  0: foo
     \
@@ -82,7 +77,7 @@
  0: 


 /f*/
-\Af[^/]*\z
+(?s)\Af(*COMMIT)[^\/]*?\z
     foo
  0: foo
     f
@@ -116,18 +111,18 @@
  0: aaaaaaabababab


 /foo\*/
-\Afoo\*\z
+(?s)\Afoo\*\z
     foo*
  0: foo*


 /foo\*bar/
-\Afoo\*bar\z
+(?s)\Afoo\*bar\z
 \= Expect no match
     foobar
 No match


 /f\\oo/
-\Af\\oo\z
+(?s)\Af\\oo\z
     f\\oo
  0: f\oo


@@ -339,14 +334,8 @@
/a*b/convert_glob_separator=/
\Aa[^/]*b\z

-#pattern convert=unset
-#pattern convert=glob_bash,convert_glob_separator=/
-
# Non control character checking

-//
-(?s)\A\z
-
/A\B\\C\D/
(?s)\AAB\\CD\z

@@ -383,7 +372,18 @@
/[[:xdigit::]]/
** Pattern conversion error at offset 10: missing terminating ] for character class

+/****/
+(?s)

+/**\/abc/
+(?s)(?:\A|[^/])abc\z
+
+/abc\/**/
+(?s)\Aabc/
+
+/abc\/**\/abc/
+(?s)\Aabc/(*COMMIT)(?:.*?/)??abc\z
+
#pattern convert=unset
#pattern convert=posix_extended