skip to content
==> src/debug_str.c <==
1/* Rust's Debug quoting of a string (core::fmt, char::escape_debug), for ASCII and UTF-8 text. */
2#include "mesh/debug_str.h"
3
4#include <string.h>
5
6void mdebug_str(msb *b, const char *s, size_t n) {
7    msb_putc(b, '"');
8    for (size_t i = 0; i < n; i++) {
9        unsigned char c = (unsigned char)s[i];
10        switch (c) {
11        case '"': msb_puts(b, "\\\""); break;
12        case '\\': msb_puts(b, "\\\\"); break;
13        case '\t': msb_puts(b, "\\t"); break;
14        case '\r': msb_puts(b, "\\r"); break;
15        case '\n': msb_puts(b, "\\n"); break;
16        case 0: msb_puts(b, "\\0"); break;
17        default:
18            if (c < 0x20 || c == 0x7f) msb_printf(b, "\\u{%x}", c);
19            else msb_putc(b, (char)c);
20        }
21    }
22    msb_putc(b, '"');
23}
24
25char *mdebug(const char *s) {
26    msb b = {0};
27    mdebug_str(&b, s, strlen(s));
28    return msb_take(&b);
29}