UNIVERS  15.3
UNIVERS base processing software API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
textfile_parser.hpp
1 /* textfile_parser.hpp */
2 /* $Id: textfile_parser.hpp,v 1.4 2008/09/29 14:54:02 sad Exp $ */
3 #ifndef COMMON_TEXTFILEPARSER_HPP
4 #define COMMON_TEXTFILEPARSER_HPP
5 
6 
7 #include <string>
8 #include <map>
9 #include <ios>
10 #include <stdexcept>
11 #include <limits>
12 #include <cerrno>
13 #include <string.h>
14 #include <stdlib.h>
15 
16 
17 
19 class param_exception : public std::exception {
20 public:
21  param_exception(const char* err_message) : message(err_message) {};
22  virtual const char* what() const throw() { return message.c_str(); };
23  virtual ~param_exception() throw() {};
24 private:
25  std::string message;
26 };
27 
28 
29 
30 
31 
32 
33 
34 class Parameter;
35 
38 public:
39 
40  TextFileParser() : m_delimeters(new char[3]) { strcpy(m_delimeters, " \t"); };
41 
42 
44  void set_delimeters(const char* delims);
45 
46 
49  virtual void register_parameter(Parameter* p);
50 
51 
57  virtual void parse(const char* fname) throw(param_exception, std::ios_base::failure, std::length_error);
58 
59  const char* delims() const { return m_delimeters; };
60 
61 
62  virtual ~TextFileParser() { delete[] m_delimeters; };
63 
64 private:
65  char* m_delimeters;
66  std::map<std::string, Parameter*> parameters; // map of string names of parameters and parameters themselves
67 };
68 
69 
70 
71 
72 
73 
74 
75 
76 
77 //-------------------------------------------------------------------------
90 class Parameter {
91  friend class TextFileParser;
92 public:
93 
95  virtual void set_value(const char*) throw(param_exception) = 0;
96 
98  const std::string& get_name() const { return param_name; };
99 
103  bool is_inited() const { return is_init; };
104 
107  bool is_unique() const { return is_uniq; };
108 
109 
110  virtual ~Parameter() {};
111 protected:
112 
114  Parameter(const char* name ,
115  bool unique=true );
116 
117  bool is_init; // This flag shows that paramater is inted already (It sets to true automatically by TextFileParser.).
118  bool is_uniq; // This flag shows , that parameter must be unique;
119 
120  const TextFileParser* parser; // Pointer to parser for backward connection.
121 
122 private:
123  std::string param_name;
124 };
125 
126 
127 
128 
129 
131 class Int_Parameter : public Parameter
132 {
133 public:
134 
136  Int_Parameter(const char* name) : Parameter(name) {};
137 
138 
145  void set_value(const char* strint) throw(param_exception)
146  {
147  char* end;
148  long lint = strtol(strint, &end, 10);
149  value = static_cast<int>(lint);
150  if (end && strlen(end) != 0)
151  if (*end == ' ')
152  throw param_exception("Unexpected token after int value");
153  else
154  throw param_exception("Can't parse int value for this parameter.");
155  else {
156  if (std::numeric_limits<int>::max() < lint) errno = ERANGE;
157  if (errno == ERANGE)
158  throw param_exception("Specified value is out of range for this parameter. (int type overflow).");
159  }
160  };
161 
162 
163  int get_value() const { return value; };
164 
165 protected:
166  int value;
167 };
168 
169 
170 
171 
172 
173 
175 {
176 public:
177  UnsignedInt_Parameter(const char* str) :
178  Int_Parameter(str)
179  {}
180 
181  void set_value(const char* str) throw(param_exception) {
183  if (value <= 0)
184  throw param_exception("Value must be more than zero.");
185  }
186 };
187 
188 
189 
190 
191 
192 
194 {
195 public:
196  Double_Parameter(const char* name) : Parameter(name) {};
197 
198  void set_value(const char* double_val) throw(param_exception);
199 
200  double get_value() const {
201  return value;
202  };
203 
204 protected:
205  double value;
206 };
207 
208 
209 
210 
211 
213 {
214 public:
215  UnsignedDouble_Parameter(const char* name) :
216  Double_Parameter(name)
217  {}
218 
219  void set_value(const char* str) throw(param_exception) {
221  if (value <= 0.0)
222  throw param_exception("This parameter must be > 0.0");
223  }
224 };
225 
226 
227 
228 
229 
230 
231 
233 {
234 public:
235  CharString_Parameter(const char* name) : Parameter(name) {};
236  void set_value(const char* name) throw(param_exception);
237  const char* get_value() const { return value.c_str(); };
238 protected:
239  std::string value;
240 };
241 
242 
243 
244 
245 
247 {
248 public:
249  CharUndelimString_Parameter(const char* name) : CharString_Parameter(name) {};
250  void set_value(const char* name) throw(param_exception);
251 };
252 
253 
254 
255 
256 
257 
258 
259 
260 
261 
262 
263 
264 
265 #endif // COMMON_TEXTFILEPARSER_HPP
266 
267 
268 
269 
Definition: textfile_parser.hpp:131
Int_Parameter(const char *name)
Definition: textfile_parser.hpp:136
void set_value(const char *name)
Definition: textfile_parser.hpp:193
Definition: textfile_parser.hpp:246
bool is_inited() const
Definition: textfile_parser.hpp:103
Definition: textfile_parser.hpp:19
Definition: textfile_parser.hpp:37
void set_value(const char *str)
Definition: textfile_parser.hpp:181
void set_value(const char *str)
Definition: textfile_parser.hpp:219
Definition: textfile_parser.hpp:174
const std::string & get_name() const
Definition: textfile_parser.hpp:98
Definition: textfile_parser.hpp:212
Definition: textfile_parser.hpp:90
void set_value(const char *name)
Definition: textfile_parser.hpp:232
virtual void register_parameter(Parameter *p)
virtual void set_value(const char *)=0
void set_value(const char *double_val)
void set_value(const char *strint)
Definition: textfile_parser.hpp:145
Parameter(const char *name, bool unique=true)
void set_delimeters(const char *delims)
bool is_unique() const
Definition: textfile_parser.hpp:107
virtual void parse(const char *fname)