plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

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:
Msrc/cmd/plumb/rules.c | 25+++++++++++++++++++++++--
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;