mirror of
git://git.code.sf.net/p/zsh/code
synced 2025-10-22 16:20:23 +02:00
18204: KSH_ARRAYS
This commit is contained in:
parent
5c1f3b65a6
commit
4f3b9e43d2
3 changed files with 61 additions and 26 deletions
|
@ -1,3 +1,8 @@
|
|||
2003-02-07 Peter Stephenson <pws@csr.com>
|
||||
|
||||
* 18204: Doc/Zsh/builtins.yo, Src/builtin.c: KSH_ARRAYS gives
|
||||
ksh behaviour with set -A <optargs> <args>.
|
||||
|
||||
2003-02-06 Peter Stephenson <pws@csr.com>
|
||||
|
||||
* 18202: Functions/TCP/*, Doc/Makefile.in, Doc/zsh.yo,
|
||||
|
|
|
@ -966,6 +966,7 @@ cindex(parameters, listing)
|
|||
cindex(parameters, positional)
|
||||
cindex(parameters, setting array)
|
||||
cindex(array parameters, setting)
|
||||
pindex(KSH_ARRAYS, use of)
|
||||
item(tt(set) [ {tt(PLUS())|tt(-)}var(options) | {tt(PLUS())|tt(-)}tt(o) var(option_name) ] ... [ {tt(PLUS())|tt(-)}tt(A) [ var(name) ] ] [ var(arg) ... ])(
|
||||
Set the options for the shell and/or set the positional parameters, or
|
||||
declare and set an array. If the tt(-s) option is given, it causes the
|
||||
|
@ -976,14 +977,34 @@ ifzman(zmanref(zshoptions))\
|
|||
ifnzman(noderef(Options))\
|
||||
. Flags may be specified by name using the tt(-o) option.
|
||||
|
||||
If the tt(-A) flag is specified, var(name) is
|
||||
set to an array containing the given var(arg)s. if tt(PLUS()A) is used and
|
||||
var(name) is an array, the given arguments will replace the initial
|
||||
elements of that array; if no var(name) is specified, all arrays are
|
||||
printed. Otherwise the positional parameters are set. If no arguments are
|
||||
given, then the names and values of all parameters are printed on the
|
||||
standard output. If the only argument is `tt(PLUS())',
|
||||
the names of all parameters are printed.
|
||||
If the tt(-A) flag is specified, var(name) is set to an array containing
|
||||
the given var(arg)s; if no var(name) is specified, all arrays are printed
|
||||
together with their values.
|
||||
|
||||
If tt(PLUS()A) is used and var(name) is an array, the
|
||||
given arguments will replace the initial elements of that array; if no
|
||||
var(name) is specified, all arrays are printed without their values.
|
||||
|
||||
The behaviour of arguments after tt(-A) var(name) or tt(PLUS()A) var(name)
|
||||
depends on whether the option tt(KSH_ARRAYS) is set. If it is not set, all
|
||||
arguments following var(name) are treated as values for the array,
|
||||
regardless of their form. If the option is set, normal option processing
|
||||
continues at that point; only regular arguments are treated as values for
|
||||
the array. This means that
|
||||
|
||||
example(set -A array -x -- foo)
|
||||
|
||||
sets tt(array) to `tt(-x -- foo)' if tt(KSH_ARRAYS) is not set, but sets
|
||||
the array to tt(foo) and turns on the option `tt(-x)' if it is set.
|
||||
|
||||
If the tt(-A) flag is not present, but there are arguments beyond the
|
||||
options, the positional parameters are set. If the option list (if any)
|
||||
is terminated by `tt(-)tt(-)', and there are no further arguments, the
|
||||
positional parameters will be unset.
|
||||
|
||||
If no arguments and no `tt(-)tt(-)' are given, then the names and values of
|
||||
all parameters are printed on the standard output. If the only argument is
|
||||
`tt(PLUS())', the names of all parameters are printed.
|
||||
)
|
||||
module(setcap)(zsh/cap)
|
||||
findex(setopt)
|
||||
|
|
|
@ -531,7 +531,7 @@ bin_set(char *nam, char **args, Options ops, int func)
|
|||
{
|
||||
int action, optno, array = 0, hadopt = 0,
|
||||
hadplus = 0, hadend = 0, sort = 0;
|
||||
char **x;
|
||||
char **x, *arrayname = NULL;
|
||||
|
||||
/* Obsolescent sh compatibility: set - is the same as set +xv *
|
||||
* and set - args is the same as set +xv -- args */
|
||||
|
@ -575,7 +575,15 @@ bin_set(char *nam, char **args, Options ops, int func)
|
|||
if(!*++*args)
|
||||
args++;
|
||||
array = action ? 1 : -1;
|
||||
goto doneoptions;
|
||||
arrayname = *args;
|
||||
if (!arrayname)
|
||||
goto doneoptions;
|
||||
else if (!isset(KSHARRAYS))
|
||||
{
|
||||
args++;
|
||||
goto doneoptions;
|
||||
}
|
||||
break;
|
||||
} else if (**args == 's')
|
||||
sort = action ? 1 : -1;
|
||||
else {
|
||||
|
@ -592,30 +600,31 @@ bin_set(char *nam, char **args, Options ops, int func)
|
|||
|
||||
/* Show the parameters, possibly with values */
|
||||
queue_signals();
|
||||
if (!hadopt && !*args)
|
||||
scanhashtable(paramtab, 1, 0, 0, paramtab->printnode,
|
||||
hadplus ? PRINT_NAMEONLY : 0);
|
||||
if (!arrayname)
|
||||
{
|
||||
if (!hadopt && !*args)
|
||||
scanhashtable(paramtab, 1, 0, 0, paramtab->printnode,
|
||||
hadplus ? PRINT_NAMEONLY : 0);
|
||||
|
||||
if (array && !*args) {
|
||||
/* display arrays */
|
||||
scanhashtable(paramtab, 1, PM_ARRAY, 0, paramtab->printnode,
|
||||
hadplus ? PRINT_NAMEONLY : 0);
|
||||
if (array) {
|
||||
/* display arrays */
|
||||
scanhashtable(paramtab, 1, PM_ARRAY, 0, paramtab->printnode,
|
||||
hadplus ? PRINT_NAMEONLY : 0);
|
||||
}
|
||||
if (!*args && !hadend) {
|
||||
unqueue_signals();
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
if (!*args && !hadend) {
|
||||
unqueue_signals();
|
||||
return 0;
|
||||
}
|
||||
if (array)
|
||||
args++;
|
||||
if (sort)
|
||||
qsort(args, arrlen(args), sizeof(char *),
|
||||
sort > 0 ? strpcmp : invstrpcmp);
|
||||
if (array) {
|
||||
/* create an array with the specified elements */
|
||||
char **a = NULL, **y, *name = args[-1];
|
||||
char **a = NULL, **y;
|
||||
int len = arrlen(args);
|
||||
|
||||
if (array < 0 && (a = getaparam(name))) {
|
||||
if (array < 0 && (a = getaparam(arrayname))) {
|
||||
int al = arrlen(a);
|
||||
|
||||
if (al > len)
|
||||
|
@ -627,7 +636,7 @@ bin_set(char *nam, char **args, Options ops, int func)
|
|||
*y++ = ztrdup(*args++);
|
||||
}
|
||||
*y++ = NULL;
|
||||
setaparam(name, x);
|
||||
setaparam(arrayname, x);
|
||||
} else {
|
||||
/* set shell arguments */
|
||||
freearray(pparams);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue