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