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