diff options
Diffstat (limited to 'libjava/gnu/regexp')
| -rw-r--r-- | libjava/gnu/regexp/RE.java | 23 | ||||
| -rw-r--r-- | libjava/gnu/regexp/RETokenLookAhead.java | 87 | 
2 files changed, 109 insertions, 1 deletions
diff --git a/libjava/gnu/regexp/RE.java b/libjava/gnu/regexp/RE.java index fdc00feb3fb..d782975e9af 100644 --- a/libjava/gnu/regexp/RE.java +++ b/libjava/gnu/regexp/RE.java @@ -492,8 +492,25 @@ public class RE extends REToken {        else if ((unit.ch == '(') && (syntax.get(RESyntax.RE_NO_BK_PARENS) ^ unit.bk)) {  	boolean pure = false;  	boolean comment = false; +        boolean lookAhead = false; +        boolean negativelh = false;  	if ((index+1 < pLength) && (pattern[index] == '?')) {  	  switch (pattern[index+1]) { +          case '!': +            if (syntax.get(RESyntax.RE_LOOKAHEAD)) { +              pure = true; +              negativelh = true; +              lookAhead = true; +              index += 2; +            } +            break; +          case '=': +            if (syntax.get(RESyntax.RE_LOOKAHEAD)) { +              pure = true; +              lookAhead = true; +              index += 2; +            } +            break;  	  case ':':  	    if (syntax.get(RESyntax.RE_PURE_GROUPING)) {  	      pure = true; @@ -539,10 +556,14 @@ public class RE extends REToken {  	    numSubs++;  	  } -	  int useIndex = (pure) ? 0 : nextSub + numSubs; +	  int useIndex = (pure || lookAhead) ? 0 : nextSub + numSubs;  	  currentToken = new RE(String.valueOf(pattern,index,endIndex-index).toCharArray(),cflags,syntax,useIndex,nextSub + numSubs);  	  numSubs += ((RE) currentToken).getNumSubs(); +          if (lookAhead) { +	      currentToken = new RETokenLookAhead(currentToken,negativelh); +	  } +  	  index = nextIndex;  	} // not a comment        } // subexpression diff --git a/libjava/gnu/regexp/RETokenLookAhead.java b/libjava/gnu/regexp/RETokenLookAhead.java new file mode 100644 index 00000000000..650bb351b10 --- /dev/null +++ b/libjava/gnu/regexp/RETokenLookAhead.java @@ -0,0 +1,87 @@ +/* gnu/regexp/RETokenLookAhead.java +   Copyright (C) 1998-2001, 2004 Free Software Foundation, Inc. + +This file is part of GNU Classpath. + +GNU Classpath is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +GNU Classpath is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU +General Public License for more details. + +You should have received a copy of the GNU General Public License +along with GNU Classpath; see the file COPYING.  If not, write to the +Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +02111-1307 USA. + +Linking this library statically or dynamically with other modules is +making a combined work based on this library.  Thus, the terms and +conditions of the GNU General Public License cover the whole +combination. + +As a special exception, the copyright holders of this library give you +permission to link this library with independent modules to produce an +executable, regardless of the license terms of these independent +modules, and to copy and distribute the resulting executable under +terms of your choice, provided that you also meet, for each linked +independent module, the terms and conditions of the license of that +module.  An independent module is a module which is not derived from +or based on this library.  If you modify this library, you may extend +this exception to your version of the library, but you are not +obligated to do so.  If you do not wish to do so, delete this +exception statement from your version. */ + +package gnu.regexp; + +/** + * @since gnu.regexp 1.1.3 + * @author Shashank Bapat + */ +final class RETokenLookAhead extends REToken +{ +  REToken re; +  boolean negative; + +  RETokenLookAhead(REToken re, boolean negative) throws REException { +    super(0); +    this.re = re; +    this.negative = negative; +  } + +  boolean match(CharIndexed input, REMatch mymatch) +  { +    REMatch trymatch = (REMatch)mymatch.clone(); +    REMatch trymatch1 = (REMatch)mymatch.clone(); +    REMatch newMatch = null; +    if (re.match(input, trymatch)) { +      if (negative) return false; +      if (next(input, trymatch1)) +        newMatch = trymatch1; +    } + +    if (newMatch != null) { +      if (negative) return false; +      //else +      mymatch.assignFrom(newMatch); +      return true; +    } +    else { // no match +      if (negative) +        return next(input, mymatch); +      //else +      return false; +    } +  } + +    void dump(StringBuffer os) { +	os.append("(?"); +	os.append(negative ? '!' : '='); +	re.dumpAll(os); +	os.append(')'); +    } +} +  | 

