Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
00001 /** 00002 * MOAB, a Mesh-Oriented datABase, is a software component for creating, 00003 * storing and accessing finite element mesh data. 00004 * 00005 * Copyright 2004 Sandia Corporation. Under the terms of Contract 00006 * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government 00007 * retains certain rights in this software. 00008 * 00009 * This library is free software; you can redistribute it and/or 00010 * modify it under the terms of the GNU Lesser General Public 00011 * License as published by the Free Software Foundation; either 00012 * version 2.1 of the License, or (at your option) any later version. 00013 * 00014 */ 00015 00016 #ifndef FILE_TOKENIZER_HPP 00017 #define FILE_TOKENIZER_HPP 00018 00019 #include "moab/Types.hpp" 00020 #include <cstdio> 00021 #include <sys/types.h> 00022 00023 namespace moab 00024 { 00025 00026 class ReadUtilIface; 00027 00028 /** 00029 * \brief Parse a file as space-separated tokens 00030 * \author Jason Kraftcheck 00031 * \date 30 Sept 2004 00032 * 00033 * Read a file, separating it into space-separated tokens. 00034 * This is provided in place of using the standard C or C++ 00035 * file parsing routines because it counts lines, which is 00036 * useful for error reporting. Also provides some useful 00037 * utility methods for parsing VTK files (which is the 00038 * intended use of this implementation.) 00039 * 00040 * Uses raw reads/writes, implementing internal buffering. 00041 * Token size may not exceed buffer size. 00042 */ 00043 00044 class FileTokenizer 00045 { 00046 public: 00047 /** \brief constructor 00048 * 00049 * \param file_ptr The file to read from. 00050 * \param read_util_ptr Pointer to ReadUtilIface to use for 00051 * reporting errors. 00052 */ 00053 FileTokenizer( std::FILE* file_ptr, ReadUtilIface* read_util_ptr ); 00054 00055 /** \brief destructor : closes file. 00056 * 00057 * The destructor closes the passed file handle. This 00058 * is done as a convenience feature. If the caller 00059 * creates an instance of this object on the stack, the 00060 * file will automatically be closed when the caller 00061 * returns. 00062 */ 00063 ~FileTokenizer(); 00064 00065 /** \brief get next token 00066 * 00067 * Get the next whitespace-delimited token from the file. 00068 * NOTE: The returned string is only valid until the next 00069 * call to any of the functions in this class that 00070 * read from the file. 00071 * 00072 * \return A pointer to the buffer space containing the string, 00073 * or NULL if an error occurred. 00074 */ 00075 const char* get_string(); 00076 00077 /** \brief check for newline 00078 * 00079 * Consume whitespace up to and including the next newline. 00080 * If a non-space character is found before a newline, 00081 * the function will stop, set the error message, and 00082 * return false. 00083 * 00084 * \return True if a newline was found before any non-space 00085 * character. False otherwise. 00086 */ 00087 bool get_newline( bool report_error = true ); 00088 00089 /** \brief Parse a sequence of double values. 00090 * 00091 * Read the specified number of space-delimited doubles. 00092 * 00093 * \param count The number of values to read. 00094 * \param array The memory at which to store the values. 00095 * \return true if successful, false otherwise. 00096 */ 00097 bool get_doubles( size_t count, double* array ); 00098 00099 /** \brief Parse a sequence of float values. 00100 * 00101 * Read the specified number of space-delimited doubles. 00102 * 00103 * \param count The number of values to read. 00104 * \param array The memory at which to store the values. 00105 * \return true if successful, false otherwise. 00106 */ 00107 bool get_floats( size_t count, float* array ); 00108 00109 /** \brief Parse a sequence of integer values. 00110 * 00111 * Read the specified number of space-delimited ints. 00112 * 00113 * \param count The number of values to read. 00114 * \param array The memory at which to store the values. 00115 * \return true if successful, false otherwise. 00116 */ 00117 bool get_integers( size_t count, int* array ); 00118 00119 /** \brief Parse a sequence of integer values. 00120 * 00121 * Read the specified number of space-delimited ints. 00122 * 00123 * \param count The number of values to read. 00124 * \param array The memory at which to store the values. 00125 * \return true if successful, false otherwise. 00126 */ 00127 bool get_long_ints( size_t count, long* array ); 00128 00129 /** \brief Parse a sequence of integer values. 00130 * 00131 * Read the specified number of space-delimited ints. 00132 * 00133 * \param count The number of values to read. 00134 * \param array The memory at which to store the values. 00135 * \return true if successful, false otherwise. 00136 */ 00137 bool get_short_ints( size_t count, short* array ); 00138 00139 /** \brief Parse a sequence of integer values. 00140 * 00141 * Read the specified number of space-delimited ints. 00142 * 00143 * \param count The number of values to read. 00144 * \param array The memory at which to store the values. 00145 * \return true if successful, false otherwise. 00146 */ 00147 bool get_bytes( size_t count, unsigned char* array ); 00148 00149 /** \brief Read binary data (interleaved with ASCII) 00150 * 00151 * Read a block of binary data. 00152 *\param bytes Number of bytes to read 00153 *\param mem Memory address at which to store data. 00154 */ 00155 bool get_binary( size_t bytes, void* mem ); 00156 00157 /** \brief Parse a sequence of bit or boolean values. 00158 * 00159 * Read the specified number of space-delimited values. 00160 * 00161 * \param count The number of values to read. 00162 * \param array The memory at which to store the values. 00163 * \return true if successful, false otherwise. 00164 */ 00165 bool get_booleans( size_t count, bool* array ); 00166 00167 /** 00168 * Check for end-of-file condition. 00169 */ 00170 bool eof() const; 00171 00172 /** 00173 * Get the line number the last token was read from. 00174 */ 00175 int line_number() const 00176 { 00177 return lineNumber; 00178 } 00179 00180 /** 00181 * Put current token back in buffer. Can only unget one token. 00182 */ 00183 void unget_token(); 00184 00185 /** 00186 * Match current token to passed string. If token 00187 * doesn't match, set error message. 00188 */ 00189 bool match_token( const char* string, bool print_error = true ); 00190 00191 /** 00192 * Match the current token to one of an array of strings. 00193 * Sets the error message if the current token doesn't 00194 * match any of the input strings. 00195 * 00196 * \param string_list A NULL-terminated array of strings. 00197 * \return One greater than the index of the matched 00198 * string, or zero if no match. 00199 */ 00200 int match_token( const char* const* string_list, bool print_error = true ); 00201 00202 private: 00203 /** Internal implementation of \ref get_doubles */ 00204 bool get_double_internal( double& result ); 00205 /** Internal implementation of \ref get_long_ints */ 00206 bool get_long_int_internal( long& result ); 00207 /** Internal implementation of \ref get_Booleans */ 00208 bool get_boolean_internal( bool& result ); 00209 00210 /** Internal implementation of \ref get_floats */ 00211 bool get_float_internal( float& result ); 00212 /** Internal implementation of \ref get_integers */ 00213 bool get_integer_internal( int& result ); 00214 /** Internal implementation of \ref get_short_ints */ 00215 bool get_short_int_internal( short& result ); 00216 /** Internal implementation of \ref get_bytes */ 00217 bool get_byte_internal( unsigned char& result ); 00218 00219 /** Pointer to standard C FILE struct */ 00220 std::FILE* filePtr; 00221 00222 /** Input buffer */ 00223 char buffer[512]; 00224 00225 /** One past the end of the last token returned */ 00226 char* nextToken; 00227 /** One past the last used byte of the buffer */ 00228 char* bufferEnd; 00229 00230 /** Line number of last returned token */ 00231 int lineNumber; 00232 00233 /** The whitespace character marking the end of the 00234 * last returned token. Saved here because if it 00235 * is a newline, the line count will need to be 00236 * incremented when the next token is returned. 00237 */ 00238 char lastChar; 00239 }; 00240 00241 } // namespace moab 00242 00243 #endif