/[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 205 by ph10, Fri Aug 3 13:18:33 2007 UTC revision 216 by ph10, Wed Aug 15 14:35:57 2007 UTC
# Line 140  static const short int escapes[] = { Line 140  static const short int escapes[] = {
140  #endif  #endif
141    
142    
143    /* Table of special "verbs" like (*PRUNE) */
144    
145    typedef struct verbitem {
146      const char *name;
147      int   len;
148      int   op;
149    } verbitem;
150    
151    static verbitem verbs[] = {
152      { "ACCEPT", 6, OP_ACCEPT },
153      { "COMMIT", 6, OP_COMMIT },
154      { "F",      1, OP_FAIL },
155      { "FAIL",   4, OP_FAIL },
156      { "PRUNE",  5, OP_PRUNE },
157      { "SKIP",   4, OP_SKIP  },
158      { "THEN",   4, OP_THEN  }
159    };
160    
161    static int verbcount = sizeof(verbs)/sizeof(verbitem);
162    
163    
164  /* Tables of names of POSIX character classes and their lengths. The list is  /* Tables of names of POSIX character classes and their lengths. The list is
165  terminated by a zero length entry. The first three must be alpha, lower, upper,  terminated by a zero length entry. The first three must be alpha, lower, upper,
166  as this is assumed for handling case independence. */  as this is assumed for handling case independence. */
# Line 258  static const char *error_texts[] = { Line 279  static const char *error_texts[] = {
279    "repeating a DEFINE group is not allowed",    "repeating a DEFINE group is not allowed",
280    "inconsistent NEWLINE options",    "inconsistent NEWLINE options",
281    "\\g is not followed by a braced name or an optionally braced non-zero number",    "\\g is not followed by a braced name or an optionally braced non-zero number",
282    "(?+ or (?- or (?(+ or (?(- must be followed by a non-zero number"    "(?+ or (?- or (?(+ or (?(- must be followed by a non-zero number",
283      "(*VERB) with an argument is not supported",
284      /* 60 */
285      "(*VERB) not recognized",
286      "number is too big"
287  };  };
288    
289    
# Line 415  Arguments: Line 440  Arguments:
440    
441  Returns:         zero or positive => a data character  Returns:         zero or positive => a data character
442                   negative => a special escape sequence                   negative => a special escape sequence
443                   on error, errorptr is set                   on error, errorcodeptr is set
444  */  */
445    
446  static int  static int
# Line 499  else Line 524  else
524      c = 0;      c = 0;
525      while ((digitab[ptr[1]] & ctype_digit) != 0)      while ((digitab[ptr[1]] & ctype_digit) != 0)
526        c = c * 10 + *(++ptr) - '0';        c = c * 10 + *(++ptr) - '0';
527    
528        if (c < 0)
529          {
530          *errorcodeptr = ERR61;
531          break;
532          }
533    
534      if (c == 0 || (braced && *(++ptr) != '}'))      if (c == 0 || (braced && *(++ptr) != '}'))
535        {        {
536        *errorcodeptr = ERR57;        *errorcodeptr = ERR57;
537        return 0;        break;
538        }        }
539    
540      if (negated)      if (negated)
# Line 511  else Line 542  else
542        if (c > bracount)        if (c > bracount)
543          {          {
544          *errorcodeptr = ERR15;          *errorcodeptr = ERR15;
545          return 0;          break;
546          }          }
547        c = bracount - (c - 1);        c = bracount - (c - 1);
548        }        }
# Line 540  else Line 571  else
571        c -= '0';        c -= '0';
572        while ((digitab[ptr[1]] & ctype_digit) != 0)        while ((digitab[ptr[1]] & ctype_digit) != 0)
573          c = c * 10 + *(++ptr) - '0';          c = c * 10 + *(++ptr) - '0';
574          if (c < 0)
575            {
576            *errorcodeptr = ERR61;
577            break;
578            }
579        if (c < 10 || c <= bracount)        if (c < 10 || c <= bracount)
580          {          {
581          c = -(ESC_REF + c);          c = -(ESC_REF + c);
# Line 635  else Line 671  else
671      if (c == 0)      if (c == 0)
672        {        {
673        *errorcodeptr = ERR2;        *errorcodeptr = ERR2;
674        return 0;        break;
675        }        }
676    
677  #ifndef EBCDIC  /* ASCII coding */  #ifndef EBCDIC  /* ASCII coding */
# Line 914  for (; *ptr != 0; ptr++) Line 950  for (; *ptr != 0; ptr++)
950      {      {
951      while (*(++ptr) != ']')      while (*(++ptr) != ']')
952        {        {
953          if (*ptr == 0) return -1;
954        if (*ptr == '\\')        if (*ptr == '\\')
955          {          {
956          if (*(++ptr) == 0) return -1;          if (*(++ptr) == 0) return -1;
# Line 941  for (; *ptr != 0; ptr++) Line 978  for (; *ptr != 0; ptr++)
978    /* An opening parens must now be a real metacharacter */    /* An opening parens must now be a real metacharacter */
979    
980    if (*ptr != '(') continue;    if (*ptr != '(') continue;
981    if (ptr[1] != '?')    if (ptr[1] != '?' && ptr[1] != '*')
982      {      {
983      count++;      count++;
984      if (name == NULL && count == lorn) return count;      if (name == NULL && count == lorn) return count;
# Line 1409  for (code = first_significant_code(code Line 1446  for (code = first_significant_code(code
1446    
1447    /* For other groups, scan the branches. */    /* For other groups, scan the branches. */
1448    
1449    if (c == OP_BRA || c == OP_CBRA || c == OP_ONCE)    if (c == OP_BRA || c == OP_CBRA || c == OP_ONCE || c == OP_COND)
1450      {      {
1451      BOOL empty_branch;      BOOL empty_branch;
1452      if (GET(code, 1) == 0) return TRUE;    /* Hit unclosed bracket */      if (GET(code, 1) == 0) return TRUE;    /* Hit unclosed bracket */
# Line 1433  for (code = first_significant_code(code Line 1470  for (code = first_significant_code(code
1470    
1471    switch (c)    switch (c)
1472      {      {
1473      /* Check for quantifiers after a class */      /* Check for quantifiers after a class. XCLASS is used for classes that
1474        cannot be represented just by a bit map. This includes negated single
1475        high-valued characters. The length in _pcre_OP_lengths[] is zero; the
1476        actual length is stored in the compiled code, so we must update "code"
1477        here. */
1478    
1479  #ifdef SUPPORT_UTF8  #ifdef SUPPORT_UTF8
1480      case OP_XCLASS:      case OP_XCLASS:
1481      ccode = code + GET(code, 1);      ccode = code += GET(code, 1);
1482      goto CHECK_CLASS_REPEAT;      goto CHECK_CLASS_REPEAT;
1483  #endif  #endif
1484    
# Line 2454  for (;; ptr++) Line 2495  for (;; ptr++)
2495        }        }
2496    
2497      /* If the first character is '^', set the negation flag and skip it. Also,      /* If the first character is '^', set the negation flag and skip it. Also,
2498      if the first few characters (either before or after ^) are \Q\E or \E we      if the first few characters (either before or after ^) are \Q\E or \E we
2499      skip them too. This makes for compatibility with Perl. */      skip them too. This makes for compatibility with Perl. */
2500    
2501      negate_class = FALSE;      negate_class = FALSE;
2502      for (;;)      for (;;)
2503        {        {
2504        c = *(++ptr);        c = *(++ptr);
2505        if (c == '\\')        if (c == '\\')
2506          {          {
2507          if (ptr[1] == 'E') ptr++;          if (ptr[1] == 'E') ptr++;
2508            else if (strncmp((const char *)ptr+1, "Q\\E", 3) == 0) ptr += 3;            else if (strncmp((const char *)ptr+1, "Q\\E", 3) == 0) ptr += 3;
2509              else break;              else break;
2510          }          }
2511        else if (!negate_class && c == '^')        else if (!negate_class && c == '^')
2512          negate_class = TRUE;          negate_class = TRUE;
2513        else break;        else break;
2514        }        }
2515    
2516      /* Keep a count of chars with values < 256 so that we can optimize the case      /* Keep a count of chars with values < 256 so that we can optimize the case
2517      of just a single character (as long as it's < 256). However, For higher      of just a single character (as long as it's < 256). However, For higher
# Line 3075  for (;; ptr++) Line 3116  for (;; ptr++)
3116        *errorcodeptr = ERR6;        *errorcodeptr = ERR6;
3117        goto FAILED;        goto FAILED;
3118        }        }
3119    
3120      /* If class_charcount is 1, we saw precisely one character whose value is      /* If class_charcount is 1, we saw precisely one character whose value is
3121      less than 256. In non-UTF-8 mode we can always optimize. In UTF-8 mode, we      less than 256. In non-UTF-8 mode we can always optimize. In UTF-8 mode, we
3122      can optimize the negative case only if there were no characters >= 128      can optimize the negative case only if there were no characters >= 128
# Line 3860  for (;; ptr++) Line 3901  for (;; ptr++)
3901      /* ===================================================================*/      /* ===================================================================*/
3902      /* Start of nested parenthesized sub-expression, or comment or lookahead or      /* Start of nested parenthesized sub-expression, or comment or lookahead or
3903      lookbehind or option setting or condition or all the other extended      lookbehind or option setting or condition or all the other extended
3904      parenthesis forms. First deal with the specials; all are introduced by ?,      parenthesis forms.  */
     and the appearance of any of them means that this is not a capturing  
     group. */  
3905    
3906      case '(':      case '(':
3907      newoptions = options;      newoptions = options;
# Line 3871  for (;; ptr++) Line 3910  for (;; ptr++)
3910      save_hwm = cd->hwm;      save_hwm = cd->hwm;
3911      reset_bracount = FALSE;      reset_bracount = FALSE;
3912    
3913      if (*(++ptr) == '?')      /* First deal with various "verbs" that can be introduced by '*'. */
3914    
3915        if (*(++ptr) == '*' && (cd->ctypes[ptr[1]] & ctype_letter) != 0)
3916          {
3917          int i, namelen;
3918          const uschar *name = ++ptr;
3919          previous = NULL;
3920          while ((cd->ctypes[*++ptr] & ctype_letter) != 0);
3921          if (*ptr == ':')
3922            {
3923            *errorcodeptr = ERR59;   /* Not supported */
3924            goto FAILED;
3925            }
3926          if (*ptr != ')')
3927            {
3928            *errorcodeptr = ERR60;
3929            goto FAILED;
3930            }
3931          namelen = ptr - name;
3932          for (i = 0; i < verbcount; i++)
3933            {
3934            if (namelen == verbs[i].len &&
3935                strncmp((char *)name, verbs[i].name, namelen) == 0)
3936              {
3937              *code = verbs[i].op;
3938              if (*code++ == OP_ACCEPT) cd->had_accept = TRUE;
3939              break;
3940              }
3941            }
3942          if (i < verbcount) continue;
3943          *errorcodeptr = ERR60;
3944          goto FAILED;
3945          }
3946    
3947        /* Deal with the extended parentheses; all are introduced by '?', and the
3948        appearance of any of them means that this is not a capturing group. */
3949    
3950        else if (*ptr == '?')
3951        {        {
3952        int i, set, unset, namelen;        int i, set, unset, namelen;
3953        int *optset;        int *optset;
# Line 4113  for (;; ptr++) Line 4189  for (;; ptr++)
4189    
4190          /* ------------------------------------------------------------ */          /* ------------------------------------------------------------ */
4191          case '!':                 /* Negative lookahead */          case '!':                 /* Negative lookahead */
         bravalue = OP_ASSERT_NOT;  
4192          ptr++;          ptr++;
4193            if (*ptr == ')')          /* Optimize (?!) */
4194              {
4195              *code++ = OP_FAIL;
4196              previous = NULL;
4197              continue;
4198              }
4199            bravalue = OP_ASSERT_NOT;
4200          break;          break;
4201    
4202    
# Line 5706  cd->start_code = codestart; Line 5788  cd->start_code = codestart;
5788  cd->hwm = cworkspace;  cd->hwm = cworkspace;
5789  cd->req_varyopt = 0;  cd->req_varyopt = 0;
5790  cd->nopartial = FALSE;  cd->nopartial = FALSE;
5791    cd->had_accept = FALSE;
5792    
5793  /* Set up a starting, non-extracting bracket, then compile the expression. On  /* Set up a starting, non-extracting bracket, then compile the expression. On
5794  error, errorcode will be set non-zero, so we don't need to look at the result  error, errorcode will be set non-zero, so we don't need to look at the result
# Line 5720  re->top_bracket = cd->bracount; Line 5803  re->top_bracket = cd->bracount;
5803  re->top_backref = cd->top_backref;  re->top_backref = cd->top_backref;
5804    
5805  if (cd->nopartial) re->options |= PCRE_NOPARTIAL;  if (cd->nopartial) re->options |= PCRE_NOPARTIAL;
5806    if (cd->had_accept) reqbyte = -1;   /* Must disable after (*ACCEPT) */
5807    
5808  /* If not reached end of pattern on success, there's an excess bracket. */  /* If not reached end of pattern on success, there's an excess bracket. */
5809    

Legend:
Removed from v.205  
changed lines
  Added in v.216

  ViewVC Help
Powered by ViewVC 1.1.5