1 package org.jedit.syntax; 2 3 11 12 import javax.swing.text.Segment ; 13 14 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 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 ("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 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 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 |