1*412f47f9SXin Li /*
2*412f47f9SXin Li * Common string test code.
3*412f47f9SXin Li *
4*412f47f9SXin Li * Copyright (c) 2020, Arm Limited.
5*412f47f9SXin Li * SPDX-License-Identifier: MIT OR Apache-2.0 WITH LLVM-exception
6*412f47f9SXin Li */
7*412f47f9SXin Li
8*412f47f9SXin Li #include <ctype.h>
9*412f47f9SXin Li #include <stdio.h>
10*412f47f9SXin Li
11*412f47f9SXin Li /* Accounting errors for a test case. */
12*412f47f9SXin Li static int err_count;
13*412f47f9SXin Li #define ERR_LIMIT 10
14*412f47f9SXin Li #define ERR(...) (err_count++, printf (__VA_ARGS__))
15*412f47f9SXin Li
16*412f47f9SXin Li static inline void
quotechar(unsigned char c)17*412f47f9SXin Li quotechar (unsigned char c)
18*412f47f9SXin Li {
19*412f47f9SXin Li if (isprint (c))
20*412f47f9SXin Li putchar (c);
21*412f47f9SXin Li else
22*412f47f9SXin Li printf ("\\x%02x", c);
23*412f47f9SXin Li }
24*412f47f9SXin Li
25*412f47f9SXin Li /* quoted print around at or the entire string if at < 0. */
26*412f47f9SXin Li static void
quoteat(const char * prefix,const void * p,int len,int at)27*412f47f9SXin Li quoteat (const char *prefix, const void *p, int len, int at)
28*412f47f9SXin Li {
29*412f47f9SXin Li static const int CTXLEN = 15;
30*412f47f9SXin Li int i;
31*412f47f9SXin Li const char *pre = "\"";
32*412f47f9SXin Li const char *post = "\"";
33*412f47f9SXin Li const char *s = p;
34*412f47f9SXin Li if (at > CTXLEN)
35*412f47f9SXin Li {
36*412f47f9SXin Li s += at - CTXLEN;
37*412f47f9SXin Li len -= at - CTXLEN;
38*412f47f9SXin Li pre = "...\"";
39*412f47f9SXin Li }
40*412f47f9SXin Li if (at >= 0 && len > 2 * CTXLEN + 1)
41*412f47f9SXin Li {
42*412f47f9SXin Li len = 2 * CTXLEN + 1;
43*412f47f9SXin Li post = "\"...";
44*412f47f9SXin Li }
45*412f47f9SXin Li printf ("%4s: %s", prefix, pre);
46*412f47f9SXin Li for (i = 0; i < len; i++)
47*412f47f9SXin Li quotechar (s[i]);
48*412f47f9SXin Li printf ("%s\n", post);
49*412f47f9SXin Li }
50*412f47f9SXin Li
51*412f47f9SXin Li static inline void
quote(const char * prefix,const void * p,int len)52*412f47f9SXin Li quote (const char *prefix, const void *p, int len)
53*412f47f9SXin Li {
54*412f47f9SXin Li quoteat (prefix, p, len, -1);
55*412f47f9SXin Li }
56