| Index: runtime/platform/globals.h
|
| ===================================================================
|
| --- runtime/platform/globals.h (revision 21320)
|
| +++ runtime/platform/globals.h (working copy)
|
| @@ -396,6 +396,36 @@
|
| }
|
|
|
|
|
| +// Some platforms do not support strndup. We add it below as necessary.
|
| +#if defined(TARGET_OS_MACOS)
|
| +// strndup has only been added to Mac OS X in 10.7. We are supplying
|
| +// our own copy here.
|
| +#if !defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) || \
|
| + __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ <= 1060
|
| +#define NEEDS_STRNDUP 1
|
| +#endif // !defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__)
|
| +#elif defined(TARGET_OS_WINDOWS)
|
| +#define NEEDS_STRNDUP 1
|
| +#endif // defined(TARGET_OS_MACOS)
|
| +
|
| +#if defined(NEEDS_STRNDUP)
|
| +// size_t used to match function signature on other platforms.
|
| +inline char* strndup(const char* s, size_t n) {
|
| + size_t len = strlen(s);
|
| + if (n < len) {
|
| + len = n;
|
| + }
|
| + char* result = reinterpret_cast<char*>(malloc(len + 1));
|
| + if (!result) {
|
| + return NULL;
|
| + }
|
| + result[len] = '\0';
|
| + return reinterpret_cast<char*>(memcpy(result, s, len));
|
| +}
|
| +#endif // defined(NEEDS_STRNDUP)
|
| +#undef NEEDS_STRNDUP
|
| +
|
| +
|
| // A macro to ensure that memcpy cannot be called. memcpy does not handle
|
| // overlapping memory regions. Even though this is well documented it seems
|
| // to be used in error quite often. To avoid problems we disallow the direct
|
|
|