KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > syntax > jedit > tokenmarker > CTokenMarker


1 /*
2  * Copyright (C) 2005 - 2006 JasperSoft Corporation. All rights reserved.
3  * http://www.jaspersoft.com.
4  *
5  * Unless you have purchased a commercial license agreement from JasperSoft,
6  * the following license terms apply:
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License version 2 as published by
10  * the Free Software Foundation.
11  *
12  * This program is distributed WITHOUT ANY WARRANTY; and without the
13  * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14  * See the GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, see http://www.gnu.org/licenses/gpl.txt
18  * or write to:
19  *
20  * Free Software Foundation, Inc.,
21  * 59 Temple Place - Suite 330,
22  * Boston, MA USA 02111-1307
23  *
24  *
25  *
26  *
27  * CTokenMarker.java
28  *
29  */

30
31 package org.syntax.jedit.tokenmarker;
32
33 import org.syntax.jedit.*;
34 import javax.swing.text.Segment JavaDoc;
35
36 /**
37  * C token marker.
38  *
39  * @author Slava Pestov
40  * @version $Id: CTokenMarker.java 932 2006-10-20 09:32:45Z gtoffoli $
41  */

42 public class CTokenMarker extends TokenMarker
43 {
44     public CTokenMarker()
45     {
46         this(true,getKeywords());
47     }
48
49     public CTokenMarker(boolean cpp, KeywordMap keywords)
50     {
51         this.cpp = cpp;
52         this.keywords = keywords;
53     }
54
55     public byte markTokensImpl(byte token, Segment JavaDoc line, int lineIndex)
56     {
57         char[] array = line.array;
58         int offset = line.offset;
59         lastOffset = offset;
60         lastKeyword = offset;
61         int length = line.count + offset;
62         boolean backslash = false;
63
64 loop: for(int i = offset; i < length; i++)
65         {
66             int i1 = (i+1);
67
68             char c = array[i];
69             if(c == '\\')
70             {
71                 backslash = !backslash;
72                 continue;
73             }
74
75             switch(token)
76             {
77             case Token.NULL:
78                 switch(c)
79                 {
80                 case '#':
81                     if(backslash)
82                         backslash = false;
83                     else if(cpp)
84                     {
85                         if(doKeyword(line,i,c))
86                             break;
87                         addToken(i - lastOffset,token);
88                         addToken(length - i,Token.KEYWORD2);
89                         lastOffset = lastKeyword = length;
90                         break loop;
91                     }
92                     break;
93                 case '"':
94                     doKeyword(line,i,c);
95                     if(backslash)
96                         backslash = false;
97                     else
98                     {
99                         addToken(i - lastOffset,token);
100                         token = Token.LITERAL1;
101                         lastOffset = lastKeyword = i;
102                     }
103                     break;
104                                 case '$':
105                                         backslash = false;
106                                         doKeyword(line, i, c);
107                                         if (length - i > 2 &&
108                                             (array[i1] == 'P' || array[i1] == 'F' || array[i1] == 'V' || array[i1] == 'R') &&
109                                             array[i + 2] == '{')
110                                         {
111                                                 addToken(i - lastOffset, token);
112                                                 lastOffset = lastKeyword = i;
113                                                 token = Token.PARAMETER;
114                                         }
115                                         break;
116                 case '\'':
117                     doKeyword(line,i,c);
118                     if(backslash)
119                         backslash = false;
120                     else
121                     {
122                         addToken(i - lastOffset,token);
123                         token = Token.LITERAL2;
124                         lastOffset = lastKeyword = i;
125                     }
126                     break;
127                 case ':':
128                     if(lastKeyword == offset)
129                     {
130                         if(doKeyword(line,i,c))
131                             break;
132                         backslash = false;
133                         addToken(i1 - lastOffset,Token.LABEL);
134                         lastOffset = lastKeyword = i1;
135                     }
136                     else if(doKeyword(line,i,c))
137                         break;
138                     break;
139                 case '/':
140                     backslash = false;
141                     doKeyword(line,i,c);
142                     if(length - i > 1)
143                     {
144                         switch(array[i1])
145                         {
146                         case '*':
147                             addToken(i - lastOffset,token);
148                             lastOffset = lastKeyword = i;
149                             if(length - i > 2 && array[i+2] == '*')
150                                 token = Token.COMMENT2;
151                             else
152                                 token = Token.COMMENT1;
153                             break;
154                         case '/':
155                             addToken(i - lastOffset,token);
156                             addToken(length - i,Token.COMMENT1);
157                             lastOffset = lastKeyword = length;
158                             break loop;
159                         }
160                     }
161                     break;
162                 default:
163                     backslash = false;
164                     if(!Character.isLetterOrDigit(c)
165                         && c != '_')
166                         doKeyword(line,i,c);
167                     break;
168                 }
169                 break;
170             case Token.COMMENT1:
171             case Token.COMMENT2:
172                 backslash = false;
173                 if(c == '*' && length - i > 1)
174                 {
175                     if(array[i1] == '/')
176                     {
177                         i++;
178                         addToken((i+1) - lastOffset,token);
179                         token = Token.NULL;
180                         lastOffset = lastKeyword = i+1;
181                     }
182                 }
183                 break;
184             case Token.LITERAL1:
185                 if(backslash)
186                     backslash = false;
187                 else if(c == '"')
188                 {
189                     addToken(i1 - lastOffset,token);
190                     token = Token.NULL;
191                     lastOffset = lastKeyword = i1;
192                 }
193                 break;
194             case Token.LITERAL2:
195                 if(backslash)
196                     backslash = false;
197                 else if(c == '\'')
198                 {
199                     addToken(i1 - lastOffset,Token.LITERAL1);
200                     token = Token.NULL;
201                     lastOffset = lastKeyword = i1;
202                 }
203                 break;
204                         case Token.PARAMETER:
205                                 if (backslash)
206                                 {
207                                         backslash = false;
208                                 }
209                                 else if (c == '}')
210                                 {
211                                         if(!doKeyword(line, i1, c))
212                                         {
213                                                 addToken(i1 - lastOffset, token);
214                                                 token = Token.NULL;
215                                                 lastOffset = lastKeyword = i1;
216                                         }
217                                 }
218                                 break;
219             default:
220                 throw new InternalError JavaDoc("Invalid state: "
221                     + token);
222             }
223         }
224
225         if(token == Token.NULL)
226             doKeyword(line,length,'\0');
227
228         switch(token)
229         {
230         case Token.PARAMETER:
231         case Token.LITERAL1:
232         case Token.LITERAL2:
233             addToken(length - lastOffset,Token.INVALID);
234             token = Token.NULL;
235             break;
236         case Token.KEYWORD2:
237             addToken(length - lastOffset,token);
238             if(!backslash)
239                 token = Token.NULL;
240         default:
241             addToken(length - lastOffset,token);
242             break;
243         }
244
245         return token;
246     }
247
248     public static KeywordMap getKeywords()
249     {
250         if(cKeywords == null)
251         {
252             cKeywords = new KeywordMap(false);
253             cKeywords.add("char",Token.KEYWORD3);
254             cKeywords.add("double",Token.KEYWORD3);
255             cKeywords.add("enum",Token.KEYWORD3);
256             cKeywords.add("float",Token.KEYWORD3);
257             cKeywords.add("int",Token.KEYWORD3);
258             cKeywords.add("long",Token.KEYWORD3);
259             cKeywords.add("short",Token.KEYWORD3);
260             cKeywords.add("signed",Token.KEYWORD3);
261             cKeywords.add("struct",Token.KEYWORD3);
262             cKeywords.add("typedef",Token.KEYWORD3);
263             cKeywords.add("union",Token.KEYWORD3);
264             cKeywords.add("unsigned",Token.KEYWORD3);
265             cKeywords.add("void",Token.KEYWORD3);
266             cKeywords.add("auto",Token.KEYWORD1);
267             cKeywords.add("const",Token.KEYWORD1);
268             cKeywords.add("extern",Token.KEYWORD1);
269             cKeywords.add("register",Token.KEYWORD1);
270             cKeywords.add("static",Token.KEYWORD1);
271             cKeywords.add("volatile",Token.KEYWORD1);
272             cKeywords.add("break",Token.KEYWORD1);
273             cKeywords.add("case",Token.KEYWORD1);
274             cKeywords.add("continue",Token.KEYWORD1);
275             cKeywords.add("default",Token.KEYWORD1);
276             cKeywords.add("do",Token.KEYWORD1);
277             cKeywords.add("else",Token.KEYWORD1);
278             cKeywords.add("for",Token.KEYWORD1);
279             cKeywords.add("goto",Token.KEYWORD1);
280             cKeywords.add("if",Token.KEYWORD1);
281             cKeywords.add("return",Token.KEYWORD1);
282             cKeywords.add("sizeof",Token.KEYWORD1);
283             cKeywords.add("switch",Token.KEYWORD1);
284             cKeywords.add("while",Token.KEYWORD1);
285             cKeywords.add("asm",Token.KEYWORD2);
286             cKeywords.add("asmlinkage",Token.KEYWORD2);
287             cKeywords.add("far",Token.KEYWORD2);
288             cKeywords.add("huge",Token.KEYWORD2);
289             cKeywords.add("inline",Token.KEYWORD2);
290             cKeywords.add("near",Token.KEYWORD2);
291             cKeywords.add("pascal",Token.KEYWORD2);
292             cKeywords.add("true",Token.LITERAL2);
293             cKeywords.add("false",Token.LITERAL2);
294             cKeywords.add("NULL",Token.LITERAL2);
295         }
296         return cKeywords;
297     }
298
299     // private members
300
private static KeywordMap cKeywords;
301
302     private boolean cpp;
303     protected KeywordMap keywords;
304     private int lastOffset;
305     private int lastKeyword;
306
307     private boolean doKeyword(Segment JavaDoc line, int i, char c)
308     {
309         int i1 = i+1;
310
311         int len = i - lastKeyword;
312         byte id = keywords.lookup(line,lastKeyword,len);
313
314                 if (id == Token.NULL && keywordLookup != null)
315                 {
316                          id = keywordLookup.lookup(line, lastKeyword, len);
317                 }
318
319         if(id != Token.NULL)
320         {
321             if(lastKeyword != lastOffset)
322                 addToken(lastKeyword - lastOffset,Token.NULL);
323             addToken(len,id);
324             lastOffset = i;
325         }
326         lastKeyword = i1;
327         return false;
328     }
329 }
330
Popular Tags