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