The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/libprop/prop_dictionary_util.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*      $NetBSD: prop_dictionary_util.c,v 1.3 2008/04/28 20:22:53 martin 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 <libprop/proplib.h>
   42 #include "prop_object_impl.h"   /* only to hide kernel vs. not-kernel */
   43 
   44 bool
   45 prop_dictionary_get_dict(prop_dictionary_t dict, const char *key, prop_dictionary_t *dp)
   46 {
   47         prop_object_t o;
   48         o = prop_dictionary_get(dict, key);
   49         if (o == NULL || prop_object_type(o) != PROP_TYPE_DICTIONARY)
   50                 return false;
   51         *dp = o;
   52         return true;
   53 
   54 }
   55 
   56 bool
   57 prop_dictionary_get_bool(prop_dictionary_t dict,
   58                          const char *key,
   59                          bool *valp)
   60 {
   61         prop_bool_t b;
   62 
   63         b = prop_dictionary_get(dict, key);
   64         if (prop_object_type(b) != PROP_TYPE_BOOL)
   65                 return (false);
   66         
   67         *valp = prop_bool_true(b);
   68 
   69         return (true);
   70 }
   71 
   72 bool
   73 prop_dictionary_set_bool(prop_dictionary_t dict,
   74                          const char *key,
   75                          bool val)
   76 {
   77         prop_bool_t b;
   78         int rv;
   79 
   80         b = prop_bool_create(val);
   81         if (b == NULL)
   82                 return (false);
   83         rv = prop_dictionary_set(dict, key, b);
   84         prop_object_release(b);
   85 
   86         return (rv);
   87 }
   88 
   89 #define TEMPLATE(size)                                                  \
   90 bool                                                            \
   91 prop_dictionary_get_int ## size (prop_dictionary_t dict,                \
   92                                  const char *key,                       \
   93                                  int ## size ## _t *valp)               \
   94 {                                                                       \
   95         prop_number_t num;                                              \
   96                                                                         \
   97         num = prop_dictionary_get(dict, key);                           \
   98         if (prop_object_type(num) != PROP_TYPE_NUMBER)                  \
   99                 return (false);                                         \
  100                                                                         \
  101         if (prop_number_unsigned(num) &&                                \
  102             prop_number_unsigned_integer_value(num) >                   \
  103            /*CONSTCOND*/((size) ==  8 ?  INT8_MAX :                     \
  104                          (size) == 16 ? INT16_MAX :                     \
  105                          (size) == 32 ? INT32_MAX : INT64_MAX)) {       \
  106                 return (false);                                         \
  107         }                                                               \
  108                                                                         \
  109         if (prop_number_size(num) > (size))                             \
  110                 return (false);                                         \
  111                                                                         \
  112         *valp = (int ## size ## _t) prop_number_integer_value(num);     \
  113                                                                         \
  114         return (true);                                                  \
  115 }                                                                       \
  116                                                                         \
  117 bool                                                            \
  118 prop_dictionary_get_uint ## size (prop_dictionary_t dict,               \
  119                                   const char *key,                      \
  120                                   uint ## size ## _t *valp)             \
  121 {                                                                       \
  122         prop_number_t num;                                              \
  123                                                                         \
  124         num = prop_dictionary_get(dict, key);                           \
  125         if (prop_object_type(num) != PROP_TYPE_NUMBER)                  \
  126                 return (false);                                         \
  127                                                                         \
  128         if (prop_number_unsigned(num) == false &&                       \
  129             prop_number_integer_value(num) < 0) {                       \
  130                 return (false);                                         \
  131         }                                                               \
  132                                                                         \
  133         if (prop_number_size(num) > (size))                             \
  134                 return (false);                                         \
  135                                                                         \
  136         *valp = (uint ## size ## _t)                                    \
  137             prop_number_unsigned_integer_value(num);                    \
  138                                                                         \
  139         return (true);                                                  \
  140 }                                                                       \
  141                                                                         \
  142 bool                                                            \
  143 prop_dictionary_set_int ## size (prop_dictionary_t dict,                \
  144                                  const char *key,                       \
  145                                  int ## size ## _t val)                 \
  146 {                                                                       \
  147         prop_number_t num;                                              \
  148         int rv;                                                         \
  149                                                                         \
  150         num = prop_number_create_integer((int64_t) val);                \
  151         if (num == NULL)                                                \
  152                 return (false);                                         \
  153         rv = prop_dictionary_set(dict, key, num);                       \
  154         prop_object_release(num);                                       \
  155                                                                         \
  156         return (rv);                                                    \
  157 }                                                                       \
  158                                                                         \
  159 bool                                                            \
  160 prop_dictionary_set_uint ## size (prop_dictionary_t dict,               \
  161                                   const char *key,                      \
  162                                   uint ## size ## _t val)               \
  163 {                                                                       \
  164         prop_number_t num;                                              \
  165         int rv;                                                         \
  166                                                                         \
  167         num = prop_number_create_unsigned_integer((uint64_t) val);      \
  168         if (num == NULL)                                                \
  169                 return (false);                                         \
  170         rv = prop_dictionary_set(dict, key, num);                       \
  171         prop_object_release(num);                                       \
  172                                                                         \
  173         return (rv);                                                    \
  174 }
  175 
  176 TEMPLATE(8)
  177 TEMPLATE(16)
  178 TEMPLATE(32)
  179 TEMPLATE(64)
  180 
  181 #undef TEMPLATE
  182 
  183 #define TEMPLATE(variant, qualifier)                                    \
  184 bool                                                            \
  185 prop_dictionary_get_cstring ## variant (prop_dictionary_t dict,         \
  186                                         const char *key,                \
  187                                         qualifier char **cpp)           \
  188 {                                                                       \
  189         prop_string_t str;                                              \
  190                                                                         \
  191         str = prop_dictionary_get(dict, key);                           \
  192         if (prop_object_type(str) != PROP_TYPE_STRING)                  \
  193                 return (false);                                         \
  194                                                                         \
  195         *cpp = prop_string_cstring ## variant (str);                    \
  196                                                                         \
  197         return (*cpp == NULL ? false : true);                           \
  198 }                                                                       \
  199                                                                         \
  200 bool                                                            \
  201 prop_dictionary_set_cstring ## variant (prop_dictionary_t dict,         \
  202                                         const char *key,                \
  203                                         const char *cp)                 \
  204 {                                                                       \
  205         prop_string_t str;                                              \
  206         int rv;                                                         \
  207                                                                         \
  208         str = prop_string_create_cstring ## variant (cp);               \
  209         if (str == NULL)                                                \
  210                 return (false);                                         \
  211         rv = prop_dictionary_set(dict, key, str);                       \
  212         prop_object_release(str);                                       \
  213                                                                         \
  214         return (rv);                                                    \
  215 }
  216 
  217 TEMPLATE(,)
  218 TEMPLATE(_nocopy,const)
  219 
  220 #undef TEMPLATE
  221 
  222 bool
  223 prop_dictionary_set_and_rel(prop_dictionary_t dict, const char *key,
  224     prop_object_t po)
  225 {
  226         bool ret;
  227         if (po == NULL)
  228                 return false;
  229         ret = prop_dictionary_set(dict, key, po);
  230         prop_object_release(po);
  231         return ret;
  232 }

Cache object: e754d55f66f79357917b56e654f3ca69


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.