diff options
author | David Robillard <d@drobilla.net> | 2016-07-30 19:04:39 -0400 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2016-07-31 15:19:30 -0400 |
commit | 7f0ebf206c3654e66b1ad40450d54253f7bfd17f (patch) | |
tree | aaa79617c2f51ec5b1e514fd9a9698992650e8cf /lv2/lv2plug.in/ns/lv2core/lv2_util.h | |
parent | 7a5037a1508e3b84b2f742cda09a044451705d25 (diff) | |
download | lv2-7f0ebf206c3654e66b1ad40450d54253f7bfd17f.tar.xz |
Add lv2_features_data() and lv2_features_query()
This adds a new header lv2/lv2plug.in/ns/lv2core/lv2_util.h for utility
functions useful with core LV2.
Diffstat (limited to 'lv2/lv2plug.in/ns/lv2core/lv2_util.h')
-rw-r--r-- | lv2/lv2plug.in/ns/lv2core/lv2_util.h | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/lv2/lv2plug.in/ns/lv2core/lv2_util.h b/lv2/lv2plug.in/ns/lv2core/lv2_util.h new file mode 100644 index 0000000..038b5a6 --- /dev/null +++ b/lv2/lv2plug.in/ns/lv2core/lv2_util.h @@ -0,0 +1,101 @@ +/* + Copyright 2016 David Robillard <http://drobilla.net> + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +/** + @defgroup util Utilities + @ingroup lv2core + @{ +*/ + +#include <string.h> + +#include "lv2/lv2plug.in/ns/lv2core/lv2.h" + +#ifdef __cplusplus +extern "C" { +#else +# include <stdbool.h> +#endif + +/** + Return the data for a feature in a features array. + + If the feature is not found, NULL is returned. Note that this function is + only useful for features with data, and can not detect features that are + present but have NULL data. +*/ +static inline void* +lv2_features_data(const LV2_Feature*const* features, + const char* const uri) +{ + for (const LV2_Feature*const* f = features; *f; ++f) { + if (!strcmp(uri, (*f)->URI)) { + return (*f)->data; + } + } + return NULL; +} + +/** + Query a features array. + + This function allows getting several features in one call, and detect + missing required features, with the same caveat of lv2_features_data(). + + The arguments should be a series of const char* uri, void** data, bool + required, terminated by a NULL URI. The data pointers MUST be initialized + to NULL. For example: + + @code + LV2_URID_Log* log = NULL; + LV2_URID_Map* map = NULL; + const char* missing = lv2_features_query( + features, + LV2_LOG__log, &log, false, + LV2_URID__map, &map, true, + NULL); + @endcode + + @return NULL on success, otherwise the URI of this missing feature. +*/ +static inline const char* +lv2_features_query(const LV2_Feature* const* features, ...) +{ + va_list args; + va_start(args, features); + + const char* uri = NULL; + while ((uri = va_arg(args, const char*))) { + void** data = va_arg(args, void**); + bool required = va_arg(args, int); + + *data = lv2_features_data(features, uri); + if (required && !*data) { + return uri; + } + } + + return NULL; +} + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +/** + @} + @} +*/ |