1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
|
/*
* Copyright (c) 2016-2021 The strace developers.
* All rights reserved.
*
* SPDX-License-Identifier: GPL-2.0-or-later
*/
#include "tests.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*
* Based on string_quote() from util.c.
* Assumes instr is NUL-terminated.
*/
void
print_quoted_string_ex(const char *instr, bool quote, const char *escape_chars)
{
print_quoted_memory_ex(instr, strlen(instr), quote, escape_chars);
}
void
print_quoted_string(const char *instr)
{
print_quoted_memory(instr, strlen(instr));
}
void
print_quoted_cstring(const char *instr, const size_t size)
{
const size_t len = strnlen(instr, size);
if (len < size) {
print_quoted_memory(instr, len);
} else {
print_quoted_memory(instr, size - 1);
printf("...");
}
}
void
print_quoted_stringn(const char *instr, const size_t size)
{
const size_t len = strnlen(instr, size);
if (len < size) {
print_quoted_memory(instr, len);
} else {
print_quoted_memory(instr, size);
printf("...");
}
}
static void
print_octal(unsigned char c, char next)
{
putchar('\\');
char c1 = '0' + (c & 0x7);
char c2 = '0' + ((c >> 3) & 0x7);
char c3 = '0' + (c >> 6);
if (next >= '0' && next <= '7') {
/* Print \octal */
putchar(c3);
putchar(c2);
} else {
/* Print \[[o]o]o */
if (c3 != '0')
putchar(c3);
if (c3 != '0' || c2 != '0')
putchar(c2);
}
putchar(c1);
}
void
print_quoted_memory_ex(const void *const instr, const size_t len,
bool quote, const char *escape_chars)
{
const unsigned char *str = (const unsigned char *) instr;
if (quote)
putchar('"');
for (size_t i = 0; i < len; ++i) {
const int c = str[i];
switch (c) {
case '\"':
printf("\\\"");
break;
case '\\':
printf("\\\\");
break;
case '\f':
printf("\\f");
break;
case '\n':
printf("\\n");
break;
case '\r':
printf("\\r");
break;
case '\t':
printf("\\t");
break;
case '\v':
printf("\\v");
break;
default:
if (c >= ' ' && c <= 0x7e &&
!(escape_chars && strchr(escape_chars, c))) {
putchar(c);
} else {
print_octal(c,
i < (len - 1) ? str[i + 1] : 0);
}
break;
}
}
if (quote)
putchar('"');
}
void
print_quoted_memory(const void *const instr, const size_t len)
{
print_quoted_memory_ex(instr, len, true, NULL);
}
void
print_quoted_hex(const void *const instr, const size_t len)
{
const unsigned char *str = instr;
printf("\"");
for (size_t i = 0; i < len; ++i)
printf("\\x%02x", str[i]);
printf("\"");
}
|