summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Gniazdowski <psprint@fastmail.com>2016-11-08 05:37:53 -0800
committerPeter Stephenson <pws@zsh.org>2016-11-08 15:14:08 +0000
commit06e4ec853a2ee0bde0efb8ed6c0fad2ac4162942 (patch)
tree8539bf19af45394bedcbc80bf3d9f1c3f78da262
parenta57977d01acc3b1b63aec1b79394ef7ffd052912 (diff)
downloadzsh-06e4ec853a2ee0bde0efb8ed6c0fad2ac4162942.tar.gz
zsh-06e4ec853a2ee0bde0efb8ed6c0fad2ac4162942.zip
39871: cut down number of strlen()s in getstrvalue()
-rw-r--r--ChangeLog8
-rw-r--r--Src/params.c17
-rw-r--r--Src/string.c13
3 files changed, 32 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index e89b0c616..629a7a5b7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2016-11-08 Peter Stephenson <p.stephenson@samsung.com>
+
+ * Sebastian: 39871: cut down number of strlen()s in getstrvalue().
+
2016-11-08 Jun-ichi Takimoto <takimoto-j@kba.biglobe.ne.jp>
* 39857: Completion/Unix/Command/_top: add support for darwin,
@@ -5,8 +9,8 @@
2016-11-08 Peter Stephenson <p.stephenson@samsung.com>
- * Src/builtin.c, Test/C03traps.ztst: ensure exit trap can always
- run.
+ * 39870: Src/builtin.c, Test/C03traps.ztst: ensure exit trap can
+ always run.
* unposted: Src/utils.c: follow up to 39867: don't need test
against zero any more.
diff --git a/Src/params.c b/Src/params.c
index 0894241b9..19a8c291d 100644
--- a/Src/params.c
+++ b/Src/params.c
@@ -2060,6 +2060,7 @@ getstrvalue(Value v)
{
char *s, **ss;
char buf[BDIGBUFSIZE];
+ int len = -1;
if (!v)
return hcalloc(1);
@@ -2237,22 +2238,30 @@ getstrvalue(Value v)
return s;
if (v->start < 0) {
- v->start += strlen(s);
+ len = strlen(s);
+ v->start += len;
if (v->start < 0)
v->start = 0;
}
if (v->end < 0) {
- v->end += strlen(s);
+ if (len < 0)
+ len = strlen(s);
+ v->end += len;
if (v->end >= 0) {
char *eptr = s + v->end;
if (*eptr)
v->end += MB_METACHARLEN(eptr);
}
}
- s = (v->start > (int)strlen(s)) ? dupstring("") : dupstring(s + v->start);
+
+ if (len < 0)
+ len = strlen(s);
+ s = (v->start > len) ? dupstring("") :
+ dupstring_wlen(s + v->start, len - v->start);
+
if (v->end <= v->start)
s[0] = '\0';
- else if (v->end - v->start <= (int)strlen(s))
+ else if (v->end - v->start <= len - v->start)
s[v->end - v->start] = '\0';
return s;
diff --git a/Src/string.c b/Src/string.c
index 04e7446c9..b46ea60cf 100644
--- a/Src/string.c
+++ b/Src/string.c
@@ -43,6 +43,19 @@ dupstring(const char *s)
/**/
mod_export char *
+dupstring_wlen(const char *s, unsigned len)
+{
+ char *t;
+
+ if (!s)
+ return NULL;
+ t = (char *) zhalloc(len + 1);
+ strcpy(t, s);
+ return t;
+}
+
+/**/
+mod_export char *
ztrdup(const char *s)
{
char *t;