Mercurial > code
comparison C++/Ini.cpp @ 326:fb6c42173634
Ini:
- Add support for empty values
- Add tests about multi definition
author | David Demelier <markand@malikania.fr> |
---|---|
date | Tue, 03 Mar 2015 19:43:23 +0100 |
parents | d52a69f9f029 |
children | 78e8f9a3b233 |
comparison
equal
deleted
inserted
replaced
325:d52a69f9f029 | 326:fb6c42173634 |
---|---|
24 #include <sstream> | 24 #include <sstream> |
25 #include <vector> | 25 #include <vector> |
26 | 26 |
27 #include "Ini.h" | 27 #include "Ini.h" |
28 | 28 |
29 namespace { | |
30 | |
29 /* -------------------------------------------------------- | 31 /* -------------------------------------------------------- |
30 * Tokens | 32 * Tokens |
31 * -------------------------------------------------------- */ | 33 * -------------------------------------------------------- */ |
32 | 34 |
33 enum class TokenType { | 35 enum class TokenType { |
133 return "\""; | 135 return "\""; |
134 case TokenType::NewLine: | 136 case TokenType::NewLine: |
135 return "\n"; | 137 return "\n"; |
136 case TokenType::Assign: | 138 case TokenType::Assign: |
137 return "="; | 139 return "="; |
140 case TokenType::Include: | |
141 return "@"; | |
138 case TokenType::Space: | 142 case TokenType::Space: |
139 return m_value; | 143 return m_value; |
140 case TokenType::Word: | 144 case TokenType::Word: |
141 return m_value; | 145 return m_value; |
142 default: | 146 default: |
161 return "\""; | 165 return "\""; |
162 case TokenType::NewLine: | 166 case TokenType::NewLine: |
163 return "<newline>"; | 167 return "<newline>"; |
164 case TokenType::Assign: | 168 case TokenType::Assign: |
165 return "="; | 169 return "="; |
170 case TokenType::Include: | |
171 return "@"; | |
166 case TokenType::Space: | 172 case TokenType::Space: |
167 return "<blank>"; | 173 return "<blank>"; |
168 case TokenType::Word: | 174 case TokenType::Word: |
169 return "`" + m_value + "'"; | 175 return "`" + m_value + "'"; |
170 default: | 176 default: |
347 throw Error(*it, "expected '=' after option declaration, got " + it->toString()); | 353 throw Error(*it, "expected '=' after option declaration, got " + it->toString()); |
348 } | 354 } |
349 | 355 |
350 readSpace(it, end); | 356 readSpace(it, end); |
351 | 357 |
352 if (it == end) { | |
353 throw Error(*it, "expected option value after '=', got <EOF>"); | |
354 } | |
355 | |
356 readSpace(it, end); | |
357 | |
358 std::ostringstream oss; | 358 std::ostringstream oss; |
359 | 359 |
360 if (it->type() == TokenType::QuoteSimple || it->type() == TokenType::QuoteDouble) { | 360 if (it->type() == TokenType::QuoteSimple || it->type() == TokenType::QuoteDouble) { |
361 TokenStack::iterator save = it++; | 361 TokenStack::iterator save = it++; |
362 | 362 |
368 throw Error(*save, "undisclosed quote: " + save->toString() + " expected"); | 368 throw Error(*save, "undisclosed quote: " + save->toString() + " expected"); |
369 | 369 |
370 ++ it; | 370 ++ it; |
371 } else if (it->type() == TokenType::Word) { | 371 } else if (it->type() == TokenType::Word) { |
372 oss << it++->value(); | 372 oss << it++->value(); |
373 } else { | 373 } else if (it->type() != TokenType::NewLine && it->type() != TokenType::Comment) { |
374 // No value requested, must be NewLine or comment | |
374 throw Error(*it, "expected option value after '=', got " + it->toString()); | 375 throw Error(*it, "expected option value after '=', got " + it->toString()); |
375 } | 376 } |
377 | |
376 | 378 |
377 return IniOption(std::move(key), oss.str()); | 379 return IniOption(std::move(key), oss.str()); |
378 } | 380 } |
379 | 381 |
380 public: | 382 public: |
402 std::cerr << ex.line() << ":" << ex.offset() << ":" << ex.what() << std::endl; | 404 std::cerr << ex.line() << ":" << ex.offset() << ":" << ex.what() << std::endl; |
403 } | 405 } |
404 } | 406 } |
405 }; | 407 }; |
406 | 408 |
409 } // !namespace | |
410 | |
407 /* -------------------------------------------------------- | 411 /* -------------------------------------------------------- |
408 * Ini | 412 * Ini |
409 * -------------------------------------------------------- */ | 413 * -------------------------------------------------------- */ |
410 | 414 |
411 Ini::Ini(std::istream &stream) | 415 Ini::Ini(std::istream &stream) |