From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on inbox.vuxu.org X-Spam-Level: X-Spam-Status: No, score=-3.3 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED,UNPARSEABLE_RELAY autolearn=ham autolearn_force=no version=3.4.4 Received: (qmail 6017 invoked from network); 3 Jun 2021 02:05:01 -0000 Received: from zero.zsh.org (2a02:898:31:0:48:4558:7a:7368) by inbox.vuxu.org with ESMTPUTF8; 3 Jun 2021 02:05:01 -0000 ARC-Seal: i=1; cv=none; a=rsa-sha256; d=zsh.org; s=rsa-20200801; t=1622685901; b=W20XajcxjBgYSzH6XEV2QQaAHuC17UuhTI/jUOcxMOZ6smE3n/5m9XeFmsKfYGdl/uY+x/EXxp P/bBK5sv1B72X+bjH+G9BD4s8doSWGn2os7pFXOh+S0O1TOVC7wWhtqfWka5JR+EDU8FCFKXZP Fabnrh7GkNr4VyNwxAqdbz5PXtIFmkjUgxPYtalfMiAIHdD43Qm6dyYIgLMm+f9WDe0fOlFV1u PvDOrNmM72fWxOpVZCQ7pV1SD0CiGaFH4yfYTN3/EnDOf9dTfp5n4IS1rVIbih2G7Wepo0+Vnj nbh5NaxTCu3e7o/eW3o+7IgbcPOoJZQx+cotaAZQvXhz1g==; ARC-Authentication-Results: i=1; zsh.org; iprev=pass (mail-oi1-f181.google.com) smtp.remote-ip=209.85.167.181; dkim=pass header.d=brasslantern-com.20150623.gappssmtp.com header.s=20150623 header.a=rsa-sha256; dmarc=none header.from=brasslantern.com; arc=none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed; d=zsh.org; s=rsa-20200801; t=1622685901; bh=lbJIvsT4fDslpyXJ9o7xx2L9GZTv99N5T6P/QT3T0nQ=; h=List-Archive:List-Owner:List-Post:List-Unsubscribe:List-Subscribe:List-Help: List-Id:Sender:Content-Type:To:Subject:Message-ID:Date:From:In-Reply-To: References:MIME-Version:DKIM-Signature:DKIM-Signature; b=vt+mNP4yc7M3rNTljchzk3QvzTO0yTYai5aJieZAYxWhf3HyNkn7OEN9jDQjtatQjxfNFVVHgC H48uDZ71/n5CfDkjzqegGi7cETW7Py+npd6epyJ3LQuZSBFUSCNx+bsETs6koHq6XSCP1eAP+F Kk+/8E4HIvq5Tf2B/h5nD/0J5wgclrE/JeZHLwFSidTGuGExyc5IDKdJQJw1J+9hQ5x0St72aZ uG+XvrfMTOsW7MpM8UC/ucnFk5RutSabaHLgPpz4bSbvzypk/Uxt8PVOua2jOMyN6h1vXtEgNg whNFizt+B1J/518nMGZB7A1J/6HI+geMaYxTILqRdkt8aw==; DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=zsh.org; s=rsa-20200801; h=List-Archive:List-Owner:List-Post:List-Unsubscribe: List-Subscribe:List-Help:List-Id:Sender:Content-Type:To:Subject:Message-ID: Date:From:In-Reply-To:References:MIME-Version:Reply-To:Cc: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID; bh=StzTKcirMOaWutLKGsEBOcG68x0dKFj+FkQQRZFlYoc=; b=QvjZwVjjk7jVIPMxxDz1HZLt+3 SQx2FFeCmwC7GW6eGqKKJ1tvjm4APjCRXrQBZdU+NFN6No8x2+rNrwVRY/5P8wRE39KdkDNnrvSWO 6Vn7I0K8JmwxIYOFTMuEVIDjRiheVNLmhPxm+B4ImakQG0b7uJXO4YkHE/QRzuUMvErZSmb9R+TRt 9my5zp24TC0yZV1aP9HKnQJflLQ/SuKNwF69yGuU7SFazpwY+cVVdk0e0Gibh+awzCPN/uGltw71+ HwkbNFNWCseUAlu5jwC5xysSk2QJFTNFIcL8oSdihJx7p+9s9/qk6ZLq2HPCV0vsT9Bpa7sEmA5pv vpQv8TTA==; Received: from authenticated user by zero.zsh.org with local id 1locjD-0000i7-CL; Thu, 03 Jun 2021 02:04:59 +0000 Authentication-Results: zsh.org; iprev=pass (mail-oi1-f181.google.com) smtp.remote-ip=209.85.167.181; dkim=pass header.d=brasslantern-com.20150623.gappssmtp.com header.s=20150623 header.a=rsa-sha256; dmarc=none header.from=brasslantern.com; arc=none Received: from mail-oi1-f181.google.com ([209.85.167.181]:38611) by zero.zsh.org with esmtps (TLS1.3:TLS_AES_128_GCM_SHA256:128) id 1lociU-0000Pq-L0; Thu, 03 Jun 2021 02:04:15 +0000 Received: by mail-oi1-f181.google.com with SMTP id z3so4747083oib.5 for ; Wed, 02 Jun 2021 19:04:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=brasslantern-com.20150623.gappssmtp.com; s=20150623; h=mime-version:references:in-reply-to:from:date:message-id:subject:to; bh=StzTKcirMOaWutLKGsEBOcG68x0dKFj+FkQQRZFlYoc=; b=rct9zPh3v2VgJe7IXLJrEIrXs/LZzQd1rJ9OQqHW5eSX8JWezi+ddQLbAynV/YRyic sv60l03Is5IKbGzpiQCZuVw5UDGYVoeQdHVPhMh/O9K9Tfq3l0QHgsnJexgbQz0dENH8 9fiYMiW3LUHisiIsG0JgW8i3BPIBkycpKdvkBDmNDbRAYk8vPb8RZyTJcGObyzLIHh6k L38wdLzq5MGiGRevLFEkYiIcXyUv9AJZmnLktGMFA8gnTKCnJ+jYXvnOdIzlgNdbid4a wyPA04OiFAl76UQ/UERkd8v1ScUbSvM82q7goGzdY4kc0IJvZxuJT9/TtA7vmkk5eN75 Z1/g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to; bh=StzTKcirMOaWutLKGsEBOcG68x0dKFj+FkQQRZFlYoc=; b=oEMYsjJ8UAjSOp8nXOirIfeRw21sZYTADIcfySjfPOvdeUNoFNihF/4UebXhIPkFNH TuNnb4KLWPJN29vNwlclufngXA9u7JoGcYe38w/eZgwhFIL67EAnyRBW+ZMSdhfih0AD 0CdjAaItZ12h1lX8hLFJHjfggbZxR3egz0g7tpNl9rbpvQ9ksx4MNehvdPg1WYBa1IV7 iIfPnUwpL33IvbR+z8VdOvTNe/tQSX1GkeC9XZtnYzrMWFhkdCwhC4ni0QgMcYOfF8qr XWTyGAWiJxtnnZDsaFXLVjodz/CPHsCep50BL1/omv4VdZQvAYoI1fsJduFYdeHb2pLi +40g== X-Gm-Message-State: AOAM530+VilHNXGo+CKNisDSKJbrs46KKLlD7PXTo7JhlUFlv1c0ULAk j55uUQ+wmuHUMm1JsQrzV0fcfnE9WmSqw6F+xYgqRgP0bcsx3Q== X-Google-Smtp-Source: ABdhPJzshnsoDY6dZv4Byq2k5nsIxqwo7H0BVqe884QrYQXBa+lZri6npLh3vL+WVo/zfBGqkyWbzdmUYPQu/5sYLFk= X-Received: by 2002:aca:5cc2:: with SMTP id q185mr5950192oib.173.1622685853021; Wed, 02 Jun 2021 19:04:13 -0700 (PDT) MIME-Version: 1.0 References: <20200101140343.qwfx2xaojumuds3d@chaz.gmail.com> <20210430061117.buyhdhky5crqjrf2@chazelas.org> <20210505114521.bemoiekpophssbug@chazelas.org> <20210601053235.b4junj6muuwegl7b@chazelas.org> <20210602091145.xvyymjxdors6kqya@chazelas.org> <20210602142005.b5tw2hj2c6q3psqv@chazelas.org> In-Reply-To: From: Bart Schaefer Date: Wed, 2 Jun 2021 19:04:01 -0700 Message-ID: Subject: [PATCH (not final)] (take three?) unset "array[$anything]" To: Zsh hackers list Content-Type: multipart/mixed; boundary="000000000000da2efd05c3d2fd4c" X-Seq: 48993 Archived-At: X-Loop: zsh-workers@zsh.org Errors-To: zsh-workers-owner@zsh.org Precedence: list Precedence: bulk Sender: zsh-workers-request@zsh.org X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: --000000000000da2efd05c3d2fd4c Content-Type: text/plain; charset="UTF-8" On Wed, Jun 2, 2021 at 8:59 AM Bart Schaefer wrote: > > I've just had a hand-slaps-forehead > moment ... take 3 to follow in another thread. What I realized is that for any unset of an array element, the closing bracket must always be the last character of the argument. There's no reason to parse the subscript or skip over matching brackets; if a '[' is found, just make sure the last character is ']' and the subscript must be everything in between. % typeset -A ax % for k in '' '\' '`' '(' '[' ')' ']'; do for> ax[$k]=$k for> done % typeset -p ax typeset -A ax=( ['']='' ['(']='(' [')']=')' ['[']='[' ['\']='\' [']']=']' ['`']='`' ) % for k in ${(k)ax}; do unset "ax[$k]" done % typeset -p ax typeset -A ax=( ) Given this realization, it's easy to make { unset "hash[$key]" } work "like it always should have". The trouble comes in with (not) breaking past workarounds. Because the current (and theoretically experimental, though we forgot about that for 5 years) code uses parse_subscript(), we get a partly-tokenized (as if double-quoted, actually) string in the cases where backslashes are used to force the closing bracket to be found. If those backslashes aren't needed any more, there's no clean way to ignore them upon untokenize, to get back to something that actually matches the intended hash key. The attached not-ready-for-push patch has 4 variations that can be chosen by #define, currently set up as follows: #define unset_workers_37914 0 #define unset_hashelem_empty_only 0 #define unset_hashelem_literal 1 #define unset_hashelem_stripquote 0 The first one is just the current code. The second one allows { unset "hash[]" } (and gives "invalid subscript" for array[] instead of "invalid parameter name"). The third one, which I have defined by default, uses the subscript literally, so if you can do { hash[$k]=v } you can also do { unset "hash[$k]" } (at least for all cases I tested). The fourth one requires { unset "hash[${(q)k}]" } instead, but I think it otherwise works for all cases. Both of those also work for "hash[]". Therefore I think the best option is to choose one of the latter two, possibly depending on which one induces the least damage to any workarounds for the current behavior that are known in the wild, though aesthetically I'd rather use the literal version. --000000000000da2efd05c3d2fd4c Content-Type: text/plain; charset="US-ASCII"; name="unset_subscripts.txt" Content-Disposition: attachment; filename="unset_subscripts.txt" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_kpg92dwe0 ZGlmZiAtLWdpdCBhL1NyYy9idWlsdGluLmMgYi9TcmMvYnVpbHRpbi5jCmluZGV4IGExNmZkZGNi Ny4uZWMwMzc2MzY3IDEwMDY0NAotLS0gYS9TcmMvYnVpbHRpbi5jCisrKyBiL1NyYy9idWlsdGlu LmMKQEAgLTE5MzMsMTAgKzE5MzMsMTQgQEAgZ2V0YXNnKGNoYXIgKioqYXJndnAsIExpbmtMaXN0 IGFzc2lnbnMpCiAgICAgYXNnLmZsYWdzID0gMDsKIAogICAgIC8qIHNlYXJjaCBmb3IgYD0nICov Ci0gICAgZm9yICg7ICpzICYmICpzICE9ICc9JzsgcysrKTsKKyAgICBmb3IgKDsgKnMgJiYgKnMg IT0gJ1snICYmICpzICE9ICc9JyAvKiAmJiAqcyAhPSAnKycgKi87IHMrKyk7CisgICAgaWYgKHMg PiBhc2cubmFtZSAmJiAqcyA9PSAnWycpIHsKKwljaGFyICpzZSA9IHBhcnNlX3N1YnNjcmlwdChz ICsgMSwgMSwgJ10nKTsKKwlpZiAoc2UgJiYgKnNlID09ICddJykgcyA9IHNlICsgMTsKKyAgICB9 CiAKICAgICAvKiBmb3VuZCBgPScsIHNvIHJldHVybiB3aXRoIGEgdmFsdWUgKi8KLSAgICBpZiAo KnMpIHsKKyAgICBpZiAoKnMgJiYgKnMgPT0gJz0nKSB7CiAJKnMgPSAnXDAnOwogCWFzZy52YWx1 ZS5zY2FsYXIgPSBzICsgMTsKICAgICB9IGVsc2UgewpAQCAtMzcyNCw2ICszNzI4LDExIEBAIGJp bl91bnNldChjaGFyICpuYW1lLCBjaGFyICoqYXJndiwgT3B0aW9ucyBvcHMsIGludCBmdW5jKQog ICAgIHdoaWxlICgocyA9ICphcmd2KyspKSB7CiAJY2hhciAqc3MgPSBzdHJjaHIocywgJ1snKSwg KnN1YnNjcmlwdCA9IDA7CiAJaWYgKHNzKSB7CisjZGVmaW5lIHVuc2V0X3dvcmtlcnNfMzc5MTQg MAorI2RlZmluZSB1bnNldF9oYXNoZWxlbV9lbXB0eV9vbmx5IDAKKyNkZWZpbmUgdW5zZXRfaGFz aGVsZW1fbGl0ZXJhbCAxCisjZGVmaW5lIHVuc2V0X2hhc2hlbGVtX3N0cmlwcXVvdGUgMAorI2lm IHVuc2V0X3dvcmtlcnNfMzc5MTQKIAkgICAgY2hhciAqc3NlOwogCSAgICAqc3MgPSAwOwogCSAg ICBpZiAoKHNzZSA9IHBhcnNlX3N1YnNjcmlwdChzcysxLCAxLCAnXScpKSkgewpAQCAtMzczMyw2 ICszNzQyLDQ3IEBAIGJpbl91bnNldChjaGFyICpuYW1lLCBjaGFyICoqYXJndiwgT3B0aW9ucyBv cHMsIGludCBmdW5jKQogCQlyZW1udWxhcmdzKHN1YnNjcmlwdCk7CiAJCXVudG9rZW5pemUoc3Vi c2NyaXB0KTsKIAkgICAgfQorI2VsaWYgdW5zZXRfaGFzaGVsZW1fZW1wdHlfb25seQorCSAgICBj aGFyICpzc2U7CisJICAgICpzcyA9IDA7CisJICAgIGlmIChzc1sxXSA9PSAnXScgJiYgIXNzWzJd ID8gKHNzZSA9IHNzKzEpIDoKKwkJKHNzZSA9IHBhcnNlX3N1YnNjcmlwdChzcysxLCAxLCAnXScp KSkgeworCQkqc3NlID0gMDsKKwkJc3Vic2NyaXB0ID0gZHVwc3RyaW5nKHNzKzEpOworCQkqc3Nl ID0gJ10nOworCQlyZW1udWxhcmdzKHN1YnNjcmlwdCk7CisJCXVudG9rZW5pemUoc3Vic2NyaXB0 KTsKKwkgICAgfQorI2Vsc2UKKwkgICAgY2hhciAqc3NlID0gc3MgKyBzdHJsZW4oc3MpLTE7CisJ ICAgICpzcyA9IDA7CisJICAgIGlmICgqc3NlID09ICddJykgeworIyBpZiB1bnNldF9oYXNoZWxl bV9saXRlcmFsCisJCSpzc2UgPSAwOworCQlzdWJzY3JpcHQgPSBkdXBzdHJpbmcoc3MrMSk7CisJ CSpzc2UgPSAnXSc7CisjIGVsaWYgdW5zZXRfaGFzaGVsZW1fc3RyaXBxdW90ZQorCQlpbnQgbmUg PSBub2VycnM7CisJCW5vZXJycyA9IDI7CisJCSpzcyA9IDA7CisJCSpzc2UgPSAwOworCQlzdWJz Y3JpcHQgPSBkdXBzdHJpbmcoc3MrMSk7CisJCSpzc2UgPSAnXSc7CisJCS8qCisJCSAqIHBhcnNl X3N1YnN0X3N0cmluZygpIHJlbW92ZXMgb25lIGxldmVsIG9mIHF1b3RpbmcuCisJCSAqIElmIGl0 IHJldHVybnMgbm9uemVybywgc3Vic3RyaW5nIGlzIHVuY2hhbmdlZCwgZWxzZQorCQkgKiBpdCBo YXMgYmVlbiByZS10b2tlbml6ZWQgaW4gcGxhY2UsIHNvIGNsZWFuIGl0IHVwLgorCQkgKi8KKwkJ aWYgKCFwYXJzZV9zdWJzdF9zdHJpbmcoc3Vic2NyaXB0KSkgeworCQkgICAgcmVtbnVsYXJncyhz dWJzY3JpcHQpOworCQkgICAgdW50b2tlbml6ZShzdWJzY3JpcHQpOworCQl9CisJCW5vZXJycyA9 IG5lOworIyBlbHNlCisJCVhYWCBwYXJzZSBlcnJvciBYWFgKKyMgZW5kaWYKKwkgICAgfQorI2Vu ZGlmCiAJfQogCWlmICgoc3MgJiYgIXN1YnNjcmlwdCkgfHwgIWlzaWRlbnQocykpIHsKIAkgICAg aWYgKHNzKQo= --000000000000da2efd05c3d2fd4c--