1 30 31 package org.syntax.jedit.tokenmarker; 32 33 import org.syntax.jedit.*; 34 import javax.swing.text.Segment ; 35 36 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 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 ("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 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 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 |