/[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 208 by ph10, Mon Aug 6 15:23:29 2007 UTC revision 210 by ph10, Wed Aug 8 14:24:50 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  };  };
287    
288    
# Line 941  for (; *ptr != 0; ptr++) Line 965  for (; *ptr != 0; ptr++)
965    /* An opening parens must now be a real metacharacter */    /* An opening parens must now be a real metacharacter */
966    
967    if (*ptr != '(') continue;    if (*ptr != '(') continue;
968    if (ptr[1] != '?')    if (ptr[1] != '?' && ptr[1] != '*')
969      {      {
970      count++;      count++;
971      if (name == NULL && count == lorn) return count;      if (name == NULL && count == lorn) return count;
# Line 3860  for (;; ptr++) Line 3884  for (;; ptr++)
3884      /* ===================================================================*/      /* ===================================================================*/
3885      /* Start of nested parenthesized sub-expression, or comment or lookahead or      /* Start of nested parenthesized sub-expression, or comment or lookahead or
3886      lookbehind or option setting or condition or all the other extended      lookbehind or option setting or condition or all the other extended
3887      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. */  
3888    
3889      case '(':      case '(':
3890      newoptions = options;      newoptions = options;
# Line 3870  for (;; ptr++) Line 3892  for (;; ptr++)
3892      bravalue = OP_CBRA;      bravalue = OP_CBRA;
3893      save_hwm = cd->hwm;      save_hwm = cd->hwm;
3894      reset_bracount = FALSE;      reset_bracount = FALSE;
3895    
3896        /* First deal with various "verbs" that can be introduced by '*'. */
3897    
3898        if (*(++ptr) == '*' && (cd->ctypes[ptr[1]] & ctype_letter) != 0)
3899          {
3900          int i, namelen;
3901          const uschar *name = ++ptr;
3902          previous = NULL;
3903          while ((cd->ctypes[*++ptr] & ctype_letter) != 0);
3904          if (*ptr == ':')
3905            {
3906            *errorcodeptr = ERR59;   /* Not supported */
3907            goto FAILED;
3908            }
3909          if (*ptr != ')')
3910            {
3911            *errorcodeptr = ERR60;
3912            goto FAILED;
3913            }
3914          namelen = ptr - name;
3915          for (i = 0; i < verbcount; i++)
3916            {
3917            if (namelen == verbs[i].len &&
3918                strncmp((char *)name, verbs[i].name, namelen) == 0)
3919              {
3920              *code = verbs[i].op;
3921              if (*code++ == OP_ACCEPT) cd->had_accept = TRUE;
3922              break;
3923              }
3924            }
3925          if (i < verbcount) continue;
3926          *errorcodeptr = ERR60;
3927          goto FAILED;
3928          }
3929    
3930        /* Deal with the extended parentheses; all are introduced by '?', and the
3931        appearance of any of them means that this is not a capturing group. */
3932    
3933      if (*(++ptr) == '?')      else if (*ptr == '?')
3934        {        {
3935        int i, set, unset, namelen;        int i, set, unset, namelen;
3936        int *optset;        int *optset;
# Line 4113  for (;; ptr++) Line 4172  for (;; ptr++)
4172    
4173          /* ------------------------------------------------------------ */          /* ------------------------------------------------------------ */
4174          case '!':                 /* Negative lookahead */          case '!':                 /* Negative lookahead */
         bravalue = OP_ASSERT_NOT;  
4175          ptr++;          ptr++;
4176            if (*ptr == ')')          /* Optimize (?!) */
4177              {
4178              *code++ = OP_FAIL;
4179              previous = NULL;
4180              continue;
4181              }
4182            bravalue = OP_ASSERT_NOT;
4183          break;          break;
4184    
4185    
# Line 5706  cd->start_code = codestart; Line 5771  cd->start_code = codestart;
5771  cd->hwm = cworkspace;  cd->hwm = cworkspace;
5772  cd->req_varyopt = 0;  cd->req_varyopt = 0;
5773  cd->nopartial = FALSE;  cd->nopartial = FALSE;
5774    cd->had_accept = FALSE;
5775    
5776  /* Set up a starting, non-extracting bracket, then compile the expression. On  /* Set up a starting, non-extracting bracket, then compile the expression. On
5777  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 5786  re->top_bracket = cd->bracount;
5786  re->top_backref = cd->top_backref;  re->top_backref = cd->top_backref;
5787    
5788  if (cd->nopartial) re->options |= PCRE_NOPARTIAL;  if (cd->nopartial) re->options |= PCRE_NOPARTIAL;
5789    if (cd->had_accept) reqbyte = -1;   /* Must disable after (*ACCEPT) */
5790    
5791  /* 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. */
5792    

Legend:
Removed from v.208  
changed lines
  Added in v.210

webmaster@exim.org
ViewVC Help
Powered by ViewVC 1.1.12