12b93dbe7e1348a97a3953e0aeb7060e4cc461f3dYifan Hong/* 22b93dbe7e1348a97a3953e0aeb7060e4cc461f3dYifan Hong * Copyright (C) 2018 The Android Open Source Project 32b93dbe7e1348a97a3953e0aeb7060e4cc461f3dYifan Hong * 42b93dbe7e1348a97a3953e0aeb7060e4cc461f3dYifan Hong * Licensed under the Apache License, Version 2.0 (the "License"); 52b93dbe7e1348a97a3953e0aeb7060e4cc461f3dYifan Hong * you may not use this file except in compliance with the License. 62b93dbe7e1348a97a3953e0aeb7060e4cc461f3dYifan Hong * You may obtain a copy of the License at 72b93dbe7e1348a97a3953e0aeb7060e4cc461f3dYifan Hong * 82b93dbe7e1348a97a3953e0aeb7060e4cc461f3dYifan Hong * http://www.apache.org/licenses/LICENSE-2.0 92b93dbe7e1348a97a3953e0aeb7060e4cc461f3dYifan Hong * 102b93dbe7e1348a97a3953e0aeb7060e4cc461f3dYifan Hong * Unless required by applicable law or agreed to in writing, software 112b93dbe7e1348a97a3953e0aeb7060e4cc461f3dYifan Hong * distributed under the License is distributed on an "AS IS" BASIS, 122b93dbe7e1348a97a3953e0aeb7060e4cc461f3dYifan Hong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132b93dbe7e1348a97a3953e0aeb7060e4cc461f3dYifan Hong * See the License for the specific language governing permissions and 142b93dbe7e1348a97a3953e0aeb7060e4cc461f3dYifan Hong * limitations under the License. 152b93dbe7e1348a97a3953e0aeb7060e4cc461f3dYifan Hong */ 162b93dbe7e1348a97a3953e0aeb7060e4cc461f3dYifan Hong 172b93dbe7e1348a97a3953e0aeb7060e4cc461f3dYifan Hong#ifndef ANDROID_VINTF_REGEX_H_ 182b93dbe7e1348a97a3953e0aeb7060e4cc461f3dYifan Hong#define ANDROID_VINTF_REGEX_H_ 192b93dbe7e1348a97a3953e0aeb7060e4cc461f3dYifan Hong 202b93dbe7e1348a97a3953e0aeb7060e4cc461f3dYifan Hong#include <regex.h> 212b93dbe7e1348a97a3953e0aeb7060e4cc461f3dYifan Hong#include <string> 222b93dbe7e1348a97a3953e0aeb7060e4cc461f3dYifan Hong 232b93dbe7e1348a97a3953e0aeb7060e4cc461f3dYifan Hongnamespace android { 242b93dbe7e1348a97a3953e0aeb7060e4cc461f3dYifan Hongnamespace vintf { 252b93dbe7e1348a97a3953e0aeb7060e4cc461f3dYifan Hongnamespace details { 262b93dbe7e1348a97a3953e0aeb7060e4cc461f3dYifan Hong 272b93dbe7e1348a97a3953e0aeb7060e4cc461f3dYifan Hong// A wrapper class around regex.h. This is used instead of C++ <regex> library because 282b93dbe7e1348a97a3953e0aeb7060e4cc461f3dYifan Hong// C++ regex library throws exceptions when an invalid regular expression is compiled. 292b93dbe7e1348a97a3953e0aeb7060e4cc461f3dYifan Hong// Use Extended Regular Expression (ERE) syntax. 302b93dbe7e1348a97a3953e0aeb7060e4cc461f3dYifan Hongclass Regex { 312b93dbe7e1348a97a3953e0aeb7060e4cc461f3dYifan Hong public: 322b93dbe7e1348a97a3953e0aeb7060e4cc461f3dYifan Hong Regex() = default; 332b93dbe7e1348a97a3953e0aeb7060e4cc461f3dYifan Hong ~Regex(); 342b93dbe7e1348a97a3953e0aeb7060e4cc461f3dYifan Hong 352b93dbe7e1348a97a3953e0aeb7060e4cc461f3dYifan Hong Regex& operator=(const Regex&) = delete; 362b93dbe7e1348a97a3953e0aeb7060e4cc461f3dYifan Hong Regex(const Regex&) = delete; 372b93dbe7e1348a97a3953e0aeb7060e4cc461f3dYifan Hong 382b93dbe7e1348a97a3953e0aeb7060e4cc461f3dYifan Hong __attribute__((warn_unused_result)) bool compile(const std::string& pattern); 392b93dbe7e1348a97a3953e0aeb7060e4cc461f3dYifan Hong 402b93dbe7e1348a97a3953e0aeb7060e4cc461f3dYifan Hong bool matches(const std::string& s) const; 412b93dbe7e1348a97a3953e0aeb7060e4cc461f3dYifan Hong 422b93dbe7e1348a97a3953e0aeb7060e4cc461f3dYifan Hong /** 432b93dbe7e1348a97a3953e0aeb7060e4cc461f3dYifan Hong * Return nullptr if not a valid regex pattern, else the Regex object. 442b93dbe7e1348a97a3953e0aeb7060e4cc461f3dYifan Hong */ 452b93dbe7e1348a97a3953e0aeb7060e4cc461f3dYifan Hong static const Regex* Get(const std::string& pattern); 462b93dbe7e1348a97a3953e0aeb7060e4cc461f3dYifan Hong 472b93dbe7e1348a97a3953e0aeb7060e4cc461f3dYifan Hong private: 482b93dbe7e1348a97a3953e0aeb7060e4cc461f3dYifan Hong std::unique_ptr<regex_t> mImpl; 492b93dbe7e1348a97a3953e0aeb7060e4cc461f3dYifan Hong 502b93dbe7e1348a97a3953e0aeb7060e4cc461f3dYifan Hong void clear(); 512b93dbe7e1348a97a3953e0aeb7060e4cc461f3dYifan Hong}; 522b93dbe7e1348a97a3953e0aeb7060e4cc461f3dYifan Hong 532b93dbe7e1348a97a3953e0aeb7060e4cc461f3dYifan Hong} // namespace details 542b93dbe7e1348a97a3953e0aeb7060e4cc461f3dYifan Hong} // namespace vintf 552b93dbe7e1348a97a3953e0aeb7060e4cc461f3dYifan Hong} // namespace android 562b93dbe7e1348a97a3953e0aeb7060e4cc461f3dYifan Hong 572b93dbe7e1348a97a3953e0aeb7060e4cc461f3dYifan Hong#endif // ANDROID_VINTF_REGEX_H_ 58