From 0f5e670cde5f844680a20f986786249dfe983584 Mon Sep 17 00:00:00 2001 From: "Barton E. Schaefer" Date: Mon, 24 Oct 2016 07:14:39 -0700 Subject: "typeset -p" uses "export" commands or the "-g" option for parameters that are not local to the current scope --- ChangeLog | 9 +++++++++ NEWS | 3 +++ README | 5 +++++ Src/params.c | 22 +++++++++++++++++----- Test/B02typeset.ztst | 4 ++-- Test/B03print.ztst | 4 ++-- Test/V10private.ztst | 2 +- 7 files changed, 39 insertions(+), 10 deletions(-) diff --git a/ChangeLog b/ChangeLog index 717f25e76..ee1fd94dc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2016-10-24 Barton E. Schaefer + + * unposted: NEWS, README: update for 39704. + + * 39704: Src/params.c, Test/B02typeset.ztst, Test/B03print.ztst, + Test/V10private.ztst: the output of "typeset -p" uses "export" + commands or the "-g" option for parameters that are not local to + the current scope. + 2016-10-24 Daniel Shahaf * 39706: Completion/Unix/Type/_tilde_files, Doc/Zsh/compsys.yo: diff --git a/NEWS b/NEWS index 65b246d33..35e0e2e5d 100644 --- a/NEWS +++ b/NEWS @@ -15,6 +15,9 @@ removed, even when /before/here is itself a symbolic link. It is recommended to review uses of ':A' and, if appropriate, convert them to ':P' as soon as compatibility with 5.2 is no longer a requirement. +The output of "typeset -p" uses "export" commands or the "-g" option +for parameters that are not local to the current scope. + Changes from 5.1.1 to 5.2 ------------------------- diff --git a/README b/README index ed2183d8d..1a2e73936 100644 --- a/README +++ b/README @@ -110,6 +110,11 @@ possible to return a non-zero status to the parent shell from a command executed as a replacement, and the new implementation is more consistent with other shells. +7) The output of "typeset -p" (and synonyms) now takes into account the +function scope and export state of each parameter. Exported parameters +are output as "export" commands unless the parameter is also local, and +other parameters not local to the scope are output with the "-g" option. + Incompatibilities between 5.0.8 and 5.2 --------------------------------------- diff --git a/Src/params.c b/Src/params.c index 1418021aa..3084b1ffe 100644 --- a/Src/params.c +++ b/Src/params.c @@ -5225,7 +5225,7 @@ printparamvalue(Param p, int printflags) { char *t, **u; - if (p->node.flags & PM_AUTOLOAD) { + if ((p->node.flags & PM_EXPORTED) && !p->env) { putchar('\n'); return; } @@ -5312,9 +5312,13 @@ printparamnode(HashNode hn, int printflags) */ printflags |= PRINT_NAMEONLY; } + else if (p->node.flags & PM_EXPORTED) + printflags |= PRINT_NAMEONLY; else return; } + if (p->node.flags & PM_AUTOLOAD) + printflags |= PRINT_NAMEONLY; if (printflags & PRINT_TYPESET) { if ((p->node.flags & (PM_READONLY|PM_SPECIAL)) == @@ -5326,7 +5330,14 @@ printparamnode(HashNode hn, int printflags) */ return; } - printf("typeset "); + if (locallevel && p->level >= locallevel) { + printf("typeset "); /* printf("local "); */ + } else if (p->node.flags & PM_EXPORTED) { + printf("export "); + } else if (locallevel) { + printf("typeset -g "); + } else + printf("typeset "); } /* Print the attributes of the parameter */ @@ -5339,7 +5350,9 @@ printparamnode(HashNode hn, int printflags) if (pmptr->flags & PMTF_TEST_LEVEL) { if (p->level) doprint = 1; - } else if (p->node.flags & pmptr->binflag) + } else if ((pmptr->binflag != PM_EXPORTED || + ((p->node.flags & PM_LOCAL) || p->level)) && + (p->node.flags & pmptr->binflag)) doprint = 1; if (doprint) { @@ -5351,9 +5364,8 @@ printparamnode(HashNode hn, int printflags) } putchar(pmptr->typeflag); } - } else { + } else printf("%s ", pmptr->string); - } if ((pmptr->flags & PMTF_USE_BASE) && p->base) { printf("%d ", p->base); doneminus = 0; diff --git a/Test/B02typeset.ztst b/Test/B02typeset.ztst index d6d24210b..6d85a63fe 100644 --- a/Test/B02typeset.ztst +++ b/Test/B02typeset.ztst @@ -454,7 +454,7 @@ fn() { typeset -p array nonexistent; } fn 1:declare -p shouldn't create scoped values ->typeset -a array=( foo bar ) +>typeset -g -a array=( foo bar ) ?fn:typeset: no such variable: nonexistent unsetopt typesetsilent @@ -490,7 +490,7 @@ ?0 ?(eval):5: read-only variable: pbro ?(eval):6: read-only variable: pbro -?typeset -r pbro +?typeset -g -r pbro ?0 ?(eval):10: read-only variable: pbro diff --git a/Test/B03print.ztst b/Test/B03print.ztst index befe2f2dd..a4431cbc8 100644 --- a/Test/B03print.ztst +++ b/Test/B03print.ztst @@ -308,5 +308,5 @@ printf -v foo "%s\0%s-" into the breach typeset -p foo 0:print and printf into a variable ->typeset foo='once more' ->typeset foo=$'into\C-@the-breach\C-@-' +>typeset -g foo='once more' +>typeset -g foo=$'into\C-@the-breach\C-@-' diff --git a/Test/V10private.ztst b/Test/V10private.ztst index 320e35764..7ebf5a87f 100644 --- a/Test/V10private.ztst +++ b/Test/V10private.ztst @@ -129,7 +129,7 @@ 0:private hides value from surrounding scope in nested scope >typeset -a hash_test=( top level ) >typeset -A hash_test=( in function ) ->typeset -a hash_test=( top level ) +>typeset -g -a hash_test=( top level ) >array-local top level >top level F:note "typeset" rather than "private" in output from outer -- cgit 1.4.1