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