From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 26638 invoked by alias); 12 Sep 2016 14:31:56 -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: 39292 Received: (qmail 18293 invoked from network); 12 Sep 2016 14:31:56 -0000 X-Qmail-Scanner-Diagnostics: from mailout3.w1.samsung.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(210.118.77.13):SA:0(-1.3/5.0):. Processed in 0.702036 secs); 12 Sep 2016 14:31:56 -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=-1.3 required=5.0 tests=RP_MATCHES_RCVD autolearn=unavailable autolearn_force=no version=3.4.1 X-Envelope-From: p.stephenson@samsung.com X-Qmail-Scanner-Mime-Attachments: | X-Qmail-Scanner-Zip-Files: | Received-SPF: none (ns1.primenet.com.au: domain at samsung.com does not designate permitted sender hosts) X-AuditID: cbfec7f1-f79f46d0000008eb-18-57d6bc458ef6 Date: Mon, 12 Sep 2016 15:31:29 +0100 From: Peter Stephenson To: zsh-workers@zsh.org Subject: Re: [PATCH] Use == in expressions instead of the deprecated = Message-id: <20160912153129.75be8f6a@pwslap01u.europe.root.pri> In-reply-to: <20160909120313.GB18696@zira.vinc17.org> Organization: Samsung Cambridge Solution Centre X-Mailer: Claws Mail 3.7.9 (GTK+ 2.22.0; i386-redhat-linux-gnu) MIME-version: 1.0 Content-type: text/plain; charset=US-ASCII Content-transfer-encoding: 7bit X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrLIsWRmVeSWpSXmKPExsWy7djPc7que66FG9w7pGhxsPkhkwOjx6qD H5gCGKO4bFJSczLLUov07RK4Mn5NnMpSsMGiorHxIFMD4zntLkYODgkBE4n3n/S6GDmBTDGJ C/fWs3UxcnEICSxllDi74wILhNPLJPFg1Qk2iCoTiQmfXzBCJJYxSmzev4MJwpnGJNE8ew5U 5gyjROvpo1DOWUaJx5t72UH6WQRUJVbc2wE2i03AUGLqptmMILaIgLjE2bXnWUBsYQE3iQkf N4LV8wrYS/zcex2snlPAVGLfudPMIDa/gL7E1b+fmCBuspeYeeUMI0S9oMSPyffA5jAL6Ehs 2/aYHcKWl9i85i0zyEESAs3sEvcOPWCChICsxKYDzBBzXCQeN/1ihbCFJV4d38IOYctIdHYc hNrVzyjxpNsXYs4MRonTZ3ZAA8Zaou/2RUaIZXwSk7ZNZ4aYzyvR0SYEUeIhcXhfMyOE7Sjx sGs10wRGxVlIzp6F5OxZSM5ewMi8ilEktbQ4Nz212EivODG3uDQvXS85P3cTIzARnP53/OMO xvcnrA4xCnAwKvHwNqy+Fi7EmlhWXJl7iFGCg1lJhFduN1CINyWxsiq1KD++qDQntfgQozQH i5I4754FV8KFBNITS1KzU1MLUotgskwcnFINjEfvdsWvFmGZ1bn7wSG2A3ydPX9bi526NouF W91lvlOS2V9jcHalxm9TL6FcxbSfH8rV7rCtPaE6Zca1k9lB+SvfnZS2LVkv0Ve5w9Dch/3R O/U+3WdPDT9NNQx9y27bOmWufFTy7b0NBR7N3ae90/z/e03a88zr/7Fb3wpdL9S+1r97ODxT VImlOCPRUIu5qDgRAEveuoEAAwAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrOIsWRmVeSWpSXmKPExsVy+t/xK7pie66FGxxeJmNxsPkhkwOjx6qD H5gCGKPcbDJSE1NSixRS85LzUzLz0m2VQkPcdC2UFPISc1NtlSJ0fUOClBTKEnNKgTwjAzTg 4BzgHqykb5fglvFr4lSWgg0WFY2NB5kaGM9pdzFyckgImEhM+PyCEcIWk7hwbz1bFyMXh5DA EkaJ5VdfMkE4M5gkXv0+zgLhnGOUWDZzFlTmLKNEY/s5JpB+FgFViRX3drCB2GwChhJTN80G mysiIC5xdu15FhBbWMBNYsLHjewgNq+AvcTPvdfB6jkFTCX2nTvNDDF0LZPEp5drWEES/AL6 Elf/fmKCONBeYuaVM4wQzYISPybfAxvKLKAlsXlbEyuELS+xec1bZhBbSEBd4sbd3ewTGIVn IWmZhaRlFpKWBYzMqxhFUkuLc9Nziw31ihNzi0vz0vWS83M3MQIjaduxn5t3MF7aGHyIUYCD UYmHt2H1tXAh1sSy4srcQ4wSHMxKIryPdgGFeFMSK6tSi/Lji0pzUosPMZoCQ2Yis5Rocj4w yvNK4g1NDM0tDY2MLSzMjYyUxHlLPlwJFxJITyxJzU5NLUgtgulj4uCUamDkeXRd3CI595Ss 6mKzkLubo53vt+i3mR/99vm39/eY2+vkNNnWdrov+BO5R2+WR5PnHc88xpvhAuu9nA51XspJ WrfHfeH+e4xnD874z/aJ+YXWLssNf+a8m+V7aJlDgdNRr5XqOwI0zk3Rv/9IJ7U1duWrEq3f X3cY+JubSMsXnOyJYWBpOTJDiaU4I9FQi7moOBEAYT6M5roCAAA= X-MTR: 20000000000000000@CPGS X-CMS-MailID: 20160912143133eucas1p11a4e6916dd70b3ceaa163bf3bddfb007 X-Msg-Generator: CA X-Sender-IP: 182.198.249.179 X-Local-Sender: =?UTF-8?B?UGV0ZXIgU3RlcGhlbnNvbhtTQ1NDLURhdGEgUGxhbmUb?= =?UTF-8?B?7IK87ISx7KCE7J6QG1ByaW5jaXBhbCBFbmdpbmVlciwgU29mdHdhcmU=?= X-Global-Sender: =?UTF-8?B?UGV0ZXIgU3RlcGhlbnNvbhtTQ1NDLURhdGEgUGxhbmUbU2Ft?= =?UTF-8?B?c3VuZyBFbGVjdHJvbmljcxtQcmluY2lwYWwgRW5naW5lZXIsIFNvZnR3YXJl?= X-Sender-Code: =?UTF-8?B?QzEwG0VIURtDMTBDRDA1Q0QwNTAwNTg=?= CMS-TYPE: 201P X-HopCount: 7 X-CMS-RootMailID: 20160912143133eucas1p11a4e6916dd70b3ceaa163bf3bddfb007 X-RootMTR: 20160912143133eucas1p11a4e6916dd70b3ceaa163bf3bddfb007 References: <20160905212754.24998-1-tgyurci@gmail.com> <20160908093516.4fc2dd1e@pwslap01u.europe.root.pri> <20160908121628.78977edd@pwslap01u.europe.root.pri> <20160908143128.GA14933@chaz.gmail.com> <20160908161410.46897ece@pwslap01u.europe.root.pri> <20160909120313.GB18696@zira.vinc17.org> Not that I'm particularly bothered, but it might keep surprises to a minimum if zsh output either "=" or "==" when showing tests depending what the user originally typed. I incremented the dev version as the wordcode is incompatible. pws diff --git a/Config/version.mk b/Config/version.mk index 5577f4a..7d110b2 100644 --- a/Config/version.mk +++ b/Config/version.mk @@ -27,5 +27,5 @@ # This must also serve as a shell script, so do not add spaces around the # `=' signs. -VERSION=5.2-dev-1 +VERSION=5.2-dev-2 VERSION_DATE='January 20, 2015' diff --git a/Src/cond.c b/Src/cond.c index 0381fe9..f25ebd4 100644 --- a/Src/cond.c +++ b/Src/cond.c @@ -34,7 +34,7 @@ int tracingcond; /* updated by execcond() in exec.c */ static char *condstr[COND_MOD] = { - "!", "&&", "||", "==", "!=", "<", ">", "-nt", "-ot", "-ef", "-eq", + "!", "&&", "||", "=", "==", "!=", "<", ">", "-nt", "-ot", "-ef", "-eq", "-ne", "-lt", "-gt", "-le", "-ge", "=~" }; @@ -196,7 +196,8 @@ evalcond(Estate state, char *fromtest) cond_subst(&left, !fromtest); untokenize(left); } - if (ctype <= COND_GE && ctype != COND_STREQ && ctype != COND_STRNEQ) { + if (ctype <= COND_GE && ctype != COND_STREQ && ctype != COND_STRDEQ && + ctype != COND_STRNEQ) { right = ecgetstr(state, EC_DUPTOK, &htok); if (htok) { cond_subst(&right, !fromtest); @@ -208,7 +209,8 @@ evalcond(Estate state, char *fromtest) fputc(' ',xtrerr); quotedzputs(left, xtrerr); fprintf(xtrerr, " %s ", condstr[ctype]); - if (ctype == COND_STREQ || ctype == COND_STRNEQ) { + if (ctype == COND_STREQ || ctype == COND_STRDEQ || + ctype == COND_STRNEQ) { char *rt = dupstring(ecrawstr(state->prog, state->pc, NULL)); cond_subst(&rt, !fromtest); quote_tokenized_output(rt, xtrerr); @@ -287,6 +289,7 @@ evalcond(Estate state, char *fromtest) switch (ctype) { case COND_STREQ: + case COND_STRDEQ: case COND_STRNEQ: { int test, npat = state->pc[1]; @@ -313,7 +316,7 @@ evalcond(Estate state, char *fromtest) state->pc += 2; test = (pprog && pattry(pprog, left)); - return !(ctype == COND_STREQ ? test : !test); + return !(ctype == COND_STRNEQ ? !test : test); } case COND_STRLT: return !(strcmp(left, right) < 0); diff --git a/Src/parse.c b/Src/parse.c index 94ac049..6e7d40e 100644 --- a/Src/parse.c +++ b/Src/parse.c @@ -2498,12 +2498,17 @@ par_cond_triple(char *a, char *b, char *c) { int t0; - if ((b[0] == Equals || b[0] == '=') && - (!b[1] || ((b[1] == Equals || b[1] == '=') && !b[2]))) { + if ((b[0] == Equals || b[0] == '=') && !b[1]) { ecadd(WCB_COND(COND_STREQ, 0)); ecstr(a); ecstr(c); ecadd(ecnpats++); + } else if ((b[0] == Equals || b[0] == '=') && + (b[1] == Equals || b[1] == '=') && !b[2]) { + ecadd(WCB_COND(COND_STRDEQ, 0)); + ecstr(a); + ecstr(c); + ecadd(ecnpats++); } else if (b[0] == '!' && (b[1] == Equals || b[1] == '=') && !b[2]) { ecadd(WCB_COND(COND_STRNEQ, 0)); ecstr(a); diff --git a/Src/text.c b/Src/text.c index d387d36..3658b1b 100644 --- a/Src/text.c +++ b/Src/text.c @@ -46,7 +46,7 @@ int text_expand_tabs; * et seq. in zsh.h. */ static const char *cond_binary_ops[] = { - "=", "!=", "<", ">", "-nt", "-ot", "-ef", "-eq", + "=", "==", "!=", "<", ">", "-nt", "-ot", "-ef", "-eq", "-ne", "-lt", "-gt", "-le", "-ge", "=~", NULL }; @@ -934,6 +934,7 @@ gettext2(Estate state) taddstr(" "); taddstr(ecgetstr(state, EC_NODUP, NULL)); if (ctype == COND_STREQ || + ctype == COND_STRDEQ || ctype == COND_STRNEQ) state->pc++; } else { diff --git a/Src/zsh.h b/Src/zsh.h index 87e6a98..996bc33 100644 --- a/Src/zsh.h +++ b/Src/zsh.h @@ -622,27 +622,34 @@ struct timedfn { /* (1<<4) is used for Z_END, see the wordcode definitions */ /* (1<<5) is used for Z_SIMPLE, see the wordcode definitions */ -/* Condition types. */ +/* + * Condition types. + * + * Careful when changing these: both cond_binary_ops in text.c and + * condstr in cond.c depend on these. (The zsh motto is "two instances + * are better than one". Or something.) + */ #define COND_NOT 0 #define COND_AND 1 #define COND_OR 2 #define COND_STREQ 3 -#define COND_STRNEQ 4 -#define COND_STRLT 5 -#define COND_STRGTR 6 -#define COND_NT 7 -#define COND_OT 8 -#define COND_EF 9 -#define COND_EQ 10 -#define COND_NE 11 -#define COND_LT 12 -#define COND_GT 13 -#define COND_LE 14 -#define COND_GE 15 -#define COND_REGEX 16 -#define COND_MOD 17 -#define COND_MODI 18 +#define COND_STRDEQ 4 +#define COND_STRNEQ 5 +#define COND_STRLT 6 +#define COND_STRGTR 7 +#define COND_NT 8 +#define COND_OT 9 +#define COND_EF 10 +#define COND_EQ 11 +#define COND_NE 12 +#define COND_LT 13 +#define COND_GT 14 +#define COND_LE 15 +#define COND_GE 16 +#define COND_REGEX 17 +#define COND_MOD 18 +#define COND_MODI 19 typedef int (*CondHandler) _((char **, int)); diff --git a/Test/C02cond.ztst b/Test/C02cond.ztst index e315f6c..78e644a 100644 --- a/Test/C02cond.ztst +++ b/Test/C02cond.ztst @@ -414,6 +414,13 @@ F:Failures in these cases do not indicate a problem in the shell. >OK 4 >OK 5 + fn() { [[ 'a' == 'b' || 'b' = 'c' || 'c' != 'd' ]] } + which -x2 fn +0: = and == appear as input +>fn () { +> [[ 'a' == 'b' || 'b' = 'c' || 'c' != 'd' ]] +>} + %clean # This works around a bug in rm -f in some versions of Cygwin chmod 644 unmodish diff --git a/Test/D01prompt.ztst b/Test/D01prompt.ztst index 2638e24..607ffb6 100644 --- a/Test/D01prompt.ztst +++ b/Test/D01prompt.ztst @@ -196,8 +196,8 @@ ?+zsh_directory_name:1> emulate -L zsh ?+zsh_directory_name:2> setopt extendedglob ?+zsh_directory_name:3> local -a match mbegin mend -?+zsh_directory_name:4> [[ d == n ]] -?+zsh_directory_name:12> [[ /very_long_directory_name == (#b)(*)/very_long_directory_name ]] +?+zsh_directory_name:4> [[ d = n ]] +?+zsh_directory_name:12> [[ /very_long_directory_name = (#b)(*)/very_long_directory_name ]] ?+zsh_directory_name:14> return 0 ?+fn:7> local d='~[:l]' ?+fn:8> print '~[:l]' diff --git a/Test/E02xtrace.ztst b/Test/E02xtrace.ztst index 6e425e7..da6191c 100644 --- a/Test/E02xtrace.ztst +++ b/Test/E02xtrace.ztst @@ -120,13 +120,15 @@ ?+./fnfile:3> print This is fn. set -x + [[ 'f o' == 'f x'* || 'b r' != 'z o' && 'squashy sound' < 'squishy sound' ]] [[ 'f o' = 'f x'* || 'b r' != 'z o' && 'squashy sound' < 'squishy sound' ]] [[ -e nonexistentfile || ( -z '' && -t 3 ) ]] set +x 0:Trace for conditions ?+(eval):2> [[ 'f o' == f\ x* || 'b r' != z\ o && 'squashy sound' < 'squishy sound' ]] -?+(eval):3> [[ -e nonexistentfile || -z '' && -t 3 ]] -?+(eval):4> set +x +?+(eval):3> [[ 'f o' = f\ x* || 'b r' != z\ o && 'squashy sound' < 'squishy sound' ]] +?+(eval):4> [[ -e nonexistentfile || -z '' && -t 3 ]] +?+(eval):5> set +x # Part 1: Recurses into nested anonymous functions fn() {