sbase

suckless unix tools
git clone git://git.2f30.org/sbase.git
Log | Files | Refs | README | LICENSE

commit 5a84d968d32b5ed8128df47e5d4cd37a01fdecb6
parent 78940f55bace508bad9b874a6273479b84f735eb
Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
Date:   Sat Jan 23 09:11:33 +0100

Do not try to rematch patterns with ^ or $

It is impossible to rematch a pattern which has one (or both)
of these operators, so the simplest solucion is detect them
while we are compiling the regular expression and break the
match loop after the first iteration.

Diffstat:
ed.c | 13++++++++++---
1 file changed, 10 insertions(+), 3 deletions(-)
diff --git a/ed.c b/ed.c @@ -63,6 +63,7 @@ static char *rhs; static char *lastmatch; static struct undo udata; static int newcmd; +int eol, bol; static void discard(void) @@ -358,11 +359,15 @@ compile(int delim) if (!isgraph(delim)) error("invalid pattern delimiter"); - bracket = siz = 0; + eol = bol = bracket = siz = 0; for (n = 0;; ++n) { if ((c = input()) == delim && !bracket) break; - if (c == '\n' || c == EOF) { + if (c == '^') { + bol = 1; + } else if (c == '$') { + eol = 1; + } else if (c == '\n' || c == EOF) { back(c); break; } @@ -1005,9 +1010,11 @@ subline(int num, int nth) static size_t siz, cap; i = changed = siz = 0; - for (m = match(num); m && *lastmatch != '\n'; m = rematch(num)) { + for (m = match(num); m; m = rematch(num)) { addpre(&s, &cap, &siz); changed |= addsub(&s, &cap, &siz, nth, ++i); + if (eol || bol) + break; } if (!changed) return;