From 4ab5cfd1efd080b9c5d428679952ba70e7ea77de Mon Sep 17 00:00:00 2001 From: Thomas Voss Date: Sun, 10 Dec 2023 17:22:08 +0100 Subject: Support basic escape ASCII escape sequences --- grab.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/grab.c b/grab.c index d7f1f50..272fe3c 100644 --- a/grab.c +++ b/grab.c @@ -69,6 +69,7 @@ static char *xstrchrnul(const char *, char); static char delim = '\n'; static int rv = EXIT_SUCCESS; + static const cmd_func op_table[UCHAR_MAX] = { ['g'] = cmdg, ['v'] = cmdg, @@ -76,6 +77,11 @@ static const cmd_func op_table[UCHAR_MAX] = { ['y'] = cmdy, }; +static const char esc_table[UCHAR_MAX] = { + ['\\'] = '\\', ['a'] = '\a', ['b'] = '\b', ['f'] = '\f', + ['n'] = '\n', ['r'] = '\r', ['t'] = '\t', ['v'] = '\v', +}; + static void usage(const char *s) { @@ -319,6 +325,18 @@ mkregex(char *s, size_t n) int ret; regex_t r; + for (size_t i = 0; i < n - 1; i++) { + if (s[i] == '\\') { + char c = esc_table[(uchar)s[i + 1]]; + if (c) { + for (size_t j = i; j < n - 1; j++) + s[j] = s[j + 1]; + s[i] = c; + n--; + } + } + } + s[n] = 0; if ((ret = regcomp(&r, s, REG_EXTENDED | REG_NEWLINE)) != 0) { char emsg[128]; -- cgit v1.2.3