aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--modules/sed/transform.c8
-rw-r--r--tests/sed.at9
2 files changed, 12 insertions, 5 deletions
diff --git a/modules/sed/transform.c b/modules/sed/transform.c
index 67e0de8..ec7983f 100644
--- a/modules/sed/transform.c
+++ b/modules/sed/transform.c
@@ -605,61 +605,61 @@ _single_transform_name_to_slist (struct transform *tr,
#define CASE_CTL_RESET() if (case_ctl == ctl_upcase_next \
|| case_ctl == ctl_locase_next) \
{ \
case_ctl = save_ctl; \
save_ctl = ctl_stop; \
}
rmp = tr_malloc (tr, (tf->regex.re_nsub + 1) * sizeof (*rmp));
if (!rmp)
return 1;
while (*input)
{
size_t disp;
const char *ptr;
rc = regexec (&tf->regex, input, tf->regex.re_nsub + 1, rmp, 0);
if (rc == 0)
{
struct replace_segm *segm;
disp = rmp[0].rm_eo;
- if (rmp[0].rm_so)
- if (transform_append (tr, slist, input, rmp[0].rm_so))
- return 1;
-
nmatches++;
if (tf->match_number && nmatches < tf->match_number)
{
if (transform_append (tr, slist, input, disp))
return 1;
input += disp;
continue;
}
+ if (rmp[0].rm_so)
+ if (transform_append (tr, slist, input, rmp[0].rm_so))
+ return 1;
+
for (segm = tf->repl_head; segm; segm = segm->next)
{
switch (segm->type)
{
case segm_literal: /* Literal segment */
if (case_ctl == ctl_stop)
ptr = segm->v.literal.ptr;
else
{
ptr = run_case_conv (tr,
case_ctl,
segm->v.literal.ptr,
segm->v.literal.size);
if (!ptr)
return 1;
CASE_CTL_RESET();
}
if (transform_append (tr, slist, ptr, segm->v.literal.size))
return 1;
break;
case segm_backref: /* Back-reference segment */
if (rmp[segm->v.ref].rm_so != -1
&& rmp[segm->v.ref].rm_eo != -1)
diff --git a/tests/sed.at b/tests/sed.at
index 0f432c5..39dd99d 100644
--- a/tests/sed.at
+++ b/tests/sed.at
@@ -1,23 +1,30 @@
# This file is part of smap testsuite -*- autotest -*-
# Copyright (C) 2021 Sergey Poznyakoff
# License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
# This is free software: you are free to change and redistribute it.
# There is NO WARRANTY, to the extent permitted by law.
AT_SETUP([sed])
AT_DATA([smapd.conf],
[idle-timeout 10
module sed sed
database dequote sed 's/<(.*)>/\1/g'
database default sed 's/ok-(.*)/\1/'
+database n sed 's/s/@/2'
+database g sed 's/s/@/2g'
+dispatch map eq n database n
+dispatch map eq g database g
dispatch key like <*> transform key dequote
dispatch default database default
])
-AT_CHECK([smaptest -c smapd.conf test ok-word test word test '<ok-word>'
+AT_CHECK([smaptest -c smapd.conf test ok-word test word test '<ok-word>' n password g passwords
],
[0],
[test ok-word: OK word
test word: NOTFOUND
test <ok-word>: OK word
+n password: OK pas@word
+g passwords: OK pas@word@
])
+
AT_CLEANUP

Return to:

Send suggestions and report system problems to the System administrator.