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 ShellScriptTokenMarker extends TokenMarker 43 { 44 public static final byte LVARIABLE = Token.INTERNAL_FIRST; 46 47 public byte markTokensImpl(byte token, Segment line, int lineIndex) 48 { 49 char[] array = line.array; 50 byte cmdState = 0; int offset = line.offset; 53 int lastOffset = offset; 54 int length = line.count + offset; 55 56 if(token == Token.LITERAL1 && lineIndex != 0 57 && lineInfo[lineIndex - 1].obj != null) 58 { 59 String str = (String )lineInfo[lineIndex - 1].obj; 60 if(str != null && str.length() == line.count 61 && SyntaxUtilities.regionMatches(false,line, 62 offset,str)) 63 { 64 addToken(line.count,Token.LITERAL1); 65 return Token.NULL; 66 } 67 else 68 { 69 addToken(line.count,Token.LITERAL1); 70 lineInfo[lineIndex].obj = str; 71 return Token.LITERAL1; 72 } 73 } 74 75 boolean backslash = false; 76 loop: for(int i = offset; i < length; i++) 77 { 78 int i1 = (i+1); 79 80 char c = array[i]; 81 82 if(c == '\\') 83 { 84 backslash = !backslash; 85 continue; 86 } 87 88 switch(token) 89 { 90 case Token.NULL: 91 switch(c) 92 { 93 case ' ': case '\t': case '(': case ')': 94 backslash = false; 95 if(cmdState == 1) 96 { 97 addToken(i - lastOffset,Token.KEYWORD1); 98 lastOffset = i; 99 cmdState = 2; 100 } 101 break; 102 case '=': 103 backslash = false; 104 if(cmdState == 1) 105 { 106 addToken(i - lastOffset,token); 107 lastOffset = i; 108 cmdState = 2; 109 } 110 break; 111 case '&': case '|': case ';': 112 if(backslash) 113 backslash = false; 114 else 115 cmdState = 0; 116 break; 117 case '#': 118 if(backslash) 119 backslash = false; 120 else 121 { 122 addToken(i - lastOffset,token); 123 addToken(length - i,Token.COMMENT1); 124 lastOffset = length; 125 break loop; 126 } 127 break; 128 case '$': 129 if(backslash) 130 backslash = false; 131 else 132 { 133 addToken(i - lastOffset,token); 134 cmdState = 2; 135 lastOffset = i; 136 if(length - i >= 2) 137 { 138 switch(array[i1]) 139 { 140 case '(': 141 continue; 142 case '{': 143 token = LVARIABLE; 144 break; 145 default: 146 token = Token.KEYWORD2; 147 break; 148 } 149 } 150 else 151 token = Token.KEYWORD2; 152 } 153 break; 154 case '"': 155 if(backslash) 156 backslash = false; 157 else 158 { 159 addToken(i - lastOffset,token); 160 token = Token.LITERAL1; 161 lineInfo[lineIndex].obj = null; 162 cmdState = 2; 163 lastOffset = i; 164 } 165 break; 166 case '\'': 167 if(backslash) 168 backslash = false; 169 else 170 { 171 addToken(i - lastOffset,token); 172 token = Token.LITERAL2; 173 cmdState = 2; 174 lastOffset = i; 175 } 176 break; 177 case '<': 178 if(backslash) 179 backslash = false; 180 else 181 { 182 if(length - i > 1 && array[i1] == '<') 183 { 184 addToken(i - lastOffset, 185 token); 186 token = Token.LITERAL1; 187 lastOffset = i; 188 lineInfo[lineIndex].obj = 189 new String (array,i + 2, 190 length - (i+2)); 191 } 192 } 193 break; 194 default: 195 backslash = false; 196 if(Character.isLetter(c)) 197 { 198 if(cmdState == 0 ) 199 { 200 addToken(i - lastOffset,token); 201 lastOffset = i; 202 cmdState++; 203 } 204 } 205 break; 206 } 207 break; 208 case Token.KEYWORD2: 209 backslash = false; 210 if(!Character.isLetterOrDigit(c) && c != '_') 211 { 212 if(i != offset && array[i-1] == '$') 213 { 214 addToken(i1 - lastOffset,token); 215 lastOffset = i1; 216 token = Token.NULL; 217 continue; 218 } 219 else 220 { 221 addToken(i - lastOffset,token); 222 lastOffset = i; 223 token = Token.NULL; 224 } 225 } 226 break; 227 case Token.LITERAL1: 228 if(backslash) 229 backslash = false; 230 else if(c == '"') 231 { 232 addToken(i1 - lastOffset,token); 233 cmdState = 2; 234 lastOffset = i1; 235 token = Token.NULL; 236 } 237 else 238 backslash = false; 239 break; 240 case Token.LITERAL2: 241 if(backslash) 242 backslash = false; 243 else if(c == '\'') 244 { 245 addToken(i1 - lastOffset,Token.LITERAL1); 246 cmdState = 2; 247 lastOffset = i1; 248 token = Token.NULL; 249 } 250 else 251 backslash = false; 252 break; 253 case LVARIABLE: 254 backslash = false; 255 if(c == '}') 256 { 257 addToken(i1 - lastOffset,Token.KEYWORD2); 258 lastOffset = i1; 259 token = Token.NULL; 260 } 261 break; 262 default: 263 throw new InternalError ("Invalid state: " + token); 264 } 265 } 266 267 switch(token) 268 { 269 case Token.NULL: 270 if(cmdState == 1) 271 addToken(length - lastOffset,Token.KEYWORD1); 272 else 273 addToken(length - lastOffset,token); 274 break; 275 case Token.LITERAL2: 276 addToken(length - lastOffset,Token.LITERAL1); 277 break; 278 case Token.KEYWORD2: 279 addToken(length - lastOffset,token); 280 token = Token.NULL; 281 break; 282 case LVARIABLE: 283 addToken(length - lastOffset,Token.INVALID); 284 token = Token.NULL; 285 break; 286 default: 287 addToken(length - lastOffset,token); 288 break; 289 } 290 return token; 291 } 292 } 293 | Popular Tags |