summaryrefslogtreecommitdiffstats
path: root/llvm/lib/System/Unix
diff options
context:
space:
mode:
authorReid Spencer <rspencer@reidspencer.com>2007-03-29 16:43:20 +0000
committerReid Spencer <rspencer@reidspencer.com>2007-03-29 16:43:20 +0000
commit0f92f0e5190136660d02c32bb3cb20961bf38728 (patch)
tree9446b889ffef5c30d636f00608f458183973e378 /llvm/lib/System/Unix
parent908f7778861f0654d957d11050da1876632b18c9 (diff)
downloadbcm5719-llvm-0f92f0e5190136660d02c32bb3cb20961bf38728.tar.gz
bcm5719-llvm-0f92f0e5190136660d02c32bb3cb20961bf38728.zip
For PR789:
* Add a method: bool isAbsolute() const, which determines if the path name is absolute or not. * Implement caching of file status information in the Path object. Allow it to be updated forcefully or lazily re-fetched from the cached value. llvm-svn: 35456
Diffstat (limited to 'llvm/lib/System/Unix')
-rw-r--r--llvm/lib/System/Unix/Path.inc34
1 files changed, 22 insertions, 12 deletions
diff --git a/llvm/lib/System/Unix/Path.inc b/llvm/lib/System/Unix/Path.inc
index 9802b7e00da..b155213ec62 100644
--- a/llvm/lib/System/Unix/Path.inc
+++ b/llvm/lib/System/Unix/Path.inc
@@ -79,6 +79,12 @@ Path::isValid() const {
return i >= len;
}
+bool
+Path::isAbsolute() const {
+ if (path.empty())
+ return false;
+ return path[0] == '/';
+}
Path
Path::GetRootDirectory() {
Path result;
@@ -357,18 +363,22 @@ Path::getLast() const {
}
bool
-Path::getFileStatus(FileStatus &info, std::string *ErrStr) const {
- struct stat buf;
- if (0 != stat(path.c_str(), &buf))
- return MakeErrMsg(ErrStr,
- path + ": can't get status of file '" + path + "'");
- info.fileSize = buf.st_size;
- info.modTime.fromEpochTime(buf.st_mtime);
- info.mode = buf.st_mode;
- info.user = buf.st_uid;
- info.group = buf.st_gid;
- info.isDir = S_ISDIR(buf.st_mode);
- info.isFile = S_ISREG(buf.st_mode);
+Path::getFileStatus(FileStatus &info, bool update, std::string *ErrStr) const {
+ if (status == 0 || update) {
+ struct stat buf;
+ if (0 != stat(path.c_str(), &buf))
+ return MakeErrMsg(ErrStr, path + ": can't get status of file");
+ if (status == 0)
+ status = new FileStatus;
+ status->fileSize = buf.st_size;
+ status->modTime.fromEpochTime(buf.st_mtime);
+ status->mode = buf.st_mode;
+ status->user = buf.st_uid;
+ status->group = buf.st_gid;
+ status->isDir = S_ISDIR(buf.st_mode);
+ status->isFile = S_ISREG(buf.st_mode);
+ }
+ info = *status;
return false;
}
OpenPOWER on IntegriCloud