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.4 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED, UNPARSEABLE_RELAY autolearn=ham autolearn_force=no version=3.4.4 Received: (qmail 8921 invoked from network); 18 Dec 2020 13:18:45 -0000 Received: from zero.zsh.org (2a02:898:31:0:48:4558:7a:7368) by inbox.vuxu.org with ESMTPUTF8; 18 Dec 2020 13:18:45 -0000 ARC-Seal: i=1; cv=none; a=rsa-sha256; d=zsh.org; s=rsa-20200801; t=1608297525; b=eEsuK3mBUCaFt0tFIl6ExdjmqlgqdtQxKWMZ36bYOurMzQRUw9abO13quR3DHwzcT/toSoxVsV SHSzLaVXIJ61E3NSt/wgNaS/+qln3FAjOkBkgtiPmUWcq9dEL3eCFTAMX0r8iVCDwYakgMUjcf Z7zKriu3H2/AqlhAtd2vEJm+Ajnt+wcXNP3ymJyZy9amCjnyHUlUQ+2t+a95j4Ws7d6h9+0yff 3S16Cf4HF6XB8qnq3zWyLK93StGTDmB7Xe2d0KPQSB8RnNcbabfBC4iYc13TGoOkLusbjWcLM+ ANGo4oJf/tXcFW3UBTSRaVepn/qRiVHMp4UqQ3LLIFBFAg==; ARC-Authentication-Results: i=1; zsh.org; iprev=pass (mail-lf1-f46.google.com) smtp.remote-ip=209.85.167.46; dkim=pass header.d=gmail.com header.s=20161025 header.a=rsa-sha256; dmarc=pass header.from=gmail.com; arc=none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed; d=zsh.org; s=rsa-20200801; t=1608297525; bh=u22eXU8Nj47cYo5cOYTLQTfkXh1GNsnGLFcoh/gUPdA=; h=List-Archive:List-Owner:List-Post:List-Unsubscribe:List-Subscribe:List-Help: List-Id:Sender:Message-ID:Date:Subject:To:From:DKIM-Signature: DKIM-Signature; b=zbtldxP0b6/fdCV5ibJIWxc43UGXRbP1tVo2PEpV6WbP5hL0s8yDWYqacWm4OOtU6DQVUQ/P3h 4ZGwC1hzq22Y2c5yT2mpoTrPSlVCiCMGrVP5Wl/bP3XC/lm/i4La/mNEiFiWmXwzTUm5Dfnvio MYjI9RJCiTDOZWp77k+fijnyMJw4Vrs52kgF0Dhf5x333FrrGp4mLCV1Fjacot+2kn7RPrToHa zrVE75cLzwmqATIPGFcA2YRG/3UtBqfo7WeTBKlfsG0OzalPHj2C/oVNWYXvLBcXAB59VTqRi1 zjyO8o/zDi/PS2bwSwzFi4n0kzL9K7Eg4DxnCVUImx+j2g==; 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:Message-Id:Date:Subject:To:From: Reply-To:Cc:MIME-Version:Content-Type:Content-Transfer-Encoding:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:In-Reply-To:References; bh=8tlPwydSg2yUPidJdckGcY+zQbN+r7GYtYqNH2JH6EY=; b=bHjxKTAYOgEuJyB+Fjs4M8+3Yg JLjuBlRHs2IQvOgTu8ZLrZZCVu51MWdcjhc7gzVNI79I0i8BySoupWZh6qoMoMoUaBd0DXhoIJLCu dd1ZX7joh09i2xsCKAz1XWLP5PnKcO4E1bHUpl4hWp7WCjUdSQb0l94DBVKiraXJqeFAquvBsecoM U7Z30uycnVgyogeUpxbXoAs1fmthQr5m73DK2FYRoell2NaM0GCCh+i03og0l1uwtXZjARSzqFGsp XgKm3UypI2WUDYYc+VxkMvO+2Ais23Hw1v8lVRt8QlqpNQqeyfzyC+4HedcOPJACyZeVuOXU/UP22 KNFPtrHg==; Received: from authenticated user by zero.zsh.org with local id 1kqFec-0006OH-SC; Fri, 18 Dec 2020 13:18:42 +0000 Authentication-Results: zsh.org; iprev=pass (mail-lf1-f46.google.com) smtp.remote-ip=209.85.167.46; dkim=pass header.d=gmail.com header.s=20161025 header.a=rsa-sha256; dmarc=pass header.from=gmail.com; arc=none Received: from mail-lf1-f46.google.com ([209.85.167.46]:42214) by zero.zsh.org with esmtps (TLS1.3:TLS_AES_128_GCM_SHA256:128) id 1kqFeJ-0006Ee-DV; Fri, 18 Dec 2020 13:18:25 +0000 Received: by mail-lf1-f46.google.com with SMTP id u18so5306057lfd.9 for ; Fri, 18 Dec 2020 05:18:23 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id; bh=8tlPwydSg2yUPidJdckGcY+zQbN+r7GYtYqNH2JH6EY=; b=LbOKSMPkaiLrnsWJoVBCxPEnPEuobjPXZUV0G1S7iI+a6TRdA0qu5mCYsAQ0IMPcG9 I3GVsmoDKPOAvCj94hGLuXC+fTEPnz/aQJ25PEnLI1ZI4Qc2gwosubLayZISjHu1Gthw QsIznoQN2pMkJ3SpQdk9Tj8p9vg+tzxqm75F3f++D3T7cw5FG33n5To8Z/CibdjPzPw/ 5gx6oA3sEiOw4eQE7E0Ib/pqokEOACb7LWAESCIGtkwMLGxFraN0wWq7gXWGlnjVcB3v 6PlW0o0RU8jI1q4138oNSoBkMohBWYwXqSKDPJW7dMsbIXYbrs2tglf57qw4Yp8lGgQ5 C0xw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id; bh=8tlPwydSg2yUPidJdckGcY+zQbN+r7GYtYqNH2JH6EY=; b=GtNy06hmDTkWB/IygwFI1ZBysc5+AjrDNgKadA7vZCWtS/c/wtJlKBotDmsohOK8Ll vk5afkWzLi+RbUkpXWqMMq9qePHwZjFUnep9dlTmG7przLQ2f+ObMafIqVKX4sdihELf nd5owBfCVyjwHyi2/3K4PtIa0nhW7pFGeaKL+RnakKZstc+/4eRCO27/ee3OZyPJRW19 HMMsnhCyom61ANpLZCOAEBJUafF8MEcpHMpRIvB8tW6L5Ze7tP15J+AqOA0QomlMO5lK rWMxhO5V5ckkDVYpvrQNU6ePbf97aL3d9/g7q3yYnuAqOcahuXPxxrDJH0Z1AKCMNQNW 0ysw== X-Gm-Message-State: AOAM532cvjNzSz0Xk91XGO4Ohadjtgr3lbHOPfqOU5kKX4WH4fEuvmmv J1qakryu7MwOrF3pzcIiqCutUpVoAk0= X-Google-Smtp-Source: ABdhPJzu2LFYE+9tEToF85GauaB5GW/LoiHOH/kFfJIjuMt6KcdrwgvhCB2g7g8SOQCJhG3DkZVR0A== X-Received: by 2002:a2e:a402:: with SMTP id p2mr1784932ljn.270.1608297501996; Fri, 18 Dec 2020 05:18:21 -0800 (PST) Received: from localhost.localdomain (h-88-110.A230.priv.bahnhof.se. [212.85.88.110]) by smtp.gmail.com with ESMTPSA id z26sm1035562ljn.98.2020.12.18.05.18.20 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 18 Dec 2020 05:18:21 -0800 (PST) From: Mikael Magnusson To: zsh-workers@zsh.org Subject: RFC PATCH: Sketch at :@ subscripting Date: Fri, 18 Dec 2020 14:18:15 +0100 Message-Id: <20201218131815.25999-1-mikachu@gmail.com> X-Mailer: git-send-email 2.15.1 X-Seq: 47747 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: Archived-At: As the subject says, this is in a very early idea stage, but it does work for basic cases at least. The idea is that you can do this: % typeset -a somearray=( 'data here' 'some words' etc etc 1 2 3 4 ) idx=(1 3 5) % echo ${somearray:@idx} data here etc 1 The way it currently works also lets you do this: % typeset -a somearray=( 'data here' 'some words' etc etc 1 2 3 4 ) idx=( '(r)<->' '(I)etc' ) % echo ${somearray:@idx} 1 4 Not decided on if that's desirable :). Anyway, the code as it is written now is very hacky and I'm wondering if I missed the existence of some useful functions, or if the stuff I'm using now would need to be refactored a bit to make this actually possible without doing stupid things like zhtricat("[", *sub_it, "]"). Also curious why getindex() unconditionally *writes* '[' to the first character in the input string passed to it... --- Src/subst.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/Src/subst.c b/Src/subst.c index 8de201b663..943b2546c4 100644 --- a/Src/subst.c +++ b/Src/subst.c @@ -3167,6 +3167,67 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int pf_flags, } break; } + } else if (inbrace && (*s == '@')) { + /* use every element of the array specified by @ as a subscript */ + char **idx; + ++s; + if (*itype_end(s, IIDENT, 0)) { + untokenize(s); + zerr("not an identifier: %s", s); + return NULL; + } + if (vunset) { + if (vunset > 0 && unset(UNSET)) { + *idend = '\0'; + zerr("%s: parameter not set", idbeg); + return NULL; + } + isarr = 0; + val = dupstring(""); + } else { + char *sval; + idx = getaparam(s); + if (!idx) { + sval = getsparam(s); + if (sval) + idx = hmkarray(sval); + } + if (idx) { + if (isarr) { + if (PM_TYPE(vbuf.pm->node.flags) & PM_ARRAY) { + /* actual code is here */ + LinkList list = newlinklist(); + char **sub_it, **val_it; + for (sub_it = idx; *sub_it; sub_it++) { + char *tmp = zhtricat("[", *sub_it, "]"); + /* getindex() modifies vbuf in ways that break further + * subscripting with differing flags, so better not to + * touch it at all. */ + struct value vbuf_copy = vbuf; + getindex(&tmp, &vbuf_copy, 0); + for (val_it = getarrvalue(&vbuf_copy); *val_it; val_it++) { + addlinknode(list, *val_it); + } + } + aval = hlinklist2array(list, !copied); + copied = 1; + } else { + zerr("assoc @ not implemented"); + } + } else { + zerr("scalar @ not implemented"); + } + } else { + + if (unset(UNSET)) { + zerr("%s: parameter not set", s); + return NULL; + } + isarr = 0; + val = dupstring(""); + } + } } else if (inbrace && (*s == '^' || *s == Hat)) { char **zip; int shortest = 1; -- 2.15.1