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 ':' :
47 case '=' :
48 case ' ' :
49 case '\t' :
50 backslash = false;
51 if( lastOffset == offset )
52 {
53 addToken( i1 - lastOffset, Token.KEYWORD1 );
54 lastOffset = i1;
55 }
56 break;
57 case '#' :
58 if( backslash )
59 backslash = false;
60 else
61 {
62 addToken( i - lastOffset, token );
63 addToken( length - i, Token.COMMENT1 );
64 lastOffset = length;
65 break loop;
66 }
67 break;
68 case '$' :
69 if( backslash )
70 backslash = false;
71 else if( lastOffset != offset )
72 {
73 addToken( i - lastOffset, token );
74 lastOffset = i;
75 if( length - i > 1 )
76 {
77 char c1 = array[i1];
78 if( c1 == '(' || c1 == '{' )
79 token = Token.KEYWORD2;
80 else
81 {
82 addToken( 2, Token.KEYWORD2 );
83 lastOffset += 2;
84 i++ ;
85 }
86 }
87 }
88 break;
89 case '"' :
90 if( backslash )
91 backslash = false;
92 else
93 {
94 addToken( i - lastOffset, token );
95 token = Token.LITERAL1;
96 lastOffset = i;
97 }
98 break;
99 case '\'' :
100 if( backslash )
101 backslash = false;
102 else
103 {
104 addToken( i - lastOffset, token );
105 token = Token.LITERAL2;
106 lastOffset = i;
107 }
108 break;
109 default :
110 backslash = false;
111 break;
112 }
113 case Token.KEYWORD2 :
114 backslash = false;
115 if( c == ')' || c == '}' )
116 {
117 addToken( i1 - lastOffset, token );
118 token = Token.NULL;
119 lastOffset = i1;
120 }
121 break;
122 case Token.LITERAL1 :
123 if( backslash )
124 backslash = false;
125 else if( c == '"' )
126 {
127 addToken( i1 - lastOffset, token );
128 token = Token.NULL;
129 lastOffset = i1;
130 }
131 else
132 backslash = false;
133 break;
134 case Token.LITERAL2 :
135 if( backslash )
136 backslash = false;
137 else if( c == '\'' )
138 {
139 addToken( i1 - lastOffset, Token.LITERAL1 );
140 token = Token.NULL;
141 lastOffset = i1;
142 }
143 else
144 backslash = false;
145 break;
146 }
147 }
148 switch( token )
149 {
150 case Token.KEYWORD2 :
151 addToken( length - lastOffset, Token.INVALID );
152 token = Token.NULL;
153 break;
154 case Token.LITERAL2 :
155 addToken( length - lastOffset, Token.LITERAL1 );
156 break;
157 default :
158 addToken( length - lastOffset, token );
159 break;
160 }
161 return token;
162 }
163 }