summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/pulsecore/modargs.c54
-rw-r--r--src/pulsecore/modargs.h2
2 files changed, 38 insertions, 18 deletions
diff --git a/src/pulsecore/modargs.c b/src/pulsecore/modargs.c
index b3c0313f3..bce5891db 100644
--- a/src/pulsecore/modargs.c
+++ b/src/pulsecore/modargs.c
@@ -43,7 +43,7 @@ struct entry {
char *key, *value;
};
-static int add_key_value(pa_modargs *ma, char *key, char *value, const char* const valid_keys[]) {
+static int add_key_value(pa_modargs *ma, char *key, char *value, const char* const valid_keys[], bool ignore_dupes) {
struct entry *e;
char *raw;
@@ -56,7 +56,11 @@ static int add_key_value(pa_modargs *ma, char *key, char *value, const char* con
if (pa_hashmap_get(ma->unescaped, key)) {
pa_xfree(key);
pa_xfree(value);
- return -1;
+
+ if (ignore_dupes)
+ return 0;
+ else
+ return -1;
}
if (valid_keys) {
@@ -100,7 +104,7 @@ static void free_func(void *p) {
pa_xfree(e);
}
-pa_modargs *pa_modargs_new(const char *args, const char* const* valid_keys) {
+static int parse(pa_modargs *ma, const char *args, const char* const* valid_keys, bool ignore_dupes) {
enum {
WHITESPACE,
KEY,
@@ -115,13 +119,6 @@ pa_modargs *pa_modargs_new(const char *args, const char* const* valid_keys) {
const char *p, *key = NULL, *value = NULL;
size_t key_len = 0, value_len = 0;
- pa_modargs *ma = pa_xnew(pa_modargs, 1);
-
- ma->raw = pa_hashmap_new_full(pa_idxset_string_hash_func, pa_idxset_string_compare_func, NULL, free_func);
- ma->unescaped = pa_hashmap_new_full(pa_idxset_string_hash_func, pa_idxset_string_compare_func, NULL, free_func);
-
- if (!args)
- return ma;
state = WHITESPACE;
@@ -160,7 +157,8 @@ pa_modargs *pa_modargs_new(const char *args, const char* const* valid_keys) {
if (add_key_value(ma,
pa_xstrndup(key, key_len),
pa_xstrdup(""),
- valid_keys) < 0)
+ valid_keys,
+ ignore_dupes) < 0)
goto fail;
state = WHITESPACE;
} else if (*p == '\\') {
@@ -179,7 +177,8 @@ pa_modargs *pa_modargs_new(const char *args, const char* const* valid_keys) {
if (add_key_value(ma,
pa_xstrndup(key, key_len),
pa_xstrndup(value, value_len),
- valid_keys) < 0)
+ valid_keys,
+ ignore_dupes) < 0)
goto fail;
state = WHITESPACE;
} else if (*p == '\\') {
@@ -199,7 +198,8 @@ pa_modargs *pa_modargs_new(const char *args, const char* const* valid_keys) {
if (add_key_value(ma,
pa_xstrndup(key, key_len),
pa_xstrndup(value, value_len),
- valid_keys) < 0)
+ valid_keys,
+ ignore_dupes) < 0)
goto fail;
state = WHITESPACE;
} else if (*p == '\\') {
@@ -219,7 +219,8 @@ pa_modargs *pa_modargs_new(const char *args, const char* const* valid_keys) {
if (add_key_value(ma,
pa_xstrndup(key, key_len),
pa_xstrndup(value, value_len),
- valid_keys) < 0)
+ valid_keys,
+ ignore_dupes) < 0)
goto fail;
state = WHITESPACE;
} else if (*p == '\\') {
@@ -237,23 +238,40 @@ pa_modargs *pa_modargs_new(const char *args, const char* const* valid_keys) {
}
if (state == VALUE_START) {
- if (add_key_value(ma, pa_xstrndup(key, key_len), pa_xstrdup(""), valid_keys) < 0)
+ if (add_key_value(ma, pa_xstrndup(key, key_len), pa_xstrdup(""), valid_keys, ignore_dupes) < 0)
goto fail;
} else if (state == VALUE_SIMPLE) {
- if (add_key_value(ma, pa_xstrndup(key, key_len), pa_xstrdup(value), valid_keys) < 0)
+ if (add_key_value(ma, pa_xstrndup(key, key_len), pa_xstrdup(value), valid_keys, ignore_dupes) < 0)
goto fail;
} else if (state != WHITESPACE)
goto fail;
- return ma;
+ return 0;
fail:
+ return -1;
+}
- pa_modargs_free(ma);
+pa_modargs *pa_modargs_new(const char *args, const char* const* valid_keys) {
+ pa_modargs *ma = pa_xnew(pa_modargs, 1);
+
+ ma->raw = pa_hashmap_new_full(pa_idxset_string_hash_func, pa_idxset_string_compare_func, NULL, free_func);
+ ma->unescaped = pa_hashmap_new_full(pa_idxset_string_hash_func, pa_idxset_string_compare_func, NULL, free_func);
+
+ if (args && parse(ma, args, valid_keys, false) < 0)
+ goto fail;
+ return ma;
+
+fail:
+ pa_modargs_free(ma);
return NULL;
}
+int pa_modargs_append(pa_modargs *ma, const char *args, const char* const* valid_keys) {
+ return parse(ma, args, valid_keys, true);
+}
+
void pa_modargs_free(pa_modargs*ma) {
pa_assert(ma);
diff --git a/src/pulsecore/modargs.h b/src/pulsecore/modargs.h
index 776a1e6fb..50cf6c5d9 100644
--- a/src/pulsecore/modargs.h
+++ b/src/pulsecore/modargs.h
@@ -34,6 +34,8 @@ typedef struct pa_modargs pa_modargs;
/* Parse the string args. The NULL-terminated array keys contains all valid arguments. */
pa_modargs *pa_modargs_new(const char *args, const char* const keys[]);
+/* Parse the string args, and add any keys that are not already present. */
+int pa_modargs_append(pa_modargs *ma, const char *args, const char* const* valid_keys);
void pa_modargs_free(pa_modargs*ma);
/* Return the module argument for the specified name as a string. If