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)