From 49cbc8df7672c4dd5fa0c73e9046ee91924ae4b8 Mon Sep 17 00:00:00 2001 From: Nikias Bassen Date: Thu, 7 Nov 2019 04:54:45 +0100 Subject: Add plist_get_data_ptr() and plist_get_string_ptr() to the interface --- include/plist/plist.h | 26 ++++++++++++++++++++++++++ src/plist.c | 25 +++++++++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/include/plist/plist.h b/include/plist/plist.h index 824ba43..29b1fce 100644 --- a/include/plist/plist.h +++ b/include/plist/plist.h @@ -462,6 +462,19 @@ extern "C" */ void plist_get_string_val(plist_t node, char **val); + /** + * Get a pointer to the buffer of a #PLIST_STRING node. + * + * @note DO NOT MODIFY the buffer. Mind that the buffer is only available + * until the plist node gets freed. Make a copy if needed. + * + * @param node The node + * @param length If non-NULL, will be set to the length of the string + * + * @return Pointer to the NULL-terminated buffer. + */ + const char* plist_get_string_ptr(plist_t node, uint64_t* length); + /** * Get the value of a #PLIST_BOOLEAN node. * This function does nothing if node is not of type #PLIST_BOOLEAN @@ -500,6 +513,19 @@ extern "C" */ void plist_get_data_val(plist_t node, char **val, uint64_t * length); + /** + * Get a pointer to the data buffer of a #PLIST_DATA node. + * + * @note DO NOT MODIFY the buffer. Mind that the buffer is only available + * until the plist node gets freed. Make a copy if needed. + * + * @param node The node + * @param length Pointer to a uint64_t that will be set to the length of the buffer + * + * @return Pointer to the buffer + */ + const char* plist_get_data_ptr(plist_t node, uint64_t* length); + /** * Get the value of a #PLIST_DATE node. * This function does nothing if node is not of type #PLIST_DATE diff --git a/src/plist.c b/src/plist.c index eb0160c..87be488 100644 --- a/src/plist.c +++ b/src/plist.c @@ -868,6 +868,19 @@ PLIST_API void plist_get_string_val(plist_t node, char **val) assert(length == strlen(*val)); } +PLIST_API const char* plist_get_string_ptr(plist_t node, uint64_t* length) +{ + if (!node) + return NULL; + plist_type type = plist_get_node_type(node); + if (PLIST_STRING != type) + return NULL; + plist_data_t data = plist_get_data(node); + if (length) + *length = data->length; + return (const char*)data->strval; +} + PLIST_API void plist_get_bool_val(plist_t node, uint8_t * val) { if (!node || !val) @@ -926,6 +939,18 @@ PLIST_API void plist_get_data_val(plist_t node, char **val, uint64_t * length) plist_get_type_and_value(node, &type, (void *) val, length); } +PLIST_API const char* plist_get_data_ptr(plist_t node, uint64_t* length) +{ + if (!node || !length) + return NULL; + plist_type type = plist_get_node_type(node); + if (PLIST_DATA != type) + return NULL; + plist_data_t data = plist_get_data(node); + *length = data->length; + return (const char*)data->buff; +} + PLIST_API void plist_get_date_val(plist_t node, int32_t * sec, int32_t * usec) { if (!node) -- cgit v1.1-32-gdbae