summaryrefslogtreecommitdiff
path: root/Src/subst.c
diff options
context:
space:
mode:
authorPeter Stephenson <pws@users.sourceforge.net>2006-11-01 12:25:18 +0000
committerPeter Stephenson <pws@users.sourceforge.net>2006-11-01 12:25:18 +0000
commit9471bbcfa06a87dcb6803a36d1208c214fa56003 (patch)
treef5edcdab07ad4b718037fed3b15a7bbb3e4961f2 /Src/subst.c
parente8d1ef3613e4c43e0b0c08ac2a124f4cc99ab652 (diff)
downloadzsh-9471bbcfa06a87dcb6803a36d1208c214fa56003.tar.gz
zsh-9471bbcfa06a87dcb6803a36d1208c214fa56003.zip
22934, modified, see 22937: add HIST_SUBST_PATTERN option
make ${.../#%...} anchor at both ends
Diffstat (limited to 'Src/subst.c')
-rw-r--r--Src/subst.c34
1 files changed, 19 insertions, 15 deletions
diff --git a/Src/subst.c b/Src/subst.c
index 8ef8d446e..abc3c82af 100644
--- a/Src/subst.c
+++ b/Src/subst.c
@@ -2355,15 +2355,24 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int ssub)
c = *++s;
}
/* Check for anchored substitution */
- if (c == '%') {
+ if (c == '#' || c == Pound) {
+ /*
+ * anchor at head: this is the `normal' case in
+ * getmatch and we only require the flag if SUB_END
+ * is also present.
+ */
+ flags |= SUB_START;
+ s++;
+ }
+ if (*s == '%') {
/* anchor at tail */
flags |= SUB_END;
s++;
- } else if (c == '#' || c == Pound) {
- /* anchor at head: this is the `normal' case in getmatch */
- s++;
- } else
+ }
+ if (!(flags & (SUB_START|SUB_END))) {
+ /* No anchor, so substring */
flags |= SUB_SUBSTR;
+ }
/*
* Find the / marking the end of the search pattern.
* If there isn't one, we're just going to delete that,
@@ -2526,7 +2535,7 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int ssub)
/* This once was executed only `if (qt) ...'. But with that
* patterns in a expansion resulting from a ${(e)...} aren't
* tokenized even though this function thinks they are (it thinks
- * they are because subst_parse_str() turns Qstring tokens
+ * they are because parse_subst_str() turns Qstring tokens
* into String tokens and for unquoted parameter expansions the
* lexer normally does tokenize patterns inside parameter
* expansions). */
@@ -3273,6 +3282,7 @@ modify(char **str, char **ptr)
break;
case 's':
+ /* TODO: multibyte delimiter */
c = **ptr;
(*ptr)++;
ptr1 = *ptr;
@@ -3298,7 +3308,8 @@ modify(char **str, char **ptr)
for (tt = hsubl; *tt; tt++)
if (inull(*tt) && *tt != Bnullkeep)
chuck(tt--);
- untokenize(hsubl);
+ if (!isset(HISTSUBSTPATTERN))
+ untokenize(hsubl);
for (tt = hsubr = ztrdup(ptr2); *tt; tt++)
if (inull(*tt) && *tt != Bnullkeep)
chuck(tt--);
@@ -3444,15 +3455,8 @@ modify(char **str, char **ptr)
*str = casemodify(*str, CASMOD_UPPER);
break;
case 's':
- if (hsubl && hsubr) {
- char *oldstr = *str;
-
+ if (hsubl && hsubr)
subst(str, hsubl, hsubr, gbal);
- if (*str != oldstr) {
- *str = dupstring(oldstr = *str);
- zsfree(oldstr);
- }
- }
break;
case 'q':
*str = quotestring(*str, NULL, QT_BACKSLASH);