]> Dogcows Code - chaz/openbox/blobdiff - obt/parse.c
Merge branch 'backport' into work
[chaz/openbox] / obt / parse.c
index f23ed194ffec3418021cc45e6d7570030bc4dde1..d181b67920ec4894e7a2f4413808a3d5bdbac6dd 100644 (file)
 */
 
 #include "obt/parse.h"
+#include "obt/paths.h"
 
 #include <glib.h>
 
-#ifdef HAVE_STRING_H
-#  include <string.h>
-#endif
-#ifdef HAVE_ERRNO_H
-#  include <errno.h>
+#ifdef HAVE_STDLIB_H
+#  include <stdlib.h>
 #endif
 #ifdef HAVE_SYS_STAT_H
 #  include <sys/stat.h>
 #  include <unistd.h>
 #endif
 
-static gboolean xdg_start;
-static gchar   *xdg_config_home_path;
-static gchar   *xdg_data_home_path;
-static GSList  *xdg_config_dir_paths;
-static GSList  *xdg_data_dir_paths;
-
 struct Callback {
     gchar *tag;
     ObtParseCallback func;
@@ -50,6 +42,7 @@ struct Callback {
 
 struct _ObtParseInst {
     gint ref;
+    ObtPaths *xdg_paths;
     GHashTable *callbacks;
     xmlDocPtr doc;
     xmlNodePtr root;
@@ -66,6 +59,7 @@ ObtParseInst* obt_parse_instance_new(void)
 {
     ObtParseInst *i = g_new(ObtParseInst, 1);
     i->ref = 1;
+    i->xdg_paths = obt_paths_new();
     i->callbacks = g_hash_table_new_full(g_str_hash, g_str_equal, NULL,
                                          (GDestroyNotify)destfunc);
     i->doc = NULL;
@@ -82,6 +76,7 @@ void obt_parse_instance_ref(ObtParseInst *i)
 void obt_parse_instance_unref(ObtParseInst *i)
 {
     if (i && --i->ref == 0) {
+        obt_paths_unref(i->xdg_paths);
         g_hash_table_destroy(i->callbacks);
         g_free(i);
     }
@@ -195,7 +190,7 @@ gboolean obt_parse_load_config_file(ObtParseInst *i,
     GSList *it, *paths = NULL;
     gboolean r;
 
-    for (it = xdg_config_dir_paths; it; it = g_slist_next(it))
+    for (it = obt_paths_config_dirs(i->xdg_paths); it; it = g_slist_next(it))
         paths = g_slist_append(paths, g_strdup(it->data));
 
     r = load_file(i, domain, filename, root_node, paths);
@@ -215,7 +210,7 @@ gboolean obt_parse_load_data_file(ObtParseInst *i,
     GSList *it, *paths = NULL;
     gboolean r;
 
-    for (it = xdg_data_dir_paths; it; it = g_slist_next(it))
+    for (it = obt_paths_data_dirs(i->xdg_paths); it; it = g_slist_next(it))
         paths = g_slist_append(paths, g_strdup(it->data));
 
     r = load_file(i, domain, filename, root_node, paths);
@@ -240,7 +235,7 @@ gboolean obt_parse_load_theme_file(ObtParseInst *i,
     paths = g_slist_append
         (paths, g_build_filename(g_get_home_dir(), ".themes", theme, NULL));
 
-    for (it = xdg_data_dir_paths; it; it = g_slist_next(it))
+    for (it = obt_paths_data_dirs(i->xdg_paths); it; it = g_slist_next(it))
         paths = g_slist_append
             (paths, g_build_filename(it->data, "themes", theme, NULL));
 
@@ -416,197 +411,3 @@ gboolean obt_parse_attr_contains(xmlNodePtr node, const gchar *name,
     xmlFree(c);
     return r;
 }
-
-static gint slist_path_cmp(const gchar *a, const gchar *b)
-{
-    return strcmp(a, b);
-}
-
-typedef GSList* (*GSListFunc) (gpointer list, gconstpointer data);
-
-static GSList* slist_path_add(GSList *list, gpointer data, GSListFunc func)
-{
-    g_assert(func);
-
-    if (!data)
-        return list;
-
-    if (!g_slist_find_custom(list, data, (GCompareFunc) slist_path_cmp))
-        list = func(list, data);
-    else
-        g_free(data);
-
-    return list;
-}
-
-static GSList* split_paths(const gchar *paths)
-{
-    GSList *list = NULL;
-    gchar **spl, **it;
-
-    if (!paths)
-        return NULL;
-    spl = g_strsplit(paths, ":", -1);
-    for (it = spl; *it; ++it)
-        list = slist_path_add(list, *it, (GSListFunc) g_slist_append);
-    g_free(spl);
-    return list;
-}
-
-void parse_paths_startup(void)
-{
-    const gchar *path;
-
-    if (xdg_start)
-        return;
-    xdg_start = TRUE;
-
-    path = g_getenv("XDG_CONFIG_HOME");
-    if (path && path[0] != '\0') /* not unset or empty */
-        xdg_config_home_path = g_build_filename(path, NULL);
-    else
-        xdg_config_home_path = g_build_filename(g_get_home_dir(), ".config",
-                                                NULL);
-
-    path = g_getenv("XDG_DATA_HOME");
-    if (path && path[0] != '\0') /* not unset or empty */
-        xdg_data_home_path = g_build_filename(path, NULL);
-    else
-        xdg_data_home_path = g_build_filename(g_get_home_dir(), ".local",
-                                              "share", NULL);
-
-    path = g_getenv("XDG_CONFIG_DIRS");
-    if (path && path[0] != '\0') /* not unset or empty */
-        xdg_config_dir_paths = split_paths(path);
-    else {
-        xdg_config_dir_paths = slist_path_add(xdg_config_dir_paths,
-                                              g_strdup(CONFIGDIR),
-                                              (GSListFunc) g_slist_append);
-        xdg_config_dir_paths = slist_path_add(xdg_config_dir_paths,
-                                              g_build_filename
-                                              (G_DIR_SEPARATOR_S,
-                                               "etc", "xdg", NULL),
-                                              (GSListFunc) g_slist_append);
-    }
-    xdg_config_dir_paths = slist_path_add(xdg_config_dir_paths,
-                                          g_strdup(xdg_config_home_path),
-                                          (GSListFunc) g_slist_prepend);
-
-    path = g_getenv("XDG_DATA_DIRS");
-    if (path && path[0] != '\0') /* not unset or empty */
-        xdg_data_dir_paths = split_paths(path);
-    else {
-        xdg_data_dir_paths = slist_path_add(xdg_data_dir_paths,
-                                            g_strdup(DATADIR),
-                                            (GSListFunc) g_slist_append);
-        xdg_data_dir_paths = slist_path_add(xdg_data_dir_paths,
-                                            g_build_filename
-                                            (G_DIR_SEPARATOR_S,
-                                             "usr", "local", "share", NULL),
-                                            (GSListFunc) g_slist_append);
-        xdg_data_dir_paths = slist_path_add(xdg_data_dir_paths,
-                                            g_build_filename
-                                            (G_DIR_SEPARATOR_S,
-                                             "usr", "share", NULL),
-                                            (GSListFunc) g_slist_append);
-    }
-    xdg_data_dir_paths = slist_path_add(xdg_data_dir_paths,
-                                        g_strdup(xdg_data_home_path),
-                                        (GSListFunc) g_slist_prepend);
-}
-
-void parse_paths_shutdown(void)
-{
-    GSList *it;
-
-    if (!xdg_start)
-        return;
-    xdg_start = FALSE;
-
-    for (it = xdg_config_dir_paths; it; it = g_slist_next(it))
-        g_free(it->data);
-    g_slist_free(xdg_config_dir_paths);
-    xdg_config_dir_paths = NULL;
-    for (it = xdg_data_dir_paths; it; it = g_slist_next(it))
-        g_free(it->data);
-    g_slist_free(xdg_data_dir_paths);
-    xdg_data_dir_paths = NULL;
-    g_free(xdg_config_home_path);
-    xdg_config_home_path = NULL;
-    g_free(xdg_data_home_path);
-    xdg_data_home_path = NULL;
-}
-
-gchar *parse_expand_tilde(const gchar *f)
-{
-    gchar **spl;
-    gchar *ret;
-
-    if (!f)
-        return NULL;
-    spl = g_strsplit(f, "~", 0);
-    ret = g_strjoinv(g_get_home_dir(), spl);
-    g_strfreev(spl);
-    return ret;
-}
-
-gboolean parse_mkdir(const gchar *path, gint mode)
-{
-    gboolean ret = TRUE;
-
-    g_return_val_if_fail(path != NULL, FALSE);
-    g_return_val_if_fail(path[0] != '\0', FALSE);
-
-    if (!g_file_test(path, G_FILE_TEST_IS_DIR))
-        if (mkdir(path, mode) == -1)
-            ret = FALSE;
-
-    return ret;
-}
-
-gboolean parse_mkdir_path(const gchar *path, gint mode)
-{
-    gboolean ret = TRUE;
-
-    g_return_val_if_fail(path != NULL, FALSE);
-    g_return_val_if_fail(path[0] == '/', FALSE);
-
-    if (!g_file_test(path, G_FILE_TEST_IS_DIR)) {
-        gchar *c, *e;
-
-        c = g_strdup(path);
-        e = c;
-        while ((e = strchr(e + 1, '/'))) {
-            *e = '\0';
-            if (!(ret = parse_mkdir(c, mode)))
-                goto parse_mkdir_path_end;
-            *e = '/';
-        }
-        ret = parse_mkdir(c, mode);
-
-    parse_mkdir_path_end:
-        g_free(c);
-    }
-
-    return ret;
-}
-
-const gchar* parse_xdg_config_home_path(void)
-{
-    return xdg_config_home_path;
-}
-
-const gchar* parse_xdg_data_home_path(void)
-{
-    return xdg_data_home_path;
-}
-
-GSList* parse_xdg_config_dir_paths(void)
-{
-    return xdg_config_dir_paths;
-}
-
-GSList* parse_xdg_data_dir_paths(void)
-{
-    return xdg_data_dir_paths;
-}
This page took 0.024244 seconds and 4 git commands to generate.