Skip to main content
aboutsummaryrefslogtreecommitdiffstats
blob: dc7195bac11b3f718b3d9dcaa48f236b4c5e7837 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
/*******************************************************************************
 * Copyright (c) 2000, 2004 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 java.util.ArrayList;
import java.util.List;

import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.rules.IRule;
import org.eclipse.jface.text.rules.IToken;
import org.eclipse.jface.text.rules.IWhitespaceDetector;
import org.eclipse.jface.text.rules.IWordDetector;
import org.eclipse.jface.text.rules.PatternRule;
import org.eclipse.jface.text.rules.RuleBasedScanner;
import org.eclipse.jface.text.rules.Token;
import org.eclipse.jface.text.rules.WhitespaceRule;
import org.eclipse.jface.text.rules.WordRule;

public class MakefileMacroScanner extends RuleBasedScanner {
	private String buffer;
	private final static String[] DELIMITERS = { "\r", "\n", "\r\n" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$

	public final static String tokenText = "text"; //$NON-NLS-1$
	public final static String tokenMacro = "macro"; //$NON-NLS-1$
	public final static String tokenOther = "other"; //$NON-NLS-1$

	/**
	 * Constructor for MakefileMacroScanner
	 */
	public MakefileMacroScanner(String buffer) {
		super();
		this.buffer = buffer;
		fOffset = 0;

		IToken tText = new Token(tokenText);
		IToken tMacro = new Token(tokenMacro);
		IToken tOther = new Token(tokenOther);

		List rules = new ArrayList();

		rules.add(new PatternRule("\"", "\"", tText, '\\', true)); //$NON-NLS-1$ //$NON-NLS-2$
		rules.add(new PatternRule("\'", "\'", tText, '\\', true)); //$NON-NLS-1$ //$NON-NLS-2$

		rules.add(new MakefileSimpleMacroRule(tMacro));

		// Add generic whitespace rule.
		rules.add(new WhitespaceRule(new IWhitespaceDetector() {
			public boolean isWhitespace(char character) {
				return Character.isWhitespace(character);
			}
		}));

		WordRule wRule = new WordRule(new IWordDetector() {
			public boolean isWordPart(char c) {
				return isWordStart(c);
			}
			public boolean isWordStart(char c) {
				return !(((short) c == EOF) || Character.isSpaceChar(c));
			}
		}, tOther);

		rules.add(wRule);

		IRule[] result = new IRule[rules.size()];

		rules.toArray(result);

		setRules(result);

		setRange(null, 0, buffer.length());
	}

	/**
	 * @see RuleBasedScanner#getColumn()
	 */
	public int getColumn() {
		return fOffset;
	}

	/**
	 * @see RuleBasedScanner#read()
	 */
	public int read() {
		int c;
		if (fOffset == buffer.length())
			c = EOF;
		else
			c = buffer.charAt(fOffset);
		++fOffset;
		return c;
	}

	/**
	 * @see RuleBasedScanner#setRange(IDocument, int, int)
	 */
	public void setRange(IDocument document, int offset, int length) {
		fDocument = document;
		fOffset = offset;
		fRangeEnd = offset + length;

		fDelimiters = new char[DELIMITERS.length][];
		for (int i = 0; i < DELIMITERS.length; i++)
			fDelimiters[i] = DELIMITERS[i].toCharArray();
	}

}

Back to the top