aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Voss <mail@thomasvoss.com> 2024-11-05 21:09:53 +0100
committerThomas Voss <mail@thomasvoss.com> 2024-11-05 21:09:53 +0100
commite251c6463913bcd7c9c40b4dc168010f6de68b5a (patch)
treea8d2cfcfa09de64d86b10f1a6137373b553f078b
parent436557eca3da4492def86d5ef8c2d84c5d1c3e71 (diff)
Check for whitespace after regex using islbrk()
-rw-r--r--src/main.c11
-rw-r--r--src/util.c14
-rw-r--r--src/util.h3
-rw-r--r--src/work.c13
4 files changed, 22 insertions, 19 deletions
diff --git a/src/main.c b/src/main.c
index 89e3007..120a88e 100644
--- a/src/main.c
+++ b/src/main.c
@@ -330,14 +330,13 @@ pattern_comp(u8view_t pat)
reopts |= PCRE2_UCP;
for (;;) {
- if (ucsgnext(&g, &pat) == 0)
+ if (ucsgnext(&g, &pat) == 0 || islbrk(g))
break;
- if (g.len != 1)
- goto bad_flag;
- if (uprop_is_pat_ws(*g.p))
+ int w = ucsnext(&ch, &g);
+ if (uprop_is_pat_ws(ch))
break;
- switch (*g.p) {
+ switch (ch) {
case 'i': reopts |= PCRE2_CASELESS; break;
case 'I': reopts &= ~PCRE2_CASELESS; break;
case 'l': reopts |= PCRE2_LITERAL; break;
@@ -345,7 +344,7 @@ pattern_comp(u8view_t pat)
case 'u': reopts |= PCRE2_UCP; break;
case 'U': reopts &= ~PCRE2_UCP; break;
default:
- bad_flag:
+ VSHFT(&g, -w);
cerr(EXIT_FATAL, "Unknown regex flag %s%.*s%s",
lquot, SV_PRI_ARGS(g), rquot);
}
diff --git a/src/util.c b/src/util.c
index b5b1f8a..a946119 100644
--- a/src/util.c
+++ b/src/util.c
@@ -4,6 +4,8 @@
#include <stdlib.h>
#include <errors.h>
+#include <macros.h>
+#include <mbstring.h>
#include <pcre2.h>
#include "exitcodes.h"
@@ -47,4 +49,16 @@ getenv_posnum(const char *ev, int fallback)
return (int)n;
}
return fallback;
+}
+
+bool
+islbrk(u8view_t g)
+{
+ return ucseq(g, U8("\n"))
+ || ucseq(g, U8("\v"))
+ || ucseq(g, U8("\f"))
+ || ucseq(g, U8("\r\n"))
+ || ucseq(g, U8("\x85"))
+ || ucseq(g, U8("\u2028"))
+ || ucseq(g, U8("\u2029"));
} \ No newline at end of file
diff --git a/src/util.h b/src/util.h
index 705d0ee..ab3e6d6 100644
--- a/src/util.h
+++ b/src/util.h
@@ -1,7 +1,10 @@
#ifndef GRAB_UTIL_H
#define GRAB_UTIL_H
+#include <mbstring.h>
+
int getenv_posnum(const char *ev, int fallback);
void pcre2_bitch_and_die(int ec, const char *fmt, ...);
+bool islbrk(u8view_t g);
#endif /* !GRAB_UTIL_H */ \ No newline at end of file
diff --git a/src/work.c b/src/work.c
index c8a3e21..5bc8b24 100644
--- a/src/work.c
+++ b/src/work.c
@@ -41,7 +41,6 @@ typedef struct {
static void compute_pos(const char8_t *p, pos_state_t *ps);
static bool has_lbrk_p(u8view_t sv);
-static bool islbrk(u8view_t g);
static int svposcmp(const void *a, const void *b);
static void write_match_to_buffer(u8view_t sv, u8view_t *hl);
@@ -482,18 +481,6 @@ has_lbrk_p(u8view_t sv)
return false;
}
-bool
-islbrk(u8view_t g)
-{
- return ucseq(g, U8("\n"))
- || ucseq(g, U8("\v"))
- || ucseq(g, U8("\f"))
- || ucseq(g, U8("\r\n"))
- || ucseq(g, U8("\x85"))
- || ucseq(g, U8("\u2028"))
- || ucseq(g, U8("\u2029"));
-}
-
int
svposcmp(const void *a_, const void *b_)
{