001: /*
002: * $RCSfile: ObjectFileParser.java,v $
003: *
004: * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
005: *
006: * Redistribution and use in source and binary forms, with or without
007: * modification, are permitted provided that the following conditions
008: * are met:
009: *
010: * - Redistribution of source code must retain the above copyright
011: * notice, this list of conditions and the following disclaimer.
012: *
013: * - Redistribution in binary form must reproduce the above copyright
014: * notice, this list of conditions and the following disclaimer in
015: * the documentation and/or other materials provided with the
016: * distribution.
017: *
018: * Neither the name of Sun Microsystems, Inc. or the names of
019: * contributors may be used to endorse or promote products derived
020: * from this software without specific prior written permission.
021: *
022: * This software is provided "AS IS," without a warranty of any
023: * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
024: * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
025: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
026: * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
027: * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
028: * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
029: * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
030: * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
031: * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
032: * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
033: * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
034: * POSSIBILITY OF SUCH DAMAGES.
035: *
036: * You acknowledge that this software is not designed, licensed or
037: * intended for use in the design, construction, operation or
038: * maintenance of any nuclear facility.
039: *
040: * $Revision: 1.4 $
041: * $Date: 2007/02/09 17:20:10 $
042: * $State: Exp $
043: */
044:
045: package com.sun.j3d.loaders.objectfile;
046:
047: import java.io.StreamTokenizer;
048: import java.io.IOException;
049: import java.io.Reader;
050: import com.sun.j3d.loaders.ParsingErrorException;
051:
052: class ObjectFileParser extends StreamTokenizer {
053:
054: private static final char BACKSLASH = '\\';
055:
056: /**
057: * setup
058: *
059: * Sets up StreamTokenizer for reading ViewPoint .obj file format.
060: */
061: void setup() {
062: resetSyntax();
063: eolIsSignificant(true);
064: lowerCaseMode(true);
065:
066: // All printable ascii characters
067: wordChars('!', '~');
068:
069: // Comment from ! to end of line
070: commentChar('!');
071:
072: whitespaceChars(' ', ' ');
073: whitespaceChars('\n', '\n');
074: whitespaceChars('\r', '\r');
075: whitespaceChars('\t', '\t');
076:
077: // These characters returned as tokens
078: ordinaryChar('#');
079: ordinaryChar('/');
080: ordinaryChar(BACKSLASH);
081: } // End of setup
082:
083: /**
084: * getToken
085: *
086: * Gets the next token from the stream. Puts one of the four
087: * constants (TT_WORD, TT_NUMBER, TT_EOL, or TT_EOF) or the token value
088: * for single character tokens into ttype. Handles backslash
089: * continuation of lines.
090: */
091: void getToken() throws ParsingErrorException {
092: int t;
093: boolean done = false;
094:
095: try {
096: do {
097: t = nextToken();
098: if (t == BACKSLASH) {
099: t = nextToken();
100: if (ttype != TT_EOL)
101: done = true;
102: } else
103: done = true;
104: } while (!done);
105: } catch (IOException e) {
106: throw new ParsingErrorException("IO error on line "
107: + lineno() + ": " + e.getMessage());
108: }
109: } // End of getToken
110:
111: void printToken() {
112: switch (ttype) {
113: case TT_EOL:
114: System.out.println("Token EOL");
115: break;
116: case TT_EOF:
117: System.out.println("Token EOF");
118: break;
119: case TT_WORD:
120: System.out.println("Token TT_WORD: " + sval);
121: break;
122: case '/':
123: System.out.println("Token /");
124: break;
125: case BACKSLASH:
126: System.out.println("Token " + BACKSLASH);
127: break;
128: case '#':
129: System.out.println("Token #");
130: break;
131: }
132: } // end of printToken
133:
134: /**
135: * skipToNextLine
136: *
137: * Skips all tokens on the rest of this line. Doesn't do anything if
138: * We're already at the end of a line
139: */
140: void skipToNextLine() throws ParsingErrorException {
141: while (ttype != TT_EOL) {
142: getToken();
143: }
144: } // end of skipToNextLine
145:
146: /**
147: * getNumber
148: *
149: * Gets a number from the stream. Note that we don't recognize
150: * numbers in the tokenizer automatically because numbers might be in
151: * scientific notation, which isn't processed correctly by
152: * StreamTokenizer. The number is returned in nval.
153: */
154: void getNumber() throws ParsingErrorException {
155: int t;
156:
157: try {
158: getToken();
159: if (ttype != TT_WORD)
160: throw new ParsingErrorException(
161: "Expected number on line " + lineno());
162: nval = (Double.valueOf(sval)).doubleValue();
163: } catch (NumberFormatException e) {
164: throw new ParsingErrorException(e.getMessage());
165: }
166: } // end of getNumber
167:
168: // ObjectFileParser constructor
169: ObjectFileParser(Reader r) {
170: super (r);
171: setup();
172: } // end of ObjectFileParser
173:
174: } // End of file ObjectFileParser.java
|