From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 20270 invoked by alias); 1 Apr 2017 23:21:53 -0000 Mailing-List: contact zsh-users-help@zsh.org; run by ezmlm Precedence: bulk X-No-Archive: yes List-Id: Zsh Users List List-Post: List-Help: X-Seq: 22650 Received: (qmail 20227 invoked from network); 1 Apr 2017 23:21:52 -0000 X-Qmail-Scanner-Diagnostics: from mail-ua0-f177.google.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(209.85.217.177):SA:0(0.5/5.0):. Processed in 0.80252 secs); 01 Apr 2017 23:21:52 -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=0.5 required=5.0 tests=RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL,RCVD_IN_SORBS_SPAM,SPF_PASS, T_DKIM_INVALID autolearn=no autolearn_force=no version=3.4.1 X-Envelope-From: schaefer@brasslantern.com X-Qmail-Scanner-Mime-Attachments: | X-Qmail-Scanner-Zip-Files: | Received-SPF: pass (ns1.primenet.com.au: SPF record at _netblocks.google.com designates 209.85.217.177 as permitted sender) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=brasslantern-com.20150623.gappssmtp.com; s=20150623; h=from:message-id:date:in-reply-to:comments:references:to:subject :mime-version; bh=KINsBDD018KOzecMYys1nCVimsm6BUxaDR6HfqGmpvE=; b=LqiLGQh0nigNyn833GegbBKCVWPYDwanG9taT8mHDkDn/lmsEF0IYyHGO5P8dz84hQ Rq5sXkdXRije1XA/ybPHodi/RzCFQdUpMHMXm8tyV1qqXWHz85tdMckVWtsHxeLhY60Q FOcEfcvcnX+ov+nQLO9hWsufBDUOJHGvesrko6MKQseWie/aW6ICCBMKnJ2Eqcj8ZjxN 9TsKNKd245pl8J8j4JhoNP6XaF7yXF65x0CXc0lhTagVuFMKa7j12v2UtDGQFyY4aFfD rHtZITZTBsDBppjwln0TLC6zKzK6rDm+Om+Rpoa9QETIdWF3t1Bx7P6xP4b2rIgAWD4f /9/A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:message-id:date:in-reply-to:comments :references:to:subject:mime-version; bh=KINsBDD018KOzecMYys1nCVimsm6BUxaDR6HfqGmpvE=; b=JHBjaEqe+96zE25Weu79dQrZWBZD9lBXJa1DJSLAKnc5DXJs5+1fhMvoVNOrO5sddB D0Uho75trRTvDHaa6UDNJ21c/18eSC1Ix0I49yg58Jqq+KqSvfz8TwfihwkBGqDakIxo DaJUqVSnJtspB0QXM2SIDgULDCbYJrJlzOmxoppETyehkJMdHu/8erok2dnryUOvHfVm SUXPRx9p4dSCDJzEhtHvZLDbAm2CMCyYtem4mNBjX5ufbRJtDIvHUDIDhLPnfX1dVkF1 jTNMzH3Mz3CECBSaLyNi8j4Uix3rq1qMrm0R0fSVpKHPslvENGwkKzdTstxXrUXQfse/ HT2A== X-Gm-Message-State: AFeK/H3CvzyzVme6beIIo09Au5I4IVX9BA0SDPHH48mmP62Ms6fv0UspjdfBWaWOST3eBg== X-Received: by 10.176.68.226 with SMTP id n89mr5154921uan.11.1491088904292; Sat, 01 Apr 2017 16:21:44 -0700 (PDT) From: Bart Schaefer Message-Id: <170401162145.ZM31098@torch.brasslantern.com> Date: Sat, 1 Apr 2017 16:21:45 -0700 In-Reply-To: <170401094355.ZM28604@torch.brasslantern.com> Comments: In reply to Bart Schaefer "Re: zregexparse" (Apr 1, 9:43am) References: <170330221929.ZM18456@torch.brasslantern.com> <170331141359.ZM24862@torch.brasslantern.com> <170401094355.ZM28604@torch.brasslantern.com> X-Mailer: OpenZMail Classic (0.9.2 24April2005) To: zsh-users@zsh.org Subject: Re: zregexparse MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii On Apr 1, 9:43am, Bart Schaefer wrote: } } This is just one of the corners of the code that has not been paid } any attention in a very long time (it's essentially unchanged since } 2001 or so). Also, I just looked a little more closely at the code to find out why Sebastian's first example with '{print $match[1]}' seemed to output something useful, and realized that zregexparse is built on top of the globbing pattern matcher -- it builds a state machine for the regular expression semantics that weren't yet part of extendedglob at the time, and then steps through the state machine calling back for each subexpression found; but otherwise it's globbing. That's how/why $match[1] gets set (and reset) for each callback. Oh -- Sebastian also remarked "just that shipping own regex engine is extreamly cool, at least for me" -- Src/pattern.c is explicity (for licensing reasons!) derived from Henry Spencer's regular expression package, so zsh *is* "shipping own regex engine", it merely calls it extendedglob instead. The equivalent (though perhaps not easily a syntactic duplication) of zregexparse probably could now be rewritten entirely with extendedglob. E.g. here's a fragment of it: zrp() { setopt localoptions extendedglob local var1=$1 var2=$2 string=$3 pattern=$4 callback=$5 local _zrp_cb='typeset -g $var1=$mend[1] $var2=$mend[1]' { functions[_zrp_cb]="$_zrp_cb;$callback;return 0" functions -M _zrp_cb : ${string//(#b)($~pattern)/$((_zrp_cb()))} } always { functions +M _zrp_cb unfunction _zrp_cb } } torch% zrp p1 p2 abc 'bc|?' '{print "$p1, $p2, $mbegin[1], $mend[1], $match[1]"}' 1, 1, 1, 1, a 3, 3, 2, 3, bc