Loading [MathJax]/extensions/tex2jax.js
Mesh Oriented datABase  (version 5.5.1)
An array-based unstructured mesh library
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
FileTokenizer.hpp
Go to the documentation of this file.
1 /** 2  * MOAB, a Mesh-Oriented datABase, is a software component for creating, 3  * storing and accessing finite element mesh data. 4  * 5  * Copyright 2004 Sandia Corporation. Under the terms of Contract 6  * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government 7  * retains certain rights in this software. 8  * 9  * This library is free software; you can redistribute it and/or 10  * modify it under the terms of the GNU Lesser General Public 11  * License as published by the Free Software Foundation; either 12  * version 2.1 of the License, or (at your option) any later version. 13  * 14  */ 15  16 #ifndef FILE_TOKENIZER_HPP 17 #define FILE_TOKENIZER_HPP 18  19 #include "moab/Types.hpp" 20 #include <cstdio> 21 #include <sys/types.h> 22  23 namespace moab 24 { 25  26 class ReadUtilIface; 27  28 /** 29  * \brief Parse a file as space-separated tokens 30  * \author Jason Kraftcheck 31  * \date 30 Sept 2004 32  * 33  * Read a file, separating it into space-separated tokens. 34  * This is provided in place of using the standard C or C++ 35  * file parsing routines because it counts lines, which is 36  * useful for error reporting. Also provides some useful 37  * utility methods for parsing VTK files (which is the 38  * intended use of this implementation.) 39  * 40  * Uses raw reads/writes, implementing internal buffering. 41  * Token size may not exceed buffer size. 42  */ 43  44 class FileTokenizer 45 { 46  public: 47  /** \brief constructor 48  * 49  * \param file_ptr The file to read from. 50  * \param read_util_ptr Pointer to ReadUtilIface to use for 51  * reporting errors. 52  */ 53  FileTokenizer( std::FILE* file_ptr, ReadUtilIface* read_util_ptr ); 54  55  /** \brief destructor : closes file. 56  * 57  * The destructor closes the passed file handle. This 58  * is done as a convenience feature. If the caller 59  * creates an instance of this object on the stack, the 60  * file will automatically be closed when the caller 61  * returns. 62  */ 63  ~FileTokenizer(); 64  65  /** \brief get next token 66  * 67  * Get the next whitespace-delimited token from the file. 68  * NOTE: The returned string is only valid until the next 69  * call to any of the functions in this class that 70  * read from the file. 71  * 72  * \return A pointer to the buffer space containing the string, 73  * or NULL if an error occurred. 74  */ 75  const char* get_string(); 76  77  /** \brief check for newline 78  * 79  * Consume whitespace up to and including the next newline. 80  * If a non-space character is found before a newline, 81  * the function will stop, set the error message, and 82  * return false. 83  * 84  * \return True if a newline was found before any non-space 85  * character. False otherwise. 86  */ 87  bool get_newline( bool report_error = true ); 88  89  /** \brief Parse a sequence of double values. 90  * 91  * Read the specified number of space-delimited doubles. 92  * 93  * \param count The number of values to read. 94  * \param array The memory at which to store the values. 95  * \return true if successful, false otherwise. 96  */ 97  bool get_doubles( size_t count, double* array ); 98  99  /** \brief Parse a sequence of float values. 100  * 101  * Read the specified number of space-delimited doubles. 102  * 103  * \param count The number of values to read. 104  * \param array The memory at which to store the values. 105  * \return true if successful, false otherwise. 106  */ 107  bool get_floats( size_t count, float* array ); 108  109  /** \brief Parse a sequence of integer values. 110  * 111  * Read the specified number of space-delimited ints. 112  * 113  * \param count The number of values to read. 114  * \param array The memory at which to store the values. 115  * \return true if successful, false otherwise. 116  */ 117  bool get_integers( size_t count, int* array ); 118  119  /** \brief Parse a sequence of integer values. 120  * 121  * Read the specified number of space-delimited ints. 122  * 123  * \param count The number of values to read. 124  * \param array The memory at which to store the values. 125  * \return true if successful, false otherwise. 126  */ 127  bool get_long_ints( size_t count, long* array ); 128  129  /** \brief Parse a sequence of integer values. 130  * 131  * Read the specified number of space-delimited ints. 132  * 133  * \param count The number of values to read. 134  * \param array The memory at which to store the values. 135  * \return true if successful, false otherwise. 136  */ 137  bool get_short_ints( size_t count, short* array ); 138  139  /** \brief Parse a sequence of integer values. 140  * 141  * Read the specified number of space-delimited ints. 142  * 143  * \param count The number of values to read. 144  * \param array The memory at which to store the values. 145  * \return true if successful, false otherwise. 146  */ 147  bool get_bytes( size_t count, unsigned char* array ); 148  149  /** \brief Read binary data (interleaved with ASCII) 150  * 151  * Read a block of binary data. 152  *\param bytes Number of bytes to read 153  *\param mem Memory address at which to store data. 154  */ 155  bool get_binary( size_t bytes, void* mem ); 156  157  /** \brief Parse a sequence of bit or boolean values. 158  * 159  * Read the specified number of space-delimited values. 160  * 161  * \param count The number of values to read. 162  * \param array The memory at which to store the values. 163  * \return true if successful, false otherwise. 164  */ 165  bool get_booleans( size_t count, bool* array ); 166  167  /** 168  * Check for end-of-file condition. 169  */ 170  bool eof() const; 171  172  /** 173  * Get the line number the last token was read from. 174  */ 175  int line_number() const 176  { 177  return lineNumber; 178  } 179  180  /** 181  * Put current token back in buffer. Can only unget one token. 182  */ 183  void unget_token(); 184  185  /** 186  * Match current token to passed string. If token 187  * doesn't match, set error message. 188  */ 189  bool match_token( const char* string, bool print_error = true ); 190  191  /** 192  * Match the current token to one of an array of strings. 193  * Sets the error message if the current token doesn't 194  * match any of the input strings. 195  * 196  * \param string_list A NULL-terminated array of strings. 197  * \return One greater than the index of the matched 198  * string, or zero if no match. 199  */ 200  int match_token( const char* const* string_list, bool print_error = true ); 201  202  private: 203  /** Internal implementation of \ref get_doubles */ 204  bool get_double_internal( double& result ); 205  /** Internal implementation of \ref get_long_ints */ 206  bool get_long_int_internal( long& result ); 207  /** Internal implementation of \ref get_Booleans */ 208  bool get_boolean_internal( bool& result ); 209  210  /** Internal implementation of \ref get_floats */ 211  bool get_float_internal( float& result ); 212  /** Internal implementation of \ref get_integers */ 213  bool get_integer_internal( int& result ); 214  /** Internal implementation of \ref get_short_ints */ 215  bool get_short_int_internal( short& result ); 216  /** Internal implementation of \ref get_bytes */ 217  bool get_byte_internal( unsigned char& result ); 218  219  /** Pointer to standard C FILE struct */ 220  std::FILE* filePtr; 221  222  /** Input buffer */ 223  char buffer[512]; 224  225  /** One past the end of the last token returned */ 226  char* nextToken; 227  /** One past the last used byte of the buffer */ 228  char* bufferEnd; 229  230  /** Line number of last returned token */ 231  int lineNumber; 232  233  /** The whitespace character marking the end of the 234  * last returned token. Saved here because if it 235  * is a newline, the line count will need to be 236  * incremented when the next token is returned. 237  */ 238  char lastChar; 239 }; 240  241 } // namespace moab 242  243 #endif