SF.net SVN: geany:[5596] trunk

ntrel at users.sourceforge.net ntrel at xxxxx
Thu Mar 17 12:17:04 UTC 2011


Revision: 5596
          http://geany.svn.sourceforge.net/geany/?rev=5596&view=rev
Author:   ntrel
Date:     2011-03-17 12:17:04 +0000 (Thu, 17 Mar 2011)

Log Message:
-----------
Support copying filetype definition file group keys from a system
keyfile with e.g. [styling=C].
Add function utils_make_filename() for building filenames easily.

Modified Paths:
--------------
    trunk/ChangeLog
    trunk/src/filetypes.c
    trunk/src/utils.c
    trunk/src/utils.h

Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2011-03-17 12:08:06 UTC (rev 5595)
+++ trunk/ChangeLog	2011-03-17 12:17:04 UTC (rev 5596)
@@ -1,3 +1,11 @@
+2011-03-17  Nick Treleaven  <nick(dot)treleaven(at)btinternet(dot)com>
+
+ * src/utils.c, src/utils.h, src/filetypes.c:
+   Support copying filetype definition file group keys from a system
+   keyfile with e.g. [styling=C].
+   Add function utils_make_filename() for building filenames easily.
+
+
 2011-03-15  Frank Lanitz  <frank(at)frank(dot)uvena(dot)de>
 
  * THANKS, src/about.c:

Modified: trunk/src/filetypes.c
===================================================================
--- trunk/src/filetypes.c	2011-03-17 12:08:06 UTC (rev 5595)
+++ trunk/src/filetypes.c	2011-03-17 12:17:04 UTC (rev 5596)
@@ -1155,6 +1155,72 @@
 }
 
 
+static void add_keys(GKeyFile *dest, const gchar *group, GKeyFile *src)
+{
+	gchar **keys = g_key_file_get_keys(src, group, NULL, NULL);
+	gchar **ptr;
+
+	foreach_strv(ptr, keys)
+	{
+		gchar *key = *ptr;
+		gchar *value = g_key_file_get_value(src, group, key, NULL);
+
+		g_key_file_set_value(dest, group, key, value);
+		g_free(value);
+	}
+	g_strfreev(keys);
+}
+
+
+static void add_group_keys(GKeyFile *kf, const gchar *group, GeanyFiletype *ft)
+{
+	GKeyFile *src = g_key_file_new();
+	gchar *ext = filetypes_get_conf_extension(ft->id);
+	const gchar *f;
+
+	f = utils_make_filename(app->datadir, "filetypes.", ext, NULL);
+	if (!g_file_test(f, G_FILE_TEST_EXISTS))
+		f = utils_make_filename(app->configdir,
+			GEANY_FILEDEFS_SUBDIR G_DIR_SEPARATOR_S, "filetypes.", ext, NULL);
+	g_free(ext);
+
+	if (!g_key_file_load_from_file(src, f, G_KEY_FILE_NONE, NULL))
+	{
+		geany_debug("Could not read config file %s for [%s=%s]!", f, group, ft->name);
+		return;
+	}
+	add_keys(kf, group, src);
+}
+
+
+static void copy_ft_groups(GKeyFile *kf)
+{
+	gchar **groups = g_key_file_get_groups(kf, NULL);
+	gchar **ptr;
+
+	foreach_strv(ptr, groups)
+	{
+		gchar *group = *ptr;
+		gchar *name = strstr(*ptr, "=");
+		GeanyFiletype *ft;
+
+		if (!name)
+			continue;
+
+		/* terminate group at '=' */
+		*name = 0;
+		name++;
+		if (!name[0])
+			continue;
+
+		ft = filetypes_lookup_by_name(name);
+		if (ft)
+			add_group_keys(kf, group, ft);
+	}
+	g_strfreev(groups);
+}
+
+
 /* simple wrapper function to print file errors in DEBUG mode */
 static void load_system_keyfile(GKeyFile *key_file, const gchar *file, GKeyFileFlags flags,
 		GeanyFiletype *ft)
@@ -1201,17 +1267,18 @@
 	{
 		/* highlighting uses GEANY_FILETYPES_NONE for common settings */
 		gchar *ext = filetypes_get_conf_extension(ft_id);
-		gchar *f0 = g_strconcat(app->datadir, G_DIR_SEPARATOR_S "filetypes.", ext, NULL);
-		gchar *f = g_strconcat(app->configdir,
-			G_DIR_SEPARATOR_S GEANY_FILEDEFS_SUBDIR G_DIR_SEPARATOR_S "filetypes.", ext, NULL);
+		const gchar *f;
 
-		load_system_keyfile(config, f0, G_KEY_FILE_KEEP_COMMENTS, ft);
+		f = utils_make_filename(app->datadir, "filetypes.", ext, NULL);
+		load_system_keyfile(config, f, G_KEY_FILE_KEEP_COMMENTS, ft);
+		f = utils_make_filename(app->configdir,
+			GEANY_FILEDEFS_SUBDIR G_DIR_SEPARATOR_S, "filetypes.", ext, NULL);
 		g_key_file_load_from_file(config_home, f, G_KEY_FILE_KEEP_COMMENTS, NULL);
-
 		g_free(ext);
-		g_free(f);
-		g_free(f0);
 	}
+	/* Copy keys for any groups with [group=C] from system keyfile */
+	copy_ft_groups(config);
+	copy_ft_groups(config_home);
 
 	load_settings(ft_id, config, config_home);
 	highlighting_init_styles(ft_id, config, config_home);

Modified: trunk/src/utils.c
===================================================================
--- trunk/src/utils.c	2011-03-17 12:08:06 UTC (rev 5595)
+++ trunk/src/utils.c	2011-03-17 12:17:04 UTC (rev 5596)
@@ -1722,6 +1722,25 @@
 }
 
 
+static gboolean utils_string_vappend(GString *buffer, const gchar *sep, va_list args)
+{
+	const gchar *str = va_arg(args, const gchar *);
+
+	if (!str)
+		return FALSE;
+	do
+	{
+		g_string_append(buffer, str);
+		str = va_arg(args, const gchar *);
+		if (str && sep)
+			g_string_append(buffer, sep);
+	}
+	while (str);
+
+	return TRUE;
+}
+
+
 /* Similar to g_build_path() but (re)using a fixed buffer, so never free it.
  * This assumes a small enough resulting string length to be kept without freeing,
  * but this should be the case for filenames.
@@ -1730,7 +1749,6 @@
 const gchar *utils_build_path(const gchar *first, ...)
 {
 	static GString *buffer = NULL;
-	const gchar *str;
 	va_list args;
 
 	if (! buffer)
@@ -1738,18 +1756,37 @@
 	else
 		g_string_assign(buffer, first);
 
+	g_string_append_c(buffer, G_DIR_SEPARATOR);
+
 	va_start(args, first);
-	while (1)
-	{
-		str = va_arg(args, const gchar *);
-		if (!str)
-			break;
+	utils_string_vappend(buffer, G_DIR_SEPARATOR_S, args);
+	va_end(args);
+	return buffer->str;
+}
 
-		g_string_append_c(buffer, G_DIR_SEPARATOR);
-		g_string_append(buffer, str);
-	}
+
+/* Concatenates a path with other strings.
+ * @param path A path, which will have a separator added before the other strings.
+ * @param ... Strings to concatenate (no directory separators will be
+ * 	inserted between them).
+ * @warning This returns temporary string contents only valid until the next call
+ * to this function.
+ * E.g. filename = utils_make_filename(app->datadir, "filetypes.", ext, NULL); */
+const gchar *utils_make_filename(const gchar *path, ...)
+{
+	static GString *buffer = NULL;
+	va_list args;
+
+	if (! buffer)
+		buffer = g_string_new(path);
+	else
+		g_string_assign(buffer, path);
+
+	g_string_append_c(buffer, G_DIR_SEPARATOR);
+
+	va_start(args, path);
+	utils_string_vappend(buffer, NULL, args);
 	va_end(args);
-
 	return buffer->str;
 }
 

Modified: trunk/src/utils.h
===================================================================
--- trunk/src/utils.h	2011-03-17 12:08:06 UTC (rev 5595)
+++ trunk/src/utils.h	2011-03-17 12:17:04 UTC (rev 5596)
@@ -249,6 +249,8 @@
 
 const gchar *utils_build_path(const gchar *first, ...) G_GNUC_NULL_TERMINATED;
 
+const gchar *utils_make_filename(const gchar *path, ...) G_GNUC_NULL_TERMINATED;
+
 gchar *utils_get_path_from_uri(const gchar *uri);
 
 gboolean utils_is_uri(const gchar *uri);


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.



More information about the Commits mailing list