diff options
author | Jari Aalto <jari.aalto@cante.net> | 2001-11-13 17:56:06 +0000 |
---|---|---|
committer | Jari Aalto <jari.aalto@cante.net> | 2009-09-12 16:46:54 +0000 |
commit | f73dda092b33638d2d5e9c35375f687a607b5403 (patch) | |
tree | f21584e70a444d6a1ecba0fb5e2cf79e8cce91db /builtins/declare.def | |
parent | 28ef6c316f1aff914bb95ac09787a3c83c1815fd (diff) | |
download | bash-f73dda092b33638d2d5e9c35375f687a607b5403.tar.gz |
Imported from ../bash-2.05a.tar.gz.
Diffstat (limited to 'builtins/declare.def')
-rw-r--r-- | builtins/declare.def | 36 |
1 files changed, 21 insertions, 15 deletions
diff --git a/builtins/declare.def b/builtins/declare.def index 6686f0a4..98f1cb1e 100644 --- a/builtins/declare.def +++ b/builtins/declare.def @@ -71,9 +71,9 @@ $END #include "common.h" #include "builtext.h" -extern int variable_context, array_needs_making; +extern int array_needs_making; -static int declare_internal (); +static int declare_internal __P((register WORD_LIST *, int)); /* Declare or change variable attributes. */ int @@ -110,7 +110,7 @@ declare_internal (list, local_var) int local_var; { int flags_on, flags_off, *flags, any_failed, assign_error, pflag, nodefs; - char *t; + char *t, *subscript_start; SHELL_VAR *var; flags_on = flags_off = any_failed = assign_error = pflag = nodefs = 0; @@ -215,7 +215,7 @@ declare_internal (list, local_var) char *value, *name; int offset; #if defined (ARRAY_VARS) - int making_array_special, assigning_array_special; + int making_array_special, compound_array_assign, simple_array_assign; #endif name = savestring (list->word->word); @@ -230,9 +230,11 @@ declare_internal (list, local_var) value = ""; #if defined (ARRAY_VARS) - assigning_array_special = 0; - if (t = strchr (name, '[')) + compound_array_assign = simple_array_assign = 0; + subscript_start = (char *)NULL; + if (t = strchr (name, '[')) /* ] */ { + subscript_start = t; *t = '\0'; making_array_special = 1; } @@ -344,18 +346,12 @@ declare_internal (list, local_var) } #if defined (ARRAY_VARS) - /* declare -a name=value does not work; declare name=value when - name is already an array does not work. */ if ((making_array_special || (flags_on & att_array) || array_p (var)) && offset) { if (value[0] == '(' && strchr (value, ')')) - assigning_array_special = 1; + compound_array_assign = 1; else - { - builtin_error ("%s: cannot assign to array variables in this way", name); - assign_error++; - NEXT_VARIABLE (); - } + simple_array_assign = 1; } /* Cannot use declare +a name to remove an array variable. */ @@ -375,8 +371,18 @@ declare_internal (list, local_var) VUNSETATTR (var, flags_off); #if defined (ARRAY_VARS) - if (offset && assigning_array_special) + if (offset && compound_array_assign) assign_array_var_from_string (var, value); + else if (simple_array_assign && subscript_start) + { + /* declare [-a] name[N]=value */ + *subscript_start = '['; /* ] */ + var = assign_array_element (name, value); + *subscript_start = '\0'; + } + else if (simple_array_assign) + /* let bind_array_variable take care of this. */ + bind_array_variable (name, 0, value); else #endif /* bind_variable_value duplicates the essential internals of |