Branch data Line data Source code
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 : 1 : int line_number() const
176 : : {
177 : 1 : 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
|