]> Dogcows Code - chaz/openbox/blobdiff - obt/parse.c
add obt_parse_save_file() method to the obt parse library
[chaz/openbox] / obt / parse.c
index f23ed194ffec3418021cc45e6d7570030bc4dde1..b44e968d589f3ee7bef87dc02347ba4b0a61edb2 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);
     }
@@ -104,7 +99,7 @@ void obt_parse_register(ObtParseInst *i, const gchar *tag,
 {
     struct Callback *c;
 
-    if ((c = g_hash_table_lookup(i->callbacks, tag))) {
+    if (g_hash_table_lookup(i->callbacks, tag)) {
         g_error("Tag '%s' already registered", tag);
         return;
     }
@@ -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));
 
@@ -282,6 +277,13 @@ gboolean obt_parse_load_mem(ObtParseInst *i,
     return r;
 }
 
+gboolean obt_parse_save_file(ObtParseInst *inst,
+                             const gchar *path,
+                             gboolean pretty)
+{
+    return xmlSaveFormatFile(path, inst->doc, pretty) != -1;
+}
+
 void obt_parse_close(ObtParseInst *i)
 {
     if (i && i->doc) {
@@ -312,7 +314,9 @@ void obt_parse_tree_from_root(ObtParseInst *i)
 gchar *obt_parse_node_string(xmlNodePtr node)
 {
     xmlChar *c = xmlNodeGetContent(node);
-    gchar *s = g_strdup(c ? (gchar*)c : "");
+    gchar *s;
+    if (c) g_strstrip((char*)c); /* strip leading/trailing whitespace */
+    s = g_strdup(c ? (gchar*)c : "");
     xmlFree(c);
     return s;
 }
@@ -320,7 +324,9 @@ gchar *obt_parse_node_string(xmlNodePtr node)
 gint obt_parse_node_int(xmlNodePtr node)
 {
     xmlChar *c = xmlNodeGetContent(node);
-    gint i = c ? atoi((gchar*)c) : 0;
+    gint i;
+    if (c) g_strstrip((char*)c); /* strip leading/trailing whitespace */
+    i = c ? atoi((gchar*)c) : 0;
     xmlFree(c);
     return i;
 }
@@ -329,6 +335,7 @@ gboolean obt_parse_node_bool(xmlNodePtr node)
 {
     xmlChar *c = xmlNodeGetContent(node);
     gboolean b = FALSE;
+    if (c) g_strstrip((char*)c); /* strip leading/trailing whitespace */
     if (c && !xmlStrcasecmp(c, (const xmlChar*) "true"))
         b = TRUE;
     else if (c && !xmlStrcasecmp(c, (const xmlChar*) "yes"))
@@ -343,6 +350,7 @@ gboolean obt_parse_node_contains(xmlNodePtr node, const gchar *val)
 {
     xmlChar *c = xmlNodeGetContent(node);
     gboolean r;
+    if (c) g_strstrip((char*)c); /* strip leading/trailing whitespace */
     r = !xmlStrcasecmp(c, (const xmlChar*) val);
     xmlFree(c);
     return r;
@@ -364,6 +372,7 @@ gboolean obt_parse_attr_bool(xmlNodePtr node, const gchar *name,
     xmlChar *c = xmlGetProp(node, (const xmlChar*) name);
     gboolean r = FALSE;
     if (c) {
+        g_strstrip((char*)c); /* strip leading/trailing whitespace */
         if (!xmlStrcasecmp(c, (const xmlChar*) "true"))
             *value = TRUE, r = TRUE;
         else if (!xmlStrcasecmp(c, (const xmlChar*) "yes"))
@@ -386,6 +395,7 @@ gboolean obt_parse_attr_int(xmlNodePtr node, const gchar *name, gint *value)
     xmlChar *c = xmlGetProp(node, (const xmlChar*) name);
     gboolean r = FALSE;
     if (c) {
+        g_strstrip((char*)c); /* strip leading/trailing whitespace */
         *value = atoi((gchar*)c);
         r = TRUE;
     }
@@ -399,6 +409,7 @@ gboolean obt_parse_attr_string(xmlNodePtr node, const gchar *name,
     xmlChar *c = xmlGetProp(node, (const xmlChar*) name);
     gboolean r = FALSE;
     if (c) {
+        g_strstrip((char*)c); /* strip leading/trailing whitespace */
         *value = g_strdup((gchar*)c);
         r = TRUE;
     }
@@ -411,202 +422,10 @@ gboolean obt_parse_attr_contains(xmlNodePtr node, const gchar *name,
 {
     xmlChar *c = xmlGetProp(node, (const xmlChar*) name);
     gboolean r = FALSE;
-    if (c)
+    if (c) {
+        g_strstrip((char*)c); /* strip leading/trailing whitespace */
         r = !xmlStrcasecmp(c, (const xmlChar*) val);
+    }
     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.026783 seconds and 4 git commands to generate.