From 0493362ce3a6cb10a034ec55829128a375abde43 Mon Sep 17 00:00:00 2001 From: 3405691582 Date: Wed, 8 Jan 2020 17:24:42 -0500 Subject: [PATCH] [CF] Implement strlcpy and strlcat once in Prefix. strlcpy and strlcat implementations are required for: * LINUX, but not ANDROID nor CYGWIN (since ANDROID and CYGWIN are both LINUX), * WIN32. Instead of implementing strlcpy and strlcat once per TARGET_OS when required, just write the implementation once and modify the conditional. This does mean the ifdef conditional is a little complicated, but overall that is outweighed by the removal of the obvious redundancy and will eventually improve the handling of TARGET_OS_BSD. --- .../Base.subproj/CoreFoundation_Prefix.h | 81 +++++++------------ 1 file changed, 28 insertions(+), 53 deletions(-) diff --git a/CoreFoundation/Base.subproj/CoreFoundation_Prefix.h b/CoreFoundation/Base.subproj/CoreFoundation_Prefix.h index d5fb3ea2db..070cc7e2a9 100644 --- a/CoreFoundation/Base.subproj/CoreFoundation_Prefix.h +++ b/CoreFoundation/Base.subproj/CoreFoundation_Prefix.h @@ -119,6 +119,34 @@ static dispatch_queue_t __ ## PREFIX ## Queue(void) { \ #define CF_RETAIN_BALANCED_ELSEWHERE(obj, identified_location) do { } while (0) #endif +#if (TARGET_OS_LINUX && !TARGET_OS_ANDROID && !TARGET_OS_CYGWIN) || TARGET_OS_WIN32 +CF_INLINE size_t +strlcpy(char * dst, const char * src, size_t maxlen) { + const size_t srclen = strlen(src); + if (srclen < maxlen) { + memcpy(dst, src, srclen+1); + } else if (maxlen != 0) { + memcpy(dst, src, maxlen-1); + dst[maxlen-1] = '\0'; + } + return srclen; +} + +CF_INLINE size_t +strlcat(char * dst, const char * src, size_t maxlen) { + const size_t srclen = strlen(src); + const size_t dstlen = strnlen(dst, maxlen); + if (dstlen == maxlen) return maxlen+srclen; + if (srclen < maxlen-dstlen) { + memcpy(dst+dstlen, src, srclen+1); + } else { + memcpy(dst+dstlen, src, maxlen-dstlen-1); + dst[maxlen-1] = '\0'; + } + return dstlen + srclen; +} +#endif + #if TARGET_OS_WIN32 // Compatibility with boolean.h #if defined(__x86_64__) @@ -152,33 +180,6 @@ typedef int boolean_t; typedef unsigned long fd_mask; #endif -#if !TARGET_OS_ANDROID && !TARGET_OS_CYGWIN && !TARGET_OS_BSD -CF_INLINE size_t -strlcpy(char * dst, const char * src, size_t maxlen) { - const size_t srclen = strlen(src); - if (srclen < maxlen) { - memcpy(dst, src, srclen+1); - } else if (maxlen != 0) { - memcpy(dst, src, maxlen-1); - dst[maxlen-1] = '\0'; - } - return srclen; -} - -CF_INLINE size_t -strlcat(char * dst, const char * src, size_t maxlen) { - const size_t srclen = strlen(src); - const size_t dstlen = strnlen(dst, maxlen); - if (dstlen == maxlen) return maxlen+srclen; - if (srclen < maxlen-dstlen) { - memcpy(dst+dstlen, src, srclen+1); - } else { - memcpy(dst+dstlen, src, maxlen-dstlen-1); - dst[maxlen-1] = '\0'; - } - return dstlen + srclen; -} -#endif #if !TARGET_OS_CYGWIN && !TARGET_OS_BSD #define issetugid() 0 @@ -371,32 +372,6 @@ CF_INLINE long long llabs(long long v) { #define fprintf_l(a,locale,b,...) fprintf(a, b, __VA_ARGS__) -CF_INLINE size_t -strlcpy(char * dst, const char * src, size_t maxlen) { - const size_t srclen = strlen(src); - if (srclen < maxlen) { - memcpy(dst, src, srclen+1); - } else if (maxlen != 0) { - memcpy(dst, src, maxlen-1); - dst[maxlen-1] = '\0'; - } - return srclen; -} - -CF_INLINE size_t -strlcat(char * dst, const char * src, size_t maxlen) { - const size_t srclen = strlen(src); - const size_t dstlen = strnlen(dst, maxlen); - if (dstlen == maxlen) return maxlen+srclen; - if (srclen < maxlen-dstlen) { - memcpy(dst+dstlen, src, srclen+1); - } else { - memcpy(dst+dstlen, src, maxlen-dstlen-1); - dst[maxlen-1] = '\0'; - } - return dstlen + srclen; -} - #define sleep(x) Sleep(1000*x) #define issetugid() 0