/* * Copyright (c) 2011-2016, Peter Abeles. All Rights Reserved. * * This file is part of BoofCV (http://boofcv.org). * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package boofcv.io; import java.io.IOException; import java.io.Reader; import java.util.ArrayList; import java.util.List; /** * Reads one or more lines of pure numbers while skipping over lines which begin with the * comment character. Intended for use with simple config files. * * @author Peter Abeles */ public class SimpleStringNumberReader { char commentChar; Reader input; char buffer[] = new char[1024]; List<Object> sequence; int where; Object current; public SimpleStringNumberReader(char commentChar) { this.commentChar = commentChar; } public boolean read( Reader input ) { this.input = input; try { sequence = new ArrayList<>(); where = 0; int v = input.read(); while( v >= 0 ) { if( v == commentChar ) { skipLine(); } else { parseLine(v); } v = input.read(); } } catch( IOException e ) { return false; } this.input = null; return true; } public int remainingTokens() { return sequence.size()-where; } public boolean next() { if( sequence.size() > where ) { current = sequence.get(where++); return true; } return false; } public boolean isString() { return current instanceof String; } public String getString() { return (String)current; } public double getDouble() { return (Double)current; } public String nextString() { if( !next() ) throw new RuntimeException("There is no next token!"); if( !isString()) throw new RuntimeException("The token is a double not a string. "+current); return (String)current; } public double nextDouble() { if( !next() ) throw new RuntimeException("There is no next token!"); if( isString()) throw new RuntimeException("The token is a string not a double. "+current); return (Double)current; } private void parseLine( int v ) throws IOException { int size = 0; while( v >= 0 && v != '\n' ) { if( Character.isWhitespace(v) ) { if( size > 0 ) { addString(new String(buffer,0,size)); size = 0; } } else { buffer[size++] = (char)v; } v = input.read(); } if( size > 0 ) { addString(new String(buffer,0,size)); } } private void skipLine() throws IOException { int v = input.read(); while( v >= 0 && v != '\n' ) { v = input.read(); } } private void addString( String s ) { try { sequence.add( Double.parseDouble(s) ); } catch( NumberFormatException e ) { sequence.add(s); } } public char getCommentChar() { return commentChar; } }