git: 9front

Download patch

ref: 5ba6c22fafed27542b105dc293371d2b1a1c8a1d
parent: 53004d7576b54fe18002db7fa106a5434e2698a5
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Mon Jan 19 13:06:17 EST 2026

libregexp: fix handling of empty regprog //

Instead of making empty regprog equal to ^
make the empty regprog match every position
in the string with a zero-length match.

This fixes using // as separator in awk's
gsub operation.

--- a/sys/man/6/regexp
+++ b/sys/man/6/regexp
@@ -91,8 +91,6 @@
 matches the beginning of a line;
 .L $
 matches the end of the line.
-An empty regular expression behaves equivalently to
-.LR ^ .
 .PP
 The 
 .B REP
--- a/sys/src/libregexp/regcomp.c
+++ b/sys/src/libregexp/regcomp.c
@@ -163,13 +163,9 @@
 	Renode *parsetr;
 	int regstrlen, maxthr;
 
-	regstrlen = utflen(regstr);
-	if(regstrlen == 0){
-		regstr = "^";
-		regstrlen = 1;
-	}
 	initplex(&plex, regstr, lit);
-	plex.nodes = calloc(sizeof(*plex.nodes), regstrlen*2);
+	regstrlen = utflen(regstr);
+	plex.nodes = calloc(sizeof(*plex.nodes), regstrlen*2+1);
 	if(plex.nodes == nil)
 		return nil;
 	plex.next = plex.nodes;
@@ -180,7 +176,7 @@
 	}
 
 	maxthr = regstrlen + 1;
-	parsetr = node(&plex, TSUB, e0(&plex), nil);
+	parsetr = node(&plex, TSUB, regstrlen?e0(&plex):nil, nil);
 
 //	prtree(parsetr, 0, 1);
 	reprog = malloc(sizeof(Reprog) +
--