| #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; |
| size_t i; |
| |
| if (quote) |
| putchar('"'); |
| |
| for (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; |
| size_t i; |
| |
| printf("\""); |
| for (i = 0; i < len; i++) |
| printf("\\x%02x", str[i]); |
| printf("\""); |
| } |