View Javadoc

1   /*
2    * BatchFileTokenMarker.java - Batch file token marker
3    * Copyright (C) 1998, 1999 Slava Pestov
4    *
5    * You may use and modify this package for any purpose. Redistribution is
6    * permitted, in both source and binary form, provided that this notice
7    * remains intact in all source distributions of this package.
8    */
9   
10  package org.syntax.jedit.tokenmarker;
11  
12  import javax.swing.text.Segment;
13  
14  import org.syntax.jedit.SyntaxUtilities;
15  
16  /***
17   * Batch file token marker.
18   * 
19   * @author Slava Pestov
20   * @version $Id: BatchFileTokenMarker.java,v 1.20 1999/12/13 03:40:29 sp Exp $
21   */
22  public class BatchFileTokenMarker extends TokenMarker
23  {
24  	public byte markTokensImpl( byte token, Segment line, int lineIndex )
25  	{
26  		char[] array = line.array;
27  		int offset = line.offset;
28  		int lastOffset = offset;
29  		int length = line.count + offset;
30  
31  		if( SyntaxUtilities.regionMatches( true, line, offset, "rem" ) )
32  		{
33  			addToken( line.count, Token.COMMENT1 );
34  			return Token.NULL;
35  		}
36  
37  		loop : for( int i = offset; i < length; i++ )
38  		{
39  			int i1 = ( i + 1 );
40  
41  			switch( token )
42  			{
43  			case Token.NULL :
44  				switch( array[i] )
45  				{
46  				case '%' :
47  					addToken( i - lastOffset, token );
48  					lastOffset = i;
49  					if( length - i <= 3 || array[i + 2] == ' ' )
50  					{
51  						addToken( 2, Token.KEYWORD2 );
52  						i += 2;
53  						lastOffset = i;
54  					}
55  					else
56  						token = Token.KEYWORD2;
57  					break;
58  				case '"' :
59  					addToken( i - lastOffset, token );
60  					token = Token.LITERAL1;
61  					lastOffset = i;
62  					break;
63  				case ':' :
64  					if( i == offset )
65  					{
66  						addToken( line.count, Token.LABEL );
67  						lastOffset = length;
68  						break loop;
69  					}
70  					break;
71  				case ' ' :
72  					if( lastOffset == offset )
73  					{
74  						addToken( i - lastOffset, Token.KEYWORD1 );
75  						lastOffset = i;
76  					}
77  					break;
78  				}
79  				break;
80  			case Token.KEYWORD2 :
81  				if( array[i] == '%' )
82  				{
83  					addToken( i1 - lastOffset, token );
84  					token = Token.NULL;
85  					lastOffset = i1;
86  				}
87  				break;
88  			case Token.LITERAL1 :
89  				if( array[i] == '"' )
90  				{
91  					addToken( i1 - lastOffset, token );
92  					token = Token.NULL;
93  					lastOffset = i1;
94  				}
95  				break;
96  			default :
97  				throw new InternalError( "Invalid state: " + token );
98  			}
99  		}
100 
101 		if( lastOffset != length )
102 		{
103 			if( token != Token.NULL )
104 				token = Token.INVALID;
105 			else if( lastOffset == offset )
106 				token = Token.KEYWORD1;
107 			addToken( length - lastOffset, token );
108 		}
109 		return Token.NULL;
110 	}
111 
112 	public boolean supportsMultilineTokens()
113 	{
114 		return false;
115 	}
116 }