1
2
3
4
5
6
7
8
9
10 package org.syntax.jedit.tokenmarker;
11
12 import javax.swing.text.Segment;
13
14 /***
15 * Makefile token marker.
16 *
17 * @author Slava Pestov
18 * @version $Id: MakefileTokenMarker.java,v 1.18 1999/12/13 03:40:30 sp Exp $
19 */
20 public class MakefileTokenMarker extends TokenMarker
21 {
22
23 public byte markTokensImpl(byte token, Segment line, int lineIndex)
24 {
25 char[] array = line.array;
26 int offset = line.offset;
27 int lastOffset = offset;
28 int length = line.count + offset;
29 boolean backslash = false;
30 loop: for(int i = offset; i < length; i++)
31 {
32 int i1 = (i+1);
33
34 char c = array[i];
35 if(c == '//')
36 {
37 backslash = !backslash;
38 continue;
39 }
40
41 switch(token)
42 {
43 case Token.NULL:
44 switch(c)
45 {
46 case ':': case '=': case ' ': case '\t':
47 backslash = false;
48 if(lastOffset == offset)
49 {
50 addToken(i1 - lastOffset,Token.KEYWORD1);
51 lastOffset = i1;
52 }
53 break;
54 case '#':
55 if(backslash)
56 backslash = false;
57 else
58 {
59 addToken(i - lastOffset,token);
60 addToken(length - i,Token.COMMENT1);
61 lastOffset = length;
62 break loop;
63 }
64 break;
65 case '$':
66 if(backslash)
67 backslash = false;
68 else if(lastOffset != offset)
69 {
70 addToken(i - lastOffset,token);
71 lastOffset = i;
72 if(length - i > 1)
73 {
74 char c1 = array[i1];
75 if(c1 == '(' || c1 == '{')
76 token = Token.KEYWORD2;
77 else
78 {
79 addToken(2,Token.KEYWORD2);
80 lastOffset += 2;
81 i++;
82 }
83 }
84 }
85 break;
86 case '"':
87 if(backslash)
88 backslash = false;
89 else
90 {
91 addToken(i - lastOffset,token);
92 token = Token.LITERAL1;
93 lastOffset = i;
94 }
95 break;
96 case '\'':
97 if(backslash)
98 backslash = false;
99 else
100 {
101 addToken(i - lastOffset,token);
102 token = Token.LITERAL2;
103 lastOffset = i;
104 }
105 break;
106 default:
107 backslash = false;
108 break;
109 }
110 case Token.KEYWORD2:
111 backslash = false;
112 if(c == ')' || c == '}')
113 {
114 addToken(i1 - lastOffset,token);
115 token = Token.NULL;
116 lastOffset = i1;
117 }
118 break;
119 case Token.LITERAL1:
120 if(backslash)
121 backslash = false;
122 else if(c == '"')
123 {
124 addToken(i1 - lastOffset,token);
125 token = Token.NULL;
126 lastOffset = i1;
127 }
128 else
129 backslash = false;
130 break;
131 case Token.LITERAL2:
132 if(backslash)
133 backslash = false;
134 else if(c == '\'')
135 {
136 addToken(i1 - lastOffset,Token.LITERAL1);
137 token = Token.NULL;
138 lastOffset = i1;
139 }
140 else
141 backslash = false;
142 break;
143 }
144 }
145 switch(token)
146 {
147 case Token.KEYWORD2:
148 addToken(length - lastOffset,Token.INVALID);
149 token = Token.NULL;
150 break;
151 case Token.LITERAL2:
152 addToken(length - lastOffset,Token.LITERAL1);
153 break;
154 default:
155 addToken(length - lastOffset,token);
156 break;
157 }
158 return token;
159 }
160 }