/* * This file is part of the Owl Positioning System (OwlPS). * OwlPS is a project of the University of Franche-Comte * (Université de Franche-Comté), France. * * Copyright © Université de Franche-Comté 2007-2012. * * Corresponding author: Matteo Cypriani * *********************************************************************** * * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/or redistribute the software under the terms of the CeCILL * license as circulated by CEA, CNRS and INRIA at the following URL: * http://www.cecill.info * * As a counterpart to the access to the source code and rights to copy, * modify and redistribute granted by the license, users are provided * only with a limited warranty and the software's authors, the holder * of the economic rights, and the successive licensors have only * limited liability. * * In this respect, the user's attention is drawn to the risks * associated with loading, using, modifying and/or developing or * reproducing the software by the user in light of its specific status * of free software, that may mean that it is complicated to manipulate, * and that also therefore means that it is reserved for developers and * experienced professionals having in-depth computer knowledge. Users * are therefore encouraged to load and test the software's suitability * as regards their requirements in conditions enabling the security of * their systems and/or data to be ensured and, more generally, to use * and operate it in the same conditions as regards security. * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. * *********************************************************************** */ #include "csvfilereader.hh" #include "point3d.hh" #include using namespace std ; using namespace boost ; /* *** Constructors *** */ CSVFileReader::~CSVFileReader() { delete current_token ; } /* *** Operations *** */ /** * Note that this function is not called by the constructor, so you * must manually call it prior to use read_field(). * @return \em false in case of error (EOF, etc.), \em true else. */ bool CSVFileReader::next_line() { delete current_token ; current_token = NULL ; if (! read_nonblank_line(current_line)) return false ; // Split read string into fields (semicolon-separated) current_token = new tokenizer >( current_line, escaped_list_separator('\\', separator, '\"')) ; token_iterator = current_token->begin() ; current_field_nb = 0 ; return true ; } bool CSVFileReader::read_timestamp(Timestamp &t) { string timestamp_str ; uint_fast32_t time_s, time_ns ; if (! read_field(timestamp_str)) return false ; tokenizer > tok( timestamp_str, escaped_list_separator('\\', '.', '\"')) ; tokenizer >::const_iterator tok_iter = tok.begin() ; if (tok_iter == tok.end()) return false ; try { time_s = lexical_cast(*tok_iter) ; } catch (bad_lexical_cast &e) { print_error_cast() ; return false ; } ++tok_iter ; if (tok_iter == tok.end()) return false ; try { time_ns = lexical_cast(*tok_iter) ; } catch (bad_lexical_cast &e) { print_error_cast() ; return false ; } t = Timestamp(time_s, time_ns) ; return true ; } bool CSVFileReader::read_point3d(Point3D &p) { float coord[3] ; for (unsigned int i = 0 ; i < 3 ; ++i) { if (token_iterator == current_token->end()) return false ; ++current_field_nb ; try { coord[i] = lexical_cast(*token_iterator) ; } catch (bad_lexical_cast &e) { print_error_cast() ; return false ; } ++token_iterator ; } p.set_coordinates(coord) ; return true ; } void CSVFileReader::print_error_cast() const { cerr << "Bad value \"" << *token_iterator << "\" at line " << current_line_nb << ", field #" << current_field_nb << ", of input file \"" << file_name << "\"!" << endl ; }