mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-02 09:01:50 -05:00
conf: parse json config in-place
Avoid allocs by parsing the json in-place.
This commit is contained in:
parent
2d1f84fd7d
commit
eb4a439488
1 changed files with 27 additions and 31 deletions
|
|
@ -277,7 +277,7 @@ int pw_conf_load_state(const char *prefix, const char *name, struct pw_propertie
|
|||
* <factory-name regex> = <library-name>
|
||||
* }
|
||||
*/
|
||||
static int parse_spa_libs(struct pw_context *context, const char *str)
|
||||
static int parse_spa_libs(struct pw_context *context, char *str)
|
||||
{
|
||||
struct spa_json it[2];
|
||||
char key[512], value[512];
|
||||
|
|
@ -325,7 +325,7 @@ static int load_module(struct pw_context *context, const char *key, const char *
|
|||
* }
|
||||
* ]
|
||||
*/
|
||||
static int parse_modules(struct pw_context *context, const char *str)
|
||||
static int parse_modules(struct pw_context *context, char *str)
|
||||
{
|
||||
struct spa_json it[3];
|
||||
char key[512];
|
||||
|
|
@ -346,30 +346,24 @@ static int parse_modules(struct pw_context *context, const char *str)
|
|||
break;
|
||||
|
||||
if (strcmp(key, "name") == 0) {
|
||||
name = malloc(len + 1);
|
||||
name = (char*)val;
|
||||
spa_json_parse_string(val, len, name);
|
||||
}
|
||||
else if (strcmp(key, "args") == 0) {
|
||||
} else if (strcmp(key, "args") == 0) {
|
||||
if (spa_json_is_container(val, len))
|
||||
len = spa_json_container_len(&it[2], val, len);
|
||||
|
||||
args = malloc(len + 1);
|
||||
args = (char*)val;
|
||||
spa_json_parse_string(val, len, args);
|
||||
} else if (strcmp(key, "flags") == 0) {
|
||||
if (spa_json_is_container(val, len))
|
||||
len = spa_json_container_len(&it[2], val, len);
|
||||
|
||||
flags = malloc(len + 1);
|
||||
flags = (char*)val;
|
||||
spa_json_parse_string(val, len, flags);
|
||||
}
|
||||
}
|
||||
if (name != NULL)
|
||||
res = load_module(context, name, args, flags);
|
||||
|
||||
free(name);
|
||||
free(args);
|
||||
free(flags);
|
||||
|
||||
if (res < 0)
|
||||
break;
|
||||
}
|
||||
|
|
@ -411,7 +405,7 @@ static int create_object(struct pw_context *context, const char *key, const char
|
|||
* }
|
||||
* ]
|
||||
*/
|
||||
static int parse_objects(struct pw_context *context, const char *str)
|
||||
static int parse_objects(struct pw_context *context, char *str)
|
||||
{
|
||||
struct spa_json it[3];
|
||||
char key[512];
|
||||
|
|
@ -432,25 +426,25 @@ static int parse_objects(struct pw_context *context, const char *str)
|
|||
break;
|
||||
|
||||
if (strcmp(key, "factory") == 0) {
|
||||
factory = malloc(len + 1);
|
||||
factory = (char*)val;
|
||||
spa_json_parse_string(val, len, factory);
|
||||
} else if (strcmp(key, "args") == 0) {
|
||||
if (spa_json_is_container(val, len))
|
||||
len = spa_json_container_len(&it[2], val, len);
|
||||
|
||||
args = malloc(len + 1);
|
||||
args = (char*)val;
|
||||
spa_json_parse_string(val, len, args);
|
||||
} else if (strcmp(key, "flags") == 0) {
|
||||
flags = strndup(val, len);
|
||||
if (spa_json_is_container(val, len))
|
||||
len = spa_json_container_len(&it[2], val, len);
|
||||
|
||||
flags = (char*)val;
|
||||
spa_json_parse_string(val, len, flags);
|
||||
}
|
||||
}
|
||||
if (factory != NULL)
|
||||
res = create_object(context, factory, args, flags);
|
||||
|
||||
free(factory);
|
||||
free(args);
|
||||
free(flags);
|
||||
|
||||
if (res < 0)
|
||||
break;
|
||||
}
|
||||
|
|
@ -495,7 +489,7 @@ static int do_exec(struct pw_context *context, const char *key, const char *args
|
|||
* }
|
||||
* ]
|
||||
*/
|
||||
static int parse_exec(struct pw_context *context, const char *str)
|
||||
static int parse_exec(struct pw_context *context, char *str)
|
||||
{
|
||||
struct spa_json it[3];
|
||||
char key[512];
|
||||
|
|
@ -516,19 +510,16 @@ static int parse_exec(struct pw_context *context, const char *str)
|
|||
break;
|
||||
|
||||
if (strcmp(key, "path") == 0) {
|
||||
path = malloc(len + 1);
|
||||
path = (char*)val;
|
||||
spa_json_parse_string(val, len, path);
|
||||
} else if (strcmp(key, "args") == 0) {
|
||||
args = malloc(len + 1);
|
||||
args = (char*)val;
|
||||
spa_json_parse_string(val, len, args);
|
||||
}
|
||||
}
|
||||
if (path)
|
||||
if (path != NULL)
|
||||
res = do_exec(context, path, args);
|
||||
|
||||
free(path);
|
||||
free(args);
|
||||
|
||||
if (res < 0)
|
||||
break;
|
||||
}
|
||||
|
|
@ -540,21 +531,26 @@ int pw_context_parse_conf_section(struct pw_context *context,
|
|||
struct pw_properties *conf, const char *section)
|
||||
{
|
||||
const char *str;
|
||||
char *s;
|
||||
int res;
|
||||
|
||||
if ((str = pw_properties_get(conf, section)) == NULL)
|
||||
return -ENOENT;
|
||||
|
||||
s = strdup(str);
|
||||
|
||||
if (strcmp(section, "context.spa-libs") == 0)
|
||||
res = parse_spa_libs(context, str);
|
||||
res = parse_spa_libs(context, s);
|
||||
else if (strcmp(section, "context.modules") == 0)
|
||||
res = parse_modules(context, str);
|
||||
res = parse_modules(context, s);
|
||||
else if (strcmp(section, "context.objects") == 0)
|
||||
res = parse_objects(context, str);
|
||||
res = parse_objects(context, s);
|
||||
else if (strcmp(section, "context.exec") == 0)
|
||||
res = parse_exec(context, str);
|
||||
res = parse_exec(context, s);
|
||||
else
|
||||
res = -EINVAL;
|
||||
|
||||
free(s);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue