/*
 * This file is part of the Owl Positioning System (OwlPS) project.
 * It is subject to the copyright notice and license terms in the
 * COPYRIGHT.t2t file found in the top-level directory of this
 * distribution and at
 *   https://code.lm7.fr/mcy/owlps/src/master/COPYRIGHT.t2t
 * No part of the OwlPS Project, including this file, may be copied,
 * modified, propagated, or distributed except according to the terms
 * contained in the COPYRIGHT.t2t file; the COPYRIGHT.t2t file must be
 * distributed along with this file, either separately or by replacing
 * this notice by the COPYRIGHT.t2t file's contents.
 */


#ifndef _OWLPS_POSITIONING_TEXTFILEREADER_HH_
#define _OWLPS_POSITIONING_TEXTFILEREADER_HH_

#include <string>
#include <fstream>

/// Reads text from a file, line by line
/**
 * If the file name is a dash ('-'), the standard input is used.
 */
class TextFileReader
{
protected:
  /// Name of the input file
  std::string file_name ;
  /// Stream associated with the file
  std::ifstream file ;
/// Original rdbuf of the stream
  std::streambuf *file_buf ;
  /// Number of the last line read
  unsigned int current_line_nb ;

  /// Checks if the file is readable and closes it if not
  bool eof_close(void) ;

public:
  explicit TextFileReader(const std::string &_file_name);
  virtual ~TextFileReader(void) ;

  /** @name Operations */
  //@{
  /// Reads the next non-blank line
  bool read_nonblank_line(std::string &text) ;
  /// Reads the next line
  bool read_line(std::string &text) ;
  bool eof(void) const ;
  //@}
} ;



/* *** Operations *** */


/**
 * @returns `true` if the end of file is reached.
 * @returns `false` if there is something more to read.
 */
inline bool TextFileReader::eof() const
{
  return ! file && file.eof() ;
}



#endif // _OWLPS_POSITIONING_TEXTFILEREADER_HH_
