summaryrefslogtreecommitdiff
path: root/builtins/declare.def
diff options
context:
space:
mode:
authorJari Aalto <jari.aalto@cante.net>2001-11-13 17:56:06 +0000
committerJari Aalto <jari.aalto@cante.net>2009-09-12 16:46:54 +0000
commitf73dda092b33638d2d5e9c35375f687a607b5403 (patch)
treef21584e70a444d6a1ecba0fb5e2cf79e8cce91db /builtins/declare.def
parent28ef6c316f1aff914bb95ac09787a3c83c1815fd (diff)
downloadbash-f73dda092b33638d2d5e9c35375f687a607b5403.tar.gz
Imported from ../bash-2.05a.tar.gz.
Diffstat (limited to 'builtins/declare.def')
-rw-r--r--builtins/declare.def36
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