From: Wayne Davison <wayned@users.sourceforge.net>
To: Peter Stephenson <pws@csr.com>
Cc: Zsh <zsh-workers@sunsite.dk>
Subject: Re: Problem with an exported array
Date: Mon, 22 Sep 2003 12:28:22 -0700 [thread overview]
Message-ID: <20030922192822.GD23145@binome.blorf.net> (raw)
In-Reply-To: <7352.1064245936@csr.com>
[-- Attachment #1: Type: text/plain, Size: 750 bytes --]
On Mon, Sep 22, 2003 at 04:52:16PM +0100, Peter Stephenson wrote:
> As I said before, there's nowhere in struct param to store the
> character; else it's not that hard. Maybe you can see a trick.
Here's my trick: use "ct" (it's already multi-use). A tied variable is
already excluded from being a special type of integer, so my change just
excludes the "ct" from being taken as a field width. See if you can see
any problems with this.
I didn't document it yet, but the -S option currently takes an integer
because that was the only option-parsing currently supported. If folks
like this kludge, that can be improved.
Example usage:
typeset -T -S 32 PAGER pager
That would space-separate the $PAGER var from the $pager array.
..wayne..
[-- Attachment #2: tiedarray.patch --]
[-- Type: text/plain, Size: 7469 bytes --]
--- Src/builtin.c 11 Sep 2003 07:00:07 -0000 1.105
+++ Src/builtin.c 22 Sep 2003 19:21:29 -0000
@@ -121,7 +121,7 @@
BUILTIN("trap", BINF_PSPECIAL, bin_trap, 0, -1, 0, NULL, NULL),
BUILTIN("true", 0, bin_true, 0, -1, 0, NULL, NULL),
BUILTIN("type", 0, bin_whence, 0, -1, 0, "ampfsw", "v"),
- BUILTIN("typeset", BINF_PLUSOPTS | BINF_MAGICEQUALS | BINF_PSPECIAL, bin_typeset, 0, -1, 0, "AE:%F:%HL:%R:%TUZ:%afghi:%lprtuxm", NULL),
+ BUILTIN("typeset", BINF_PLUSOPTS | BINF_MAGICEQUALS | BINF_PSPECIAL, bin_typeset, 0, -1, 0, "AE:%F:%HL:%R:%S:%TUZ:%afghi:%lprtuxm", NULL),
BUILTIN("umask", 0, bin_umask, 0, 1, 0, "S", NULL),
BUILTIN("unalias", 0, bin_unhash, 1, -1, 0, "ms", "a"),
BUILTIN("unfunction", 0, bin_unhash, 1, -1, 0, "m", "f"),
@@ -1718,7 +1718,7 @@
usepm = 0;
}
- /* attempting a type conversion, or making a tied colonarray? */
+ /* attempting a type conversion, or making a tied array? */
tc = 0;
if (usepm || newspecial != NS_NONE) {
int chflags = ((off & pm->flags) | (on & ~pm->flags)) &
@@ -1830,7 +1830,7 @@
pm->flags = (pm->flags | (on & ~PM_READONLY)) & ~(off | PM_UNSET);
/* This auxlen/pm->ct stuff is a nasty hack. */
if ((on & (PM_LEFT | PM_RIGHT_B | PM_RIGHT_Z | PM_INTEGER |
- PM_EFLOAT | PM_FFLOAT)) &&
+ PM_EFLOAT | PM_FFLOAT | PM_TIED)) &&
auxlen)
pm->ct = auxlen;
if (!(pm->flags & (PM_ARRAY|PM_HASHED))) {
@@ -1994,11 +1994,11 @@
if (altpm && PM_TYPE(pm->flags) == PM_SCALAR) {
/*
* It seems safer to set this here than in createparam(),
- * to make sure we only ever use the colonarr functions
+ * to make sure we only ever use the tiedarr functions
* when u.data is correctly set.
*/
- pm->sets.cfn = colonarrsetfn;
- pm->gets.cfn = colonarrgetfn;
+ pm->sets.cfn = tiedarrsetfn;
+ pm->gets.cfn = tiedarrgetfn;
pm->u.data = &altpm->u.arr;
}
@@ -2168,6 +2168,9 @@
return 1;
}
+ if (!auxlen)
+ auxlen = ':';
+
if (!(asg = getasg(argv[0]))) {
unqueue_signals();
return 1;
@@ -2217,7 +2220,7 @@
return 1;
}
/*
- * Create the tied colonarray. We make it as a normal scalar
+ * Create the tied array. We make it as a normal scalar
* and fix up the oddities later.
*/
if (!(pm=typeset_single(name, asg0.name,
--- Src/params.c 30 Aug 2003 19:00:20 -0000 1.72
+++ Src/params.c 22 Sep 2003 19:21:30 -0000
@@ -208,7 +208,7 @@
IPDEF7("SPROMPT", &sprompt),
IPDEF7("0", &argzero),
-#define IPDEF8(A,B,C,D) {NULL,A,D|PM_SCALAR|PM_SPECIAL,BR((void *)B),SFN(colonarrsetfn),GFN(colonarrgetfn),stdunsetfn,0,NULL,C,NULL,0}
+#define IPDEF8(A,B,C,D) {NULL,A,D|PM_SCALAR|PM_SPECIAL,BR((void *)B),SFN(tiedarrsetfn),GFN(tiedarrgetfn),stdunsetfn,':',NULL,C,NULL,0}
IPDEF8("CDPATH", &cdpath, "cdpath", 0),
IPDEF8("FIGNORE", &fignore, "fignore", 0),
IPDEF8("FPATH", &fpath, "fpath", 0),
@@ -2584,15 +2584,15 @@
/**/
char *
-colonarrgetfn(Param pm)
+tiedarrgetfn(Param pm)
{
char ***dptr = (char ***)pm->u.data;
- return *dptr ? zjoin(*dptr, ':', 1) : "";
+ return *dptr ? zjoin(*dptr, pm->ct, 1) : "";
}
/**/
void
-colonarrsetfn(Param pm, char *x)
+tiedarrsetfn(Param pm, char *x)
{
char ***dptr = (char ***)pm->u.data;
@@ -2603,7 +2603,7 @@
*/
if (*dptr)
freearray(*dptr);
- *dptr = x ? colonsplit(x, pm->flags & PM_UNIQUE) :
+ *dptr = x ? tiedsplit(x, pm->ct, pm->flags & PM_UNIQUE) :
(pm->flags & PM_TIED) ? NULL : mkarray(NULL);
if (pm->ename)
arrfixenv(pm->nam, *dptr);
@@ -3209,7 +3209,7 @@
*/
if (pm->flags & PM_EXPORTED)
- pm->env = addenv(s, t ? zjoin(t, ':', 1) : "", pm->flags);
+ pm->env = addenv(s, t ? zjoin(t, pm->ct, 1) : "", pm->flags);
}
--- Src/subst.c 30 Aug 2003 19:12:18 -0000 1.36
+++ Src/subst.c 22 Sep 2003 19:21:31 -0000
@@ -1637,7 +1637,8 @@
* Bet that's easier said than done.
*/
val = getstrvalue(v);
- fwidth = v->pm->ct ? v->pm->ct : strlen(val);
+ fwidth = !(v->pm->flags & (PM_TIED|PM_SPECIAL)) && v->pm->ct?
+ v->pm->ct : strlen(val);
switch (v->pm->flags & (PM_LEFT | PM_RIGHT_B | PM_RIGHT_Z)) {
char *t;
unsigned int t0;
--- Src/utils.c 1 Aug 2003 16:29:21 -0000 1.53
+++ Src/utils.c 22 Sep 2003 19:21:32 -0000
@@ -1806,26 +1806,26 @@
return ret;
}
-/* Split a string containing a colon separated list *
+/* Split a string containing a "sep" separated list *
* of items into an array of strings. */
/**/
char **
-colonsplit(char *s, int uniq)
+tiedsplit(char *s, char sep, int uniq)
{
int ct;
char *t, **ret, **ptr, **p;
- for (t = s, ct = 0; *t; t++) /* count number of colons */
- if (*t == ':')
+ for (t = s, ct = 0; *t; t++) /* count number of seps */
+ if (*t == sep)
ct++;
ptr = ret = (char **) zalloc(sizeof(char **) * (ct + 2));
t = s;
do {
s = t;
- /* move t to point at next colon */
- for (; *t && *t != ':'; t++);
+ /* move t to point at next sep */
+ for (; *t && *t != sep; t++);
if (uniq)
for (p = ret; p < ptr; p++)
if (strlen(*p) == t - s && ! strncmp(*p, s, t - s))
--- Src/zsh.h 3 Sep 2003 10:15:36 -0000 1.49
+++ Src/zsh.h 22 Sep 2003 19:21:33 -0000
@@ -1191,24 +1191,25 @@
#define PM_HIDE (1<<14) /* Special behaviour hidden by local */
#define PM_HIDEVAL (1<<15) /* Value not shown in `typeset' commands */
#define PM_TIED (1<<16) /* array tied to colon-path or v.v. */
+#define PM_TIED_SEP (1<<17) /* Character to use when joining array. */
/* Remaining flags do not correspond directly to command line arguments */
-#define PM_LOCAL (1<<17) /* this parameter will be made local */
-#define PM_SPECIAL (1<<18) /* special builtin parameter */
-#define PM_DONTIMPORT (1<<19) /* do not import this variable */
-#define PM_RESTRICTED (1<<20) /* cannot be changed in restricted mode */
-#define PM_UNSET (1<<21) /* has null value */
-#define PM_REMOVABLE (1<<22) /* special can be removed from paramtab */
-#define PM_AUTOLOAD (1<<23) /* autoloaded from module */
-#define PM_NORESTORE (1<<24) /* do not restore value of local special */
-#define PM_HASHELEM (1<<25) /* is a hash-element */
-#define PM_NAMEDDIR (1<<26) /* has a corresponding nameddirtab entry */
+#define PM_LOCAL (1<<21) /* this parameter will be made local */
+#define PM_SPECIAL (1<<22) /* special builtin parameter */
+#define PM_DONTIMPORT (1<<23) /* do not import this variable */
+#define PM_RESTRICTED (1<<24) /* cannot be changed in restricted mode */
+#define PM_UNSET (1<<25) /* has null value */
+#define PM_REMOVABLE (1<<26) /* special can be removed from paramtab */
+#define PM_AUTOLOAD (1<<27) /* autoloaded from module */
+#define PM_NORESTORE (1<<28) /* do not restore value of local special */
+#define PM_HASHELEM (1<<29) /* is a hash-element */
+#define PM_NAMEDDIR (1<<30) /* has a corresponding nameddirtab entry */
/* The option string corresponds to the first of the variables above */
-#define TYPESET_OPTSTR "aiEFALRZlurtxUhHT"
+#define TYPESET_OPTSTR "aiEFALRZlurtxUhHTS"
/* These typeset options take an optional numeric argument */
-#define TYPESET_OPTNUM "LRZiEF"
+#define TYPESET_OPTNUM "LRZiEFS"
/* Flags for extracting elements of arrays and associative arrays */
#define SCANPM_WANTVALS (1<<0)
next prev parent reply other threads:[~2003-09-22 19:28 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2003-09-22 8:30 DervishD
2003-09-22 9:08 ` Oliver Kiddle
2003-09-22 9:31 ` DervishD
2003-09-22 9:48 ` Peter Stephenson
2003-09-22 11:33 ` DervishD
2003-09-22 13:44 ` Peter Stephenson
2003-09-22 14:04 ` DervishD
2003-09-22 14:22 ` Bart Schaefer
2003-09-22 14:45 ` Danek Duvall
2003-09-22 16:30 ` DervishD
2003-09-22 17:58 ` Bart Schaefer
2003-09-22 18:06 ` Danek Duvall
2003-09-22 15:52 ` Peter Stephenson
2003-09-22 17:44 ` DervishD
2003-09-22 18:03 ` Bart Schaefer
2003-09-23 7:52 ` DervishD
2003-09-22 19:28 ` Wayne Davison [this message]
2003-09-23 9:44 ` Peter Stephenson
2003-09-23 7:57 ` Oliver Kiddle
2003-09-23 16:02 ` Peter Stephenson
2003-09-24 13:09 ` DervishD
2003-09-22 16:33 ` DervishD
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=20030922192822.GD23145@binome.blorf.net \
--to=wayned@users.sourceforge.net \
--cc=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).