View Javadoc

1   /*
2    * MakefileTokenMarker.java - Makefile 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  /***
15   * Makefile token marker.
16   * 
17   * @author Slava Pestov
18   * @version $Id: MakefileTokenMarker.java,v 1.18 1999/12/13 03:40:30 sp Exp $
19   */
20  public class MakefileTokenMarker extends TokenMarker
21  {
22  	// public members
23  	public byte markTokensImpl( byte token, Segment line, int lineIndex )
24  	{
25  		char[] array = line.array;
26  		int offset = line.offset;
27  		int lastOffset = offset;
28  		int length = line.count + offset;
29  		boolean backslash = false;
30  		loop : for( int i = offset; i < length; i++ )
31  		{
32  			int i1 = ( i + 1 );
33  
34  			char c = array[i];
35  			if( c == '//' )
36  			{
37  				backslash = !backslash;
38  				continue;
39  			}
40  
41  			switch( token )
42  			{
43  			case Token.NULL :
44  				switch( c )
45  				{
46  				case ':' :
47  				case '=' :
48  				case ' ' :
49  				case '\t' :
50  					backslash = false;
51  					if( lastOffset == offset )
52  					{
53  						addToken( i1 - lastOffset, Token.KEYWORD1 );
54  						lastOffset = i1;
55  					}
56  					break;
57  				case '#' :
58  					if( backslash )
59  						backslash = false;
60  					else
61  					{
62  						addToken( i - lastOffset, token );
63  						addToken( length - i, Token.COMMENT1 );
64  						lastOffset = length;
65  						break loop;
66  					}
67  					break;
68  				case '$' :
69  					if( backslash )
70  						backslash = false;
71  					else if( lastOffset != offset )
72  					{
73  						addToken( i - lastOffset, token );
74  						lastOffset = i;
75  						if( length - i > 1 )
76  						{
77  							char c1 = array[i1];
78  							if( c1 == '(' || c1 == '{' )
79  								token = Token.KEYWORD2;
80  							else
81  							{
82  								addToken( 2, Token.KEYWORD2 );
83  								lastOffset += 2;
84  								i++ ;
85  							}
86  						}
87  					}
88  					break;
89  				case '"' :
90  					if( backslash )
91  						backslash = false;
92  					else
93  					{
94  						addToken( i - lastOffset, token );
95  						token = Token.LITERAL1;
96  						lastOffset = i;
97  					}
98  					break;
99  				case '\'' :
100 					if( backslash )
101 						backslash = false;
102 					else
103 					{
104 						addToken( i - lastOffset, token );
105 						token = Token.LITERAL2;
106 						lastOffset = i;
107 					}
108 					break;
109 				default :
110 					backslash = false;
111 					break;
112 				}
113 			case Token.KEYWORD2 :
114 				backslash = false;
115 				if( c == ')' || c == '}' )
116 				{
117 					addToken( i1 - lastOffset, token );
118 					token = Token.NULL;
119 					lastOffset = i1;
120 				}
121 				break;
122 			case Token.LITERAL1 :
123 				if( backslash )
124 					backslash = false;
125 				else if( c == '"' )
126 				{
127 					addToken( i1 - lastOffset, token );
128 					token = Token.NULL;
129 					lastOffset = i1;
130 				}
131 				else
132 					backslash = false;
133 				break;
134 			case Token.LITERAL2 :
135 				if( backslash )
136 					backslash = false;
137 				else if( c == '\'' )
138 				{
139 					addToken( i1 - lastOffset, Token.LITERAL1 );
140 					token = Token.NULL;
141 					lastOffset = i1;
142 				}
143 				else
144 					backslash = false;
145 				break;
146 			}
147 		}
148 		switch( token )
149 		{
150 		case Token.KEYWORD2 :
151 			addToken( length - lastOffset, Token.INVALID );
152 			token = Token.NULL;
153 			break;
154 		case Token.LITERAL2 :
155 			addToken( length - lastOffset, Token.LITERAL1 );
156 			break;
157 		default :
158 			addToken( length - lastOffset, token );
159 			break;
160 		}
161 		return token;
162 	}
163 }