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