==> 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}