From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 17817 invoked by alias); 27 Oct 2015 17:18:39 -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: 36985 Received: (qmail 9258 invoked from network); 27 Oct 2015 17:18:37 -0000 X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, T_DKIM_INVALID autolearn=ham autolearn_force=no version=3.4.0 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:from:date:message-id:subject:to:content-type; bh=Lnm0i8yDURV7TLmWFjcJeoHHiCW+MQYrRPBV+frdkFY=; b=0XSF+y0AqFk/gYipmtOrfJr4KecWGSMB2RguMPgXWawzqw6PJ4kIYUKecoC7Wy42CM WsdhgZewQW/42Z2OtvXiiLsuaAxQX6cJYOEWuTX+MfqNso/gxoVDDFlPth8/0hg2jR+f aO5WPIBlXBg3PH3+d8Bh9X6YVQZMcVdD3ez5rca/UidBx9Jk8k2Q71QdD5xFMZCzlLGI gjfA55cKY80g9lAV8/cWvMs7sCK5dAEVtahCiKukub5F/+qNZoXL5Yd+t6knPIElTLk+ wvwBcRtUl+TENCwu0218w5Y2ZXv4N+74NgZ7S2Lu701VtepfQY77ccqBHAfV3bRFpedk WVDw== X-Received: by 10.25.78.80 with SMTP id c77mr13881524lfb.18.1445966313601; Tue, 27 Oct 2015 10:18:33 -0700 (PDT) MIME-Version: 1.0 From: Sebastian Gniazdowski Date: Tue, 27 Oct 2015 18:18:14 +0100 Message-ID: Subject: [PATCH] Index of element after width of characters To: zsh-workers@zsh.org Content-Type: multipart/mixed; boundary=001a114194e47b96c305231944d0 --001a114194e47b96c305231944d0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Hello, I had to implement horizontal scrolling of text and noticed that Asian characters can have width of two. Scrolling via indexes of strings was giving different speeds to normal and to the wide characters. I then noticed useful (m) flag that returns widths. Scrolling can be done this way but basically it requires to output characters one by one. I then thought about new flag. It should be handy in various multi byte scenarios, e.g. in prompts. From submitted documentation: y:width: Index-post-width: for strings substitutes index of first character that is located fully after width `width' of characters (multibyte characters may have widths of e.g. 2, see the `m' flag). For arrays it substitutes index o= f first element that appears after elements whose summed width is at least `width'. -1 is substituted if there is no such character or array element. Also a comment from code: /* Reached the width? * If single-width char 'd' reaches width say 4 it'll look like= : * abcd|ef * `e' is the returned (by index) character. * * If double-width char (de) reaches the width: * abc(d|e)f * `f' is the returned (by index) character * */ The code works, however not in the test that I commit. Wonder why it works in scripts and at prompt but not in the test? Output of the test is: *** 1,8 **** ! 1 ! 2 ! 2 ! 3 ! 3 ! 4 ! -1 ! -1 --- 1,8 ---- ! 1 ! 8 ! -1 ! -1 ! -1 ! -1 ! -1 ! -1 The code should be well adapted, because it works like # flag (get length), it's in the same place in subst.c. I hope that because of this everything is in check. The function in Src/utils.c is a copied and modified mature function metacharlenconv(). After things are clarified I'll probably submit one other flag 'x' that will substitute last index that yields width lesser than a given one (nickname index-pre-width?). So it will be a nice mnemonic =E2=80=93 y =E2=80=93 afte= r, x =E2=80=93 before (a width). Best regards, Sebastian Gniazdowski --001a114194e47b96c305231944d0 Content-Type: application/octet-stream; name="index-post-width.patch" Content-Disposition: attachment; filename="index-post-width.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_ig9mxow30 ZGlmZiAtLWdpdCBhL0RvYy9ac2gvZXhwbi55byBiL0RvYy9ac2gvZXhwbi55bwppbmRleCA1ZWE4 NjEwLi4zNGQ0ZTg2IDEwMDY0NAotLS0gYS9Eb2MvWnNoL2V4cG4ueW8KKysrIGIvRG9jL1pzaC9l eHBuLnlvCkBAIC0xMzM1LDYgKzEzMzUsMTMgQEAgd2lsbCByZW1vdmUgdGhlIHNhbWUgbWF0Y2hl cyBhcyBmb3IgYHR0KCMpJywgYnV0IGluIHJldmVyc2Ugb3JkZXIsIGFuZCB0aGUKIGZvcm0gdXNp bmcgYHR0KCUlKScgd2lsbCByZW1vdmUgdGhlIHNhbWUgbWF0Y2hlcyBhcyBmb3IgYHR0KCMjKScg aW4gcmV2ZXJzZQogb3JkZXIuCiApCitpdGVtKHR0KHg6KXZhcih3aWR0aCl0dCg6KSkoCitJbmRl eC1wb3N0LXdpZHRoOiBmb3Igc3RyaW5ncyBzdWJzdGl0dXRlcyBpbmRleCBvZiBmaXJzdCBjaGFy YWN0ZXIgdGhhdCBpcworbG9jYXRlZCBmdWxseSBhZnRlciB3aWR0aCB2YXIod2lkdGgpIG9mIGNo YXJhY3RlcnMgKG11bHRpYnl0ZSBjaGFyYWN0ZXJzIG1heQoraGF2ZSB3aWR0aHMgb2YgZS5nLiAy LCBzZWUgdGhlIHR0KG0pIGZsYWcpLiBGb3IgYXJyYXlzIGl0IHN1YnN0aXR1dGVzIGluZGV4IG9m CitmaXJzdCBlbGVtZW50IHRoYXQgYXBwZWFycyBhZnRlciBlbGVtZW50cyB3aG9zZSBzdW1tZWQg d2lkdGggaXMgYXQgbGVhc3QKK3Zhcih3aWR0aCkuIC0xIGlzIHN1YnN0aXR1dGVkIGlmIHRoZXJl IGlzIG5vIHN1Y2ggY2hhcmFjdGVyIG9yIGFycmF5IGVsZW1lbnQuCispCiBpdGVtKHR0KEIpKSgK IEluY2x1ZGUgdGhlIGluZGV4IG9mIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG1hdGNoIGluIHRoZSBy ZXN1bHQuCiApCmRpZmYgLS1naXQgYS9TcmMvc3Vic3QuYyBiL1NyYy9zdWJzdC5jCmluZGV4IDAy MWQyMzQuLjc2NGJkMTcgMTAwNjQ0Ci0tLSBhL1NyYy9zdWJzdC5jCisrKyBiL1NyYy9zdWJzdC5j CkBAIC0xNTkwLDYgKzE1OTAsOCBAQCBwYXJhbXN1YnN0KExpbmtMaXN0IGwsIExpbmtOb2RlIG4s IGNoYXIgKipzdHIsIGludCBxdCwgaW50IHBmX2ZsYWdzKQogICAgIGludCBmbGFncyA9IDA7CiAg ICAgLyogVmFsdWUgZnJvbSAoSSkgZmxhZywgdXNlZCBmb3IgZGl0dG8uICovCiAgICAgaW50IGZs bnVtID0gMDsKKyAgICAvKiBWYWx1ZSBmcm9tICh5KSBmbGFnLiAqLworICAgIGludCB5bnVtID0g LTE7CiAgICAgLyoKICAgICAgKiBzb3J0aXQgaXMgdG8gYmUgcGFzc2VkIHRvIHN0cm1ldGFzb3J0 KCkuCiAgICAgICogaW5kb3JkIGlzIHRoZSAoYSkgZmxhZywgd2hpY2ggZm9yIGNvbnNpc3RlbmN5 IGRvZXNuJ3QgZ2V0CkBAIC0xOTAxLDYgKzE5MDMsMTQgQEAgcGFyYW1zdWJzdChMaW5rTGlzdCBs LCBMaW5rTm9kZSBuLCBjaGFyICoqc3RyLCBpbnQgcXQsIGludCBwZl9mbGFncykKIAkJICAgIHdo aWNobGVuID0gMzsKIAkJICAgIGJyZWFrOwogCisJCWNhc2UgJ3knOgorCQkgICAgcysrOworCQkg ICAgeW51bSA9IGdldF9pbnRhcmcoJnMsICZkZWxsZW4pOworCQkgICAgaWYgKHludW0gPCAwKQor CQkJZ290byBmbGFnZXJyOworCQkgICAgcy0tOworCQkgICAgYnJlYWs7CisKIAkJY2FzZSAnZic6 CiAJCSAgICBzcHNlcCA9ICJcbiI7CiAJCSAgICBicmVhazsKQEAgLTMzNDIsNiArMzM1Miw1MSBA QCBwYXJhbXN1YnN0KExpbmtMaXN0IGwsIExpbmtOb2RlIG4sIGNoYXIgKipzdHIsIGludCBxdCwg aW50IHBmX2ZsYWdzKQogCXZhbCA9IGR1cHN0cmluZyhidWYpOwogCWlzYXJyID0gMDsKICAgICB9 CisKKyAgICAvKiBJbmRleC1wb3N0LXdpZHRoICovCisgICAgaWYoeW51bSA+PSAwKSB7CisgICAg ICAgIGNoYXIgYnVmWzE0XTsKKworCWlmIChpc2FycikgeworICAgICAgICAgICAgbG9uZyBpbmRl eDsKKworICAgICAgICAgICAgLy8gV2lkdGggMCBpcyB0cmVhdGVkIGltbWVkaWV0YWxseSDigJMg YW55CisgICAgICAgICAgICAvLyBmaXJzdCBhcnJheSBlbGVtZW50IGZ1bGZpbHMKKyAgICAgICAg ICAgIGlmICggeW51bSA9PSAwICkgeworICAgICAgICAgICAgICAgIGlmKCAqYXZhbCApCisgICAg ICAgICAgICAgICAgICAgIGluZGV4ID0gMTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAg ICAgICAgICAgICAgIGluZGV4ID0gLTE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAg ICAgICAgIGNoYXIgKipjdHIgPSBhdmFsOworICAgICAgICAgICAgICAgIGxvbmcgY291bnQgPSAw LCBjdXJyZW50X3dpZHRoID0gMDsKKyAgICAgICAgICAgICAgICBpbmRleCA9IC0xOworCisgICAg ICAgICAgICAgICAgd2hpbGUoICpjdHIgKSB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICsr OworICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3dpZHRoICs9IE1CX01FVEFTVFJMRU4yKCpj dHIsIDEpOworCisgICAgICAgICAgICAgICAgICAgIGlmKCBjdXJyZW50X3dpZHRoID49IHludW0g KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBFbGVtZW50IGFmdGVyIHRoZSByZXF1aXJl ZCB3aWR0aAorICAgICAgICAgICAgICAgICAgICAgICAgaWYoICooY3RyKzEpICkKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICBpbmRleCA9IGNvdW50KzE7CisgICAgICAgICAgICAgICAgICAg ICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSAtMTsKKyAgICAg ICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAg ICAgICAgICAgICAgICAgY3RyICsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0K KworICAgICAgICAgICAgc3ByaW50ZihidWYsICIlbGQiLCBpbmRleCk7CisgICAgICAgIH0gZWxz ZSB7CisgICAgICAgICAgICBzcHJpbnRmKGJ1ZiwgIiVkIiwgbWJfaW5kZXhfcG9zdF93aWR0aCh2 YWwsIHludW0pKTsKKyAgICAgICAgfQorICAgICAgICB2YWwgPSBkdXBzdHJpbmcoYnVmKTsKKyAg ICAgICAgaXNhcnIgPSAwOworICAgIH0KKwogICAgIC8qIEF0IHRoaXMgcG9pbnQgd2UgbWFrZSBz dXJlIHRoYXQgb3VyIGFycmF5bmVzcyBoYXMgYWZmZWN0ZWQgdGhlCiAgICAgICogYXJyYXluZXNz IG9mIHRoZSBsaW5rZWQgbGlzdC4gIFRoZW4sIHdlIGNhbiB0dXJuIG91ciB2YWx1ZSBpbnRvCiAg ICAgICogYSBzY2FsYXIgZm9yIGNvbnZlbmllbmNlIHNha2Ugd2l0aG91dCBhZmZlY3RpbmcgdGhl IGFycmF5bmVzcwpkaWZmIC0tZ2l0IGEvU3JjL3V0aWxzLmMgYi9TcmMvdXRpbHMuYwppbmRleCAw YWZhOGM5Li4zMTBiMGRiIDEwMDY0NAotLS0gYS9TcmMvdXRpbHMuYworKysgYi9TcmMvdXRpbHMu YwpAQCAtNTE1NCw2ICs1MTU0LDEwNCBAQCBtYl9jaGFybGVuY29udihjb25zdCBjaGFyICpzLCBp bnQgc2xlbiwgd2ludF90ICp3Y3ApCiAgICAgcmV0dXJuIG1iX2NoYXJsZW5jb252X3Iocywgc2xl biwgd2NwLCAmbWJfc2hpZnRzdGF0ZSk7CiB9CiAKKy8qCisgKiBSZXR1cm5zIGluZGV4IG9mIGNo YXJhY3RlciB0aGF0IGlzIGxvY2F0ZWQgZmlyc3QgYWZ0ZXIgd2lkdGggYHdpZHRoYAorICovCisv KiovCittb2RfZXhwb3J0IGludAorbWJfaW5kZXhfcG9zdF93aWR0aChjaGFyICpwdHIsIGludCB3 aWR0aCkKK3sKKyAgICBjaGFyIGluY2hhciwgKmxhc3RzdGFydDsKKyAgICBzaXplX3QgcmV0Owor ICAgIHdjaGFyX3Qgd2M7CisgICAgaW50IG51bSwgbnVtX2luX2NoYXIsIGluZGV4OworCisgICAg Ly8gQWxsIGNoYXJhY3RlcnMgdHJlYXRlZCBhcyB3aWR0aCAxCisgICAgaWYgKCFpc3NldChNVUxU SUJZVEUpKSB7CisgICAgICAgIHNpemVfdCBsZW4gPSB6dHJsZW4ocHRyKTsKKyAgICAgICAgaWYo IGxlbiA+IHdpZHRoICkgeworICAgICAgICAgICAgcmV0dXJuIHdpZHRoICsgMTsKKyAgICAgICAg fSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKworICAg IC8vIFdpZHRoIDAgaXMgdHJlYXRlZCBpbW1lZGlldGFsbHkKKyAgICBpZiggd2lkdGggPT0gMCAp IHsKKyAgICAgICAgaWYoICpwdHIgKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIGVs c2UKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBsYXN0c3RhcnQgPSBwdHI7 CisgICAgcmV0ID0gTUJfSU5WQUxJRDsKKyAgICBudW0gPSBudW1faW5fY2hhciA9IGluZGV4ID0g MDsKKworICAgIG1lbXNldCgmbWJfc2hpZnRzdGF0ZSwgMCwgc2l6ZW9mKG1iX3NoaWZ0c3RhdGUp KTsKKyAgICB3aGlsZSAoKnB0cikgeworCWlmICgqcHRyID09IE1ldGEpCisJICAgIGluY2hhciA9 ICorK3B0ciBeIDMyOworCWVsc2UKKwkgICAgaW5jaGFyID0gKnB0cjsKKwlwdHIrKzsKKwlyZXQg PSBtYnJ0b3djKCZ3YywgJmluY2hhciwgMSwgJm1iX3NoaWZ0c3RhdGUpOworCisJaWYgKHJldCA9 PSBNQl9JTkNPTVBMRVRFKSB7CisJICAgIG51bV9pbl9jaGFyKys7CisJfSBlbHNlIHsKKyAgICAg ICAgICAgIC8qIENvdW50IGNvbXBsZXRlIGNoYXJzLCB3aGljaCBiYXNpY2FsbHkgc2hvdWxkIGJl IGluZGV4ZXMgaW4KKyAgICAgICAgICAgICAqIHdjaGFyX3QgYXJyYXksIHJpZ2h0PyAqLworICAg ICAgICAgICAgaW5kZXgrKzsKKworCSAgICBpZiAocmV0ID09IE1CX0lOVkFMSUQpIHsKKwkJLyog UmVzZXQsIHRyZWF0IGFzIHNpbmdsZSBjaGFyYWN0ZXIsIGFuZCBzaW5nbGUgd2lkdGggKi8KKwkJ bWVtc2V0KCZtYl9zaGlmdHN0YXRlLCAwLCBzaXplb2YobWJfc2hpZnRzdGF0ZSkpOworCQlwdHIg PSBsYXN0c3RhcnQgKyAoKmxhc3RzdGFydCA9PSBNZXRhKSArIDE7CisJCW51bSsrOworCSAgICB9 IGVsc2UgeworCQkvKgorCQkgKiBSZXR1cm5zIC0xIGlmIG5vdCBhIHByaW50YWJsZSBjaGFyYWN0 ZXIuICBXZQorCQkgKiB0dXJuIHRoaXMgaW50byAwLiBUaGF0IG1ha2VzIHF1aXRlIHNlbnNlIGFz CisgICAgICAgICAgICAgICAgICogd2UgYXJlIGludGVyZXN0ZWQgaW4gd2lkdGggb2YgY2hhcmFj dGVycywKKyAgICAgICAgICAgICAgICAgKiBhbmQgYW4gdW5wcmludGFibGUgb25lIGRvZXNuJ3Qg aGF2ZSBpdAorCQkgKi8KKwkJaW50IHdjdyA9IFdDV0lEVEgod2MpOworCQlpZiAod2N3ID4gMCkK KyAgICAgICAgICAgICAgICAgICAgbnVtICs9IHdjdzsKKwkgICAgfQorCisgICAgICAgICAgICAv KiBSZWFjaGVkIHRoZSB3aWR0aD8KKyAgICAgICAgICAgICAqIElmIHNpbmdsZS13aWR0aCBjaGFy ICdkJyByZWFjaGVzIHdpZHRoIHNheSA0IGl0J2xsIGxvb2sgbGlrZToKKyAgICAgICAgICAgICAq ICAgICBhYmNkfGVmCisgICAgICAgICAgICAgKiBgZScgaXMgdGhlIHJldHVybmVkIChieSBpbmRl eCkgY2hhcmFjdGVyLgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIElmIGRvdWJsZS13 aWR0aCBjaGFyIChkZSkgcmVhY2hlcyB0aGUgd2lkdGg6CisgICAgICAgICAgICAgKiAgICAgYWJj KGR8ZSlmCisgICAgICAgICAgICAgKiBgZicgaXMgdGhlIHJldHVybmVkIChieSBpbmRleCkgY2hh cmFjdGVyCisgICAgICAgICAgICAgKiAqLworICAgICAgICAgICAgaWYgKG51bSA+PSB3aWR0aCkg eworICAgICAgICAgICAgICAgIC8qIFdlIG5vdyBuZWVkIHRvIHJldHVybiB0aGUgbmV4dCBpbmRl eCwKKyAgICAgICAgICAgICAgICAgKiBhZnRlciB3ZSBjaGVjayBpdCBleGlzdHMgKi8KKyAgICAg ICAgICAgICAgICBpZiggKnB0ciApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbmRleCsx OworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwor ICAgICAgICAgICAgfQorCisJICAgIGxhc3RzdGFydCA9IHB0cjsKKwkgICAgbnVtX2luX2NoYXIg PSAwOworCX0KKyAgICB9CisKKyAgICAvKiBXZSBjaG9vc2UgdG8gcG9pbnQgdG8gaW5jb21wbGV0 ZSBjaGFyYWN0ZXIgaWYgaXQncyBwb3N0IHRoZSB3aWR0aCAqLworICAgIGlmIChudW0gKyAobnVt X2luX2NoYXIgPiAwID8gMSA6IDApID4gd2lkdGgpIHsKKyAgICAgICAgcmV0dXJuIGluZGV4KzE7 CisgICAgfQorCisgICAgcmV0dXJuIC0xOworfQorCiAvKiovCiAjZWxzZQogCmRpZmYgLS1naXQg YS9UZXN0L0QxMHdpZHRoLnp0c3QgYi9UZXN0L0QxMHdpZHRoLnp0c3QKbmV3IGZpbGUgbW9kZSAx MDA2NDQKaW5kZXggMDAwMDAwMC4uOTdlNmMxMQotLS0gL2Rldi9udWxsCisrKyBiL1Rlc3QvRDEw d2lkdGguenRzdApAQCAtMCwwICsxLDQzIEBACisjIFRlc3QgdGhlICh5OndpZHRoOikgZmxhZwor CisldGVzdAorCisgIHNldG9wdCBtdWx0aWJ5dGUKKyAgYT0i5ris6KmmYeWPpSIKKyAgcHJpbnQg JHsoeTowOilhfQorICBwcmludCAkeyh5OjE6KWF9CisgIHByaW50ICR7KHk6MjopYX0KKyAgcHJp bnQgJHsoeTozOilhfQorICBwcmludCAkeyh5OjQ6KWF9CisgIHByaW50ICR7KHk6NTopYX0KKyAg cHJpbnQgJHsoeTo2OilhfQorICBwcmludCAkeyh5Ojc6KWF9CiswOmluZGV4LXBvc3Qtd2lkdGgg Zm9yIHN0cmluZ3MKKz4gMQorPiAyCis+IDIKKz4gMworPiAzCis+IDQKKz4gLTEKKz4gLTEKKwor ICBzZXRvcHQgbXVsdGlieXRlCisgIGE9KCAi5ris6KmmYeWPpSIgIua4rCIgImEiICLlj6Xlj6Ui ICkKKyAgcHJpbnQgJHsoeTowOilhfQorICBwcmludCAkeyh5OjE6KWF9CisgIHByaW50ICR7KHk6 NzopYX0KKyAgcHJpbnQgJHsoeTo4OilhfQorICBwcmludCAkeyh5Ojk6KWF9CisgIHByaW50ICR7 KHk6MTA6KWF9CisgIHByaW50ICR7KHk6MTE6KWF9CisgIHByaW50ICR7KHk6MTQ6KWF9CiswOmlu ZGV4LXBvc3Qtd2lkdGggZm9yIGFycmF5cworPiAxCis+IDIKKz4gMgorPiAzCis+IDMKKz4gNAor PiAtMQorPiAtMQo= --001a114194e47b96c305231944d0--