xref: /dragonfly/sys/libprop/prop_array_util.c (revision 86d7f5d3)
1*86d7f5d3SJohn Marino /*	$NetBSD: prop_array_util.c,v 1.2 2008/09/11 13:15:13 haad Exp $	*/
2*86d7f5d3SJohn Marino 
3*86d7f5d3SJohn Marino /*-
4*86d7f5d3SJohn Marino  * Copyright (c) 2006 The NetBSD Foundation, Inc.
5*86d7f5d3SJohn Marino  * All rights reserved.
6*86d7f5d3SJohn Marino  *
7*86d7f5d3SJohn Marino  * This code is derived from software contributed to The NetBSD Foundation
8*86d7f5d3SJohn Marino  * by Jason R. Thorpe.
9*86d7f5d3SJohn Marino  *
10*86d7f5d3SJohn Marino  * Redistribution and use in source and binary forms, with or without
11*86d7f5d3SJohn Marino  * modification, are permitted provided that the following conditions
12*86d7f5d3SJohn Marino  * are met:
13*86d7f5d3SJohn Marino  * 1. Redistributions of source code must retain the above copyright
14*86d7f5d3SJohn Marino  *    notice, this list of conditions and the following disclaimer.
15*86d7f5d3SJohn Marino  * 2. Redistributions in binary form must reproduce the above copyright
16*86d7f5d3SJohn Marino  *    notice, this list of conditions and the following disclaimer in the
17*86d7f5d3SJohn Marino  *    documentation and/or other materials provided with the distribution.
18*86d7f5d3SJohn Marino  *
19*86d7f5d3SJohn Marino  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20*86d7f5d3SJohn Marino  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21*86d7f5d3SJohn Marino  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22*86d7f5d3SJohn Marino  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23*86d7f5d3SJohn Marino  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24*86d7f5d3SJohn Marino  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25*86d7f5d3SJohn Marino  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26*86d7f5d3SJohn Marino  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27*86d7f5d3SJohn Marino  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28*86d7f5d3SJohn Marino  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29*86d7f5d3SJohn Marino  * POSSIBILITY OF SUCH DAMAGE.
30*86d7f5d3SJohn Marino  */
31*86d7f5d3SJohn Marino 
32*86d7f5d3SJohn Marino /*
33*86d7f5d3SJohn Marino  * Utility routines to make it more convenient to work with values
34*86d7f5d3SJohn Marino  * stored in array.
35*86d7f5d3SJohn Marino  *
36*86d7f5d3SJohn Marino  * Note: There is no special magic going on here.  We use the standard
37*86d7f5d3SJohn Marino  * proplib(3) APIs to do all of this work.  Any application could do
38*86d7f5d3SJohn Marino  * exactly what we're doing here.
39*86d7f5d3SJohn Marino  */
40*86d7f5d3SJohn Marino 
41*86d7f5d3SJohn Marino #include <libprop/proplib.h>
42*86d7f5d3SJohn Marino #include "prop_object_impl.h" /* hide kernel vs. not-kernel vs. standalone */
43*86d7f5d3SJohn Marino 
44*86d7f5d3SJohn Marino bool
prop_array_get_bool(prop_array_t array,unsigned int indx,bool * valp)45*86d7f5d3SJohn Marino prop_array_get_bool(prop_array_t array,
46*86d7f5d3SJohn Marino 			 unsigned int indx,
47*86d7f5d3SJohn Marino 			 bool *valp)
48*86d7f5d3SJohn Marino {
49*86d7f5d3SJohn Marino 	prop_bool_t b;
50*86d7f5d3SJohn Marino 
51*86d7f5d3SJohn Marino 	b = prop_array_get(array, indx);
52*86d7f5d3SJohn Marino 	if (prop_object_type(b) != PROP_TYPE_BOOL)
53*86d7f5d3SJohn Marino 		return (false);
54*86d7f5d3SJohn Marino 
55*86d7f5d3SJohn Marino 	*valp = prop_bool_true(b);
56*86d7f5d3SJohn Marino 
57*86d7f5d3SJohn Marino 	return (true);
58*86d7f5d3SJohn Marino }
59*86d7f5d3SJohn Marino 
60*86d7f5d3SJohn Marino bool
prop_array_set_bool(prop_array_t array,unsigned int indx,bool val)61*86d7f5d3SJohn Marino prop_array_set_bool(prop_array_t array,
62*86d7f5d3SJohn Marino 			 unsigned int indx,
63*86d7f5d3SJohn Marino 			 bool val)
64*86d7f5d3SJohn Marino {
65*86d7f5d3SJohn Marino 	prop_bool_t b;
66*86d7f5d3SJohn Marino 	int rv;
67*86d7f5d3SJohn Marino 
68*86d7f5d3SJohn Marino 	b = prop_bool_create(val);
69*86d7f5d3SJohn Marino 	if (b == NULL)
70*86d7f5d3SJohn Marino 		return (false);
71*86d7f5d3SJohn Marino 	rv = prop_array_set(array, indx, b);
72*86d7f5d3SJohn Marino 	prop_object_release(b);
73*86d7f5d3SJohn Marino 
74*86d7f5d3SJohn Marino 	return (rv);
75*86d7f5d3SJohn Marino }
76*86d7f5d3SJohn Marino 
77*86d7f5d3SJohn Marino #define	TEMPLATE(size)							\
78*86d7f5d3SJohn Marino bool							                \
79*86d7f5d3SJohn Marino prop_array_get_int ## size (prop_array_t array,				\
80*86d7f5d3SJohn Marino 				 unsigned int indx,			\
81*86d7f5d3SJohn Marino 				 int ## size ## _t *valp)		\
82*86d7f5d3SJohn Marino {									\
83*86d7f5d3SJohn Marino 	prop_number_t num;						\
84*86d7f5d3SJohn Marino 									\
85*86d7f5d3SJohn Marino 	num = prop_array_get(array, indx);				\
86*86d7f5d3SJohn Marino 	if (prop_object_type(num) != PROP_TYPE_NUMBER)			\
87*86d7f5d3SJohn Marino 		return (false);						\
88*86d7f5d3SJohn Marino 									\
89*86d7f5d3SJohn Marino 	if (prop_number_unsigned(num) &&				\
90*86d7f5d3SJohn Marino 	    prop_number_unsigned_integer_value(num) >			\
91*86d7f5d3SJohn Marino 	   /*CONSTCOND*/((size) ==  8 ?  INT8_MAX :			\
92*86d7f5d3SJohn Marino 			 (size) == 16 ? INT16_MAX :			\
93*86d7f5d3SJohn Marino 			 (size) == 32 ? INT32_MAX : INT64_MAX)) {	\
94*86d7f5d3SJohn Marino 		return (false);						\
95*86d7f5d3SJohn Marino 	}								\
96*86d7f5d3SJohn Marino 									\
97*86d7f5d3SJohn Marino 	if (prop_number_size(num) > (size))				\
98*86d7f5d3SJohn Marino 		return (false);						\
99*86d7f5d3SJohn Marino 									\
100*86d7f5d3SJohn Marino 	*valp = (int ## size ## _t) prop_number_integer_value(num);	\
101*86d7f5d3SJohn Marino 									\
102*86d7f5d3SJohn Marino 	return (true);							\
103*86d7f5d3SJohn Marino }									\
104*86d7f5d3SJohn Marino 									\
105*86d7f5d3SJohn Marino bool								        \
106*86d7f5d3SJohn Marino prop_array_get_uint ## size (prop_array_t array,		        \
107*86d7f5d3SJohn Marino 				  unsigned int indx,			\
108*86d7f5d3SJohn Marino 				  uint ## size ## _t *valp)		\
109*86d7f5d3SJohn Marino {									\
110*86d7f5d3SJohn Marino 	prop_number_t num;						\
111*86d7f5d3SJohn Marino 									\
112*86d7f5d3SJohn Marino 	num = prop_array_get(array, indx);				\
113*86d7f5d3SJohn Marino 	if (prop_object_type(num) != PROP_TYPE_NUMBER)			\
114*86d7f5d3SJohn Marino 		return (false);						\
115*86d7f5d3SJohn Marino 									\
116*86d7f5d3SJohn Marino 	if (prop_number_unsigned(num) == false &&			\
117*86d7f5d3SJohn Marino 	    prop_number_integer_value(num) < 0) {			\
118*86d7f5d3SJohn Marino 		return (false);						\
119*86d7f5d3SJohn Marino 	}								\
120*86d7f5d3SJohn Marino 									\
121*86d7f5d3SJohn Marino 	if (prop_number_size(num) > (size))				\
122*86d7f5d3SJohn Marino 		return (false);						\
123*86d7f5d3SJohn Marino 									\
124*86d7f5d3SJohn Marino 	*valp = (uint ## size ## _t)					\
125*86d7f5d3SJohn Marino 	    prop_number_unsigned_integer_value(num);			\
126*86d7f5d3SJohn Marino 									\
127*86d7f5d3SJohn Marino 	return (true);							\
128*86d7f5d3SJohn Marino }									\
129*86d7f5d3SJohn Marino 									\
130*86d7f5d3SJohn Marino bool									\
131*86d7f5d3SJohn Marino  prop_array_set_int ## size (prop_array_t array,			\
132*86d7f5d3SJohn Marino 				 unsigned int indx,			\
133*86d7f5d3SJohn Marino 				 int ## size ## _t val)			\
134*86d7f5d3SJohn Marino {									\
135*86d7f5d3SJohn Marino 	prop_number_t num;						\
136*86d7f5d3SJohn Marino 	int rv;								\
137*86d7f5d3SJohn Marino 									\
138*86d7f5d3SJohn Marino 	num = prop_number_create_integer((int64_t) val);		\
139*86d7f5d3SJohn Marino 	if (num == NULL)						\
140*86d7f5d3SJohn Marino 		return (false);						\
141*86d7f5d3SJohn Marino 	rv = prop_array_set(array, indx, num);				\
142*86d7f5d3SJohn Marino 	prop_object_release(num);					\
143*86d7f5d3SJohn Marino 									\
144*86d7f5d3SJohn Marino 	return (rv);							\
145*86d7f5d3SJohn Marino }									\
146*86d7f5d3SJohn Marino 									\
147*86d7f5d3SJohn Marino bool									\
148*86d7f5d3SJohn Marino prop_array_set_uint ## size (prop_array_t array,			\
149*86d7f5d3SJohn Marino 				  unsigned int indx,			\
150*86d7f5d3SJohn Marino 				  uint ## size ## _t val)		\
151*86d7f5d3SJohn Marino {									\
152*86d7f5d3SJohn Marino 	prop_number_t num;						\
153*86d7f5d3SJohn Marino 	int rv;								\
154*86d7f5d3SJohn Marino 									\
155*86d7f5d3SJohn Marino 	num = prop_number_create_unsigned_integer((uint64_t) val);	\
156*86d7f5d3SJohn Marino 	if (num == NULL)						\
157*86d7f5d3SJohn Marino 		return (false);						\
158*86d7f5d3SJohn Marino 	rv = prop_array_set(array, indx, num);				\
159*86d7f5d3SJohn Marino 	prop_object_release(num);					\
160*86d7f5d3SJohn Marino 									\
161*86d7f5d3SJohn Marino 	return (rv);							\
162*86d7f5d3SJohn Marino }									\
163*86d7f5d3SJohn Marino 									\
164*86d7f5d3SJohn Marino bool									\
165*86d7f5d3SJohn Marino prop_array_add_int ## size (prop_array_t array,				\
166*86d7f5d3SJohn Marino 				 int ## size ## _t val)			\
167*86d7f5d3SJohn Marino {									\
168*86d7f5d3SJohn Marino 	prop_number_t num;						\
169*86d7f5d3SJohn Marino 	int rv;								\
170*86d7f5d3SJohn Marino 									\
171*86d7f5d3SJohn Marino 	num = prop_number_create_integer((int64_t) val);		\
172*86d7f5d3SJohn Marino 	if (num == NULL)						\
173*86d7f5d3SJohn Marino 		return (false);						\
174*86d7f5d3SJohn Marino 	rv = prop_array_add(array, num);				\
175*86d7f5d3SJohn Marino 	prop_object_release(num);					\
176*86d7f5d3SJohn Marino 									\
177*86d7f5d3SJohn Marino 	return (rv);							\
178*86d7f5d3SJohn Marino }									\
179*86d7f5d3SJohn Marino 									\
180*86d7f5d3SJohn Marino bool									\
181*86d7f5d3SJohn Marino prop_array_add_uint ## size (prop_array_t array,			\
182*86d7f5d3SJohn Marino 				  uint ## size ## _t val)		\
183*86d7f5d3SJohn Marino {									\
184*86d7f5d3SJohn Marino 	prop_number_t num;						\
185*86d7f5d3SJohn Marino 	int rv;								\
186*86d7f5d3SJohn Marino 									\
187*86d7f5d3SJohn Marino 	num = prop_number_create_integer((int64_t) val);		\
188*86d7f5d3SJohn Marino 	if (num == NULL)						\
189*86d7f5d3SJohn Marino 		return (false);						\
190*86d7f5d3SJohn Marino 	rv = prop_array_add(array, num);				\
191*86d7f5d3SJohn Marino 	prop_object_release(num);					\
192*86d7f5d3SJohn Marino 									\
193*86d7f5d3SJohn Marino 	return (rv);							\
194*86d7f5d3SJohn Marino }
195*86d7f5d3SJohn Marino 
196*86d7f5d3SJohn Marino TEMPLATE(8)
197*86d7f5d3SJohn Marino TEMPLATE(16)
198*86d7f5d3SJohn Marino TEMPLATE(32)
199*86d7f5d3SJohn Marino TEMPLATE(64)
200*86d7f5d3SJohn Marino 
201*86d7f5d3SJohn Marino #undef TEMPLATE
202*86d7f5d3SJohn Marino 
203*86d7f5d3SJohn Marino #define	TEMPLATE(variant, qualifier)					\
204*86d7f5d3SJohn Marino bool								        \
205*86d7f5d3SJohn Marino prop_array_get_cstring ## variant (prop_array_t array,		        \
206*86d7f5d3SJohn Marino 					unsigned int indx,		\
207*86d7f5d3SJohn Marino 					qualifier char **cpp)		\
208*86d7f5d3SJohn Marino {									\
209*86d7f5d3SJohn Marino 	prop_string_t str;						\
210*86d7f5d3SJohn Marino 									\
211*86d7f5d3SJohn Marino 	str = prop_array_get(array, indx);				\
212*86d7f5d3SJohn Marino 	if (prop_object_type(str) != PROP_TYPE_STRING)			\
213*86d7f5d3SJohn Marino 		return (false);						\
214*86d7f5d3SJohn Marino 									\
215*86d7f5d3SJohn Marino 	*cpp = prop_string_cstring ## variant (str);			\
216*86d7f5d3SJohn Marino 									\
217*86d7f5d3SJohn Marino 	return (*cpp == NULL ? false : true);				\
218*86d7f5d3SJohn Marino }									\
219*86d7f5d3SJohn Marino 									\
220*86d7f5d3SJohn Marino bool									\
221*86d7f5d3SJohn Marino prop_array_set_cstring ## variant (prop_array_t array,			\
222*86d7f5d3SJohn Marino 					unsigned int indx,		\
223*86d7f5d3SJohn Marino 					const char *cp)			\
224*86d7f5d3SJohn Marino {									\
225*86d7f5d3SJohn Marino 	prop_string_t str;						\
226*86d7f5d3SJohn Marino 	int rv;								\
227*86d7f5d3SJohn Marino 									\
228*86d7f5d3SJohn Marino 	str = prop_string_create_cstring ## variant (cp);		\
229*86d7f5d3SJohn Marino 	if (str == NULL)						\
230*86d7f5d3SJohn Marino 		return (false);						\
231*86d7f5d3SJohn Marino 	rv = prop_array_set(array, indx, str);				\
232*86d7f5d3SJohn Marino 	prop_object_release(str);					\
233*86d7f5d3SJohn Marino 									\
234*86d7f5d3SJohn Marino 	return (rv);							\
235*86d7f5d3SJohn Marino }
236*86d7f5d3SJohn Marino 
237*86d7f5d3SJohn Marino TEMPLATE(,)
TEMPLATE(_nocopy,const)238*86d7f5d3SJohn Marino TEMPLATE(_nocopy,const)
239*86d7f5d3SJohn Marino 
240*86d7f5d3SJohn Marino #undef TEMPLATE
241*86d7f5d3SJohn Marino 
242*86d7f5d3SJohn Marino bool
243*86d7f5d3SJohn Marino prop_array_add_and_rel(prop_array_t array, prop_object_t po)
244*86d7f5d3SJohn Marino {
245*86d7f5d3SJohn Marino 	bool ret;
246*86d7f5d3SJohn Marino 	if (po == NULL)
247*86d7f5d3SJohn Marino 		return false;
248*86d7f5d3SJohn Marino 	ret = prop_array_add(array, po);
249*86d7f5d3SJohn Marino 	prop_object_release(po);
250*86d7f5d3SJohn Marino 	return ret;
251*86d7f5d3SJohn Marino }
252