30 const string &string_value,
int decl_seq) :
33 _string_value(string_value),
37 if (!_page->is_special()) {
38 _variable->add_declaration(
this);
46 ~ConfigDeclaration() {
48 _variable->remove_declaration(
this);
62 while (n >= _words.size()) {
68 _words[n]._str = value;
72 Words::const_iterator wi = _words.begin();
73 _string_value = (*wi)._str;
76 while (wi != _words.end()) {
78 _string_value += (*wi)._str;
92 _words[n]._flags |= (F_checked_bool | F_valid_bool);
93 _words[n]._bool = value;
105 _words[n]._flags |= (F_checked_int | F_valid_int);
106 _words[n]._int = value;
118 _words[n]._flags |= (F_checked_int64 | F_valid_int64);
119 _words[n]._int_64 = value;
131 _words[n]._flags |= (F_checked_double | F_valid_double);
132 _words[n]._double = value;
149 string str = _string_value;
152 if (str.find(
'$') != string::npos) {
174 void ConfigDeclaration::
175 output(std::ostream &out)
const {
182 void ConfigDeclaration::
183 write(std::ostream &out)
const {
192 void ConfigDeclaration::
198 _words.reserve(words.size());
200 for (vector_string::const_iterator wi = words.begin();
216 void ConfigDeclaration::
217 check_bool_word(
size_t n) {
222 if (n < _words.size()) {
223 Word &word = _words[n];
224 if ((word._flags & F_checked_bool) == 0) {
225 word._flags |= F_checked_bool;
231 }
else if (s ==
"#t" || s ==
"1" || s[0] ==
't') {
234 }
else if (s ==
"#f" || s ==
"0" || s[0] ==
'f') {
239 check_double_word(n);
240 if ((word._flags & F_checked_double) != 0) {
241 word._bool = (word._double != 0.0);
247 <<
"Invalid bool value for ConfigVariable "
248 <<
get_variable()->get_name() <<
": " << word._str <<
"\n";
252 word._flags |= F_valid_bool;
260 void ConfigDeclaration::
261 check_int_word(
size_t n) {
266 if (n < _words.size()) {
267 Word &word = _words[n];
268 if ((word._flags & F_checked_int) == 0) {
269 word._flags |= F_checked_int;
274 bool overflow =
false;
276 string::const_iterator pi = word._str.begin();
277 if (pi != word._str.end() && (*pi) ==
'-') {
280 while (pi != word._str.end() && isdigit(*pi)) {
281 int next = word._int * 10 - (int)((*pi) -
'0');
282 if ((
int)(next / 10) != word._int) {
292 while (pi != word._str.end() && isdigit(*pi)) {
293 int next = word._int * 10 + (int)((*pi) -
'0');
294 if ((
int)(next / 10) != word._int) {
303 if (pi == word._str.end() && !overflow) {
304 word._flags |= F_valid_int;
307 <<
"Invalid integer value for ConfigVariable "
308 <<
get_variable()->get_name() <<
": " << word._str <<
"\n";
317 void ConfigDeclaration::
318 check_int64_word(
size_t n) {
323 if (n < _words.size()) {
324 Word &word = _words[n];
325 if ((word._flags & F_checked_int64) == 0) {
326 word._flags |= F_checked_int64;
329 bool overflow =
false;
331 string::const_iterator pi = word._str.begin();
332 if (pi != word._str.end() && (*pi) ==
'-') {
335 while (pi != word._str.end() && isdigit(*pi)) {
336 int64_t next = word._int_64 * 10 - (int)((*pi) -
'0');
337 if ((int64_t)(next / 10) != word._int_64) {
347 while (pi != word._str.end() && isdigit(*pi)) {
348 int64_t next = word._int_64 * 10 + (int)((*pi) -
'0');
349 if ((int64_t)(next / 10) != word._int_64) {
358 if (pi == word._str.end() && !overflow) {
359 word._flags |= F_valid_int64;
362 <<
"Invalid int64 value for ConfigVariable "
363 <<
get_variable()->get_name() <<
": " << word._str <<
"\n";
372 void ConfigDeclaration::
373 check_double_word(
size_t n) {
378 if (n < _words.size()) {
379 Word &word = _words[n];
380 if ((word._flags & F_checked_double) == 0) {
381 word._flags |= F_checked_double;
383 const char *nptr = word._str.c_str();
385 word._double =
pstrtod(nptr, &endptr);
387 if (*endptr ==
'\0') {
388 word._flags |= F_valid_double;
391 <<
"Invalid floating-point value for ConfigVariable "
392 <<
get_variable()->get_name() <<
": " << word._str <<
"\n";
408 size_t num_words = 0;
411 while (pos < str.length() && isspace((
unsigned int)str[pos])) {
414 while (pos < str.length()) {
415 size_t word_start = pos;
416 while (pos < str.length() && !isspace((
unsigned int)str[pos])) {
419 words.push_back(str.substr(word_start, pos - word_start));
422 while (pos < str.length() && isspace((
unsigned int)str[pos])) {
436 result.reserve(s.size());
437 string::const_iterator p;
438 for (p = s.begin(); p != s.end(); ++p) {
439 result += (char)tolower(*p);