package net.bioclipse.spectrum.graph2d;
import java.awt.*;
import java.applet.*;
import java.util.*;
import java.lang.*;
import java.io.StreamTokenizer;
import java.io.InputStream;
import java.io.IOException;
import java.net.URL;
/*
************************************************************************
**
** Class ScanWord
**
**************************************************************************
** Copyright (C) 1996 Leigh Brookshaw
**
** This program is free software; you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation; either version 2 of the License, or
** (at your option) any later version.
**
** This program 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 General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
**************************************************************************/
/**
* This class extends the StreamTokenizer class. It allows words
* to be defined and recognised and returned as a token. The TT_NUMBER
* token of the StreamTokenizer is also modified so that scientific notation
* is recognised.
*
* @version $Revision: 1.5 $, $Date: 1996/07/24 00:19:41 $
* @author Leigh Brookshaw
*/
public class ScanWord extends StreamTokenizer {
/*
*********************
** Public Constants
********************/
/**
* Token returned when an unknown characters match nothing
*/
public final static int UNKNOWN = -256;
/**
* Token returned when an error is encountered
*/
public final static int ERROR = -257;
/**
* Token returned when a string has been found. A string is defined to be
* text between matching quotes " ".
*/
public final static int STRING = -258;
/********************
** Private Variables
********************/
private InputStream is = null;
/*
** The hash table containing the keyword/value pairs.
*/
private Hashtable kwords = new Hashtable();
/*
** The character that delimeters a string
*/
private char StringChar = '"';
/*
******************
**
** Constructors
**
*****************/
/**
* Instantiate the class with the parsed input stream.
* @param in Input stream to read from
*/
public ScanWord( InputStream in ) {
super(in);
this.is = in;
resetWordSyntax();
}
/*
*******************
**
** Public Methods
**
*******************/
/**
* Add a keyword/token pair.
* @param s String contining the keyword
* @param i Token to return when the keyword is encountered.
*/
public void addKeyWord ( String s, int i) {
if(s == null) return;
kwords.put(s.toLowerCase(), new Integer(i));
}
/**
* return the matching token given the keyword
* @param s Keyword.
*/
public int getKeyValue (String s) {
if(s == null) return UNKNOWN;
Integer i = (Integer)kwords.get(s.toLowerCase());
if(i == null) return UNKNOWN;
else return i.intValue();
}
/**
* Clear the internal table containing the keyword/token pairs
*/
public void resetKeyWords () {
kwords.clear();
}
/**
* Read the input stream and return the next token found.
*/
public int nextWord() {
int word;
try {
ttype = nextToken();
}
catch (Exception e) {
return ERROR;
}
if(ttype == StringChar ) {
return STRING;
} else
if(ttype == TT_WORD) {
word = getKeyValue(super.sval);
if( word == UNKNOWN ) word = getNumber(super.sval);
if( word == UNKNOWN ) return ttype;
ttype = word;
return word;
} else {
return ttype;
}
}
/**
* Set the character that delimeters a string.
* @param c character to delimeter strings. Default is ".
*/
public void setStringChar(char c) {
StringChar = c;
quoteChar(StringChar);
}
/*
*********************
**
** Protected Methods
**
********************/
/**
* Check to see if the returned word is a number
* The native StreamTokenizer number method does not work for
* scientific notation so we us the Double class doubleValue() method
* @param s String to find number.
*
*/
protected int getNumber(String s) {
try {
super.nval = Double.valueOf(s).doubleValue();
return TT_NUMBER;
}
catch (Exception e) {
return UNKNOWN;
}
}
/**
* Reset the syntax of the parent class
*/
protected void resetWordSyntax() {
resetSyntax();
wordChars('a','z');
wordChars('A','Z');
wordChars('0','9');
wordChars('.','.');
wordChars('_','_');
wordChars('{','}');
wordChars('+','+');
wordChars('-','-');
wordChars(128+32, 255);
quoteChar(StringChar);
whitespaceChars(0,' ');
commentChar('#');
lowerCaseMode(false);
eolIsSignificant(true);
}
/**
* Close the input stream
*/
protected void closeStream() {
try {
is.close();
}
catch (Exception e) {}
is = null;
}
}