aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--grab.c18
1 files changed, 18 insertions, 0 deletions
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];