X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=lib%2Fecoli_keyval.h;h=a3e9400fe557bb16137c17ea219d8f4dc757fc7d;hb=dec2d7fa17ae1e8b3d1dec8e396d057757baf4f3;hp=3d739ff7cf8c70cf19dcc08c36929686a16baf1e;hpb=1bc00866d54d42d0e357ebd8f6c4edcde3456119;p=protos%2Flibecoli.git diff --git a/lib/ecoli_keyval.h b/lib/ecoli_keyval.h index 3d739ff..a3e9400 100644 --- a/lib/ecoli_keyval.h +++ b/lib/ecoli_keyval.h @@ -1,28 +1,5 @@ -/* - * Copyright (c) 2016, Olivier MATZ - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the University of California, Berkeley nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2016, Olivier MATZ */ /** @@ -41,6 +18,7 @@ typedef void (*ec_keyval_elt_free_t)(void *); struct ec_keyval; +struct ec_keyval_iter; /** * Create a hash table. @@ -101,6 +79,7 @@ int ec_keyval_del(struct ec_keyval *keyval, const char *key); * object is destroyed (ec_keyval_del() or ec_keyval_free()). * @return * 0 on success, or -1 on error (errno is set). + * On error, the passed value is freed (free_cb(val) is called). */ int ec_keyval_set(struct ec_keyval *keyval, const char *key, void *val, ec_keyval_elt_free_t free_cb); @@ -123,6 +102,20 @@ void ec_keyval_free(struct ec_keyval *keyval); */ size_t ec_keyval_len(const struct ec_keyval *keyval); +/** + * Duplicate a hash table + * + * A reference counter is shared between the clones of + * hash tables so that the objects are freed only when + * the last reference is destroyed. + * + * @param keyval + * The hash table. + * @return + * The duplicated hash table, or NULL on error (errno is set). + */ +struct ec_keyval *ec_keyval_dup(const struct ec_keyval *keyval); + /** * Dump a hash table. * @@ -133,4 +126,79 @@ size_t ec_keyval_len(const struct ec_keyval *keyval); */ void ec_keyval_dump(FILE *out, const struct ec_keyval *keyval); +/** + * Iterate the elements in the hash table. + * + * The typical usage is as below: + * + * // dump elements + * for (iter = ec_keyval_iter(keyval); + * ec_keyval_iter_valid(iter); + * ec_keyval_iter_next(iter)) { + * printf(" %s: %p\n", + * ec_keyval_iter_get_key(iter), + * ec_keyval_iter_get_val(iter)); + * } + * ec_keyval_iter_free(iter); + * + * @param keyval + * The hash table. + * @return + * An iterator, or NULL on error (errno is set). + */ +struct ec_keyval_iter * +ec_keyval_iter(const struct ec_keyval *keyval); + +/** + * Make the iterator point to the next element in the hash table. + * + * @param iter + * The hash table iterator. + */ +void ec_keyval_iter_next(struct ec_keyval_iter *iter); + +/** + * Free the iterator. + * + * @param iter + * The hash table iterator. + */ +void ec_keyval_iter_free(struct ec_keyval_iter *iter); + +/** + * Check if the iterator points to a valid element. + * + * @param iter + * The hash table iterator. + * @return + * true if the element is valid, else false. + */ +bool +ec_keyval_iter_valid(const struct ec_keyval_iter *iter); + +/** + * Get the key of the current element. + * + * @param iter + * The hash table iterator. + * @return + * The current element key, or NULL if the iterator points to an + * invalid element. + */ +const char * +ec_keyval_iter_get_key(const struct ec_keyval_iter *iter); + +/** + * Get the value of the current element. + * + * @param iter + * The hash table iterator. + * @return + * The current element value, or NULL if the iterator points to an + * invalid element. + */ +void * +ec_keyval_iter_get_val(const struct ec_keyval_iter *iter); + + #endif