27 #ifndef LLVM_SUPPORT_FILESYSTEM_H 28 #define LLVM_SUPPORT_FILESYSTEM_H 30 #include "llvm/IntrusiveRefCntPtr.h" 31 #include "llvm/SmallString.h" 32 #include "llvm/Twine.h" 38 #include <system_error> 47 enum class file_type {
65 owner_all = owner_read | owner_write | owner_exe,
69 group_all = group_read | group_write | group_exe,
73 others_all = others_read | others_write | others_exe,
74 all_read = owner_read | group_read | others_read,
75 all_write = owner_write | group_write | others_write,
76 all_exe = owner_exe | group_exe | others_exe,
77 all_all = owner_all | group_all | others_all,
78 set_uid_on_exe = 04000,
79 set_gid_on_exe = 02000,
81 perms_not_known = 0xFFFF
85 inline perms operator|(perms l, perms r) {
86 return static_cast<perms
>(
static_cast<unsigned short>(l) |
87 static_cast<unsigned short>(r));
89 inline perms operator&(perms l, perms r) {
90 return static_cast<perms
>(
static_cast<unsigned short>(l) &
91 static_cast<unsigned short>(r));
93 inline perms &operator|=(perms &l, perms r) {
97 inline perms &operator&=(perms &l, perms r) {
101 inline perms operator~(perms x) {
102 return static_cast<perms
>(
103 static_cast<unsigned short>(~static_cast<
unsigned short>(x)));
112 UniqueID(uint64_t Device, uint64_t File) : Device(Device), File(File) {}
113 bool operator==(
const UniqueID &Other)
const {
114 return Device == Other.Device && File == Other.File;
116 bool operator!=(
const UniqueID &Other)
const {
return !(*
this == Other); }
117 bool operator<(
const UniqueID &Other)
const {
118 return std::tie(Device, File) < std::tie(Other.Device, Other.File);
120 uint64_t getDevice()
const {
return Device; }
121 uint64_t getFile()
const {
return File; }
129 uint32_t LastAccessedTimeHigh;
130 uint32_t LastAccessedTimeLow;
131 uint32_t LastWriteTimeHigh;
132 uint32_t LastWriteTimeLow;
133 uint32_t VolumeSerialNumber;
134 uint32_t FileSizeHigh;
135 uint32_t FileSizeLow;
136 uint32_t FileIndexHigh;
137 uint32_t FileIndexLow;
154 : LastAccessedTimeHigh(0), LastAccessedTimeLow(0), LastWriteTimeHigh(0),
155 LastWriteTimeLow(0), VolumeSerialNumber(0), FileSizeHigh(0),
156 FileSizeLow(0), FileIndexHigh(0), FileIndexLow(0),
157 Type(file_type::status_error), Perms(perms_not_known) {}
160 : LastAccessedTimeHigh(0), LastAccessedTimeLow(0), LastWriteTimeHigh(0),
161 LastWriteTimeLow(0), VolumeSerialNumber(0), FileSizeHigh(0),
162 FileSizeLow(0), FileIndexHigh(0), FileIndexLow(0), Type(Type),
163 Perms(perms_not_known) {}
165 file_status(file_type Type, uint32_t LastAccessTimeHigh,
166 uint32_t LastAccessTimeLow, uint32_t LastWriteTimeHigh,
167 uint32_t LastWriteTimeLow, uint32_t VolumeSerialNumber,
168 uint32_t FileSizeHigh, uint32_t FileSizeLow,
169 uint32_t FileIndexHigh, uint32_t FileIndexLow)
170 : LastAccessedTimeHigh(LastAccessTimeHigh), LastAccessedTimeLow(LastAccessTimeLow),
171 LastWriteTimeHigh(LastWriteTimeHigh),
172 LastWriteTimeLow(LastWriteTimeLow),
173 VolumeSerialNumber(VolumeSerialNumber), FileSizeHigh(FileSizeHigh),
174 FileSizeLow(FileSizeLow), FileIndexHigh(FileIndexHigh),
175 FileIndexLow(FileIndexLow), Type(Type), Perms(perms_not_known) {}
178 : fs_st_dev(0), fs_st_ino(0), fs_st_atime(0), fs_st_mtime(0),
179 fs_st_uid(0), fs_st_gid(0), fs_st_size(0),
180 Type(file_type::status_error), Perms(perms_not_known) {}
183 : fs_st_dev(0), fs_st_ino(0), fs_st_atime(0), fs_st_mtime(0),
184 fs_st_uid(0), fs_st_gid(0), fs_st_size(0), Type(Type),
185 Perms(perms_not_known) {}
187 file_status(file_type Type, perms Perms, dev_t Dev, ino_t Ino, time_t ATime,
188 time_t MTime, uid_t UID, gid_t GID, off_t Size)
189 : fs_st_dev(Dev), fs_st_ino(Ino), fs_st_atime(ATime), fs_st_mtime(MTime),
190 fs_st_uid(UID), fs_st_gid(GID), fs_st_size(Size), Type(Type),
195 file_type type()
const {
return Type; }
196 perms permissions()
const {
return Perms; }
200 uint32_t getUser()
const {
203 uint32_t getGroup()
const {
206 uint64_t getSize()
const {
207 return (uint64_t(FileSizeHigh) << 32) + FileSizeLow;
210 uint32_t getUser()
const {
return fs_st_uid; }
211 uint32_t getGroup()
const {
return fs_st_gid; }
212 uint64_t getSize()
const {
return fs_st_size; }
216 void type(file_type v) { Type = v; }
217 void permissions(perms p) { Perms = p; }
235 std::error_code make_absolute(
const Twine ¤t_directory,
269 enum class AccessMode { Exist, Write, Execute };
276 std::error_code access(
const Twine &Path, AccessMode Mode);
282 inline bool exists(
const Twine &Path) {
283 return !access(Path, AccessMode::Exist);
290 inline bool can_write(
const Twine &Path) {
291 return !access(Path, AccessMode::Write);
315 std::error_code equivalent(
const Twine &A,
const Twine &B,
bool &result);
319 inline bool equivalent(
const Twine &A,
const Twine &B) {
321 return !equivalent(A, B, result) && result;
337 std::error_code is_directory(
const Twine &path,
bool &result);
341 inline bool is_directory(
const Twine &Path) {
343 return !is_directory(Path, Result) && Result;
359 std::error_code is_regular_file(
const Twine &path,
bool &result);
363 inline bool is_regular_file(
const Twine &Path) {
365 if (is_regular_file(Path, Result))
385 std::error_code is_other(
const Twine &path,
bool &result);
396 std::error_code status(
int FD,
file_status &Result);
410 std::error_code status_known(
const Twine &path,
bool &result);
412 enum OpenFlags :
unsigned {
432 inline OpenFlags operator|(OpenFlags A, OpenFlags B) {
433 return OpenFlags(
unsigned(A) |
unsigned(B));
436 inline OpenFlags &operator|=(OpenFlags &A, OpenFlags B) {
441 std::error_code openFileForWrite(
const Twine &Name,
int &ResultFD,
442 OpenFlags Flags,
unsigned Mode = 0666);
444 std::error_code openFileForRead(
const Twine &Name,
int &ResultFD,
446 std::error_code getUniqueID(
const Twine Path,
UniqueID &Result);
473 const std::string &path()
const {
return Path; }
476 bool operator==(
const directory_entry& rhs)
const {
return Path == rhs.Path; }
477 bool operator!=(
const directory_entry& rhs)
const {
return !(*
this == rhs); }
487 std::error_code directory_iterator_construct(DirIterState &,
StringRef);
488 std::error_code directory_iterator_increment(DirIterState &);
489 std::error_code directory_iterator_destruct(DirIterState &);
495 : IterationHandle(0) {}
498 directory_iterator_destruct(*
this);
501 intptr_t IterationHandle;
516 ec = detail::directory_iterator_construct(*State,
522 ec = detail::directory_iterator_construct(*State, de.path());
530 ec = directory_iterator_increment(*State);
534 const directory_entry &operator*()
const {
return State->CurrentEntry; }
535 const directory_entry *operator->()
const {
return &State->CurrentEntry; }
538 if (State == RHS.State)
544 return State->CurrentEntry == RHS.State->CurrentEntry;
548 return !(*
this == RHS);
560 , HasNoPushRequest(
false) {}
562 std::stack<directory_iterator, std::vector<directory_iterator> > Stack;
564 bool HasNoPushRequest;
585 if (State->HasNoPushRequest)
586 State->HasNoPushRequest =
false;
589 if ((ec = State->Stack.top()->status(st)))
return *
this;
590 if (is_directory(st)) {
592 if (ec)
return *
this;
593 if (State->Stack.top() != end_itr) {
601 while (!State->Stack.empty()
602 && State->Stack.top().increment(ec) == end_itr) {
608 if (State->Stack.empty())
614 const directory_entry &operator*()
const {
return *State->Stack.top(); }
615 const directory_entry *operator->()
const {
return &*State->Stack.top(); }
619 int level()
const {
return State->Level; }
627 assert(State &&
"Cannot pop an end iterator!");
628 assert(State->Level > 0 &&
"Cannot pop an iterator with level < 1");
635 while (!State->Stack.empty()) State->Stack.pop();
640 }
while (!State->Stack.empty()
641 && State->Stack.top().increment(ec) == end_itr);
644 if (State->Stack.empty())
649 void no_push() { State->HasNoPushRequest =
true; }
652 return State == RHS.State;
656 return !(*
this == RHS);
668 #endif // LLVM_SUPPORT_FILESYSTEM_H
void pop()
Goes up one level if Level > 0.
Definition: FileSystem.h:626
recursive_directory_iterator - Same as directory_iterator except for it recurses down into child dire...
Definition: FileSystem.h:570
file_status - Represents the result of a call to stat and friends.
Definition: FileSystem.h:126
std::string str() const
Return the twine contents as a std::string.
Definition: Twine.cpp:15
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition: Twine.h:79
DirIterState - Keeps state for the directory_iterator.
Definition: FileSystem.h:493
bool no_push_request() const
Returns true if no_push has been called for this directory_entry.
Definition: FileSystem.h:622
RefCountedBase - A generic base class for objects that wish to have their lifetimes managed using ref...
Definition: IntrusiveRefCntPtr.h:44
Definition: FileSystem.h:106
void no_push()
Does not go down into the current directory_entry.
Definition: FileSystem.h:649
RecDirIterState - Keeps state for the recursive_directory_iterator.
Definition: FileSystem.h:557
StringRef toStringRef(SmallVectorImpl< char > &Out) const
This returns the twine as a single StringRef if it can be represented as such.
Definition: Twine.h:456
directory_iterator()
Construct end iterator.
Definition: FileSystem.h:526
directory_iterator - Iterates through the entries in path.
Definition: FileSystem.h:509
int level() const
Gets the current level. Starting path is at level 0.
Definition: FileSystem.h:619
directory_entry - A single entry in a directory.
Definition: FileSystem.h:455
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:42