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