--- /dev/null
+//
+// UtilPath.inline.hpp
+// CPPUtil
+//
+// Created by James McIlree on 4/8/13.
+// Copyright (c) 2013 Apple. All rights reserved.
+//
+
+#include "CPPUtil.h"
+
+#include <sys/stat.h>
+
+BEGIN_UTIL_NAMESPACE
+
+std::string Path::basename(const char* path) {
+ size_t length = strlen(path);
+
+ /*
+ * case: ""
+ * case: "/"
+ * case: [any-single-character-paths]
+ */
+ if (length < 2)
+ return std::string(path);
+
+ char temp[PATH_MAX];
+ char* temp_cursor = &temp[PATH_MAX - 1];
+ char* temp_end = temp_cursor;
+ *temp_end = 0; // NULL terminate
+
+ const char* path_cursor = &path[length-1];
+
+ while (path_cursor >= path) {
+ if (*path_cursor == '/') {
+ // If we have copied one or more chars, we're done
+ if (temp_cursor != temp_end)
+ return std::string(temp_cursor);
+ } else {
+ *(--temp_cursor) = *path_cursor;
+ }
+
+ // Is the temp buffer full?
+ if (temp_cursor == temp)
+ return std::string(temp);
+
+ --path_cursor;
+ }
+
+ if (path[0] == '/' && temp_cursor == temp_end) {
+ *(--temp_cursor) = '/';
+ }
+
+ return std::string(temp_cursor);
+}
+
+std::string Path::basename(std::string& path) {
+ return basename(path.c_str());
+}
+
+bool Path::exists(const char *path) {
+ struct stat statinfo;
+ return lstat(path, &statinfo) == 0;
+}
+
+bool Path::exists(std::string& path) {
+ return exists(path.c_str());
+}
+
+bool Path::is_file(const char* path, bool should_resolve_symlinks) {
+ struct stat statinfo;
+ if (should_resolve_symlinks) {
+ if (stat(path, &statinfo) == 0) {
+ if (S_ISREG(statinfo.st_mode)) {
+ return true;
+ }
+ }
+ } else {
+ if (lstat(path, &statinfo) == 0) {
+ if (S_ISREG(statinfo.st_mode)) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+}
+
+bool Path::is_file(std::string& path, bool should_resolve_symlinks) {
+ return is_file(path.c_str(), should_resolve_symlinks);
+}
+
+END_UTIL_NAMESPACE