/***********************************************************************
* mt4j Copyright (c) 2008 - 2009 C.Ruff, Fraunhofer-Gesellschaft All rights reserved.
*
* 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 3 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, see <http://www.gnu.org/licenses/>.
*
***********************************************************************/
package org.mt4j.util.modelImporter.fileObj;
import java.io.IOException;
import java.io.Reader;
import java.io.StreamTokenizer;
class ObjectFileParser extends StreamTokenizer {
private static final char BACKSLASH = '\\';
/**
* setup
*
* Sets up StreamTokenizer for reading ViewPoint .obj file format.
*/
void setup() {
resetSyntax();
eolIsSignificant(true);
lowerCaseMode(true);
// All printable ascii characters
wordChars('!', '~');
// Comment from ! to end of line
commentChar('!');
whitespaceChars(' ', ' ');
whitespaceChars('\n', '\n');
whitespaceChars('\r', '\r');
whitespaceChars('\t', '\t');
// These characters returned as tokens
ordinaryChar('#');
ordinaryChar('/');
ordinaryChar(BACKSLASH);
} // End of setup
/**
* getToken
*
* Gets the next token from the stream. Puts one of the four
* constants (TT_WORD, TT_NUMBER, TT_EOL, or TT_EOF) or the token value
* for single character tokens into ttype. Handles backslash
* continuation of lines.
*/
void getToken(){
int t;
boolean done = false;
try {
do {
t = nextToken();
if (t == BACKSLASH) {
t = nextToken();
if (ttype != TT_EOL) done = true;
} else done = true;
} while (!done);
}
catch (IOException e) {
throw new ParsingErrorException(
"IO error on line " + lineno() + ": " + e.getMessage());
}
} // End of getToken
void printToken() {
switch (ttype) {
case TT_EOL:
System.out.println("Token EOL");
break;
case TT_EOF:
System.out.println("Token EOF");
break;
case TT_WORD:
System.out.println("Token TT_WORD: " + sval);
break;
case '/':
System.out.println("Token /");
break;
case BACKSLASH:
System.out.println("Token " + BACKSLASH);
break;
case '#':
System.out.println("Token #");
break;
}
} // end of printToken
/**
* skipToNextLine
*
* Skips all tokens on the rest of this line. Doesn't do anything if
* We're already at the end of a line
*/
void skipToNextLine() throws ParsingErrorException {
while (ttype != TT_EOL) {
getToken();
}
} // end of skipToNextLine
/**
* getNumber
*
* Gets a number from the stream. Note that we don't recognize
* numbers in the tokenizer automatically because numbers might be in
* scientific notation, which isn't processed correctly by
* StreamTokenizer. The number is returned in nval.
*/
void getNumber() throws ParsingErrorException {
// int t;
try {
getToken();
if (ttype != TT_WORD)
throw new ParsingErrorException("Expected number on line " + lineno());
nval = (Double.valueOf(sval)).doubleValue();
}
catch (NumberFormatException e) {
throw new ParsingErrorException(e.getMessage());
}
} // end of getNumber
// ObjectFileParser constructor
ObjectFileParser(Reader r) {
super(r);
setup();
} // end of ObjectFileParser
} // End of file ObjectFileParser.java