Skip to content

Commit 0493362

Browse files
committed
[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.
1 parent 1a72fc8 commit 0493362

File tree

1 file changed

+28
-53
lines changed

1 file changed

+28
-53
lines changed

CoreFoundation/Base.subproj/CoreFoundation_Prefix.h

Lines changed: 28 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,34 @@ static dispatch_queue_t __ ## PREFIX ## Queue(void) { \
119119
#define CF_RETAIN_BALANCED_ELSEWHERE(obj, identified_location) do { } while (0)
120120
#endif
121121

122+
#if (TARGET_OS_LINUX && !TARGET_OS_ANDROID && !TARGET_OS_CYGWIN) || TARGET_OS_WIN32
123+
CF_INLINE size_t
124+
strlcpy(char * dst, const char * src, size_t maxlen) {
125+
const size_t srclen = strlen(src);
126+
if (srclen < maxlen) {
127+
memcpy(dst, src, srclen+1);
128+
} else if (maxlen != 0) {
129+
memcpy(dst, src, maxlen-1);
130+
dst[maxlen-1] = '\0';
131+
}
132+
return srclen;
133+
}
134+
135+
CF_INLINE size_t
136+
strlcat(char * dst, const char * src, size_t maxlen) {
137+
const size_t srclen = strlen(src);
138+
const size_t dstlen = strnlen(dst, maxlen);
139+
if (dstlen == maxlen) return maxlen+srclen;
140+
if (srclen < maxlen-dstlen) {
141+
memcpy(dst+dstlen, src, srclen+1);
142+
} else {
143+
memcpy(dst+dstlen, src, maxlen-dstlen-1);
144+
dst[maxlen-1] = '\0';
145+
}
146+
return dstlen + srclen;
147+
}
148+
#endif
149+
122150
#if TARGET_OS_WIN32
123151
// Compatibility with boolean.h
124152
#if defined(__x86_64__)
@@ -152,33 +180,6 @@ typedef int boolean_t;
152180
typedef unsigned long fd_mask;
153181
#endif
154182

155-
#if !TARGET_OS_ANDROID && !TARGET_OS_CYGWIN && !TARGET_OS_BSD
156-
CF_INLINE size_t
157-
strlcpy(char * dst, const char * src, size_t maxlen) {
158-
const size_t srclen = strlen(src);
159-
if (srclen < maxlen) {
160-
memcpy(dst, src, srclen+1);
161-
} else if (maxlen != 0) {
162-
memcpy(dst, src, maxlen-1);
163-
dst[maxlen-1] = '\0';
164-
}
165-
return srclen;
166-
}
167-
168-
CF_INLINE size_t
169-
strlcat(char * dst, const char * src, size_t maxlen) {
170-
const size_t srclen = strlen(src);
171-
const size_t dstlen = strnlen(dst, maxlen);
172-
if (dstlen == maxlen) return maxlen+srclen;
173-
if (srclen < maxlen-dstlen) {
174-
memcpy(dst+dstlen, src, srclen+1);
175-
} else {
176-
memcpy(dst+dstlen, src, maxlen-dstlen-1);
177-
dst[maxlen-1] = '\0';
178-
}
179-
return dstlen + srclen;
180-
}
181-
#endif
182183

183184
#if !TARGET_OS_CYGWIN && !TARGET_OS_BSD
184185
#define issetugid() 0
@@ -371,32 +372,6 @@ CF_INLINE long long llabs(long long v) {
371372

372373
#define fprintf_l(a,locale,b,...) fprintf(a, b, __VA_ARGS__)
373374

374-
CF_INLINE size_t
375-
strlcpy(char * dst, const char * src, size_t maxlen) {
376-
const size_t srclen = strlen(src);
377-
if (srclen < maxlen) {
378-
memcpy(dst, src, srclen+1);
379-
} else if (maxlen != 0) {
380-
memcpy(dst, src, maxlen-1);
381-
dst[maxlen-1] = '\0';
382-
}
383-
return srclen;
384-
}
385-
386-
CF_INLINE size_t
387-
strlcat(char * dst, const char * src, size_t maxlen) {
388-
const size_t srclen = strlen(src);
389-
const size_t dstlen = strnlen(dst, maxlen);
390-
if (dstlen == maxlen) return maxlen+srclen;
391-
if (srclen < maxlen-dstlen) {
392-
memcpy(dst+dstlen, src, srclen+1);
393-
} else {
394-
memcpy(dst+dstlen, src, maxlen-dstlen-1);
395-
dst[maxlen-1] = '\0';
396-
}
397-
return dstlen + srclen;
398-
}
399-
400375
#define sleep(x) Sleep(1000*x)
401376

402377
#define issetugid() 0

0 commit comments

Comments
 (0)