From: Peter Stephenson <pws@csr.com>
To: zsh-workers@sunsite.dk
Subject: Re: Math assignment to arrays: Is this a bug?
Date: Mon, 11 Sep 2006 11:59:55 +0100 [thread overview]
Message-ID: <20060911115955.c9e8e5b6.pws@csr.com> (raw)
In-Reply-To: <060903102801.ZM7627@torch.brasslantern.com>
Bart Schaefer <schaefer@brasslantern.com> wrote:
> Try this but be prepared to interrupt it:
>
> x=()
> for (( x=1; x <= 10; x++ )) print $x
>
> Why doesn't the assignment of 1 to x in the loop reset it from array to
> scalar?
This is inconsistent with normal assignment, so it probably needs fixing.
I've copied the corresponding code from assignsparam(), which has an
unset(KSHARRAYS) test there: not sure what that's doing. setiparam() is
almost a duplicate of setnparam(); it's not worth having it separate.
Index: Src/params.c
===================================================================
RCS file: /cvsroot/zsh/zsh/Src/params.c,v
retrieving revision 1.119
diff -u -r1.119 params.c
--- Src/params.c 10 Sep 2006 18:10:49 -0000 1.119
+++ Src/params.c 11 Sep 2006 10:56:46 -0000
@@ -2495,46 +2495,9 @@
return v->pm;
}
-/**/
-mod_export Param
-setiparam(char *s, zlong val)
-{
- struct value vbuf;
- Value v;
- char *t = s, *ss;
- Param pm;
- mnumber mnval;
-
- if (!isident(s)) {
- zerr("not an identifier: %s", s);
- errflag = 1;
- return NULL;
- }
- queue_signals();
- if (!(v = getvalue(&vbuf, &s, 1))) {
- if ((ss = strchr(s, '[')))
- *ss = '\0';
- if (!(pm = createparam(t, ss ? PM_ARRAY : PM_INTEGER)))
- pm = (Param) paramtab->getnode(paramtab, t);
- DPUTS(!pm, "BUG: parameter not created");
- if (ss) {
- *ss = '[';
- } else {
- pm->base = outputradix;
- }
- v = getvalue(&vbuf, &t, 1);
- DPUTS(!v, "BUG: value not found for new parameter");
- }
- mnval.type = MN_INTEGER;
- mnval.u.l = val;
- setnumvalue(v, mnval);
- unqueue_signals();
- return v->pm;
-}
/*
- * Like setiparam(), but can take an mnumber which can be integer or
- * floating.
+ * Set a generic shell number, floating point or integer.
*/
/**/
@@ -2543,7 +2506,7 @@
{
struct value vbuf;
Value v;
- char *t = s, *ss = NULL;
+ char *t = s, *ss;
Param pm;
if (!isident(s)) {
@@ -2552,8 +2515,23 @@
return NULL;
}
queue_signals();
- if (!(v = getvalue(&vbuf, &s, 1))) {
- if ((ss = strchr(s, '[')))
+ ss = strchr(s, '[');
+ v = getvalue(&vbuf, &s, 1);
+ if (v && (v->pm->node.flags & (PM_ARRAY|PM_HASHED)) &&
+ !(v->pm->node.flags & (PM_SPECIAL|PM_TIED)) &&
+ /*
+ * not sure what KSHARRAYS has got to do with this...
+ * copied this from assignsparam().
+ */
+ unset(KSHARRAYS) && !ss) {
+ unsetparam_pm(v->pm, 0, 1);
+ s = t;
+ v = NULL;
+ }
+ if (!v) {
+ /* s has been updated by getvalue, so check again */
+ ss = strchr(s, '[');
+ if (ss)
*ss = '\0';
pm = createparam(t, ss ? PM_ARRAY :
(val.type & MN_INTEGER) ? PM_INTEGER : PM_FFLOAT);
@@ -2573,6 +2551,19 @@
return v->pm;
}
+/* Simplified interface to setnparam */
+
+/**/
+mod_export Param
+setiparam(char *s, zlong val)
+{
+ mnumber mnval;
+ mnval.type = MN_INTEGER;
+ mnval.u.l = val;
+ return setnparam(s, mnval);
+}
+
+
/* Unset a parameter */
/**/
Index: Test/C01arith.ztst
===================================================================
RCS file: /cvsroot/zsh/zsh/Test/C01arith.ztst,v
retrieving revision 1.9
diff -u -r1.9 C01arith.ztst
--- Test/C01arith.ztst 30 Nov 2004 14:14:57 -0000 1.9
+++ Test/C01arith.ztst 11 Sep 2006 10:56:46 -0000
@@ -97,6 +97,12 @@
0:setting array elements in math context
>array 1 2
+ xarr=()
+ (( xarr = 3 ))
+ print ${(t)xarr} $xarr
+0:converting type from array
+>integer 3
+
print $(( 13 = 42 ))
1:bad lvalue
?(eval):1: lvalue required
--
Peter Stephenson <pws@csr.com> Software Engineer
CSR PLC, Churchill House, Cambridge Business Park, Cowley Road
Cambridge, CB4 0WZ, UK Tel: +44 (0)1223 692070
To access the latest news from CSR copy this link into a web browser: http://www.csr.com/email_sig.php
prev parent reply other threads:[~2006-09-11 11:04 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-09-03 17:28 Bart Schaefer
2006-09-11 10:59 ` Peter Stephenson [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20060911115955.c9e8e5b6.pws@csr.com \
--to=pws@csr.com \
--cc=zsh-workers@sunsite.dk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.vuxu.org/mirror/zsh/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).