diff options
author | Bert Belder <bertbelder@gmail.com> | 2018-08-26 01:37:15 +0200 |
---|---|---|
committer | Bert Belder <bertbelder@gmail.com> | 2018-08-26 18:27:23 +0200 |
commit | 26707446fc83a6f6c7152153db43db4152698f58 (patch) | |
tree | 184a4765b5d5d15046a96c49e0db6800729bcf16 /libdeno/file_util.cc | |
parent | ddddd50540847a34697380a6f1fc4336d3f20c83 (diff) |
libdeno: add file utilities Dirname() and ExePath()
Diffstat (limited to 'libdeno/file_util.cc')
-rw-r--r-- | libdeno/file_util.cc | 59 |
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 |