KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > jedit > syntax > SQLTokenMarker


1 package org.jedit.syntax;
2
3 /*
4  * SQLTokenMarker.java - Generic SQL token marker
5  * Copyright (C) 1999 mike dillon
6  *
7  * You may use and modify this package for any purpose. Redistribution is
8  * permitted, in both source and binary form, provided that this notice
9  * remains intact in all source distributions of this package.
10  */

11
12 import javax.swing.text.Segment JavaDoc;
13
14 /**
15  * SQL token marker.
16  *
17  * @author mike dillon
18  * @version $Id: SQLTokenMarker.java,v 1.1 2003/12/14 16:29:49 daggerrz Exp $
19  */

20 public class SQLTokenMarker extends TokenMarker
21 {
22    private int offset, lastOffset, lastKeyword, length;
23
24    // public members
25
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 JavaDoc 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 members
179
protected boolean isTSQL = false;
180
181    // private members
182
private KeywordMap keywords;
183    private char literalChar = 0;
184
185    private void searchBack(Segment JavaDoc line, int pos)
186    {
187       searchBack(line, pos, true);
188    }
189
190    private void searchBack(Segment JavaDoc 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