/[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 269 by ph10, Fri Nov 16 16:22:24 2007 UTC revision 274 by ph10, Tue Nov 20 10:05:23 2007 UTC
# Line 301  static const char error_texts[] = Line 301  static const char error_texts[] =
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 after (?&\0"    "subpattern name expected\0"
305    "digit expected after (?+";    "digit expected after (?+";
306    
307    
# Line 498  ptr--;                            /* Set Line 498  ptr--;                            /* Set
498    
499  if (c == 0) *errorcodeptr = ERR1;  if (c == 0) *errorcodeptr = ERR1;
500    
501  /* Non-alphamerics are literals. For digits or letters, do an initial lookup in  /* Non-alphanumerics are literals. For digits or letters, do an initial lookup
502  a table. A non-zero result is something that can be returned immediately.  in a table. A non-zero result is something that can be returned immediately.
503  Otherwise further processing may be required. */  Otherwise further processing may be required. */
504    
505  #ifndef EBCDIC  /* ASCII coding */  #ifndef EBCDIC  /* ASCII coding */
506  else if (c < '0' || c > 'z') {}                           /* Not alphameric */  else if (c < '0' || c > 'z') {}                           /* Not alphanumeric */
507  else if ((i = escapes[c - '0']) != 0) c = i;  else if ((i = escapes[c - '0']) != 0) c = i;
508    
509  #else           /* EBCDIC coding */  #else           /* EBCDIC coding */
510  else if (c < 'a' || (ebcdic_chartab[c] & 0x0E) == 0) {}   /* Not alphameric */  else if (c < 'a' || (ebcdic_chartab[c] & 0x0E) == 0) {}   /* Not alphanumeric */
511  else if ((i = escapes[c - 0x48]) != 0)  c = i;  else if ((i = escapes[c - 0x48]) != 0)  c = i;
512  #endif  #endif
513    
# Line 724  else Line 724  else
724      break;      break;
725    
726      /* PCRE_EXTRA enables extensions to Perl in the matter of escapes. Any      /* PCRE_EXTRA enables extensions to Perl in the matter of escapes. Any
727      other alphameric following \ is an error if PCRE_EXTRA was set; otherwise,      other alphanumeric following \ is an error if PCRE_EXTRA was set;
728      for Perl compatibility, it is a literal. This code looks a bit odd, but      otherwise, for Perl compatibility, it is a literal. This code looks a bit
729      there used to be some cases other than the default, and there may be again      odd, but there used to be some cases other than the default, and there may
730      in future, so I haven't "optimized" it. */      be again in future, so I haven't "optimized" it. */
731    
732      default:      default:
733      if ((options & PCRE_EXTRA) != 0) switch(c)      if ((options & PCRE_EXTRA) != 0) switch(c)
# Line 4248  we set the flag only if there is a liter Line 4248  we set the flag only if there is a liter
4248              *errorcodeptr = ERR58;              *errorcodeptr = ERR58;
4249              goto FAILED;              goto FAILED;
4250              }              }
4251            if (refsign == '-')            recno = (refsign == '-')?
4252                cd->bracount - recno + 1 : recno +cd->bracount;
4253              if (recno <= 0 || recno > cd->final_bracount)
4254              {              {
4255              recno = cd->bracount - recno + 1;              *errorcodeptr = ERR15;
4256              if (recno <= 0)              goto FAILED;
               {  
               *errorcodeptr = ERR15;  
               goto FAILED;  
               }  
4257              }              }
           else recno += cd->bracount;  
4258            PUT2(code, 2+LINK_SIZE, recno);            PUT2(code, 2+LINK_SIZE, recno);
4259            break;            break;
4260            }            }
# Line 4329  we set the flag only if there is a liter Line 4326  we set the flag only if there is a liter
4326            skipbytes = 1;            skipbytes = 1;
4327            }            }
4328    
4329          /* Check for the "name" actually being a subpattern number. */          /* Check for the "name" actually being a subpattern number. We are
4330            in the second pass here, so final_bracount is set. */
4331    
4332          else if (recno > 0)          else if (recno > 0 && recno <= cd->final_bracount)
4333            {            {
4334            PUT2(code, 2+LINK_SIZE, recno);            PUT2(code, 2+LINK_SIZE, recno);
4335            }            }
# Line 4525  we set the flag only if there is a liter Line 4523  we set the flag only if there is a liter
4523    
4524          /* We come here from the Python syntax above that handles both          /* We come here from the Python syntax above that handles both
4525          references (?P=name) and recursion (?P>name), as well as falling          references (?P=name) and recursion (?P>name), as well as falling
4526          through from the Perl recursion syntax (?&name). */          through from the Perl recursion syntax (?&name). We also come here from
4527            the Perl \k<name> or \k'name' back reference syntax and the \k{name}
4528            .NET syntax. */
4529    
4530          NAMED_REF_OR_RECURSE:          NAMED_REF_OR_RECURSE:
4531          name = ++ptr;          name = ++ptr;
# Line 5939  to compile parts of the pattern into; th Line 5939  to compile parts of the pattern into; th
5939  no longer needed, so hopefully this workspace will never overflow, though there  no longer needed, so hopefully this workspace will never overflow, though there
5940  is a test for its doing so. */  is a test for its doing so. */
5941    
5942  cd->bracount = 0;  cd->bracount = cd->final_bracount = 0;
5943  cd->names_found = 0;  cd->names_found = 0;
5944  cd->name_entry_size = 0;  cd->name_entry_size = 0;
5945  cd->name_table = NULL;  cd->name_table = NULL;
# Line 6016  field. Reset the bracket count and the n Line 6016  field. Reset the bracket count and the n
6016  field; this time it's used for remembering forward references to subpatterns.  field; this time it's used for remembering forward references to subpatterns.
6017  */  */
6018    
6019    cd->final_bracount = cd->bracount;  /* Save for checking forward references */
6020  cd->bracount = 0;  cd->bracount = 0;
6021  cd->names_found = 0;  cd->names_found = 0;
6022  cd->name_table = (uschar *)re + re->name_table_offset;  cd->name_table = (uschar *)re + re->name_table_offset;

Legend:
Removed from v.269  
changed lines
  Added in v.274

  ViewVC Help
Powered by ViewVC 1.1.5