/*! \brief Integer vector definition */
AST_VECTOR(ast_vector_int, int);
-/*! \brief String vector definition */
+/*! \brief String vector definitions */
AST_VECTOR(ast_vector_string, char *);
+AST_VECTOR(ast_vector_const_string, const char *);
+
+/*! Options to override default processing of ast_vector_string_split. */
+enum ast_vector_string_split_flags {
+ /*! Do not trim whitespace from values. */
+ AST_VECTOR_STRING_SPLIT_NO_TRIM = 0x01,
+ /*! Append empty strings to the vector. */
+ AST_VECTOR_STRING_SPLIT_ALLOW_EMPTY = 0x02,
+};
+
+/*!
+ * \brief Append a string vector by splitting a string.
+ *
+ * \param dest Pointer to an initialized vector.
+ * \param input String buffer to split.
+ * \param delim String delimeter passed to strsep.
+ * \param flags Processing options defined by \ref enum ast_vector_string_split_flags.
+ * \param excludes_cmp NULL or a function like strcmp to exclude duplicate strings.
+ *
+ * \retval 0 Success
+ * \retval -1 Failure
+ *
+ * \note All elements added to the vector are allocated. The caller is always
+ * responsible for calling ast_free on each element in the vector even
+ * after failure. It's possible for this function to successfully add
+ * some elements before failing.
+ */
+int ast_vector_string_split(struct ast_vector_string *dest,
+ const char *input, const char *delim, int flags,
+ int (*excludes_cmp)(const char *s1, const char *s2));
/*!
* \brief Define a vector structure with a read/write lock
#include <regex.h>
#include "asterisk/strings.h"
#include "asterisk/pbx.h"
+#include "asterisk/vector.h"
/*!
* core handler for dynamic strings.
return start;
}
+
+int ast_vector_string_split(struct ast_vector_string *dest,
+ const char *input, const char *delim, int flags,
+ int (*excludes_cmp)(const char *s1, const char *s2))
+{
+ char *buf;
+ char *cur;
+ int no_trim = flags & AST_VECTOR_STRING_SPLIT_NO_TRIM;
+ int allow_empty = flags & AST_VECTOR_STRING_SPLIT_ALLOW_EMPTY;
+
+ ast_assert(dest != NULL);
+ ast_assert(!ast_strlen_zero(delim));
+
+ if (ast_strlen_zero(input)) {
+ return 0;
+ }
+
+ buf = ast_strdupa(input);
+ while ((cur = strsep(&buf, delim))) {
+ if (!no_trim) {
+ cur = ast_strip(cur);
+ }
+
+ if (!allow_empty && ast_strlen_zero(cur)) {
+ continue;
+ }
+
+ if (excludes_cmp && AST_VECTOR_GET_CMP(dest, cur, !excludes_cmp)) {
+ continue;
+ }
+
+ cur = ast_strdup(cur);
+ if (!cur || AST_VECTOR_APPEND(dest, cur)) {
+ ast_free(cur);
+
+ return -1;
+ }
+ }
+
+ return 0;
+}