From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 23592 invoked by alias); 17 Feb 2010 15:59:28 -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: 27718 Received: (qmail 11145 invoked from network); 17 Feb 2010 15:59:26 -0000 X-Spam-Checker-Version: SpamAssassin 3.2.5 (2008-06-10) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00,DKIM_SIGNED, DKIM_VERIFIED autolearn=ham version=3.2.5 Received-SPF: pass (ns1.primenet.com.au: SPF record at _spf.google.com designates 74.125.78.148 as permitted sender) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:date:message-id:subject :from:to:content-type; bh=H+NoePQW0KvVa2jto3OkKCRfk5traw0geb64roj5zhQ=; b=cM7+DFkY8e+MepwA91BxBNgoEJiYiOWyHkjJW3//TM9b5XlI5gHhD3B9VIYa5L+i5F SEPbzLAE9GW1JklHDMK2oVZkcOn/i1TpOi+x+6/Kf+dTu87PNynxp9zcKtxbiAqaHJ9H ygPHXMzBc7dmDcT0Kohv+7F2t2gOzvGOIETfI= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:date:message-id:subject:from:to:content-type; b=TkZL1V2+aXM/ACgxgG/sP1BNwig3dOJacQ2oEhxjadxE8GrR5E4k7Amfpu775q8Sl1 W3Ucp3wlAjZGrQDChfP4Y2WJZGgy0LXlrKX/g57FaW+XlNrfMZqFRjaSi8/UsNIWtuvb gvfPOhDNL00BE2YPn9HbULMzxQ7X3I66KcwG8= MIME-Version: 1.0 Date: Wed, 17 Feb 2010 16:59:21 +0100 Message-ID: <237967ef1002170759x11931f8fj8c61a3e7b081146d@mail.gmail.com> Subject: Random sort qualifier From: Mikael Magnusson To: zsh workers Content-Type: text/plain; charset=UTF-8 Possibly mostly useful for selecting a single random file via *(or[1]) I only looked at the involved functions for about 3 minutes so I can make no guarantees more than "It seems to work." diff --git a/Src/glob.c b/Src/glob.c index 036f88c..ead6dfe 100644 --- a/Src/glob.c +++ b/Src/glob.c @@ -74,8 +74,9 @@ struct gmatch { #define GS_NAME 1 #define GS_DEPTH 2 #define GS_EXEC 4 +#define GS_RANDOM 8 -#define GS_SHIFT_BASE 8 +#define GS_SHIFT_BASE 16 #define GS_SIZE (GS_SHIFT_BASE) #define GS_ATIME (GS_SHIFT_BASE << 1) @@ -995,6 +996,9 @@ gmatchcmp(Gmatch a, Gmatch b) case GS__LINKS: r = b->_links - a->_links; break; + case GS_RANDOM: + r = 1 - 2*(rand() & 1); + break; } if (r) return (int) ((s->tp & GS_DESC) ? -r : r); @@ -1560,6 +1564,7 @@ zglob(LinkList list, LinkNode np, int nountok) case 'c': t = GS_CTIME; break; case 'd': t = GS_DEPTH; break; case 'N': t = GS_NONE; break; + case 'r': t = GS_RANDOM; break; case 'e': case '+': { -- Mikael Magnusson