| OLD | NEW |
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/json_reader.h" | 5 #include "base/json_reader.h" |
| 6 | 6 |
| 7 #include "base/float_util.h" | 7 #include "base/float_util.h" |
| 8 #include "base/logging.h" | 8 #include "base/logging.h" |
| 9 #include "base/string_util.h" | 9 #include "base/string_util.h" |
| 10 #include "base/values.h" | 10 #include "base/values.h" |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 129 } | 129 } |
| 130 | 130 |
| 131 // The conversion from UTF8 to wstring removes null bytes for us | 131 // The conversion from UTF8 to wstring removes null bytes for us |
| 132 // (a good thing). | 132 // (a good thing). |
| 133 std::wstring json_wide(UTF8ToWide(json)); | 133 std::wstring json_wide(UTF8ToWide(json)); |
| 134 start_pos_ = json_wide.c_str(); | 134 start_pos_ = json_wide.c_str(); |
| 135 | 135 |
| 136 // When the input JSON string starts with a UTF-8 Byte-Order-Mark | 136 // When the input JSON string starts with a UTF-8 Byte-Order-Mark |
| 137 // (0xEF, 0xBB, 0xBF), the UTF8ToWide() function converts it to a Unicode | 137 // (0xEF, 0xBB, 0xBF), the UTF8ToWide() function converts it to a Unicode |
| 138 // BOM (U+FEFF). To avoid the JSONReader::BuildValue() function from | 138 // BOM (U+FEFF). To avoid the JSONReader::BuildValue() function from |
| 139 // mis-treating a Unicode BOM as an invalid character and returning false, | 139 // mis-treating a Unicode BOM as an invalid character and returning NULL, |
| 140 // skip a converted Unicode BOM if it exists. | 140 // skip a converted Unicode BOM if it exists. |
| 141 if (!json_wide.empty() && start_pos_[0] == 0xFEFF) { | 141 if (!json_wide.empty() && start_pos_[0] == 0xFEFF) { |
| 142 ++start_pos_; | 142 ++start_pos_; |
| 143 } | 143 } |
| 144 | 144 |
| 145 json_pos_ = start_pos_; | 145 json_pos_ = start_pos_; |
| 146 allow_trailing_comma_ = allow_trailing_comma; | 146 allow_trailing_comma_ = allow_trailing_comma; |
| 147 stack_depth_ = 0; | 147 stack_depth_ = 0; |
| 148 error_message_.clear(); | 148 error_message_.clear(); |
| 149 | 149 |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 210 break; | 210 break; |
| 211 | 211 |
| 212 case Token::ARRAY_BEGIN: | 212 case Token::ARRAY_BEGIN: |
| 213 { | 213 { |
| 214 json_pos_ += token.length; | 214 json_pos_ += token.length; |
| 215 token = ParseToken(); | 215 token = ParseToken(); |
| 216 | 216 |
| 217 node.reset(new ListValue()); | 217 node.reset(new ListValue()); |
| 218 while (token.type != Token::ARRAY_END) { | 218 while (token.type != Token::ARRAY_END) { |
| 219 Value* array_node = BuildValue(false); | 219 Value* array_node = BuildValue(false); |
| 220 if (!array_node) { | 220 if (!array_node) |
| 221 return NULL; | 221 return NULL; |
| 222 } | |
| 223 static_cast<ListValue*>(node.get())->Append(array_node); | 222 static_cast<ListValue*>(node.get())->Append(array_node); |
| 224 | 223 |
| 225 // After a list value, we expect a comma or the end of the list. | 224 // After a list value, we expect a comma or the end of the list. |
| 226 token = ParseToken(); | 225 token = ParseToken(); |
| 227 if (token.type == Token::LIST_SEPARATOR) { | 226 if (token.type == Token::LIST_SEPARATOR) { |
| 228 json_pos_ += token.length; | 227 json_pos_ += token.length; |
| 229 token = ParseToken(); | 228 token = ParseToken(); |
| 230 // Trailing commas are invalid according to the JSON RFC, but some | 229 // Trailing commas are invalid according to the JSON RFC, but some |
| 231 // consumers need the parsing leniency, so handle accordingly. | 230 // consumers need the parsing leniency, so handle accordingly. |
| 232 if (token.type == Token::ARRAY_END) { | 231 if (token.type == Token::ARRAY_END) { |
| (...skipping 398 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 631 if (*pos == '\n') { | 630 if (*pos == '\n') { |
| 632 ++line_number; | 631 ++line_number; |
| 633 column_number = 1; | 632 column_number = 1; |
| 634 } else { | 633 } else { |
| 635 ++column_number; | 634 ++column_number; |
| 636 } | 635 } |
| 637 } | 636 } |
| 638 | 637 |
| 639 error_message_ = FormatErrorMessage(line_number, column_number, description); | 638 error_message_ = FormatErrorMessage(line_number, column_number, description); |
| 640 } | 639 } |
| OLD | NEW |