/* 
 * TclToken.java --
 *
 *	For each word of a command, and for each piece of a word such as a
 * 	variable reference, a TclToken is used to describe the word.
 *
 * 	Note: TclToken is designed to be write-once with respect to 
 * 	setting the script and size variables.  Failure to do this 
 * 	may lead to inconsistencies in calls to getTokenString(). 
 *
 * Copyright (c) 1997 by Sun Microsystems, Inc.
 *
 * See the file "license.terms" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: TclToken.java,v 1.2 1999/05/09 01:34:50 dejong Exp $
 */

package tcl.lang;

class TclToken {

// Contains an array the references the script from where the
// token originates from and an index to the first character
// of the token inside the script.


char[] script_array;
int    script_index;

// Number of bytes in token. 

int size;		

// Type of token, such as TCL_TOKEN_WORD;  See Parse.java 
// for valid types. 

int type;		

// If this token is composed of other tokens, this field 
// tells how many of them there are (including components
// of components, etc.).  The component tokens immediately
// follow this one.

int numComponents;

/*
 *----------------------------------------------------------------------
 *
 * TclToken --
 *
 *	All class variables are accessed directly for speed.  The 
 *	consrructor only needs to allocate memory for the script.
 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */

TclToken() {
    script_array = null;
    script_index = -1;
}

/*
 *----------------------------------------------------------------------
 *
 * getTokenString --
 *
 *	The token string is a substring in the script.  The beginning
 * 	is deliminated by script_index, and the offset is the size
 * 	variable.  The first time this method is called the substring
 *	is cached in the str variable.
 *
 * 	Note: TclToken is designed to be write-once with respect to 
 * 	setting the script and size variables.  Failure to do this 
 * 	may lead to inconsistencies in str cache. 
 *
 * Results:
 *	The String representing the token.
 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */

String
getTokenString() {
    final boolean debug = false;
    
    if (debug && ((script_index + size) > script_array.length)) {
    System.out.println();
    System.out.println("Entered TclToken.getTokenString()");
    System.out.println("hashCode() is " +
		       hashCode());
    System.out.println("script_array.length is " + script_array.length);
    System.out.println("script_index is " + script_index);
    System.out.println("size is " + size);

    System.out.print("the string is \"");
    for (int k = 0; k < script_array.length ; k++) {
	System.out.print(script_array[k]);
    }
    System.out.println("\"");
    }

    return(new String(script_array, script_index, size));
}

/*
 *----------------------------------------------------------------------
 *
 * toString --
 *
 *	Prints debug information about the TclToken.
 *
 * Results:
 *	A String containing the info.
 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */

public String
toString() {
    StringBuffer sbuf = new StringBuffer();    
    switch (type) {
    case Parser.TCL_TOKEN_WORD: {
	sbuf.append("\n  Token Type: TCL_TOKEN_WORD");
	break;
    }
    case Parser.TCL_TOKEN_SIMPLE_WORD: {
	sbuf.append("\n  Token Type: TCL_TOKEN_SIMPLE_WORD");
	break;
    }
    case Parser.TCL_TOKEN_TEXT: {
	sbuf.append("\n  Token Type: TCL_TOKEN_TEXT");
	break;
    }
    case Parser.TCL_TOKEN_BS: {
	sbuf.append("\n  Token Type: TCL_TOKEN_BS");
	break;
    }
    case Parser.TCL_TOKEN_COMMAND: {
	sbuf.append("\n  Token Type: TCL_TOKEN_COMMAND");
	break;
    }
    case Parser.TCL_TOKEN_VARIABLE: {
	sbuf.append("\n  Token Type: TCL_TOKEN_VARIABLE");
	break;
    }
    }
    sbuf.append("\n  String:      " + getTokenString());
    sbuf.append("\n  String Size: " + getTokenString().length());
    sbuf.append("\n  ScriptIndex: " + script_index);
    sbuf.append("\n  NumComponents: " + numComponents);
    sbuf.append("\n  Token Size: " + size);
    return sbuf.toString();
}

} // end TclToken

