/*
* Conditions Of Use
*
* This software was developed by employees of the National Institute of
* Standards and Technology (NIST), an agency of the Federal Government.
* Pursuant to title 15 Untied States Code Section 105, works of NIST
* employees are not subject to copyright protection in the United States
* and are considered to be in the public domain. As a result, a formal
* license is not needed to use the software.
*
* This software is provided by NIST as a service and is expressly
* provided "AS IS." NIST MAKES NO WARRANTY OF ANY KIND, EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT
* AND DATA ACCURACY. NIST does not warrant or make any representations
* regarding the use of the software or the results thereof, including but
* not limited to the correctness, accuracy, reliability or usefulness of
* the software.
*
* Permission to use this software is contingent upon your acceptance
* of the terms of this agreement
*
* .
*
*/
package gov.nist.core;
import java.util.*;
import java.text.ParseException;
/** Base string token splitter.
*
*@version 1.2
*
*@author M. Ranganathan
*
*
*
*/
public class StringTokenizer {
protected String buffer;
protected int bufferLen;
protected int ptr;
protected int savedPtr;
protected StringTokenizer() {
}
public StringTokenizer(String buffer) {
this.buffer = buffer;
bufferLen = buffer.length();
ptr = 0;
}
public String nextToken() {
int startIdx = ptr;
while (ptr < bufferLen) {
char c = buffer.charAt(ptr);
ptr++;
if (c == '\n') {
break;
}
}
return buffer.substring(startIdx, ptr);
}
public boolean hasMoreChars() {
return ptr < bufferLen;
}
public static boolean isHexDigit(char ch) {
return (ch >= 'A' && ch <= 'F') ||
(ch >= 'a' && ch <= 'f') ||
isDigit(ch);
}
public static boolean isAlpha(char ch) {
if (ch <= 127) {
return ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'));
}
else {
return Character.isLowerCase(ch) || Character.isUpperCase(ch);
}
}
public static boolean isDigit(char ch) {
if (ch <= 127) {
return (ch <= '9' && ch >= '0');
}
else {
return Character.isDigit(ch);
}
}
public static boolean isAlphaDigit(char ch) {
if (ch <= 127) {
return (ch >= 'a' && ch <= 'z') ||
(ch >= 'A' && ch <= 'Z') ||
(ch <= '9' && ch >= '0');
}
else {
return Character.isLowerCase(ch) ||
Character.isUpperCase(ch) ||
Character.isDigit(ch);
}
}
public String getLine() {
int startIdx = ptr;
while (ptr < bufferLen && buffer.charAt(ptr) != '\n') {
ptr++;
}
if (ptr < bufferLen && buffer.charAt(ptr) == '\n') {
ptr++;
}
return buffer.substring(startIdx, ptr);
}
public String peekLine() {
int curPos = ptr;
String retval = this.getLine();
ptr = curPos;
return retval;
}
public char lookAhead() throws ParseException {
return lookAhead(0);
}
public char lookAhead(int k) throws ParseException {
// Debug.out.println("ptr = " + ptr);
try {
return buffer.charAt(ptr + k);
}
catch (IndexOutOfBoundsException e) {
return '\0';
}
}
public char getNextChar() throws ParseException {
if (ptr >= bufferLen)
throw new ParseException(
buffer + " getNextChar: End of buffer",
ptr);
else
return buffer.charAt(ptr++);
}
public void consume() {
ptr = savedPtr;
}
public void consume(int k) {
ptr += k;
}
/** Get a Vector of the buffer tokenized by lines
*/
public Vector getLines() {
Vector result = new Vector();
while (hasMoreChars()) {
String line = getLine();
result.addElement(line);
}
return result;
}
/** Get the next token from the buffer.
*/
public String getNextToken(char delim) throws ParseException {
int startIdx = ptr;
while (true) {
char la = lookAhead(0);
if (la == delim)
break;
else if (la == '\0')
throw new ParseException("EOL reached", 0);
consume(1);
}
return buffer.substring(startIdx, ptr);
}
/** get the SDP field name of the line
* @return String
*/
public static String getSDPFieldName(String line) {
if (line == null)
return null;
String fieldName = null;
try {
int begin = line.indexOf("=");
fieldName = line.substring(0, begin);
} catch (IndexOutOfBoundsException e) {
return null;
}
return fieldName;
}
}