Add portability header for libgen.h
authorChristopher Dykes <cdykes@fb.com>
Sat, 2 Apr 2016 01:29:47 +0000 (18:29 -0700)
committerFacebook Github Bot 2 <facebook-github-bot-2-bot@fb.com>
Sat, 2 Apr 2016 01:35:39 +0000 (18:35 -0700)
Summary: The only thing that matters in it is dirname, and Windows doesn't have it.

Reviewed By: yfeldblum

Differential Revision: D2977655

fb-gh-sync-id: eb5703485089f5c66882fbc9cc142686214c1148
fbshipit-source-id: eb5703485089f5c66882fbc9cc142686214c1148

folly/Makefile.am
folly/portability/Libgen.cpp [new file with mode: 0755]
folly/portability/Libgen.h [new file with mode: 0755]
folly/portability/test/LibgenTest.cpp [new file with mode: 0755]

index e230a9a71df445401aa609bc222c2ac085445d8e..dc608d6069be1fcde5ae7aa9ec881e3185e03459 100644 (file)
@@ -275,6 +275,7 @@ nobase_follyinclude_HEADERS = \
        portability/Environment.h \
        portability/GFlags.h \
        portability/IOVec.h \
+       portability/Libgen.h \
        portability/Malloc.h \
        portability/Memory.h \
        portability/PThread.h \
@@ -421,6 +422,7 @@ libfolly_la_SOURCES = \
        MemoryMapping.cpp \
        portability/Dirent.cpp \
        portability/Environment.cpp \
+       portability/Libgen.cpp \
        portability/Malloc.cpp \
        portability/String.cpp \
        portability/Strings.cpp \
diff --git a/folly/portability/Libgen.cpp b/folly/portability/Libgen.cpp
new file mode 100755 (executable)
index 0000000..88a1825
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2016 Facebook, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <folly/portability/Libgen.h>
+
+#include <string.h>
+
+namespace folly {
+namespace portability {
+static char mutableDot[] = {'.', '\0'};
+char* internal_dirname(char* path) {
+  if (path == nullptr || !strcmp(path, "")) {
+    return mutableDot;
+  }
+  if (!strcmp(path, "/") || !strcmp(path, "\\")) {
+    return path;
+  }
+
+  size_t len = strlen(path);
+  if (path[len - 1] == '/' || path[len - 1] == '\\') {
+    path[len - 1] = '\0';
+  }
+
+  char* pos = strrchr(path, '/');
+  if (strrchr(path, '\\') > pos) {
+    pos = strrchr(path, '\\');
+  }
+  if (pos == nullptr) {
+    return mutableDot;
+  }
+
+  if (pos == path) {
+    *(pos + 1) = '\0';
+  } else {
+    *pos = '\0';
+  }
+  return path;
+}
+}
+}
+
+#ifdef _WIN32
+extern "C" char* dirname(char* path) {
+  return folly::portability::internal_dirname(path);
+}
+#endif
diff --git a/folly/portability/Libgen.h b/folly/portability/Libgen.h
new file mode 100755 (executable)
index 0000000..9aaef33
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2016 Facebook, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+namespace folly {
+namespace portability {
+char* internal_dirname(char* path);
+}
+}
+
+#ifndef _WIN32
+#include <libgen.h>
+#else
+extern "C" char* dirname(char* path);
+#endif
diff --git a/folly/portability/test/LibgenTest.cpp b/folly/portability/test/LibgenTest.cpp
new file mode 100755 (executable)
index 0000000..9d258a5
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2016 Facebook, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <string>
+
+#include <gtest/gtest.h>
+
+#include <folly/portability/Libgen.h>
+
+TEST(Libgen, dirname) {
+  auto doDirname = [](const char* str) -> std::string {
+    auto tmp = strdup(str); // we need a mutable string for dirname.
+    auto ret = std::string(folly::portability::internal_dirname(tmp));
+    free(tmp);
+    return ret;
+  };
+  EXPECT_EQ("/usr", doDirname("/usr/lib"));
+  EXPECT_EQ("/", doDirname("/usr/"));
+  EXPECT_EQ(".", doDirname("usr"));
+  EXPECT_EQ("/", doDirname("/"));
+  EXPECT_EQ(".", doDirname("."));
+  EXPECT_EQ(".", doDirname(".."));
+}