From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 1480 invoked by alias); 9 Nov 2016 11:42:20 -0000 Mailing-List: contact zsh-workers-help@zsh.org; run by ezmlm Precedence: bulk X-No-Archive: yes List-Id: Zsh Workers List List-Post: List-Help: X-Seq: 39886 Received: (qmail 4342 invoked from network); 9 Nov 2016 11:42:20 -0000 X-Qmail-Scanner-Diagnostics: from mailout3.w1.samsung.com by f.primenet.com.au (envelope-from , uid 7791) with qmail-scanner-2.11 (clamdscan: 0.99.2/21882. spamassassin: 3.4.1. Clear:RC:0(210.118.77.13):SA:0(-2.9/5.0):. Processed in 0.517132 secs); 09 Nov 2016 11:42:20 -0000 X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=-2.9 required=5.0 tests=RP_MATCHES_RCVD autolearn=unavailable autolearn_force=no version=3.4.1 X-Envelope-From: p.stephenson@samsung.com X-Qmail-Scanner-Mime-Attachments: | X-Qmail-Scanner-Zip-Files: | Received-SPF: none (ns1.primenet.com.au: domain at samsung.com does not designate permitted sender hosts) X-AuditID: cbfec7f2-f79556d000002c42-85-58230b93f0e6 Date: Wed, 09 Nov 2016 11:42:07 +0000 From: Peter Stephenson To: zsh-workers@zsh.org Subject: Re: [PATCH] Optimization of getarrvalue() Message-id: <20161109114207.6b929440@pwslap01u.europe.root.pri> In-reply-to: <1478635899.1897979.781551353.05792438@webmail.messagingengine.com> Organization: Samsung Cambridge Solution Centre X-Mailer: Claws Mail 3.7.9 (GTK+ 2.22.0; i386-redhat-linux-gnu) MIME-version: 1.0 Content-type: text/plain; charset=UTF-8 Content-transfer-encoding: quoted-printable X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrDIsWRmVeSWpSXmKPExsWy7djPc7qTuZUjDBYeFbU42PyQyYHRY9XB D0wBjFFcNimpOZllqUX6dglcGa071zIWtAlXNHQ/Y21gbOHrYuTkkBAwkejf3MQCYYtJXLi3 nq2LkYtDSGApo8TEvuWMEE4vk8SNFX1MMB33L0xkgUgsY5RY8uweK0hCSGAak8SWnVoQidOM En2TPzBDOGcYJbauX84GUsUioCrR3jcTzGYTMJSYumk2I4gtIiAucXbtebBDhAWMJA6f3cYM YvMK2EvM+LAPrIZTIEDizL/XYL38AvoSV/9+gjrJXmLmlTOMEPWCEj8m3wObwyygKbF193p2 CFtb4sm7C6wgB0kI/GeT6JzQBdTMAeTISmw6wAwxx0ViW+95dghbWOLV8S1QtoxEZ8dBqF39 jBJPun0h5sxglDh9ZgcbRMJaou/2RUaIZXwSk7ZNZ4aYzyvR0SYEUeIhsXfuWaiwo8SDd9YT GBVnIbl6FpKrZyG5egEj8ypGkdTS4tz01GJjveLE3OLSvHS95PzcTYzANHD63/FPOxi/nrA6 xCjAwajEw5vxUDFCiDWxrLgy9xCjBAezkgjvF07lCCHelMTKqtSi/Pii0pzU4kOM0hwsSuK8 exZcCRcSSE8sSc1OTS1ILYLJMnFwSjUwBrxfu+HxmqtSgXZmmvZzwry/LG6c6eMWoP9tQ9e+ eTrn9U6yfXh3pJ+p5Z+ux7+Pk0o/asabOX5zvTvD7vfuRZfO8nlWhu1du+Hyt5lqrb4h5pwR Z6OqpMMb1m5M+f1Ou/3P2p+ef8/Xrrqqe36qlXXDy8MZJhr1Jw99tJ7GxjnxNONDnorzq5VY ijMSDbWYi4oTAYcWVIf/AgAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrGIsWRmVeSWpSXmKPExsVy+t/xq7qTuJUjDLpna1kcbH7I5MDoserg B6YAxig3m4zUxJTUIoXUvOT8lMy8dFul0BA3XQslhbzE3FRbpQhd35AgJYWyxJxSIM/IAA04 OAe4Byvp2yW4ZbTuXMtY0CZc0dD9jLWBsYWvi5GTQ0LAROL+hYksELaYxIV769m6GLk4hASW MEq07jkLlhASmMEkceCMEETiNKPEtN1rWCGcM4wSU18/YQKpYhFQlWjvm8kGYrMJGEpM3TSb EcQWERCXOLv2PNgkYQEjicNntzGD2LwC9hIzPuwDq+EUCJA48+811OqljBJtR7aBDeIX0Je4 +vcTE8R99hIzr5xhhGgWlPgx+R7YUGYBdYlJ8xYxQ9jaEk/eXWCFOFtd4sbd3ewTGIVnIWmZ haRlFpKWBYzMqxhFUkuLc9Nziw31ihNzi0vz0vWS83M3MQLjaNuxn5t3MF7aGHyIUYCDUYmH N+OhYoQQa2JZcWXuIUYJDmYlEV4DLuUIId6UxMqq1KL8+KLSnNTiQ4ymwJCZyCwlmpwPjPG8 knhDE0NzS0MjYwsLcyMjJXHekg9XwoUE0hNLUrNTUwtSi2D6mDg4pRoYp2x7cDjw2o1Jl8um JBTVezx80HXdfVbDV99rveo5PLNKG/QXs5+surh8iaql7jbxKrleybP1rWp7b5cuZna5diK/ rtZzjSKTrsJC16k7JLrZHbM9bbb6FkYZp3uICMZMmR2UFHk+4eNmLt6FvzZ4XpfQKS/vv/Mu 3UlD41ro8Usu+n3PfkQpsRRnJBpqMRcVJwIAXjTNUrkCAAA= X-MTR: 20000000000000000@CPGS X-CMS-MailID: 20161109114210eucas1p2967523e5ec9a00aa7ebdf59d3c834cfa X-Msg-Generator: CA X-Sender-IP: 182.198.249.179 X-Local-Sender: =?UTF-8?B?UGV0ZXIgU3RlcGhlbnNvbhtTQ1NDLURhdGEgUGxhbmUb?= =?UTF-8?B?7IK87ISx7KCE7J6QG1ByaW5jaXBhbCBFbmdpbmVlciwgU29mdHdhcmU=?= X-Global-Sender: =?UTF-8?B?UGV0ZXIgU3RlcGhlbnNvbhtTQ1NDLURhdGEgUGxhbmUbU2Ft?= =?UTF-8?B?c3VuZyBFbGVjdHJvbmljcxtQcmluY2lwYWwgRW5naW5lZXIsIFNvZnR3YXJl?= X-Sender-Code: =?UTF-8?B?QzEwG0VIURtDMTBDRDA1Q0QwNTAwNTg=?= CMS-TYPE: 201P X-HopCount: 7 X-CMS-RootMailID: 20161108201233epcas1p1e2900e2d67af8b8558ebdb70eb7ad480 X-RootMTR: 20161108201233epcas1p1e2900e2d67af8b8558ebdb70eb7ad480 References: <1478635899.1897979.781551353.05792438@webmail.messagingengine.com> On Tue, 08 Nov 2016 12:11:39 -0800 Sebastian Gniazdowski wrote: > The function contains arrdup() that includes elements beyond end index. > I've replaced it with arrdup_max() that has limit parameter =E2=80=93=C2= =A0will > duplicate at most that limit of elements. I'm not 100% sure that it's safe to write to the source string in all cases (in particular, if the array is special). I've replaced this with the following. It shouldn't make any significant difference. pws diff --git a/Src/params.c b/Src/params.c index 3f01792..772345b 100644 --- a/Src/params.c +++ b/Src/params.c @@ -2294,14 +2294,24 @@ getarrvalue(Value v) v->start +=3D arrlen(s); if (v->end < 0) v->end +=3D arrlen(s) + 1; - if (arrlen_lt(s, v->start) || v->start < 0) + + /* Null if 1) array too short, 2) index still negative */ + if (arrlen_lt(s, v->start) || v->start < 0) { s =3D arrdup(nular); - else - s =3D arrdup(s + v->start); - if (v->end <=3D v->start) - s[0] =3D NULL; - else if (arrlen_ge(s, v->end - v->start)) - s[v->end - v->start] =3D NULL; + } else if (v->end <=3D v->start) { + s =3D arrdup_max(s, 1); + s[0] =3D NULL; + } else { + /* Copy to a point before the end of the source array: + * arrdup_max will copy at most v->end - v->start elements, + * starting from v->start element. Original code said: + * s[v->end - v->start] =3D NULL + * which means that there are exactly the same number of + * elements as the value of the above *0-based* index. + */ + s =3D arrdup_max(s + v->start, v->end - v->start); + } + return s; } =20 diff --git a/Src/utils.c b/Src/utils.c index 93e757c..3d535b8 100644 --- a/Src/utils.c +++ b/Src/utils.c @@ -4229,6 +4229,31 @@ arrdup(char **s) return y; } =20 +/* Duplicate at most max elements of the array s with heap memory */ + +/**/ +mod_export char ** +arrdup_max(char **s, unsigned max) +{ + char **x, **y, **send; + int len; + + len =3D arrlen(s); + + /* Limit has sense only if not equal to len */ + if (max > len) + max =3D len; + + y =3D x =3D (char **) zhalloc(sizeof(char *) * (max + 1)); + + send =3D s + max; + while (s < send) + *x++ =3D dupstring(*s++); + *x =3D NULL; + + return y; +} + /**/ mod_export char ** zarrdup(char **s)