Statistics
| Revision:

svn-gvsig-desktop / tags / v1_0_2_Build_902 / libraries / libIverUtiles / src / com / iver / utiles / console / jedit / ShellScriptTokenMarker.java @ 10681

History | View | Annotate | Download (5.52 KB)

1
package com.iver.utiles.console.jedit;
2
/*
3
 * ShellScriptTokenMarker.java - Shell script token marker
4
 * Copyright (C) 1998, 1999 Slava Pestov
5
 *
6
 * You may use and modify this package for any purpose. Redistribution is
7
 * permitted, in both source and binary form, provided that this notice
8
 * remains intact in all source distributions of this package.
9
 */
10

    
11
import javax.swing.text.Segment;
12

    
13
/**
14
 * Shell script token marker.
15
 *
16
 * @author Slava Pestov
17
 * @version $Id$
18
 */
19
public class ShellScriptTokenMarker extends TokenMarker
20
{
21
        // public members
22
        public static final byte LVARIABLE = Token.INTERNAL_FIRST;
23

    
24
        public byte markTokensImpl(byte token, Segment line, int lineIndex)
25
        {
26
                char[] array = line.array;
27
                byte cmdState = 0; // 0 = space before command, 1 = inside
28
                                // command, 2 = after command
29
                int offset = line.offset;
30
                int lastOffset = offset;
31
                int length = line.count + offset;
32

    
33
                if(token == Token.LITERAL1 && lineIndex != 0
34
                        && lineInfo[lineIndex - 1].obj != null)
35
                {
36
                        String str = (String)lineInfo[lineIndex - 1].obj;
37
                        if(str != null && str.length() == line.count
38
                                && SyntaxUtilities.regionMatches(false,line,
39
                                offset,str))
40
                        {
41
                                addToken(line.count,Token.LITERAL1);
42
                                return Token.NULL;
43
                        }
44
                        else
45
                        {
46
                                addToken(line.count,Token.LITERAL1);
47
                                lineInfo[lineIndex].obj = str;
48
                                return Token.LITERAL1;
49
                        }
50
                }
51

    
52
                boolean backslash = false;
53
loop:                for(int i = offset; i < length; i++)
54
                {
55
                        int i1 = (i+1);
56

    
57
                        char c = array[i];
58

    
59
                        if(c == '\\')
60
                        {
61
                                backslash = !backslash;
62
                                continue;
63
                        }
64

    
65
                        switch(token)
66
                        {
67
                        case Token.NULL:
68
                                switch(c)
69
                                {
70
                                case ' ': case '\t': case '(': case ')':
71
                                        backslash = false;
72
                                        if(cmdState == 1/*insideCmd*/)
73
                                        {
74
                                                addToken(i - lastOffset,Token.KEYWORD1);
75
                                                lastOffset = i;
76
                                                cmdState = 2; /*afterCmd*/
77
                                        }
78
                                        break;
79
                                case '=':
80
                                        backslash = false;
81
                                        if(cmdState == 1/*insideCmd*/)
82
                                        {
83
                                                addToken(i - lastOffset,token);
84
                                                lastOffset = i;
85
                                                cmdState = 2; /*afterCmd*/
86
                                        }
87
                                        break;
88
                                case '&': case '|': case ';':
89
                                        if(backslash)
90
                                                backslash = false;
91
                                        else
92
                                                cmdState = 0; /*beforeCmd*/
93
                                        break;
94
                                case '#':
95
                                        if(backslash)
96
                                                backslash = false;
97
                                        else
98
                                        {
99
                                                addToken(i - lastOffset,token);
100
                                                addToken(length - i,Token.COMMENT1);
101
                                                lastOffset = length;
102
                                                break loop;
103
                                        }
104
                                        break;
105
                                case '$':
106
                                        if(backslash)
107
                                                backslash = false;
108
                                        else
109
                                        {
110
                                                addToken(i - lastOffset,token);
111
                                                cmdState = 2; /*afterCmd*/
112
                                                lastOffset = i;
113
                                                if(length - i >= 2)
114
                                                {
115
                                                        switch(array[i1])
116
                                                        {
117
                                                        case '(':
118
                                                                continue;
119
                                                        case '{':
120
                                                                token = LVARIABLE;
121
                                                                break;
122
                                                        default:
123
                                                                token = Token.KEYWORD2;
124
                                                                break;
125
                                                        }
126
                                                }
127
                                                else
128
                                                        token = Token.KEYWORD2;
129
                                        }
130
                                        break;
131
                                case '"':
132
                                        if(backslash)
133
                                                backslash = false;
134
                                        else
135
                                        {
136
                                                addToken(i - lastOffset,token);
137
                                                token = Token.LITERAL1;
138
                                                lineInfo[lineIndex].obj = null;
139
                                                cmdState = 2; /*afterCmd*/
140
                                                lastOffset = i;
141
                                        }
142
                                        break;
143
                                case '\'':
144
                                        if(backslash)
145
                                                backslash = false;
146
                                        else
147
                                        {
148
                                                addToken(i - lastOffset,token);
149
                                                token = Token.LITERAL2;
150
                                                cmdState = 2; /*afterCmd*/
151
                                                lastOffset = i;
152
                                        }
153
                                        break;
154
                                case '<':
155
                                        if(backslash)
156
                                                backslash = false;
157
                                        else
158
                                        {
159
                                                if(length - i > 1 && array[i1] == '<')
160
                                                {
161
                                                        addToken(i - lastOffset,
162
                                                                token);
163
                                                        token = Token.LITERAL1;
164
                                                        lastOffset = i;
165
                                                        lineInfo[lineIndex].obj =
166
                                                                new String(array,i + 2,
167
                                                                        length - (i+2));
168
                                                }
169
                                        }
170
                                        break;
171
                                default:
172
                                        backslash = false;
173
                                        if(Character.isLetter(c))
174
                                        {
175
                                                if(cmdState == 0 /*beforeCmd*/)
176
                                                {
177
                                                        addToken(i - lastOffset,token);
178
                                                        lastOffset = i;
179
                                                        cmdState++; /*insideCmd*/
180
                                                }
181
                                        }
182
                                        break;
183
                                }
184
                                break;
185
                        case Token.KEYWORD2:
186
                                backslash = false;
187
                                if(!Character.isLetterOrDigit(c) && c != '_')
188
                                {
189
                                        if(i != offset && array[i-1] == '$')
190
                                        {
191
                                                addToken(i1 - lastOffset,token);
192
                                                lastOffset = i1;
193
                                                token = Token.NULL;
194
                                                continue;
195
                                        }
196
                                        else
197
                                        {
198
                                                addToken(i - lastOffset,token);
199
                                                lastOffset = i;
200
                                                token = Token.NULL;
201
                                        }
202
                                }
203
                                break;
204
                        case Token.LITERAL1:
205
                                if(backslash)
206
                                        backslash = false;
207
                                else if(c == '"')
208
                                {
209
                                        addToken(i1 - lastOffset,token);
210
                                        cmdState = 2; /*afterCmd*/
211
                                        lastOffset = i1;
212
                                        token = Token.NULL;
213
                                }
214
                                else
215
                                        backslash = false;
216
                                break;
217
                        case Token.LITERAL2:
218
                                if(backslash)
219
                                        backslash = false;
220
                                else if(c == '\'')
221
                                {
222
                                        addToken(i1 - lastOffset,Token.LITERAL1);
223
                                        cmdState = 2; /*afterCmd*/
224
                                        lastOffset = i1;
225
                                        token = Token.NULL;
226
                                }
227
                                else
228
                                        backslash = false;
229
                                break;
230
                        case LVARIABLE:
231
                                backslash = false;
232
                                if(c == '}')
233
                                {
234
                                        addToken(i1 - lastOffset,Token.KEYWORD2);
235
                                        lastOffset = i1;
236
                                        token = Token.NULL;
237
                                }
238
                                break;
239
                        default:
240
                                throw new InternalError("Invalid state: " + token);
241
                        }
242
                }
243

    
244
                switch(token)
245
                {
246
                case Token.NULL:
247
                        if(cmdState == 1)
248
                                addToken(length - lastOffset,Token.KEYWORD1);
249
                        else
250
                                addToken(length - lastOffset,token);
251
                        break;
252
                case Token.LITERAL2:
253
                        addToken(length - lastOffset,Token.LITERAL1);
254
                        break;
255
                case Token.KEYWORD2:
256
                        addToken(length - lastOffset,token);
257
                        token = Token.NULL;
258
                        break;
259
                case LVARIABLE:
260
                        addToken(length - lastOffset,Token.INVALID);
261
                        token = Token.NULL;
262
                        break;
263
                default:
264
                        addToken(length - lastOffset,token);
265
                        break;
266
                }
267
                return token;
268
        }
269
}