12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- // Copyright 2014 The Chromium Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- #include "chrome/common/ini_parser.h"
- #include <stddef.h>
- #include "base/check.h"
- #include "base/strings/strcat.h"
- #include "base/strings/string_tokenizer.h"
- INIParser::INIParser() : used_(false) {}
- INIParser::~INIParser() {}
- void INIParser::Parse(const std::string& content) {
- DCHECK(!used_);
- used_ = true;
- base::StringTokenizer tokenizer(content, "\r\n");
- base::StringPiece current_section;
- while (tokenizer.GetNext()) {
- base::StringPiece line = tokenizer.token_piece();
- if (line.empty()) {
- // Skips the empty line.
- continue;
- }
- if (line[0] == '#' || line[0] == ';') {
- // This line is a comment.
- continue;
- }
- if (line[0] == '[') {
- // It is a section header.
- current_section = line.substr(1);
- size_t end = current_section.rfind(']');
- if (end != std::string::npos)
- current_section = current_section.substr(0, end);
- } else {
- base::StringPiece key, value;
- size_t equal = line.find('=');
- if (equal != std::string::npos) {
- key = line.substr(0, equal);
- value = line.substr(equal + 1);
- HandleTriplet(current_section, key, value);
- }
- }
- }
- }
- DictionaryValueINIParser::DictionaryValueINIParser() {}
- DictionaryValueINIParser::~DictionaryValueINIParser() {}
- void DictionaryValueINIParser::HandleTriplet(base::StringPiece section,
- base::StringPiece key,
- base::StringPiece value) {
- // Checks whether the section and key contain a '.' character.
- // Those sections and keys break DictionaryValue's path format when not
- // using the *WithoutPathExpansion methods.
- if (section.find('.') == std::string::npos &&
- key.find('.') == std::string::npos)
- root_.SetString(base::StrCat({section, ".", key}), value);
- }
|