summaryrefslogtreecommitdiff
path: root/libdeno/file_util.cc
blob: 256f4f2576eb02c0391b63ae615a2c573a19fde2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
// Copyright 2018-2019 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 {

bool ReadFileToString(const char* fn, std::string* contents) {
  std::ifstream file(fn, std::ios::binary);
  if (file.fail()) {
    return false;
  }
  contents->assign(std::istreambuf_iterator<char>{file}, {});
  return !file.fail();
}

std::string Basename(std::string const& filename) {
  for (auto it = filename.rbegin(); it != filename.rend(); ++it) {
    char ch = *it;
    if (ch == '\\' || ch == '/') {
      return std::string(it.base(), filename.end());
    }
  }
  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