diff options
| author | thorpej <thorpej@NetBSD.org> | 2020-06-06 21:25:59 +0000 |
|---|---|---|
| committer | thorpej <thorpej@NetBSD.org> | 2020-06-06 21:25:59 +0000 |
| commit | ca95539f7e401ecc6c3ad94f5abfe41dda98026e (patch) | |
| tree | e6aab6ce366dc8c164c0674fbd38b2d48960c29c /common/lib/libprop/prop_array_util.c | |
| parent | a3eff718210e1e35691bf2ecdb20b551dea312a3 (diff) | |
Improvements to the problib(3) API:
==> Provide a much more complete set of setters and getters for different
value types in the prop_array_util(3) and prop_dictionary_util(3)
functions.
==> Overhaul the prop_data(3), prop_number(3), and prop_string(3) APIs
to be easier to use and less awkwardly named, Deprecate the old
awkward names, and produce link-time warnings when they are referenced.
==> Deprecate mutable prop_data(3) and prop_string(3) objects. The old
APIs that support them still exist, but will now produce link-time
warnings when used.
==> When the new prop_string(3) API is used, strings are internally
de-duplicated as a memory footprint optimization.
==> Provide a rich set of bounds-checked gettter functions in and a
corresponding set of convenience setters in the prop_number(3) API.
==> Add a new prop_bool_value(3) function that is equivalent to
prop_bool_true(3), but aligned with the new "value" routines in
prop_data(3), prop_string(3), and prop_number(3).
Diffstat (limited to 'common/lib/libprop/prop_array_util.c')
| -rw-r--r-- | common/lib/libprop/prop_array_util.c | 469 |
1 files changed, 288 insertions, 181 deletions
diff --git a/common/lib/libprop/prop_array_util.c b/common/lib/libprop/prop_array_util.c index b60c808d997..12d8a1ffcdc 100644 --- a/common/lib/libprop/prop_array_util.c +++ b/common/lib/libprop/prop_array_util.c @@ -1,7 +1,7 @@ -/* $NetBSD: prop_array_util.c,v 1.5 2016/05/31 09:29:25 pgoyette Exp $ */ +/* $NetBSD: prop_array_util.c,v 1.6 2020/06/06 21:25:59 thorpej Exp $ */ /*- - * Copyright (c) 2006 The NetBSD Foundation, Inc. + * Copyright (c) 2006, 2020 The NetBSD Foundation, Inc. * All rights reserved. * * This code is derived from software contributed to The NetBSD Foundation @@ -42,9 +42,7 @@ #include <prop/proplib.h> bool -prop_array_get_bool(prop_array_t array, - unsigned int indx, - bool *valp) +prop_array_get_bool(prop_array_t array, unsigned int indx, bool *valp) { prop_bool_t b; @@ -58,209 +56,318 @@ prop_array_get_bool(prop_array_t array, } bool -prop_array_set_bool(prop_array_t array, - unsigned int indx, - bool val) +prop_array_set_bool(prop_array_t array, unsigned int indx, bool val) { - prop_bool_t b; - int rv; - b = prop_bool_create(val); - if (b == NULL) - return (false); - rv = prop_array_set(array, indx, b); - prop_object_release(b); + return prop_array_set_and_rel(array, indx, prop_bool_create(val)); +} - return (rv); +bool +prop_array_add_bool(prop_array_t array, bool val) +{ + + return prop_array_add_and_rel(array, prop_bool_create(val)); } -#define TEMPLATE(size) \ -bool \ -prop_array_get_int ## size (prop_array_t array, \ - unsigned int indx, \ - int ## size ## _t *valp) \ -{ \ - prop_number_t num; \ - \ - num = prop_array_get(array, indx); \ - if (prop_object_type(num) != PROP_TYPE_NUMBER) \ - return (false); \ - \ - if (prop_number_unsigned(num) && \ - prop_number_unsigned_integer_value(num) > \ - /*CONSTCOND*/((size) == 8 ? INT8_MAX : \ - (size) == 16 ? INT16_MAX : \ - (size) == 32 ? INT32_MAX : INT64_MAX)) { \ - return (false); \ - } \ - \ - if (prop_number_size(num) > (size)) \ - return (false); \ - \ - *valp = (int ## size ## _t) prop_number_integer_value(num); \ - \ - return (true); \ -} \ - \ -bool \ -prop_array_get_uint ## size (prop_array_t array, \ - unsigned int indx, \ - uint ## size ## _t *valp) \ -{ \ - prop_number_t num; \ - \ - num = prop_array_get(array, indx); \ - if (prop_object_type(num) != PROP_TYPE_NUMBER) \ - return (false); \ - \ - if (prop_number_unsigned(num) == false && \ - prop_number_integer_value(num) < 0) { \ - return (false); \ - } \ - \ - if (prop_number_size(num) > (size)) \ - return (false); \ - \ - *valp = (uint ## size ## _t) \ - prop_number_unsigned_integer_value(num); \ - \ - return (true); \ -} \ - \ -bool \ - prop_array_set_int ## size (prop_array_t array, \ - unsigned int indx, \ - int ## size ## _t val) \ -{ \ - prop_number_t num; \ - int rv; \ - \ - num = prop_number_create_integer((int64_t) val); \ - if (num == NULL) \ - return (false); \ - rv = prop_array_set(array, indx, num); \ - prop_object_release(num); \ - \ - return (rv); \ -} \ - \ -bool \ -prop_array_set_uint ## size (prop_array_t array, \ - unsigned int indx, \ - uint ## size ## _t val) \ -{ \ - prop_number_t num; \ - int rv; \ - \ - num = prop_number_create_unsigned_integer((uint64_t) val); \ - if (num == NULL) \ - return (false); \ - rv = prop_array_set(array, indx, num); \ - prop_object_release(num); \ - \ - return (rv); \ -} \ - \ +#define TEMPLATE(name, typ) \ bool \ -prop_array_add_int ## size (prop_array_t array, \ - int ## size ## _t val) \ +prop_array_get_ ## name (prop_array_t array, \ + unsigned int indx, \ + typ *valp) \ { \ - prop_number_t num; \ - int rv; \ - \ - num = prop_number_create_integer((int64_t) val); \ - if (num == NULL) \ - return (false); \ - rv = prop_array_add(array, num); \ - prop_object_release(num); \ - \ - return (rv); \ -} \ - \ -bool \ -prop_array_add_uint ## size (prop_array_t array, \ - uint ## size ## _t val) \ -{ \ - prop_number_t num; \ - int rv; \ - \ - num = prop_number_create_integer((int64_t) val); \ - if (num == NULL) \ - return (false); \ - rv = prop_array_add(array, num); \ - prop_object_release(num); \ - \ - return (rv); \ + return prop_number_ ## name ## _value( \ + prop_array_get(array, indx), valp); \ } +TEMPLATE(schar, signed char) +TEMPLATE(short, short) +TEMPLATE(int, int) +TEMPLATE(long, long) +TEMPLATE(longlong, long long) +TEMPLATE(intptr, intptr_t) +TEMPLATE(int8, int8_t) +TEMPLATE(int16, int16_t) +TEMPLATE(int32, int32_t) +TEMPLATE(int64, int64_t) -TEMPLATE(8) -TEMPLATE(16) -TEMPLATE(32) -TEMPLATE(64) +TEMPLATE(uchar, unsigned char) +TEMPLATE(ushort, unsigned short) +TEMPLATE(uint, unsigned int) +TEMPLATE(ulong, unsigned long) +TEMPLATE(ulonglong, unsigned long long) +TEMPLATE(uintptr, uintptr_t) +TEMPLATE(uint8, uint8_t) +TEMPLATE(uint16, uint16_t) +TEMPLATE(uint32, uint32_t) +TEMPLATE(uint64, uint64_t) #undef TEMPLATE -#define TEMPLATE(variant, qualifier) \ +static bool +prop_array_set_signed_number(prop_array_t array, unsigned int indx, + intmax_t val) +{ + return prop_array_set_and_rel(array, indx, + prop_number_create_signed(val)); +} + +static bool +prop_array_add_signed_number(prop_array_t array, intmax_t val) +{ + return prop_array_add_and_rel(array, prop_number_create_signed(val)); +} + +static bool +prop_array_set_unsigned_number(prop_array_t array, unsigned int indx, + uintmax_t val) +{ + return prop_array_set_and_rel(array, indx, + prop_number_create_unsigned(val)); +} + +static bool +prop_array_add_unsigned_number(prop_array_t array, intmax_t val) +{ + return prop_array_add_and_rel(array, prop_number_create_unsigned(val)); +} + +#define TEMPLATE(name, which, typ) \ bool \ -prop_array_add_cstring ## variant (prop_array_t array, \ - const char *cp) \ +prop_array_set_ ## name (prop_array_t array, \ + unsigned int indx, \ + typ val) \ { \ - prop_string_t str; \ - bool rv; \ - \ - str = prop_string_create_cstring ## variant (cp); \ - if (str == NULL) \ - return false; \ - rv = prop_array_add(array, str); \ - prop_object_release(str); \ - return rv; \ -} \ - \ -bool \ -prop_array_get_cstring ## variant (prop_array_t array, \ - unsigned int indx, \ - qualifier char **cpp) \ -{ \ - prop_string_t str; \ - \ - str = prop_array_get(array, indx); \ - if (prop_object_type(str) != PROP_TYPE_STRING) \ - return (false); \ - \ - *cpp = prop_string_cstring ## variant (str); \ - \ - return (*cpp == NULL ? false : true); \ + return prop_array_set_ ## which ## _number(array, indx, val); \ } \ \ bool \ -prop_array_set_cstring ## variant (prop_array_t array, \ - unsigned int indx, \ - const char *cp) \ +prop_array_add_ ## name (prop_array_t array, \ + typ val) \ { \ - prop_string_t str; \ - int rv; \ - \ - str = prop_string_create_cstring ## variant (cp); \ - if (str == NULL) \ - return (false); \ - rv = prop_array_set(array, indx, str); \ - prop_object_release(str); \ - \ - return (rv); \ + return prop_array_add_ ## which ## _number(array, val); \ } -TEMPLATE(,) -TEMPLATE(_nocopy,const) +#define STEMPLATE(name, typ) TEMPLATE(name, signed, typ) +#define UTEMPLATE(name, typ) TEMPLATE(name, unsigned, typ) + +STEMPLATE(schar, signed char) +STEMPLATE(short, short) +STEMPLATE(int, int) +STEMPLATE(long, long) +STEMPLATE(longlong, long long) +STEMPLATE(intptr, intptr_t) +STEMPLATE(int8, int8_t) +STEMPLATE(int16, int16_t) +STEMPLATE(int32, int32_t) +STEMPLATE(int64, int64_t) +UTEMPLATE(uchar, unsigned char) +UTEMPLATE(ushort, unsigned short) +UTEMPLATE(uint, unsigned int) +UTEMPLATE(ulong, unsigned long) +UTEMPLATE(ulonglong, unsigned long long) +UTEMPLATE(uintptr, uintptr_t) +UTEMPLATE(uint8, uint8_t) +UTEMPLATE(uint16, uint16_t) +UTEMPLATE(uint32, uint32_t) +UTEMPLATE(uint64, uint64_t) + +#undef STEMPLATE +#undef UTEMPLATE #undef TEMPLATE bool +prop_array_get_string(prop_array_t array, unsigned int indx, const char **cpp) +{ + prop_string_t str; + const char *cp; + + str = prop_array_get(array, indx); + if (prop_object_type(str) != PROP_TYPE_STRING) + return (false); + + cp = prop_string_value(str); + if (cp == NULL) + return (false); + + *cpp = cp; + return (true); +} + +bool +prop_array_set_string(prop_array_t array, unsigned int indx, const char *cp) +{ + return prop_array_set_and_rel(array, indx, + prop_string_create_copy(cp)); +} + +bool +prop_array_add_string(prop_array_t array, const char *cp) +{ + return prop_array_add_and_rel(array, prop_string_create_copy(cp)); +} + +bool +prop_array_set_string_nocopy(prop_array_t array, unsigned int indx, + const char *cp) +{ + return prop_array_set_and_rel(array, indx, + prop_string_create_nocopy(cp)); +} + +bool +prop_array_add_string_nocopy(prop_array_t array, const char *cp) +{ + return prop_array_add_and_rel(array, prop_string_create_nocopy(cp)); +} + +bool +prop_array_get_data(prop_array_t array, unsigned int indx, const void **vp, + size_t *sizep) +{ + prop_data_t data; + const void *v; + + data = prop_array_get(array, indx); + if (prop_object_type(data) != PROP_TYPE_DATA) + return (false); + + v = prop_data_value(data); + if (v == NULL) + return (false); + + *vp = v; + if (sizep != NULL) + *sizep = prop_data_size(data); + return (true); +} + +bool +prop_array_set_data(prop_array_t array, unsigned int indx, const void *v, + size_t size) +{ + return prop_array_set_and_rel(array, indx, + prop_data_create_copy(v, size)); +} + +bool +prop_array_set_data_nocopy(prop_array_t array, unsigned int indx, const void *v, + size_t size) +{ + return prop_array_set_and_rel(array, indx, + prop_data_create_nocopy(v, size)); +} + +bool +prop_array_add_data(prop_array_t array, const void *v, size_t size) +{ + return prop_array_add_and_rel(array, + prop_data_create_copy(v, size)); +} + +bool +prop_array_add_data_nocopy(prop_array_t array, const void *v, size_t size) +{ + return prop_array_add_and_rel(array, + prop_data_create_nocopy(v, size)); +} + +_PROP_DEPRECATED(prop_array_get_cstring, + "this program uses prop_array_get_cstring(), " + "which is deprecated; use prop_array_get_string() and copy instead.") +bool +prop_array_get_cstring(prop_array_t array, unsigned int indx, char **cpp) +{ + prop_string_t str; + char *cp; + size_t len; + bool rv; + + str = prop_array_get(array, indx); + if (prop_object_type(str) != PROP_TYPE_STRING) + return (false); + + len = prop_string_size(str); + cp = _PROP_MALLOC(len + 1, M_TEMP); + if (cp == NULL) + return (false); + + rv = prop_string_copy_value(str, cp, len + 1); + if (rv) + *cpp = cp; + else + _PROP_FREE(cp, M_TEMP); + + return (rv); +} + +_PROP_DEPRECATED(prop_array_get_cstring_nocopy, + "this program uses prop_array_get_cstring_nocopy(), " + "which is deprecated; use prop_array_get_string() instead.") +bool +prop_array_get_cstring_nocopy(prop_array_t array, unsigned int indx, + const char **cpp) +{ + return prop_array_get_string(array, indx, cpp); +} + +_PROP_DEPRECATED(prop_array_set_cstring, + "this program uses prop_array_set_cstring(), " + "which is deprecated; use prop_array_set_string() instead.") +bool +prop_array_set_cstring(prop_array_t array, unsigned int indx, const char *cp) +{ + return prop_array_set_string(array, indx, cp); +} + +_PROP_DEPRECATED(prop_array_add_cstring, + "this program uses prop_array_add_cstring(), " + "which is deprecated; use prop_array_add_string() instead.") +bool +prop_array_add_cstring(prop_array_t array, const char *cp) +{ + return prop_array_add_string(array, cp); +} + +_PROP_DEPRECATED(prop_array_set_cstring_nocopy, + "this program uses prop_array_set_cstring_nocopy(), " + "which is deprecated; use prop_array_set_string_nocopy() instead.") +bool +prop_array_set_cstring_nocopy(prop_array_t array, unsigned int indx, + const char *cp) +{ + return prop_array_set_string_nocopy(array, indx, cp); +} + +_PROP_DEPRECATED(prop_array_add_cstring_nocopy, + "this program uses prop_array_add_cstring_nocopy(), " + "which is deprecated; use prop_array_add_string_nocopy() instead.") +bool +prop_array_add_cstring_nocopy(prop_array_t array, const char *cp) +{ + return prop_array_add_string_nocopy(array, cp); +} + +bool prop_array_add_and_rel(prop_array_t array, prop_object_t po) { - bool ret; + bool rv; + + if (po == NULL) + return false; + rv = prop_array_add(array, po); + prop_object_release(po); + return rv; +} + +bool +prop_array_set_and_rel(prop_array_t array, unsigned int indx, + prop_object_t po) +{ + bool rv; + if (po == NULL) return false; - ret = prop_array_add(array, po); + rv = prop_array_set(array, indx, po); prop_object_release(po); - return ret; + return rv; } |
