blob: 5382fd9503e0428625acc9475b78b44e56c81a8c [file] [log] [blame]
Adhemerval Zanella79618e02019-08-07 09:54:33 -03001/*
2 * strncmp test.
3 *
4 * Copyright (c) 2019, Arm Limited.
5 * SPDX-License-Identifier: MIT
6 */
7
8#include <stdint.h>
9#include <stdio.h>
10#include <stdlib.h>
11#include <string.h>
12#include "stringlib.h"
13
14static const struct fun
15{
16 const char *name;
17 int (*fun)(const char *, const char *, size_t);
18} funtab[] = {
19#define F(x) {#x, x},
20F(strncmp)
Adhemerval Zanella23b9fc52019-08-07 10:31:33 -030021#if __aarch64__
22F(__strncmp_aarch64)
23#endif
Adhemerval Zanella79618e02019-08-07 09:54:33 -030024#undef F
25 {0, 0}
26};
27
28static int test_status;
29#define ERR(...) (test_status=1, printf(__VA_ARGS__))
30
31#define A 32
32#define LEN 250000
33static char s1buf[LEN+2*A];
34static char s2buf[LEN+2*A];
35
36static void *alignup(void *p)
37{
38 return (void*)(((uintptr_t)p + A-1) & -A);
39}
40
41static void test(const struct fun *fun, int s1align, int s2align, int maxlen, int diffpos, int len)
42{
43 char *src1 = alignup(s1buf);
44 char *src2 = alignup(s2buf);
45 char *s1 = src1 + s1align;
46 char *s2 = src2 + s2align;
47 int r;
48
49 if (len > LEN || s1align >= A || s2align >= A)
50 abort();
51 if (diffpos > 1 && diffpos >= len-1)
52 abort();
53
54 for (int i = 0; i < len+A; i++)
55 src1[i] = src2[i] = '?';
56 for (int i = 0; i < len-1; i++)
57 s1[i] = s2[i] = 'a' + i%23;
58 if (diffpos > 1)
59 s1[diffpos]++;
60 s1[len] = s2[len] = '\0';
61
62 r = fun->fun(s1, s2, maxlen);
63
64 diffpos = maxlen <= diffpos ? 0 : diffpos;
65
66 if (((diffpos <= 1) && r != 0) || (diffpos > 1 && r == 0)) {
67 ERR("%s(align %d, align %d, %d (%d)) failed, returned %d (%d)\n",
68 fun->name, s1align, s2align, maxlen, len, r, diffpos);
69 ERR("src1: %.*s\n", s1align+len+1, src1);
70 ERR("src2: %.*s\n", s2align+len+1, src2);
71 }
72}
73
74int main()
75{
76 int r = 0;
77 for (int i=0; funtab[i].name; i++) {
78 test_status = 0;
79 for (int d = 0; d < A; d++)
80 for (int s = 0; s < A; s++) {
81 int n;
82 for (n = 0; n < 100; n++) {
83 test(funtab+i, d, s, n, 0, n);
84 test(funtab+i, d, s, n, n/2, n);
85 test(funtab+i, d, s, n/2, 0, n);
86 test(funtab+i, d, s, n/2, n/2, n);
87 }
88 for (; n < LEN; n *= 2) {
89 test(funtab+i, d, s, n, 0, n);
90 test(funtab+i, d, s, n, n/2, n);
91 test(funtab+i, d, s, n/2, 0, n);
92 test(funtab+i, d, s, n/2, n/2, n);
93 }
94 }
95 if (test_status) {
96 r = -1;
97 ERR("FAIL %s\n", funtab[i].name);
98 }
99 }
100 return r;
101}