/[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 221 by ph10, Fri Aug 17 09:25:08 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 500  else Line 525  else
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 1069  for (;;) Line 1106  for (;;)
1106    {    {
1107    int d;    int d;
1108    register int op = *cc;    register int op = *cc;
   
1109    switch (op)    switch (op)
1110      {      {
1111      case OP_CBRA:      case OP_CBRA:
# Line 1158  for (;;) Line 1194  for (;;)
1194    
1195      case OP_TYPEEXACT:      case OP_TYPEEXACT:
1196      branchlength += GET2(cc,1);      branchlength += GET2(cc,1);
1197        if (cc[3] == OP_PROP || cc[3] == OP_NOTPROP) cc += 2;
1198      cc += 4;      cc += 4;
1199      break;      break;
1200    
# Line 1266  for (;;) Line 1303  for (;;)
1303      code += _pcre_OP_lengths[c];      code += _pcre_OP_lengths[c];
1304      }      }
1305    
1306    /* In UTF-8 mode, opcodes that are followed by a character may be followed by    /* Otherwise, we can get the item's length from the table, except that for
1307    a multi-byte character. The length in the table is a minimum, so we have to    repeated character types, we have to test for \p and \P, which have an extra
1308    arrange to skip the extra bytes. */    two bytes of parameters. */
1309    
1310    else    else
1311      {      {
1312        switch(c)
1313          {
1314          case OP_TYPESTAR:
1315          case OP_TYPEMINSTAR:
1316          case OP_TYPEPLUS:
1317          case OP_TYPEMINPLUS:
1318          case OP_TYPEQUERY:
1319          case OP_TYPEMINQUERY:
1320          case OP_TYPEPOSSTAR:
1321          case OP_TYPEPOSPLUS:
1322          case OP_TYPEPOSQUERY:
1323          if (code[1] == OP_PROP || code[1] == OP_NOTPROP) code += 2;
1324          break;
1325    
1326          case OP_TYPEUPTO:
1327          case OP_TYPEMINUPTO:
1328          case OP_TYPEEXACT:
1329          case OP_TYPEPOSUPTO:
1330          if (code[3] == OP_PROP || code[3] == OP_NOTPROP) code += 2;
1331          break;
1332          }
1333    
1334        /* Add in the fixed length from the table */
1335    
1336      code += _pcre_OP_lengths[c];      code += _pcre_OP_lengths[c];
1337    
1338      /* In UTF-8 mode, opcodes that are followed by a character may be followed by
1339      a multi-byte character. The length in the table is a minimum, so we have to
1340      arrange to skip the extra bytes. */
1341    
1342  #ifdef SUPPORT_UTF8  #ifdef SUPPORT_UTF8
1343      if (utf8) switch(c)      if (utf8) switch(c)
1344        {        {
# Line 1330  for (;;) Line 1396  for (;;)
1396    
1397    if (c == OP_XCLASS) code += GET(code, 1);    if (c == OP_XCLASS) code += GET(code, 1);
1398    
1399    /* Otherwise, we get the item's length from the table. In UTF-8 mode, opcodes    /* Otherwise, we can get the item's length from the table, except that for
1400    that are followed by a character may be followed by a multi-byte character.    repeated character types, we have to test for \p and \P, which have an extra
1401    The length in the table is a minimum, so we have to arrange to skip the extra    two bytes of parameters. */
   bytes. */  
1402    
1403    else    else
1404      {      {
1405        switch(c)
1406          {
1407          case OP_TYPESTAR:
1408          case OP_TYPEMINSTAR:
1409          case OP_TYPEPLUS:
1410          case OP_TYPEMINPLUS:
1411          case OP_TYPEQUERY:
1412          case OP_TYPEMINQUERY:
1413          case OP_TYPEPOSSTAR:
1414          case OP_TYPEPOSPLUS:
1415          case OP_TYPEPOSQUERY:
1416          if (code[1] == OP_PROP || code[1] == OP_NOTPROP) code += 2;
1417          break;
1418    
1419          case OP_TYPEPOSUPTO:
1420          case OP_TYPEUPTO:
1421          case OP_TYPEMINUPTO:
1422          case OP_TYPEEXACT:
1423          if (code[3] == OP_PROP || code[3] == OP_NOTPROP) code += 2;
1424          break;
1425          }
1426    
1427        /* Add in the fixed length from the table */
1428    
1429      code += _pcre_OP_lengths[c];      code += _pcre_OP_lengths[c];
1430    
1431        /* In UTF-8 mode, opcodes that are followed by a character may be followed
1432        by a multi-byte character. The length in the table is a minimum, so we have
1433        to arrange to skip the extra bytes. */
1434    
1435  #ifdef SUPPORT_UTF8  #ifdef SUPPORT_UTF8
1436      if (utf8) switch(c)      if (utf8) switch(c)
1437        {        {
# Line 1409  for (code = first_significant_code(code Line 1503  for (code = first_significant_code(code
1503    
1504    /* For other groups, scan the branches. */    /* For other groups, scan the branches. */
1505    
1506    if (c == OP_BRA || c == OP_CBRA || c == OP_ONCE)    if (c == OP_BRA || c == OP_CBRA || c == OP_ONCE || c == OP_COND)
1507      {      {
1508      BOOL empty_branch;      BOOL empty_branch;
1509      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 1527  for (code = first_significant_code(code
1527    
1528    switch (c)    switch (c)
1529      {      {
1530      /* Check for quantifiers after a class */      /* Check for quantifiers after a class. XCLASS is used for classes that
1531        cannot be represented just by a bit map. This includes negated single
1532        high-valued characters. The length in _pcre_OP_lengths[] is zero; the
1533        actual length is stored in the compiled code, so we must update "code"
1534        here. */
1535    
1536  #ifdef SUPPORT_UTF8  #ifdef SUPPORT_UTF8
1537      case OP_XCLASS:      case OP_XCLASS:
1538      ccode = code + GET(code, 1);      ccode = code += GET(code, 1);
1539      goto CHECK_CLASS_REPEAT;      goto CHECK_CLASS_REPEAT;
1540  #endif  #endif
1541    
# Line 2454  for (;; ptr++) Line 2552  for (;; ptr++)
2552        }        }
2553    
2554      /* 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,
2555      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
2556      skip them too. This makes for compatibility with Perl. */      skip them too. This makes for compatibility with Perl. */
2557    
2558      negate_class = FALSE;      negate_class = FALSE;
2559      for (;;)      for (;;)
2560        {        {
2561        c = *(++ptr);        c = *(++ptr);
2562        if (c == '\\')        if (c == '\\')
2563          {          {
2564          if (ptr[1] == 'E') ptr++;          if (ptr[1] == 'E') ptr++;
2565            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;
2566              else break;              else break;
2567          }          }
2568        else if (!negate_class && c == '^')        else if (!negate_class && c == '^')
2569          negate_class = TRUE;          negate_class = TRUE;
2570        else break;        else break;
2571        }        }
2572    
2573      /* 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
2574      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 2630  for (;; ptr++) Line 2728  for (;; ptr++)
2728            else inescq = TRUE;            else inescq = TRUE;
2729            continue;            continue;
2730            }            }
2731            else if (-c == ESC_E) continue;  /* Ignore orphan \E */
2732    
2733          if (c < 0)          if (c < 0)
2734            {            {
# Line 3075  for (;; ptr++) Line 3174  for (;; ptr++)
3174        *errorcodeptr = ERR6;        *errorcodeptr = ERR6;
3175        goto FAILED;        goto FAILED;
3176        }        }
3177    
3178      /* 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
3179      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
3180      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 3959  for (;; ptr++)
3959      /* ===================================================================*/      /* ===================================================================*/
3960      /* Start of nested parenthesized sub-expression, or comment or lookahead or      /* Start of nested parenthesized sub-expression, or comment or lookahead or
3961      lookbehind or option setting or condition or all the other extended      lookbehind or option setting or condition or all the other extended
3962      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. */  
3963    
3964      case '(':      case '(':
3965      newoptions = options;      newoptions = options;
# Line 3871  for (;; ptr++) Line 3968  for (;; ptr++)
3968      save_hwm = cd->hwm;      save_hwm = cd->hwm;
3969      reset_bracount = FALSE;      reset_bracount = FALSE;
3970    
3971      if (*(++ptr) == '?')      /* First deal with various "verbs" that can be introduced by '*'. */
3972    
3973        if (*(++ptr) == '*' && (cd->ctypes[ptr[1]] & ctype_letter) != 0)
3974          {
3975          int i, namelen;
3976          const uschar *name = ++ptr;
3977          previous = NULL;
3978          while ((cd->ctypes[*++ptr] & ctype_letter) != 0);
3979          if (*ptr == ':')
3980            {
3981            *errorcodeptr = ERR59;   /* Not supported */
3982            goto FAILED;
3983            }
3984          if (*ptr != ')')
3985            {
3986            *errorcodeptr = ERR60;
3987            goto FAILED;
3988            }
3989          namelen = ptr - name;
3990          for (i = 0; i < verbcount; i++)
3991            {
3992            if (namelen == verbs[i].len &&
3993                strncmp((char *)name, verbs[i].name, namelen) == 0)
3994              {
3995              *code = verbs[i].op;
3996              if (*code++ == OP_ACCEPT) cd->had_accept = TRUE;
3997              break;
3998              }
3999            }
4000          if (i < verbcount) continue;
4001          *errorcodeptr = ERR60;
4002          goto FAILED;
4003          }
4004    
4005        /* Deal with the extended parentheses; all are introduced by '?', and the
4006        appearance of any of them means that this is not a capturing group. */
4007    
4008        else if (*ptr == '?')
4009        {        {
4010        int i, set, unset, namelen;        int i, set, unset, namelen;
4011        int *optset;        int *optset;
# Line 4113  for (;; ptr++) Line 4247  for (;; ptr++)
4247    
4248          /* ------------------------------------------------------------ */          /* ------------------------------------------------------------ */
4249          case '!':                 /* Negative lookahead */          case '!':                 /* Negative lookahead */
         bravalue = OP_ASSERT_NOT;  
4250          ptr++;          ptr++;
4251            if (*ptr == ')')          /* Optimize (?!) */
4252              {
4253              *code++ = OP_FAIL;
4254              previous = NULL;
4255              continue;
4256              }
4257            bravalue = OP_ASSERT_NOT;
4258          break;          break;
4259    
4260    
# Line 4663  for (;; ptr++) Line 4803  for (;; ptr++)
4803        goto FAILED;        goto FAILED;
4804        }        }
4805    
4806      /* In the pre-compile phase, update the length by the length of the nested      /* In the pre-compile phase, update the length by the length of the group,
4807      group, less the brackets at either end. Then reduce the compiled code to      less the brackets at either end. Then reduce the compiled code to just a
4808      just the brackets so that it doesn't use much memory if it is duplicated by      set of non-capturing brackets so that it doesn't use much memory if it is
4809      a quantifier. */      duplicated by a quantifier.*/
4810    
4811      if (lengthptr != NULL)      if (lengthptr != NULL)
4812        {        {
# Line 4676  for (;; ptr++) Line 4816  for (;; ptr++)
4816          goto FAILED;          goto FAILED;
4817          }          }
4818        *lengthptr += length_prevgroup - 2 - 2*LINK_SIZE;        *lengthptr += length_prevgroup - 2 - 2*LINK_SIZE;
4819        code++;        *code++ = OP_BRA;
4820        PUTINC(code, 0, 1 + LINK_SIZE);        PUTINC(code, 0, 1 + LINK_SIZE);
4821        *code++ = OP_KET;        *code++ = OP_KET;
4822        PUTINC(code, 0, 1 + LINK_SIZE);        PUTINC(code, 0, 1 + LINK_SIZE);
4823          break;    /* No need to waste time with special character handling */
4824        }        }
4825    
4826      /* Otherwise update the main code pointer to the end of the group. */      /* Otherwise update the main code pointer to the end of the group. */
4827    
4828      else code = tempcode;      code = tempcode;
4829    
4830      /* For a DEFINE group, required and first character settings are not      /* For a DEFINE group, required and first character settings are not
4831      relevant. */      relevant. */
# Line 5706  cd->start_code = codestart; Line 5847  cd->start_code = codestart;
5847  cd->hwm = cworkspace;  cd->hwm = cworkspace;
5848  cd->req_varyopt = 0;  cd->req_varyopt = 0;
5849  cd->nopartial = FALSE;  cd->nopartial = FALSE;
5850    cd->had_accept = FALSE;
5851    
5852  /* Set up a starting, non-extracting bracket, then compile the expression. On  /* Set up a starting, non-extracting bracket, then compile the expression. On
5853  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 5862  re->top_bracket = cd->bracount;
5862  re->top_backref = cd->top_backref;  re->top_backref = cd->top_backref;
5863    
5864  if (cd->nopartial) re->options |= PCRE_NOPARTIAL;  if (cd->nopartial) re->options |= PCRE_NOPARTIAL;
5865    if (cd->had_accept) reqbyte = -1;   /* Must disable after (*ACCEPT) */
5866    
5867  /* 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. */
5868    

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

  ViewVC Help
Powered by ViewVC 1.1.5