Skip to content

Commit

Permalink
Add stpncpy() support
Browse files Browse the repository at this point in the history
Imports Apple's stpncpy.c verbatim from Libc-825.24.

Removes 'restrict' qualifiers for pre-C99 compatibility.

Fixes whitespace; adds modification notice and proper build
conditional.

Updates the legacy-support headers.

Updates the README.

Closes: https://trac.macports.org/ticket/69571

TESTED:
Tested on 10.4-10.5 ppc, 10.4-10.6 i386, 10.5-10.6 ppc (i386 Rosetta),
10.5-12.x x86_64, 11.x-14.x arm64.
Passes all tests, including newly added stpncpy() tests.
  • Loading branch information
fhgwright authored and kencu committed Apr 7, 2024
1 parent f457175 commit 12a4dca
Show file tree
Hide file tree
Showing 4 changed files with 75 additions and 1 deletion.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ Wrapped headers and replaced functions are:
</tr>
<tr>
<td><code>string.h</code></td>
<td>Adds <code>strnlen</code>, <code>strndup</code> and <code>memmem</code> functions</td>
<td>Adds <code>stpncpy</code>, <code>strnlen</code>, <code>strndup</code> and <code>memmem</code> functions</td>
<td>OSX10.6</td>
</tr>
<tr>
Expand Down
3 changes: 3 additions & 0 deletions include/MacportsLegacySupport.h
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,9 @@
/* CMSG_DATA definition in <sys/socket.h> */
#define __MP_LEGACY_SUPPORT_CMSG_DATA_FIX__ (__APPLE__ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1060)

/* stpncpy */
#define __MP_LEGACY_SUPPORT_STPNCPY__ (__APPLE__ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1070)

/* strnlen */
#define __MP_LEGACY_SUPPORT_STRNLEN__ (__APPLE__ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1070)

Expand Down
7 changes: 7 additions & 0 deletions include/string.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,13 @@
/* Include the primary system string.h */
#include_next <string.h>

/* stpncpy */
#if __MP_LEGACY_SUPPORT_STPNCPY__
__MP__BEGIN_DECLS
extern char *stpncpy(char *dst, const char *src, size_t n);
__MP__END_DECLS
#endif

/* strnlen */
#if __MP_LEGACY_SUPPORT_STRNLEN__
__MP__BEGIN_DECLS
Expand Down
64 changes: 64 additions & 0 deletions src/stpncpy.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
/*
* Copyright (c) 2011 Apple, Inc. All rights reserved.
*
* @APPLE_LICENSE_HEADER_START@
*
* This file contains Original Code and/or Modifications of Original Code
* as defined in and that are subject to the Apple Public Source License
* Version 2.0 (the 'License'). You may not use this file except in
* compliance with the License. Please obtain a copy of the License at
* http://www.opensource.apple.com/apsl/ and read it before using this
* file.
*
* The Original Code and all software distributed under the License are
* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
* EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
* INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
* Please see the License for the specific language governing rights and
* limitations under the License.
*
* @APPLE_LICENSE_HEADER_END@
*/

/*
* NOTICE: This file was modified in April 2024 to allow
* for use as a supporting file for MacPorts legacy support library. This notice
* is included in support of clause 2.2 (b) of the Apple Public License,
* Version 2.0.
*
* The code is almost verbatim from Apple except for the removal of the
* 'restrict' qualifiers for compatibility with pre-C99 compilers.
*/

/* MP support header */
#include "MacportsLegacySupport.h"
#if __MP_LEGACY_SUPPORT_STPNCPY__

#include <string.h>

char *
stpncpy(char * dst, const char * src, size_t maxlen) {
const size_t srclen = strnlen(src, maxlen);
if (srclen < maxlen) {
// The stpncpy() and strncpy() functions copy at most maxlen
// characters from src into dst.
memcpy(dst, src, srclen);
// If src is less than maxlen characters long, the remainder
// of dst is filled with '\0' characters.
memset(dst+srclen, 0, maxlen-srclen);
// The stpcpy() and stpncpy() functions return a pointer to the
// terminating '\0' character of dst.
return dst+srclen;
} else {
// The stpncpy() and strncpy() functions copy at most maxlen
// characters from src into dst.
memcpy(dst, src, maxlen);
// If stpncpy() does not terminate dst with a NUL character, it
// instead returns a pointer to src[maxlen] (which does not
// necessarily refer to a valid memory location.)
return dst+maxlen;
}
}

#endif /* __MP_LEGACY_SUPPORT_STPNCPY__ */

0 comments on commit 12a4dca

Please sign in to comment.