summaryrefslogtreecommitdiff
path: root/Src/Zle/zle_utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Zle/zle_utils.c')
-rw-r--r--Src/Zle/zle_utils.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/Src/Zle/zle_utils.c b/Src/Zle/zle_utils.c
index 0e8099bd2..ffd94def8 100644
--- a/Src/Zle/zle_utils.c
+++ b/Src/Zle/zle_utils.c
@@ -410,9 +410,14 @@ foredel(int ct)
/**/
void
-setline(char const *s)
+setline(char *s, int flags)
{
- char *scp = ztrdup(s);
+ char *scp;
+
+ if (flags & ZSL_COPY)
+ scp = ztrdup(s);
+ else
+ scp = s;
/*
* TBD: we could make this more efficient by passing the existing
* allocated line to stringaszleline.
@@ -421,10 +426,13 @@ setline(char const *s)
zleline = stringaszleline(scp, &zlell, &linesz);
- if ((zlecs = zlell) && invicmdmode())
+ if ((flags & ZSL_TOEND) && (zlecs = zlell) && invicmdmode())
zlecs--;
+ else if (zlecs > zlell)
+ zlecs = zlell;
- free(scp);
+ if (flags & ZSL_COPY)
+ free(scp);
}
/**/