<pre style='margin:0'>
Ken (kencu) pushed a commit to branch master
in repository macports-legacy-support.

</pre>
<p><a href="https://github.com/macports/macports-legacy-support/commit/a1d860f5201384fc81c6f28e71b0507033377849">https://github.com/macports/macports-legacy-support/commit/a1d860f5201384fc81c6f28e71b0507033377849</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit a1d860f5201384fc81c6f28e71b0507033377849
</span>Author: Fred Wright <fw@fwright.net>
AuthorDate: Sun Apr 7 00:09:41 2024 -0700

<span style='display:block; white-space:pre;color:#404040;'>    Add tests for stpncpy()
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    TESTED:
</span><span style='display:block; white-space:pre;color:#404040;'>    Tested on 10.4-10.5 ppc, 10.4-10.6 i386, 10.5-10.6 ppc (i386 Rosetta),
</span><span style='display:block; white-space:pre;color:#404040;'>    10.5-12.x x86_64, 11.x-14.x arm64.
</span><span style='display:block; white-space:pre;color:#404040;'>    Fails on <10.7 without added stpncpy(); passes with.
</span>---
 test/test_stpncpy.c | 103 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 103 insertions(+)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/test/test_stpncpy.c b/test/test_stpncpy.c
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 0000000..e2c37b9
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/test/test_stpncpy.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,103 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Copyright (c) 2024 Frederick H. G. Wright II <fw@fwright.net>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Permission to use, copy, modify, and distribute this software for any
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * purpose with or without fee is hereby granted, provided that the above
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * copyright notice and this permission notice appear in all copies.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * This provides rudimentary tests for stpncpy().  Given that
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * the implementation is taken almost verbatim from Apple's code for 10.7+,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * exhaustive testing of corner cases shouldn't be necessary.  This just
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * tests a few cases, primarily to verify that the function can be used at all
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * (which is not true prior to 10.7 without this package), though the framework
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * should be valid for all possible test cases.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <assert.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <errno.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <string.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+const char *test_str = "The Quick Brown Fox";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define BUF_LEN 128  /* Generously longer than test_str */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static int save_errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static char *save_ret;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static char dest[BUF_LEN], save_dest[BUF_LEN];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Reference implementation of stpncpy() */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static char *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ref_stpncpy(char *dst, const char *src, size_t n)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  char *ret;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  if (n <= 0) return dst;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  while (n) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if ((*dst++ = *src++) == 0) break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    --n;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  ret = dst - 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  while (n--) *dst++ = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  return *ret ? ret + 1 : ret;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Setup prior to test case */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+setup(void)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  errno = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  memset(dest, -1, BUF_LEN);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Save all results from first version */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+save(char *ret)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  save_errno = errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  save_ret = ret;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  memcpy(save_dest, dest, BUF_LEN);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Compare results from both versions */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+check(char *ret)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  assert(errno == save_errno);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  assert(ret == save_ret);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  assert(memcmp(save_dest, dest, BUF_LEN) == 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Run one test case */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+test_stpncpy(char *dst, const char *src, size_t n)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  setup();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  save(ref_stpncpy(dst, src, n));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  check(stpncpy(dst, src, n));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+main(int argc, char *argv[])
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  int test_len = strlen(test_str);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  int n;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  (void) argc; (void) argv;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  for (n = test_len - 2; n <= test_len + 2; ++n) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    test_stpncpy(&dest[1], test_str, n);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  return 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span></pre><pre style='margin:0'>

</pre>