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