1 package org.jedit.syntax; 2 3 11 12 import javax.swing.text.Segment ; 13 14 20 public class SQLTokenMarker extends TokenMarker 21 { 22 private int offset, lastOffset, lastKeyword, length; 23 24 public SQLTokenMarker(KeywordMap k) 26 { 27 this(k, false); 28 } 29 30 public SQLTokenMarker(KeywordMap k, boolean tsql) 31 { 32 keywords = k; 33 isTSQL = tsql; 34 } 35 36 public byte markTokensImpl(byte token, Segment line, int lineIndex) 37 { 38 offset = lastOffset = lastKeyword = line.offset; 39 length = line.count + offset; 40 41 loop: 42 for(int i = offset; i < length; i++) 43 { 44 switch(line.array[i]) 45 { 46 case '*': 47 if(token == Token.COMMENT1 && length - i >= 1 && line.array[i+1] == '/') 48 { 49 token = Token.NULL; 50 i++; 51 addToken((i + 1) - lastOffset,Token.COMMENT1); 52 lastOffset = i + 1; 53 } 54 else if (token == Token.NULL) 55 { 56 searchBack(line, i); 57 addToken(1,Token.OPERATOR); 58 lastOffset = i + 1; 59 } 60 break; 61 case '[': 62 if(token == Token.NULL) 63 { 64 searchBack(line, i); 65 token = Token.LITERAL1; 66 literalChar = '['; 67 lastOffset = i; 68 } 69 break; 70 case ']': 71 if(token == Token.LITERAL1 && literalChar == '[') 72 { 73 token = Token.NULL; 74 literalChar = 0; 75 addToken((i + 1) - lastOffset,Token.LITERAL1); 76 lastOffset = i + 1; 77 } 78 break; 79 case '.': case ',': case '(': case ')': 80 if (token == Token.NULL) { 81 searchBack(line, i); 82 addToken(1, Token.NULL); 83 lastOffset = i + 1; 84 } 85 break; 86 case '+': case '%': case '&': case '|': case '^': 87 case '~': case '<': case '>': case '=': 88 if (token == Token.NULL) { 89 searchBack(line, i); 90 addToken(1,Token.OPERATOR); 91 lastOffset = i + 1; 92 } 93 break; 94 case ' ': case '\t': 95 if (token == Token.NULL) { 96 searchBack(line, i, false); 97 } 98 break; 99 case ':': 100 if(token == Token.NULL) 101 { 102 addToken((i+1) - lastOffset,Token.LABEL); 103 lastOffset = i + 1; 104 } 105 break; 106 case '/': 107 if(token == Token.NULL) 108 { 109 if (length - i >= 2 && line.array[i + 1] == '*') 110 { 111 searchBack(line, i); 112 token = Token.COMMENT1; 113 lastOffset = i; 114 i++; 115 } 116 else 117 { 118 searchBack(line, i); 119 addToken(1,Token.OPERATOR); 120 lastOffset = i + 1; 121 } 122 } 123 break; 124 case '-': 125 if(token == Token.NULL) 126 { 127 if (length - i >= 2 && line.array[i+1] == '-') 128 { 129 searchBack(line, i); 130 addToken(length - i,Token.COMMENT1); 131 lastOffset = length; 132 break loop; 133 } 134 else 135 { 136 searchBack(line, i); 137 addToken(1,Token.OPERATOR); 138 lastOffset = i + 1; 139 } 140 } 141 break; 142 case '!': 143 if(isTSQL && token == Token.NULL && length - i >= 2 && 144 (line.array[i+1] == '=' || line.array[i+1] == '<' || line.array[i+1] == '>')) 145 { 146 searchBack(line, i); 147 addToken(1,Token.OPERATOR); 148 lastOffset = i + 1; 149 } 150 break; 151 case '"': case '\'': 152 if(token == Token.NULL) 153 { 154 token = Token.LITERAL1; 155 literalChar = line.array[i]; 156 addToken(i - lastOffset,Token.NULL); 157 lastOffset = i; 158 } 159 else if(token == Token.LITERAL1 && literalChar == line.array[i]) 160 { 161 token = Token.NULL; 162 literalChar = 0; 163 addToken((i + 1) - lastOffset,Token.LITERAL1); 164 lastOffset = i + 1; 165 } 166 break; 167 default: 168 break; 169 } 170 } 171 if(token == Token.NULL) 172 searchBack(line, length, false); 173 if(lastOffset != length) 174 addToken(length - lastOffset,token); 175 return token; 176 } 177 178 protected boolean isTSQL = false; 180 181 private KeywordMap keywords; 183 private char literalChar = 0; 184 185 private void searchBack(Segment line, int pos) 186 { 187 searchBack(line, pos, true); 188 } 189 190 private void searchBack(Segment line, int pos, boolean padNull) 191 { 192 int len = pos - lastKeyword; 193 byte id = keywords.lookup(line,lastKeyword,len); 194 if(id != Token.NULL) 195 { 196 if(lastKeyword != lastOffset) 197 addToken(lastKeyword - lastOffset,Token.NULL); 198 addToken(len,id); 199 lastOffset = pos; 200 } 201 lastKeyword = pos + 1; 202 if (padNull && lastOffset < pos) 203 addToken(pos - lastOffset, Token.NULL); 204 } 205 } 206 | Popular Tags |