mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-11-04 13:29:59 -05:00
libpulse: add proplist_from_string
This commit is contained in:
parent
9e978c9770
commit
01f71ac7a1
4 changed files with 99 additions and 3 deletions
|
|
@ -156,6 +156,7 @@ pa_proplist_set;
|
||||||
pa_proplist_setf;
|
pa_proplist_setf;
|
||||||
pa_proplist_sets;
|
pa_proplist_sets;
|
||||||
pa_proplist_to_string;
|
pa_proplist_to_string;
|
||||||
|
pa_proplist_from_string;
|
||||||
pa_proplist_unset;
|
pa_proplist_unset;
|
||||||
pa_proplist_unset_many;
|
pa_proplist_unset_many;
|
||||||
pa_proplist_update;
|
pa_proplist_update;
|
||||||
|
|
|
||||||
|
|
@ -291,6 +291,90 @@ char *pa_proplist_to_string(pa_proplist *p) {
|
||||||
return pa_strbuf_tostring_free(buf);
|
return pa_strbuf_tostring_free(buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Remove all whitepsapce from the beginning and the end of *s. *s may
|
||||||
|
* be modified. (from conf-parser.c) */
|
||||||
|
#define WHITESPACE " \t\n"
|
||||||
|
#define in_string(c,s) (strchr(s,c) != NULL)
|
||||||
|
|
||||||
|
static char *strip(char *s) {
|
||||||
|
char *b = s+strspn(s, WHITESPACE);
|
||||||
|
char *e, *l = NULL;
|
||||||
|
|
||||||
|
for (e = b; *e; e++)
|
||||||
|
if (!in_string(*e, WHITESPACE))
|
||||||
|
l = e;
|
||||||
|
|
||||||
|
if (l)
|
||||||
|
*(l+1) = 0;
|
||||||
|
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
|
||||||
|
pa_proplist *pa_proplist_from_string(const char *str) {
|
||||||
|
pa_proplist *p;
|
||||||
|
char *s, *v, *k, *e;
|
||||||
|
|
||||||
|
pa_assert(str);
|
||||||
|
pa_assert_se(p = pa_proplist_new());
|
||||||
|
pa_assert_se(s = strdup(str));
|
||||||
|
|
||||||
|
for (k = s; *k; k = e) {
|
||||||
|
k = k+strspn(k, WHITESPACE);
|
||||||
|
|
||||||
|
if (!*k)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (!(v = strchr(k, '='))) {
|
||||||
|
pa_log("Missing '='.");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
*v++ = '\0';
|
||||||
|
k = strip(k);
|
||||||
|
|
||||||
|
v = v+strspn(v, WHITESPACE);
|
||||||
|
if (*v == '"') {
|
||||||
|
v++;
|
||||||
|
if (!(e = strchr(v, '"'))) { /* FIXME: handle escape */
|
||||||
|
pa_log("Missing '\"' at end of string value.");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
*e++ = '\0';
|
||||||
|
pa_proplist_sets(p, k, v);
|
||||||
|
} else {
|
||||||
|
uint8_t *blob;
|
||||||
|
|
||||||
|
if (*v++ != 'h' || *v++ != 'e' || *v++ != 'x' || *v++ != ':') {
|
||||||
|
pa_log("Value must be a string or \"hex:\"");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
e = v;
|
||||||
|
while (in_string(*e, "0123456789abcdefABCDEF"))
|
||||||
|
++e;
|
||||||
|
|
||||||
|
if ((e - v) % 2) {
|
||||||
|
pa_log("Invalid \"hex:\" value data");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
blob = pa_xmalloc((size_t)(e-v)/2);
|
||||||
|
if (pa_parsehex(v, blob, (e-v)/2) != ((e-v)/2)) {
|
||||||
|
pa_log("Invalid \"hex:\" value data");
|
||||||
|
pa_xfree(blob);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
pa_proplist_set(p, k, blob, (e-v)/2);
|
||||||
|
pa_xfree(blob);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pa_xfree(s);
|
||||||
|
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
int pa_proplist_contains(pa_proplist *p, const char *key) {
|
int pa_proplist_contains(pa_proplist *p, const char *key) {
|
||||||
pa_assert(p);
|
pa_assert(p);
|
||||||
pa_assert(key);
|
pa_assert(key);
|
||||||
|
|
|
||||||
|
|
@ -213,6 +213,10 @@ const char *pa_proplist_iterate(pa_proplist *p, void **state);
|
||||||
* 0.9.11 */
|
* 0.9.11 */
|
||||||
char *pa_proplist_to_string(pa_proplist *p);
|
char *pa_proplist_to_string(pa_proplist *p);
|
||||||
|
|
||||||
|
/** Allocate a new property list and assign key/value from a human readable string. \since
|
||||||
|
* 0.9.14 */
|
||||||
|
pa_proplist *pa_proplist_from_string(const char *str);
|
||||||
|
|
||||||
/** Returns 1 if an entry for the specified key is existant in the
|
/** Returns 1 if an entry for the specified key is existant in the
|
||||||
* property list. \since 0.9.11 */
|
* property list. \since 0.9.11 */
|
||||||
int pa_proplist_contains(pa_proplist *p, const char *key);
|
int pa_proplist_contains(pa_proplist *p, const char *key);
|
||||||
|
|
|
||||||
|
|
@ -29,8 +29,8 @@
|
||||||
#include <pulsecore/core-util.h>
|
#include <pulsecore/core-util.h>
|
||||||
|
|
||||||
int main(int argc, char*argv[]) {
|
int main(int argc, char*argv[]) {
|
||||||
pa_proplist *a, *b;
|
pa_proplist *a, *b, *c;
|
||||||
char *s, *t;
|
char *s, *t, *u;
|
||||||
|
|
||||||
a = pa_proplist_new();
|
a = pa_proplist_new();
|
||||||
pa_assert_se(pa_proplist_sets(a, PA_PROP_MEDIA_TITLE, "Brandenburgische Konzerte") == 0);
|
pa_assert_se(pa_proplist_sets(a, PA_PROP_MEDIA_TITLE, "Brandenburgische Konzerte") == 0);
|
||||||
|
|
@ -50,11 +50,18 @@ int main(int argc, char*argv[]) {
|
||||||
s = pa_proplist_to_string(a);
|
s = pa_proplist_to_string(a);
|
||||||
t = pa_proplist_to_string(b);
|
t = pa_proplist_to_string(b);
|
||||||
printf("---\n%s---\n%s", s, t);
|
printf("---\n%s---\n%s", s, t);
|
||||||
|
|
||||||
|
c = pa_proplist_from_string(s);
|
||||||
|
u = pa_proplist_to_string(c);
|
||||||
|
pa_assert_se(pa_streq(s, u));
|
||||||
|
|
||||||
pa_xfree(s);
|
pa_xfree(s);
|
||||||
pa_xfree(t);
|
pa_xfree(t);
|
||||||
|
pa_xfree(u);
|
||||||
|
|
||||||
pa_proplist_free(a);
|
pa_proplist_free(a);
|
||||||
pa_proplist_free(b);
|
pa_proplist_free(b);
|
||||||
|
pa_proplist_free(c);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue