diff options
author | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2019-08-26 17:11:28 -0300 |
---|---|---|
committer | Szabolcs Nagy <30925343+nsz-arm@users.noreply.github.com> | 2019-08-28 12:05:23 +0100 |
commit | 937837848ad7311ae91277658ad26b5dcba6a9e5 (patch) | |
tree | 7ce261ae528b843859a6a1fda5e5bfe0b6f3abbc /string/test | |
parent | 355403c3bd5ef7eb1ea1a43f3b216a90a4c975bf (diff) | |
download | arm-optimized-routines-937837848ad7311ae91277658ad26b5dcba6a9e5.tar.gz |
Add strrchr test
Diffstat (limited to 'string/test')
-rw-r--r-- | string/test/strrchr.c | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/string/test/strrchr.c b/string/test/strrchr.c new file mode 100644 index 0000000..54c87b4 --- /dev/null +++ b/string/test/strrchr.c @@ -0,0 +1,92 @@ +/* + * strrchr test. + * + * Copyright (c) 2019, Arm Limited. + * SPDX-License-Identifier: MIT + */ + +#include <stdint.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <limits.h> +#include "stringlib.h" + +static const struct fun +{ + const char *name; + char *(*fun)(const char *s, int c); +} funtab[] = { +#define F(x) {#x, x}, +F(strrchr) +#undef F + {0, 0} +}; + +static int test_status; +#define ERR(...) (test_status=1, printf(__VA_ARGS__)) + +#define A 32 +#define SP 512 +#define LEN 250000 +static char sbuf[LEN+2*A]; + +static void *alignup(void *p) +{ + return (void*)(((uintptr_t)p + A-1) & -A); +} + +static void test(const struct fun *fun, int align, int seekpos, int len) +{ + char *src = alignup(sbuf); + char *s = src + align; + char *f = seekpos != -1 ? s + seekpos : 0; + int seekchar = 0x1; + void *p; + + if (len > LEN || seekpos >= len - 1 || align >= A) + abort(); + if (seekchar >= 'a' && seekchar <= 'a' + 23) + abort(); + + for (int i = 0; i < len + A; i++) + src[i] = '?'; + for (int i = 0; i < len - 2; i++) + s[i] = 'a' + i%23; + if (seekpos != -1) + s[seekpos/2] = s[seekpos] = seekchar; + s[len - 1] = '\0'; + + p = fun->fun(s, seekchar); + + if (p != f) { + ERR("%s(%p,0x%02x,%d) returned %p\n", fun->name, s, seekchar, len, p); + ERR("expected: %p\n", f); + abort(); + } +} + +int main() +{ + int r = 0; + for (int i=0; funtab[i].name; i++) { + test_status = 0; + for (int a = 0; a < A; a++) { + int n; + for (n = 1; n < 100; n++) { + for (int sp = 0; sp < n - 1; sp++) + test(funtab+i, a, sp, n); + test(funtab+i, a, -1, n); + } + for (; n < LEN; n *= 2) { + test(funtab+i, a, -1, n); + test(funtab+i, a, n / 2, n); + } + } + if (test_status) { + r = -1; + ERR("FAIL %s\n", funtab[i].name); + } + } + return r; +} |