diff options
-rw-r--r-- | parse.c | 36 | ||||
-rw-r--r-- | parse.h | 2 | ||||
-rw-r--r-- | pkg.c | 23 |
3 files changed, 46 insertions, 15 deletions
@@ -1145,3 +1145,39 @@ parse_package_file (const char *key, const char *path, return pkg; } + +/* Parse a package variable. When the value appears to be quoted, + * unquote it so it can be more easily used in a shell. Otherwise, + * return the raw value. + */ +char * +parse_package_variable (Package *pkg, const char *variable) +{ + char *value; + char *unquoted; + GError *error = NULL; + + value = package_get_var (pkg, variable); + if (!value) + return NULL; + + if (*value != '"' && *value != '\'') + /* Not quoted, return raw value */ + return value; + + /* Maybe too naive, but assume a fully quoted variable */ + unquoted = g_shell_unquote (value, &error); + if (unquoted) + { + g_free (value); + return unquoted; + } + else + { + /* Note the issue, but just return the raw value */ + debug_spew ("Couldn't unquote value of \"%s\": %s\n", + variable, error ? error->message : "unknown"); + g_clear_error (&error); + return value; + } +} @@ -29,6 +29,8 @@ Package *parse_package_file (const char *key, const char *path, GList *parse_module_list (Package *pkg, const char *str, const char *path); +char *parse_package_variable (Package *pkg, const char *variable); + #endif @@ -1070,40 +1070,33 @@ package_get_var (Package *pkg, } char * -packages_get_var (GList *pkgs, +packages_get_var (GList *pkgs, const char *varname) { GList *tmp; GString *str; - char *retval; - - str = g_string_new (""); - + + str = g_string_new (NULL); + tmp = pkgs; while (tmp != NULL) { Package *pkg = tmp->data; char *var; - var = package_get_var (pkg, varname); - + var = parse_package_variable (pkg, varname); if (var) { + if (str->len > 0) + g_string_append_c (str, ' '); g_string_append (str, var); - g_string_append_c (str, ' '); g_free (var); } tmp = g_list_next (tmp); } - /* chop last space */ - if (str->len > 0) - str->str[str->len - 1] = '\0'; - retval = str->str; - g_string_free (str, FALSE); - - return retval; + return g_string_free (str, FALSE); } int |