Hi Folks, The mg command 'regexp-replace "^.*$" ""' enters an endless loop (until memory exhausted). This behaviour also occurs in query-replace-regexp with the "!" option.
This is due to a change I suggested to re_forwsrch, that is, not moving dot when the line is empty (re_search.c 1.35). The reason for this change was to ensure the replacement took effect on the starting line of a replace-regexp, even if the line was empty. Well, the patch did that but caused this worse issue instead. <Hangs head in shame>. Here's yet another suggested patch (3 of 3) to fix the issue: --- re_search.c.orig Fri Apr 12 09:32:15 2024 +++ re_search.c Fri Apr 12 14:00:54 2024 @@ -146,6 +146,11 @@ return (ABORT); ewprintf("Query replacing %s with %s:", re_pat, news); + /* If dot on empty line, instruct re_forwsrch to not advance + * line + */ + if (curwp->w_doto == 0 && curwp->w_dotp->l_used == 0) + curwp->w_doto = -1; /* * Search forward repeatedly, checking each time whether to insert * or not. The "!" case makes the check always true, so it gets put @@ -220,6 +225,8 @@ EFNUL | EFNEW | EFCR, re_pat) == NULL) return (ABORT); + if (curwp->w_doto == 0 && curwp->w_dotp->l_used == 0) + curwp->w_doto = -1; while (re_forwsrch() == TRUE) { plen = regex_match[0].rm_eo - regex_match[0].rm_so; if (re_doreplace((RSIZE)plen, news) == FALSE) @@ -231,7 +238,7 @@ update(CMODE); if (!inmacro) ewprintf("(%d replacement(s) done)", rcnt); - + return(TRUE); } mg: endless loop using replace-regexpmg: endless loop using replace-regexp @@ -339,17 +346,24 @@ tbo = curwp->w_doto; tdotline = curwp->w_dotline; - if (tbo == clp->l_used) + if (tbo == clp->l_used) { /* * Don't start matching past end of line -- must move to - * beginning of next line, unless line is empty or at - * end of file. + * beginning of next line, unless at end of file. */ - if (clp != curbp->b_headp && llength(clp) != 0) { + if (clp != curbp->b_headp) { clp = lforw(clp); tdotline++; tbo = 0; } + } + else if (tbo < 0) { + /* Don't advance to next line when dot on empty line; + * reset tbo to correct value. + */ + tbo = 0; + } + /* * Note this loop does not process the last line, but this editor * always makes the last line empty so this is good. Best Regards. Mark