# Diff of /code/tags/pcre-2.07/pcre.c

revision 31 by nigel, Sat Feb 24 21:38:57 2007 UTC revision 33 by nigel, Sat Feb 24 21:39:01 2007 UTC
# Line 1817  all of whose alternatives start with OP_ Line 1817  all of whose alternatives start with OP_
1817  it's anchored. However, if this is a multiline pattern, then only OP_SOD  it's anchored. However, if this is a multiline pattern, then only OP_SOD
1818  counts, since OP_CIRC can match in the middle.  counts, since OP_CIRC can match in the middle.
1819
1820  A branch is also implicitly anchored if it starts with .* because that will try  A branch is also implicitly anchored if it starts with .* and DOTALL is set,
1821  the rest of the pattern at all possible matching points, so there is no point  because that will try the rest of the pattern at all possible matching points,
1822  trying them again.  so there is no point trying them again.
1823
1824  Arguments:  Arguments:
1825    code       points to start of expression (the bracket)    code       points to start of expression (the bracket)
# Line 1837  do { Line 1837  do {
1837     register int op = *scode;     register int op = *scode;
1838     if (op >= OP_BRA || op == OP_ASSERT || op == OP_ONCE || op == OP_COND)     if (op >= OP_BRA || op == OP_ASSERT || op == OP_ONCE || op == OP_COND)
1839       { if (!is_anchored(scode, options)) return FALSE; }       { if (!is_anchored(scode, options)) return FALSE; }
1840     else if (op == OP_TYPESTAR || op == OP_TYPEMINSTAR)     else if ((op == OP_TYPESTAR || op == OP_TYPEMINSTAR) &&
1841                (*options & PCRE_DOTALL) != 0)
1842       { if (scode[1] != OP_ANY) return FALSE; }       { if (scode[1] != OP_ANY) return FALSE; }
1843     else if (op != OP_SOD &&     else if (op != OP_SOD &&
1844             ((*options & PCRE_MULTILINE) != 0 || op != OP_CIRC))             ((*options & PCRE_MULTILINE) != 0 || op != OP_CIRC))
# Line 1851  return TRUE; Line 1852  return TRUE;
1852
1853
1854  /*************************************************  /*************************************************
1855  *     Check for start with \n line expression    *  *         Check for starting with ^ or .*        *
1856  *************************************************/  *************************************************/
1857
1858  /* This is called for multiline expressions to try to find out if every branch  /* This is called to find out if every branch starts with ^ or .* so that
1859  starts with ^ so that "first char" processing can be done to speed things up.  "first char" processing can be done to speed things up in multiline
1860    matching and for non-DOTALL patterns that start with .* (which must start at
1861    the beginning or after \n).
1862
1863  Argument:  points to start of expression (the bracket)  Argument:  points to start of expression (the bracket)
1864  Returns:   TRUE or FALSE  Returns:   TRUE or FALSE
# Line 1869  do { Line 1872  do {
1872     register int op = *scode;     register int op = *scode;
1873     if (op >= OP_BRA || op == OP_ASSERT || op == OP_ONCE || op == OP_COND)     if (op >= OP_BRA || op == OP_ASSERT || op == OP_ONCE || op == OP_COND)
1874       { if (!is_startline(scode)) return FALSE; }       { if (!is_startline(scode)) return FALSE; }
1875       else if (op == OP_TYPESTAR || op == OP_TYPEMINSTAR)
1876         { if (scode[1] != OP_ANY) return FALSE; }
1877     else if (op != OP_CIRC) return FALSE;     else if (op != OP_CIRC) return FALSE;
1878     code += (code[1] << 8) + code[2];     code += (code[1] << 8) + code[2];
1879     }     }
# Line 2546  if (*errorptr != NULL) Line 2551  if (*errorptr != NULL)
2551    return NULL;    return NULL;
2552    }    }
2553
2554  /* If the anchored option was not passed, set flag if we can determine that it  /* If the anchored option was not passed, set flag if we can determine that the
2555  is anchored by virtue of ^ characters or \A or anything else. Otherwise, see if  pattern is anchored by virtue of ^ characters or \A or anything else (such as
2556  we can determine what the first character has to be, because that speeds up  starting with .* when DOTALL is set).
2557  unanchored matches no end. In the case of multiline matches, an alternative is
2558  to set the PCRE_STARTLINE flag if all branches start with ^. */  Otherwise, see if we can determine what the first character has to be, because
2559    that speeds up unanchored matches no end. If not, see if we can set the
2560    PCRE_STARTLINE flag. This is helpful for multiline matches when all branches
2561    start with ^. and also when all branches start with .* for non-DOTALL matches.
2562    */
2563
2564  if ((options & PCRE_ANCHORED) == 0)  if ((options & PCRE_ANCHORED) == 0)
2565    {    {

Legend:
 Removed from v.31 changed lines Added in v.33