diff options
| author | Thomas Voss <mail@thomasvoss.com> | 2024-11-05 21:09:53 +0100 | 
|---|---|---|
| committer | Thomas Voss <mail@thomasvoss.com> | 2024-11-05 21:09:53 +0100 | 
| commit | e251c6463913bcd7c9c40b4dc168010f6de68b5a (patch) | |
| tree | a8d2cfcfa09de64d86b10f1a6137373b553f078b | |
| parent | 436557eca3da4492def86d5ef8c2d84c5d1c3e71 (diff) | |
Check for whitespace after regex using islbrk()
| -rw-r--r-- | src/main.c | 11 | ||||
| -rw-r--r-- | src/util.c | 14 | ||||
| -rw-r--r-- | src/util.h | 3 | ||||
| -rw-r--r-- | src/work.c | 13 | 
4 files changed, 22 insertions, 19 deletions
@@ -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);  				} @@ -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 @@ -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 @@ -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_)  {  |