// Copyright 2017 The Crashpad Authors. All rights reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "util/misc/lexing.h" #include #include #include #include #include #include "base/strings/string_number_conversions.h" #include "base/strings/string_piece.h" namespace crashpad { namespace { #define MAKE_ADAPTER(type, function) \ bool ConvertStringToNumber(const base::StringPiece& input, type* value) { \ return function(input, value); \ } MAKE_ADAPTER(int, base::StringToInt) MAKE_ADAPTER(unsigned int, base::StringToUint) MAKE_ADAPTER(int64_t, base::StringToInt64) MAKE_ADAPTER(uint64_t, base::StringToUint64) #undef MAKE_ADAPTER } // namespace bool AdvancePastPrefix(const char** input, const char* pattern) { size_t length = strlen(pattern); if (strncmp(*input, pattern, length) == 0) { *input += length; return true; } return false; } template bool AdvancePastNumber(const char** input, T* value) { size_t length = 0; if (std::numeric_limits::is_signed && **input == '-') { ++length; } while (isdigit((*input)[length])) { ++length; } bool success = ConvertStringToNumber(base::StringPiece(*input, length), value); if (success) { *input += length; return true; } return false; } template bool AdvancePastNumber(const char** input, int* value); template bool AdvancePastNumber(const char** input, unsigned int* value); template bool AdvancePastNumber(const char** input, int64_t* value); template bool AdvancePastNumber(const char** input, uint64_t* value); } // namespace crashpad