diff options
author | Sebastian Gniazdowski <psprint@fastmail.com> | 2016-11-08 05:37:53 -0800 |
---|---|---|
committer | Peter Stephenson <pws@zsh.org> | 2016-11-08 15:14:08 +0000 |
commit | 06e4ec853a2ee0bde0efb8ed6c0fad2ac4162942 (patch) | |
tree | 8539bf19af45394bedcbc80bf3d9f1c3f78da262 | |
parent | a57977d01acc3b1b63aec1b79394ef7ffd052912 (diff) | |
download | zsh-06e4ec853a2ee0bde0efb8ed6c0fad2ac4162942.tar.gz zsh-06e4ec853a2ee0bde0efb8ed6c0fad2ac4162942.tar.xz zsh-06e4ec853a2ee0bde0efb8ed6c0fad2ac4162942.zip |
39871: cut down number of strlen()s in getstrvalue()
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | Src/params.c | 17 | ||||
-rw-r--r-- | Src/string.c | 13 |
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; |