1 /**
2  * @file dict.h
3  * @author Radek Krejci <rkrejci@cesnet.cz>
4  * @brief libyang dictionary
5  *
6  * Copyright (c) 2015 CESNET, z.s.p.o.
7  *
8  * This source code is licensed under BSD 3-Clause License (the "License").
9  * You may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  *     https://opensource.org/licenses/BSD-3-Clause
13  */
14 
15 #ifndef LY_DICT_H_
16 #define LY_DICT_H_
17 
18 #include <stdint.h>
19 
20 #ifdef __cplusplus
21 extern "C" {
22 #endif
23 
24 /*
25  * structure definition from context.h
26  */
27 struct ly_ctx;
28 
29 /**
30  * @defgroup dict Dictionary
31  * @{
32  *
33  * Publicly visible functions and values of the libyang dictionary. They provide
34  * access to the strings stored in the libyang context.
35  */
36 
37 /**
38  * @brief Insert string into dictionary. If the string is already present,
39  * only a reference counter is incremented and no memory allocation is
40  * performed.
41  *
42  * @param[in] ctx libyang context handler
43  * @param[in] value String to be stored in the dictionary.
44  * @param[in] len Number of bytes to store. The value is not required to be
45  * NULL terminated string, the len parameter says number of bytes stored in
46  * dictionary. The specified number of bytes is duplicated and terminating NULL
47  * byte is added automatically.
48  * @return pointer to the string stored in the dictionary
49  */
50 const char *lydict_insert(struct ly_ctx *ctx, const char *value, size_t len);
51 
52 /**
53  * @brief Insert string into dictionary - zerocopy version. If the string is
54  * already present, only a reference counter is incremented and no memory
55  * allocation is performed. This insert function variant avoids duplication of
56  * specified value - it is inserted into the dictionary directly.
57  *
58  * @param[in] ctx libyang context handler
59  * @param[in] value NULL-terminated string to be stored in the dictionary. If
60  * the string is not present in dictionary, the pointer is directly used by the
61  * dictionary. Otherwise, the reference counter is incremented and the value is
62  * freed. So, after calling the function, caller is supposed to not use the
63  * value address anymore.
64  * @return pointer to the string stored in the dictionary
65  */
66 const char *lydict_insert_zc(struct ly_ctx *ctx, char *value);
67 
68 /**
69  * @brief Remove specified string from the dictionary. It decrement reference
70  * counter for the string and if it is zero, the string itself is freed.
71  *
72  * @param[in] ctx libyang context handler
73  * @param[in] value String to be freed. Note, that not only the string itself
74  * must match the stored value, but also the address is being compared and the
75  * counter is decremented only if it matches.
76  */
77 void lydict_remove(struct ly_ctx *ctx, const char *value);
78 
79 /**@} dict */
80 
81 #ifdef __cplusplus
82 }
83 #endif
84 
85 #endif /* LY_DICT_H_ */
86