Commit 8ff7c8b8 authored by Christopher Dykes's avatar Christopher Dykes Committed by Facebook Github Bot 4

Create the string.h portability header

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
parent fe33916f
...@@ -274,6 +274,7 @@ nobase_follyinclude_HEADERS = \ ...@@ -274,6 +274,7 @@ nobase_follyinclude_HEADERS = \
portability/GFlags.h \ portability/GFlags.h \
portability/IOVec.h \ portability/IOVec.h \
portability/Memory.h \ portability/Memory.h \
portability/String.h \
portability/Strings.h \ portability/Strings.h \
portability/Syscall.h \ portability/Syscall.h \
portability/SysFile.h \ portability/SysFile.h \
...@@ -413,6 +414,7 @@ libfolly_la_SOURCES = \ ...@@ -413,6 +414,7 @@ libfolly_la_SOURCES = \
MacAddress.cpp \ MacAddress.cpp \
MemoryMapping.cpp \ MemoryMapping.cpp \
portability/Environment.cpp \ portability/Environment.cpp \
portability/String.cpp \
portability/Strings.cpp \ portability/Strings.cpp \
portability/SysFile.cpp \ portability/SysFile.cpp \
portability/SysMman.cpp \ portability/SysMman.cpp \
......
...@@ -20,10 +20,11 @@ ...@@ -20,10 +20,11 @@
#ifndef FOLLY_RANGE_H_ #ifndef FOLLY_RANGE_H_
#define FOLLY_RANGE_H_ #define FOLLY_RANGE_H_
#include <folly/Portability.h>
#include <folly/FBString.h> #include <folly/FBString.h>
#include <folly/Portability.h>
#include <folly/SpookyHashV2.h> #include <folly/SpookyHashV2.h>
#include <folly/portability/Constexpr.h> #include <folly/portability/Constexpr.h>
#include <folly/portability/String.h>
#include <algorithm> #include <algorithm>
#include <boost/operators.hpp> #include <boost/operators.hpp>
...@@ -1085,14 +1086,12 @@ inline size_t qfind(const Range<const char*>& haystack, const char& needle) { ...@@ -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(); return pos == nullptr ? std::string::npos : pos - haystack.data();
} }
#if FOLLY_HAVE_MEMRCHR
template <> template <>
inline size_t rfind(const Range<const char*>& haystack, const char& needle) { inline size_t rfind(const Range<const char*>& haystack, const char& needle) {
auto pos = static_cast<const char*>( auto pos = static_cast<const char*>(
::memrchr(haystack.data(), needle, haystack.size())); ::memrchr(haystack.data(), needle, haystack.size()));
return pos == nullptr ? std::string::npos : pos - haystack.data(); return pos == nullptr ? std::string::npos : pos - haystack.data();
} }
#endif
// specialization for ByteRange // specialization for ByteRange
template <> template <>
...@@ -1103,7 +1102,6 @@ inline size_t qfind(const Range<const unsigned char*>& haystack, ...@@ -1103,7 +1102,6 @@ inline size_t qfind(const Range<const unsigned char*>& haystack,
return pos == nullptr ? std::string::npos : pos - haystack.data(); return pos == nullptr ? std::string::npos : pos - haystack.data();
} }
#if FOLLY_HAVE_MEMRCHR
template <> template <>
inline size_t rfind(const Range<const unsigned char*>& haystack, inline size_t rfind(const Range<const unsigned char*>& haystack,
const unsigned char& needle) { const unsigned char& needle) {
...@@ -1111,7 +1109,6 @@ inline size_t rfind(const Range<const unsigned char*>& haystack, ...@@ -1111,7 +1109,6 @@ inline size_t rfind(const Range<const unsigned char*>& haystack,
::memrchr(haystack.data(), needle, haystack.size())); ::memrchr(haystack.data(), needle, haystack.size()));
return pos == nullptr ? std::string::npos : pos - haystack.data(); return pos == nullptr ? std::string::npos : pos - haystack.data();
} }
#endif
template <class T> template <class T>
size_t qfind_first_of(const Range<T>& haystack, size_t qfind_first_of(const Range<T>& haystack,
......
/*
* 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
/*
* 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
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment