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