blob: 8535686e3a0d32a6f50ada862d628bee6bd43f10 [file] [log] [blame]
Adhemerval Zanellace6e5d62019-08-06 15:20:32 -03001/*
2 * strchr test.
3 *
Wilco Dijkstra620b09f2020-05-22 15:30:59 +01004 * Copyright (c) 2019-2020, Arm Limited.
Adhemerval Zanellace6e5d62019-08-06 15:20:32 -03005 * SPDX-License-Identifier: MIT
6 */
7
8#include <stdint.h>
9#include <stdio.h>
10#include <stdlib.h>
11#include <string.h>
12#include <limits.h>
13#include "stringlib.h"
Szabolcs Nagy22fd9312020-04-16 11:46:02 +010014#include "stringtest.h"
Adhemerval Zanellace6e5d62019-08-06 15:20:32 -030015
Szabolcs Nagy0b7d1ae2020-05-12 16:40:08 +010016#define F(x) {#x, x},
17
Adhemerval Zanellace6e5d62019-08-06 15:20:32 -030018static const struct fun
19{
Szabolcs Nagy0b7d1ae2020-05-12 16:40:08 +010020 const char *name;
21 char *(*fun) (const char *s, int c);
Adhemerval Zanellace6e5d62019-08-06 15:20:32 -030022} funtab[] = {
Szabolcs Nagy0b7d1ae2020-05-12 16:40:08 +010023 // clang-format off
24 F(strchr)
Adhemerval Zanellab6b6ee02019-08-06 15:25:30 -030025#if __aarch64__
Szabolcs Nagy0b7d1ae2020-05-12 16:40:08 +010026 F(__strchr_aarch64)
27 F(__strchr_aarch64_mte)
Adhemerval Zanellafbe165c2019-08-26 16:08:53 -030028# if __ARM_FEATURE_SVE
Szabolcs Nagy0b7d1ae2020-05-12 16:40:08 +010029 F(__strchr_aarch64_sve)
Adhemerval Zanellafbe165c2019-08-26 16:08:53 -030030# endif
Adhemerval Zanellab6b6ee02019-08-06 15:25:30 -030031#endif
Szabolcs Nagy0b7d1ae2020-05-12 16:40:08 +010032 {0, 0}
33 // clang-format on
Adhemerval Zanellace6e5d62019-08-06 15:20:32 -030034};
Szabolcs Nagy0b7d1ae2020-05-12 16:40:08 +010035#undef F
Adhemerval Zanellace6e5d62019-08-06 15:20:32 -030036
Wilco Dijkstra620b09f2020-05-22 15:30:59 +010037#define ALIGN 32
Szabolcs Nagy9bd3b272020-04-29 17:04:10 +010038#define LEN 512
Wilco Dijkstra620b09f2020-05-22 15:30:59 +010039static char sbuf[LEN + 3 * ALIGN];
Adhemerval Zanellace6e5d62019-08-06 15:20:32 -030040
Szabolcs Nagy0b7d1ae2020-05-12 16:40:08 +010041static void *
42alignup (void *p)
Adhemerval Zanellace6e5d62019-08-06 15:20:32 -030043{
Wilco Dijkstra620b09f2020-05-22 15:30:59 +010044 return (void *) (((uintptr_t) p + ALIGN - 1) & -ALIGN);
Adhemerval Zanellace6e5d62019-08-06 15:20:32 -030045}
46
Szabolcs Nagy0b7d1ae2020-05-12 16:40:08 +010047static void
48test (const struct fun *fun, int align, int seekpos, int len)
Adhemerval Zanellace6e5d62019-08-06 15:20:32 -030049{
Szabolcs Nagy0b7d1ae2020-05-12 16:40:08 +010050 char *src = alignup (sbuf);
51 char *s = src + align;
52 char *f = seekpos != -1 ? s + seekpos : 0;
53 int seekchar = 0x1;
54 void *p;
Adhemerval Zanellace6e5d62019-08-06 15:20:32 -030055
Szabolcs Nagy0b7d1ae2020-05-12 16:40:08 +010056 if (err_count >= ERR_LIMIT)
57 return;
Wilco Dijkstra620b09f2020-05-22 15:30:59 +010058 if (len > LEN || seekpos >= len || align >= ALIGN)
Szabolcs Nagy0b7d1ae2020-05-12 16:40:08 +010059 abort ();
Adhemerval Zanellace6e5d62019-08-06 15:20:32 -030060
Szabolcs Nagy0b7d1ae2020-05-12 16:40:08 +010061 for (int i = 0; src + i < s; i++)
Wilco Dijkstra620b09f2020-05-22 15:30:59 +010062 src[i] = (i + len) & 1 ? seekchar : 0;
63 for (int i = 1; i <= ALIGN; i++)
64 s[len + i] = (i + len) & 1 ? seekchar : 0;
Szabolcs Nagy0b7d1ae2020-05-12 16:40:08 +010065 for (int i = 0; i < len; i++)
Wilco Dijkstra620b09f2020-05-22 15:30:59 +010066 s[i] = 'a' + (i & 31);
Szabolcs Nagy0b7d1ae2020-05-12 16:40:08 +010067 if (seekpos != -1)
Wilco Dijkstra620b09f2020-05-22 15:30:59 +010068 s[seekpos] = seekchar;
69 if (seekpos != -1 && (len + align) & 1)
70 s[seekpos + 1] = seekchar;
Szabolcs Nagy0b7d1ae2020-05-12 16:40:08 +010071 s[len] = '\0';
Adhemerval Zanellace6e5d62019-08-06 15:20:32 -030072
Szabolcs Nagy0b7d1ae2020-05-12 16:40:08 +010073 p = fun->fun (s, seekchar);
74 if (p != f)
75 {
Wilco Dijkstra620b09f2020-05-22 15:30:59 +010076 ERR ("%s (%p, 0x%02x) len %d returned %p, expected %p pos %d\n",
77 fun->name, s, seekchar, len, p, f, seekpos);
Szabolcs Nagy0b7d1ae2020-05-12 16:40:08 +010078 quote ("input", s, len);
79 }
Szabolcs Nagy9bd3b272020-04-29 17:04:10 +010080
Szabolcs Nagy0b7d1ae2020-05-12 16:40:08 +010081 p = fun->fun (s, 0);
82 if (p != s + len)
83 {
Wilco Dijkstra620b09f2020-05-22 15:30:59 +010084 ERR ("%s (%p, 0x%02x) len %d returned %p, expected %p pos %d\n",
85 fun->name, s, 0, len, p, f, len);
Szabolcs Nagy0b7d1ae2020-05-12 16:40:08 +010086 quote ("input", s, len);
87 }
Adhemerval Zanellace6e5d62019-08-06 15:20:32 -030088}
89
Szabolcs Nagy0b7d1ae2020-05-12 16:40:08 +010090int
Wilco Dijkstra620b09f2020-05-22 15:30:59 +010091main (void)
Adhemerval Zanellace6e5d62019-08-06 15:20:32 -030092{
Szabolcs Nagy0b7d1ae2020-05-12 16:40:08 +010093 int r = 0;
94 for (int i = 0; funtab[i].name; i++)
95 {
96 err_count = 0;
Wilco Dijkstra620b09f2020-05-22 15:30:59 +010097 for (int a = 0; a < ALIGN; a++)
98 for (int n = 0; n < LEN; n++)
99 {
100 for (int sp = 0; sp < n; sp++)
101 test (funtab + i, a, sp, n);
102 test (funtab + i, a, -1, n);
103 }
104
Szabolcs Nagy0b7d1ae2020-05-12 16:40:08 +0100105 printf ("%s %s\n", err_count ? "FAIL" : "PASS", funtab[i].name);
106 if (err_count)
107 r = -1;
108 }
109 return r;
Adhemerval Zanellace6e5d62019-08-06 15:20:32 -0300110}