summaryrefslogtreecommitdiff
path: root/libdeno/file_util.cc
diff options
context:
space:
mode:
authorBert Belder <bertbelder@gmail.com>2018-08-26 01:37:15 +0200
committerBert Belder <bertbelder@gmail.com>2018-08-26 18:27:23 +0200
commit26707446fc83a6f6c7152153db43db4152698f58 (patch)
tree184a4765b5d5d15046a96c49e0db6800729bcf16 /libdeno/file_util.cc
parentddddd50540847a34697380a6f1fc4336d3f20c83 (diff)
libdeno: add file utilities Dirname() and ExePath()
Diffstat (limited to 'libdeno/file_util.cc')
-rw-r--r--libdeno/file_util.cc59
1 files changed, 59 insertions, 0 deletions
diff --git a/libdeno/file_util.cc b/libdeno/file_util.cc
index a0cae5f58..8df0dafea 100644
--- a/libdeno/file_util.cc
+++ b/libdeno/file_util.cc
@@ -1,10 +1,21 @@
// Copyright 2018 the Deno authors. All rights reserved. MIT license.
#include <inttypes.h>
+#include <limits.h>
+#include <stdint.h>
#include <stdio.h>
+#include <stdlib.h>
#include <fstream>
#include <iterator>
#include <string>
+#ifdef __APPLE__
+#include <mach-o/dyld.h>
+#endif
+
+#ifdef _WIN32
+#include <windows.h>
+#endif
+
#include "file_util.h"
namespace deno {
@@ -28,4 +39,52 @@ std::string Basename(std::string const& filename) {
return filename;
}
+// Returns the directory component from a filename. The returned path always
+// ends with a slash. This function does not understand Windows drive letters.
+std::string Dirname(std::string const& filename) {
+ for (auto it = filename.rbegin(); it != filename.rend(); ++it) {
+ char ch = *it;
+ if (ch == '\\' || ch == '/') {
+ return std::string(filename.begin(), it.base());
+ }
+ }
+ return std::string("./");
+}
+
+// Returns the full path the currently running executable.
+// This implementation is very basic. Caveats:
+// * OS X: fails if buffer is too small, does not retry with a bigger buffer.
+// * Windows: ANSI only, no unicode. Fails if path is longer than 260 chars.
+bool ExePath(std::string* path) {
+#ifdef _WIN32
+ // Windows only.
+ char exe_buf[MAX_PATH];
+ DWORD len = GetModuleFileNameA(NULL, exe_buf, sizeof exe_buf);
+ if (len == 0 || len == sizeof exe_buf) {
+ return false;
+ }
+#else
+#ifdef __APPLE__
+ // OS X only.
+ char link_buf[PATH_MAX * 2]; // Exe may be longer than MAX_PATH, says Apple.
+ uint32_t len = sizeof link_buf;
+ if (_NSGetExecutablePath(link_buf, &len) < 0) {
+ return false;
+ }
+#else
+ // Linux only.
+ static const char* link_buf = "/proc/self/exe";
+#endif
+ // Linux and OS X.
+ char exe_buf[PATH_MAX];
+ char* r = realpath(link_buf, exe_buf);
+ if (r == NULL) {
+ return false;
+ }
+#endif
+ // All platforms.
+ path->assign(exe_buf);
+ return true;
+}
+
} // namespace deno