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