/[pcre]/code/trunk/pcre_compile.c
ViewVC logotype

Diff of /code/trunk/pcre_compile.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 298 by ph10, Thu Jan 10 17:09:12 2008 UTC revision 342 by ph10, Sun Apr 20 17:10:13 2008 UTC
# Line 6  Line 6 
6  and semantics are as close as possible to those of the Perl 5 language.  and semantics are as close as possible to those of the Perl 5 language.
7    
8                         Written by Philip Hazel                         Written by Philip Hazel
9             Copyright (c) 1997-2007 University of Cambridge             Copyright (c) 1997-2008 University of Cambridge
10    
11  -----------------------------------------------------------------------------  -----------------------------------------------------------------------------
12  Redistribution and use in source and binary forms, with or without  Redistribution and use in source and binary forms, with or without
# Line 158  static const char verbnames[] = Line 158  static const char verbnames[] =
158    "SKIP\0"    "SKIP\0"
159    "THEN";    "THEN";
160    
161  static verbitem verbs[] = {  static const verbitem verbs[] = {
162    { 6, OP_ACCEPT },    { 6, OP_ACCEPT },
163    { 6, OP_COMMIT },    { 6, OP_COMMIT },
164    { 1, OP_FAIL },    { 1, OP_FAIL },
# Line 168  static verbitem verbs[] = { Line 168  static verbitem verbs[] = {
168    { 4, OP_THEN  }    { 4, OP_THEN  }
169  };  };
170    
171  static int verbcount = sizeof(verbs)/sizeof(verbitem);  static const int verbcount = sizeof(verbs)/sizeof(verbitem);
172    
173    
174  /* Tables of names of POSIX character classes and their lengths. The names are  /* Tables of names of POSIX character classes and their lengths. The names are
# Line 295  static const char error_texts[] = Line 295  static const char error_texts[] =
295    /* 55 */    /* 55 */
296    "repeating a DEFINE group is not allowed\0"    "repeating a DEFINE group is not allowed\0"
297    "inconsistent NEWLINE options\0"    "inconsistent NEWLINE options\0"
298    "\\g is not followed by a braced name or an optionally braced non-zero number\0"    "\\g is not followed by a braced, angle-bracketed, or quoted name/number or by a plain number\0"
299    "(?+ or (?- or (?(+ or (?(- must be followed by a non-zero number\0"    "a numbered reference must not be zero\0"
300    "(*VERB) with an argument is not supported\0"    "(*VERB) with an argument is not supported\0"
301    /* 60 */    /* 60 */
302    "(*VERB) not recognized\0"    "(*VERB) not recognized\0"
303    "number is too big\0"    "number is too big\0"
304    "subpattern name expected\0"    "subpattern name expected\0"
305    "digit expected after (?+";    "digit expected after (?+\0"
306      "] is an invalid data character in JavaScript compatibility mode";
307    
308    
309  /* Table to identify digits and hex digits. This is used when compiling  /* Table to identify digits and hex digits. This is used when compiling
# Line 531  else Line 532  else
532      *errorcodeptr = ERR37;      *errorcodeptr = ERR37;
533      break;      break;
534    
535      /* \g must be followed by a number, either plain or braced. If positive, it      /* \g must be followed by one of a number of specific things:
536      is an absolute backreference. If negative, it is a relative backreference.  
537      This is a Perl 5.10 feature. Perl 5.10 also supports \g{name} as a      (1) A number, either plain or braced. If positive, it is an absolute
538      reference to a named group. This is part of Perl's movement towards a      backreference. If negative, it is a relative backreference. This is a Perl
539      unified syntax for back references. As this is synonymous with \k{name}, we      5.10 feature.
540      fudge it up by pretending it really was \k. */  
541        (2) Perl 5.10 also supports \g{name} as a reference to a named group. This
542        is part of Perl's movement towards a unified syntax for back references. As
543        this is synonymous with \k{name}, we fudge it up by pretending it really
544        was \k.
545    
546        (3) For Oniguruma compatibility we also support \g followed by a name or a
547        number either in angle brackets or in single quotes. However, these are
548        (possibly recursive) subroutine calls, _not_ backreferences. Just return
549        the -ESC_g code (cf \k). */
550    
551      case 'g':      case 'g':
552        if (ptr[1] == '<' || ptr[1] == '\'')
553          {
554          c = -ESC_g;
555          break;
556          }
557    
558        /* Handle the Perl-compatible cases */
559    
560      if (ptr[1] == '{')      if (ptr[1] == '{')
561        {        {
562        const uschar *p;        const uschar *p;
# Line 565  else Line 583  else
583      while ((digitab[ptr[1]] & ctype_digit) != 0)      while ((digitab[ptr[1]] & ctype_digit) != 0)
584        c = c * 10 + *(++ptr) - '0';        c = c * 10 + *(++ptr) - '0';
585    
586      if (c < 0)      if (c < 0)   /* Integer overflow */
587        {        {
588        *errorcodeptr = ERR61;        *errorcodeptr = ERR61;
589        break;        break;
590        }        }
591    
592      if (c == 0 || (braced && *(++ptr) != '}'))      if (braced && *(++ptr) != '}')
593        {        {
594        *errorcodeptr = ERR57;        *errorcodeptr = ERR57;
595        break;        break;
596        }        }
597    
598        if (c == 0)
599          {
600          *errorcodeptr = ERR58;
601          break;
602          }
603    
604      if (negated)      if (negated)
605        {        {
# Line 611  else Line 635  else
635        c -= '0';        c -= '0';
636        while ((digitab[ptr[1]] & ctype_digit) != 0)        while ((digitab[ptr[1]] & ctype_digit) != 0)
637          c = c * 10 + *(++ptr) - '0';          c = c * 10 + *(++ptr) - '0';
638        if (c < 0)        if (c < 0)    /* Integer overflow */
639          {          {
640          *errorcodeptr = ERR61;          *errorcodeptr = ERR61;
641          break;          break;
# Line 952  be terminated by '>' because that is che Line 976  be terminated by '>' because that is che
976    
977  Arguments:  Arguments:
978    ptr          current position in the pattern    ptr          current position in the pattern
979    count        current count of capturing parens so far encountered    cd           compile background data
980    name         name to seek, or NULL if seeking a numbered subpattern    name         name to seek, or NULL if seeking a numbered subpattern
981    lorn         name length, or subpattern number if name is NULL    lorn         name length, or subpattern number if name is NULL
982    xmode        TRUE if we are in /x mode    xmode        TRUE if we are in /x mode
# Line 961  Returns:       the number of the named s Line 985  Returns:       the number of the named s
985  */  */
986    
987  static int  static int
988  find_parens(const uschar *ptr, int count, const uschar *name, int lorn,  find_parens(const uschar *ptr, compile_data *cd, const uschar *name, int lorn,
989    BOOL xmode)    BOOL xmode)
990  {  {
991  const uschar *thisname;  const uschar *thisname;
992    int count = cd->bracount;
993    
994  for (; *ptr != 0; ptr++)  for (; *ptr != 0; ptr++)
995    {    {
# Line 984  for (; *ptr != 0; ptr++) Line 1009  for (; *ptr != 0; ptr++)
1009      continue;      continue;
1010      }      }
1011    
1012    /* Skip over character classes */    /* Skip over character classes; this logic must be similar to the way they
1013      are handled for real. If the first character is '^', skip it. Also, if the
1014      first few characters (either before or after ^) are \Q\E or \E we skip them
1015      too. This makes for compatibility with Perl. */
1016    
1017    if (*ptr == '[')    if (*ptr == '[')
1018      {      {
1019        BOOL negate_class = FALSE;
1020        for (;;)
1021          {
1022          int c = *(++ptr);
1023          if (c == '\\')
1024            {
1025            if (ptr[1] == 'E') ptr++;
1026              else if (strncmp((const char *)ptr+1, "Q\\E", 3) == 0) ptr += 3;
1027                else break;
1028            }
1029          else if (!negate_class && c == '^')
1030            negate_class = TRUE;
1031          else break;
1032          }
1033    
1034        /* If the next character is ']', it is a data character that must be
1035        skipped, except in JavaScript compatibility mode. */
1036    
1037        if (ptr[1] == ']' && (cd->external_options & PCRE_JAVASCRIPT_COMPAT) == 0)
1038          ptr++;
1039    
1040      while (*(++ptr) != ']')      while (*(++ptr) != ']')
1041        {        {
1042        if (*ptr == 0) return -1;        if (*ptr == 0) return -1;
# Line 1252  for (;;) Line 1301  for (;;)
1301      case OP_NOT_WORDCHAR:      case OP_NOT_WORDCHAR:
1302      case OP_WORDCHAR:      case OP_WORDCHAR:
1303      case OP_ANY:      case OP_ANY:
1304        case OP_ALLANY:
1305      branchlength++;      branchlength++;
1306      cc++;      cc++;
1307      break;      break;
# Line 1544  for (code = first_significant_code(code Line 1594  for (code = first_significant_code(code
1594    
1595    /* Groups with zero repeats can of course be empty; skip them. */    /* Groups with zero repeats can of course be empty; skip them. */
1596    
1597    if (c == OP_BRAZERO || c == OP_BRAMINZERO)    if (c == OP_BRAZERO || c == OP_BRAMINZERO || c == OP_SKIPZERO)
1598      {      {
1599      code += _pcre_OP_lengths[c];      code += _pcre_OP_lengths[c];
1600      do code += GET(code, 1); while (*code == OP_ALT);      do code += GET(code, 1); while (*code == OP_ALT);
# Line 1630  for (code = first_significant_code(code Line 1680  for (code = first_significant_code(code
1680      case OP_NOT_WORDCHAR:      case OP_NOT_WORDCHAR:
1681      case OP_WORDCHAR:      case OP_WORDCHAR:
1682      case OP_ANY:      case OP_ANY:
1683        case OP_ALLANY:
1684      case OP_ANYBYTE:      case OP_ANYBYTE:
1685      case OP_CHAR:      case OP_CHAR:
1686      case OP_CHARNC:      case OP_CHARNC:
# Line 1824  return -1; Line 1875  return -1;
1875  that is referenced. This means that groups can be replicated for fixed  that is referenced. This means that groups can be replicated for fixed
1876  repetition simply by copying (because the recursion is allowed to refer to  repetition simply by copying (because the recursion is allowed to refer to
1877  earlier groups that are outside the current group). However, when a group is  earlier groups that are outside the current group). However, when a group is
1878  optional (i.e. the minimum quantifier is zero), OP_BRAZERO is inserted before  optional (i.e. the minimum quantifier is zero), OP_BRAZERO or OP_SKIPZERO is
1879  it, after it has been compiled. This means that any OP_RECURSE items within it  inserted before it, after it has been compiled. This means that any OP_RECURSE
1880  that refer to the group itself or any contained groups have to have their  items within it that refer to the group itself or any contained groups have to
1881  offsets adjusted. That one of the jobs of this function. Before it is called,  have their offsets adjusted. That one of the jobs of this function. Before it
1882  the partially compiled regex must be temporarily terminated with OP_END.  is called, the partially compiled regex must be temporarily terminated with
1883    OP_END.
1884    
1885  This function has been extended with the possibility of forward references for  This function has been extended with the possibility of forward references for
1886  recursions and subroutine calls. It must also check the list of such references  recursions and subroutine calls. It must also check the list of such references
# Line 1859  while ((ptr = (uschar *)find_recurse(ptr Line 1911  while ((ptr = (uschar *)find_recurse(ptr
1911    
1912    /* See if this recursion is on the forward reference list. If so, adjust the    /* See if this recursion is on the forward reference list. If so, adjust the
1913    reference. */    reference. */
1914    
1915    for (hc = save_hwm; hc < cd->hwm; hc += LINK_SIZE)    for (hc = save_hwm; hc < cd->hwm; hc += LINK_SIZE)
1916      {      {
1917      offset = GET(hc, 0);      offset = GET(hc, 0);
# Line 2113  if (next >= 0) switch(op_code) Line 2165  if (next >= 0) switch(op_code)
2165    /* For OP_NOT, "item" must be a single-byte character. */    /* For OP_NOT, "item" must be a single-byte character. */
2166    
2167    case OP_NOT:    case OP_NOT:
   if (next < 0) return FALSE;  /* Not a character */  
2168    if (item == next) return TRUE;    if (item == next) return TRUE;
2169    if ((options & PCRE_CASELESS) == 0) return FALSE;    if ((options & PCRE_CASELESS) == 0) return FALSE;
2170  #ifdef SUPPORT_UTF8  #ifdef SUPPORT_UTF8
# Line 2376  uschar classbits[32]; Line 2427  uschar classbits[32];
2427  BOOL class_utf8;  BOOL class_utf8;
2428  BOOL utf8 = (options & PCRE_UTF8) != 0;  BOOL utf8 = (options & PCRE_UTF8) != 0;
2429  uschar *class_utf8data;  uschar *class_utf8data;
2430    uschar *class_utf8data_base;
2431  uschar utf8_char[6];  uschar utf8_char[6];
2432  #else  #else
2433  BOOL utf8 = FALSE;  BOOL utf8 = FALSE;
# Line 2435  for (;; ptr++) Line 2487  for (;; ptr++)
2487    /* Get next byte in the pattern */    /* Get next byte in the pattern */
2488    
2489    c = *ptr;    c = *ptr;
2490    
2491    /* If we are in the pre-compile phase, accumulate the length used for the    /* If we are in the pre-compile phase, accumulate the length used for the
2492    previous cycle of this loop. */    previous cycle of this loop. */
2493    
# Line 2615  for (;; ptr++) Line 2667  for (;; ptr++)
2667      zerofirstbyte = firstbyte;      zerofirstbyte = firstbyte;
2668      zeroreqbyte = reqbyte;      zeroreqbyte = reqbyte;
2669      previous = code;      previous = code;
2670      *code++ = OP_ANY;      *code++ = ((options & PCRE_DOTALL) != 0)? OP_ALLANY: OP_ANY;
2671      break;      break;
2672    
2673    
# Line 2630  for (;; ptr++) Line 2682  for (;; ptr++)
2682      opcode is compiled. It may optionally have a bit map for characters < 256,      opcode is compiled. It may optionally have a bit map for characters < 256,
2683      but those above are are explicitly listed afterwards. A flag byte tells      but those above are are explicitly listed afterwards. A flag byte tells
2684      whether the bitmap is present, and whether this is a negated class or not.      whether the bitmap is present, and whether this is a negated class or not.
2685      */  
2686        In JavaScript compatibility mode, an isolated ']' causes an error. In
2687        default (Perl) mode, it is treated as a data character. */
2688    
2689        case ']':
2690        if ((cd->external_options & PCRE_JAVASCRIPT_COMPAT) != 0)
2691          {
2692          *errorcodeptr = ERR64;
2693          goto FAILED;
2694          }
2695        goto NORMAL_CHAR;
2696    
2697      case '[':      case '[':
2698      previous = code;      previous = code;
# Line 2663  for (;; ptr++) Line 2725  for (;; ptr++)
2725          negate_class = TRUE;          negate_class = TRUE;
2726        else break;        else break;
2727        }        }
2728    
2729        /* Empty classes are allowed in JavaScript compatibility mode. Otherwise,
2730        an initial ']' is taken as a data character -- the code below handles
2731        that. In JS mode, [] must always fail, so generate OP_FAIL, whereas
2732        [^] must match any character, so generate OP_ALLANY. */
2733    
2734        if (c ==']' && (cd->external_options & PCRE_JAVASCRIPT_COMPAT) != 0)
2735          {
2736          *code++ = negate_class? OP_ALLANY : OP_FAIL;
2737          if (firstbyte == REQ_UNSET) firstbyte = REQ_NONE;
2738          zerofirstbyte = firstbyte;
2739          break;
2740          }
2741    
2742      /* If a class contains a negative special such as \S, we need to flip the      /* If a class contains a negative special such as \S, we need to flip the
2743      negation flag at the end, so that support for characters > 255 works      negation flag at the end, so that support for characters > 255 works
# Line 2687  for (;; ptr++) Line 2762  for (;; ptr++)
2762  #ifdef SUPPORT_UTF8  #ifdef SUPPORT_UTF8
2763      class_utf8 = FALSE;                       /* No chars >= 256 */      class_utf8 = FALSE;                       /* No chars >= 256 */
2764      class_utf8data = code + LINK_SIZE + 2;    /* For UTF-8 items */      class_utf8data = code + LINK_SIZE + 2;    /* For UTF-8 items */
2765        class_utf8data_base = class_utf8data;     /* For resetting in pass 1 */
2766  #endif  #endif
2767    
2768      /* Process characters until ] is reached. By writing this as a "do" it      /* Process characters until ] is reached. By writing this as a "do" it
# Line 2702  for (;; ptr++) Line 2778  for (;; ptr++)
2778          {                           /* Braces are required because the */          {                           /* Braces are required because the */
2779          GETCHARLEN(c, ptr, ptr);    /* macro generates multiple statements */          GETCHARLEN(c, ptr, ptr);    /* macro generates multiple statements */
2780          }          }
2781    
2782          /* In the pre-compile phase, accumulate the length of any UTF-8 extra
2783          data and reset the pointer. This is so that very large classes that
2784          contain a zillion UTF-8 characters no longer overwrite the work space
2785          (which is on the stack). */
2786    
2787          if (lengthptr != NULL)
2788            {
2789            *lengthptr += class_utf8data - class_utf8data_base;
2790            class_utf8data = class_utf8data_base;
2791            }
2792    
2793  #endif  #endif
2794    
2795        /* Inside \Q...\E everything is literal except \E */        /* Inside \Q...\E everything is literal except \E */
# Line 3806  we set the flag only if there is a liter Line 3894  we set the flag only if there is a liter
3894    
3895        if (repeat_min == 0)        if (repeat_min == 0)
3896          {          {
3897          /* If the maximum is also zero, we just omit the group from the output          /* If the maximum is also zero, we used to just omit the group from the
3898          altogether. */          output altogether, like this:
   
         if (repeat_max == 0)  
           {  
           code = previous;  
           goto END_REPEAT;  
           }  
3899    
3900          /* If the maximum is 1 or unlimited, we just have to stick in the          ** if (repeat_max == 0)
3901          BRAZERO and do no more at this point. However, we do need to adjust          **   {
3902          any OP_RECURSE calls inside the group that refer to the group itself or          **   code = previous;
3903          any internal or forward referenced group, because the offset is from          **   goto END_REPEAT;
3904          the start of the whole regex. Temporarily terminate the pattern while          **   }
3905          doing this. */  
3906            However, that fails when a group is referenced as a subroutine from
3907            elsewhere in the pattern, so now we stick in OP_SKIPZERO in front of it
3908            so that it is skipped on execution. As we don't have a list of which
3909            groups are referenced, we cannot do this selectively.
3910    
3911            If the maximum is 1 or unlimited, we just have to stick in the BRAZERO
3912            and do no more at this point. However, we do need to adjust any
3913            OP_RECURSE calls inside the group that refer to the group itself or any
3914            internal or forward referenced group, because the offset is from the
3915            start of the whole regex. Temporarily terminate the pattern while doing
3916            this. */
3917    
3918          if (repeat_max <= 1)          if (repeat_max <= 1)    /* Covers 0, 1, and unlimited */
3919            {            {
3920            *code = OP_END;            *code = OP_END;
3921            adjust_recurse(previous, 1, utf8, cd, save_hwm);            adjust_recurse(previous, 1, utf8, cd, save_hwm);
3922            memmove(previous+1, previous, len);            memmove(previous+1, previous, len);
3923            code++;            code++;
3924              if (repeat_max == 0)
3925                {
3926                *previous++ = OP_SKIPZERO;
3927                goto END_REPEAT;
3928                }
3929            *previous++ = OP_BRAZERO + repeat_type;            *previous++ = OP_BRAZERO + repeat_type;
3930            }            }
3931    
# Line 4021  we set the flag only if there is a liter Line 4119  we set the flag only if there is a liter
4119            }            }
4120          }          }
4121        }        }
4122    
4123        /* If previous is OP_FAIL, it was generated by an empty class [] in
4124        JavaScript mode. The other ways in which OP_FAIL can be generated, that is
4125        by (*FAIL) or (?!) set previous to NULL, which gives a "nothing to repeat"
4126        error above. We can just ignore the repeat in JS case. */
4127    
4128        else if (*previous == OP_FAIL) goto END_REPEAT;
4129    
4130      /* Else there's some kind of shambles */      /* Else there's some kind of shambles */
4131    
# Line 4102  we set the flag only if there is a liter Line 4207  we set the flag only if there is a liter
4207      bravalue = OP_CBRA;      bravalue = OP_CBRA;
4208      save_hwm = cd->hwm;      save_hwm = cd->hwm;
4209      reset_bracount = FALSE;      reset_bracount = FALSE;
4210    
4211      /* First deal with various "verbs" that can be introduced by '*'. */      /* First deal with various "verbs" that can be introduced by '*'. */
4212    
4213      if (*(++ptr) == '*' && (cd->ctypes[ptr[1]] & ctype_letter) != 0)      if (*(++ptr) == '*' && (cd->ctypes[ptr[1]] & ctype_letter) != 0)
# Line 4308  we set the flag only if there is a liter Line 4413  we set the flag only if there is a liter
4413    
4414          /* Search the pattern for a forward reference */          /* Search the pattern for a forward reference */
4415    
4416          else if ((i = find_parens(ptr, cd->bracount, name, namelen,          else if ((i = find_parens(ptr, cd, name, namelen,
4417                          (options & PCRE_EXTENDED) != 0)) > 0)                          (options & PCRE_EXTENDED) != 0)) > 0)
4418            {            {
4419            PUT2(code, 2+LINK_SIZE, i);            PUT2(code, 2+LINK_SIZE, i);
# Line 4554  we set the flag only if there is a liter Line 4659  we set the flag only if there is a liter
4659          references (?P=name) and recursion (?P>name), as well as falling          references (?P=name) and recursion (?P>name), as well as falling
4660          through from the Perl recursion syntax (?&name). We also come here from          through from the Perl recursion syntax (?&name). We also come here from
4661          the Perl \k<name> or \k'name' back reference syntax and the \k{name}          the Perl \k<name> or \k'name' back reference syntax and the \k{name}
4662          .NET syntax. */          .NET syntax, and the Oniguruma \g<...> and \g'...' subroutine syntax. */
4663    
4664          NAMED_REF_OR_RECURSE:          NAMED_REF_OR_RECURSE:
4665          name = ++ptr;          name = ++ptr;
# Line 4605  we set the flag only if there is a liter Line 4710  we set the flag only if there is a liter
4710              recno = GET2(slot, 0);              recno = GET2(slot, 0);
4711              }              }
4712            else if ((recno =                /* Forward back reference */            else if ((recno =                /* Forward back reference */
4713                      find_parens(ptr, cd->bracount, name, namelen,                      find_parens(ptr, cd, name, namelen,
4714                        (options & PCRE_EXTENDED) != 0)) <= 0)                        (options & PCRE_EXTENDED) != 0)) <= 0)
4715              {              {
4716              *errorcodeptr = ERR15;              *errorcodeptr = ERR15;
# Line 4632  we set the flag only if there is a liter Line 4737  we set the flag only if there is a liter
4737          case '5': case '6': case '7': case '8': case '9':   /* subroutine */          case '5': case '6': case '7': case '8': case '9':   /* subroutine */
4738            {            {
4739            const uschar *called;            const uschar *called;
4740              terminator = ')';
4741    
4742              /* Come here from the \g<...> and \g'...' code (Oniguruma
4743              compatibility). However, the syntax has been checked to ensure that
4744              the ... are a (signed) number, so that neither ERR63 nor ERR29 will
4745              be called on this path, nor with the jump to OTHER_CHAR_AFTER_QUERY
4746              ever be taken. */
4747    
4748              HANDLE_NUMERICAL_RECURSION:
4749    
4750            if ((refsign = *ptr) == '+')            if ((refsign = *ptr) == '+')
4751              {              {
# Line 4653  we set the flag only if there is a liter Line 4767  we set the flag only if there is a liter
4767            while((digitab[*ptr] & ctype_digit) != 0)            while((digitab[*ptr] & ctype_digit) != 0)
4768              recno = recno * 10 + *ptr++ - '0';              recno = recno * 10 + *ptr++ - '0';
4769    
4770            if (*ptr != ')')            if (*ptr != terminator)
4771              {              {
4772              *errorcodeptr = ERR29;              *errorcodeptr = ERR29;
4773              goto FAILED;              goto FAILED;
# Line 4706  we set the flag only if there is a liter Line 4820  we set the flag only if there is a liter
4820    
4821              if (called == NULL)              if (called == NULL)
4822                {                {
4823                if (find_parens(ptr, cd->bracount, NULL, recno,                if (find_parens(ptr, cd, NULL, recno,
4824                     (options & PCRE_EXTENDED) != 0) < 0)                      (options & PCRE_EXTENDED) != 0) < 0)
4825                  {                  {
4826                  *errorcodeptr = ERR15;                  *errorcodeptr = ERR15;
4827                  goto FAILED;                  goto FAILED;
# Line 5049  we set the flag only if there is a liter Line 5163  we set the flag only if there is a liter
5163      back references and those types that consume a character may be repeated.      back references and those types that consume a character may be repeated.
5164      We can test for values between ESC_b and ESC_Z for the latter; this may      We can test for values between ESC_b and ESC_Z for the latter; this may
5165      have to change if any new ones are ever created. */      have to change if any new ones are ever created. */
5166    
5167      case '\\':      case '\\':
5168      tempptr = ptr;      tempptr = ptr;
5169      c = check_escape(&ptr, errorcodeptr, cd->bracount, options, FALSE);      c = check_escape(&ptr, errorcodeptr, cd->bracount, options, FALSE);
# Line 5076  we set the flag only if there is a liter Line 5190  we set the flag only if there is a liter
5190    
5191        zerofirstbyte = firstbyte;        zerofirstbyte = firstbyte;
5192        zeroreqbyte = reqbyte;        zeroreqbyte = reqbyte;
5193    
5194          /* \g<name> or \g'name' is a subroutine call by name and \g<n> or \g'n'
5195          is a subroutine call by number (Oniguruma syntax). In fact, the value
5196          -ESC_g is returned only for these cases. So we don't need to check for <
5197          or ' if the value is -ESC_g. For the Perl syntax \g{n} the value is
5198          -ESC_REF+n, and for the Perl syntax \g{name} the result is -ESC_k (as
5199          that is a synonym for a named back reference). */
5200    
5201          if (-c == ESC_g)
5202            {
5203            const uschar *p;
5204            save_hwm = cd->hwm;   /* Normally this is set when '(' is read */
5205            terminator = (*(++ptr) == '<')? '>' : '\'';
5206    
5207            /* These two statements stop the compiler for warning about possibly
5208            unset variables caused by the jump to HANDLE_NUMERICAL_RECURSION. In
5209            fact, because we actually check for a number below, the paths that
5210            would actually be in error are never taken. */
5211    
5212            skipbytes = 0;
5213            reset_bracount = FALSE;
5214    
5215            /* Test for a name */
5216    
5217            if (ptr[1] != '+' && ptr[1] != '-')
5218              {
5219              BOOL isnumber = TRUE;
5220              for (p = ptr + 1; *p != 0 && *p != terminator; p++)
5221                {
5222                if ((cd->ctypes[*p] & ctype_digit) == 0) isnumber = FALSE;
5223                if ((cd->ctypes[*p] & ctype_word) == 0) break;
5224                }
5225              if (*p != terminator)
5226                {
5227                *errorcodeptr = ERR57;
5228                break;
5229                }
5230              if (isnumber)
5231                {
5232                ptr++;
5233                goto HANDLE_NUMERICAL_RECURSION;
5234                }
5235              is_recurse = TRUE;
5236              goto NAMED_REF_OR_RECURSE;
5237              }
5238    
5239            /* Test a signed number in angle brackets or quotes. */
5240    
5241            p = ptr + 2;
5242            while ((digitab[*p] & ctype_digit) != 0) p++;
5243            if (*p != terminator)
5244              {
5245              *errorcodeptr = ERR57;
5246              break;
5247              }
5248            ptr++;
5249            goto HANDLE_NUMERICAL_RECURSION;
5250            }
5251    
5252        /* \k<name> or \k'name' is a back reference by name (Perl syntax).        /* \k<name> or \k'name' is a back reference by name (Perl syntax).
5253        We also support \k{name} (.NET syntax) */        We also support \k{name} (.NET syntax) */
# Line 5583  do { Line 5755  do {
5755       if (!is_anchored(scode, options, bracket_map, backref_map)) return FALSE;       if (!is_anchored(scode, options, bracket_map, backref_map)) return FALSE;
5756       }       }
5757    
5758     /* .* is not anchored unless DOTALL is set and it isn't in brackets that     /* .* is not anchored unless DOTALL is set (which generates OP_ALLANY) and
5759     are or may be referenced. */     it isn't in brackets that are or may be referenced. */
5760    
5761     else if ((op == OP_TYPESTAR || op == OP_TYPEMINSTAR ||     else if ((op == OP_TYPESTAR || op == OP_TYPEMINSTAR ||
5762               op == OP_TYPEPOSSTAR) &&               op == OP_TYPEPOSSTAR))
             (*options & PCRE_DOTALL) != 0)  
5763       {       {
5764       if (scode[1] != OP_ANY || (bracket_map & backref_map) != 0) return FALSE;       if (scode[1] != OP_ALLANY || (bracket_map & backref_map) != 0)
5765           return FALSE;
5766       }       }
5767    
5768     /* Check for explicit anchoring */     /* Check for explicit anchoring */
# Line 5807  to fill in forward references to subpatt Line 5979  to fill in forward references to subpatt
5979    
5980  uschar cworkspace[COMPILE_WORK_SIZE];  uschar cworkspace[COMPILE_WORK_SIZE];
5981    
   
5982  /* Set this early so that early errors get offset 0. */  /* Set this early so that early errors get offset 0. */
5983    
5984  ptr = (const uschar *)pattern;  ptr = (const uschar *)pattern;
# Line 6096  while (errorcode == 0 && cd->hwm > cwork Line 6267  while (errorcode == 0 && cd->hwm > cwork
6267    if (groupptr == NULL) errorcode = ERR53;    if (groupptr == NULL) errorcode = ERR53;
6268      else PUT(((uschar *)codestart), offset, groupptr - codestart);      else PUT(((uschar *)codestart), offset, groupptr - codestart);
6269    }    }
6270    
6271  /* Give an error if there's back reference to a non-existent capturing  /* Give an error if there's back reference to a non-existent capturing
6272  subpattern. */  subpattern. */
6273    

Legend:
Removed from v.298  
changed lines
  Added in v.342

  ViewVC Help
Powered by ViewVC 1.1.5