| /********************************************************************** |
| * Copyright (c) 2002,2003 QNX Software Systems and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Common Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/cpl-v10.html |
| * |
| * Contributors: |
| * QNX Software Systems - Initial API and implementation |
| ***********************************************************************/ |
| package org.eclipse.cdt.make.internal.ui.text.makefile; |
| |
| import org.eclipse.jface.text.rules.ICharacterScanner; |
| import org.eclipse.jface.text.rules.IToken; |
| import org.eclipse.jface.text.rules.PatternRule; |
| |
| public class MakefileSimpleMacroRule extends PatternRule { |
| |
| private int nOfBrackets; |
| |
| public MakefileSimpleMacroRule(IToken token) { |
| super("$(", ")", token, (char) 0, true); //$NON-NLS-1$ //$NON-NLS-2$ |
| } |
| |
| protected IToken doEvaluate(ICharacterScanner scanner, boolean resume) { |
| nOfBrackets = 1; |
| return super.doEvaluate(scanner, resume); |
| } |
| |
| protected boolean endSequenceDetected(ICharacterScanner scanner) { |
| int c; |
| char[][] delimiters = scanner.getLegalLineDelimiters(); |
| while ((c = scanner.read()) != ICharacterScanner.EOF) { |
| if ('(' == (char) c) |
| ++nOfBrackets; |
| |
| if (fEndSequence.length > 0 && c == fEndSequence[0]) { |
| // Check if the specified end sequence has been found. |
| if (sequenceDetected(scanner, fEndSequence, true)) { |
| if (0 == --nOfBrackets) |
| return true; |
| } |
| } else if (fBreaksOnEOL) { |
| // Check for end of line since it can be used to terminate the pattern. |
| for (int i = 0; i < delimiters.length; i++) { |
| if (c == delimiters[i][0] && sequenceDetected(scanner, delimiters[i], false)) |
| return true; |
| } |
| } |
| } |
| scanner.unread(); |
| return true; |
| } |
| |
| } |