Create the string.h portability header
authorChristopher Dykes <cdykes@fb.com>
Mon, 28 Mar 2016 18:22:53 +0000 (11:22 -0700)
committerFacebook Github Bot 4 <facebook-github-bot-4-bot@fb.com>
Mon, 28 Mar 2016 18:35:28 +0000 (11:35 -0700)
Summary: Windows has it, but some things aren't there, and some have different names.

Reviewed By: yfeldblum

Differential Revision: D2990475

fb-gh-sync-id: 3f30e084eb7789c13b3981ec0fbf5b7b642c3367
fbshipit-source-id: 3f30e084eb7789c13b3981ec0fbf5b7b642c3367

folly/Makefile.am
folly/Range.h
folly/portability/String.cpp [new file with mode: 0755]
folly/portability/String.h [new file with mode: 0755]

index 0f8915a1744e010f72311f0722d709f7e5a74ec9..e421304b6aba307c633cf6c2750b73d89e123085 100644 (file)
@@ -274,6 +274,7 @@ nobase_follyinclude_HEADERS = \
        portability/GFlags.h \
        portability/IOVec.h \
        portability/Memory.h \
+       portability/String.h \
        portability/Strings.h \
        portability/Syscall.h \
        portability/SysFile.h \
@@ -413,6 +414,7 @@ libfolly_la_SOURCES = \
        MacAddress.cpp \
        MemoryMapping.cpp \
        portability/Environment.cpp \
+       portability/String.cpp \
        portability/Strings.cpp \
        portability/SysFile.cpp \
        portability/SysMman.cpp \
index d42fe54872cee5b29454a6f80c82bebfc6c89c97..4913aef403580330a3609e474ff315791913273e 100644 (file)
 #ifndef FOLLY_RANGE_H_
 #define FOLLY_RANGE_H_
 
-#include <folly/Portability.h>
 #include <folly/FBString.h>
+#include <folly/Portability.h>
 #include <folly/SpookyHashV2.h>
 #include <folly/portability/Constexpr.h>
+#include <folly/portability/String.h>
 
 #include <algorithm>
 #include <boost/operators.hpp>
@@ -1085,14 +1086,12 @@ inline size_t qfind(const Range<const char*>& haystack, const char& needle) {
   return pos == nullptr ? std::string::npos : pos - haystack.data();
 }
 
-#if FOLLY_HAVE_MEMRCHR
 template <>
 inline size_t rfind(const Range<const char*>& haystack, const char& needle) {
   auto pos = static_cast<const char*>(
     ::memrchr(haystack.data(), needle, haystack.size()));
   return pos == nullptr ? std::string::npos : pos - haystack.data();
 }
-#endif
 
 // specialization for ByteRange
 template <>
@@ -1103,7 +1102,6 @@ inline size_t qfind(const Range<const unsigned char*>& haystack,
   return pos == nullptr ? std::string::npos : pos - haystack.data();
 }
 
-#if FOLLY_HAVE_MEMRCHR
 template <>
 inline size_t rfind(const Range<const unsigned char*>& haystack,
                     const unsigned char& needle) {
@@ -1111,7 +1109,6 @@ inline size_t rfind(const Range<const unsigned char*>& haystack,
     ::memrchr(haystack.data(), needle, haystack.size()));
   return pos == nullptr ? std::string::npos : pos - haystack.data();
 }
-#endif
 
 template <class T>
 size_t qfind_first_of(const Range<T>& haystack,
diff --git a/folly/portability/String.cpp b/folly/portability/String.cpp
new file mode 100755 (executable)
index 0000000..eae93f5
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ * 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/String.h>
+
+#if !FOLLY_HAVE_MEMRCHR || defined(_WIN32) || defined(__APPLE__)
+extern "C" void* memrchr(const void* s, int c, size_t n) {
+  for (auto p = ((const char*)s) + n - 1; p >= (const char*)s; p--) {
+    if (*p == (char)c) {
+      return (void*)p;
+    }
+  }
+  return nullptr;
+}
+#endif
+
+#ifdef _WIN32
+#include <stdlib.h>
+
+extern "C" {
+char* strndup(const char* a, size_t len) {
+  auto neededLen = strlen(a);
+  if (neededLen > len) {
+    neededLen = len - 1;
+  }
+  char* buf = (char*)malloc((neededLen + 1) * sizeof(char));
+  memcpy(buf, a, neededLen);
+  buf[neededLen] = '\0';
+  return buf;
+}
+
+char* strtok_r(char* str, char const* delim, char** ctx) {
+  return strtok_s(str, delim, ctx);
+}
+}
+#endif
diff --git a/folly/portability/String.h b/folly/portability/String.h
new file mode 100755 (executable)
index 0000000..5dd8a65
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * 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
+
+#include <string.h>
+
+#include <folly/portability/Config.h>
+
+#if !FOLLY_HAVE_MEMRCHR || defined(_WIN32) || defined(__APPLE__)
+#include <stdint.h>
+extern "C" void* memrchr(const void* s, int c, size_t n);
+#endif
+
+#ifdef _WIN32
+extern "C" {
+char* strndup(const char* a, size_t len);
+char* strtok_r(char* str, char const* delim, char** ctx);
+}
+#endif