annotate include/jeffpc/nvl.h @ 822:f8d9ccf26563

nvl: add nvl_lookup_val to easily get at the struct val pointer value Signed-off-by: Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
author Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
date Fri, 30 Oct 2020 17:57:53 -0400
parents 342a128c5011
children ccb955138113
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
262
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
1 /*
822
f8d9ccf26563 nvl: add nvl_lookup_val to easily get at the struct val pointer value
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 567
diff changeset
2 * Copyright (c) 2017-2020 Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
262
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
3 *
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
4 * Permission is hereby granted, free of charge, to any person obtaining a copy
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
5 * of this software and associated documentation files (the "Software"), to deal
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
6 * in the Software without restriction, including without limitation the rights
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
8 * copies of the Software, and to permit persons to whom the Software is
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
9 * furnished to do so, subject to the following conditions:
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
10 *
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
11 * The above copyright notice and this permission notice shall be included in
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
12 * all copies or substantial portions of the Software.
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
13 *
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
20 * SOFTWARE.
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
21 */
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
22
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
23 #ifndef __JEFFPC_NVL_H
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
24 #define __JEFFPC_NVL_H
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
25
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
26 #include <stdbool.h>
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
27
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
28 #include <jeffpc/val.h>
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
29 #include <jeffpc/buffer.h>
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
30
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
31 struct nvlist {
464
b1e4c7607050 val: introduce VT_NVL
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 399
diff changeset
32 struct val val;
262
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
33 };
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
34
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
35 /* do not access these directly */
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
36 struct nvpair {
525
90cb00f83e5b nvl: use a red-black tree to keep track of name-value pairs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 494
diff changeset
37 struct rb_node node;
262
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
38
464
b1e4c7607050 val: introduce VT_NVL
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 399
diff changeset
39 struct str *name;
b1e4c7607050 val: introduce VT_NVL
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 399
diff changeset
40 struct val *value;
262
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
41 };
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
42
303
1ec946a39a92 nvlist: conditional conversion of values
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 292
diff changeset
43 enum nvcvtcond {
1ec946a39a92 nvlist: conditional conversion of values
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 292
diff changeset
44 NVCVT_COND_ALWAYS = 0,
304
f1c8cc0ee714 nvlist: support for empty-string conversion condition
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 303
diff changeset
45 NVCVT_COND_STR_EMPTY,
303
1ec946a39a92 nvlist: conditional conversion of values
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 292
diff changeset
46 };
1ec946a39a92 nvlist: conditional conversion of values
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 292
diff changeset
47
274
c35b1f62bcac nvlist: value type conversion code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 271
diff changeset
48 struct nvl_convert_info {
c35b1f62bcac nvlist: value type conversion code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 271
diff changeset
49 const char *name;
464
b1e4c7607050 val: introduce VT_NVL
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 399
diff changeset
50 enum val_type tgt_type;
303
1ec946a39a92 nvlist: conditional conversion of values
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 292
diff changeset
51 enum nvcvtcond cond;
274
c35b1f62bcac nvlist: value type conversion code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 271
diff changeset
52 };
c35b1f62bcac nvlist: value type conversion code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 271
diff changeset
53
464
b1e4c7607050 val: introduce VT_NVL
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 399
diff changeset
54 #define nvl_alloc() ((struct nvlist *) val_alloc_nvl())
b1e4c7607050 val: introduce VT_NVL
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 399
diff changeset
55
b1e4c7607050 val: introduce VT_NVL
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 399
diff changeset
56 /*
b1e4c7607050 val: introduce VT_NVL
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 399
diff changeset
57 * struct val reference counting & casting to struct nvl
b1e4c7607050 val: introduce VT_NVL
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 399
diff changeset
58 */
b1e4c7607050 val: introduce VT_NVL
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 399
diff changeset
59
b1e4c7607050 val: introduce VT_NVL
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 399
diff changeset
60 static inline struct nvlist *val_cast_to_nvl(struct val *val)
b1e4c7607050 val: introduce VT_NVL
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 399
diff changeset
61 {
b1e4c7607050 val: introduce VT_NVL
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 399
diff changeset
62 ASSERT(!val || (val->type == VT_NVL));
b1e4c7607050 val: introduce VT_NVL
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 399
diff changeset
63
b1e4c7607050 val: introduce VT_NVL
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 399
diff changeset
64 return container_of(val, struct nvlist, val);
b1e4c7607050 val: introduce VT_NVL
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 399
diff changeset
65 }
b1e4c7607050 val: introduce VT_NVL
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 399
diff changeset
66
b1e4c7607050 val: introduce VT_NVL
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 399
diff changeset
67 #define val_getref_nvl(v) val_cast_to_nvl(val_getref(v))
b1e4c7607050 val: introduce VT_NVL
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 399
diff changeset
68
b1e4c7607050 val: introduce VT_NVL
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 399
diff changeset
69 /*
b1e4c7607050 val: introduce VT_NVL
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 399
diff changeset
70 * struct nvl reference counting & casting to struct val
b1e4c7607050 val: introduce VT_NVL
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 399
diff changeset
71 */
b1e4c7607050 val: introduce VT_NVL
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 399
diff changeset
72
b1e4c7607050 val: introduce VT_NVL
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 399
diff changeset
73 #define nvl_getref(nvl) ((struct nvlist *) val_getref(nvl_cast_to_val(nvl)))
b1e4c7607050 val: introduce VT_NVL
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 399
diff changeset
74
b1e4c7607050 val: introduce VT_NVL
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 399
diff changeset
75 #define nvl_putref(nvl) val_putref(nvl_cast_to_val(nvl))
b1e4c7607050 val: introduce VT_NVL
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 399
diff changeset
76
b1e4c7607050 val: introduce VT_NVL
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 399
diff changeset
77 #define nvl_getref_val(nvl) val_getref(nvl_cast_to_val(nvl))
b1e4c7607050 val: introduce VT_NVL
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 399
diff changeset
78
b1e4c7607050 val: introduce VT_NVL
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 399
diff changeset
79 static inline struct val *nvl_cast_to_val(struct nvlist *nvl)
b1e4c7607050 val: introduce VT_NVL
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 399
diff changeset
80 {
b1e4c7607050 val: introduce VT_NVL
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 399
diff changeset
81 return &nvl->val;
b1e4c7607050 val: introduce VT_NVL
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 399
diff changeset
82 }
b1e4c7607050 val: introduce VT_NVL
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 399
diff changeset
83
b1e4c7607050 val: introduce VT_NVL
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 399
diff changeset
84 /*
b1e4c7607050 val: introduce VT_NVL
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 399
diff changeset
85 * Misc functions
b1e4c7607050 val: introduce VT_NVL
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 399
diff changeset
86 */
b1e4c7607050 val: introduce VT_NVL
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 399
diff changeset
87
263
d6e7f03dc963 nvlist: implement merging of nvlists
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 262
diff changeset
88 extern int nvl_merge(struct nvlist *dest, struct nvlist *src);
399
a3629041d89c nvlist: add an option to continue converting on most errors
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 345
diff changeset
89
477
2d83f251404d nvl: re-add nvl_dump_file to dump an nvlist
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 468
diff changeset
90 static inline void nvl_dump_file(FILE *out, struct nvlist *nvl)
2d83f251404d nvl: re-add nvl_dump_file to dump an nvlist
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 468
diff changeset
91 {
2d83f251404d nvl: re-add nvl_dump_file to dump an nvlist
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 468
diff changeset
92 val_dump_file(out, nvl_cast_to_val(nvl), 0);
2d83f251404d nvl: re-add nvl_dump_file to dump an nvlist
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 468
diff changeset
93 }
2d83f251404d nvl: re-add nvl_dump_file to dump an nvlist
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 468
diff changeset
94
399
a3629041d89c nvlist: add an option to continue converting on most errors
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 345
diff changeset
95 /*
a3629041d89c nvlist: add an option to continue converting on most errors
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 345
diff changeset
96 * If convert_all is true, then all errors except -ENOTSUP encountered
a3629041d89c nvlist: add an option to continue converting on most errors
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 345
diff changeset
97 * during the conversion are ignored.
a3629041d89c nvlist: add an option to continue converting on most errors
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 345
diff changeset
98 */
a3629041d89c nvlist: add an option to continue converting on most errors
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 345
diff changeset
99 extern int nvl_convert(struct nvlist *nvl, const struct nvl_convert_info *table,
a3629041d89c nvlist: add an option to continue converting on most errors
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 345
diff changeset
100 bool convert_all);
262
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
101
265
6cc52ba25b46 nvlist: pack framework
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 263
diff changeset
102 /* serialization & deserialization */
6cc52ba25b46 nvlist: pack framework
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 263
diff changeset
103 extern struct nvlist *nvl_unpack(const void *ptr, size_t len,
466
8635533bc2b6 val: rename nvformat to val_format
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 464
diff changeset
104 enum val_format format);
265
6cc52ba25b46 nvlist: pack framework
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 263
diff changeset
105
468
c075052024ac val: introduce packing & unpacking API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 466
diff changeset
106 static inline ssize_t nvl_size(struct nvlist *nvl, enum val_format format)
c075052024ac val: introduce packing & unpacking API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 466
diff changeset
107 {
c075052024ac val: introduce packing & unpacking API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 466
diff changeset
108 return val_size(nvl_cast_to_val(nvl), format);
c075052024ac val: introduce packing & unpacking API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 466
diff changeset
109 }
c075052024ac val: introduce packing & unpacking API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 466
diff changeset
110
567
342a128c5011 nvl: add nvl_pack_into wrapper around val_pack_into
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 525
diff changeset
111 static inline ssize_t nvl_pack_into(struct nvlist *nvl,
342a128c5011 nvl: add nvl_pack_into wrapper around val_pack_into
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 525
diff changeset
112 void *buf, size_t bufsize,
342a128c5011 nvl: add nvl_pack_into wrapper around val_pack_into
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 525
diff changeset
113 enum val_format format)
342a128c5011 nvl: add nvl_pack_into wrapper around val_pack_into
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 525
diff changeset
114 {
342a128c5011 nvl: add nvl_pack_into wrapper around val_pack_into
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 525
diff changeset
115 return val_pack_into(nvl_cast_to_val(nvl), buf, bufsize, format);
342a128c5011 nvl: add nvl_pack_into wrapper around val_pack_into
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 525
diff changeset
116 }
342a128c5011 nvl: add nvl_pack_into wrapper around val_pack_into
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 525
diff changeset
117
468
c075052024ac val: introduce packing & unpacking API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 466
diff changeset
118 static inline struct buffer *nvl_pack(struct nvlist *nvl,
c075052024ac val: introduce packing & unpacking API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 466
diff changeset
119 enum val_format format)
c075052024ac val: introduce packing & unpacking API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 466
diff changeset
120 {
c075052024ac val: introduce packing & unpacking API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 466
diff changeset
121 return val_pack(nvl_cast_to_val(nvl), format);
c075052024ac val: introduce packing & unpacking API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 466
diff changeset
122 }
c075052024ac val: introduce packing & unpacking API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 466
diff changeset
123
262
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
124 /* iteration */
464
b1e4c7607050 val: introduce VT_NVL
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 399
diff changeset
125 extern const struct nvpair *nvl_iter_start(struct nvlist *nvl);
262
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
126 extern const struct nvpair *nvl_iter_next(struct nvlist *nvl,
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
127 const struct nvpair *prev);
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
128
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
129 #define nvl_for_each(pair, nvl) \
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
130 for (pair = nvl_iter_start(nvl); \
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
131 pair != NULL; \
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
132 pair = nvl_iter_next(nvl, pair))
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
133
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
134 /*
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
135 * There are two types of lookup functions - those that return a pointer and
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
136 * those than return an int. The functions that return a pointer either
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
137 * return a valid pointer with a new reference or an errno. The functions
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
138 * that return an int, return 0 and set the out argument to the value or
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
139 * return an errno.
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
140 *
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
141 * -ENOENT = not found
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
142 * -ERANGE = wrong type (e.g., looking up an int, but stored value is a string)
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
143 */
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
144 extern int nvl_lookup_array(struct nvlist *nvl, const char *name,
464
b1e4c7607050 val: introduce VT_NVL
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 399
diff changeset
145 struct val ***vals, size_t *nelem);
262
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
146 extern int nvl_lookup_blob(struct nvlist *nvl, const char *name,
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
147 const void **ptr, size_t *size);
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
148 extern int nvl_lookup_bool(struct nvlist *nvl, const char *name, bool *out);
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
149 extern int nvl_lookup_int(struct nvlist *nvl, const char *name, uint64_t *out);
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
150 extern int nvl_lookup_null(struct nvlist *nvl, const char *name);
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
151 extern const struct nvpair *nvl_lookup(struct nvlist *nvl, const char *name);
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
152 extern struct nvlist *nvl_lookup_nvl(struct nvlist *nvl, const char *name);
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
153 extern struct str *nvl_lookup_str(struct nvlist *nvl, const char *name);
822
f8d9ccf26563 nvl: add nvl_lookup_val to easily get at the struct val pointer value
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 567
diff changeset
154 extern struct val *nvl_lookup_val(struct nvlist *nvl, const char *name);
262
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
155
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
156 /*
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
157 * Add a new key-value pair or change the value of an existing key-value
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
158 * pair.
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
159 *
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
160 * always consume val's reference
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
161 *
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
162 * -ENOMEM = out of memory
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
163 */
464
b1e4c7607050 val: introduce VT_NVL
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 399
diff changeset
164 extern int nvl_set(struct nvlist *nvl, const char *name, struct val *val);
262
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
165 extern int nvl_set_array(struct nvlist *nvl, const char *name,
464
b1e4c7607050 val: introduce VT_NVL
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 399
diff changeset
166 struct val **vals, size_t nelem);
262
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
167 extern int nvl_set_array_copy(struct nvlist *nvl, const char *name,
464
b1e4c7607050 val: introduce VT_NVL
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 399
diff changeset
168 struct val **vals, size_t nelem);
262
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
169 extern int nvl_set_blob(struct nvlist *nvl, const char *name, void *ptr,
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
170 size_t size);
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
171 extern int nvl_set_blob_copy(struct nvlist *nvl, const char *name,
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
172 const void *ptr, size_t size);
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
173 extern int nvl_set_bool(struct nvlist *nvl, const char *name, bool val);
271
f4197a2432cb nvl: allow setting C strings
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 266
diff changeset
174 extern int nvl_set_cstr_dup(struct nvlist *nvl, const char *name,
f4197a2432cb nvl: allow setting C strings
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 266
diff changeset
175 const char *val);
262
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
176 extern int nvl_set_int(struct nvlist *nvl, const char *name, uint64_t val);
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
177 extern int nvl_set_null(struct nvlist *nvl, const char *name);
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
178 extern int nvl_set_nvl(struct nvlist *nvl, const char *name, struct nvlist *val);
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
179 extern int nvl_set_str(struct nvlist *nvl, const char *name, struct str *val);
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
180
494
9d68f987d81e nvl: add a function to set a <key,value> pair based on an nvpair
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 492
diff changeset
181 extern int nvl_set_pair(struct nvlist *nvl, const struct nvpair *pair);
9d68f987d81e nvl: add a function to set a <key,value> pair based on an nvpair
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 492
diff changeset
182
262
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
183 /*
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
184 * Remove a key-value pair from the list.
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
185 *
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
186 * -ENOENT = not found
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
187 * -ERANGE = existing item's type doesn't match requested type
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
188 */
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
189 extern int nvl_unset(struct nvlist *nvl, const char *name);
464
b1e4c7607050 val: introduce VT_NVL
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 399
diff changeset
190 extern int nvl_unset_type(struct nvlist *nvl, const char *name, enum val_type type);
262
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
191
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
192 /*
277
4360936c2808 nvlist: add functions to check for existence of a certain key
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 274
diff changeset
193 * Check existence of a specific key, or key-valuetype pair from the list.
4360936c2808 nvlist: add functions to check for existence of a certain key
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 274
diff changeset
194 *
4360936c2808 nvlist: add functions to check for existence of a certain key
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 274
diff changeset
195 * The generic nvl_exists returns true if the item exists and false
4360936c2808 nvlist: add functions to check for existence of a certain key
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 274
diff changeset
196 * otherwise.
4360936c2808 nvlist: add functions to check for existence of a certain key
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 274
diff changeset
197 *
4360936c2808 nvlist: add functions to check for existence of a certain key
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 274
diff changeset
198 * The type-specific checks return:
4360936c2808 nvlist: add functions to check for existence of a certain key
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 274
diff changeset
199 *
4360936c2808 nvlist: add functions to check for existence of a certain key
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 274
diff changeset
200 * -ENOENT = does not exist
4360936c2808 nvlist: add functions to check for existence of a certain key
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 274
diff changeset
201 * -ERANGE = exists, wrong type
4360936c2808 nvlist: add functions to check for existence of a certain key
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 274
diff changeset
202 * 0 = exists, correct type
4360936c2808 nvlist: add functions to check for existence of a certain key
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 274
diff changeset
203 */
4360936c2808 nvlist: add functions to check for existence of a certain key
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 274
diff changeset
204 extern bool nvl_exists(struct nvlist *nvl, const char *name);
4360936c2808 nvlist: add functions to check for existence of a certain key
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 274
diff changeset
205 extern int nvl_exists_type(struct nvlist *nvl, const char *name,
464
b1e4c7607050 val: introduce VT_NVL
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 399
diff changeset
206 enum val_type type);
277
4360936c2808 nvlist: add functions to check for existence of a certain key
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 274
diff changeset
207
4360936c2808 nvlist: add functions to check for existence of a certain key
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 274
diff changeset
208 /*
262
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
209 * nvpair related functions
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
210 */
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
211
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
212 static inline const char *nvpair_name(const struct nvpair *pair)
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
213 {
464
b1e4c7607050 val: introduce VT_NVL
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 399
diff changeset
214 return str_cstr(pair->name);
262
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
215 }
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
216
492
1826b5291ff5 nvl: add helpers to get a struct str/val reference of a pair's name/value
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 477
diff changeset
217 static inline struct str *nvpair_name_str(const struct nvpair *pair)
1826b5291ff5 nvl: add helpers to get a struct str/val reference of a pair's name/value
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 477
diff changeset
218 {
1826b5291ff5 nvl: add helpers to get a struct str/val reference of a pair's name/value
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 477
diff changeset
219 return str_getref(pair->name);
1826b5291ff5 nvl: add helpers to get a struct str/val reference of a pair's name/value
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 477
diff changeset
220 }
1826b5291ff5 nvl: add helpers to get a struct str/val reference of a pair's name/value
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 477
diff changeset
221
464
b1e4c7607050 val: introduce VT_NVL
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 399
diff changeset
222 static inline enum val_type nvpair_type(const struct nvpair *pair)
262
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
223 {
464
b1e4c7607050 val: introduce VT_NVL
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 399
diff changeset
224 return pair->value->type;
262
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
225 }
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
226
492
1826b5291ff5 nvl: add helpers to get a struct str/val reference of a pair's name/value
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 477
diff changeset
227 static inline struct val *nvpair_value(const struct nvpair *pair)
1826b5291ff5 nvl: add helpers to get a struct str/val reference of a pair's name/value
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 477
diff changeset
228 {
1826b5291ff5 nvl: add helpers to get a struct str/val reference of a pair's name/value
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 477
diff changeset
229 return val_getref(pair->value);
1826b5291ff5 nvl: add helpers to get a struct str/val reference of a pair's name/value
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 477
diff changeset
230 }
1826b5291ff5 nvl: add helpers to get a struct str/val reference of a pair's name/value
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 477
diff changeset
231
262
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
232 /*
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
233 * As with the nvl_lookup_* functions, there return either a pointer or an
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
234 * integer. The meaning of the return values is the same as well.
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
235 */
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
236 extern int nvpair_value_array(const struct nvpair *pair,
464
b1e4c7607050 val: introduce VT_NVL
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 399
diff changeset
237 struct val ***vals, size_t *nelem);
262
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
238 extern int nvpair_value_blob(const struct nvpair *pair,
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
239 const void **ptr, size_t *size);
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
240 extern int nvpair_value_bool(const struct nvpair *pair, bool *out);
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
241 extern int nvpair_value_int(const struct nvpair *pair, uint64_t *out);
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
242 extern int nvpair_value_null(const struct nvpair *pair);
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
243 extern struct nvlist *nvpair_value_nvl(const struct nvpair *pair);
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
244 extern struct str *nvpair_value_str(const struct nvpair *pair);
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
245
89bf89fc814c nvlist: introduce a name-value list API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
246 #endif