#include #include #include #include char *mu_parse_escape(const char *prog_name, const char *src) { size_t size = 0; size_t src_len = strlen(src); for (size_t i = 0; i < src_len; i++) { size++; size -= (src[i] == '\\'); } char *buf = malloc(size + 1); if (buf == NULL) { if (prog_name) fprintf(stderr, "%s: malloc: %s\n", prog_name, strerror(errno)); return NULL; } size = 0; for (size_t i = 0; i < src_len; i++) { char c = src[i]; if (c == '\\' && i < src_len) { switch (src[i + 1]) { case 'n': c = '\n'; break; case 'a': c = '\a'; break; case 't': c = '\t'; break; case 'b': c = '\b'; break; case 'e': c = '\033'; break; case 'r': c = '\r'; break; case 'f': c = '\f'; break; case 'v': c = '\v'; break; default: c = '\\'; } i++; } buf[size] = c; size++; } buf[size + 1] = '\0'; return buf; }