aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2012-02-09 12:57:34 +0000
committerCorinna Vinschen <corinna@vinschen.de>2012-02-09 12:57:34 +0000
commit21e4f66a727bd83a324e4b5dd9e52d15b0919672 (patch)
tree0b72e47f6bc9aca33e0feca4cab81962cdfd1552
parent3543a40d5cba339f2637108c1fd2a7e773292a41 (diff)
downloadnewlib-21e4f66a727bd83a324e4b5dd9e52d15b0919672.zip
newlib-21e4f66a727bd83a324e4b5dd9e52d15b0919672.tar.gz
newlib-21e4f66a727bd83a324e4b5dd9e52d15b0919672.tar.bz2
Add missing file from previous checkin
-rw-r--r--newlib/testsuite/newlib.string/strcmp-1.c222
1 files changed, 222 insertions, 0 deletions
diff --git a/newlib/testsuite/newlib.string/strcmp-1.c b/newlib/testsuite/newlib.string/strcmp-1.c
new file mode 100644
index 0000000..81f4a1f
--- /dev/null
+++ b/newlib/testsuite/newlib.string/strcmp-1.c
@@ -0,0 +1,222 @@
+/*
+ * Copyright (c) 2011 ARM Ltd
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. The name of the company may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdarg.h>
+
+#ifndef BUFF_SIZE
+#define BUFF_SIZE 1024
+#endif
+
+#ifndef MAX_BLOCK_SIZE
+#define MAX_BLOCK_SIZE 128
+#endif
+
+#ifndef MAX_OFFSET
+#define MAX_OFFSET 3
+#endif
+
+#ifndef MAX_DIFF
+#define MAX_DIFF 8
+#endif
+
+#ifndef MAX_LEN
+#define MAX_LEN 8
+#endif
+
+#ifndef MAX_ZEROS
+#define MAX_ZEROS 8
+#endif
+
+#if (MAX_OFFSET >= 26)
+#error "MAX_OFFSET >= 26"
+#endif
+
+#if (MAX_OFFSET + MAX_BLOCK_SIZE + MAX_DIFF + MAX_LEN + MAX_ZEROS >= BUFF_SIZE)
+#error "Buffer overrun: MAX_OFFSET + MAX_BLOCK_SIZE + MAX_DIFF + MAX_LEN + MAX_ZEROS >= BUFF_SIZE."
+#endif
+
+
+#define TOO_MANY_ERRORS 11
+int errors = 0;
+
+const char *testname = "strcmp";
+
+void
+print_error (char const* msg, ...)
+{
+ errors++;
+ if (errors == TOO_MANY_ERRORS)
+ {
+ fprintf (stderr, "Too many errors.\n");
+ }
+ else if (errors < TOO_MANY_ERRORS)
+ {
+ va_list ap;
+ va_start (ap, msg);
+ vfprintf (stderr, msg, ap);
+ va_end (ap);
+ }
+ else
+ {
+ /* Further errors omitted. */
+ }
+}
+
+void
+printbuf (char *buf, char *name)
+{
+ int i;
+ printf ("\n %s=", name);
+ for (i = 0; i < BUFF_SIZE; i++)
+ if (buf[i] != 0)
+ printf ("(%d,%c)", i, buf[i]);
+ else
+ printf ("(%d,%s)", i, "\\0");
+ printf ("\n");
+}
+
+int
+main (void)
+{
+ /* Allocate buffers to read and write from. */
+ char src[BUFF_SIZE], dest[BUFF_SIZE];
+
+ /* Fill the source buffer with non-null values, reproducable random data. */
+ srand (1539);
+ int i, j, zeros;
+ unsigned sa;
+ unsigned da;
+ unsigned n, m, len;
+ char *p;
+ int ret;
+
+ /* Make calls to strcmp with block sizes ranging between 1 and
+ MAX_BLOCK_SIZE bytes, aligned and misaligned source and destination. */
+ for (sa = 0; sa <= MAX_OFFSET; sa++)
+ for (da = 0; da <= MAX_OFFSET; da++)
+ for (n = 1; n <= MAX_BLOCK_SIZE; n++)
+ {
+ for (m = 1; m < n + MAX_DIFF; m++)
+ for (len = 0; len < MAX_LEN; len++)
+ for (zeros = 1; zeros < MAX_ZEROS; zeros++)
+ {
+ if (n - m > MAX_DIFF)
+ continue;
+ /* Make a copy of the source. */
+ for (i = 0; i < BUFF_SIZE; i++)
+ {
+ src[i] = 'A' + (i % 26);
+ dest[i] = src[i];
+ }
+ memcpy (dest + da, src + sa, n);
+
+ /* Make src 0-terminated. */
+ p = src + sa + n - 1;
+ for (i = 0; i < zeros; i++)
+ {
+ *p++ = '\0';
+ }
+
+ /* Modify dest. */
+ p = dest + da + m - 1;
+ for (j = 0; j < len; j++)
+ *p++ = 'x';
+ /* Make dest 0-terminated. */
+ *p = '\0';
+
+ ret = strcmp (src + sa, dest + da);
+
+ /* Check return value. */
+ if (n == m)
+ {
+ if (len == 0)
+ {
+ if (ret != 0)
+ {
+ print_error ("\nFailed: after %s of %u bytes "
+ "with src_align %u and dst_align %u, "
+ "dest after %d bytes is modified for %d bytes, "
+ "return value is %d, expected 0.\n",
+ testname, n, sa, da, m, len, ret);
+ }
+ }
+ else
+ {
+ if (ret >= 0)
+ print_error ("\nFailed: after %s of %u bytes "
+ "with src_align %u and dst_align %u, "
+ "dest after %d bytes is modified for %d bytes, "
+ "return value is %d, expected negative.\n",
+ testname, n, sa, da, m, len, ret);
+ }
+ }
+ else if (m > n)
+ {
+ if (ret >= 0)
+ {
+ print_error ("\nFailed: after %s of %u bytes "
+ "with src_align %u and dst_align %u, "
+ "dest after %d bytes is modified for %d bytes, "
+ "return value is %d, expected negative.\n",
+ testname, n, sa, da, m, len, ret);
+ }
+ }
+ else /* m < n */
+ {
+ if (len == 0)
+ {
+ if (ret <= 0)
+ print_error ("\nFailed: after %s of %u bytes "
+ "with src_align %u and dst_align %u, "
+ "dest after %d bytes is modified for %d bytes, "
+ "return value is %d, expected positive.\n",
+ testname, n, sa, da, m, len, ret);
+ }
+ else
+ {
+ if (ret >= 0)
+ print_error ("\nFailed: after %s of %u bytes "
+ "with src_align %u and dst_align %u, "
+ "dest after %d bytes is modified for %d bytes, "
+ "return value is %d, expected negative.\n",
+ testname, n, sa, da, m, len, ret);
+ }
+ }
+ }
+ }
+ printf ("\n");
+ if (errors != 0)
+ {
+ printf ("ERROR. FAILED.\n");
+ abort ();
+ }
+ exit (0);
+}