#include int debug_depth; void dpvs_implementation( const char* expression, char quote, const unsigned char* string_value, size_t len) { printf("%*s", debug_depth, ""); printf("%s = %c", expression, quote); for (const unsigned char* m = string_value; len && *m; m++, len--) { switch (*m) { case ' ': case '~': case '@': case '$': case ',': case '%': case '^': case '&': case '\'': case '*': case '#': case '`': case ';': case '.': case '=': case '/': case '+': case '-': case '_': case '!': case ':': case '<': case '>': case '(': case ')': case '[': case ']': case '{': case '}': case '0' ... '9': case 'a' ... 'z': case 'A' ... 'Z': putchar(*m); break; case '\\': printf("\\\\"); break; case '\"': printf("\\\""); break; case '\e': printf("\\e"); break; case '\n': printf("\\n"); break; default: printf("\\x%02X", *m); break; } } printf("%c\n", quote); }