xref: /netbsd-src/common/lib/libprop/prop_array_util.c (revision d9210c2405d8caa2f8d10c6e40446d0d400e93db)
1*d9210c24Sbouyer /*	$NetBSD: prop_array_util.c,v 1.3 2011/03/24 17:05:39 bouyer Exp $	*/
29b09c481Shaad 
39b09c481Shaad /*-
49b09c481Shaad  * Copyright (c) 2006 The NetBSD Foundation, Inc.
59b09c481Shaad  * All rights reserved.
69b09c481Shaad  *
79b09c481Shaad  * This code is derived from software contributed to The NetBSD Foundation
89b09c481Shaad  * by Jason R. Thorpe.
99b09c481Shaad  *
109b09c481Shaad  * Redistribution and use in source and binary forms, with or without
119b09c481Shaad  * modification, are permitted provided that the following conditions
129b09c481Shaad  * are met:
139b09c481Shaad  * 1. Redistributions of source code must retain the above copyright
149b09c481Shaad  *    notice, this list of conditions and the following disclaimer.
159b09c481Shaad  * 2. Redistributions in binary form must reproduce the above copyright
169b09c481Shaad  *    notice, this list of conditions and the following disclaimer in the
179b09c481Shaad  *    documentation and/or other materials provided with the distribution.
189b09c481Shaad  *
199b09c481Shaad  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
209b09c481Shaad  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
219b09c481Shaad  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
229b09c481Shaad  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
239b09c481Shaad  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
249b09c481Shaad  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
259b09c481Shaad  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
269b09c481Shaad  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
279b09c481Shaad  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
289b09c481Shaad  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
299b09c481Shaad  * POSSIBILITY OF SUCH DAMAGE.
309b09c481Shaad  */
319b09c481Shaad 
329b09c481Shaad /*
339b09c481Shaad  * Utility routines to make it more convenient to work with values
349b09c481Shaad  * stored in array.
359b09c481Shaad  *
369b09c481Shaad  * Note: There is no special magic going on here.  We use the standard
379b09c481Shaad  * proplib(3) APIs to do all of this work.  Any application could do
389b09c481Shaad  * exactly what we're doing here.
399b09c481Shaad  */
409b09c481Shaad 
419b09c481Shaad #include <prop/proplib.h>
429b09c481Shaad #include "prop_object_impl.h" /* hide kernel vs. not-kernel vs. standalone */
439b09c481Shaad 
449b09c481Shaad bool
459b09c481Shaad prop_array_get_bool(prop_array_t array,
469b09c481Shaad 			 unsigned int indx,
479b09c481Shaad 			 bool *valp)
489b09c481Shaad {
499b09c481Shaad 	prop_bool_t b;
509b09c481Shaad 
519b09c481Shaad 	b = prop_array_get(array, indx);
529b09c481Shaad 	if (prop_object_type(b) != PROP_TYPE_BOOL)
539b09c481Shaad 		return (false);
549b09c481Shaad 
559b09c481Shaad 	*valp = prop_bool_true(b);
569b09c481Shaad 
579b09c481Shaad 	return (true);
589b09c481Shaad }
599b09c481Shaad 
609b09c481Shaad bool
619b09c481Shaad prop_array_set_bool(prop_array_t array,
629b09c481Shaad 			 unsigned int indx,
639b09c481Shaad 			 bool val)
649b09c481Shaad {
659b09c481Shaad 	prop_bool_t b;
669b09c481Shaad 	int rv;
679b09c481Shaad 
689b09c481Shaad 	b = prop_bool_create(val);
699b09c481Shaad 	if (b == NULL)
709b09c481Shaad 		return (false);
719b09c481Shaad 	rv = prop_array_set(array, indx, b);
729b09c481Shaad 	prop_object_release(b);
739b09c481Shaad 
749b09c481Shaad 	return (rv);
759b09c481Shaad }
769b09c481Shaad 
779b09c481Shaad #define	TEMPLATE(size)							\
789b09c481Shaad bool							                \
799b09c481Shaad prop_array_get_int ## size (prop_array_t array,				\
809b09c481Shaad 				 unsigned int indx,			\
819b09c481Shaad 				 int ## size ## _t *valp)		\
829b09c481Shaad {									\
839b09c481Shaad 	prop_number_t num;						\
849b09c481Shaad 									\
859b09c481Shaad 	num = prop_array_get(array, indx);				\
869b09c481Shaad 	if (prop_object_type(num) != PROP_TYPE_NUMBER)			\
879b09c481Shaad 		return (false);						\
889b09c481Shaad 									\
899b09c481Shaad 	if (prop_number_unsigned(num) &&				\
909b09c481Shaad 	    prop_number_unsigned_integer_value(num) >			\
919b09c481Shaad 	   /*CONSTCOND*/((size) ==  8 ?  INT8_MAX :			\
929b09c481Shaad 			 (size) == 16 ? INT16_MAX :			\
939b09c481Shaad 			 (size) == 32 ? INT32_MAX : INT64_MAX)) {	\
949b09c481Shaad 		return (false);						\
959b09c481Shaad 	}								\
969b09c481Shaad 									\
979b09c481Shaad 	if (prop_number_size(num) > (size))				\
989b09c481Shaad 		return (false);						\
999b09c481Shaad 									\
1009b09c481Shaad 	*valp = (int ## size ## _t) prop_number_integer_value(num);	\
1019b09c481Shaad 									\
1029b09c481Shaad 	return (true);							\
1039b09c481Shaad }									\
1049b09c481Shaad 									\
1059b09c481Shaad bool								        \
1069b09c481Shaad prop_array_get_uint ## size (prop_array_t array,		        \
1079b09c481Shaad 				  unsigned int indx,			\
1089b09c481Shaad 				  uint ## size ## _t *valp)		\
1099b09c481Shaad {									\
1109b09c481Shaad 	prop_number_t num;						\
1119b09c481Shaad 									\
1129b09c481Shaad 	num = prop_array_get(array, indx);				\
1139b09c481Shaad 	if (prop_object_type(num) != PROP_TYPE_NUMBER)			\
1149b09c481Shaad 		return (false);						\
1159b09c481Shaad 									\
1169b09c481Shaad 	if (prop_number_unsigned(num) == false &&			\
1179b09c481Shaad 	    prop_number_integer_value(num) < 0) {			\
1189b09c481Shaad 		return (false);						\
1199b09c481Shaad 	}								\
1209b09c481Shaad 									\
1219b09c481Shaad 	if (prop_number_size(num) > (size))				\
1229b09c481Shaad 		return (false);						\
1239b09c481Shaad 									\
1249b09c481Shaad 	*valp = (uint ## size ## _t)					\
1259b09c481Shaad 	    prop_number_unsigned_integer_value(num);			\
1269b09c481Shaad 									\
1279b09c481Shaad 	return (true);							\
1289b09c481Shaad }									\
1299b09c481Shaad 									\
1309b09c481Shaad bool									\
1319b09c481Shaad  prop_array_set_int ## size (prop_array_t array,			\
1329b09c481Shaad 				 unsigned int indx,			\
1339b09c481Shaad 				 int ## size ## _t val)			\
1349b09c481Shaad {									\
1359b09c481Shaad 	prop_number_t num;						\
1369b09c481Shaad 	int rv;								\
1379b09c481Shaad 									\
1389b09c481Shaad 	num = prop_number_create_integer((int64_t) val);		\
1399b09c481Shaad 	if (num == NULL)						\
1409b09c481Shaad 		return (false);						\
1419b09c481Shaad 	rv = prop_array_set(array, indx, num);				\
1429b09c481Shaad 	prop_object_release(num);					\
1439b09c481Shaad 									\
1449b09c481Shaad 	return (rv);							\
1459b09c481Shaad }									\
1469b09c481Shaad 									\
1479b09c481Shaad bool									\
1489b09c481Shaad prop_array_set_uint ## size (prop_array_t array,			\
1499b09c481Shaad 				  unsigned int indx,			\
1509b09c481Shaad 				  uint ## size ## _t val)		\
1519b09c481Shaad {									\
1529b09c481Shaad 	prop_number_t num;						\
1539b09c481Shaad 	int rv;								\
1549b09c481Shaad 									\
1559b09c481Shaad 	num = prop_number_create_unsigned_integer((uint64_t) val);	\
1569b09c481Shaad 	if (num == NULL)						\
1579b09c481Shaad 		return (false);						\
1589b09c481Shaad 	rv = prop_array_set(array, indx, num);				\
1599b09c481Shaad 	prop_object_release(num);					\
1609b09c481Shaad 									\
1619b09c481Shaad 	return (rv);							\
162185aec71Shaad }									\
163185aec71Shaad 									\
164185aec71Shaad bool									\
165185aec71Shaad prop_array_add_int ## size (prop_array_t array,				\
166185aec71Shaad 				 int ## size ## _t val)			\
167185aec71Shaad {									\
168185aec71Shaad 	prop_number_t num;						\
169185aec71Shaad 	int rv;								\
170185aec71Shaad 									\
171185aec71Shaad 	num = prop_number_create_integer((int64_t) val);		\
172185aec71Shaad 	if (num == NULL)						\
173185aec71Shaad 		return (false);						\
174185aec71Shaad 	rv = prop_array_add(array, num);				\
175185aec71Shaad 	prop_object_release(num);					\
176185aec71Shaad 									\
177185aec71Shaad 	return (rv);							\
178185aec71Shaad }									\
179185aec71Shaad 									\
180185aec71Shaad bool									\
181185aec71Shaad prop_array_add_uint ## size (prop_array_t array,			\
182185aec71Shaad 				  uint ## size ## _t val)		\
183185aec71Shaad {									\
184185aec71Shaad 	prop_number_t num;						\
185185aec71Shaad 	int rv;								\
186185aec71Shaad 									\
187185aec71Shaad 	num = prop_number_create_integer((int64_t) val);		\
188185aec71Shaad 	if (num == NULL)						\
189185aec71Shaad 		return (false);						\
190185aec71Shaad 	rv = prop_array_add(array, num);				\
191185aec71Shaad 	prop_object_release(num);					\
192185aec71Shaad 									\
193185aec71Shaad 	return (rv);							\
1949b09c481Shaad }
1959b09c481Shaad 
1969b09c481Shaad TEMPLATE(8)
1979b09c481Shaad TEMPLATE(16)
1989b09c481Shaad TEMPLATE(32)
1999b09c481Shaad TEMPLATE(64)
2009b09c481Shaad 
2019b09c481Shaad #undef TEMPLATE
2029b09c481Shaad 
2039b09c481Shaad #define	TEMPLATE(variant, qualifier)					\
2049b09c481Shaad bool								        \
2059b09c481Shaad prop_array_get_cstring ## variant (prop_array_t array,		        \
2069b09c481Shaad 					unsigned int indx,		\
2079b09c481Shaad 					qualifier char **cpp)		\
2089b09c481Shaad {									\
2099b09c481Shaad 	prop_string_t str;						\
2109b09c481Shaad 									\
2119b09c481Shaad 	str = prop_array_get(array, indx);				\
2129b09c481Shaad 	if (prop_object_type(str) != PROP_TYPE_STRING)			\
2139b09c481Shaad 		return (false);						\
2149b09c481Shaad 									\
2159b09c481Shaad 	*cpp = prop_string_cstring ## variant (str);			\
2169b09c481Shaad 									\
2179b09c481Shaad 	return (*cpp == NULL ? false : true);				\
2189b09c481Shaad }									\
2199b09c481Shaad 									\
2209b09c481Shaad bool									\
2219b09c481Shaad prop_array_set_cstring ## variant (prop_array_t array,			\
2229b09c481Shaad 					unsigned int indx,		\
2239b09c481Shaad 					const char *cp)			\
2249b09c481Shaad {									\
2259b09c481Shaad 	prop_string_t str;						\
2269b09c481Shaad 	int rv;								\
2279b09c481Shaad 									\
2289b09c481Shaad 	str = prop_string_create_cstring ## variant (cp);		\
2299b09c481Shaad 	if (str == NULL)						\
2309b09c481Shaad 		return (false);						\
2319b09c481Shaad 	rv = prop_array_set(array, indx, str);				\
2329b09c481Shaad 	prop_object_release(str);					\
2339b09c481Shaad 									\
2349b09c481Shaad 	return (rv);							\
2359b09c481Shaad }
2369b09c481Shaad 
2379b09c481Shaad TEMPLATE(,)
2389b09c481Shaad TEMPLATE(_nocopy,const)
2399b09c481Shaad 
2409b09c481Shaad #undef TEMPLATE
241*d9210c24Sbouyer 
242*d9210c24Sbouyer bool
243*d9210c24Sbouyer prop_array_add_and_rel(prop_array_t array, prop_object_t po)
244*d9210c24Sbouyer {
245*d9210c24Sbouyer 	bool ret;
246*d9210c24Sbouyer 	if (po == NULL)
247*d9210c24Sbouyer 		return false;
248*d9210c24Sbouyer 	ret = prop_array_add(array, po);
249*d9210c24Sbouyer 	prop_object_release(po);
250*d9210c24Sbouyer 	return ret;
251*d9210c24Sbouyer }
252