/[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 335 by ph10, Sat Apr 12 14:36:14 2008 UTC revision 360 by ph10, Wed Jul 9 20:00:28 2008 UTC
# Line 302  static const char error_texts[] = Line 302  static const char error_texts[] =
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 532  else Line 533  else
533      break;      break;
534    
535      /* \g must be followed by one of a number of specific things:      /* \g must be followed by one of a number of specific things:
536    
537      (1) A number, either plain or braced. If positive, it is an absolute      (1) A number, either plain or braced. If positive, it is an absolute
538      backreference. If negative, it is a relative backreference. This is a Perl      backreference. If negative, it is a relative backreference. This is a Perl
539      5.10 feature.      5.10 feature.
540    
541      (2) Perl 5.10 also supports \g{name} as a reference to a named group. This      (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      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      this is synonymous with \k{name}, we fudge it up by pretending it really
544      was \k.      was \k.
545    
546      (3) For Oniguruma compatibility we also support \g followed by a name or a      (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      number either in angle brackets or in single quotes. However, these are
548      (possibly recursive) subroutine calls, _not_ backreferences. Just return      (possibly recursive) subroutine calls, _not_ backreferences. Just return
549      the -ESC_g code (cf \k). */      the -ESC_g code (cf \k). */
550    
551      case 'g':      case 'g':
552      if (ptr[1] == '<' || ptr[1] == '\'')      if (ptr[1] == '<' || ptr[1] == '\'')
553        {        {
554        c = -ESC_g;        c = -ESC_g;
555        break;        break;
556        }        }
557    
558      /* Handle the Perl-compatible cases */      /* Handle the Perl-compatible cases */
559    
560      if (ptr[1] == '{')      if (ptr[1] == '{')
561        {        {
562        const uschar *p;        const uschar *p;
# Line 587  else Line 588  else
588        *errorcodeptr = ERR61;        *errorcodeptr = ERR61;
589        break;        break;
590        }        }
591    
592      if (braced && *(++ptr) != '}')      if (braced && *(++ptr) != '}')
593        {        {
594        *errorcodeptr = ERR57;        *errorcodeptr = ERR57;
595        break;        break;
596        }        }
597    
598      if (c == 0)      if (c == 0)
599        {        {
600        *errorcodeptr = ERR58;        *errorcodeptr = ERR58;
601        break;        break;
602        }        }
603    
604      if (negated)      if (negated)
605        {        {
# Line 975  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 984  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 1007  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 1275  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 1653  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 1883  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 1987  get_othercase_range(unsigned int *cptr, Line 2015  get_othercase_range(unsigned int *cptr,
2015  unsigned int c, othercase, next;  unsigned int c, othercase, next;
2016    
2017  for (c = *cptr; c <= d; c++)  for (c = *cptr; c <= d; c++)
2018    { if ((othercase = _pcre_ucp_othercase(c)) != NOTACHAR) break; }    { if ((othercase = UCD_OTHERCASE(c)) != c) break; }
2019    
2020  if (c > d) return FALSE;  if (c > d) return FALSE;
2021    
# Line 1996  next = othercase + 1; Line 2024  next = othercase + 1;
2024    
2025  for (++c; c <= d; c++)  for (++c; c <= d; c++)
2026    {    {
2027    if (_pcre_ucp_othercase(c) != next) break;    if (UCD_OTHERCASE(c) != next) break;
2028    next++;    next++;
2029    }    }
2030    
# Line 2124  if (next >= 0) switch(op_code) Line 2152  if (next >= 0) switch(op_code)
2152      unsigned int othercase;      unsigned int othercase;
2153      if (next < 128) othercase = cd->fcc[next]; else      if (next < 128) othercase = cd->fcc[next]; else
2154  #ifdef SUPPORT_UCP  #ifdef SUPPORT_UCP
2155      othercase = _pcre_ucp_othercase((unsigned int)next);      othercase = UCD_OTHERCASE((unsigned int)next);
2156  #else  #else
2157      othercase = NOTACHAR;      othercase = NOTACHAR;
2158  #endif  #endif
# Line 2145  if (next >= 0) switch(op_code) Line 2173  if (next >= 0) switch(op_code)
2173      unsigned int othercase;      unsigned int othercase;
2174      if (next < 128) othercase = cd->fcc[next]; else      if (next < 128) othercase = cd->fcc[next]; else
2175  #ifdef SUPPORT_UCP  #ifdef SUPPORT_UCP
2176      othercase = _pcre_ucp_othercase(next);      othercase = UCD_OTHERCASE(next);
2177  #else  #else
2178      othercase = NOTACHAR;      othercase = NOTACHAR;
2179  #endif  #endif
# Line 2459  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 2639  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 2654  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 2688  for (;; ptr++) Line 2726  for (;; ptr++)
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
2744      correctly (they are all included in the class). */      correctly (they are all included in the class). */
# Line 3288  for (;; ptr++) Line 3339  for (;; ptr++)
3339          if ((options & PCRE_CASELESS) != 0)          if ((options & PCRE_CASELESS) != 0)
3340            {            {
3341            unsigned int othercase;            unsigned int othercase;
3342            if ((othercase = _pcre_ucp_othercase(c)) != NOTACHAR)            if ((othercase = UCD_OTHERCASE(c)) != c)
3343              {              {
3344              *class_utf8data++ = XCL_SINGLE;              *class_utf8data++ = XCL_SINGLE;
3345              class_utf8data += _pcre_ord2utf8(othercase, class_utf8data);              class_utf8data += _pcre_ord2utf8(othercase, class_utf8data);
# Line 3851  we set the flag only if there is a liter Line 3902  we set the flag only if there is a liter
3902          **   code = previous;          **   code = previous;
3903          **   goto END_REPEAT;          **   goto END_REPEAT;
3904          **   }          **   }
3905    
3906          However, that fails when a group is referenced as a subroutine from          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          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          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.          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          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          and do no more at this point. However, we do need to adjust any
# Line 3874  we set the flag only if there is a liter Line 3925  we set the flag only if there is a liter
3925              {              {
3926              *previous++ = OP_SKIPZERO;              *previous++ = OP_SKIPZERO;
3927              goto END_REPEAT;              goto END_REPEAT;
3928              }              }
3929            *previous++ = OP_BRAZERO + repeat_type;            *previous++ = OP_BRAZERO + repeat_type;
3930            }            }
3931    
# Line 4069  we set the flag only if there is a liter Line 4120  we set the flag only if there is a liter
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    
4132      else      else
# Line 4149  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 4355  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 4652  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 4680  we set the flag only if there is a liter Line 4738  we set the flag only if there is a liter
4738            {            {
4739            const uschar *called;            const uschar *called;
4740            terminator = ')';            terminator = ')';
4741    
4742            /* Come here from the \g<...> and \g'...' code (Oniguruma            /* Come here from the \g<...> and \g'...' code (Oniguruma
4743            compatibility). However, the syntax has been checked to ensure that            compatibility). However, the syntax has been checked to ensure that
4744            the ... are a (signed) number, so that neither ERR63 nor ERR29 will            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            be called on this path, nor with the jump to OTHER_CHAR_AFTER_QUERY
4746            ever be taken. */            ever be taken. */
4747    
4748            HANDLE_NUMERICAL_RECURSION:            HANDLE_NUMERICAL_RECURSION:
4749    
4750            if ((refsign = *ptr) == '+')            if ((refsign = *ptr) == '+')
4751              {              {
# Line 4762  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 4862  we set the flag only if there is a liter Line 4920  we set the flag only if there is a liter
4920          both phases.          both phases.
4921    
4922          If we are not at the pattern start, compile code to change the ims          If we are not at the pattern start, compile code to change the ims
4923          options if this setting actually changes any of them. We also pass the          options if this setting actually changes any of them, and reset the
4924          new setting back so that it can be put at the start of any following          greedy defaults and the case value for firstbyte and reqbyte. */
         branches, and when this group ends (if we are in a group), a resetting  
         item can be compiled. */  
4925    
4926          if (*ptr == ')')          if (*ptr == ')')
4927            {            {
# Line 4873  we set the flag only if there is a liter Line 4929  we set the flag only if there is a liter
4929                 (lengthptr == NULL || *lengthptr == 2 + 2*LINK_SIZE))                 (lengthptr == NULL || *lengthptr == 2 + 2*LINK_SIZE))
4930              {              {
4931              cd->external_options = newoptions;              cd->external_options = newoptions;
             options = newoptions;  
4932              }              }
4933           else           else
4934              {              {
# Line 4882  we set the flag only if there is a liter Line 4937  we set the flag only if there is a liter
4937                *code++ = OP_OPT;                *code++ = OP_OPT;
4938                *code++ = newoptions & PCRE_IMS;                *code++ = newoptions & PCRE_IMS;
4939                }                }
   
             /* Change options at this level, and pass them back for use  
             in subsequent branches. Reset the greedy defaults and the case  
             value for firstbyte and reqbyte. */  
   
             *optionsptr = options = newoptions;  
4940              greedy_default = ((newoptions & PCRE_UNGREEDY) != 0);              greedy_default = ((newoptions & PCRE_UNGREEDY) != 0);
4941              greedy_non_default = greedy_default ^ 1;              greedy_non_default = greedy_default ^ 1;
4942              req_caseopt = ((options & PCRE_CASELESS) != 0)? REQ_CASELESS : 0;              req_caseopt = ((newoptions & PCRE_CASELESS) != 0)? REQ_CASELESS : 0;
4943              }              }
4944    
4945              /* Change options at this level, and pass them back for use
4946              in subsequent branches. When not at the start of the pattern, this
4947              information is also necessary so that a resetting item can be
4948              compiled at the end of a group (if we are in a group). */
4949    
4950              *optionsptr = options = newoptions;
4951            previous = NULL;       /* This item can't be repeated */            previous = NULL;       /* This item can't be repeated */
4952            continue;              /* It is complete */            continue;              /* It is complete */
4953            }            }
# Line 5105  we set the flag only if there is a liter Line 5160  we set the flag only if there is a liter
5160      back references and those types that consume a character may be repeated.      back references and those types that consume a character may be repeated.
5161      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
5162      have to change if any new ones are ever created. */      have to change if any new ones are ever created. */
5163    
5164      case '\\':      case '\\':
5165      tempptr = ptr;      tempptr = ptr;
5166      c = check_escape(&ptr, errorcodeptr, cd->bracount, options, FALSE);      c = check_escape(&ptr, errorcodeptr, cd->bracount, options, FALSE);
# Line 5132  we set the flag only if there is a liter Line 5187  we set the flag only if there is a liter
5187    
5188        zerofirstbyte = firstbyte;        zerofirstbyte = firstbyte;
5189        zeroreqbyte = reqbyte;        zeroreqbyte = reqbyte;
5190    
5191        /* \g<name> or \g'name' is a subroutine call by name and \g<n> or \g'n'        /* \g<name> or \g'name' is a subroutine call by name and \g<n> or \g'n'
5192        is a subroutine call by number (Oniguruma syntax). In fact, the value        is a subroutine call by number (Oniguruma syntax). In fact, the value
5193        -ESC_g is returned only for these cases. So we don't need to check for <        -ESC_g is returned only for these cases. So we don't need to check for <
5194        or ' if the value is -ESC_g. For the Perl syntax \g{n} the value is        or ' if the value is -ESC_g. For the Perl syntax \g{n} the value is
5195        -ESC_REF+n, and for the Perl syntax \g{name} the result is -ESC_k (as        -ESC_REF+n, and for the Perl syntax \g{name} the result is -ESC_k (as
5196        that is a synonym for a named back reference). */        that is a synonym for a named back reference). */
5197    
5198        if (-c == ESC_g)        if (-c == ESC_g)
5199          {          {
5200          const uschar *p;          const uschar *p;
5201          save_hwm = cd->hwm;   /* Normally this is set when '(' is read */          save_hwm = cd->hwm;   /* Normally this is set when '(' is read */
5202          terminator = (*(++ptr) == '<')? '>' : '\'';          terminator = (*(++ptr) == '<')? '>' : '\'';
5203    
5204          /* These two statements stop the compiler for warning about possibly          /* These two statements stop the compiler for warning about possibly
5205          unset variables caused by the jump to HANDLE_NUMERICAL_RECURSION. In          unset variables caused by the jump to HANDLE_NUMERICAL_RECURSION. In
5206          fact, because we actually check for a number below, the paths that          fact, because we actually check for a number below, the paths that
5207          would actually be in error are never taken. */          would actually be in error are never taken. */
5208    
5209          skipbytes = 0;          skipbytes = 0;
5210          reset_bracount = FALSE;          reset_bracount = FALSE;
5211    
5212          /* Test for a name */          /* Test for a name */
5213    
5214          if (ptr[1] != '+' && ptr[1] != '-')          if (ptr[1] != '+' && ptr[1] != '-')
5215            {            {
5216            BOOL isnumber = TRUE;            BOOL isnumber = TRUE;
5217            for (p = ptr + 1; *p != 0 && *p != terminator; p++)            for (p = ptr + 1; *p != 0 && *p != terminator; p++)
5218              {              {
5219              if ((cd->ctypes[*p] & ctype_digit) == 0) isnumber = FALSE;              if ((cd->ctypes[*p] & ctype_digit) == 0) isnumber = FALSE;
5220              if ((cd->ctypes[*p] & ctype_word) == 0) break;              if ((cd->ctypes[*p] & ctype_word) == 0) break;
5221              }              }
5222            if (*p != terminator)            if (*p != terminator)
5223              {              {
5224              *errorcodeptr = ERR57;              *errorcodeptr = ERR57;
5225              break;              break;
5226              }              }
5227            if (isnumber)            if (isnumber)
5228              {              {
5229              ptr++;              ptr++;
5230              goto HANDLE_NUMERICAL_RECURSION;              goto HANDLE_NUMERICAL_RECURSION;
5231              }              }
5232            is_recurse = TRUE;            is_recurse = TRUE;
5233            goto NAMED_REF_OR_RECURSE;            goto NAMED_REF_OR_RECURSE;
5234            }            }
5235    
5236          /* Test a signed number in angle brackets or quotes. */          /* Test a signed number in angle brackets or quotes. */
5237    
5238          p = ptr + 2;          p = ptr + 2;
5239          while ((digitab[*p] & ctype_digit) != 0) p++;          while ((digitab[*p] & ctype_digit) != 0) p++;
5240          if (*p != terminator)          if (*p != terminator)
# Line 5187  we set the flag only if there is a liter Line 5242  we set the flag only if there is a liter
5242            *errorcodeptr = ERR57;            *errorcodeptr = ERR57;
5243            break;            break;
5244            }            }
5245          ptr++;          ptr++;
5246          goto HANDLE_NUMERICAL_RECURSION;          goto HANDLE_NUMERICAL_RECURSION;
5247          }          }
5248    
5249        /* \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).
5250        We also support \k{name} (.NET syntax) */        We also support \k{name} (.NET syntax) */
# Line 5697  do { Line 5752  do {
5752       if (!is_anchored(scode, options, bracket_map, backref_map)) return FALSE;       if (!is_anchored(scode, options, bracket_map, backref_map)) return FALSE;
5753       }       }
5754    
5755     /* .* 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
5756     are or may be referenced. */     it isn't in brackets that are or may be referenced. */
5757    
5758     else if ((op == OP_TYPESTAR || op == OP_TYPEMINSTAR ||     else if ((op == OP_TYPESTAR || op == OP_TYPEMINSTAR ||
5759               op == OP_TYPEPOSSTAR) &&               op == OP_TYPEPOSSTAR))
             (*options & PCRE_DOTALL) != 0)  
5760       {       {
5761       if (scode[1] != OP_ANY || (bracket_map & backref_map) != 0) return FALSE;       if (scode[1] != OP_ALLANY || (bracket_map & backref_map) != 0)
5762           return FALSE;
5763       }       }
5764    
5765     /* Check for explicit anchoring */     /* Check for explicit anchoring */
# Line 5886  Returns:        pointer to compiled data Line 5941  Returns:        pointer to compiled data
5941                  with errorptr and erroroffset set                  with errorptr and erroroffset set
5942  */  */
5943    
5944  PCRE_EXP_DEFN pcre *  PCRE_EXP_DEFN pcre * PCRE_CALL_CONVENTION
5945  pcre_compile(const char *pattern, int options, const char **errorptr,  pcre_compile(const char *pattern, int options, const char **errorptr,
5946    int *erroroffset, const unsigned char *tables)    int *erroroffset, const unsigned char *tables)
5947  {  {
# Line 5894  return pcre_compile2(pattern, options, N Line 5949  return pcre_compile2(pattern, options, N
5949  }  }
5950    
5951    
5952  PCRE_EXP_DEFN pcre *  PCRE_EXP_DEFN pcre * PCRE_CALL_CONVENTION
5953  pcre_compile2(const char *pattern, int options, int *errorcodeptr,  pcre_compile2(const char *pattern, int options, int *errorcodeptr,
5954    const char **errorptr, int *erroroffset, const unsigned char *tables)    const char **errorptr, int *erroroffset, const unsigned char *tables)
5955  {  {
# Line 6209  while (errorcode == 0 && cd->hwm > cwork Line 6264  while (errorcode == 0 && cd->hwm > cwork
6264    if (groupptr == NULL) errorcode = ERR53;    if (groupptr == NULL) errorcode = ERR53;
6265      else PUT(((uschar *)codestart), offset, groupptr - codestart);      else PUT(((uschar *)codestart), offset, groupptr - codestart);
6266    }    }
6267    
6268  /* 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
6269  subpattern. */  subpattern. */
6270    

Legend:
Removed from v.335  
changed lines
  Added in v.360

  ViewVC Help
Powered by ViewVC 1.1.5