00001 #ifndef COLVARPARSE_H
00002 #define COLVARPARSE_H
00003
00004 #include <cstring>
00005 #include <string>
00006
00007 #include "colvarmodule.h"
00008 #include "colvarvalue.h"
00009
00010
00012
00013
00016 class colvarparse {
00017
00018 protected:
00019
00023 std::list<std::string> allowed_keywords;
00024
00028 std::list<size_t> data_begin_pos;
00029
00033 std::list<size_t> data_end_pos;
00034
00041 bool save_delimiters;
00042
00044 void add_keyword (char const *key);
00045
00047 void strip_values (std::string &conf);
00048
00049 public:
00050
00051 inline colvarparse()
00052 : save_delimiters (true)
00053 {}
00054
00056 enum Parse_Mode {
00060 parse_normal,
00064 parse_silent
00065 };
00066
00091
00092 #define _get_keyval_scalar_proto_(_type_,_def_value_) \
00093 bool get_keyval (std::string const &conf, \
00094 char const *key, \
00095 _type_ &value, \
00096 _type_ const &def_value = _def_value_, \
00097 Parse_Mode const parse_mode = parse_normal)
00098
00099 _get_keyval_scalar_proto_ (int, (int)0);
00100 _get_keyval_scalar_proto_ (size_t, (size_t)0);
00101 _get_keyval_scalar_proto_ (std::string, std::string (""));
00102 _get_keyval_scalar_proto_ (cvm::real, (cvm::real)0.0);
00103 _get_keyval_scalar_proto_ (cvm::rvector, cvm::rvector());
00104 _get_keyval_scalar_proto_ (cvm::quaternion, cvm::quaternion());
00105 _get_keyval_scalar_proto_ (colvarvalue, colvarvalue (colvarvalue::type_notset));
00106 _get_keyval_scalar_proto_ (bool, false);
00107
00108 #define _get_keyval_vector_proto_(_type_,_def_value_) \
00109 bool get_keyval (std::string const &conf, \
00110 char const *key, \
00111 std::vector<_type_> &values, \
00112 std::vector<_type_> const &def_values = \
00113 std::vector<_type_> (0, static_cast<_type_>(_def_value_)), \
00114 Parse_Mode const parse_mode = parse_normal)
00115
00116 _get_keyval_vector_proto_ (int, 0);
00117 _get_keyval_vector_proto_ (size_t, 0);
00118 _get_keyval_vector_proto_ (std::string, std::string (""));
00119 _get_keyval_vector_proto_ (cvm::real, 0.0);
00120 _get_keyval_vector_proto_ (cvm::rvector, cvm::rvector());
00121 _get_keyval_vector_proto_ (cvm::quaternion, cvm::quaternion());
00122 _get_keyval_vector_proto_ (colvarvalue, colvarvalue (colvarvalue::type_notset));
00123
00124
00128 void check_keywords (std::string &conf, char const *key);
00129
00130
00132 static inline std::string to_lower_cppstr (std::string const &in)
00133 {
00134 std::string out = "";
00135 for (size_t i = 0; i < in.size(); i++) {
00136 out.append (1, (char) ::tolower (in[i]) );
00137 }
00138 return out;
00139 }
00140
00148 class read_block {
00149
00150 std::string const key;
00151 std::string * const data;
00152
00153 public:
00154 inline read_block (std::string const &key_in, std::string &data_in)
00155 : key (key_in), data (&data_in)
00156 {}
00157 inline ~read_block() {}
00158 friend std::istream & operator >> (std::istream &is, read_block const &rb);
00159 };
00160
00161
00163 static std::string const white_space;
00164
00173 bool key_lookup (std::string const &conf,
00174 char const *key,
00175 std::string &data = dummy_string,
00176 size_t &save_pos = dummy_pos);
00177
00179 static std::string dummy_string;
00181 static size_t dummy_pos;
00182
00185 static std::istream & getline_nocomments (std::istream &is,
00186 std::string &s,
00187 char const delim = '\n');
00188
00190 bool brace_check (std::string const &conf,
00191 size_t const start_pos = 0);
00192
00193 };
00194
00195
00196 #endif
00197
00198
00199
00200
00201