KickJava   Java API By Example, From Geeks To Geeks.

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


1 package org.jedit.syntax;
2
3 /*
4  * CTokenMarker.java - C token marker
5  * Copyright (C) 1998, 1999 Slava Pestov
6  *
7  * You may use and modify this package for any purpose. Redistribution is
8  * permitted, in both source and binary form, provided that this notice
9  * remains intact in all source distributions of this package.
10  */

11
12 import javax.swing.text.Segment JavaDoc;
13
14 /**
15  * C token marker.
16  *
17  * @author Slava Pestov
18  * @version $Id: CTokenMarker.java,v 1.1 2003/12/14 16:29:49 daggerrz Exp $
19  */

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