diff --git a/build_tools/lint.fish b/build_tools/lint.fish index 7182322f0..9585d4e69 100755 --- a/build_tools/lint.fish +++ b/build_tools/lint.fish @@ -34,13 +34,8 @@ if test $all = yes else # We haven't been asked to lint all the source. If there are uncommitted # changes lint those, else lint the files in the most recent commit. - set pending (git status --porcelain --short --untracked-files=all | sed -e 's/^ *//') - if set -q pending[1] - # There are pending changes so lint those files. - for arg in $pending - set files $files (string split -m 1 ' ' $arg)[2] - end - else + set files (git status --porcelain --short --untracked-files=all | sed -e 's/^ *[^ ]* *//') + if not set -q files[1] # No pending changes so lint the files in the most recent commit. set files (git show --word-diff=porcelain --name-only --pretty=oneline head)[2..-1] end @@ -56,10 +51,9 @@ if set -q c_files[1] echo ======================================== echo Running cppcheck echo ======================================== - # The stderr to stdout redirection is because cppcheck, incorrectly - # IMHO, writes its diagnostic messages to stderr. Anyone running - # this who wants to capture its output will expect those messages to be - # written to stdout. + # The stderr to stdout redirection is because cppcheck, incorrectly IMHO, writes its + # diagnostic messages to stderr. Anyone running this who wants to capture its output will + # expect those messages to be written to stdout. cppcheck -q --verbose --std=posix --std=c11 --language=c++ --template "[{file}:{line}]: {severity} ({id}): {message}" --suppress=missingIncludeSystem --inline-suppr --enable=$cppchecks $cppcheck_args $c_files 2>& 1 end @@ -68,10 +62,9 @@ if set -q c_files[1] echo ======================================== echo Running oclint echo ======================================== - # The stderr to stdout redirection is because oclint, incorrectly - # writes its final summary counts of the errors detected to stderr. - # Anyone running this who wants to capture its output will expect those - # messages to be written to stdout. + # The stderr to stdout redirection is because oclint, incorrectly writes its final summary + # counts of the errors detected to stderr. Anyone running this who wants to capture its + # output will expect those messages to be written to stdout. if test (uname -s) = "Darwin" if not test -f compile_commands.json xcodebuild > xcodebuild.log diff --git a/src/fish.cpp b/src/fish.cpp index 17cd1f16a..bde7854ee 100644 --- a/src/fish.cpp +++ b/src/fish.cpp @@ -92,39 +92,34 @@ extern "C" { int _NSGetExecutablePath(char* buf, uint32_t* bufsize); } -/* Return the path to the current executable. This needs to be realpath'd. */ +// Return the path to the current executable. This needs to be realpath'd. static std::string get_executable_path(const char *argv0) { - char buff[PATH_MAX]; + char buff[PATH_MAX + 1]; + #if __APPLE__ - { - /* Returns 0 on success, -1 if the buffer is too small */ - uint32_t buffSize = sizeof buff; - if (0 == _NSGetExecutablePath(buff, &buffSize)) - return std::string(buff); - - /* Loop until we're big enough */ - char *mbuff = (char *)malloc(buffSize); - while (0 > _NSGetExecutablePath(mbuff, &buffSize)) - mbuff = (char *)realloc(mbuff, buffSize); - - /* Return the string */ - std::string result = mbuff; - free(mbuff); - return result; - } -#endif - { - /* On other Unixes, try /proc directory. This might be worth breaking out into macros. */ - if (0 < readlink("/proc/self/exe", buff, sizeof buff) || // Linux - 0 < readlink("/proc/curproc/file", buff, sizeof buff) || // BSD - 0 < readlink("/proc/self/path/a.out", buff, sizeof buff)) // Solaris - { - return std::string(buff); + // On OS X use it's proprietary API to get the path to the executable. + uint32_t buffSize = sizeof buff; + if (_NSGetExecutablePath(buff, &buffSize) == 0) return std::string(buff); +#else + // On non-OS X UNIXes, try /proc directory. + ssize_t len; + len = readlink("/proc/self/exe", buff, sizeof buff); // Linux + if (len == -1) { + len = readlink("/proc/curproc/file", buff, sizeof buff); // BSD + if (len == -1) { + len = readlink("/proc/self/path/a.out", buff, sizeof buff); // Solaris } } + if (len > 0) { + buff[len] = '\0'; + return std::string(buff); + } +#endif - /* Just return argv0, which probably won't work (i.e. it's not an absolute path or a path relative to the working directory, but instead something the caller found via $PATH). We'll eventually fall back to the compile time paths. */ + // Just return argv0, which probably won't work (i.e. it's not an absolute path or a path + // relative to the working directory, but instead something the caller found via $PATH). We'll + // eventually fall back to the compile time paths. return std::string(argv0 ? argv0 : ""); }