* PATCH: 3.1.5 + associative arrays: printing of parameters
@ 1998-12-14 2:17 Bart Schaefer
0 siblings, 0 replies; only message in thread
From: Bart Schaefer @ 1998-12-14 2:17 UTC (permalink / raw)
To: zsh-workers
This fixes the output of e.g. "typeset" (with no args) or "typeset -A" to
print associative arrays in a format that can be fed back to the shell as
an assignment. Previously, "typeset" output for AAs looked like
association foo=(bambam=pebbles
fred=wilma
barney=betty
)
which could be confusing for "typeset | grep" etc., besides being invalid
syntax for an assignment. After this patch, it looks like
association foo=(bambam pebbles fred wilma barney betty )
which in turn means that
zsh% eval $(typeset -A)
should correctly be an expensive no-op.
It's trivial to alter this to produce bash-style foo=([bambam]=pebbles ...)
should someone decide to add support for that syntax.
I almost decided not to put PRINT_KV_PAIR in zsh.h, because theoretically
it should never be used outside printparamnode(), but ...
Index: Src/params.c
===================================================================
--- params.c 1998/12/13 23:40:56 1.12
+++ params.c 1998/12/14 01:49:44
@@ -2583,24 +2583,28 @@
return;
}
+ quotedzputs(p->nam, stdout);
+ if (printflags & PRINT_KV_PAIR)
+ putchar(' ');
+ else
+ putchar('=');
+
/* How the value is displayed depends *
* on the type of the parameter */
- quotedzputs(p->nam, stdout);
- putchar('=');
switch (PM_TYPE(p->flags)) {
case PM_SCALAR:
/* string: simple output */
if (p->gets.cfn && (t = p->gets.cfn(p)))
quotedzputs(t, stdout);
- putchar('\n');
break;
case PM_INTEGER:
/* integer */
- printf("%ld\n", p->gets.ifn(p));
+ printf("%ld", p->gets.ifn(p));
break;
case PM_ARRAY:
/* array */
- putchar('(');
+ if (!(printflags & PRINT_KV_PAIR))
+ putchar('(');
u = p->gets.afn(p);
if(*u) {
quotedzputs(*u++, stdout);
@@ -2609,17 +2613,25 @@
quotedzputs(*u++, stdout);
}
}
- printf(")\n");
+ if (!(printflags & PRINT_KV_PAIR))
+ putchar(')');
break;
case PM_HASHED:
/* association */
- putchar('(');
+ if (!(printflags & PRINT_KV_PAIR))
+ putchar('(');
{
HashTable ht = p->gets.hfn(p);
if (ht)
- scanhashtable(ht, 0, 0, 0, ht->printnode, 0);
+ scanhashtable(ht, 0, 0, PM_UNSET,
+ ht->printnode, PRINT_KV_PAIR);
}
- printf(")\n");
+ if (!(printflags & PRINT_KV_PAIR))
+ putchar(')');
break;
}
+ if (printflags & PRINT_KV_PAIR)
+ putchar(' ');
+ else
+ putchar('\n');
}
Index: Src/zsh.h
===================================================================
--- zsh.h 1998/12/12 07:25:54 1.7
+++ zsh.h 1998/12/14 02:09:01
@@ -929,13 +929,14 @@
#define PRINT_NAMEONLY (1<<0)
#define PRINT_TYPE (1<<1)
#define PRINT_LIST (1<<2)
+#define PRINT_KV_PAIR (1<<3)
/* flags for printing for the whence builtin */
-#define PRINT_WHENCE_CSH (1<<3)
-#define PRINT_WHENCE_VERBOSE (1<<4)
-#define PRINT_WHENCE_SIMPLE (1<<5)
-#define PRINT_WHENCE_FUNCDEF (1<<6)
-#define PRINT_WHENCE_WORD (1<<7)
+#define PRINT_WHENCE_CSH (1<<4)
+#define PRINT_WHENCE_VERBOSE (1<<5)
+#define PRINT_WHENCE_SIMPLE (1<<6)
+#define PRINT_WHENCE_FUNCDEF (1<<7)
+#define PRINT_WHENCE_WORD (1<<8)
/***********************************/
/* Definitions for history control */
--
Bart Schaefer Brass Lantern Enterprises
http://www.well.com/user/barts http://www.brasslantern.com
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~1998-12-14 2:19 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
1998-12-14 2:17 PATCH: 3.1.5 + associative arrays: printing of parameters Bart Schaefer
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).