1*0677dfd1SJulio Merino /* Copyright (c) 2008 The NetBSD Foundation, Inc. 2c243e490SMarcel Moolenaar * All rights reserved. 3c243e490SMarcel Moolenaar * 4c243e490SMarcel Moolenaar * Redistribution and use in source and binary forms, with or without 5c243e490SMarcel Moolenaar * modification, are permitted provided that the following conditions 6c243e490SMarcel Moolenaar * are met: 7c243e490SMarcel Moolenaar * 1. Redistributions of source code must retain the above copyright 8c243e490SMarcel Moolenaar * notice, this list of conditions and the following disclaimer. 9c243e490SMarcel Moolenaar * 2. Redistributions in binary form must reproduce the above copyright 10c243e490SMarcel Moolenaar * notice, this list of conditions and the following disclaimer in the 11c243e490SMarcel Moolenaar * documentation and/or other materials provided with the distribution. 12c243e490SMarcel Moolenaar * 13c243e490SMarcel Moolenaar * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND 14c243e490SMarcel Moolenaar * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, 15c243e490SMarcel Moolenaar * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 16c243e490SMarcel Moolenaar * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 17c243e490SMarcel Moolenaar * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY 18c243e490SMarcel Moolenaar * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19c243e490SMarcel Moolenaar * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 20c243e490SMarcel Moolenaar * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 21c243e490SMarcel Moolenaar * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER 22c243e490SMarcel Moolenaar * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 23c243e490SMarcel Moolenaar * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 24*0677dfd1SJulio Merino * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ 25c243e490SMarcel Moolenaar 26*0677dfd1SJulio Merino #if !defined(ATF_C_DETAIL_MAP_H) 27*0677dfd1SJulio Merino #define ATF_C_DETAIL_MAP_H 28c243e490SMarcel Moolenaar 29c243e490SMarcel Moolenaar #include <stdarg.h> 30c243e490SMarcel Moolenaar #include <stdbool.h> 31c243e490SMarcel Moolenaar 32*0677dfd1SJulio Merino #include <atf-c/detail/list.h> 33c243e490SMarcel Moolenaar #include <atf-c/error_fwd.h> 34c243e490SMarcel Moolenaar 35c243e490SMarcel Moolenaar /* --------------------------------------------------------------------- 36c243e490SMarcel Moolenaar * The "atf_map_citer" type. 37c243e490SMarcel Moolenaar * --------------------------------------------------------------------- */ 38c243e490SMarcel Moolenaar 39c243e490SMarcel Moolenaar struct atf_map_citer { 40c243e490SMarcel Moolenaar const struct atf_map *m_map; 41c243e490SMarcel Moolenaar const void *m_entry; 42c243e490SMarcel Moolenaar atf_list_citer_t m_listiter; 43c243e490SMarcel Moolenaar }; 44c243e490SMarcel Moolenaar typedef struct atf_map_citer atf_map_citer_t; 45c243e490SMarcel Moolenaar 46c243e490SMarcel Moolenaar /* Getters. */ 47c243e490SMarcel Moolenaar const char *atf_map_citer_key(const atf_map_citer_t); 48c243e490SMarcel Moolenaar const void *atf_map_citer_data(const atf_map_citer_t); 49c243e490SMarcel Moolenaar atf_map_citer_t atf_map_citer_next(const atf_map_citer_t); 50c243e490SMarcel Moolenaar 51c243e490SMarcel Moolenaar /* Operators. */ 52c243e490SMarcel Moolenaar bool atf_equal_map_citer_map_citer(const atf_map_citer_t, 53c243e490SMarcel Moolenaar const atf_map_citer_t); 54c243e490SMarcel Moolenaar 55c243e490SMarcel Moolenaar /* --------------------------------------------------------------------- 56c243e490SMarcel Moolenaar * The "atf_map_iter" type. 57c243e490SMarcel Moolenaar * --------------------------------------------------------------------- */ 58c243e490SMarcel Moolenaar 59c243e490SMarcel Moolenaar struct atf_map_iter { 60c243e490SMarcel Moolenaar struct atf_map *m_map; 61c243e490SMarcel Moolenaar void *m_entry; 62c243e490SMarcel Moolenaar atf_list_iter_t m_listiter; 63c243e490SMarcel Moolenaar }; 64c243e490SMarcel Moolenaar typedef struct atf_map_iter atf_map_iter_t; 65c243e490SMarcel Moolenaar 66c243e490SMarcel Moolenaar /* Getters. */ 67c243e490SMarcel Moolenaar const char *atf_map_iter_key(const atf_map_iter_t); 68c243e490SMarcel Moolenaar void *atf_map_iter_data(const atf_map_iter_t); 69c243e490SMarcel Moolenaar atf_map_iter_t atf_map_iter_next(const atf_map_iter_t); 70c243e490SMarcel Moolenaar 71c243e490SMarcel Moolenaar /* Operators. */ 72c243e490SMarcel Moolenaar bool atf_equal_map_iter_map_iter(const atf_map_iter_t, 73c243e490SMarcel Moolenaar const atf_map_iter_t); 74c243e490SMarcel Moolenaar 75c243e490SMarcel Moolenaar /* --------------------------------------------------------------------- 76c243e490SMarcel Moolenaar * The "atf_map" type. 77c243e490SMarcel Moolenaar * --------------------------------------------------------------------- */ 78c243e490SMarcel Moolenaar 79c243e490SMarcel Moolenaar /* A list-based map. Typically very inefficient, but our maps are small 80c243e490SMarcel Moolenaar * enough. */ 81c243e490SMarcel Moolenaar struct atf_map { 82c243e490SMarcel Moolenaar atf_list_t m_list; 83c243e490SMarcel Moolenaar }; 84c243e490SMarcel Moolenaar typedef struct atf_map atf_map_t; 85c243e490SMarcel Moolenaar 86c243e490SMarcel Moolenaar /* Constructors and destructors */ 87c243e490SMarcel Moolenaar atf_error_t atf_map_init(atf_map_t *); 88c243e490SMarcel Moolenaar atf_error_t atf_map_init_charpp(atf_map_t *, const char *const *); 89c243e490SMarcel Moolenaar void atf_map_fini(atf_map_t *); 90c243e490SMarcel Moolenaar 91c243e490SMarcel Moolenaar /* Getters. */ 92c243e490SMarcel Moolenaar atf_map_iter_t atf_map_begin(atf_map_t *); 93c243e490SMarcel Moolenaar atf_map_citer_t atf_map_begin_c(const atf_map_t *); 94c243e490SMarcel Moolenaar atf_map_iter_t atf_map_end(atf_map_t *); 95c243e490SMarcel Moolenaar atf_map_citer_t atf_map_end_c(const atf_map_t *); 96c243e490SMarcel Moolenaar atf_map_iter_t atf_map_find(atf_map_t *, const char *); 97c243e490SMarcel Moolenaar atf_map_citer_t atf_map_find_c(const atf_map_t *, const char *); 98c243e490SMarcel Moolenaar size_t atf_map_size(const atf_map_t *); 99c243e490SMarcel Moolenaar char **atf_map_to_charpp(const atf_map_t *); 100c243e490SMarcel Moolenaar 101c243e490SMarcel Moolenaar /* Modifiers. */ 102c243e490SMarcel Moolenaar atf_error_t atf_map_insert(atf_map_t *, const char *, void *, bool); 103c243e490SMarcel Moolenaar 104c243e490SMarcel Moolenaar /* Macros. */ 105c243e490SMarcel Moolenaar #define atf_map_for_each(iter, map) \ 106c243e490SMarcel Moolenaar for (iter = atf_map_begin(map); \ 107c243e490SMarcel Moolenaar !atf_equal_map_iter_map_iter((iter), atf_map_end(map)); \ 108c243e490SMarcel Moolenaar iter = atf_map_iter_next(iter)) 109c243e490SMarcel Moolenaar #define atf_map_for_each_c(iter, map) \ 110c243e490SMarcel Moolenaar for (iter = atf_map_begin_c(map); \ 111c243e490SMarcel Moolenaar !atf_equal_map_citer_map_citer((iter), atf_map_end_c(map)); \ 112c243e490SMarcel Moolenaar iter = atf_map_citer_next(iter)) 113c243e490SMarcel Moolenaar 114*0677dfd1SJulio Merino #endif /* !defined(ATF_C_DETAIL_MAP_H) */ 115