/*
* 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 org.gjt.sp.jedit.syntax;
import javax.swing.text.Segment;
/**
* SQL token marker.
*
* @author mike dillon
* @version $Id: SQLTokenMarker.java,v 1.2 2002/03/26 18:21:01 tonyj Exp $
*/
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);
}
}
/*
* ChangeLog:
* $Log: SQLTokenMarker.java,v $
* Revision 1.2 2002/03/26 18:21:01 tonyj
* Remove spurious carriage returns
*
* Revision 1.1.1.1 1999/10/21 01:48:13 tonyj
* Initial import from SourceSafe
*
* 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
*
*/
Ads help maintain this website.