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