summaryrefslogtreecommitdiff
path: root/common/lib/libprop/prop_array_util.c
diff options
context:
space:
mode:
authorthorpej <thorpej@NetBSD.org>2020-06-06 21:25:59 +0000
committerthorpej <thorpej@NetBSD.org>2020-06-06 21:25:59 +0000
commitca95539f7e401ecc6c3ad94f5abfe41dda98026e (patch)
treee6aab6ce366dc8c164c0674fbd38b2d48960c29c /common/lib/libprop/prop_array_util.c
parenta3eff718210e1e35691bf2ecdb20b551dea312a3 (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.c469
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;
}