mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-11-03 09:01:50 -05:00
rearrange a few things
This commit is contained in:
parent
d6dd907cc8
commit
078a8d583f
1 changed files with 91 additions and 86 deletions
|
|
@ -79,106 +79,111 @@ static int add_key_value(pa_hashmap *map, char *key, char *value, const char* co
|
||||||
}
|
}
|
||||||
|
|
||||||
pa_modargs *pa_modargs_new(const char *args, const char* const* valid_keys) {
|
pa_modargs *pa_modargs_new(const char *args, const char* const* valid_keys) {
|
||||||
pa_hashmap *map = NULL;
|
enum {
|
||||||
|
WHITESPACE,
|
||||||
|
KEY,
|
||||||
|
VALUE_START,
|
||||||
|
VALUE_SIMPLE,
|
||||||
|
VALUE_DOUBLE_QUOTES,
|
||||||
|
VALUE_TICKS
|
||||||
|
} state;
|
||||||
|
|
||||||
|
const char *p, *key = NULL, *value = NULL;
|
||||||
|
size_t key_len = 0, value_len = 0;
|
||||||
|
pa_hashmap *map;
|
||||||
|
|
||||||
map = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func);
|
map = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func);
|
||||||
|
|
||||||
if (args) {
|
if (!args)
|
||||||
enum {
|
return (pa_modargs*) map;
|
||||||
WHITESPACE,
|
|
||||||
KEY,
|
|
||||||
VALUE_START,
|
|
||||||
VALUE_SIMPLE,
|
|
||||||
VALUE_DOUBLE_QUOTES,
|
|
||||||
VALUE_TICKS
|
|
||||||
} state;
|
|
||||||
|
|
||||||
const char *p, *key, *value;
|
state = WHITESPACE;
|
||||||
size_t key_len = 0, value_len = 0;
|
|
||||||
|
|
||||||
key = value = NULL;
|
for (p = args; *p; p++) {
|
||||||
state = WHITESPACE;
|
switch (state) {
|
||||||
for (p = args; *p; p++) {
|
|
||||||
switch (state) {
|
case WHITESPACE:
|
||||||
case WHITESPACE:
|
if (*p == '=')
|
||||||
if (*p == '=')
|
goto fail;
|
||||||
|
else if (!isspace(*p)) {
|
||||||
|
key = p;
|
||||||
|
state = KEY;
|
||||||
|
key_len = 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case KEY:
|
||||||
|
if (*p == '=')
|
||||||
|
state = VALUE_START;
|
||||||
|
else if (isspace(*p))
|
||||||
|
goto fail;
|
||||||
|
else
|
||||||
|
key_len++;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VALUE_START:
|
||||||
|
if (*p == '\'') {
|
||||||
|
state = VALUE_TICKS;
|
||||||
|
value = p+1;
|
||||||
|
value_len = 0;
|
||||||
|
} else if (*p == '"') {
|
||||||
|
state = VALUE_DOUBLE_QUOTES;
|
||||||
|
value = p+1;
|
||||||
|
value_len = 0;
|
||||||
|
} else if (isspace(*p)) {
|
||||||
|
if (add_key_value(map, pa_xstrndup(key, key_len), pa_xstrdup(""), valid_keys) < 0)
|
||||||
goto fail;
|
goto fail;
|
||||||
else if (!isspace(*p)) {
|
state = WHITESPACE;
|
||||||
key = p;
|
} else {
|
||||||
state = KEY;
|
state = VALUE_SIMPLE;
|
||||||
key_len = 1;
|
value = p;
|
||||||
}
|
value_len = 1;
|
||||||
break;
|
}
|
||||||
case KEY:
|
break;
|
||||||
if (*p == '=')
|
|
||||||
state = VALUE_START;
|
case VALUE_SIMPLE:
|
||||||
else if (isspace(*p))
|
if (isspace(*p)) {
|
||||||
|
if (add_key_value(map, pa_xstrndup(key, key_len), pa_xstrndup(value, value_len), valid_keys) < 0)
|
||||||
goto fail;
|
goto fail;
|
||||||
else
|
state = WHITESPACE;
|
||||||
key_len++;
|
} else
|
||||||
break;
|
value_len++;
|
||||||
case VALUE_START:
|
break;
|
||||||
if (*p == '\'') {
|
|
||||||
state = VALUE_TICKS;
|
case VALUE_DOUBLE_QUOTES:
|
||||||
value = p+1;
|
if (*p == '"') {
|
||||||
value_len = 0;
|
if (add_key_value(map, pa_xstrndup(key, key_len), pa_xstrndup(value, value_len), valid_keys) < 0)
|
||||||
} else if (*p == '"') {
|
goto fail;
|
||||||
state = VALUE_DOUBLE_QUOTES;
|
state = WHITESPACE;
|
||||||
value = p+1;
|
} else
|
||||||
value_len = 0;
|
value_len++;
|
||||||
} else if (isspace(*p)) {
|
break;
|
||||||
if (add_key_value(map, pa_xstrndup(key, key_len), pa_xstrdup(""), valid_keys) < 0)
|
|
||||||
goto fail;
|
case VALUE_TICKS:
|
||||||
state = WHITESPACE;
|
if (*p == '\'') {
|
||||||
} else {
|
if (add_key_value(map, pa_xstrndup(key, key_len), pa_xstrndup(value, value_len), valid_keys) < 0)
|
||||||
state = VALUE_SIMPLE;
|
goto fail;
|
||||||
value = p;
|
state = WHITESPACE;
|
||||||
value_len = 1;
|
} else
|
||||||
}
|
value_len++;
|
||||||
break;
|
break;
|
||||||
case VALUE_SIMPLE:
|
|
||||||
if (isspace(*p)) {
|
|
||||||
if (add_key_value(map, pa_xstrndup(key, key_len), pa_xstrndup(value, value_len), valid_keys) < 0)
|
|
||||||
goto fail;
|
|
||||||
state = WHITESPACE;
|
|
||||||
} else
|
|
||||||
value_len++;
|
|
||||||
break;
|
|
||||||
case VALUE_DOUBLE_QUOTES:
|
|
||||||
if (*p == '"') {
|
|
||||||
if (add_key_value(map, pa_xstrndup(key, key_len), pa_xstrndup(value, value_len), valid_keys) < 0)
|
|
||||||
goto fail;
|
|
||||||
state = WHITESPACE;
|
|
||||||
} else
|
|
||||||
value_len++;
|
|
||||||
break;
|
|
||||||
case VALUE_TICKS:
|
|
||||||
if (*p == '\'') {
|
|
||||||
if (add_key_value(map, pa_xstrndup(key, key_len), pa_xstrndup(value, value_len), valid_keys) < 0)
|
|
||||||
goto fail;
|
|
||||||
state = WHITESPACE;
|
|
||||||
} else
|
|
||||||
value_len++;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (state == VALUE_START) {
|
|
||||||
if (add_key_value(map, pa_xstrndup(key, key_len), pa_xstrdup(""), valid_keys) < 0)
|
|
||||||
goto fail;
|
|
||||||
} else if (state == VALUE_SIMPLE) {
|
|
||||||
if (add_key_value(map, pa_xstrndup(key, key_len), pa_xstrdup(value), valid_keys) < 0)
|
|
||||||
goto fail;
|
|
||||||
} else if (state != WHITESPACE)
|
|
||||||
goto fail;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (state == VALUE_START) {
|
||||||
|
if (add_key_value(map, pa_xstrndup(key, key_len), pa_xstrdup(""), valid_keys) < 0)
|
||||||
|
goto fail;
|
||||||
|
} else if (state == VALUE_SIMPLE) {
|
||||||
|
if (add_key_value(map, pa_xstrndup(key, key_len), pa_xstrdup(value), valid_keys) < 0)
|
||||||
|
goto fail;
|
||||||
|
} else if (state != WHITESPACE)
|
||||||
|
goto fail;
|
||||||
|
|
||||||
return (pa_modargs*) map;
|
return (pa_modargs*) map;
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
|
|
||||||
if (map)
|
pa_modargs_free((pa_modargs*) map);
|
||||||
pa_modargs_free((pa_modargs*) map);
|
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue