KickJava   Java API By Example, From Geeks To Geeks.

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


1 package org.jedit.syntax;
2
3 /*
4  * ShellScriptTokenMarker.java - Shell script token marker
5  * Copyright (C) 1998, 1999 Slava Pestov
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  * Shell script token marker.
16  *
17  * @author Slava Pestov
18  * @version $Id: ShellScriptTokenMarker.java,v 1.1 2003/12/14 16:29:49 daggerrz Exp $
19  */

20 public class ShellScriptTokenMarker extends TokenMarker
21 {
22    // public members
23
public static final byte LVARIABLE = Token.INTERNAL_FIRST;
24
25    public byte markTokensImpl(byte token, Segment JavaDoc line, int lineIndex)
26    {
27       char[] array = line.array;
28       byte cmdState = 0; // 0 = space before command, 1 = inside
29
// command, 2 = after command
30
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 JavaDoc str = (String JavaDoc)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/*insideCmd*/)
74                {
75                   addToken(i - lastOffset,Token.KEYWORD1);
76                   lastOffset = i;
77                   cmdState = 2; /*afterCmd*/
78                }
79                break;
80             case '=':
81                backslash = false;
82                if(cmdState == 1/*insideCmd*/)
83                {
84                   addToken(i - lastOffset,token);
85                   lastOffset = i;
86                   cmdState = 2; /*afterCmd*/
87                }
88                break;
89             case '&': case '|': case ';':
90                if(backslash)
91                   backslash = false;
92                else
93                   cmdState = 0; /*beforeCmd*/
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; /*afterCmd*/
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; /*afterCmd*/
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; /*afterCmd*/
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 JavaDoc(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 /*beforeCmd*/)
177                   {
178                      addToken(i - lastOffset,token);
179                      lastOffset = i;
180                      cmdState++; /*insideCmd*/
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; /*afterCmd*/
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; /*afterCmd*/
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 JavaDoc("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