/* * SQLTokenMarker.java - Generic SQL token marker * Copyright (C) 1999 mike dillon * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ package textarea.syntax; import javax.swing.text.Segment; /** * SQL token marker. * * @author mike dillon * @version $Id$ */ public class SQLTokenMarker extends TokenMarker { private int offset, lastOffset, lastKeyword, length; // public members public SQLTokenMarker(KeywordMap k) { this(k, false); } public SQLTokenMarker(KeywordMap k, boolean tsql) { keywords = k; isTSQL = tsql; } public byte markTokensImpl(byte token, Segment line, int lineIndex) { offset = lastOffset = lastKeyword = line.offset; length = line.count + offset; loop: for(int i = offset; i < length; i++) { switch(line.array[i]) { case '*': if(token == Token.COMMENT1 && length - i >= 1 && line.array[i+1] == '/') { token = Token.NULL; i++; addToken((i + 1) - lastOffset,Token.COMMENT1); lastOffset = i + 1; } else if (token == Token.NULL) { searchBack(line, i); addToken(1,Token.OPERATOR); lastOffset = i + 1; } break; case '[': if(token == Token.NULL) { searchBack(line, i); token = Token.LITERAL1; literalChar = '['; lastOffset = i; } break; case ']': if(token == Token.LITERAL1 && literalChar == '[') { token = Token.NULL; literalChar = 0; addToken((i + 1) - lastOffset,Token.LITERAL1); lastOffset = i + 1; } break; case '.': case ',': case '(': case ')': if (token == Token.NULL) { searchBack(line, i); addToken(1, Token.NULL); lastOffset = i + 1; } break; case '+': case '%': case '&': case '|': case '^': case '~': case '<': case '>': case '=': if (token == Token.NULL) { searchBack(line, i); addToken(1,Token.OPERATOR); lastOffset = i + 1; } break; case ' ': case '\t': if (token == Token.NULL) { searchBack(line, i, false); } break; case ':': if(token == Token.NULL) { addToken((i+1) - lastOffset,Token.LABEL); lastOffset = i + 1; } break; case '/': if(token == Token.NULL) { if (length - i >= 2 && line.array[i + 1] == '*') { searchBack(line, i); token = Token.COMMENT1; lastOffset = i; i++; } else { searchBack(line, i); addToken(1,Token.OPERATOR); lastOffset = i + 1; } } break; case '-': if(token == Token.NULL) { if (length - i >= 2 && line.array[i+1] == '-') { searchBack(line, i); addToken(length - i,Token.COMMENT1); lastOffset = length; break loop; } else { searchBack(line, i); addToken(1,Token.OPERATOR); lastOffset = i + 1; } } break; case '!': if(isTSQL && token == Token.NULL && length - i >= 2 && (line.array[i+1] == '=' || line.array[i+1] == '<' || line.array[i+1] == '>')) { searchBack(line, i); addToken(1,Token.OPERATOR); lastOffset = i + 1; } break; case '"': case '\'': if(token == Token.NULL) { token = Token.LITERAL1; literalChar = line.array[i]; addToken(i - lastOffset,Token.NULL); lastOffset = i; } else if(token == Token.LITERAL1 && literalChar == line.array[i]) { token = Token.NULL; literalChar = 0; addToken((i + 1) - lastOffset,Token.LITERAL1); lastOffset = i + 1; } break; default: break; } } if(token == Token.NULL) searchBack(line, length, false); if(lastOffset != length) addToken(length - lastOffset,token); return token; } // protected members protected boolean isTSQL = false; // private members private KeywordMap keywords; private char literalChar = 0; private void searchBack(Segment line, int pos) { searchBack(line, pos, true); } private void searchBack(Segment line, int pos, boolean padNull) { int len = pos - lastKeyword; byte id = keywords.lookup(line,lastKeyword,len); if(id != Token.NULL) { if(lastKeyword != lastOffset) addToken(lastKeyword - lastOffset,Token.NULL); addToken(len,id); lastOffset = pos; } lastKeyword = pos + 1; if (padNull && lastOffset < pos) addToken(pos - lastOffset, Token.NULL); } public static KeywordMap getKeywords() { if(SQLKeywords == null) { // Flow-Control // Verbage. SQLKeywords = new KeywordMap(true); SQLKeywords.add("CREATE",Token.KEYWORD1); SQLKeywords.add("DROP",Token.KEYWORD1); SQLKeywords.add("CHECKPOINT",Token.KEYWORD1); SQLKeywords.add("ROLLBACK",Token.KEYWORD1); SQLKeywords.add("COMMIT",Token.KEYWORD1); SQLKeywords.add("OPEN",Token.KEYWORD1); SQLKeywords.add("FETCH",Token.KEYWORD1); SQLKeywords.add("CLOSE",Token.KEYWORD1); SQLKeywords.add("ALLOCATE",Token.KEYWORD1); SQLKeywords.add("DEALLOCATE",Token.KEYWORD1); SQLKeywords.add("DECLARE",Token.KEYWORD1); SQLKeywords.add("DUMP",Token.KEYWORD1); SQLKeywords.add("EXECUTE",Token.KEYWORD1); SQLKeywords.add("GRANT",Token.KEYWORD1); SQLKeywords.add("DENY",Token.KEYWORD1); SQLKeywords.add("INSERT",Token.KEYWORD1); SQLKeywords.add("SELECT",Token.KEYWORD1); SQLKeywords.add("DELETE",Token.KEYWORD1); SQLKeywords.add("UPDATE",Token.KEYWORD1); SQLKeywords.add("KILL",Token.KEYWORD1); SQLKeywords.add("LOAD",Token.KEYWORD1); SQLKeywords.add("SAVE",Token.KEYWORD1); SQLKeywords.add("PRINT",Token.KEYWORD1); SQLKeywords.add("RAISE",Token.KEYWORD1); SQLKeywords.add("RAISERROR",Token.KEYWORD1); SQLKeywords.add("RECONFIGURE",Token.KEYWORD1); SQLKeywords.add("REVOKE",Token.KEYWORD1); SQLKeywords.add("SET",Token.KEYWORD1); SQLKeywords.add("SETUSER",Token.KEYWORD1); SQLKeywords.add("SHUTDOWN",Token.KEYWORD1); SQLKeywords.add("TRUNCATE",Token.KEYWORD1); SQLKeywords.add("READTEXT",Token.KEYWORD1); SQLKeywords.add("UPDATETEXT",Token.KEYWORD1); SQLKeywords.add("WRITETEXT",Token.KEYWORD1); // Functions // Nouns SQLKeywords.add("TABLE", Token.LITERAL1); SQLKeywords.add("DATABASE", Token.LITERAL1); SQLKeywords.add("DEFAULT", Token.LITERAL1); SQLKeywords.add("INDEX", Token.LITERAL1); SQLKeywords.add("PROCEDURE", Token.LITERAL1); SQLKeywords.add("DELAY", Token.LITERAL1); SQLKeywords.add("TIME", Token.LITERAL1); SQLKeywords.add("TRANSACTION", Token.LITERAL1); SQLKeywords.add("RULE", Token.LITERAL1); SQLKeywords.add("TRIGGER", Token.LITERAL1); SQLKeywords.add("VIEW", Token.LITERAL1); SQLKeywords.add("CURSOR", Token.LITERAL1); SQLKeywords.add("DISK", Token.LITERAL1); SQLKeywords.add("DEFAULT", Token.LITERAL1); SQLKeywords.add("ALL", Token.LITERAL1); SQLKeywords.add("PUBLIC", Token.LITERAL1); SQLKeywords.add("ERROR", Token.LITERAL1); SQLKeywords.add("RIGHT", Token.LITERAL1); SQLKeywords.add("LEFT", Token.LITERAL1); SQLKeywords.add("TRUE", Token.LITERAL1); SQLKeywords.add("FALSE", Token.LITERAL1); // Operators // Data Types SQLKeywords.add("binary", Token.KEYWORD3); SQLKeywords.add("varbinary",Token.KEYWORD3); SQLKeywords.add("char",Token.KEYWORD3); SQLKeywords.add("varchar",Token.KEYWORD3); SQLKeywords.add("datetime",Token.KEYWORD3); SQLKeywords.add("smalldatetime",Token.KEYWORD3); SQLKeywords.add("decimal",Token.KEYWORD3); SQLKeywords.add("dec",Token.KEYWORD3); SQLKeywords.add("numeric",Token.KEYWORD3); SQLKeywords.add("float",Token.KEYWORD3); SQLKeywords.add("real",Token.KEYWORD3); SQLKeywords.add("int",Token.KEYWORD3); SQLKeywords.add("integer",Token.KEYWORD3); SQLKeywords.add("smallint",Token.KEYWORD3); SQLKeywords.add("tinyint",Token.KEYWORD3); SQLKeywords.add("money",Token.KEYWORD3); SQLKeywords.add("smallmoney",Token.KEYWORD3); SQLKeywords.add("bit",Token.KEYWORD3); SQLKeywords.add("timestamp",Token.KEYWORD3); SQLKeywords.add("text",Token.KEYWORD3); SQLKeywords.add("image",Token.KEYWORD3); SQLKeywords.add("varying",Token.KEYWORD3); SQLKeywords.add("character",Token.KEYWORD3); SQLKeywords.add("blob",Token.KEYWORD3); } return SQLKeywords; } // private members private static KeywordMap SQLKeywords; } /* * ChangeLog: * $Log$ * Revision 1.1 2001/09/07 02:47:50 davidmartinez * Initial revision * * Revision 1.1.1.1 1999/10/19 23:59:39 david * Initial Import * * Revision 1.3 1999/10/19 23:59:39 david * Added some more sql keyword groups. * * Revision 1.2 1999/10/19 23:31:27 david * Dos2Unixed it * * Revision 1.1 1999/10/19 23:28:51 david * Initial revision * * Revision 1.1.1.1 1999/10/18 15:00:24 david * Initial Check-in * * Revision 1.6 1999/04/19 05:38:20 sp * Syntax API changes * * Revision 1.5 1999/03/15 03:40:23 sp * Search and replace updates, TSQL mode/token marker updates * * Revision 1.4 1999/03/13 00:09:07 sp * Console updates, uncomment removed cos it's too buggy, cvs log tags added * * Revision 1.3 1999/03/12 23:51:00 sp * Console updates, uncomment removed cos it's too buggy, cvs log tags added * */