131914882SAlex Richardson /*
231914882SAlex Richardson * Common string test code.
331914882SAlex Richardson *
431914882SAlex Richardson * Copyright (c) 2020, Arm Limited.
5*072a4ba8SAndrew Turner * SPDX-License-Identifier: MIT OR Apache-2.0 WITH LLVM-exception
631914882SAlex Richardson */
731914882SAlex Richardson
831914882SAlex Richardson #include <ctype.h>
931914882SAlex Richardson #include <stdio.h>
1031914882SAlex Richardson
1131914882SAlex Richardson /* Accounting errors for a test case. */
1231914882SAlex Richardson static int err_count;
1331914882SAlex Richardson #define ERR_LIMIT 10
1431914882SAlex Richardson #define ERR(...) (err_count++, printf (__VA_ARGS__))
1531914882SAlex Richardson
1631914882SAlex Richardson static inline void
quotechar(unsigned char c)1731914882SAlex Richardson quotechar (unsigned char c)
1831914882SAlex Richardson {
1931914882SAlex Richardson if (isprint (c))
2031914882SAlex Richardson putchar (c);
2131914882SAlex Richardson else
2231914882SAlex Richardson printf ("\\x%02x", c);
2331914882SAlex Richardson }
2431914882SAlex Richardson
2531914882SAlex Richardson /* quoted print around at or the entire string if at < 0. */
2631914882SAlex Richardson static void
quoteat(const char * prefix,const void * p,int len,int at)2731914882SAlex Richardson quoteat (const char *prefix, const void *p, int len, int at)
2831914882SAlex Richardson {
2931914882SAlex Richardson static const int CTXLEN = 15;
3031914882SAlex Richardson int i;
3131914882SAlex Richardson const char *pre = "\"";
3231914882SAlex Richardson const char *post = "\"";
3331914882SAlex Richardson const char *s = p;
3431914882SAlex Richardson if (at > CTXLEN)
3531914882SAlex Richardson {
3631914882SAlex Richardson s += at - CTXLEN;
3731914882SAlex Richardson len -= at - CTXLEN;
3831914882SAlex Richardson pre = "...\"";
3931914882SAlex Richardson }
4031914882SAlex Richardson if (at >= 0 && len > 2 * CTXLEN + 1)
4131914882SAlex Richardson {
4231914882SAlex Richardson len = 2 * CTXLEN + 1;
4331914882SAlex Richardson post = "\"...";
4431914882SAlex Richardson }
4531914882SAlex Richardson printf ("%4s: %s", prefix, pre);
4631914882SAlex Richardson for (i = 0; i < len; i++)
4731914882SAlex Richardson quotechar (s[i]);
4831914882SAlex Richardson printf ("%s\n", post);
4931914882SAlex Richardson }
5031914882SAlex Richardson
5131914882SAlex Richardson static inline void
quote(const char * prefix,const void * p,int len)5231914882SAlex Richardson quote (const char *prefix, const void *p, int len)
5331914882SAlex Richardson {
5431914882SAlex Richardson quoteat (prefix, p, len, -1);
5531914882SAlex Richardson }
56