/[pcre]/code/trunk/pcre_exec.c
ViewVC logotype

Diff of /code/trunk/pcre_exec.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 117 by ph10, Fri Mar 9 15:59:06 2007 UTC revision 149 by ph10, Mon Apr 16 15:28:08 2007 UTC
# Line 48  possible. There are also some static sup Line 48  possible. There are also some static sup
48    
49  #include "pcre_internal.h"  #include "pcre_internal.h"
50    
51    /* Undefine some potentially clashing cpp symbols */
52    
53    #undef min
54    #undef max
55    
56  /* The chain of eptrblocks for tail recursions uses memory in stack workspace,  /* The chain of eptrblocks for tail recursions uses memory in stack workspace,
57  obtained at top level, the size of which is defined by EPTR_WORK_SIZE. */  obtained at top level, the size of which is defined by EPTR_WORK_SIZE. */
58    
# Line 299  typedef struct heapframe { Line 304  typedef struct heapframe {
304    int Xprop_category;    int Xprop_category;
305    int Xprop_chartype;    int Xprop_chartype;
306    int Xprop_script;    int Xprop_script;
307    int Xoclength;    int Xoclength;
308    uschar Xocchars[8];    uschar Xocchars[8];
309  #endif  #endif
310    
311    int Xctype;    int Xctype;
# Line 2062  for (;;) Line 2067  for (;;)
2067          for (i = 1; i <= min; i++)          for (i = 1; i <= min; i++)
2068            {            {
2069            if (memcmp(eptr, charptr, length) == 0) eptr += length;            if (memcmp(eptr, charptr, length) == 0) eptr += length;
2070  #ifdef SUPPORT_UCP  #ifdef SUPPORT_UCP
2071            /* Need braces because of following else */            /* Need braces because of following else */
2072            else if (oclength == 0) { RRETURN(MATCH_NOMATCH); }            else if (oclength == 0) { RRETURN(MATCH_NOMATCH); }
2073            else            else
# Line 2072  for (;;) Line 2077  for (;;)
2077              }              }
2078  #else   /* without SUPPORT_UCP */  #else   /* without SUPPORT_UCP */
2079            else { RRETURN(MATCH_NOMATCH); }            else { RRETURN(MATCH_NOMATCH); }
2080  #endif  /* SUPPORT_UCP */  #endif  /* SUPPORT_UCP */
2081            }            }
2082    
2083          if (min == max) continue;          if (min == max) continue;
# Line 2085  for (;;) Line 2090  for (;;)
2090              if (rrc != MATCH_NOMATCH) RRETURN(rrc);              if (rrc != MATCH_NOMATCH) RRETURN(rrc);
2091              if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);              if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
2092              if (memcmp(eptr, charptr, length) == 0) eptr += length;              if (memcmp(eptr, charptr, length) == 0) eptr += length;
2093  #ifdef SUPPORT_UCP  #ifdef SUPPORT_UCP
2094              /* Need braces because of following else */              /* Need braces because of following else */
2095              else if (oclength == 0) { RRETURN(MATCH_NOMATCH); }              else if (oclength == 0) { RRETURN(MATCH_NOMATCH); }
2096              else              else
# Line 2107  for (;;) Line 2112  for (;;)
2112              {              {
2113              if (eptr > md->end_subject - length) break;              if (eptr > md->end_subject - length) break;
2114              if (memcmp(eptr, charptr, length) == 0) eptr += length;              if (memcmp(eptr, charptr, length) == 0) eptr += length;
2115  #ifdef SUPPORT_UCP  #ifdef SUPPORT_UCP
2116              else if (oclength == 0) break;              else if (oclength == 0) break;
2117              else              else
2118                {                {
# Line 2116  for (;;) Line 2121  for (;;)
2121                }                }
2122  #else   /* without SUPPORT_UCP */  #else   /* without SUPPORT_UCP */
2123              else break;              else break;
2124  #endif  /* SUPPORT_UCP */  #endif  /* SUPPORT_UCP */
2125              }              }
2126    
2127            if (possessive) continue;            if (possessive) continue;
2128            while (eptr >= pp)            for(;;)
2129             {             {
2130             RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);             RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
2131             if (rrc != MATCH_NOMATCH) RRETURN(rrc);             if (rrc != MATCH_NOMATCH) RRETURN(rrc);
2132               if (eptr == pp) RRETURN(MATCH_NOMATCH);
2133  #ifdef SUPPORT_UCP  #ifdef SUPPORT_UCP
2134             eptr--;             eptr--;
2135             BACKCHAR(eptr);             BACKCHAR(eptr);
2136  #else   /* without SUPPORT_UCP */  #else   /* without SUPPORT_UCP */
2137             eptr -= length;             eptr -= length;
2138  #endif  /* SUPPORT_UCP */  #endif  /* SUPPORT_UCP */
2139             }             }
           RRETURN(MATCH_NOMATCH);  
2140            }            }
2141          /* Control never gets here */          /* Control never gets here */
2142          }          }
# Line 3707  Returns:          > 0 => success; value Line 3712  Returns:          > 0 => success; value
3712                   < -1 => some kind of unexpected problem                   < -1 => some kind of unexpected problem
3713  */  */
3714    
3715  PCRE_DATA_SCOPE int  PCRE_EXP_DEFN int
3716  pcre_exec(const pcre *argument_re, const pcre_extra *extra_data,  pcre_exec(const pcre *argument_re, const pcre_extra *extra_data,
3717    PCRE_SPTR subject, int length, int start_offset, int options, int *offsets,    PCRE_SPTR subject, int length, int start_offset, int options, int *offsets,
3718    int offsetcount)    int offsetcount)
# Line 3826  md->ctypes = tables + ctypes_offset; Line 3831  md->ctypes = tables + ctypes_offset;
3831  /* Handle different types of newline. The three bits give eight cases. If  /* Handle different types of newline. The three bits give eight cases. If
3832  nothing is set at run time, whatever was used at compile time applies. */  nothing is set at run time, whatever was used at compile time applies. */
3833    
3834  switch ((((options & PCRE_NEWLINE_BITS) == 0)? re->options : options) &  switch ((((options & PCRE_NEWLINE_BITS) == 0)? re->options : (pcre_uint32)options) &
3835         PCRE_NEWLINE_BITS)         PCRE_NEWLINE_BITS)
3836    {    {
3837    case 0: newline = NEWLINE; break;   /* Compile-time default */    case 0: newline = NEWLINE; break;   /* Compile-time default */
# Line 3835  switch ((((options & PCRE_NEWLINE_BITS) Line 3840  switch ((((options & PCRE_NEWLINE_BITS)
3840    case PCRE_NEWLINE_CR+    case PCRE_NEWLINE_CR+
3841         PCRE_NEWLINE_LF: newline = ('\r' << 8) | '\n'; break;         PCRE_NEWLINE_LF: newline = ('\r' << 8) | '\n'; break;
3842    case PCRE_NEWLINE_ANY: newline = -1; break;    case PCRE_NEWLINE_ANY: newline = -1; break;
3843      case PCRE_NEWLINE_ANYCRLF: newline = -2; break;
3844    default: return PCRE_ERROR_BADNEWLINE;    default: return PCRE_ERROR_BADNEWLINE;
3845    }    }
3846    
3847  if (newline < 0)  if (newline == -2)
3848      {
3849      md->nltype = NLTYPE_ANYCRLF;
3850      }
3851    else if (newline < 0)
3852    {    {
3853    md->nltype = NLTYPE_ANY;    md->nltype = NLTYPE_ANY;
3854    }    }
# Line 4013  for(;;) Line 4023  for(;;)
4023        {        {
4024        while (start_match <= end_subject && !WAS_NEWLINE(start_match))        while (start_match <= end_subject && !WAS_NEWLINE(start_match))
4025          start_match++;          start_match++;
4026    
4027          /* If we have just passed a CR and the newline option is ANY or ANYCRLF,
4028          and we are now at a LF, advance the match position by one more character.
4029          */
4030    
4031          if (start_match[-1] == '\r' &&
4032               (md->nltype == NLTYPE_ANY || md->nltype == NLTYPE_ANYCRLF) &&
4033               start_match < end_subject &&
4034               *start_match == '\n')
4035            start_match++;
4036        }        }
4037      }      }
4038    
# Line 4128  for(;;) Line 4148  for(;;)
4148    
4149    if (anchored || start_match > end_subject) break;    if (anchored || start_match > end_subject) break;
4150    
4151    /* If we have just passed a CR and the newline option is CRLF or ANY, and we    /* If we have just passed a CR and the newline option is CRLF or ANY or
4152    are now at a LF, advance the match position by one more character. */    ANYCRLF, and we are now at a LF, advance the match position by one more
4153      character. */
4154    
4155    if (start_match[-1] == '\r' &&    if (start_match[-1] == '\r' &&
4156         (md->nltype == NLTYPE_ANY || md->nllen == 2) &&         (md->nltype == NLTYPE_ANY ||
4157            md->nltype == NLTYPE_ANYCRLF ||
4158            md->nllen == 2) &&
4159         start_match < end_subject &&         start_match < end_subject &&
4160         *start_match == '\n')         *start_match == '\n')
4161      start_match++;      start_match++;

Legend:
Removed from v.117  
changed lines
  Added in v.149

  ViewVC Help
Powered by ViewVC 1.1.5