summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNiels Möller <nisse@lysator.liu.se>2002-09-28 18:04:16 +0200
committerNiels Möller <nisse@lysator.liu.se>2002-09-28 18:04:16 +0200
commite9d6f612e9d7a4180599c0e5315144e004e3a010 (patch)
tree2b0c192dca83f42ad00ebcc594e0c7f752fc86a9
parent2b7af82f26ceeb7fb5b1474f32867e3cb734e49d (diff)
downloadnettle-e9d6f612e9d7a4180599c0e5315144e004e3a010.tar.gz
(sexp_iterator_assoc): Return 0 for missing or duplicate keys.
Rev: src/nettle/sexp.c:1.3
-rw-r--r--sexp.c21
1 files changed, 19 insertions, 2 deletions
diff --git a/sexp.c b/sexp.c
index 194e23cf..bd60e29c 100644
--- a/sexp.c
+++ b/sexp.c
@@ -192,9 +192,19 @@ sexp_iterator_assoc(struct sexp_iterator *iterator,
const struct sexp_assoc_key *keys,
struct sexp_iterator *values)
{
+ int *found;
+ unsigned nfound;
+ unsigned i;
+
if (!sexp_iterator_enter_list(iterator))
return 0;
+ found = alloca(nkeys * sizeof(*found));
+ for (i = 0; i<nkeys; i++)
+ found[i] = 0;
+
+ nfound = 0;
+
for (;;)
{
if (!sexp_iterator_next(iterator))
@@ -212,13 +222,19 @@ sexp_iterator_assoc(struct sexp_iterator *iterator,
&& !iterator->display)
{
/* Compare to the given keys */
- unsigned i;
for (i = 0; i<nkeys; i++)
{
if (keys[i].length == iterator->atom_length
&& !memcmp(keys[i].name, iterator->atom,
keys[i].length))
{
+ if (found[i])
+ /* We don't allow duplicates */
+ return 0;
+
+ found[i] = 1;
+ nfound++;
+
/* Record this position. */
values[i] = *iterator;
@@ -234,7 +250,8 @@ sexp_iterator_assoc(struct sexp_iterator *iterator,
break;
case SEXP_END:
- return sexp_iterator_exit_list(iterator);
+ return sexp_iterator_exit_list(iterator)
+ && (nfound == nkeys);
default:
abort();