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