commit 6c0efecd1303f22f86194d6eee7038651582f086
parent 760cf867056b1ef1ca2bf23dbe477d066e6562fb
Author: Igor Burago <igor@igorburago.com>
Date: Wed, 27 Jul 2022 17:27:06 +0800
plumber: allow multi-digit subexpression match variable substitutions
Diffstat:
1 file changed, 23 insertions(+), 2 deletions(-)
diff --git a/src/cmd/plumb/rules.c b/src/cmd/plumb/rules.c
@@ -254,15 +254,36 @@ filename(Exec *e, char *name)
return cleanname(buf);
}
+static char*
+subexpmatch(Exec *e, char *s, int *numlen)
+{
+ int n, d, ok;
+ char *t;
+
+ n = 0;
+ ok = 1;
+ for(t = s; '0'<=*t && *t<='9'; t++)
+ if(ok){
+ d = *t-'0';
+ if(d<NMATCHSUBEXP && n<=(NMATCHSUBEXP-1-d)/10)
+ n = 10*n+d;
+ else
+ ok = 0;
+ }
+ *numlen = t-s;
+ if(t==s || !ok)
+ return nil;
+ return e->match[n];
+}
+
char*
dollar(Exec *e, char *s, int *namelen)
{
int n;
static char *abuf;
- *namelen = 1;
if(e!=nil && '0'<=s[0] && s[0]<='9')
- return nonnil(e->match[s[0]-'0']);
+ return nonnil(subexpmatch(e, s, namelen));
n = scanvarname(s)-s;
*namelen = n;