15f57a99a879b60bc7e8cb6155c51bc026ed1d30dShinichiro Hamaji// Copyright 2015 Google Inc. All rights reserved 25f57a99a879b60bc7e8cb6155c51bc026ed1d30dShinichiro Hamaji// 35f57a99a879b60bc7e8cb6155c51bc026ed1d30dShinichiro Hamaji// Licensed under the Apache License, Version 2.0 (the "License"); 45f57a99a879b60bc7e8cb6155c51bc026ed1d30dShinichiro Hamaji// you may not use this file except in compliance with the License. 55f57a99a879b60bc7e8cb6155c51bc026ed1d30dShinichiro Hamaji// You may obtain a copy of the License at 65f57a99a879b60bc7e8cb6155c51bc026ed1d30dShinichiro Hamaji// 75f57a99a879b60bc7e8cb6155c51bc026ed1d30dShinichiro Hamaji// http://www.apache.org/licenses/LICENSE-2.0 85f57a99a879b60bc7e8cb6155c51bc026ed1d30dShinichiro Hamaji// 95f57a99a879b60bc7e8cb6155c51bc026ed1d30dShinichiro Hamaji// Unless required by applicable law or agreed to in writing, software 105f57a99a879b60bc7e8cb6155c51bc026ed1d30dShinichiro Hamaji// distributed under the License is distributed on an "AS IS" BASIS, 115f57a99a879b60bc7e8cb6155c51bc026ed1d30dShinichiro Hamaji// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 125f57a99a879b60bc7e8cb6155c51bc026ed1d30dShinichiro Hamaji// See the License for the specific language governing permissions and 135f57a99a879b60bc7e8cb6155c51bc026ed1d30dShinichiro Hamaji// limitations under the License. 145f57a99a879b60bc7e8cb6155c51bc026ed1d30dShinichiro Hamaji 155f57a99a879b60bc7e8cb6155c51bc026ed1d30dShinichiro Hamaji#ifndef FIND_H_ 165f57a99a879b60bc7e8cb6155c51bc026ed1d30dShinichiro Hamaji#define FIND_H_ 175f57a99a879b60bc7e8cb6155c51bc026ed1d30dShinichiro Hamaji 18a5a5ef6dbaa4ce7d0ba457a7df5e18327ff65b2bShinichiro Hamaji#include <memory> 195f57a99a879b60bc7e8cb6155c51bc026ed1d30dShinichiro Hamaji#include <string> 20b7175615d59a91950d547c9c39a7c746c6f22c8bShinichiro Hamaji#include <unordered_set> 21a5a5ef6dbaa4ce7d0ba457a7df5e18327ff65b2bShinichiro Hamaji#include <vector> 22a5a5ef6dbaa4ce7d0ba457a7df5e18327ff65b2bShinichiro Hamaji 23692e64ebf83bc87baca6e3c90c3d0b2849655d75Dan Willemsen#include "loc.h" 24a5a5ef6dbaa4ce7d0ba457a7df5e18327ff65b2bShinichiro Hamaji#include "string_piece.h" 255f57a99a879b60bc7e8cb6155c51bc026ed1d30dShinichiro Hamaji 265f57a99a879b60bc7e8cb6155c51bc026ed1d30dShinichiro Hamajiusing namespace std; 275f57a99a879b60bc7e8cb6155c51bc026ed1d30dShinichiro Hamaji 28a5a5ef6dbaa4ce7d0ba457a7df5e18327ff65b2bShinichiro Hamajiclass FindCond; 29a5a5ef6dbaa4ce7d0ba457a7df5e18327ff65b2bShinichiro Hamaji 30e7a6822b3e7901bf0f0845de68f5a3f52fb11546Shinichiro Hamajienum struct FindCommandType { 31e7a6822b3e7901bf0f0845de68f5a3f52fb11546Shinichiro Hamaji FIND, 32e7a6822b3e7901bf0f0845de68f5a3f52fb11546Shinichiro Hamaji FINDLEAVES, 33e7a6822b3e7901bf0f0845de68f5a3f52fb11546Shinichiro Hamaji LS, 34e7a6822b3e7901bf0f0845de68f5a3f52fb11546Shinichiro Hamaji}; 35e7a6822b3e7901bf0f0845de68f5a3f52fb11546Shinichiro Hamaji 36a5a5ef6dbaa4ce7d0ba457a7df5e18327ff65b2bShinichiro Hamajistruct FindCommand { 37a5a5ef6dbaa4ce7d0ba457a7df5e18327ff65b2bShinichiro Hamaji FindCommand(); 38c9b0acaf0a11eee6b0152c51d9633758ad8c662cShinichiro Hamaji ~FindCommand(); 39a5a5ef6dbaa4ce7d0ba457a7df5e18327ff65b2bShinichiro Hamaji 400876e09854a143f18fb7e2aa457c3762bf465265Shinichiro Hamaji bool Parse(const string& cmd); 410876e09854a143f18fb7e2aa457c3762bf465265Shinichiro Hamaji 42e7a6822b3e7901bf0f0845de68f5a3f52fb11546Shinichiro Hamaji FindCommandType type; 433498f34cba95d4b6dd30d852a5b0fc43e96116b3Shinichiro Hamaji string chdir; 443498f34cba95d4b6dd30d852a5b0fc43e96116b3Shinichiro Hamaji string testdir; 455131f84ef22b6696f1c16f94d4d4fb332c3b6398Dan Willemsen vector<string> finddirs; 46a5a5ef6dbaa4ce7d0ba457a7df5e18327ff65b2bShinichiro Hamaji bool follows_symlinks; 47a5a5ef6dbaa4ce7d0ba457a7df5e18327ff65b2bShinichiro Hamaji unique_ptr<FindCond> print_cond; 48a5a5ef6dbaa4ce7d0ba457a7df5e18327ff65b2bShinichiro Hamaji unique_ptr<FindCond> prune_cond; 49a5a5ef6dbaa4ce7d0ba457a7df5e18327ff65b2bShinichiro Hamaji int depth; 50e7a6822b3e7901bf0f0845de68f5a3f52fb11546Shinichiro Hamaji int mindepth; 5189e0c4f6a0d19d01308129dbc96b9c7982203f8aShinichiro Hamaji bool redirect_to_devnull; 525a71a8b0947d8fa1acc87217cd9201530f92e89cShinichiro Hamaji 53439f6f1553ad197b7c6921b28f848456cfb50ea9Dan Willemsen unique_ptr<vector<string>> found_files; 54b7175615d59a91950d547c9c39a7c746c6f22c8bShinichiro Hamaji unique_ptr<unordered_set<string>> read_dirs; 555a71a8b0947d8fa1acc87217cd9201530f92e89cShinichiro Hamaji 565a71a8b0947d8fa1acc87217cd9201530f92e89cShinichiro Hamaji private: 575a71a8b0947d8fa1acc87217cd9201530f92e89cShinichiro Hamaji FindCommand(const FindCommand&) = delete; 585a71a8b0947d8fa1acc87217cd9201530f92e89cShinichiro Hamaji void operator=(FindCommand) = delete; 59a5a5ef6dbaa4ce7d0ba457a7df5e18327ff65b2bShinichiro Hamaji}; 60a5a5ef6dbaa4ce7d0ba457a7df5e18327ff65b2bShinichiro Hamaji 615f57a99a879b60bc7e8cb6155c51bc026ed1d30dShinichiro Hamajiclass FindEmulator { 625f57a99a879b60bc7e8cb6155c51bc026ed1d30dShinichiro Hamaji public: 635f57a99a879b60bc7e8cb6155c51bc026ed1d30dShinichiro Hamaji virtual ~FindEmulator() = default; 645f57a99a879b60bc7e8cb6155c51bc026ed1d30dShinichiro Hamaji 653ce083f01d6e62e9fb9b328e312d97a074fe6128Dan Willemsen virtual bool HandleFind(const string& cmd, 663ce083f01d6e62e9fb9b328e312d97a074fe6128Dan Willemsen const FindCommand& fc, 673ce083f01d6e62e9fb9b328e312d97a074fe6128Dan Willemsen const Loc& loc, 683ce083f01d6e62e9fb9b328e312d97a074fe6128Dan Willemsen string* out) = 0; 695f57a99a879b60bc7e8cb6155c51bc026ed1d30dShinichiro Hamaji 705f57a99a879b60bc7e8cb6155c51bc026ed1d30dShinichiro Hamaji static FindEmulator* Get(); 715f57a99a879b60bc7e8cb6155c51bc026ed1d30dShinichiro Hamaji 725f57a99a879b60bc7e8cb6155c51bc026ed1d30dShinichiro Hamaji protected: 735f57a99a879b60bc7e8cb6155c51bc026ed1d30dShinichiro Hamaji FindEmulator() = default; 745f57a99a879b60bc7e8cb6155c51bc026ed1d30dShinichiro Hamaji}; 755f57a99a879b60bc7e8cb6155c51bc026ed1d30dShinichiro Hamaji 765f57a99a879b60bc7e8cb6155c51bc026ed1d30dShinichiro Hamajivoid InitFindEmulator(); 775f57a99a879b60bc7e8cb6155c51bc026ed1d30dShinichiro Hamaji 785f57a99a879b60bc7e8cb6155c51bc026ed1d30dShinichiro Hamaji#endif // FIND_H_ 79