All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.syntax.jedit.tokenmarker.ShellScriptTokenMarker Maven / Gradle / Ivy

The newest version!
/*
 *  soapUI, copyright (C) 2004-2011 smartbear.com 
 *
 *  soapUI is free software; you can redistribute it and/or modify it under the 
 *  terms of version 2.1 of the GNU Lesser General Public License as published by 
 *  the Free Software Foundation.
 *
 *  soapUI is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without 
 *  even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
 *  See the GNU Lesser General Public License for more details at gnu.org.
 */

package org.syntax.jedit.tokenmarker;

import javax.swing.text.Segment;

import org.syntax.jedit.SyntaxUtilities;

/**
 * Shell script token marker.
 * 
 * @author Slava Pestov
 * @version $Id: ShellScriptTokenMarker.java,v 1.18 1999/12/13 03:40:30 sp Exp $
 */
public class ShellScriptTokenMarker extends TokenMarker
{
	// public members
	public static final byte LVARIABLE = Token.INTERNAL_FIRST;

	public byte markTokensImpl( byte token, Segment line, int lineIndex )
	{
		char[] array = line.array;
		byte cmdState = 0; // 0 = space before command, 1 = inside
		// command, 2 = after command
		int offset = line.offset;
		int lastOffset = offset;
		int length = line.count + offset;

		if( token == Token.LITERAL1 && lineIndex != 0 && lineInfo[lineIndex - 1].obj != null )
		{
			String str = ( String )lineInfo[lineIndex - 1].obj;
			if( str != null && str.length() == line.count && SyntaxUtilities.regionMatches( false, line, offset, str ) )
			{
				addToken( line.count, Token.LITERAL1 );
				return Token.NULL;
			}
			else
			{
				addToken( line.count, Token.LITERAL1 );
				lineInfo[lineIndex].obj = str;
				return Token.LITERAL1;
			}
		}

		boolean backslash = false;
		loop : for( int i = offset; i < length; i++ )
		{
			int i1 = ( i + 1 );

			char c = array[i];

			if( c == '\\' )
			{
				backslash = !backslash;
				continue;
			}

			switch( token )
			{
			case Token.NULL :
				switch( c )
				{
				case ' ' :
				case '\t' :
				case '(' :
				case ')' :
					backslash = false;
					if( cmdState == 1/* insideCmd */)
					{
						addToken( i - lastOffset, Token.KEYWORD1 );
						lastOffset = i;
						cmdState = 2; /* afterCmd */
					}
					break;
				case '=' :
					backslash = false;
					if( cmdState == 1/* insideCmd */)
					{
						addToken( i - lastOffset, token );
						lastOffset = i;
						cmdState = 2; /* afterCmd */
					}
					break;
				case '&' :
				case '|' :
				case ';' :
					if( backslash )
						backslash = false;
					else
						cmdState = 0; /* beforeCmd */
					break;
				case '#' :
					if( backslash )
						backslash = false;
					else
					{
						addToken( i - lastOffset, token );
						addToken( length - i, Token.COMMENT1 );
						lastOffset = length;
						break loop;
					}
					break;
				case '$' :
					if( backslash )
						backslash = false;
					else
					{
						addToken( i - lastOffset, token );
						cmdState = 2; /* afterCmd */
						lastOffset = i;
						if( length - i >= 2 )
						{
							switch( array[i1] )
							{
							case '(' :
								continue;
							case '{' :
								token = LVARIABLE;
								break;
							default :
								token = Token.KEYWORD2;
								break;
							}
						}
						else
							token = Token.KEYWORD2;
					}
					break;
				case '"' :
					if( backslash )
						backslash = false;
					else
					{
						addToken( i - lastOffset, token );
						token = Token.LITERAL1;
						lineInfo[lineIndex].obj = null;
						cmdState = 2; /* afterCmd */
						lastOffset = i;
					}
					break;
				case '\'' :
					if( backslash )
						backslash = false;
					else
					{
						addToken( i - lastOffset, token );
						token = Token.LITERAL2;
						cmdState = 2; /* afterCmd */
						lastOffset = i;
					}
					break;
				case '<' :
					if( backslash )
						backslash = false;
					else
					{
						if( length - i > 1 && array[i1] == '<' )
						{
							addToken( i - lastOffset, token );
							token = Token.LITERAL1;
							lastOffset = i;
							lineInfo[lineIndex].obj = new String( array, i + 2, length - ( i + 2 ) );
						}
					}
					break;
				default :
					backslash = false;
					if( Character.isLetter( c ) )
					{
						if( cmdState == 0 /* beforeCmd */)
						{
							addToken( i - lastOffset, token );
							lastOffset = i;
							cmdState++ ; /* insideCmd */
						}
					}
					break;
				}
				break;
			case Token.KEYWORD2 :
				backslash = false;
				if( !Character.isLetterOrDigit( c ) && c != '_' )
				{
					if( i != offset && array[i - 1] == '$' )
					{
						addToken( i1 - lastOffset, token );
						lastOffset = i1;
						token = Token.NULL;
						continue;
					}
					else
					{
						addToken( i - lastOffset, token );
						lastOffset = i;
						token = Token.NULL;
					}
				}
				break;
			case Token.LITERAL1 :
				if( backslash )
					backslash = false;
				else if( c == '"' )
				{
					addToken( i1 - lastOffset, token );
					cmdState = 2; /* afterCmd */
					lastOffset = i1;
					token = Token.NULL;
				}
				else
					backslash = false;
				break;
			case Token.LITERAL2 :
				if( backslash )
					backslash = false;
				else if( c == '\'' )
				{
					addToken( i1 - lastOffset, Token.LITERAL1 );
					cmdState = 2; /* afterCmd */
					lastOffset = i1;
					token = Token.NULL;
				}
				else
					backslash = false;
				break;
			case LVARIABLE :
				backslash = false;
				if( c == '}' )
				{
					addToken( i1 - lastOffset, Token.KEYWORD2 );
					lastOffset = i1;
					token = Token.NULL;
				}
				break;
			default :
				throw new InternalError( "Invalid state: " + token );
			}
		}

		switch( token )
		{
		case Token.NULL :
			if( cmdState == 1 )
				addToken( length - lastOffset, Token.KEYWORD1 );
			else
				addToken( length - lastOffset, token );
			break;
		case Token.LITERAL2 :
			addToken( length - lastOffset, Token.LITERAL1 );
			break;
		case Token.KEYWORD2 :
			addToken( length - lastOffset, token );
			token = Token.NULL;
			break;
		case LVARIABLE :
			addToken( length - lastOffset, Token.INVALID );
			token = Token.NULL;
			break;
		default :
			addToken( length - lastOffset, token );
			break;
		}
		return token;
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy