1// 2// Copyright (C) 2017 The Android Open Source Project 3// 4// Licensed under the Apache License, Version 2.0 (the "License"); 5// you may not use this file except in compliance with the License. 6// You may obtain a copy of the License at 7// 8// http://www.apache.org/licenses/LICENSE-2.0 9// 10// Unless required by applicable law or agreed to in writing, software 11// distributed under the License is distributed on an "AS IS" BASIS, 12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13// See the License for the specific language governing permissions and 14// limitations under the License. 15// 16 17#include "property_type.h" 18 19#include <android-base/parsedouble.h> 20#include <android-base/parseint.h> 21#include <android-base/strings.h> 22 23using android::base::ParseDouble; 24using android::base::ParseInt; 25using android::base::ParseUint; 26using android::base::Split; 27 28namespace android { 29namespace init { 30 31bool CheckType(const std::string& type_string, const std::string& value) { 32 auto type_strings = Split(type_string, " "); 33 if (type_strings.empty()) { 34 return false; 35 } 36 auto type = type_strings[0]; 37 38 if (type == "string") { 39 return true; 40 } 41 if (type == "bool") { 42 return value == "true" || value == "false" || value == "1" || value == "0"; 43 } 44 if (type == "int") { 45 int64_t parsed; 46 return ParseInt(value, &parsed); 47 } 48 if (type == "uint") { 49 uint64_t parsed; 50 if (value.empty() || value.front() == '-') { 51 return false; 52 } 53 return ParseUint(value, &parsed); 54 } 55 if (type == "double") { 56 double parsed; 57 return ParseDouble(value.c_str(), &parsed); 58 } 59 if (type == "size") { 60 auto it = value.begin(); 61 while (it != value.end() && isdigit(*it)) { 62 it++; 63 } 64 if (it == value.begin() || it == value.end() || (*it != 'g' && *it != 'k' && *it != 'm')) { 65 return false; 66 } 67 it++; 68 return it == value.end(); 69 } 70 if (type == "enum") { 71 for (auto it = std::next(type_strings.begin()); it != type_strings.end(); ++it) { 72 if (*it == value) { 73 return true; 74 } 75 } 76 } 77 return false; 78} 79 80} // namespace init 81} // namespace android 82