aboutsummaryrefslogtreecommitdiffstats
path: root/assoc.c
diff options
context:
space:
mode:
authorChet Ramey <chet.ramey@case.edu>2014-02-26 09:36:43 -0500
committerChet Ramey <chet.ramey@case.edu>2014-02-26 09:36:43 -0500
commitac50fbac377e32b98d2de396f016ea81e8ee9961 (patch)
treef71882366b98fedf1a88a063103219a4935de926 /assoc.c
parent4539d736f1aff232857a854fd2a68df0c98d9f34 (diff)
downloadandroid_external_bash-ac50fbac377e32b98d2de396f016ea81e8ee9961.tar.gz
android_external_bash-ac50fbac377e32b98d2de396f016ea81e8ee9961.tar.bz2
android_external_bash-ac50fbac377e32b98d2de396f016ea81e8ee9961.zip
Bash-4.3 distribution sources and documentation
Diffstat (limited to 'assoc.c')
-rw-r--r--assoc.c31
1 files changed, 28 insertions, 3 deletions
diff --git a/assoc.c b/assoc.c
index 4561de4..f9ed881 100644
--- a/assoc.c
+++ b/assoc.c
@@ -7,7 +7,7 @@
* chet@ins.cwru.edu
*/
-/* Copyright (C) 2008,2009 Free Software Foundation, Inc.
+/* Copyright (C) 2008,2009,2011 Free Software Foundation, Inc.
This file is part of GNU Bash, the Bourne Again SHell.
@@ -65,7 +65,7 @@ assoc_flush (hash)
{
hash_flush (hash, 0);
}
-
+
int
assoc_insert (hash, key, value)
HASH_TABLE *hash;
@@ -87,6 +87,29 @@ assoc_insert (hash, key, value)
return (0);
}
+/* Like assoc_insert, but returns b->data instead of freeing it */
+PTR_T
+assoc_replace (hash, key, value)
+ HASH_TABLE *hash;
+ char *key;
+ char *value;
+{
+ BUCKET_CONTENTS *b;
+ PTR_T t;
+
+ b = hash_search (key, hash, HASH_CREATE);
+ if (b == 0)
+ return (PTR_T)0;
+ /* If we are overwriting an existing element's value, we're not going to
+ use the key. Nothing in the array assignment code path frees the key
+ string, so we can free it here to avoid a memory leak. */
+ if (b->key != key)
+ free (key);
+ t = b->data;
+ b->data = value ? savestring (value) : (char *)0;
+ return t;
+}
+
void
assoc_remove (hash, string)
HASH_TABLE *hash;
@@ -510,7 +533,7 @@ assoc_to_string (h, sep, quoted)
return (savestring (""));
result = NULL;
- list = NULL;
+ l = list = NULL;
/* This might be better implemented directly, but it's simple to implement
by converting to a word list first, possibly quoting the data, then
using list_string */
@@ -528,6 +551,8 @@ assoc_to_string (h, sep, quoted)
l = REVERSE_LIST(list, WORD_LIST *);
result = l ? string_list_internal (l, sep) : savestring ("");
+ dispose_words (l);
+
return result;
}