Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.library / org.gvsig.utils / src / main / java / org / gvsig / utils / console / jedit / ShellScriptTokenMarker.java @ 40561

History | View | Annotate | Download (6.46 KB)

1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2013 gvSIG Association.
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 3
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
24
package org.gvsig.utils.console.jedit;
25
/*
26
 * ShellScriptTokenMarker.java - Shell script token marker
27
 * Copyright (C) 1998, 1999 Slava Pestov
28
 *
29
 * You may use and modify this package for any purpose. Redistribution is
30
 * permitted, in both source and binary form, provided that this notice
31
 * remains intact in all source distributions of this package.
32
 */
33

    
34
import javax.swing.text.Segment;
35

    
36
/**
37
 * Shell script token marker.
38
 *
39
 * @author Slava Pestov
40
 * @version $Id$
41
 */
42
public class ShellScriptTokenMarker extends TokenMarker
43
{
44
        // public members
45
        public static final byte LVARIABLE = Token.INTERNAL_FIRST;
46

    
47
        public byte markTokensImpl(byte token, Segment line, int lineIndex)
48
        {
49
                char[] array = line.array;
50
                byte cmdState = 0; // 0 = space before command, 1 = inside
51
                                // command, 2 = after command
52
                int offset = line.offset;
53
                int lastOffset = offset;
54
                int length = line.count + offset;
55

    
56
                if(token == Token.LITERAL1 && lineIndex != 0
57
                        && lineInfo[lineIndex - 1].obj != null)
58
                {
59
                        String str = (String)lineInfo[lineIndex - 1].obj;
60
                        if(str != null && str.length() == line.count
61
                                && SyntaxUtilities.regionMatches(false,line,
62
                                offset,str))
63
                        {
64
                                addToken(line.count,Token.LITERAL1);
65
                                return Token.NULL;
66
                        }
67
                        else
68
                        {
69
                                addToken(line.count,Token.LITERAL1);
70
                                lineInfo[lineIndex].obj = str;
71
                                return Token.LITERAL1;
72
                        }
73
                }
74

    
75
                boolean backslash = false;
76
loop:                for(int i = offset; i < length; i++)
77
                {
78
                        int i1 = (i+1);
79

    
80
                        char c = array[i];
81

    
82
                        if(c == '\\')
83
                        {
84
                                backslash = !backslash;
85
                                continue;
86
                        }
87

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

    
267
                switch(token)
268
                {
269
                case Token.NULL:
270
                        if(cmdState == 1)
271
                                addToken(length - lastOffset,Token.KEYWORD1);
272
                        else
273
                                addToken(length - lastOffset,token);
274
                        break;
275
                case Token.LITERAL2:
276
                        addToken(length - lastOffset,Token.LITERAL1);
277
                        break;
278
                case Token.KEYWORD2:
279
                        addToken(length - lastOffset,token);
280
                        token = Token.NULL;
281
                        break;
282
                case LVARIABLE:
283
                        addToken(length - lastOffset,Token.INVALID);
284
                        token = Token.NULL;
285
                        break;
286
                default:
287
                        addToken(length - lastOffset,token);
288
                        break;
289
                }
290
                return token;
291
        }
292
}