SF.net SVN: geany: [854] trunk

ntrel at users.sourceforge.net ntrel at xxxxx
Sat Sep 30 11:14:04 UTC 2006


Revision: 854
          http://svn.sourceforge.net/geany/?rev=854&view=rev
Author:   ntrel
Date:     2006-09-30 04:13:58 -0700 (Sat, 30 Sep 2006)

Log Message:
-----------
Changed StyleSet struct to use Style array, which can use less
memory. Added separate struct for the common style set. Also
use a struct for tracking the loaded global tags files. Renamed
some static functions.

Modified Paths:
--------------
    trunk/ChangeLog
    trunk/src/highlighting.c
    trunk/src/highlighting.h

Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2006-09-29 16:02:33 UTC (rev 853)
+++ trunk/ChangeLog	2006-09-30 11:13:58 UTC (rev 854)
@@ -1,3 +1,12 @@
+2006-09-30  Nick Treleaven  <nick.treleaven at btinternet.com>
+
+ * src/highlighting.c, src/highlighting.h:
+   Changed StyleSet struct to use Style array, which can use less
+   memory. Added separate struct for the common style set. Also
+   use a struct for tracking the loaded global tags files. Renamed
+   some static functions.
+
+
 2006-09-29  Enrico Tröger  <enrico.troeger at uvena.de>
 
  * src/filetypes.c, data/filetype_extensions.conf:
@@ -5,7 +14,7 @@
  * doc/geany.docbook:
    Updated information for Debian and Gentoo packages.
  * New release: Geany 0.9 "Kintaro".
- * THANKS, src/about.c: Changed credtits of topi.
+ * THANKS, src/about.c: Changed credits of topi.
 
 
 2006-09-27  Nick Treleaven  <nick.treleaven at btinternet.com>

Modified: trunk/src/highlighting.c
===================================================================
--- trunk/src/highlighting.c	2006-09-29 16:02:33 UTC (rev 853)
+++ trunk/src/highlighting.c	2006-09-30 11:13:58 UTC (rev 854)
@@ -1,5 +1,5 @@
 /*
- *      highligting.c - this file is part of Geany, a fast and lightweight IDE
+ *      highlighting.c - this file is part of Geany, a fast and lightweight IDE
  *
  *      Copyright 2006 Enrico Troeger <enrico.troeger at uvena.de>
  *
@@ -31,16 +31,143 @@
 #include "filetypes.h"
 
 
-static style_set *types[GEANY_MAX_FILE_TYPES] = { NULL };
-static gboolean global_c_tags_loaded = FALSE;
-static gboolean global_pascal_tags_loaded = FALSE;
-static gboolean global_php_tags_loaded = FALSE;
-static gboolean global_html_tags_loaded = FALSE;
-static gboolean global_latex_tags_loaded = FALSE;
+typedef struct
+{
+	gint	foreground;
+	gint	background;
+	gboolean bold:1;
+	gboolean italic:1;
+} Style;
 
+typedef struct
+{
+	Style	 *styling;	// array of styles, NULL if not used
+	gchar	**keywords;
+	gchar	 *wordchars;
+} StyleSet;
 
+// After styleset_common_init, each style_sets[...].* is set to NULL in styleset_init_styles.
+// each filetype has a styleset except GEANY_FILETYPE_ALL
+static StyleSet style_sets[GEANY_MAX_FILE_TYPES - 1];
+
+
+enum	// Geany common styling
+{
+	GCS_SELECTION,
+	GCS_BRACE_GOOD,
+	GCS_BRACE_BAD,
+	GCS_MARGIN_LINENUMBER,
+	GCS_MARGIN_FOLDING,
+	GCS_CURRENT_LINE,
+	GCS_CARET,
+	GCS_INDENT_GUIDE,
+	GCS_WHITE_SPACE,
+	GCS_MAX
+};
+
+typedef struct
+{
+	// can take values 1 or 2
+	guchar marker:2;
+	guchar lines:2;
+} FoldingStyle;
+
+static struct
+{
+	Style			styling[GCS_MAX];
+	FoldingStyle	folding_style;
+	gboolean		invert_all;
+	gchar			*wordchars;
+} common_style_set;
+
+
+enum	// Geany tag files
+{
+	GTF_C,
+	GTF_PASCAL,
+	GTF_PHP,
+	GTF_HTML_ENTITIES,
+	GTF_LATEX,
+	GTF_MAX
+};
+
+// langType used in TagManager (see the table in tagmanager/parsers.h)
+enum	// Geany lang type
+{
+	GLT_C = 0,
+	GLT_CPP = 1,
+	GLT_PASCAL = 4,
+	GLT_PHP = 6,
+	GLT_LATEX = 8
+};
+
+typedef struct
+{
+	gboolean	tags_loaded;
+	const gchar	*tag_file;
+} TagFileInfo;
+
+static TagFileInfo tag_file_info[GTF_MAX] =
+{
+	{FALSE, "global.tags"},
+	{FALSE, "pascal.tags"},
+	{FALSE, "php.tags"},
+	{FALSE, "html_entities.tags"},
+	{FALSE, "latex.tags"}
+};
+
+
+static void new_style_array(gint file_type_id, gint styling_count)
+{
+	style_sets[file_type_id].styling = g_new0(Style, styling_count);
+}
+
+
+#if 0
+static Style *get_styling(gint file_type_id, gint styling_index)
+{
+	return &style_sets[file_type_id].styling[styling_index];
+}
+#endif
+
+
+// lang_type is for langType used in TagManager (see the table in tagmanager/parsers.h)
+static void ensure_tags_loaded(gint tag_file_index, gint lang_type)
+{
+	TagFileInfo *tfi;
+
+	if (app->ignore_global_tags) return;
+
+	tfi = &tag_file_info[tag_file_index];
+	if (! tfi->tags_loaded)
+	{
+		gchar *file = g_strconcat(app->datadir, G_DIR_SEPARATOR_S, tfi->tag_file, NULL);
+		tm_workspace_load_global_tags(file, lang_type);
+		tfi->tags_loaded = TRUE;
+		g_free(file);
+	}
+}
+
+
+static void ensure_html_tags_loaded()
+{
+	TagFileInfo *tfi;
+
+	if (app->ignore_global_tags) return;
+
+	tfi = &tag_file_info[GTF_HTML_ENTITIES];
+	if (! tfi->tags_loaded)
+	{
+		gchar *file = g_strconcat(app->datadir, G_DIR_SEPARATOR_S, tfi->tag_file, NULL);
+		html_entities = utils_read_file_in_array(file);
+		tfi->tags_loaded = TRUE;
+		g_free(file);
+	}
+}
+
+
 /* simple wrapper function to print file errors in DEBUG mode */
-static void styleset_load_file(GKeyFile *key_file, const gchar *file, GKeyFileFlags flags,
+static void load_system_keyfile(GKeyFile *key_file, const gchar *file, GKeyFileFlags flags,
 								G_GNUC_UNUSED GError **just_for_compatibility)
 {
 	GError *error = NULL;
@@ -54,14 +181,26 @@
 }
 
 
-static void styleset_get_keywords(GKeyFile *config, GKeyFile *configh, const gchar *section,
-								  const gchar *key, gint index, gint pos, const gchar *default_value)
+static void load_keyfiles(GKeyFile *config, GKeyFile *config_home, const gchar *filename)
 {
+	gchar *f0 = g_strconcat(app->datadir, G_DIR_SEPARATOR_S, filename, NULL);
+	gchar *f = g_strconcat(app->configdir,
+		G_DIR_SEPARATOR_S GEANY_FILEDEFS_SUBDIR G_DIR_SEPARATOR_S, filename, NULL);
+
+	load_system_keyfile(config, f0, G_KEY_FILE_KEEP_COMMENTS, NULL);
+	g_key_file_load_from_file(config_home, f, G_KEY_FILE_KEEP_COMMENTS, NULL);
+
+}
+
+
+static void get_keyfile_keywords(GKeyFile *config, GKeyFile *configh, const gchar *section,
+				const gchar *key, gint index, gint pos, const gchar *default_value)
+{
 	gchar *result;
 
 	if (config == NULL || configh == NULL || section == NULL)
 	{
-		types[index]->keywords[pos] = g_strdup(default_value);
+		style_sets[index].keywords[pos] = g_strdup(default_value);
 		return;
 	}
 
@@ -70,22 +209,23 @@
 
 	if (result == NULL)
 	{
-		types[index]->keywords[pos] = g_strdup(default_value);
+		style_sets[index].keywords[pos] = g_strdup(default_value);
 	}
 	else
 	{
-		types[index]->keywords[pos] = result;
+		style_sets[index].keywords[pos] = result;
 	}
 }
 
 
-static void styleset_get_wordchars(GKeyFile *config, GKeyFile *configh, gint index, const gchar *default_value)
+static void get_keyfile_wordchars(GKeyFile *config, GKeyFile *configh,
+				const gchar *default_value, gchar **wordchars)
 {
 	gchar *result;
 
 	if (config == NULL || configh == NULL)
 	{
-		types[index]->wordchars = g_strdup(default_value);
+		*wordchars = g_strdup(default_value);
 		return;
 	}
 
@@ -94,15 +234,17 @@
 
 	if (result == NULL)
 	{
-		types[index]->wordchars = g_strdup(default_value);
+		*wordchars = g_strdup(default_value);
 	}
 	else
-		types[index]->wordchars = result;
+		*wordchars = result;
 }
 
 
-static void styleset_get_hex(GKeyFile *config, GKeyFile *configh, const gchar *section, const gchar *key,
-					  const gchar *foreground, const gchar *background, const gchar *bold, gint array[])
+static void get_keyfile_hex(GKeyFile *config, GKeyFile *configh,
+				const gchar *section, const gchar *key,
+				const gchar *foreground, const gchar *background, const gchar *bold,
+				Style *style)
 {
 	gchar **list;
 	gsize len;
@@ -111,21 +253,30 @@
 
 	list = g_key_file_get_string_list(configh, section, key, &len, NULL);
 	if (list == NULL) list = g_key_file_get_string_list(config, section, key, &len, NULL);
-	if (list != NULL && list[0] != NULL) array[0] = (gint) utils_strtod(list[0], NULL, FALSE);
-	else if (foreground) array[0] = (gint) utils_strtod(foreground, NULL, FALSE);
-	if (list && list != NULL && list[1] != NULL) array[1] = (gint) utils_strtod(list[1], NULL, FALSE);
-	else if (background) array[1] = (gint) utils_strtod(background, NULL, FALSE);
-	if (list != NULL && list[2] != NULL) array[2] = utils_atob(list[2]);
-	else array[2] = utils_atob(bold);
-	if (list != NULL && list[3] != NULL) array[3] = utils_atob(list[3]);
-	else array[3] = FALSE;
 
+	if (list != NULL && list[0] != NULL)
+		style->foreground = (gint) utils_strtod(list[0], NULL, FALSE);
+	else if (foreground)
+		style->foreground = (gint) utils_strtod(foreground, NULL, FALSE);
+
+	if (list != NULL && list[1] != NULL)
+		style->background = (gint) utils_strtod(list[1], NULL, FALSE);
+	else if (background)
+		style->background = (gint) utils_strtod(background, NULL, FALSE);
+
+	if (list != NULL && list[2] != NULL) style->bold = utils_atob(list[2]);
+	else style->bold = utils_atob(bold);
+
+	if (list != NULL && list[3] != NULL) style->italic = utils_atob(list[3]);
+	else style->italic = FALSE;
+
 	g_strfreev(list);
 }
 
 
-static void styleset_get_int(GKeyFile *config, GKeyFile *configh, const gchar *section,
-							 const gchar *key, gint fdefault_val, gint sdefault_val, gint array[])
+static void get_keyfile_int(GKeyFile *config, GKeyFile *configh, const gchar *section,
+							const gchar *key, gint fdefault_val, gint sdefault_val,
+							Style *style)
 {
 	gchar **list;
 	gchar *end1, *end2;
@@ -136,21 +287,22 @@
 	list = g_key_file_get_string_list(configh, section, key, &len, NULL);
 	if (list == NULL) list = g_key_file_get_string_list(config, section, key, &len, NULL);
 
-	if (list != NULL && list[0] != NULL) array[0] = strtol(list[0], &end1, 10);
-	else array[0] = fdefault_val;
-	if (list != NULL && list[1] != NULL) array[1] = strtol(list[1], &end2, 10);
-	else array[1] = sdefault_val;
+	if (list != NULL && list[0] != NULL) style->foreground = strtol(list[0], &end1, 10);
+	else style->foreground = fdefault_val;
+	if (list != NULL && list[1] != NULL) style->background = strtol(list[1], &end2, 10);
+	else style->background = sdefault_val;
 
 	// if there was an error, strtol() returns 0 and end is list[x], so then we use default_val
-	if (list == NULL || list[0] == end1) array[0] = fdefault_val;
-	if (list == NULL || list[1] == end2) array[1] = sdefault_val;
+	if (list == NULL || list[0] == end1) style->foreground = fdefault_val;
+	if (list == NULL || list[1] == end2) style->background = sdefault_val;
 
 	g_strfreev(list);
 }
 
+
 static guint invert(guint icolour)
 {
-	if (types[GEANY_FILETYPES_ALL]->styling[10][0])
+	if (common_style_set.invert_all)
 	{
 		guint r, g, b;
 
@@ -163,27 +315,48 @@
 }
 
 
-static void styleset_set_style(ScintillaObject *sci, gint style, gint filetype, gint styling_index)
+static void set_sci_style(ScintillaObject *sci, gint style, gint filetype, gint styling_index)
 {
-	SSM(sci, SCI_STYLESETFORE, style, invert(types[filetype]->styling[styling_index][0]));
-	SSM(sci, SCI_STYLESETBACK, style, invert(types[filetype]->styling[styling_index][1]));
-	SSM(sci, SCI_STYLESETBOLD, style, types[filetype]->styling[styling_index][2]);
-	SSM(sci, SCI_STYLESETITALIC, style, types[filetype]->styling[styling_index][3]);
+	Style *style_ptr;
+
+	if (filetype == GEANY_FILETYPES_ALL)
+		style_ptr = &common_style_set.styling[styling_index];
+	else
+		style_ptr = &style_sets[filetype].styling[styling_index];
+
+	SSM(sci, SCI_STYLESETFORE, style,	invert(style_ptr->foreground));
+	SSM(sci, SCI_STYLESETBACK, style,	invert(style_ptr->background));
+	SSM(sci, SCI_STYLESETBOLD, style,	style_ptr->bold);
+	SSM(sci, SCI_STYLESETITALIC, style,	style_ptr->italic);
 }
 
 
+// called from styleset_common
+static void init_styles()
+{
+	gint i;
+
+	for (i = 0; i < GEANY_MAX_FILE_TYPES - 1; i++)
+	{
+		style_sets[i].styling = NULL;	// styling == NULL used to check init was run for most style sets
+		style_sets[i].keywords = NULL;
+		style_sets[i].wordchars = NULL;	// wordchars == NULL used for style sets with no styles
+	}
+}
+
+
 void styleset_free_styles()
 {
 	gint i;
 
-	for (i = 0; i < GEANY_MAX_FILE_TYPES; i++)
+	for (i = 0; i < GEANY_MAX_FILE_TYPES - 1; i++)
 	{
-		if (types[i] != NULL)
-		{
-			g_strfreev(types[i]->keywords);
-			g_free(types[i]->wordchars);
-			g_free(types[i]);
-		}
+		StyleSet *style_ptr;
+		style_ptr = &style_sets[i];
+
+		g_free(style_ptr->styling);
+		g_strfreev(style_ptr->keywords);
+		g_free(style_ptr->wordchars);
 	}
 }
 
@@ -192,50 +365,70 @@
 {
 	GKeyFile *config = g_key_file_new();
 	GKeyFile *config_home = g_key_file_new();
-	gchar *f0 = g_strconcat(app->datadir, G_DIR_SEPARATOR_S "filetypes.common", NULL);
-	gchar *f = g_strconcat(app->configdir, G_DIR_SEPARATOR_S GEANY_FILEDEFS_SUBDIR G_DIR_SEPARATOR_S "filetypes.common", NULL);
 
-	styleset_load_file(config, f0, G_KEY_FILE_KEEP_COMMENTS, NULL);
-	g_key_file_load_from_file(config_home, f, G_KEY_FILE_KEEP_COMMENTS, NULL);
+	load_keyfiles(config, config_home, "filetypes.common");
 
-	types[GEANY_FILETYPES_ALL] = g_new(style_set, 1);
-	styleset_get_hex(config, config_home, "styling", "selection", "0xc0c0c0", "0x7f0000", "false", types[GEANY_FILETYPES_ALL]->styling[0]);
-	styleset_get_hex(config, config_home, "styling", "brace_good", "0x000000", "0xffffff", "false", types[GEANY_FILETYPES_ALL]->styling[1]);
-	styleset_get_hex(config, config_home, "styling", "brace_bad", "0xff0000", "0xffffff", "false", types[GEANY_FILETYPES_ALL]->styling[2]);
-	styleset_get_hex(config, config_home, "styling", "margin_linenumber", "0x000000", "0xd0d0d0", "false", types[GEANY_FILETYPES_ALL]->styling[3]);
-	styleset_get_hex(config, config_home, "styling", "margin_folding", "0x000000", "0xdfdfdf", "false", types[GEANY_FILETYPES_ALL]->styling[4]);
-	styleset_get_hex(config, config_home, "styling", "current_line", "0x000000", "0xe5e5e5", "true", types[GEANY_FILETYPES_ALL]->styling[5]);
-	styleset_get_hex(config, config_home, "styling", "caret", "0x000000", "0x000000", "false", types[GEANY_FILETYPES_ALL]->styling[6]);
-	styleset_get_hex(config, config_home, "styling", "indent_guide", "0xc0c0c0", "0xffffff", "false", types[GEANY_FILETYPES_ALL]->styling[7]);
-	styleset_get_hex(config, config_home, "styling", "white_space", "0xc0c0c0", "0xffffff", "true", types[GEANY_FILETYPES_ALL]->styling[8]);
-	styleset_get_int(config, config_home, "styling", "folding_style", 1, 1, types[GEANY_FILETYPES_ALL]->styling[9]);
-	styleset_get_int(config, config_home, "styling", "invert_all", 0, 0, types[GEANY_FILETYPES_ALL]->styling[10]);
+	get_keyfile_hex(config, config_home, "styling", "selection",
+		"0xc0c0c0", "0x7f0000", "false", &common_style_set.styling[GCS_SELECTION]);
+	get_keyfile_hex(config, config_home, "styling", "brace_good",
+		"0x000000", "0xffffff", "false", &common_style_set.styling[GCS_BRACE_GOOD]);
+	get_keyfile_hex(config, config_home, "styling", "brace_bad",
+		"0xff0000", "0xffffff", "false", &common_style_set.styling[GCS_BRACE_BAD]);
+	get_keyfile_hex(config, config_home, "styling", "margin_linenumber",
+		"0x000000", "0xd0d0d0", "false", &common_style_set.styling[GCS_MARGIN_LINENUMBER]);
+	get_keyfile_hex(config, config_home, "styling", "margin_folding",
+		"0x000000", "0xdfdfdf", "false", &common_style_set.styling[GCS_MARGIN_FOLDING]);
+	get_keyfile_hex(config, config_home, "styling", "current_line",
+		"0x000000", "0xe5e5e5", "true", &common_style_set.styling[GCS_CURRENT_LINE]);
+	get_keyfile_hex(config, config_home, "styling", "caret",
+		"0x000000", "0x000000", "false", &common_style_set.styling[GCS_CARET]);
+	get_keyfile_hex(config, config_home, "styling", "indent_guide",
+		"0xc0c0c0", "0xffffff", "false", &common_style_set.styling[GCS_INDENT_GUIDE]);
+	get_keyfile_hex(config, config_home, "styling", "white_space",
+		"0xc0c0c0", "0xffffff", "true", &common_style_set.styling[GCS_WHITE_SPACE]);
+	{
+		// hack because get_keyfile_int uses a Style struct
+		Style tmp_style;
+		get_keyfile_int(config, config_home, "styling", "folding_style",
+			1, 1, &tmp_style);
+		common_style_set.folding_style.marker = tmp_style.foreground;
+		common_style_set.folding_style.lines = tmp_style.background;
+		get_keyfile_int(config, config_home, "styling", "invert_all",
+			0, 0, &tmp_style);
+		common_style_set.invert_all = tmp_style.foreground;
+	}
 
-	types[GEANY_FILETYPES_ALL]->keywords = NULL;
-	styleset_get_wordchars(config, config_home, GEANY_FILETYPES_ALL, GEANY_WORDCHARS);
+	get_keyfile_wordchars(config, config_home, GEANY_WORDCHARS, &common_style_set.wordchars);
 	filetypes_get_config(config, config_home, GEANY_FILETYPES_ALL);
 
 	g_key_file_free(config);
 	g_key_file_free(config_home);
-	g_free(f0);
-	g_free(f);
 }
 
 
 void styleset_common(ScintillaObject *sci, gint style_bits)
 {
-	if (types[GEANY_FILETYPES_ALL] == NULL) styleset_common_init();
+	static gboolean common_style_set_valid = FALSE;
 
+	if (! common_style_set_valid)
+	{
+		styleset_common_init();
+		// As styleset_common is called first for all file types before they are used,
+		// we can init their pointers to NULL here.
+		init_styles();
+		common_style_set_valid = TRUE;
+	}
+
 	SSM(sci, SCI_STYLECLEARALL, 0, 0);
 
 	SSM(sci, SCI_SETUSETABS, TRUE, 0);
 
 	// caret colour
-	SSM(sci, SCI_SETCARETFORE, invert(types[GEANY_FILETYPES_ALL]->styling[6][0]), 0);
+	SSM(sci, SCI_SETCARETFORE, invert(common_style_set.styling[GCS_CARET].foreground), 0);
 
 	// colourize the current line
-	SSM(sci, SCI_SETCARETLINEBACK, invert(types[GEANY_FILETYPES_ALL]->styling[5][1]), 0);
-	SSM(sci, SCI_SETCARETLINEVISIBLE, types[GEANY_FILETYPES_ALL]->styling[5][2], 0);
+	SSM(sci, SCI_SETCARETLINEBACK, invert(common_style_set.styling[GCS_CURRENT_LINE].background), 0);
+	SSM(sci, SCI_SETCARETLINEVISIBLE, common_style_set.styling[GCS_CURRENT_LINE].bold, 0);	// bold=enable current line
 
 	// indicator settings
 	SSM(sci, SCI_INDICSETSTYLE, 2, INDIC_SQUIGGLE);
@@ -260,7 +453,7 @@
 	SSM(sci, SCI_SETFOLDFLAGS, 0, 0);
 
 	// choose the folding style - boxes or circles, I prefer boxes, so it is default ;-)
-	switch (types[GEANY_FILETYPES_ALL]->styling[9][0])
+	switch (common_style_set.folding_style.marker)
 	{
 		case 2:
 		{
@@ -281,7 +474,7 @@
 	}
 
 	// choose the folding style - straight or curved, I prefer straight, so it is default ;-)
-	switch (types[GEANY_FILETYPES_ALL]->styling[9][1])
+	switch (common_style_set.folding_style.lines)
 	{
 		case 2:
 		{
@@ -321,27 +514,28 @@
 	SSM(sci, SCI_SETPROPERTY, (sptr_t) "fold.at.else", (sptr_t) "1");
 
 
-	// 3rd argument is whether to override default foreground selection
-	if (types[GEANY_FILETYPES_ALL]->styling[0][2])
-		SSM(sci, SCI_SETSELFORE, 1, invert(types[GEANY_FILETYPES_ALL]->styling[0][0]));
-	// 4th argument is whether to override default background selection
-	if (types[GEANY_FILETYPES_ALL]->styling[0][3])
-		SSM(sci, SCI_SETSELBACK, 1, invert(types[GEANY_FILETYPES_ALL]->styling[0][1]));
+	// bold (3rd argument) is whether to override default foreground selection
+	if (common_style_set.styling[GCS_SELECTION].bold)
+		SSM(sci, SCI_SETSELFORE, 1, invert(common_style_set.styling[GCS_SELECTION].foreground));
+	// italic (4th argument) is whether to override default background selection
+	if (common_style_set.styling[GCS_SELECTION].italic)
+		SSM(sci, SCI_SETSELBACK, 1, invert(common_style_set.styling[GCS_SELECTION].background));
 
 	SSM(sci, SCI_SETSTYLEBITS, style_bits, 0);
 
 
-	SSM(sci, SCI_SETFOLDMARGINCOLOUR, 1, invert(types[GEANY_FILETYPES_ALL]->styling[4][1]));
-	//SSM(sci, SCI_SETFOLDMARGINHICOLOUR, 1, invert(types[GEANY_FILETYPES_ALL]->styling[4][1]));
-	styleset_set_style(sci, STYLE_LINENUMBER, GEANY_FILETYPES_ALL, 3);
-	styleset_set_style(sci, STYLE_BRACELIGHT, GEANY_FILETYPES_ALL, 1);
-	styleset_set_style(sci, STYLE_BRACEBAD, GEANY_FILETYPES_ALL, 2);
-	styleset_set_style(sci, STYLE_INDENTGUIDE, GEANY_FILETYPES_ALL, 7);
+	SSM(sci, SCI_SETFOLDMARGINCOLOUR, 1, invert(common_style_set.styling[GCS_MARGIN_FOLDING].background));
+	//SSM(sci, SCI_SETFOLDMARGINHICOLOUR, 1, invert(common_style_set.styling[GCS_MARGIN_FOLDING].background));
+	set_sci_style(sci, STYLE_LINENUMBER, GEANY_FILETYPES_ALL, GCS_MARGIN_LINENUMBER);
+	set_sci_style(sci, STYLE_BRACELIGHT, GEANY_FILETYPES_ALL, GCS_BRACE_GOOD);
+	set_sci_style(sci, STYLE_BRACEBAD, GEANY_FILETYPES_ALL, GCS_BRACE_BAD);
+	set_sci_style(sci, STYLE_INDENTGUIDE, GEANY_FILETYPES_ALL, GCS_INDENT_GUIDE);
 
-	SSM(sci, SCI_SETWHITESPACEFORE, types[GEANY_FILETYPES_ALL]->styling[8][2],
-										invert(types[GEANY_FILETYPES_ALL]->styling[8][0]));
-	SSM(sci, SCI_SETWHITESPACEBACK, types[GEANY_FILETYPES_ALL]->styling[8][2],
-										invert(types[GEANY_FILETYPES_ALL]->styling[8][1]));
+	// bold = common whitespace settings enabled
+	SSM(sci, SCI_SETWHITESPACEFORE, common_style_set.styling[GCS_WHITE_SPACE].bold,
+		invert(common_style_set.styling[GCS_WHITE_SPACE].foreground));
+	SSM(sci, SCI_SETWHITESPACEBACK, common_style_set.styling[GCS_WHITE_SPACE].bold,
+		invert(common_style_set.styling[GCS_WHITE_SPACE].background));
 }
 
 
@@ -349,66 +543,53 @@
 {
 	GKeyFile *config = g_key_file_new();
 	GKeyFile *config_home = g_key_file_new();
-	gchar *f0 = g_strconcat(app->datadir, G_DIR_SEPARATOR_S "filetypes.c", NULL);
-	gchar *f = g_strconcat(app->configdir, G_DIR_SEPARATOR_S GEANY_FILEDEFS_SUBDIR G_DIR_SEPARATOR_S "filetypes.c", NULL);
 
-	styleset_load_file(config, f0, G_KEY_FILE_KEEP_COMMENTS, NULL);
-	g_key_file_load_from_file(config_home, f, G_KEY_FILE_KEEP_COMMENTS, NULL);
+	load_keyfiles(config, config_home, "filetypes.c");
 
-	types[GEANY_FILETYPES_C] = g_new(style_set, 1);
-	styleset_get_hex(config, config_home, "styling", "default", "0x000000", "0xffffff", "false", types[GEANY_FILETYPES_C]->styling[0]);
-	styleset_get_hex(config, config_home, "styling", "comment", "0xff0000", "0xffffff", "false", types[GEANY_FILETYPES_C]->styling[1]);
-	styleset_get_hex(config, config_home, "styling", "commentline", "0xff0000", "0xffffff", "false", types[GEANY_FILETYPES_C]->styling[2]);
-	styleset_get_hex(config, config_home, "styling", "commentdoc", "0xff0000", "0xffffff", "false", types[GEANY_FILETYPES_C]->styling[3]);
-	styleset_get_hex(config, config_home, "styling", "number", "0x007f00", "0xffffff", "false", types[GEANY_FILETYPES_C]->styling[4]);
-	styleset_get_hex(config, config_home, "styling", "word", "0x111199", "0xffffff", "true", types[GEANY_FILETYPES_C]->styling[5]);
-	styleset_get_hex(config, config_home, "styling", "word2", "0x7f0000", "0xffffff", "true", types[GEANY_FILETYPES_C]->styling[6]);
-	styleset_get_hex(config, config_home, "styling", "string", "0xff901e", "0xffffff", "false", types[GEANY_FILETYPES_C]->styling[7]);
-	styleset_get_hex(config, config_home, "styling", "character", "0xff901e", "0xffffff", "false", types[GEANY_FILETYPES_C]->styling[8]);
-	styleset_get_hex(config, config_home, "styling", "uuid", "0x404080", "0xffffff", "false", types[GEANY_FILETYPES_C]->styling[9]);
-	styleset_get_hex(config, config_home, "styling", "preprocessor", "0x007f7f", "0xffffff", "false", types[GEANY_FILETYPES_C]->styling[10]);
-	styleset_get_hex(config, config_home, "styling", "operator", "0x301010", "0xffffff", "false", types[GEANY_FILETYPES_C]->styling[11]);
-	styleset_get_hex(config, config_home, "styling", "identifier", "0x,00000", "0xffffff", "false", types[GEANY_FILETYPES_C]->styling[12]);
-	styleset_get_hex(config, config_home, "styling", "stringeol", "0x000000", "0xe0c0e0", "false", types[GEANY_FILETYPES_C]->styling[13]);
-	styleset_get_hex(config, config_home, "styling", "verbatim", "0x301010", "0xffffff", "false", types[GEANY_FILETYPES_C]->styling[14]);
-	styleset_get_hex(config, config_home, "styling", "regex", "0x105090", "0xffffff", "false", types[GEANY_FILETYPES_C]->styling[15]);
-	styleset_get_hex(config, config_home, "styling", "commentlinedoc", "0xff0000", "0xffffff", "true", types[GEANY_FILETYPES_C]->styling[16]);
-	styleset_get_hex(config, config_home, "styling", "commentdockeyword", "0xff0000", "0xffffff", "true", types[GEANY_FILETYPES_C]->styling[17]);
-	styleset_get_hex(config, config_home, "styling", "globalclass", "0x1111bb", "0xffffff", "true", types[GEANY_FILETYPES_C]->styling[18]);
-	styleset_get_int(config, config_home, "styling", "styling_within_preprocessor", 1, 0, types[GEANY_FILETYPES_C]->styling[19]);
+	new_style_array(GEANY_FILETYPES_C, 20);
+	get_keyfile_hex(config, config_home, "styling", "default", "0x000000", "0xffffff", "false", &style_sets[GEANY_FILETYPES_C].styling[0]);
+	get_keyfile_hex(config, config_home, "styling", "comment", "0xff0000", "0xffffff", "false", &style_sets[GEANY_FILETYPES_C].styling[1]);
+	get_keyfile_hex(config, config_home, "styling", "commentline", "0xff0000", "0xffffff", "false", &style_sets[GEANY_FILETYPES_C].styling[2]);
+	get_keyfile_hex(config, config_home, "styling", "commentdoc", "0xff0000", "0xffffff", "false", &style_sets[GEANY_FILETYPES_C].styling[3]);
+	get_keyfile_hex(config, config_home, "styling", "number", "0x007f00", "0xffffff", "false", &style_sets[GEANY_FILETYPES_C].styling[4]);
+	get_keyfile_hex(config, config_home, "styling", "word", "0x111199", "0xffffff", "true", &style_sets[GEANY_FILETYPES_C].styling[5]);
+	get_keyfile_hex(config, config_home, "styling", "word2", "0x7f0000", "0xffffff", "true", &style_sets[GEANY_FILETYPES_C].styling[6]);
+	get_keyfile_hex(config, config_home, "styling", "string", "0xff901e", "0xffffff", "false", &style_sets[GEANY_FILETYPES_C].styling[7]);
+	get_keyfile_hex(config, config_home, "styling", "character", "0xff901e", "0xffffff", "false", &style_sets[GEANY_FILETYPES_C].styling[8]);
+	get_keyfile_hex(config, config_home, "styling", "uuid", "0x404080", "0xffffff", "false", &style_sets[GEANY_FILETYPES_C].styling[9]);
+	get_keyfile_hex(config, config_home, "styling", "preprocessor", "0x007f7f", "0xffffff", "false", &style_sets[GEANY_FILETYPES_C].styling[10]);
+	get_keyfile_hex(config, config_home, "styling", "operator", "0x301010", "0xffffff", "false", &style_sets[GEANY_FILETYPES_C].styling[11]);
+	get_keyfile_hex(config, config_home, "styling", "identifier", "0x,00000", "0xffffff", "false", &style_sets[GEANY_FILETYPES_C].styling[12]);
+	get_keyfile_hex(config, config_home, "styling", "stringeol", "0x000000", "0xe0c0e0", "false", &style_sets[GEANY_FILETYPES_C].styling[13]);
+	get_keyfile_hex(config, config_home, "styling", "verbatim", "0x301010", "0xffffff", "false", &style_sets[GEANY_FILETYPES_C].styling[14]);
+	get_keyfile_hex(config, config_home, "styling", "regex", "0x105090", "0xffffff", "false", &style_sets[GEANY_FILETYPES_C].styling[15]);
+	get_keyfile_hex(config, config_home, "styling", "commentlinedoc", "0xff0000", "0xffffff", "true", &style_sets[GEANY_FILETYPES_C].styling[16]);
+	get_keyfile_hex(config, config_home, "styling", "commentdockeyword", "0xff0000", "0xffffff", "true", &style_sets[GEANY_FILETYPES_C].styling[17]);
+	get_keyfile_hex(config, config_home, "styling", "globalclass", "0x1111bb", "0xffffff", "true", &style_sets[GEANY_FILETYPES_C].styling[18]);
+	get_keyfile_int(config, config_home, "styling", "styling_within_preprocessor", 1, 0, &style_sets[GEANY_FILETYPES_C].styling[19]);
 
-	types[GEANY_FILETYPES_C]->keywords = g_new(gchar*, 3);
-	styleset_get_keywords(config, config_home, "keywords", "primary", GEANY_FILETYPES_C, 0, "if const struct char int float double void long for while do case switch return");
-	styleset_get_keywords(config, config_home, "keywords", "docComment", GEANY_FILETYPES_C, 1, "TODO FIXME");
-	types[GEANY_FILETYPES_C]->keywords[2] = NULL;
+	style_sets[GEANY_FILETYPES_C].keywords = g_new(gchar*, 3);
+	get_keyfile_keywords(config, config_home, "keywords", "primary", GEANY_FILETYPES_C, 0, "if const struct char int float double void long for while do case switch return");
+	get_keyfile_keywords(config, config_home, "keywords", "docComment", GEANY_FILETYPES_C, 1, "TODO FIXME");
+	style_sets[GEANY_FILETYPES_C].keywords[2] = NULL;
 
-	styleset_get_wordchars(config, config_home, GEANY_FILETYPES_C, GEANY_WORDCHARS);
+	get_keyfile_wordchars(config, config_home, GEANY_WORDCHARS,
+		&style_sets[GEANY_FILETYPES_C].wordchars);
 	filetypes_get_config(config, config_home, GEANY_FILETYPES_C);
 
 	g_key_file_free(config);
 	g_key_file_free(config_home);
-	g_free(f0);
-	g_free(f);
 
 	// load global tags file for C autocompletion
-	if (! app->ignore_global_tags && ! global_c_tags_loaded)
-	{
-		gchar *file = g_strconcat(app->datadir, G_DIR_SEPARATOR_S "global.tags", NULL);
-		// 0 is the langType used in TagManager (see the table in tagmanager/parsers.h)
-		tm_workspace_load_global_tags(file, 0);
-		global_c_tags_loaded = TRUE;
-		g_free(file);
-	}
+	ensure_tags_loaded(GTF_C, GLT_C);
 }
 
 
 void styleset_c(ScintillaObject *sci)
 {
-	if (types[GEANY_FILETYPES_C] == NULL) styleset_c_init();
-
 	styleset_common(sci, 5);
+	if (style_sets[GEANY_FILETYPES_C].styling == NULL) styleset_c_init();
 
-
 	/* Assign global keywords */
 	if ((app->tm_workspace) && (app->tm_workspace->global_tags))
 	{
@@ -431,46 +612,46 @@
 		g_ptr_array_free(g_typedefs, TRUE);
 	}
 
-	SSM(sci, SCI_SETWORDCHARS, 0, (sptr_t) types[GEANY_FILETYPES_C]->wordchars);
+	SSM(sci, SCI_SETWORDCHARS, 0, (sptr_t) style_sets[GEANY_FILETYPES_C].wordchars);
 	SSM(sci, SCI_AUTOCSETMAXHEIGHT, app->autocompletion_max_height, 0);
 
 	SSM(sci, SCI_SETLEXER, SCLEX_CPP, 0);
 
 	//SSM(sci, SCI_SETCONTROLCHARSYMBOL, 32, 0);
 
-	SSM(sci, SCI_SETKEYWORDS, 0, (sptr_t) types[GEANY_FILETYPES_C]->keywords[0]);
+	SSM(sci, SCI_SETKEYWORDS, 0, (sptr_t) style_sets[GEANY_FILETYPES_C].keywords[0]);
 	//SSM(sci, SCI_SETKEYWORDS, 1, (sptr_t) secondaryKeyWords);
-	SSM(sci, SCI_SETKEYWORDS, 2, (sptr_t) types[GEANY_FILETYPES_C]->keywords[1]);
+	SSM(sci, SCI_SETKEYWORDS, 2, (sptr_t) style_sets[GEANY_FILETYPES_C].keywords[1]);
 	//SSM(sci, SCI_SETKEYWORDS, 4, (sptr_t) typedefsKeyWords);
 
-	styleset_set_style(sci, STYLE_DEFAULT, GEANY_FILETYPES_C, 0);
-	styleset_set_style(sci, SCE_C_DEFAULT, GEANY_FILETYPES_C, 0);
-	styleset_set_style(sci, SCE_C_COMMENT, GEANY_FILETYPES_C, 1);
-	styleset_set_style(sci, SCE_C_COMMENTLINE, GEANY_FILETYPES_C, 2);
-	styleset_set_style(sci, SCE_C_COMMENTDOC, GEANY_FILETYPES_C, 3);
-	styleset_set_style(sci, SCE_C_NUMBER, GEANY_FILETYPES_C, 4);
-	styleset_set_style(sci, SCE_C_WORD, GEANY_FILETYPES_C, 5);
-	styleset_set_style(sci, SCE_C_WORD2, GEANY_FILETYPES_C, 6);
-	styleset_set_style(sci, SCE_C_STRING, GEANY_FILETYPES_C, 7);
-	styleset_set_style(sci, SCE_C_CHARACTER, GEANY_FILETYPES_C, 8);
-	styleset_set_style(sci, SCE_C_UUID, GEANY_FILETYPES_C, 9);
-	styleset_set_style(sci, SCE_C_PREPROCESSOR, GEANY_FILETYPES_C, 10);
-	styleset_set_style(sci, SCE_C_OPERATOR, GEANY_FILETYPES_C, 11);
-	styleset_set_style(sci, SCE_C_IDENTIFIER, GEANY_FILETYPES_C, 12);
-	styleset_set_style(sci, SCE_C_STRINGEOL, GEANY_FILETYPES_C, 13);
-	styleset_set_style(sci, SCE_C_VERBATIM, GEANY_FILETYPES_C, 14);
-	styleset_set_style(sci, SCE_C_REGEX, GEANY_FILETYPES_C, 15);
-	styleset_set_style(sci, SCE_C_COMMENTLINEDOC, GEANY_FILETYPES_C, 16);
-	styleset_set_style(sci, SCE_C_COMMENTDOCKEYWORD, GEANY_FILETYPES_C, 17);
+	set_sci_style(sci, STYLE_DEFAULT, GEANY_FILETYPES_C, 0);
+	set_sci_style(sci, SCE_C_DEFAULT, GEANY_FILETYPES_C, 0);
+	set_sci_style(sci, SCE_C_COMMENT, GEANY_FILETYPES_C, 1);
+	set_sci_style(sci, SCE_C_COMMENTLINE, GEANY_FILETYPES_C, 2);
+	set_sci_style(sci, SCE_C_COMMENTDOC, GEANY_FILETYPES_C, 3);
+	set_sci_style(sci, SCE_C_NUMBER, GEANY_FILETYPES_C, 4);
+	set_sci_style(sci, SCE_C_WORD, GEANY_FILETYPES_C, 5);
+	set_sci_style(sci, SCE_C_WORD2, GEANY_FILETYPES_C, 6);
+	set_sci_style(sci, SCE_C_STRING, GEANY_FILETYPES_C, 7);
+	set_sci_style(sci, SCE_C_CHARACTER, GEANY_FILETYPES_C, 8);
+	set_sci_style(sci, SCE_C_UUID, GEANY_FILETYPES_C, 9);
+	set_sci_style(sci, SCE_C_PREPROCESSOR, GEANY_FILETYPES_C, 10);
+	set_sci_style(sci, SCE_C_OPERATOR, GEANY_FILETYPES_C, 11);
+	set_sci_style(sci, SCE_C_IDENTIFIER, GEANY_FILETYPES_C, 12);
+	set_sci_style(sci, SCE_C_STRINGEOL, GEANY_FILETYPES_C, 13);
+	set_sci_style(sci, SCE_C_VERBATIM, GEANY_FILETYPES_C, 14);
+	set_sci_style(sci, SCE_C_REGEX, GEANY_FILETYPES_C, 15);
+	set_sci_style(sci, SCE_C_COMMENTLINEDOC, GEANY_FILETYPES_C, 16);
+	set_sci_style(sci, SCE_C_COMMENTDOCKEYWORD, GEANY_FILETYPES_C, 17);
 
 	SSM(sci, SCI_STYLESETFORE, SCE_C_COMMENTDOCKEYWORDERROR, invert(0x0000ff));
 	SSM(sci, SCI_STYLESETBACK, SCE_C_COMMENTDOCKEYWORDERROR, invert(0xFFFFFF));
 	SSM(sci, SCI_STYLESETITALIC, SCE_C_COMMENTDOCKEYWORDERROR, TRUE);
 
 	// is used for local structs and typedefs
-	styleset_set_style(sci, SCE_C_GLOBALCLASS, GEANY_FILETYPES_C, 18);
+	set_sci_style(sci, SCE_C_GLOBALCLASS, GEANY_FILETYPES_C, 18);
 
-	if (types[GEANY_FILETYPES_C]->styling[19][0] == 1)
+	if (style_sets[GEANY_FILETYPES_C].styling[19].foreground == 1)
 		SSM(sci, SCI_SETPROPERTY, (sptr_t) "styling.within.preprocessor", (sptr_t) "1");
 	SSM(sci, SCI_SETPROPERTY, (sptr_t) "preprocessor.symbol.$(file.patterns.cpp)", (sptr_t) "#");
 	SSM(sci, SCI_SETPROPERTY, (sptr_t) "preprocessor.start.$(file.patterns.cpp)", (sptr_t) "if ifdef ifndef");
@@ -483,66 +664,53 @@
 {
 	GKeyFile *config = g_key_file_new();
 	GKeyFile *config_home = g_key_file_new();
-	gchar *f0 = g_strconcat(app->datadir, G_DIR_SEPARATOR_S "filetypes.cpp", NULL);
-	gchar *f = g_strconcat(app->configdir, G_DIR_SEPARATOR_S GEANY_FILEDEFS_SUBDIR G_DIR_SEPARATOR_S "filetypes.cpp", NULL);
 
-	styleset_load_file(config, f0, G_KEY_FILE_KEEP_COMMENTS, NULL);
-	g_key_file_load_from_file(config_home, f, G_KEY_FILE_KEEP_COMMENTS, NULL);
+	load_keyfiles(config, config_home, "filetypes.cpp");
 
-	types[GEANY_FILETYPES_CPP] = g_new(style_set, 1);
-	styleset_get_hex(config, config_home, "styling", "default", "0x000000", "0xffffff", "false", types[GEANY_FILETYPES_CPP]->styling[0]);
-	styleset_get_hex(config, config_home, "styling", "comment", "0xff0000", "0xffffff", "false", types[GEANY_FILETYPES_CPP]->styling[1]);
-	styleset_get_hex(config, config_home, "styling", "commentline", "0xff0000", "0xffffff", "false", types[GEANY_FILETYPES_CPP]->styling[2]);
-	styleset_get_hex(config, config_home, "styling", "commentdoc", "0xff0000", "0xffffff", "false", types[GEANY_FILETYPES_CPP]->styling[3]);
-	styleset_get_hex(config, config_home, "styling", "number", "0x007f00", "0xffffff", "false", types[GEANY_FILETYPES_CPP]->styling[4]);
-	styleset_get_hex(config, config_home, "styling", "word", "0x00007f", "0xffffff", "true", types[GEANY_FILETYPES_CPP]->styling[5]);
-	styleset_get_hex(config, config_home, "styling", "word2", "0x991111", "0xffffff", "true", types[GEANY_FILETYPES_CPP]->styling[6]);
-	styleset_get_hex(config, config_home, "styling", "string", "0xff901e", "0xffffff", "false", types[GEANY_FILETYPES_CPP]->styling[7]);
-	styleset_get_hex(config, config_home, "styling", "character", "0xff901e", "0xffffff", "false", types[GEANY_FILETYPES_CPP]->styling[8]);
-	styleset_get_hex(config, config_home, "styling", "uuid", "0x404080", "0xffffff", "false", types[GEANY_FILETYPES_CPP]->styling[9]);
-	styleset_get_hex(config, config_home, "styling", "preprocessor", "0x007f7f", "0xffffff", "false", types[GEANY_FILETYPES_CPP]->styling[10]);
-	styleset_get_hex(config, config_home, "styling", "operator", "0x301010", "0xffffff", "false", types[GEANY_FILETYPES_CPP]->styling[11]);
-	styleset_get_hex(config, config_home, "styling", "identifier", "0x000000", "0xffffff", "false", types[GEANY_FILETYPES_CPP]->styling[12]);
-	styleset_get_hex(config, config_home, "styling", "stringeol", "0x000000", "0xe0c0e0", "false", types[GEANY_FILETYPES_CPP]->styling[13]);
-	styleset_get_hex(config, config_home, "styling", "verbatim", "0x101030", "0xffffff", "false", types[GEANY_FILETYPES_CPP]->styling[14]);
-	styleset_get_hex(config, config_home, "styling", "regex", "0x105090", "0xffffff", "false", types[GEANY_FILETYPES_CPP]->styling[15]);
-	styleset_get_hex(config, config_home, "styling", "commentlinedoc", "0xff0000", "0xffffff", "true", types[GEANY_FILETYPES_CPP]->styling[16]);
-	styleset_get_hex(config, config_home, "styling", "commentdockeyword", "0xff0000", "0xffffff", "true", types[GEANY_FILETYPES_CPP]->styling[17]);
-	styleset_get_hex(config, config_home, "styling", "globalclass", "0x1111bb", "0xffffff", "true", types[GEANY_FILETYPES_CPP]->styling[18]);
-	styleset_get_int(config, config_home, "styling", "styling_within_preprocessor", 1, 0, types[GEANY_FILETYPES_CPP]->styling[19]);
+	new_style_array(GEANY_FILETYPES_CPP, 20);
+	get_keyfile_hex(config, config_home, "styling", "default", "0x000000", "0xffffff", "false", &style_sets[GEANY_FILETYPES_CPP].styling[0]);
+	get_keyfile_hex(config, config_home, "styling", "comment", "0xff0000", "0xffffff", "false", &style_sets[GEANY_FILETYPES_CPP].styling[1]);
+	get_keyfile_hex(config, config_home, "styling", "commentline", "0xff0000", "0xffffff", "false", &style_sets[GEANY_FILETYPES_CPP].styling[2]);
+	get_keyfile_hex(config, config_home, "styling", "commentdoc", "0xff0000", "0xffffff", "false", &style_sets[GEANY_FILETYPES_CPP].styling[3]);
+	get_keyfile_hex(config, config_home, "styling", "number", "0x007f00", "0xffffff", "false", &style_sets[GEANY_FILETYPES_CPP].styling[4]);
+	get_keyfile_hex(config, config_home, "styling", "word", "0x00007f", "0xffffff", "true", &style_sets[GEANY_FILETYPES_CPP].styling[5]);
+	get_keyfile_hex(config, config_home, "styling", "word2", "0x991111", "0xffffff", "true", &style_sets[GEANY_FILETYPES_CPP].styling[6]);
+	get_keyfile_hex(config, config_home, "styling", "string", "0xff901e", "0xffffff", "false", &style_sets[GEANY_FILETYPES_CPP].styling[7]);
+	get_keyfile_hex(config, config_home, "styling", "character", "0xff901e", "0xffffff", "false", &style_sets[GEANY_FILETYPES_CPP].styling[8]);
+	get_keyfile_hex(config, config_home, "styling", "uuid", "0x404080", "0xffffff", "false", &style_sets[GEANY_FILETYPES_CPP].styling[9]);
+	get_keyfile_hex(config, config_home, "styling", "preprocessor", "0x007f7f", "0xffffff", "false", &style_sets[GEANY_FILETYPES_CPP].styling[10]);
+	get_keyfile_hex(config, config_home, "styling", "operator", "0x301010", "0xffffff", "false", &style_sets[GEANY_FILETYPES_CPP].styling[11]);
+	get_keyfile_hex(config, config_home, "styling", "identifier", "0x000000", "0xffffff", "false", &style_sets[GEANY_FILETYPES_CPP].styling[12]);
+	get_keyfile_hex(config, config_home, "styling", "stringeol", "0x000000", "0xe0c0e0", "false", &style_sets[GEANY_FILETYPES_CPP].styling[13]);
+	get_keyfile_hex(config, config_home, "styling", "verbatim", "0x101030", "0xffffff", "false", &style_sets[GEANY_FILETYPES_CPP].styling[14]);
+	get_keyfile_hex(config, config_home, "styling", "regex", "0x105090", "0xffffff", "false", &style_sets[GEANY_FILETYPES_CPP].styling[15]);
+	get_keyfile_hex(config, config_home, "styling", "commentlinedoc", "0xff0000", "0xffffff", "true", &style_sets[GEANY_FILETYPES_CPP].styling[16]);
+	get_keyfile_hex(config, config_home, "styling", "commentdockeyword", "0xff0000", "0xffffff", "true", &style_sets[GEANY_FILETYPES_CPP].styling[17]);
+	get_keyfile_hex(config, config_home, "styling", "globalclass", "0x1111bb", "0xffffff", "true", &style_sets[GEANY_FILETYPES_CPP].styling[18]);
+	get_keyfile_int(config, config_home, "styling", "styling_within_preprocessor", 1, 0, &style_sets[GEANY_FILETYPES_CPP].styling[19]);
 
-	types[GEANY_FILETYPES_CPP]->keywords = g_new(gchar*, 3);
-	styleset_get_keywords(config, config_home, "keywords", "primary", GEANY_FILETYPES_CPP, 0, "and and_eq asm auto bitand bitor bool break case catch char class compl const const_cast continue default delete do double dynamic_cast else enum explicit export extern false float for friend goto if inline int long mutable namespace new not not_eq operator or or_eq private protected public register reinterpret_cast return short signed sizeof static static_cast struct switch template this throw true try typedef typeid typename union unsigned using virtual void volatile wchar_t while xor xor_eq");
-	styleset_get_keywords(config, config_home, "keywords", "docComment", GEANY_FILETYPES_CPP, 1, "TODO FIXME");
-	types[GEANY_FILETYPES_CPP]->keywords[2] = NULL;
+	style_sets[GEANY_FILETYPES_CPP].keywords = g_new(gchar*, 3);
+	get_keyfile_keywords(config, config_home, "keywords", "primary", GEANY_FILETYPES_CPP, 0, "and and_eq asm auto bitand bitor bool break case catch char class compl const const_cast continue default delete do double dynamic_cast else enum explicit export extern false float for friend goto if inline int long mutable namespace new not not_eq operator or or_eq private protected public register reinterpret_cast return short signed sizeof static static_cast struct switch template this throw true try typedef typeid typename union unsigned using virtual void volatile wchar_t while xor xor_eq");
+	get_keyfile_keywords(config, config_home, "keywords", "docComment", GEANY_FILETYPES_CPP, 1, "TODO FIXME");
+	style_sets[GEANY_FILETYPES_CPP].keywords[2] = NULL;
 
-	styleset_get_wordchars(config, config_home, GEANY_FILETYPES_CPP, GEANY_WORDCHARS);
+	get_keyfile_wordchars(config, config_home, GEANY_WORDCHARS,
+		&style_sets[GEANY_FILETYPES_CPP].wordchars);
 	filetypes_get_config(config, config_home, GEANY_FILETYPES_CPP);
 
 	g_key_file_free(config);
 	g_key_file_free(config_home);
-	g_free(f0);
-	g_free(f);
 
 	// load global tags file for C autocompletion
-	if (! app->ignore_global_tags && ! global_c_tags_loaded)
-	{
-		gchar *file = g_strconcat(app->datadir, G_DIR_SEPARATOR_S "global.tags", NULL);
-		// 1 is the langType used in TagManager (see the table in tagmanager/parsers.h)
-		tm_workspace_load_global_tags(file, 1);
-		global_c_tags_loaded = TRUE;
-		g_free(file);
-	}
+	ensure_tags_loaded(GTF_C, GLT_CPP);
 }
 
 
 void styleset_cpp(ScintillaObject *sci)
 {
-	if (types[GEANY_FILETYPES_CPP] == NULL) styleset_cpp_init();
-
 	styleset_common(sci, 5);
+	if (style_sets[GEANY_FILETYPES_CPP].styling == NULL) styleset_cpp_init();
 
-
 	/* Assign global keywords */
 	if ((app->tm_workspace) && (app->tm_workspace->global_tags))
 	{
@@ -565,44 +733,44 @@
 		g_ptr_array_free(g_typedefs, TRUE);
 	}
 
-	SSM(sci, SCI_SETWORDCHARS, 0, (sptr_t) types[GEANY_FILETYPES_CPP]->wordchars);
+	SSM(sci, SCI_SETWORDCHARS, 0, (sptr_t) style_sets[GEANY_FILETYPES_CPP].wordchars);
 	SSM(sci, SCI_AUTOCSETMAXHEIGHT, app->autocompletion_max_height, 0);
 
 	SSM(sci, SCI_SETLEXER, SCLEX_CPP, 0);
 
 	//SSM(sci, SCI_SETCONTROLCHARSYMBOL, 32, 0);
 
-	SSM(sci, SCI_SETKEYWORDS, 0, (sptr_t) types[GEANY_FILETYPES_CPP]->keywords[0]);
-	SSM(sci, SCI_SETKEYWORDS, 2, (sptr_t) types[GEANY_FILETYPES_CPP]->keywords[1]);
+	SSM(sci, SCI_SETKEYWORDS, 0, (sptr_t) style_sets[GEANY_FILETYPES_CPP].keywords[0]);
+	SSM(sci, SCI_SETKEYWORDS, 2, (sptr_t) style_sets[GEANY_FILETYPES_CPP].keywords[1]);
 
-	styleset_set_style(sci, STYLE_DEFAULT, GEANY_FILETYPES_CPP, 0);
-	styleset_set_style(sci, SCE_C_DEFAULT, GEANY_FILETYPES_CPP, 0);
-	styleset_set_style(sci, SCE_C_COMMENT, GEANY_FILETYPES_CPP, 1);
-	styleset_set_style(sci, SCE_C_COMMENTLINE, GEANY_FILETYPES_CPP, 2);
-	styleset_set_style(sci, SCE_C_COMMENTDOC, GEANY_FILETYPES_CPP, 3);
-	styleset_set_style(sci, SCE_C_NUMBER, GEANY_FILETYPES_CPP, 4);
-	styleset_set_style(sci, SCE_C_WORD, GEANY_FILETYPES_CPP, 5);
-	styleset_set_style(sci, SCE_C_WORD2, GEANY_FILETYPES_CPP, 6);
-	styleset_set_style(sci, SCE_C_STRING, GEANY_FILETYPES_CPP, 7);
-	styleset_set_style(sci, SCE_C_CHARACTER, GEANY_FILETYPES_CPP, 8);
-	styleset_set_style(sci, SCE_C_UUID, GEANY_FILETYPES_CPP, 9);
-	styleset_set_style(sci, SCE_C_PREPROCESSOR, GEANY_FILETYPES_CPP, 10);
-	styleset_set_style(sci, SCE_C_OPERATOR, GEANY_FILETYPES_CPP, 11);
-	styleset_set_style(sci, SCE_C_IDENTIFIER, GEANY_FILETYPES_CPP, 12);
-	styleset_set_style(sci, SCE_C_STRINGEOL, GEANY_FILETYPES_CPP, 13);
-	styleset_set_style(sci, SCE_C_VERBATIM, GEANY_FILETYPES_CPP, 14);
-	styleset_set_style(sci, SCE_C_REGEX, GEANY_FILETYPES_CPP, 15);
-	styleset_set_style(sci, SCE_C_COMMENTLINEDOC, GEANY_FILETYPES_CPP, 16);
-	styleset_set_style(sci, SCE_C_COMMENTDOCKEYWORD, GEANY_FILETYPES_CPP, 17);
+	set_sci_style(sci, STYLE_DEFAULT, GEANY_FILETYPES_CPP, 0);
+	set_sci_style(sci, SCE_C_DEFAULT, GEANY_FILETYPES_CPP, 0);
+	set_sci_style(sci, SCE_C_COMMENT, GEANY_FILETYPES_CPP, 1);
+	set_sci_style(sci, SCE_C_COMMENTLINE, GEANY_FILETYPES_CPP, 2);
+	set_sci_style(sci, SCE_C_COMMENTDOC, GEANY_FILETYPES_CPP, 3);
+	set_sci_style(sci, SCE_C_NUMBER, GEANY_FILETYPES_CPP, 4);
+	set_sci_style(sci, SCE_C_WORD, GEANY_FILETYPES_CPP, 5);
+	set_sci_style(sci, SCE_C_WORD2, GEANY_FILETYPES_CPP, 6);
+	set_sci_style(sci, SCE_C_STRING, GEANY_FILETYPES_CPP, 7);
+	set_sci_style(sci, SCE_C_CHARACTER, GEANY_FILETYPES_CPP, 8);
+	set_sci_style(sci, SCE_C_UUID, GEANY_FILETYPES_CPP, 9);
+	set_sci_style(sci, SCE_C_PREPROCESSOR, GEANY_FILETYPES_CPP, 10);
+	set_sci_style(sci, SCE_C_OPERATOR, GEANY_FILETYPES_CPP, 11);
+	set_sci_style(sci, SCE_C_IDENTIFIER, GEANY_FILETYPES_CPP, 12);
+	set_sci_style(sci, SCE_C_STRINGEOL, GEANY_FILETYPES_CPP, 13);
+	set_sci_style(sci, SCE_C_VERBATIM, GEANY_FILETYPES_CPP, 14);
+	set_sci_style(sci, SCE_C_REGEX, GEANY_FILETYPES_CPP, 15);
+	set_sci_style(sci, SCE_C_COMMENTLINEDOC, GEANY_FILETYPES_CPP, 16);
+	set_sci_style(sci, SCE_C_COMMENTDOCKEYWORD, GEANY_FILETYPES_CPP, 17);
 
 	SSM(sci, SCI_STYLESETFORE, SCE_C_COMMENTDOCKEYWORDERROR, invert(0x0000ff));
 	SSM(sci, SCI_STYLESETBACK, SCE_C_COMMENTDOCKEYWORDERROR, invert(0xffffff));
 	SSM(sci, SCI_STYLESETITALIC, SCE_C_COMMENTDOCKEYWORDERROR, TRUE);
 
 	// is used for local structs and typedefs
-	styleset_set_style(sci, SCE_C_GLOBALCLASS, GEANY_FILETYPES_CPP, 18);
+	set_sci_style(sci, SCE_C_GLOBALCLASS, GEANY_FILETYPES_CPP, 18);
 
-	if (types[GEANY_FILETYPES_CPP]->styling[19][0] == 1)
+	if (style_sets[GEANY_FILETYPES_CPP].styling[19].foreground == 1)
 		SSM(sci, SCI_SETPROPERTY, (sptr_t) "styling.within.preprocessor", (sptr_t) "1");
 	SSM(sci, SCI_SETPROPERTY, (sptr_t) "preprocessor.symbol.$(file.patterns.cpp)", (sptr_t) "#");
 	SSM(sci, SCI_SETPROPERTY, (sptr_t) "preprocessor.start.$(file.patterns.cpp)", (sptr_t) "if ifdef ifndef");
@@ -615,77 +783,66 @@
 {
 	GKeyFile *config = g_key_file_new();
 	GKeyFile *config_home = g_key_file_new();
-	gchar *f0 = g_strconcat(app->datadir, G_DIR_SEPARATOR_S "filetypes.pascal", NULL);
-	gchar *f = g_strconcat(app->configdir, G_DIR_SEPARATOR_S GEANY_FILEDEFS_SUBDIR G_DIR_SEPARATOR_S "filetypes.pascal", NULL);
 
-	styleset_load_file(config, f0, G_KEY_FILE_KEEP_COMMENTS, NULL);
-	g_key_file_load_from_file(config_home, f, G_KEY_FILE_KEEP_COMMENTS, NULL);
+	load_keyfiles(config, config_home, "filetypes.pascal");
 
-	types[GEANY_FILETYPES_PASCAL] = g_new(style_set, 1);
-	styleset_get_hex(config, config_home, "styling", "default", "0x0000ff", "0xffffff", "false", types[GEANY_FILETYPES_PASCAL]->styling[0]);
-	styleset_get_hex(config, config_home, "styling", "comment", "0xff0000", "0xffffff", "false", types[GEANY_FILETYPES_PASCAL]->styling[1]);
-	styleset_get_hex(config, config_home, "styling", "number", "0x007F00", "0xffffff", "false", types[GEANY_FILETYPES_PASCAL]->styling[2]);
-	styleset_get_hex(config, config_home, "styling", "word", "0x111199", "0xffffff", "true", types[GEANY_FILETYPES_PASCAL]->styling[3]);
-	styleset_get_hex(config, config_home, "styling", "string", "0xff901e", "0xffffff", "false", types[GEANY_FILETYPES_PASCAL]->styling[4]);
-	styleset_get_hex(config, config_home, "styling", "character", "0x404000", "0xffffff", "false", types[GEANY_FILETYPES_PASCAL]->styling[5]);
-	styleset_get_hex(config, config_home, "styling", "preprocessor", "0x007f7f", "0xffffff", "false", types[GEANY_FILETYPES_PASCAL]->styling[6]);
-	styleset_get_hex(config, config_home, "styling", "operator", "0x301010", "0xffffff", "false", types[GEANY_FILETYPES_PASCAL]->styling[7]);
-	styleset_get_hex(config, config_home, "styling", "identifier", "0x000000", "0xffffff", "false", types[GEANY_FILETYPES_PASCAL]->styling[8]);
-	styleset_get_hex(config, config_home, "styling", "regex", "0x1b6313", "0xffffff", "false", types[GEANY_FILETYPES_PASCAL]->styling[9]);
-	styleset_get_hex(config, config_home, "styling", "commentline", "0xff0000", "0xffffff", "false", types[GEANY_FILETYPES_PASCAL]->styling[10]);
-	styleset_get_hex(config, config_home, "styling", "commentdoc", "0xff0000", "0xffffff", "false", types[GEANY_FILETYPES_PASCAL]->styling[11]);
+	new_style_array(GEANY_FILETYPES_PASCAL, 12);
+	get_keyfile_hex(config, config_home, "styling", "default", "0x0000ff", "0xffffff", "false", &style_sets[GEANY_FILETYPES_PASCAL].styling[0]);
+	get_keyfile_hex(config, config_home, "styling", "comment", "0xff0000", "0xffffff", "false", &style_sets[GEANY_FILETYPES_PASCAL].styling[1]);
+	get_keyfile_hex(config, config_home, "styling", "number", "0x007F00", "0xffffff", "false", &style_sets[GEANY_FILETYPES_PASCAL].styling[2]);
+	get_keyfile_hex(config, config_home, "styling", "word", "0x111199", "0xffffff", "true", &style_sets[GEANY_FILETYPES_PASCAL].styling[3]);
+	get_keyfile_hex(config, config_home, "styling", "string", "0xff901e", "0xffffff", "false", &style_sets[GEANY_FILETYPES_PASCAL].styling[4]);
+	get_keyfile_hex(config, config_home, "styling", "character", "0x404000", "0xffffff", "false", &style_sets[GEANY_FILETYPES_PASCAL].styling[5]);
+	get_keyfile_hex(config, config_home, "styling", "preprocessor", "0x007f7f", "0xffffff", "false", &style_sets[GEANY_FILETYPES_PASCAL].styling[6]);
+	get_keyfile_hex(config, config_home, "styling", "operator", "0x301010", "0xffffff", "false", &style_sets[GEANY_FILETYPES_PASCAL].styling[7]);
+	get_keyfile_hex(config, config_home, "styling", "identifier", "0x000000", "0xffffff", "false", &style_sets[GEANY_FILETYPES_PASCAL].styling[8]);
+	get_keyfile_hex(config, config_home, "styling", "regex", "0x1b6313", "0xffffff", "false", &style_sets[GEANY_FILETYPES_PASCAL].styling[9]);
+	get_keyfile_hex(config, config_home, "styling", "commentline", "0xff0000", "0xffffff", "false", &style_sets[GEANY_FILETYPES_PASCAL].styling[10]);
+	get_keyfile_hex(config, config_home, "styling", "commentdoc", "0xff0000", "0xffffff", "false", &style_sets[GEANY_FILETYPES_PASCAL].styling[11]);
 
-	types[GEANY_FILETYPES_PASCAL]->keywords = g_new(gchar*, 2);
-	styleset_get_keywords(config, config_home, "keywords", "primary", GEANY_FILETYPES_PASCAL, 0, "word integer char string byte real \
+	style_sets[GEANY_FILETYPES_PASCAL].keywords = g_new(gchar*, 2);
+	get_keyfile_keywords(config, config_home, "keywords", "primary", GEANY_FILETYPES_PASCAL, 0, "word integer char string byte real \
 									for to do until repeat program if uses then else case var begin end \
 									asm unit interface implementation procedure function object try class");
-	types[GEANY_FILETYPES_PASCAL]->keywords[1] = NULL;
+	style_sets[GEANY_FILETYPES_PASCAL].keywords[1] = NULL;
 
-	styleset_get_wordchars(config, config_home, GEANY_FILETYPES_PASCAL, GEANY_WORDCHARS);
+	get_keyfile_wordchars(config, config_home, GEANY_WORDCHARS,
+		&style_sets[GEANY_FILETYPES_PASCAL].wordchars);
 	filetypes_get_config(config, config_home, GEANY_FILETYPES_PASCAL);
 
 	// load global tags file for PASCAL autocompletion
-	if (! app->ignore_global_tags && ! global_pascal_tags_loaded)
-	{
-		gchar *file = g_strconcat(app->datadir, G_DIR_SEPARATOR_S "pascal.tags", NULL);
-		tm_workspace_load_global_tags(file, 4);
-		global_pascal_tags_loaded = TRUE;
-		g_free(file);
-	}
+	ensure_tags_loaded(GTF_PASCAL, GLT_PASCAL);
 
 	g_key_file_free(config);
 	g_key_file_free(config_home);
-	g_free(f0);
-	g_free(f);
 }
 
 
 void styleset_pascal(ScintillaObject *sci)
 {
-	if (types[GEANY_FILETYPES_PASCAL] == NULL) styleset_pascal_init();
-
 	styleset_common(sci, 5);
+	if (style_sets[GEANY_FILETYPES_PASCAL].styling == NULL) styleset_pascal_init();
 
-	SSM (sci, SCI_SETWORDCHARS, 0, (sptr_t) types[GEANY_FILETYPES_PASCAL]->wordchars);
+	SSM (sci, SCI_SETWORDCHARS, 0, (sptr_t) style_sets[GEANY_FILETYPES_PASCAL].wordchars);
 	SSM(sci, SCI_AUTOCSETMAXHEIGHT, app->autocompletion_max_height, 0);
 
 	SSM (sci, SCI_SETLEXER, SCLEX_PASCAL, 0);
 
-	SSM(sci, SCI_SETKEYWORDS, 0, (sptr_t) types[GEANY_FILETYPES_PASCAL]->keywords[0]);
+	SSM(sci, SCI_SETKEYWORDS, 0, (sptr_t) style_sets[GEANY_FILETYPES_PASCAL].keywords[0]);
 
-	styleset_set_style(sci, STYLE_DEFAULT, GEANY_FILETYPES_PASCAL, 0);
-	styleset_set_style(sci, SCE_C_DEFAULT, GEANY_FILETYPES_PASCAL, 0);
-	styleset_set_style(sci, SCE_C_COMMENT, GEANY_FILETYPES_PASCAL, 1);
-	styleset_set_style(sci, SCE_C_NUMBER, GEANY_FILETYPES_PASCAL, 2);
-	styleset_set_style(sci, SCE_C_WORD, GEANY_FILETYPES_PASCAL, 3);
-	styleset_set_style(sci, SCE_C_STRING, GEANY_FILETYPES_PASCAL, 4);
-	styleset_set_style(sci, SCE_C_CHARACTER, GEANY_FILETYPES_PASCAL, 5);
-	styleset_set_style(sci, SCE_C_PREPROCESSOR, GEANY_FILETYPES_PASCAL, 6);
-	styleset_set_style(sci, SCE_C_OPERATOR, GEANY_FILETYPES_PASCAL, 7);
-	styleset_set_style(sci, SCE_C_IDENTIFIER, GEANY_FILETYPES_PASCAL, 8);
-	styleset_set_style(sci, SCE_C_REGEX, GEANY_FILETYPES_PASCAL, 9);
-	styleset_set_style(sci, SCE_C_COMMENTLINE, GEANY_FILETYPES_PASCAL, 10);
-	styleset_set_style(sci, SCE_C_COMMENTDOC, GEANY_FILETYPES_PASCAL, 11);
+	set_sci_style(sci, STYLE_DEFAULT, GEANY_FILETYPES_PASCAL, 0);
+	set_sci_style(sci, SCE_C_DEFAULT, GEANY_FILETYPES_PASCAL, 0);
+	set_sci_style(sci, SCE_C_COMMENT, GEANY_FILETYPES_PASCAL, 1);
+	set_sci_style(sci, SCE_C_NUMBER, GEANY_FILETYPES_PASCAL, 2);
+	set_sci_style(sci, SCE_C_WORD, GEANY_FILETYPES_PASCAL, 3);
+	set_sci_style(sci, SCE_C_STRING, GEANY_FILETYPES_PASCAL, 4);
+	set_sci_style(sci, SCE_C_CHARACTER, GEANY_FILETYPES_PASCAL, 5);
+	set_sci_style(sci, SCE_C_PREPROCESSOR, GEANY_FILETYPES_PASCAL, 6);
+	set_sci_style(sci, SCE_C_OPERATOR, GEANY_FILETYPES_PASCAL, 7);
+	set_sci_style(sci, SCE_C_IDENTIFIER, GEANY_FILETYPES_PASCAL, 8);
+	set_sci_style(sci, SCE_C_REGEX, GEANY_FILETYPES_PASCAL, 9);
+	set_sci_style(sci, SCE_C_COMMENTLINE, GEANY_FILETYPES_PASCAL, 10);
+	set_sci_style(sci, SCE_C_COMMENTDOC, GEANY_FILETYPES_PASCAL, 11);
 
 	//SSM(sci, SCI_SETPROPERTY, (sptr_t) "styling.within.preprocessor", (sptr_t) "1");
 }
@@ -695,50 +852,45 @@
 {
 	GKeyFile *config = g_key_file_new();
 	GKeyFile *config_home = g_key_file_new();
-	gchar *f0 = g_strconcat(app->datadir, G_DIR_SEPARATOR_S "filetypes.makefile", NULL);
-	gchar *f = g_strconcat(app->configdir, G_DIR_SEPARATOR_S GEANY_FILEDEFS_SUBDIR G_DIR_SEPARATOR_S "filetypes.makefile", NULL);
 
-	styleset_load_file(config, f0, G_KEY_FILE_KEEP_COMMENTS, NULL);
-	g_key_file_load_from_file(config_home, f, G_KEY_FILE_KEEP_COMMENTS, NULL);
+	load_keyfiles(config, config_home, "filetypes.makefile");
 
-	types[GEANY_FILETYPES_MAKE] = g_new(style_set, 1);
-	styleset_get_hex(config, config_home, "styling", "default", "0x00002f", "0xffffff", "false", types[GEANY_FILETYPES_MAKE]->styling[0]);
-	styleset_get_hex(config, config_home, "styling", "comment", "0xff0000", "0xffffff", "false", types[GEANY_FILETYPES_MAKE]->styling[1]);
-	styleset_get_hex(config, config_home, "styling", "preprocessor", "0x007f7f", "0xffffff", "false", types[GEANY_FILETYPES_MAKE]->styling[2]);
-	styleset_get_hex(config, config_home, "styling", "identifier", "0x007f00", "0xffffff", "false", types[GEANY_FILETYPES_MAKE]->styling[3]);
-	styleset_get_hex(config, config_home, "styling", "operator", "0x301010", "0xffffff", "false", types[GEANY_FILETYPES_MAKE]->styling[4]);
-	styleset_get_hex(config, config_home, "styling", "target", "0x0000ff", "0xffffff", "false", types[GEANY_FILETYPES_MAKE]->styling[5]);
-	styleset_get_hex(config, config_home, "styling", "ideol", "0x008000", "0xffffff", "false", types[GEANY_FILETYPES_MAKE]->styling[6]);
+	new_style_array(GEANY_FILETYPES_MAKE, 7);
+	get_keyfile_hex(config, config_home, "styling", "default", "0x00002f", "0xffffff", "false", &style_sets[GEANY_FILETYPES_MAKE].styling[0]);
+	get_keyfile_hex(config, config_home, "styling", "comment", "0xff0000", "0xffffff", "false", &style_sets[GEANY_FILETYPES_MAKE].styling[1]);
+	get_keyfile_hex(config, config_home, "styling", "preprocessor", "0x007f7f", "0xffffff", "false", &style_sets[GEANY_FILETYPES_MAKE].styling[2]);
+	get_keyfile_hex(config, config_home, "styling", "identifier", "0x007f00", "0xffffff", "false", &style_sets[GEANY_FILETYPES_MAKE].styling[3]);
+	get_keyfile_hex(config, config_home, "styling", "operator", "0x301010", "0xffffff", "false", &style_sets[GEANY_FILETYPES_MAKE].styling[4]);
+	get_keyfile_hex(config, config_home, "styling", "target", "0x0000ff", "0xffffff", "false", &style_sets[GEANY_FILETYPES_MAKE].styling[5]);
+	get_keyfile_hex(config, config_home, "styling", "ideol", "0x008000", "0xffffff", "false", &style_sets[GEANY_FILETYPES_MAKE].styling[6]);
 
-	types[GEANY_FILETYPES_MAKE]->keywords = NULL;
+	style_sets[GEANY_FILETYPES_MAKE].keywords = NULL;
 
-	styleset_get_wordchars(config, config_home, GEANY_FILETYPES_MAKE, GEANY_WORDCHARS);
+	get_keyfile_wordchars(config, config_home, GEANY_WORDCHARS,
+		&style_sets[GEANY_FILETYPES_MAKE].wordchars);
 	filetypes_get_config(config, config_home, GEANY_FILETYPES_MAKE);
 
 	g_key_file_free(config);
 	g_key_file_free(config_home);
-	g_free(f0);
-	g_free(f);
 }
 
 
 void styleset_makefile(ScintillaObject *sci)
 {
-	if (types[GEANY_FILETYPES_MAKE] == NULL) styleset_makefile_init();
-
 	styleset_common(sci, 5);
+	if (style_sets[GEANY_FILETYPES_MAKE].styling == NULL) styleset_makefile_init();
 
 	SSM (sci, SCI_SETLEXER, SCLEX_MAKEFILE, 0);
-	SSM (sci, SCI_SETWORDCHARS, 0, (sptr_t) types[GEANY_FILETYPES_MAKE]->wordchars);
+	SSM (sci, SCI_SETWORDCHARS, 0, (sptr_t) style_sets[GEANY_FILETYPES_MAKE].wordchars);
 
-	styleset_set_style(sci, STYLE_DEFAULT, GEANY_FILETYPES_MAKE, 0);
-	styleset_set_style(sci, SCE_MAKE_DEFAULT, GEANY_FILETYPES_MAKE, 0);
-	styleset_set_style(sci, SCE_MAKE_COMMENT, GEANY_FILETYPES_MAKE, 1);
-	styleset_set_style(sci, SCE_MAKE_PREPROCESSOR, GEANY_FILETYPES_MAKE, 2);
-	styleset_set_style(sci, SCE_MAKE_IDENTIFIER, GEANY_FILETYPES_MAKE, 3);
-	styleset_set_style(sci, SCE_MAKE_OPERATOR, GEANY_FILETYPES_MAKE, 4);
-	styleset_set_style(sci, SCE_MAKE_TARGET, GEANY_FILETYPES_MAKE, 5);
-	styleset_set_style(sci, SCE_MAKE_IDEOL, GEANY_FILETYPES_MAKE, 6);
+	set_sci_style(sci, STYLE_DEFAULT, GEANY_FILETYPES_MAKE, 0);
+	set_sci_style(sci, SCE_MAKE_DEFAULT, GEANY_FILETYPES_MAKE, 0);
+	set_sci_style(sci, SCE_MAKE_COMMENT, GEANY_FILETYPES_MAKE, 1);
+	set_sci_style(sci, SCE_MAKE_PREPROCESSOR, GEANY_FILETYPES_MAKE, 2);
+	set_sci_style(sci, SCE_MAKE_IDENTIFIER, GEANY_FILETYPES_MAKE, 3);
+	set_sci_style(sci, SCE_MAKE_OPERATOR, GEANY_FILETYPES_MAKE, 4);
+	set_sci_style(sci, SCE_MAKE_TARGET, GEANY_FILETYPES_MAKE, 5);
+	set_sci_style(sci, SCE_MAKE_IDEOL, GEANY_FILETYPES_MAKE, 6);
 }
 
 
@@ -746,51 +898,46 @@
 {
 	GKeyFile *config = g_key_file_new();
 	GKeyFile *config_home = g_key_file_new();
-	gchar *f0 = g_strconcat(app->datadir, G_DIR_SEPARATOR_S "filetypes.diff", NULL);
-	gchar *f = g_strconcat(app->configdir, G_DIR_SEPARATOR_S GEANY_FILEDEFS_SUBDIR G_DIR_SEPARATOR_S "filetypes.diff", NULL);
 
-	styleset_load_file(config, f0, G_KEY_FILE_KEEP_COMMENTS, NULL);
-	g_key_file_load_from_file(config_home, f, G_KEY_FILE_KEEP_COMMENTS, NULL);
+	load_keyfiles(config, config_home, "filetypes.diff");
 
-	types[GEANY_FILETYPES_DIFF] = g_new(style_set, 1);
-	styleset_get_hex(config, config_home, "styling", "default", "0x000000", "0xffffff", "false", types[GEANY_FILETYPES_DIFF]->styling[0]);
-	styleset_get_hex(config, config_home, "styling", "comment", "0x808080", "0xffffff", "false", types[GEANY_FILETYPES_DIFF]->styling[1]);
-	styleset_get_hex(config, config_home, "styling", "command", "0x7f7f00", "0xffffff", "false", types[GEANY_FILETYPES_DIFF]->styling[2]);
-	styleset_get_hex(config, config_home, "styling", "header", "0x7f0000", "0xffffff", "false", types[GEANY_FILETYPES_DIFF]->styling[3]);
-	styleset_get_hex(config, config_home, "styling", "position", "0x00007f", "0xffffff", "false", types[GEANY_FILETYPES_DIFF]->styling[4]);
-	styleset_get_hex(config, config_home, "styling", "deleted", "0xff2727", "0xffffff", "false", types[GEANY_FILETYPES_DIFF]->styling[5]);
-	styleset_get_hex(config, config_home, "styling", "added", "0x34b034", "0xffffff", "false", types[GEANY_FILETYPES_DIFF]->styling[6]);
+	new_style_array(GEANY_FILETYPES_DIFF, 7);
+	get_keyfile_hex(config, config_home, "styling", "default", "0x000000", "0xffffff", "false", &style_sets[GEANY_FILETYPES_DIFF].styling[0]);
+	get_keyfile_hex(config, config_home, "styling", "comment", "0x808080", "0xffffff", "false", &style_sets[GEANY_FILETYPES_DIFF].styling[1]);
+	get_keyfile_hex(config, config_home, "styling", "command", "0x7f7f00", "0xffffff", "false", &style_sets[GEANY_FILETYPES_DIFF].styling[2]);
+	get_keyfile_hex(config, config_home, "styling", "header", "0x7f0000", "0xffffff", "false", &style_sets[GEANY_FILETYPES_DIFF].styling[3]);
+	get_keyfile_hex(config, config_home, "styling", "position", "0x00007f", "0xffffff", "false", &style_sets[GEANY_FILETYPES_DIFF].styling[4]);
+	get_keyfile_hex(config, config_home, "styling", "deleted", "0xff2727", "0xffffff", "false", &style_sets[GEANY_FILETYPES_DIFF].styling[5]);
+	get_keyfile_hex(config, config_home, "styling", "added", "0x34b034", "0xffffff", "false", &style_sets[GEANY_FILETYPES_DIFF].styling[6]);
 
-	types[GEANY_FILETYPES_DIFF]->keywords = NULL;
+	style_sets[GEANY_FILETYPES_DIFF].keywords = NULL;
 
-	styleset_get_wordchars(config, config_home, GEANY_FILETYPES_DIFF, GEANY_WORDCHARS);
+	get_keyfile_wordchars(config, config_home, GEANY_WORDCHARS,
+		&style_sets[GEANY_FILETYPES_DIFF].wordchars);
 	filetypes_get_config(config, config_home, GEANY_FILETYPES_DIFF);
 
 	g_key_file_free(config);
 	g_key_file_free(config_home);
-	g_free(f0);
-	g_free(f);
 }
 
 
 void styleset_diff(ScintillaObject *sci)
 {
-	if (types[GEANY_FILETYPES_DIFF] == NULL) styleset_diff_init();
-
 	styleset_common(sci, 5);
+	if (style_sets[GEANY_FILETYPES_DIFF].styling == NULL) styleset_diff_init();
 
 	SSM (sci, SCI_SETLEXER, SCLEX_DIFF, 0);
 
-	SSM(sci, SCI_SETWORDCHARS, 0, (sptr_t) types[GEANY_FILETYPES_DIFF]->wordchars);
+	SSM(sci, SCI_SETWORDCHARS, 0, (sptr_t) style_sets[GEANY_FILETYPES_DIFF].wordchars);
 
-	styleset_set_style(sci, STYLE_DEFAULT, GEANY_FILETYPES_DIFF, 0);
-	styleset_set_style(sci, SCE_DIFF_DEFAULT, GEANY_FILETYPES_DIFF, 0);
-	styleset_set_style(sci, SCE_DIFF_COMMENT, GEANY_FILETYPES_DIFF, 1);
-	styleset_set_style(sci, SCE_DIFF_COMMAND, GEANY_FILETYPES_DIFF, 2);
-	styleset_set_style(sci, SCE_DIFF_HEADER, GEANY_FILETYPES_DIFF, 3);
-	styleset_set_style(sci, SCE_DIFF_POSITION, GEANY_FILETYPES_DIFF, 4);
-	styleset_set_style(sci, SCE_DIFF_DELETED, GEANY_FILETYPES_DIFF, 5);
-	styleset_set_style(sci, SCE_DIFF_ADDED, GEANY_FILETYPES_DIFF, 6);
+	set_sci_style(sci, STYLE_DEFAULT, GEANY_FILETYPES_DIFF, 0);
+	set_sci_style(sci, SCE_DIFF_DEFAULT, GEANY_FILETYPES_DIFF, 0);
+	set_sci_style(sci, SCE_DIFF_COMMENT, GEANY_FILETYPES_DIFF, 1);
+	set_sci_style(sci, SCE_DIFF_COMMAND, GEANY_FILETYPES_DIFF, 2);
+	set_sci_style(sci, SCE_DIFF_HEADER, GEANY_FILETYPES_DIFF, 3);
+	set_sci_style(sci, SCE_DIFF_POSITION, GEANY_FILETYPES_DIFF, 4);
+	set_sci_style(sci, SCE_DIFF_DELETED, GEANY_FILETYPES_DIFF, 5);
+	set_sci_style(sci, SCE_DIFF_ADDED, GEANY_FILETYPES_DIFF, 6);
 }
 
 
@@ -798,60 +945,48 @@
 {
 	GKeyFile *config = g_key_file_new();
 	GKeyFile *config_home = g_key_file_new();
-	gchar *f0 = g_strconcat(app->datadir, G_DIR_SEPARATOR_S "filetypes.latex", NULL);
-	gchar *f = g_strconcat(app->configdir, G_DIR_SEPARATOR_S GEANY_FILEDEFS_SUBDIR G_DIR_SEPARATOR_S "filetypes.latex", NULL);
 
-	styleset_load_file(config, f0, G_KEY_FILE_KEEP_COMMENTS, NULL);
-	g_key_file_load_from_file(config_home, f, G_KEY_FILE_KEEP_COMMENTS, NULL);
+	load_keyfiles(config, config_home, "filetypes.latex");
 
-	types[GEANY_FILETYPES_LATEX] = g_new(style_set, 1);
-	styleset_get_hex(config, config_home, "styling", "default", "0x00002f", "0xffffff", "false", types[GEANY_FILETYPES_LATEX]->styling[0]);
-	styleset_get_hex(config, config_home, "styling", "command", "0xff0000", "0xffffff", "true", types[GEANY_FILETYPES_LATEX]->styling[1]);
-	styleset_get_hex(config, config_home, "styling", "tag", "0x007f7f", "0xffffff", "true", types[GEANY_FILETYPES_LATEX]->styling[2]);
-	styleset_get_hex(config, config_home, "styling", "math", "0x007f00", "0xffffff", "false", types[GEANY_FILETYPES_LATEX]->styling[3]);
-	styleset_get_hex(config, config_home, "styling", "comment", "0x007f00", "0xffffff", "false", types[GEANY_FILETYPES_LATEX]->styling[4]);
+	new_style_array(GEANY_FILETYPES_LATEX, 5);
+	get_keyfile_hex(config, config_home, "styling", "default", "0x00002f", "0xffffff", "false", &style_sets[GEANY_FILETYPES_LATEX].styling[0]);
+	get_keyfile_hex(config, config_home, "styling", "command", "0xff0000", "0xffffff", "true", &style_sets[GEANY_FILETYPES_LATEX].styling[1]);
+	get_keyfile_hex(config, config_home, "styling", "tag", "0x007f7f", "0xffffff", "true", &style_sets[GEANY_FILETYPES_LATEX].styling[2]);
+	get_keyfile_hex(config, config_home, "styling", "math", "0x007f00", "0xffffff", "false", &style_sets[GEANY_FILETYPES_LATEX].styling[3]);
+	get_keyfile_hex(config, config_home, "styling", "comment", "0x007f00", "0xffffff", "false", &style_sets[GEANY_FILETYPES_LATEX].styling[4]);
 
-	types[GEANY_FILETYPES_LATEX]->keywords = g_new(gchar*, 2);
-	styleset_get_keywords(config, config_home, "keywords", "primary", GEANY_FILETYPES_LATEX, 0, "section subsection begin item");
-	types[GEANY_FILETYPES_LATEX]->keywords[1] = NULL;
+	style_sets[GEANY_FILETYPES_LATEX].keywords = g_new(gchar*, 2);
+	get_keyfile_keywords(config, config_home, "keywords", "primary", GEANY_FILETYPES_LATEX, 0, "section subsection begin item");
+	style_sets[GEANY_FILETYPES_LATEX].keywords[1] = NULL;
 
-	styleset_get_wordchars(config, config_home, GEANY_FILETYPES_LATEX, GEANY_WORDCHARS);
+	get_keyfile_wordchars(config, config_home, GEANY_WORDCHARS,
+		&style_sets[GEANY_FILETYPES_LATEX].wordchars);
 	filetypes_get_config(config, config_home, GEANY_FILETYPES_LATEX);
 
 	// load global tags file for LaTeX autocompletion
-	if (! app->ignore_global_tags && ! global_latex_tags_loaded)
-	{
-		gchar *file = g_strconcat(app->datadir, G_DIR_SEPARATOR_S "latex.tags", NULL);
-		// 8 is the langType used in TagManager (see the table in tagmanager/parsers.h)
-		tm_workspace_load_global_tags(file, 8);
-		global_latex_tags_loaded = TRUE;
-		g_free(file);
-	}
+	ensure_tags_loaded(GTF_LATEX, GLT_LATEX);
 
 	g_key_file_free(config);
 	g_key_file_free(config_home);
-	g_free(f0);
-	g_free(f);
 }
 
 
 void styleset_latex(ScintillaObject *sci)
 {
-	if (types[GEANY_FILETYPES_LATEX] == NULL) styleset_latex_init();
-
 	styleset_common(sci, 5);
+	if (style_sets[GEANY_FILETYPES_LATEX].styling == NULL) styleset_latex_init();
 
 	SSM (sci, SCI_SETLEXER, SCLEX_LATEX, 0);
 
-	SSM(sci, SCI_SETKEYWORDS, 0, (sptr_t) types[GEANY_FILETYPES_LATEX]->keywords[0]);
-	SSM(sci, SCI_SETWORDCHARS, 0, (sptr_t) types[GEANY_FILETYPES_LATEX]->wordchars);
+	SSM(sci, SCI_SETKEYWORDS, 0, (sptr_t) style_sets[GEANY_FILETYPES_LATEX].keywords[0]);
+	SSM(sci, SCI_SETWORDCHARS, 0, (sptr_t) style_sets[GEANY_FILETYPES_LATEX].wordchars);
 
-	styleset_set_style(sci, STYLE_DEFAULT, GEANY_FILETYPES_LATEX, 0);
-	styleset_set_style(sci, SCE_L_DEFAULT, GEANY_FILETYPES_LATEX, 0);
-	styleset_set_style(sci, SCE_L_COMMAND, GEANY_FILETYPES_LATEX, 1);
-	styleset_set_style(sci, SCE_L_TAG, GEANY_FILETYPES_LATEX, 2);
-	styleset_set_style(sci, SCE_L_MATH, GEANY_FILETYPES_LATEX, 3);
-	styleset_set_style(sci, SCE_L_COMMENT, GEANY_FILETYPES_LATEX, 4);
+	set_sci_style(sci, STYLE_DEFAULT, GEANY_FILETYPES_LATEX, 0);
+	set_sci_style(sci, SCE_L_DEFAULT, GEANY_FILETYPES_LATEX, 0);
+	set_sci_style(sci, SCE_L_COMMAND, GEANY_FILETYPES_LATEX, 1);
+	set_sci_style(sci, SCE_L_TAG, GEANY_FILETYPES_LATEX, 2);
+	set_sci_style(sci, SCE_L_MATH, GEANY_FILETYPES_LATEX, 3);
+	set_sci_style(sci, SCE_L_COMMENT, GEANY_FILETYPES_LATEX, 4);
 }
 
 
@@ -859,40 +994,29 @@
 {
 	GKeyFile *config = g_key_file_new();
 	GKeyFile *config_home = g_key_file_new();
-	gchar *f0 = g_strconcat(app->datadir, G_DIR_SEPARATOR_S "filetypes.php", NULL);
-	gchar *f = g_strconcat(app->configdir, G_DIR_SEPARATOR_S GEANY_FILEDEFS_SUBDIR G_DIR_SEPARATOR_S "filetypes.php", NULL);
 
-	styleset_load_file(config, f0, G_KEY_FILE_KEEP_COMMENTS, NULL);
-	g_key_file_load_from_file(config_home, f, G_KEY_FILE_KEEP_COMMENTS, NULL);
+	load_keyfiles(config, config_home, "filetypes.php");
 
-	types[GEANY_FILETYPES_PHP] = g_new(style_set, 1);
-	types[GEANY_FILETYPES_PHP]->keywords = NULL;
+	style_sets[GEANY_FILETYPES_PHP].styling = NULL;
+	style_sets[GEANY_FILETYPES_PHP].keywords = NULL;
 
-	styleset_get_wordchars(config, config_home, GEANY_FILETYPES_PHP, GEANY_WORDCHARS);
+	get_keyfile_wordchars(config, config_home, GEANY_WORDCHARS,
+		&style_sets[GEANY_FILETYPES_PHP].wordchars);
 	filetypes_get_config(config, config_home, GEANY_FILETYPES_PHP);
 
 	// load global tags file for PHP autocompletion
-	if (! app->ignore_global_tags && ! global_php_tags_loaded)
-	{
-		gchar *file = g_strconcat(app->datadir, G_DIR_SEPARATOR_S "php.tags", NULL);
-		// 6 is the langType used in TagManager (see the table in tagmanager/parsers.h)
-		tm_workspace_load_global_tags(file, 6);
-		global_php_tags_loaded = TRUE;
-		g_free(file);
-	}
+	ensure_tags_loaded(GTF_PHP, GLT_PHP);
 
 	g_key_file_free(config);
 	g_key_file_free(config_home);
-	g_free(f0);
-	g_free(f);
 }
 
 
 void styleset_php(ScintillaObject *sci)
 {
-	if (types[GEANY_FILETYPES_PHP] == NULL) styleset_php_init();
-
 	styleset_common(sci, 7);
+	// PHP doesn't have its own styling, so check wordchars to see if init was run
+	if (style_sets[GEANY_FILETYPES_PHP].wordchars == NULL) styleset_php_init();
 
 	SSM(sci, SCI_SETPROPERTY, (sptr_t) "phpscript.mode", (sptr_t) "1");
 	SSM(sci, SCI_SETLEXER, SCLEX_HTML, 0);
@@ -902,7 +1026,7 @@
 	// use the same colouring as for XML
 	styleset_markup(sci);
 
-	SSM(sci, SCI_SETWORDCHARS, 0, (sptr_t) types[GEANY_FILETYPES_PHP]->wordchars);
+	SSM(sci, SCI_SETWORDCHARS, 0, (sptr_t) style_sets[GEANY_FILETYPES_PHP].wordchars);
 }
 
 
@@ -910,39 +1034,29 @@
 {
 	GKeyFile *config = g_key_file_new();
 	GKeyFile *config_home = g_key_file_new();
-	gchar *f0 = g_strconcat(app->datadir, G_DIR_SEPARATOR_S "filetypes.html", NULL);
-	gchar *f = g_strconcat(app->configdir, G_DIR_SEPARATOR_S GEANY_FILEDEFS_SUBDIR G_DIR_SEPARATOR_S "filetypes.html", NULL);
 
-	styleset_load_file(config, f0, G_KEY_FILE_KEEP_COMMENTS, NULL);
-	g_key_file_load_from_file(config_home, f, G_KEY_FILE_KEEP_COMMENTS, NULL);
+	load_keyfiles(config, config_home, "filetypes.html");
 
-	types[GEANY_FILETYPES_HTML] = g_new(style_set, 1);
-	types[GEANY_FILETYPES_HTML]->keywords = NULL;
+	style_sets[GEANY_FILETYPES_HTML].styling = NULL;
+	style_sets[GEANY_FILETYPES_HTML].keywords = NULL;
 
-	styleset_get_wordchars(config, config_home, GEANY_FILETYPES_HTML, GEANY_WORDCHARS);
+	get_keyfile_wordchars(config, config_home, GEANY_WORDCHARS,
+		&style_sets[GEANY_FILETYPES_HTML].wordchars);
 	filetypes_get_config(config, config_home, GEANY_FILETYPES_HTML);
 
 	// load global tags file for HTML entities autocompletion
-	if (! app->ignore_global_tags && ! global_html_tags_loaded)
-	{
-		gchar *file = g_strconcat(app->datadir, G_DIR_SEPARATOR_S "html_entities.tags", NULL);
-		html_entities = utils_read_file_in_array(file);
-		global_html_tags_loaded = TRUE;
-		g_free(file);
-	}
+	ensure_html_tags_loaded();
 
 	g_key_file_free(config);
 	g_key_file_free(config_home);
-	g_free(f0);
-	g_free(f);
 }
 
 
 void styleset_html(ScintillaObject *sci)
 {
-	if (types[GEANY_FILETYPES_HTML] == NULL) styleset_html_init();
-
 	styleset_common(sci, 7);
+	// HTML doesn't have its own styling, so check wordchars to see if init was run
+	if (style_sets[GEANY_FILETYPES_HTML].wordchars == NULL) styleset_html_init();
 
 	SSM(sci, SCI_SETLEXER, SCLEX_HTML, 0);
 
@@ -951,7 +1065,7 @@
 	// use the same colouring for HTML; XML and so on
 	styleset_markup(sci);
 
-	SSM(sci, SCI_SETWORDCHARS, 0, (sptr_t) types[GEANY_FILETYPES_HTML]->wordchars);
+	SSM(sci, SCI_SETWORDCHARS, 0, (sptr_t) style_sets[GEANY_FILETYPES_HTML].wordchars);
 }
 
 
@@ -959,102 +1073,98 @@
 {
 	GKeyFile *config = g_key_file_new();
 	GKeyFile *config_home = g_key_file_new();
-	gchar *f0 = g_strconcat(app->datadir, G_DIR_SEPARATOR_S "filetypes.xml", NULL);
-	gchar *f = g_strconcat(app->configdir, G_DIR_SEPARATOR_S GEANY_FILEDEFS_SUBDIR G_DIR_SEPARATOR_S "filetypes.xml", NULL);
 
-	styleset_load_file(config, f0, G_KEY_FILE_KEEP_COMMENTS, NULL);
-	g_key_file_load_from_file(config_home, f, G_KEY_FILE_KEEP_COMMENTS, NULL);
+	load_keyfiles(config, config_home, "filetypes.xml");
 
-	types[GEANY_FILETYPES_XML] = g_new(style_set, 1);
-	styleset_get_hex(config, config_home, "styling", "html_default", "0x000000", "0xffffff", "false", types[GEANY_FILETYPES_XML]->styling[0]);
-	styleset_get_hex(config, config_home, "styling", "html_tag", "0x000099", "0xffffff", "false", types[GEANY_FILETYPES_XML]->styling[1]);
-	styleset_get_hex(config, config_home, "styling", "html_tagunknown", "0xff0000", "0xffffff", "false", types[GEANY_FILETYPES_XML]->styling[2]);
-	styleset_get_hex(config, config_home, "styling", "html_attribute", "0x007f00", "0xffffff", "false", types[GEANY_FILETYPES_XML]->styling[3]);
-	styleset_get_hex(config, config_home, "styling", "html_attributeunknown", "0xff0000", "0xffffff", "false", types[GEANY_FILETYPES_XML]->styling[4]);
-	styleset_get_hex(config, config_home, "styling", "html_number", "0x800080", "0xffffff", "false", types[GEANY_FILETYPES_XML]->styling[5]);
-	styleset_get_hex(config, config_home, "styling", "html_doublestring", "0xff901e", "0xffffff", "false", types[GEANY_FILETYPES_XML]->styling[6]);
-	styleset_get_hex(config, config_home, "styling", "html_singlestring", "0xff901e", "0xffffff", "false", types[GEANY_FILETYPES_XML]->styling[7]);
-	styleset_get_hex(config, config_home, "styling", "html_other", "0x800080", "0xffffff", "false", types[GEANY_FILETYPES_XML]->styling[8]);
-	styleset_get_hex(config, config_home, "styling", "html_comment", "0x808080", "0xffffff", "false", types[GEANY_FILETYPES_XML]->styling[9]);
-	styleset_get_hex(config, config_home, "styling", "html_entity", "0x800080", "0xffffff", "false", types[GEANY_FILETYPES_XML]->styling[10]);
-	styleset_get_hex(config, config_home, "styling", "html_tagend", "0x000080", "0xffffff", "false", types[GEANY_FILETYPES_XML]->styling[11]);
-	styleset_get_hex(config, config_home, "styling", "html_xmlstart", "0x000099", "0xf0f0f0", "false", types[GEANY_FILETYPES_XML]->styling[12]);
-	styleset_get_hex(config, config_home, "styling", "html_xmlend", "0x000099", "0xf0f0f0", "false", types[GEANY_FILETYPES_XML]->styling[13]);
-	styleset_get_hex(config, config_home, "styling", "html_script", "0x000080", "0xf0f0f0", "false", types[GEANY_FILETYPES_XML]->styling[14]);
-	styleset_get_hex(config, config_home, "styling", "html_asp", "0x004f4f", "0xf0f0f0", "false", types[GEANY_FILETYPES_XML]->styling[15]);
-	styleset_get_hex(config, config_home, "styling", "html_aspat", "0x004f4f", "0xf0f0f0", "false", types[GEANY_FILETYPES_XML]->styling[16]);
-	styleset_get_hex(config, config_home, "styling", "html_cdata", "0x660099", "0xffffff", "false", types[GEANY_FILETYPES_XML]->styling[17]);
-	styleset_get_hex(config, config_home, "styling", "html_question", "0x0000ff", "0xffffff", "false", types[GEANY_FILETYPES_XML]->styling[18]);
-	styleset_get_hex(config, config_home, "styling", "html_value", "0x660099", "0xffffff", "false", types[GEANY_FILETYPES_XML]->styling[19]);
-	styleset_get_hex(config, config_home, "styling", "html_xccomment", "0x660099", "0xffffff", "false", types[GEANY_FILETYPES_XML]->styling[20]);
+	new_style_array(GEANY_FILETYPES_XML, 55);
+	get_keyfile_hex(config, config_home, "styling", "html_default", "0x000000", "0xffffff", "false", &style_sets[GEANY_FILETYPES_XML].styling[0]);
+	get_keyfile_hex(config, config_home, "styling", "html_tag", "0x000099", "0xffffff", "false", &style_sets[GEANY_FILETYPES_XML].styling[1]);
+	get_keyfile_hex(config, config_home, "styling", "html_tagunknown", "0xff0000", "0xffffff", "false", &style_sets[GEANY_FILETYPES_XML].styling[2]);
+	get_keyfile_hex(config, config_home, "styling", "html_attribute", "0x007f00", "0xffffff", "false", &style_sets[GEANY_FILETYPES_XML].styling[3]);
+	get_keyfile_hex(config, config_home, "styling", "html_attributeunknown", "0xff0000", "0xffffff", "false", &style_sets[GEANY_FILETYPES_XML].styling[4]);
+	get_keyfile_hex(config, config_home, "styling", "html_number", "0x800080", "0xffffff", "false", &style_sets[GEANY_FILETYPES_XML].styling[5]);
+	get_keyfile_hex(config, config_home, "styling", "html_doublestring", "0xff901e", "0xffffff", "false", &style_sets[GEANY_FILETYPES_XML].styling[6]);
+	get_keyfile_hex(config, config_home, "styling", "html_singlestring", "0xff901e", "0xffffff", "false", &style_sets[GEANY_FILETYPES_XML].styling[7]);
+	get_keyfile_hex(config, config_home, "styling", "html_other", "0x800080", "0xffffff", "false", &style_sets[GEANY_FILETYPES_XML].styling[8]);
+	get_keyfile_hex(config, config_home, "styling", "html_comment", "0x808080", "0xffffff", "false", &style_sets[GEANY_FILETYPES_XML].styling[9]);
+	get_keyfile_hex(config, config_home, "styling", "html_entity", "0x800080", "0xffffff", "false", &style_sets[GEANY_FILETYPES_XML].styling[10]);
+	get_keyfile_hex(config, config_home, "styling", "html_tagend", "0x000080", "0xffffff", "false", &style_sets[GEANY_FILETYPES_XML].styling[11]);
+	get_keyfile_hex(config, config_home, "styling", "html_xmlstart", "0x000099", "0xf0f0f0", "false", &style_sets[GEANY_FILETYPES_XML].styling[12]);
+	get_keyfile_hex(config, config_home, "styling", "html_xmlend", "0x000099", "0xf0f0f0", "false", &style_sets[GEANY_FILETYPES_XML].styling[13]);
+	get_keyfile_hex(config, config_home, "styling", "html_script", "0x000080", "0xf0f0f0", "false", &style_sets[GEANY_FILETYPES_XML].styling[14]);
+	get_keyfile_hex(config, config_home, "styling", "html_asp", "0x004f4f", "0xf0f0f0", "false", &style_sets[GEANY_FILETYPES_XML].styling[15]);
+	get_keyfile_hex(config, config_home, "styling", "html_aspat", "0x004f4f", "0xf0f0f0", "false", &style_sets[GEANY_FILETYPES_XML].styling[16]);
+	get_keyfile_hex(config, config_home, "styling", "html_cdata", "0x660099", "0xffffff", "false", &style_sets[GEANY_FILETYPES_XML].styling[17]);
+	get_keyfile_hex(config, config_home, "styling", "html_question", "0x0000ff", "0xffffff", "false", &style_sets[GEANY_FILETYPES_XML].styling[18]);
+	get_keyfile_hex(config, config_home, "styling", "html_value", "0x660099", "0xffffff", "false", &style_sets[GEANY_FILETYPES_XML].styling[19]);
+	get_keyfile_hex(config, config_home, "styling", "html_xccomment", "0x660099", "0xffffff", "false", &style_sets[GEANY_FILETYPES_XML].styling[20]);
 
-	styleset_get_hex(config, config_home, "styling", "sgml_default", "0x000000", "0xffffff", "false", types[GEANY_FILETYPES_XML]->styling[21]);
-	styleset_get_hex(config, config_home, "styling", "sgml_comment", "0x808080", "0xffffff", "false", types[GEANY_FILETYPES_XML]->styling[22]);
-	styleset_get_hex(config, config_home, "styling", "sgml_special", "0x007f00", "0xffffff", "false", types[GEANY_FILETYPES_XML]->styling[23]);
-	styleset_get_hex(config, config_home, "styling", "sgml_command", "0x111199", "0xffffff", "true", types[GEANY_FILETYPES_XML]->styling[24]);
-	styleset_get_hex(config, config_home, "styling", "sgml_doublestring", "0xff901e", "0xffffff", "false", types[GEANY_FILETYPES_XML]->styling[25]);
-	styleset_get_hex(config, config_home, "styling", "sgml_simplestring", "0xff901e", "0xffffff", "false", types[GEANY_FILETYPES_XML]->styling[26]);
-	styleset_get_hex(config, config_home, "styling", "sgml_1st_param", "0x404080", "0xffffff", "false", types[GEANY_FILETYPES_XML]->styling[27]);
-	styleset_get_hex(config, config_home, "styling", "sgml_entity", "0x301010", "0xffffff", "false", types[GEANY_FILETYPES_XML]->styling[28]);
-	styleset_get_hex(config, config_home, "styling", "sgml_block_default", "0x000000", "0xffffff", "false", types[GEANY_FILETYPES_XML]->styling[29]);
-	styleset_get_hex(config, config_home, "styling", "sgml_1st_param_comment", "0x406090", "0xffffff", "false", types[GEANY_FILETYPES_XML]->styling[30]);
-	styleset_get_hex(config, config_home, "styling", "sgml_error", "0xff0000", "0xffffff", "false", types[GEANY_FILETYPES_XML]->styling[31]);
+	get_keyfile_hex(config, config_home, "styling", "sgml_default", "0x000000", "0xffffff", "false", &style_sets[GEANY_FILETYPES_XML].styling[21]);
+	get_keyfile_hex(config, config_home, "styling", "sgml_comment", "0x808080", "0xffffff", "false", &style_sets[GEANY_FILETYPES_XML].styling[22]);
+	get_keyfile_hex(config, config_home, "styling", "sgml_special", "0x007f00", "0xffffff", "false", &style_sets[GEANY_FILETYPES_XML].styling[23]);
+	get_keyfile_hex(config, config_home, "styling", "sgml_command", "0x111199", "0xffffff", "true", &style_sets[GEANY_FILETYPES_XML].styling[24]);
+	get_keyfile_hex(config, config_home, "styling", "sgml_doublestring", "0xff901e", "0xffffff", "false", &style_sets[GEANY_FILETYPES_XML].styling[25]);
+	get_keyfile_hex(config, config_home, "styling", "sgml_simplestring", "0xff901e", "0xffffff", "false", &style_sets[GEANY_FILETYPES_XML].styling[26]);
+	get_keyfile_hex(config, config_home, "styling", "sgml_1st_param", "0x404080", "0xffffff", "false", &style_sets[GEANY_FILETYPES_XML].styling[27]);
+	get_keyfile_hex(config, config_home, "styling", "sgml_entity", "0x301010", "0xffffff", "false", &style_sets[GEANY_FILETYPES_XML].styling[28]);
+	get_keyfile_hex(config, config_home, "styling", "sgml_block_default", "0x000000", "0xffffff", "false", &style_sets[GEANY_FILETYPES_XML].styling[29]);
+	get_keyfile_hex(config, config_home, "styling", "sgml_1st_param_comment", "0x406090", "0xffffff", "false", &style_sets[GEANY_FILETYPES_XML].styling[30]);
+	get_keyfile_hex(config, config_home, "styling", "sgml_error", "0xff0000", "0xffffff", "false", &style_sets[GEANY_FILETYPES_XML].styling[31]);
 
-	styleset_get_hex(config, config_home, "styling", "php_default", "0x000000", "0xffffff", "false", types[GEANY_FILETYPES_XML]->styling[32]);
-	styleset_get_hex(config, config_home, "styling", "php_simplestring", "0x008000", "0xffffff", "false", types[GEANY_FILETYPES_XML]->styling[33]);
-	styleset_get_hex(config, config_home, "styling", "php_hstring", "0x008000", "0xffffff", "false", types[GEANY_FILETYPES_XML]->styling[34]);
-	styleset_get_hex(config, config_home, "styling", "php_number", "0x606000", "0xffffff", "false", types[GEANY_FILETYPES_XML]->styling[35]);
-	styleset_get_hex(config, config_home, "styling", "php_word", "0x000099", "0xffffff", "false", types[GEANY_FILETYPES_XML]->styling[36]);
-	styleset_get_hex(config, config_home, "styling", "php_variable", "0x7f0000", "0xffffff", "false", types[GEANY_FILETYPES_XML]->styling[37]);
-	styleset_get_hex(config, config_home, "styling", "php_comment", "0x808080", "0xffffff", "false", types[GEANY_FILETYPES_XML]->styling[38]);
-	styleset_get_hex(config, config_home, "styling", "php_commentline", "0x808080", "0xffffff", "false", types[GEANY_FILETYPES_XML]->styling[39]);
-	styleset_get_hex(config, config_home, "styling", "php_operator", "0x102060", "0xffffff", "false", types[GEANY_FILETYPES_XML]->styling[40]);
-	styleset_get_hex(config, config_home, "styling", "php_hstring_variable", "0x101060", "0xffffff", "false", types[GEANY_FILETYPES_XML]->styling[41]);
-	styleset_get_hex(config, config_home, "styling", "php_complex_variable", "0x105010", "0xffffff", "false", types[GEANY_FILETYPES_XML]->styling[42]);
+	get_keyfile_hex(config, config_home, "styling", "php_default", "0x000000", "0xffffff", "false", &style_sets[GEANY_FILETYPES_XML].styling[32]);
+	get_keyfile_hex(config, config_home, "styling", "php_simplestring", "0x008000", "0xffffff", "false", &style_sets[GEANY_FILETYPES_XML].styling[33]);
+	get_keyfile_hex(config, config_home, "styling", "php_hstring", "0x008000", "0xffffff", "false", &style_sets[GEANY_FILETYPES_XML].styling[34]);
+	get_keyfile_hex(config, config_home, "styling", "php_number", "0x606000", "0xffffff", "false", &style_sets[GEANY_FILETYPES_XML].styling[35]);
+	get_keyfile_hex(config, config_home, "styling", "php_word", "0x000099", "0xffffff", "false", &style_sets[GEANY_FILETYPES_XML].styling[36]);
+	get_keyfile_hex(config, config_home, "styling", "php_variable", "0x7f0000", "0xffffff", "false", &style_sets[GEANY_FILETYPES_XML].styling[37]);
+	get_keyfile_hex(config, config_home, "styling", "php_comment", "0x808080", "0xffffff", "false", &style_sets[GEANY_FILETYPES_XML].styling[38]);
+	get_keyfile_hex(config, config_home, "styling", "php_commentline", "0x808080", "0xffffff", "false", &style_sets[GEANY_FILETYPES_XML].styling[39]);
+	get_keyfile_hex(config, config_home, "styling", "php_operator", "0x102060", "0xffffff", "false", &style_sets[GEANY_FILETYPES_XML].styling[40]);
+	get_keyfile_hex(config, config_home, "styling", "php_hstring_variable", "0x101060", "0xffffff", "false", &style_sets[GEANY_FILETYPES_XML].styling[41]);
+	get_keyfile_hex(config, config_home, "styling", "php_complex_variable", "0x105010", "0xffffff", "false", &style_sets[GEANY_FILETYPES_XML].styling[42]);
 
-	styleset_get_hex(config, config_home, "styling", "jscript_start", "0x008080", "0xffffff", "false", types[GEANY_FILETYPES_XML]->styling[43]);
-	styleset_get_hex(config, config_home, "styling", "jscript_default", "0x000000", "0xffffff", "false", types[GEANY_FILETYPES_XML]->styling[44]);
-	styleset_get_hex(config, config_home, "styling", "jscript_comment", "0x222222", "0xffffff", "false", types[GEANY_FILETYPES_XML]->styling[45]);
-	styleset_get_hex(config, config_home, "styling", "jscript_commentline", "0x808080", "0xffffff", "false", types[GEANY_FILETYPES_XML]->styling[46]);
-	styleset_get_hex(config, config_home, "styling", "jscript_commentdoc", "0x808080", "0xffffff", "false", types[GEANY_FILETYPES_XML]->styling[47]);
-	styleset_get_hex(config, config_home, "styling", "jscript_number", "0x006060", "0xffffff", "false", types[GEANY_FILETYPES_XML]->styling[48]);
-	styleset_get_hex(config, config_home, "styling", "jscript_word", "0x0000ff", "0xffffff", "false", types[GEANY_FILETYPES_XML]->styling[49]);
-	styleset_get_hex(config, config_home, "styling", "jscript_keyword", "0x501010", "0xffffff", "false", types[GEANY_FILETYPES_XML]->styling[50]);
-	styleset_get_hex(config, config_home, "styling", "jscript_doublestring", "0xff901e", "0xffffff", "false", types[GEANY_FILETYPES_XML]->styling[51]);
-	styleset_get_hex(config, config_home, "styling", "jscript_singlestring", "0xff901e", "0xffffff", "false", types[GEANY_FILETYPES_XML]->styling[52]);
-	styleset_get_hex(config, config_home, "styling", "jscript_symbols", "0x001050", "0xffffff", "false", types[GEANY_FILETYPES_XML]->styling[53]);
-	styleset_get_hex(config, config_home, "styling", "jscript_stringeol", "0x000000", "0xe0c0e0", "false", types[GEANY_FILETYPES_XML]->styling[54]);
+	get_keyfile_hex(config, config_home, "styling", "jscript_start", "0x008080", "0xffffff", "false", &style_sets[GEANY_FILETYPES_XML].styling[43]);
+	get_keyfile_hex(config, config_home, "styling", "jscript_default", "0x000000", "0xffffff", "false", &style_sets[GEANY_FILETYPES_XML].styling[44]);
+	get_keyfile_hex(config, config_home, "styling", "jscript_comment", "0x222222", "0xffffff", "false", &style_sets[GEANY_FILETYPES_XML].styling[45]);
+	get_keyfile_hex(config, config_home, "styling", "jscript_commentline", "0x808080", "0xffffff", "false", &style_sets[GEANY_FILETYPES_XML].styling[46]);
+	get_keyfile_hex(config, config_home, "styling", "jscript_commentdoc", "0x808080", "0xffffff", "false", &style_sets[GEANY_FILETYPES_XML].styling[47]);
+	get_keyfile_hex(config, config_home, "styling", "jscript_number", "0x006060", "0xffffff", "false", &style_sets[GEANY_FILETYPES_XML].styling[48]);
+	get_keyfile_hex(config, config_home, "styling", "jscript_word", "0x0000ff", "0xffffff", "false", &style_sets[GEANY_FILETYPES_XML].styling[49]);
+	get_keyfile_hex(config, config_home, "styling", "jscript_keyword", "0x501010", "0xffffff", "false", &style_sets[GEANY_FILETYPES_XML].styling[50]);
+	get_keyfile_hex(config, config_home, "styling", "jscript_doublestring", "0xff901e", "0xffffff", "false", &style_sets[GEANY_FILETYPES_XML].styling[51]);
+	get_keyfile_hex(config, config_home, "styling", "jscript_singlestring", "0xff901e", "0xffffff", "false", &style_sets[GEANY_FILETYPES_XML].styling[52]);
+	get_keyfile_hex(config, config_home, "styling", "jscript_symbols", "0x001050", "0xffffff", "false", &style_sets[GEANY_FILETYPES_XML].styling[53]);
+	get_keyfile_hex(config, config_home, "styling", "jscript_stringeol", "0x000000", "0xe0c0e0", "false", &style_sets[GEANY_FILETYPES_XML].styling[54]);
 
-	types[GEANY_FILETYPES_XML]->keywords = g_new(gchar*, 7);
-	styleset_get_keywords(config, config_home, "keywords", "html", GEANY_FILETYPES_XML, 0, "a abbr acronym address applet area b base basefont bdo big blockquote body br button caption center cite code col colgroup dd del dfn dir div dl dt em embed fieldset font form frame frameset h1 h2 h3 h4 h5 h6 head hr html i iframe img input ins isindex kbd label legend li link map menu meta noframes noscript object ol optgroup option p param pre q quality s samp script select small span strike strong style sub sup table tbody td textarea tfoot th thead title tr tt u ul var xmlns leftmargin topmargin abbr accept-charset accept accesskey action align alink alt archive axis background bgcolor border cellpadding cellspacing char charoff charset checked cite class classid clear codebase codetype color cols colspan compact content coords data datafld dataformatas datapagesize datasrc datetime declare defer dir disabled enctype face for frame frameborder selected headers height href hreflang hspace http-equiv id ismap label lang language link longdesc marginwidth marginheight maxlength media framespacing method multiple name nohref noresize noshade nowrap object onblur onchange onclick ondblclick onfocus onkeydown onkeypress onkeyup onload onmousedown onmousemove onmouseover onmouseout onmouseup onreset onselect onsubmit onunload profile prompt pluginspage readonly rel rev rows rowspan rules scheme scope scrolling shape size span src standby start style summary tabindex target text title type usemap valign value valuetype version vlink vspace width text password checkbox radio submit reset file hidden image public doctype xml");
-	styleset_get_keywords(config, config_home, "keywords", "javascript", GEANY_FILETYPES_XML, 1, "break this for while null else var false void new delete typeof if in continue true function with return case super extends do const try debugger catch switch finally enum export default class throw import length concat join pop push reverse shift slice splice sort unshift Date Infinity NaN undefined escape eval isFinite isNaN Number parseFloat parseInt string unescape Math abs acos asin atan atan2 ceil cos exp floor log max min pow random round sin sqrt tan MAX_VALUE MIN_VALUE NEGATIVE_INFINITY POSITIVE_INFINITY toString valueOf String length anchor big bold charAt charCodeAt concat fixed fontcolor fontsize fromCharCode indexOf italics lastIndexOf link slice small split strike sub substr substring sup toLowerCase toUpperCase");
-	styleset_get_keywords(config, config_home, "keywords", "vbscript", GEANY_FILETYPES_XML, 2, "and as byref byval case call const continue dim do each else elseif end error exit false for function global goto if in loop me new next not nothing on optional or private public redim rem resume select set sub then to true type while with boolean byte currency date double integer long object single string type variant");
-	styleset_get_keywords(config, config_home, "keywords", "python", GEANY_FILETYPES_XML, 3, "and assert break class continue complex def del elif else except exec finally for from global if import in inherit is int lambda not or pass print raise return tuple try unicode while yield long float str list");
-	styleset_get_keywords(config, config_home, "keywords", "php", GEANY_FILETYPES_XML, 4, "and or xor FILE exception LINE array as break case class const continue declare default die do echo else elseif empty  enddeclare endfor endforeach endif endswitch endwhile eval exit extends for foreach function global if include include_once  isset list new print require require_once return static switch unset use var while FUNCTION CLASS METHOD final php_user_filter interface implements extends public private protected abstract clone try catch throw cfunction old_function this");
-	styleset_get_keywords(config, config_home, "keywords", "sgml", GEANY_FILETYPES_XML, 5, "ELEMENT DOCTYPE ATTLIST ENTITY NOTATION");
-	types[GEANY_FILETYPES_XML]->keywords[6] = NULL;
+	style_sets[GEANY_FILETYPES_XML].keywords = g_new(gchar*, 7);
+	get_keyfile_keywords(config, config_home, "keywords", "html", GEANY_FILETYPES_XML, 0, "a abbr acronym address applet area b base basefont bdo big blockquote body br button caption center cite code col colgroup dd del dfn dir div dl dt em embed fieldset font form frame frameset h1 h2 h3 h4 h5 h6 head hr html i iframe img input ins isindex kbd label legend li link map menu meta noframes noscript object ol optgroup option p param pre q quality s samp script select small span strike strong style sub sup table tbody td textarea tfoot th thead title tr tt u ul var xmlns leftmargin topmargin abbr accept-charset accept accesskey action align alink alt archive axis background bgcolor border cellpadding cellspacing char charoff charset checked cite class classid clear codebase codetype color cols colspan compact content coords data datafld dataformatas datapagesize datasrc datetime declare defer dir disabled enctype face for frame frameborder selected headers height href hreflang hspace http-equiv id ismap label lang language link longdesc marginwidth marginheight maxlength media framespacing method multiple name nohref noresize noshade nowrap object onblur onchange onclick ondblclick onfocus onkeydown onkeypress onkeyup onload onmousedown onmousemove onmouseover onmouseout onmouseup onreset onselect onsubmit onunload profile prompt pluginspage readonly rel rev rows rowspan rules scheme scope scrolling shape size span src standby start style summary tabindex target text title type usemap valign value valuetype version vlink vspace width text password checkbox radio submit reset file hidden image public doctype xml");
+	get_keyfile_keywords(config, config_home, "keywords", "javascript", GEANY_FILETYPES_XML, 1, "break this for while null else var false void new delete typeof if in continue true function with return case super extends do const try debugger catch switch finally enum export default class throw import length concat join pop push reverse shift slice splice sort unshift Date Infinity NaN undefined escape eval isFinite isNaN Number parseFloat parseInt string unescape Math abs acos asin atan atan2 ceil cos exp floor log max min pow random round sin sqrt tan MAX_VALUE MIN_VALUE NEGATIVE_INFINITY POSITIVE_INFINITY toString valueOf String length anchor big bold charAt charCodeAt concat fixed fontcolor fontsize fromCharCode indexOf italics lastIndexOf link slice small split strike sub substr substring sup toLowerCase toUpperCase");
+	get_keyfile_keywords(config, config_home, "keywords", "vbscript", GEANY_FILETYPES_XML, 2, "and as byref byval case call const continue dim do each else elseif end error exit false for function global goto if in loop me new next not nothing on optional or private public redim rem resume select set sub then to true type while with boolean byte currency date double integer long object single string type variant");
+	get_keyfile_keywords(config, config_home, "keywords", "python", GEANY_FILETYPES_XML, 3, "and assert break class continue complex def del elif else except exec finally for from global if import in inherit is int lambda not or pass print raise return tuple try unicode while yield long float str list");
+	get_keyfile_keywords(config, config_home, "keywords", "php", GEANY_FILETYPES_XML, 4, "and or xor FILE exception LINE array as break case class const continue declare default die do echo else elseif empty  enddeclare endfor endforeach endif endswitch endwhile eval exit extends for foreach function global if include include_once  isset list new print require require_once return static switch unset use var while FUNCTION CLASS METHOD final php_user_filter interface implements extends public private protected abstract clone try catch throw cfunction old_function this");
+	get_keyfile_keywords(config, config_home, "keywords", "sgml", GEANY_FILETYPES_XML, 5, "ELEMENT DOCTYPE ATTLIST ENTITY NOTATION");
+	style_sets[GEANY_FILETYPES_XML].keywords[6] = NULL;
 
-	styleset_get_wordchars(config, config_home, GEANY_FILETYPES_XML, GEANY_WORDCHARS"$");
+	get_keyfile_wordchars(config, config_home, GEANY_WORDCHARS"$",
+		&style_sets[GEANY_FILETYPES_XML].wordchars);
 	filetypes_get_config(config, config_home, GEANY_FILETYPES_XML);
 
 	g_key_file_free(config);
 	g_key_file_free(config_home);
-	g_free(f0);
-	g_free(f);
 }
 
 
 void styleset_markup(ScintillaObject *sci)
 {
-	if (types[GEANY_FILETYPES_XML] == NULL) styleset_markup_init();
+	if (style_sets[GEANY_FILETYPES_XML].styling == NULL) styleset_markup_init();
 
 
-	SSM(sci, SCI_SETKEYWORDS, 0, (sptr_t) types[GEANY_FILETYPES_XML]->keywords[0]);
-	SSM(sci, SCI_SETKEYWORDS, 1, (sptr_t) types[GEANY_FILETYPES_XML]->keywords[1]);
-	SSM(sci, SCI_SETKEYWORDS, 2, (sptr_t) types[GEANY_FILETYPES_XML]->keywords[2]);
-	SSM(sci, SCI_SETKEYWORDS, 3, (sptr_t) types[GEANY_FILETYPES_XML]->keywords[3]);
-	SSM(sci, SCI_SETKEYWORDS, 4, (sptr_t) types[GEANY_FILETYPES_XML]->keywords[4]);
-	SSM(sci, SCI_SETKEYWORDS, 5, (sptr_t) types[GEANY_FILETYPES_XML]->keywords[5]);
+	SSM(sci, SCI_SETKEYWORDS, 0, (sptr_t) style_sets[GEANY_FILETYPES_XML].keywords[0]);
+	SSM(sci, SCI_SETKEYWORDS, 1, (sptr_t) style_sets[GEANY_FILETYPES_XML].keywords[1]);
+	SSM(sci, SCI_SETKEYWORDS, 2, (sptr_t) style_sets[GEANY_FILETYPES_XML].keywords[2]);
+	SSM(sci, SCI_SETKEYWORDS, 3, (sptr_t) style_sets[GEANY_FILETYPES_XML].keywords[3]);
+	SSM(sci, SCI_SETKEYWORDS, 4, (sptr_t) style_sets[GEANY_FILETYPES_XML].keywords[4]);
+	SSM(sci, SCI_SETKEYWORDS, 5, (sptr_t) style_sets[GEANY_FILETYPES_XML].keywords[5]);
 
 	// hotspotting, nice thing
 	SSM(sci, SCI_SETHOTSPOTACTIVEFORE, 1, invert(0xff0000));
@@ -1062,43 +1172,43 @@
 	SSM(sci, SCI_SETHOTSPOTSINGLELINE, 1, 0);
 	SSM(sci, SCI_STYLESETHOTSPOT, SCE_H_QUESTION, 1);
 
-	styleset_set_style(sci, STYLE_DEFAULT, GEANY_FILETYPES_XML, 0);
-	styleset_set_style(sci, SCE_H_DEFAULT, GEANY_FILETYPES_XML, 0);
-	styleset_set_style(sci, SCE_H_TAG, GEANY_FILETYPES_XML, 1);
-	styleset_set_style(sci, SCE_H_TAGUNKNOWN, GEANY_FILETYPES_XML, 2);
-	styleset_set_style(sci, SCE_H_ATTRIBUTE, GEANY_FILETYPES_XML, 3);
-	styleset_set_style(sci, SCE_H_ATTRIBUTEUNKNOWN, GEANY_FILETYPES_XML, 4);
-	styleset_set_style(sci, SCE_H_NUMBER, GEANY_FILETYPES_XML, 5);
-	styleset_set_style(sci, SCE_H_DOUBLESTRING, GEANY_FILETYPES_XML, 6);
-	styleset_set_style(sci, SCE_H_SINGLESTRING, GEANY_FILETYPES_XML, 7);
-	styleset_set_style(sci, SCE_H_OTHER, GEANY_FILETYPES_XML, 8);
-	styleset_set_style(sci, SCE_H_COMMENT, GEANY_FILETYPES_XML, 9);
-	styleset_set_style(sci, SCE_H_ENTITY, GEANY_FILETYPES_XML, 10);
-	styleset_set_style(sci, SCE_H_TAGEND, GEANY_FILETYPES_XML, 11);
+	set_sci_style(sci, STYLE_DEFAULT, GEANY_FILETYPES_XML, 0);
+	set_sci_style(sci, SCE_H_DEFAULT, GEANY_FILETYPES_XML, 0);
+	set_sci_style(sci, SCE_H_TAG, GEANY_FILETYPES_XML, 1);
+	set_sci_style(sci, SCE_H_TAGUNKNOWN, GEANY_FILETYPES_XML, 2);
+	set_sci_style(sci, SCE_H_ATTRIBUTE, GEANY_FILETYPES_XML, 3);
+	set_sci_style(sci, SCE_H_ATTRIBUTEUNKNOWN, GEANY_FILETYPES_XML, 4);
+	set_sci_style(sci, SCE_H_NUMBER, GEANY_FILETYPES_XML, 5);
+	set_sci_style(sci, SCE_H_DOUBLESTRING, GEANY_FILETYPES_XML, 6);
+	set_sci_style(sci, SCE_H_SINGLESTRING, GEANY_FILETYPES_XML, 7);
+	set_sci_style(sci, SCE_H_OTHER, GEANY_FILETYPES_XML, 8);
+	set_sci_style(sci, SCE_H_COMMENT, GEANY_FILETYPES_XML, 9);
+	set_sci_style(sci, SCE_H_ENTITY, GEANY_FILETYPES_XML, 10);
+	set_sci_style(sci, SCE_H_TAGEND, GEANY_FILETYPES_XML, 11);
 	SSM(sci, SCI_STYLESETEOLFILLED, SCE_H_XMLSTART, 1);
-	styleset_set_style(sci, SCE_H_XMLSTART, GEANY_FILETYPES_XML, 12);
-	styleset_set_style(sci, SCE_H_XMLEND, GEANY_FILETYPES_XML, 13);
-	styleset_set_style(sci, SCE_H_SCRIPT, GEANY_FILETYPES_XML, 14);
+	set_sci_style(sci, SCE_H_XMLSTART, GEANY_FILETYPES_XML, 12);
+	set_sci_style(sci, SCE_H_XMLEND, GEANY_FILETYPES_XML, 13);
+	set_sci_style(sci, SCE_H_SCRIPT, GEANY_FILETYPES_XML, 14);
 	SSM(sci, SCI_STYLESETEOLFILLED, SCE_H_ASP, 1);
-	styleset_set_style(sci, SCE_H_ASP, GEANY_FILETYPES_XML, 15);
+	set_sci_style(sci, SCE_H_ASP, GEANY_FILETYPES_XML, 15);
 	SSM(sci, SCI_STYLESETEOLFILLED, SCE_H_ASPAT, 1);
-	styleset_set_style(sci, SCE_H_ASPAT, GEANY_FILETYPES_XML, 16);
-	styleset_set_style(sci, SCE_H_CDATA, GEANY_FILETYPES_XML, 17);
-	styleset_set_style(sci, SCE_H_QUESTION, GEANY_FILETYPES_XML, 18);
-	styleset_set_style(sci, SCE_H_VALUE, GEANY_FILETYPES_XML, 19);
-	styleset_set_style(sci, SCE_H_XCCOMMENT, GEANY_FILETYPES_XML, 20);
+	set_sci_style(sci, SCE_H_ASPAT, GEANY_FILETYPES_XML, 16);
+	set_sci_style(sci, SCE_H_CDATA, GEANY_FILETYPES_XML, 17);
+	set_sci_style(sci, SCE_H_QUESTION, GEANY_FILETYPES_XML, 18);
+	set_sci_style(sci, SCE_H_VALUE, GEANY_FILETYPES_XML, 19);
+	set_sci_style(sci, SCE_H_XCCOMMENT, GEANY_FILETYPES_XML, 20);
 
-	styleset_set_style(sci, SCE_H_SGML_DEFAULT, GEANY_FILETYPES_XML, 21);
-	styleset_set_style(sci, SCE_H_SGML_COMMENT, GEANY_FILETYPES_XML, 22);
-	styleset_set_style(sci, SCE_H_SGML_SPECIAL, GEANY_FILETYPES_XML, 23);
-	styleset_set_style(sci, SCE_H_SGML_COMMAND, GEANY_FILETYPES_XML, 24);
-	styleset_set_style(sci, SCE_H_SGML_DOUBLESTRING, GEANY_FILETYPES_XML, 25);
-	styleset_set_style(sci, SCE_H_SGML_SIMPLESTRING, GEANY_FILETYPES_XML, 26);
-	styleset_set_style(sci, SCE_H_SGML_1ST_PARAM, GEANY_FILETYPES_XML, 27);
-	styleset_set_style(sci, SCE_H_SGML_ENTITY, GEANY_FILETYPES_XML, 28);
-	styleset_set_style(sci, SCE_H_SGML_BLOCK_DEFAULT, GEANY_FILETYPES_XML, 29);

@@ Diff output truncated at 100000 characters. @@

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