On Mon, Jun 29, 2020 at 01:17:56PM +0200, Hiltjo Posthuma wrote: > Hi, > > Thanks for looking into it, it looks better. > > With this patch I noticed re_backsrch() does not work fully correct yet. > > I think the line: > > > + regex_match[0].rm_so < tbo) { > > should be: > > > + regex_match[0].rm_so <= tbo) { > > because tbo is already adjusted at the top of the function re_backsrch(). > > With this line change searching backwards with "^$" finds a result.
Indeed, thank you. I must have messed up my testing... However, changing < to <= changes the behavior of all backward regex searches. Type "aaa" on a line and leave the cursor after the third a on the same line. If you re-search-backward for "a" on -current, the cursor is placed on the middle "a" (different from emacs which places the cursor on the third a). If you then re-search-backward for "aa", the search fails (as it does on emacs also). With your suggested change (as in the diff below), the cursor is placed on the third "a" as in emacs. However, with the cursor on the middle a re-search-backward for "aa" now succeeds (different from emacs). I'm not sure this is desirable. I'm no user of either emacs or mg, so I think more thought and care is needed but this will have to be done by someone else... Index: re_search.c =================================================================== RCS file: /var/cvs/src/usr.bin/mg/re_search.c,v retrieving revision 1.33 diff -u -p -r1.33 re_search.c --- re_search.c 6 Aug 2017 04:39:45 -0000 1.33 +++ re_search.c 29 Jun 2020 11:26:07 -0000 @@ -332,8 +332,8 @@ re_forwsrch(void) while (clp != (curbp->b_headp)) { regex_match[0].rm_so = tbo; regex_match[0].rm_eo = llength(clp); - error = regexec(®ex_buff, ltext(clp), RE_NMATCH, regex_match, - REG_STARTEND); + error = regexec(®ex_buff, ltext(clp) ? ltext(clp) : "", + RE_NMATCH, regex_match, REG_STARTEND); if (error != 0) { clp = lforw(clp); tdotline++; @@ -389,8 +389,9 @@ re_backsrch(void) * do this character-by-character after the first match since * POSIX regexps don't give you a way to do reverse matches. */ - while (!regexec(®ex_buff, ltext(clp), RE_NMATCH, regex_match, - REG_STARTEND) && regex_match[0].rm_so < tbo) { + while (!regexec(®ex_buff, ltext(clp) ? ltext(clp) : "", + RE_NMATCH, regex_match, REG_STARTEND) && + regex_match[0].rm_so <= tbo) { memcpy(&lastmatch, ®ex_match[0], sizeof(regmatch_t)); regex_match[0].rm_so++; regex_match[0].rm_eo = llength(clp); @@ -538,8 +539,8 @@ killmatches(int cond) /* see if line matches */ regex_match[0].rm_so = 0; regex_match[0].rm_eo = llength(clp); - error = regexec(®ex_buff, ltext(clp), RE_NMATCH, regex_match, - REG_STARTEND); + error = regexec(®ex_buff, ltext(clp) ? ltext(clp) : "", + RE_NMATCH, regex_match, REG_STARTEND); /* Delete line when appropriate */ if ((cond == FALSE && error) || (cond == TRUE && !error)) { @@ -613,8 +614,8 @@ countmatches(int cond) /* see if line matches */ regex_match[0].rm_so = 0; regex_match[0].rm_eo = llength(clp); - error = regexec(®ex_buff, ltext(clp), RE_NMATCH, regex_match, - REG_STARTEND); + error = regexec(®ex_buff, ltext(clp) ? ltext(clp) : "", + RE_NMATCH, regex_match, REG_STARTEND); /* Count line when appropriate */ if ((cond == FALSE && error) || (cond == TRUE && !error))