diff options
author | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2019-08-06 10:09:38 -0300 |
---|---|---|
committer | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2019-08-23 10:21:31 -0300 |
commit | 55f5ba4ae304ec1dea173142172afde372d61418 (patch) | |
tree | 23b8c7c69e97337f274d3b0a622c1055fc3040c2 /string/test/strcpy.c | |
parent | 3686cdf965642cc30d917562fa48e996d870838b (diff) | |
download | arm-optimized-routines-55f5ba4ae304ec1dea173142172afde372d61418.tar.gz |
Add strcpy test
Diffstat (limited to 'string/test/strcpy.c')
-rw-r--r-- | string/test/strcpy.c | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/string/test/strcpy.c b/string/test/strcpy.c new file mode 100644 index 0000000..5f5c952 --- /dev/null +++ b/string/test/strcpy.c @@ -0,0 +1,92 @@ +/* + * strcpy test. + * + * Copyright (c) 2019, Arm Limited. + * SPDX-License-Identifier: MIT + */ + +#include <stdint.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include "stringlib.h" + +static const struct fun +{ + const char *name; + char *(*fun)(char *dest, const char *src); +} funtab[] = { +#define F(x) {#x, x}, +F(strcpy) +#undef F + {0, 0} +}; + +static int test_status; +#define ERR(...) (test_status=1, printf(__VA_ARGS__)) + +#define A 32 +#define LEN 250000 +static char dbuf[LEN+2*A]; +static char sbuf[LEN+2*A]; +static char wbuf[LEN+2*A]; + +static void *alignup(void *p) +{ + return (void*)(((uintptr_t)p + A-1) & -A); +} + +static void test(const struct fun *fun, int dalign, int salign, int len) +{ + char *src = alignup(sbuf); + char *dst = alignup(dbuf); + char *want = wbuf; + char *s = src + salign; + char *d = dst + dalign; + char *w = want + dalign; + void *p; + int i; + + if (len > LEN || dalign >= A || salign >= A) + abort(); + for (i = 0; i < len+A; i++) { + src[i] = '?'; + want[i] = dst[i] = '*'; + } + for (i = 0; i < len-1; i++) + s[i] = w[i] = 'a' + i%23; + s[i] = w[i] = '\0'; + + p = fun->fun(d, s); + if (p != d) + ERR("%s(%p,..) returned %p\n", fun->name, d, p); + for (i = 0; i < len+A; i++) { + if (dst[i] != want[i]) { + ERR("%s(align %d, align %d, %d) failed\n", fun->name, dalign, salign, len); + ERR("got : %.*s\n", dalign+len+1, dst); + ERR("want: %.*s\n", dalign+len+1, want); + break; + } + } +} + +int main() +{ + int r = 0; + for (int i=0; funtab[i].name; i++) { + test_status = 0; + for (int d = 0; d < A; d++) + for (int s = 0; s < A; s++) { + int n; + for (n = 0; n < 100; n++) + test(funtab+i, d, s, n); + for (; n < LEN; n *= 2) + test(funtab+i, d, s, n); + } + if (test_status) { + r = -1; + ERR("FAIL %s\n", funtab[i].name); + } + } + return r; +} |