Index: mojo/public/cpp/bindings/tests/validation_test_input_parser.cc |
diff --git a/mojo/public/cpp/bindings/tests/validation_test_input_parser.cc b/mojo/public/cpp/bindings/tests/validation_test_input_parser.cc |
deleted file mode 100644 |
index 9d2607d0ad4b074fbe543c4d84dcc2d4a769d5b7..0000000000000000000000000000000000000000 |
--- a/mojo/public/cpp/bindings/tests/validation_test_input_parser.cc |
+++ /dev/null |
@@ -1,410 +0,0 @@ |
-// 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 "mojo/public/cpp/bindings/tests/validation_test_input_parser.h" |
- |
-#include <assert.h> |
-#include <stdio.h> |
-#include <string.h> |
- |
-#include <limits> |
-#include <map> |
-#include <set> |
-#include <utility> |
- |
-#include "mojo/public/c/system/macros.h" |
- |
-namespace mojo { |
-namespace test { |
-namespace { |
- |
-class ValidationTestInputParser { |
- public: |
- ValidationTestInputParser(const std::string& input, |
- std::vector<uint8_t>* data, |
- size_t* num_handles, |
- std::string* error_message); |
- ~ValidationTestInputParser(); |
- |
- bool Run(); |
- |
- private: |
- struct DataType; |
- |
- typedef std::pair<const char*, const char*> Range; |
- |
- typedef bool (ValidationTestInputParser::*ParseDataFunc)( |
- const DataType& type, |
- const std::string& value_string); |
- |
- struct DataType { |
- const char* name; |
- size_t name_size; |
- size_t data_size; |
- ParseDataFunc parse_data_func; |
- }; |
- |
- // A dist4/8 item that hasn't been matched with an anchr item. |
- struct PendingDistanceItem { |
- // Where this data item is located in |data_|. |
- size_t pos; |
- // Either 4 or 8 (bytes). |
- size_t data_size; |
- }; |
- |
- bool GetNextItem(Range* range); |
- |
- bool ParseItem(const Range& range); |
- |
- bool ParseUnsignedInteger(const DataType& type, |
- const std::string& value_string); |
- bool ParseSignedInteger(const DataType& type, |
- const std::string& value_string); |
- bool ParseFloat(const DataType& type, const std::string& value_string); |
- bool ParseDouble(const DataType& type, const std::string& value_string); |
- bool ParseBinarySequence(const DataType& type, |
- const std::string& value_string); |
- bool ParseDistance(const DataType& type, const std::string& value_string); |
- bool ParseAnchor(const DataType& type, const std::string& value_string); |
- bool ParseHandles(const DataType& type, const std::string& value_string); |
- |
- bool StartsWith(const Range& range, const char* prefix, size_t prefix_length); |
- |
- bool ConvertToUnsignedInteger(const std::string& value_string, |
- unsigned long long int* value); |
- |
- template <typename T> |
- void AppendData(T data) { |
- size_t pos = data_->size(); |
- data_->resize(pos + sizeof(T)); |
- memcpy(&(*data_)[pos], &data, sizeof(T)); |
- } |
- |
- template <typename TargetType, typename InputType> |
- bool ConvertAndAppendData(InputType value) { |
- if (value > std::numeric_limits<TargetType>::max() || |
- value < std::numeric_limits<TargetType>::min()) { |
- return false; |
- } |
- AppendData(static_cast<TargetType>(value)); |
- return true; |
- } |
- |
- template <typename TargetType, typename InputType> |
- bool ConvertAndFillData(size_t pos, InputType value) { |
- if (value > std::numeric_limits<TargetType>::max() || |
- value < std::numeric_limits<TargetType>::min()) { |
- return false; |
- } |
- TargetType target_value = static_cast<TargetType>(value); |
- assert(pos + sizeof(TargetType) <= data_->size()); |
- memcpy(&(*data_)[pos], &target_value, sizeof(TargetType)); |
- return true; |
- } |
- |
- static const DataType kDataTypes[]; |
- static const size_t kDataTypeCount; |
- |
- const std::string& input_; |
- size_t input_cursor_; |
- |
- std::vector<uint8_t>* data_; |
- size_t* num_handles_; |
- std::string* error_message_; |
- |
- std::map<std::string, PendingDistanceItem> pending_distance_items_; |
- std::set<std::string> anchors_; |
-}; |
- |
-#define DATA_TYPE(name, data_size, parse_data_func) \ |
- { name, sizeof(name) - 1, data_size, parse_data_func } |
- |
-const ValidationTestInputParser::DataType |
- ValidationTestInputParser::kDataTypes[] = { |
- DATA_TYPE("[u1]", 1, &ValidationTestInputParser::ParseUnsignedInteger), |
- DATA_TYPE("[u2]", 2, &ValidationTestInputParser::ParseUnsignedInteger), |
- DATA_TYPE("[u4]", 4, &ValidationTestInputParser::ParseUnsignedInteger), |
- DATA_TYPE("[u8]", 8, &ValidationTestInputParser::ParseUnsignedInteger), |
- DATA_TYPE("[s1]", 1, &ValidationTestInputParser::ParseSignedInteger), |
- DATA_TYPE("[s2]", 2, &ValidationTestInputParser::ParseSignedInteger), |
- DATA_TYPE("[s4]", 4, &ValidationTestInputParser::ParseSignedInteger), |
- DATA_TYPE("[s8]", 8, &ValidationTestInputParser::ParseSignedInteger), |
- DATA_TYPE("[b]", 1, &ValidationTestInputParser::ParseBinarySequence), |
- DATA_TYPE("[f]", 4, &ValidationTestInputParser::ParseFloat), |
- DATA_TYPE("[d]", 8, &ValidationTestInputParser::ParseDouble), |
- DATA_TYPE("[dist4]", 4, &ValidationTestInputParser::ParseDistance), |
- DATA_TYPE("[dist8]", 8, &ValidationTestInputParser::ParseDistance), |
- DATA_TYPE("[anchr]", 0, &ValidationTestInputParser::ParseAnchor), |
- DATA_TYPE("[handles]", 0, &ValidationTestInputParser::ParseHandles)}; |
- |
-const size_t ValidationTestInputParser::kDataTypeCount = |
- sizeof(ValidationTestInputParser::kDataTypes) / |
- sizeof(ValidationTestInputParser::kDataTypes[0]); |
- |
-ValidationTestInputParser::ValidationTestInputParser(const std::string& input, |
- std::vector<uint8_t>* data, |
- size_t* num_handles, |
- std::string* error_message) |
- : input_(input), |
- input_cursor_(0), |
- data_(data), |
- num_handles_(num_handles), |
- error_message_(error_message) { |
- assert(data_); |
- assert(num_handles_); |
- assert(error_message_); |
- data_->clear(); |
- *num_handles_ = 0; |
- error_message_->clear(); |
-} |
- |
-ValidationTestInputParser::~ValidationTestInputParser() { |
-} |
- |
-bool ValidationTestInputParser::Run() { |
- Range range; |
- bool result = true; |
- while (result && GetNextItem(&range)) |
- result = ParseItem(range); |
- |
- if (!result) { |
- *error_message_ = |
- "Error occurred when parsing " + std::string(range.first, range.second); |
- } else if (!pending_distance_items_.empty()) { |
- // We have parsed all the contents in |input_| successfully, but there are |
- // unmatched dist4/8 items. |
- *error_message_ = "Error occurred when matching [dist4/8] and [anchr]."; |
- result = false; |
- } |
- if (!result) { |
- data_->clear(); |
- *num_handles_ = 0; |
- } else { |
- assert(error_message_->empty()); |
- } |
- |
- return result; |
-} |
- |
-bool ValidationTestInputParser::GetNextItem(Range* range) { |
- const char kWhitespaceChars[] = " \t\n\r"; |
- const char kItemDelimiters[] = " \t\n\r/"; |
- const char kEndOfLineChars[] = "\n\r"; |
- while (true) { |
- // Skip leading whitespaces. |
- // If there are no non-whitespace characters left, |input_cursor_| will be |
- // set to std::npos. |
- input_cursor_ = input_.find_first_not_of(kWhitespaceChars, input_cursor_); |
- |
- if (input_cursor_ >= input_.size()) |
- return false; |
- |
- if (StartsWith( |
- Range(&input_[0] + input_cursor_, &input_[0] + input_.size()), |
- "//", |
- 2)) { |
- // Skip contents until the end of the line. |
- input_cursor_ = input_.find_first_of(kEndOfLineChars, input_cursor_); |
- } else { |
- range->first = &input_[0] + input_cursor_; |
- input_cursor_ = input_.find_first_of(kItemDelimiters, input_cursor_); |
- range->second = input_cursor_ >= input_.size() |
- ? &input_[0] + input_.size() |
- : &input_[0] + input_cursor_; |
- return true; |
- } |
- } |
- return false; |
-} |
- |
-bool ValidationTestInputParser::ParseItem(const Range& range) { |
- for (size_t i = 0; i < kDataTypeCount; ++i) { |
- if (StartsWith(range, kDataTypes[i].name, kDataTypes[i].name_size)) { |
- return (this->*kDataTypes[i].parse_data_func)( |
- kDataTypes[i], |
- std::string(range.first + kDataTypes[i].name_size, range.second)); |
- } |
- } |
- |
- // "[u1]" is optional. |
- return ParseUnsignedInteger(kDataTypes[0], |
- std::string(range.first, range.second)); |
-} |
- |
-bool ValidationTestInputParser::ParseUnsignedInteger( |
- const DataType& type, |
- const std::string& value_string) { |
- unsigned long long int value; |
- if (!ConvertToUnsignedInteger(value_string, &value)) |
- return false; |
- |
- switch (type.data_size) { |
- case 1: |
- return ConvertAndAppendData<uint8_t>(value); |
- case 2: |
- return ConvertAndAppendData<uint16_t>(value); |
- case 4: |
- return ConvertAndAppendData<uint32_t>(value); |
- case 8: |
- return ConvertAndAppendData<uint64_t>(value); |
- default: |
- assert(false); |
- return false; |
- } |
-} |
- |
-bool ValidationTestInputParser::ParseSignedInteger( |
- const DataType& type, |
- const std::string& value_string) { |
- long long int value; |
- if (sscanf(value_string.c_str(), "%lli", &value) != 1) |
- return false; |
- |
- switch (type.data_size) { |
- case 1: |
- return ConvertAndAppendData<int8_t>(value); |
- case 2: |
- return ConvertAndAppendData<int16_t>(value); |
- case 4: |
- return ConvertAndAppendData<int32_t>(value); |
- case 8: |
- return ConvertAndAppendData<int64_t>(value); |
- default: |
- assert(false); |
- return false; |
- } |
-} |
- |
-bool ValidationTestInputParser::ParseFloat(const DataType& type, |
- const std::string& value_string) { |
- static_assert(sizeof(float) == 4, "sizeof(float) is not 4"); |
- |
- float value; |
- if (sscanf(value_string.c_str(), "%f", &value) != 1) |
- return false; |
- |
- AppendData(value); |
- return true; |
-} |
- |
-bool ValidationTestInputParser::ParseDouble(const DataType& type, |
- const std::string& value_string) { |
- static_assert(sizeof(double) == 8, "sizeof(double) is not 8"); |
- |
- double value; |
- if (sscanf(value_string.c_str(), "%lf", &value) != 1) |
- return false; |
- |
- AppendData(value); |
- return true; |
-} |
- |
-bool ValidationTestInputParser::ParseBinarySequence( |
- const DataType& type, |
- const std::string& value_string) { |
- if (value_string.size() != 8) |
- return false; |
- |
- uint8_t value = 0; |
- for (std::string::const_iterator iter = value_string.begin(); |
- iter != value_string.end(); |
- ++iter) { |
- value <<= 1; |
- if (*iter == '1') |
- value++; |
- else if (*iter != '0') |
- return false; |
- } |
- AppendData(value); |
- return true; |
-} |
- |
-bool ValidationTestInputParser::ParseDistance(const DataType& type, |
- const std::string& value_string) { |
- if (pending_distance_items_.find(value_string) != |
- pending_distance_items_.end()) |
- return false; |
- |
- PendingDistanceItem item = {data_->size(), type.data_size}; |
- data_->resize(data_->size() + type.data_size); |
- pending_distance_items_[value_string] = item; |
- |
- return true; |
-} |
- |
-bool ValidationTestInputParser::ParseAnchor(const DataType& type, |
- const std::string& value_string) { |
- if (anchors_.find(value_string) != anchors_.end()) |
- return false; |
- anchors_.insert(value_string); |
- |
- std::map<std::string, PendingDistanceItem>::iterator iter = |
- pending_distance_items_.find(value_string); |
- if (iter == pending_distance_items_.end()) |
- return false; |
- |
- PendingDistanceItem dist_item = iter->second; |
- pending_distance_items_.erase(iter); |
- |
- size_t distance = data_->size() - dist_item.pos; |
- switch (dist_item.data_size) { |
- case 4: |
- return ConvertAndFillData<uint32_t>(dist_item.pos, distance); |
- case 8: |
- return ConvertAndFillData<uint64_t>(dist_item.pos, distance); |
- default: |
- assert(false); |
- return false; |
- } |
-} |
- |
-bool ValidationTestInputParser::ParseHandles(const DataType& type, |
- const std::string& value_string) { |
- // It should be the first item. |
- if (!data_->empty()) |
- return false; |
- |
- unsigned long long int value; |
- if (!ConvertToUnsignedInteger(value_string, &value)) |
- return false; |
- |
- if (value > std::numeric_limits<size_t>::max()) |
- return false; |
- |
- *num_handles_ = static_cast<size_t>(value); |
- return true; |
-} |
- |
-bool ValidationTestInputParser::StartsWith(const Range& range, |
- const char* prefix, |
- size_t prefix_length) { |
- if (static_cast<size_t>(range.second - range.first) < prefix_length) |
- return false; |
- |
- return memcmp(range.first, prefix, prefix_length) == 0; |
-} |
- |
-bool ValidationTestInputParser::ConvertToUnsignedInteger( |
- const std::string& value_string, |
- unsigned long long int* value) { |
- const char* format = nullptr; |
- if (value_string.find_first_of("xX") != std::string::npos) |
- format = "%llx"; |
- else |
- format = "%llu"; |
- return sscanf(value_string.c_str(), format, value) == 1; |
-} |
- |
-} // namespace |
- |
-bool ParseValidationTestInput(const std::string& input, |
- std::vector<uint8_t>* data, |
- size_t* num_handles, |
- std::string* error_message) { |
- ValidationTestInputParser parser(input, data, num_handles, error_message); |
- return parser.Run(); |
-} |
- |
-} // namespace test |
-} // namespace mojo |