Index: ossp-pkg/var/TODO RCS File: /v/ossp/cvs/ossp-pkg/var/Attic/TODO,v rcsdiff -q -kk '-r1.21' '-r1.22' -u '/v/ossp/cvs/ossp-pkg/var/Attic/TODO,v' 2>/dev/null --- TODO 2002/03/04 11:54:05 1.21 +++ TODO 2002/03/04 12:01:53 1.22 @@ -1,13 +1,5 @@ OSSP var - o problem: - ${foo:s/^(.+)$/<\1>/} - -> fails with malformatted search & replace error because - it tries to parse the $ as a variable. - ${foo:s/^(.+)\$/<\1>/} - -> does not substitute because it leaves the \$ in the regex - and this no longer matches the end (instead it matches a dollar) - o "problem"!?: ${unknown:-foo} fails on force_expand and results in no expansion (kept as is) if not forced_expand. Index: ossp-pkg/var/var.c RCS File: /v/ossp/cvs/ossp-pkg/var/var.c,v rcsdiff -q -kk '-r1.76' '-r1.77' -u '/v/ossp/cvs/ossp-pkg/var/var.c,v' 2>/dev/null --- var.c 2002/03/04 11:53:27 1.76 +++ var.c 2002/03/04 12:01:53 1.77 @@ -447,6 +447,25 @@ static int parse_numexp (var_t *var, var_parse_t *ctx, const char *begin, const char *end, int *result, int *failed); static int parse_name (var_t *var, var_parse_t *ctx, const char *begin, const char *end); +/* parse pattern text */ +static int +parse_pattern( + var_t *var, var_parse_t *ctx, + const char *begin, const char *end) +{ + const char *p; + + /* parse until '/' */ + for (p = begin; p != end && *p != '/'; p++) { + if (*p == var->syntax.escape) { + if (p + 1 == end) + return VAR_ERR_INCOMPLETE_QUOTED_PAIR; + p++; + } + } + return (p - begin); +} + /* parse substitution text */ static int parse_substext( @@ -1283,9 +1302,10 @@ if (*p != '/') return VAR_ERR_MALFORMATTED_REPLACE; p++; - rc = parse_substext_or_variable(var, ctx, p, end, &search); + rc = parse_pattern(var, ctx, p, end); if (rc < 0) goto error_return; + tokenbuf_set(&search, p, p + rc, 0); p += rc; if (*p != '/') { rc = VAR_ERR_MALFORMATTED_REPLACE; Index: ossp-pkg/var/var.pod RCS File: /v/ossp/cvs/ossp-pkg/var/var.pod,v rcsdiff -q -kk '-r1.25' '-r1.26' -u '/v/ossp/cvs/ossp-pkg/var/var.pod,v' 2>/dev/null --- var.pod 2002/03/04 11:53:27 1.25 +++ var.pod 2002/03/04 12:01:53 1.26 @@ -221,7 +221,7 @@ | 'o' NUMBER ('-'|',') (NUMBER)? | '#' | '*' (TEXT_EXP|variable)+ - | 's' '/' (variable|TEXT_SUBST)+ + | 's' '/' (TEXT_PATTERN)+ '/' (variable|TEXT_SUBST)* '/' ('g'|'i'|'t')* | 'y' '/' (variable|TEXT_SUBST)+ @@ -249,6 +249,7 @@ NUMBER ::= ('0'|...|'9')+ + TEXT_PATTERN::= (^('/'))+ TEXT_SUBST ::= (^(DELIM_INIT|'/'))+ TEXT_ARGS ::= (^(DELIM_INIT|')'))+ TEXT_EXP ::= (^(DELIM_INIT|DELIM_CLOSE|':'))+ Index: ossp-pkg/var/var_test.c RCS File: /v/ossp/cvs/ossp-pkg/var/var_test.c,v rcsdiff -q -kk '-r1.39' '-r1.40' -u '/v/ossp/cvs/ossp-pkg/var/var_test.c,v' 2>/dev/null --- var_test.c 2002/03/04 11:53:27 1.39 +++ var_test.c 2002/03/04 12:01:53 1.40 @@ -186,6 +186,7 @@ { "${HOME:s/E/bla/t}", "/home/regression-tests" }, { "${HOME:s/E/bla/ti}", "/hombla/regression-tests" }, { "${HOME:s/E/bla/tig}", "/hombla/rblagrblassion-tblasts" }, + { "${HOME:s/^(.*)$/<\\1>/}", "" }, { "${HOME:o1-5}", "home/" }, { "${HOME:o1,5}", "home/" }, { "${HOME:o5,}", "/regression-tests" },