Revision: 2902 http://geany.svn.sourceforge.net/geany/?rev=2902&view=rev Author: ntrel Date: 2008-08-26 09:48:18 +0000 (Tue, 26 Aug 2008)
Log Message: ----------- Add assert statements to check that the StyleSet styling arrays are not exceeded. (Also make highlighting_get_style() work with all filetypes, but probably we should remove this from the API; plugins could just use the SCI_STYLEGET* functions instead).
Modified Paths: -------------- trunk/ChangeLog trunk/src/highlighting.c
Modified: trunk/ChangeLog =================================================================== --- trunk/ChangeLog 2008-08-25 15:44:51 UTC (rev 2901) +++ trunk/ChangeLog 2008-08-26 09:48:18 UTC (rev 2902) @@ -1,3 +1,13 @@ +2008-08-26 Nick Treleaven <nick(dot)treleaven(at)btinternet(dot)com> + + * src/highlighting.c: + Add assert statements to check that the StyleSet styling arrays are + not exceeded. + (Also make highlighting_get_style() work with all filetypes, but + probably we should remove this from the API; plugins could just use + the SCI_STYLEGET* functions instead). + + 2008-08-25 Nick Treleaven <nick(dot)treleaven(at)btinternet(dot)com>
* src/document.c, src/editor.c, src/editor.h:
Modified: trunk/src/highlighting.c =================================================================== --- trunk/src/highlighting.c 2008-08-25 15:44:51 UTC (rev 2901) +++ trunk/src/highlighting.c 2008-08-26 09:48:18 UTC (rev 2902) @@ -46,13 +46,14 @@
typedef struct { - HighlightingStyle *styling; /* array of styles, NULL if not used or uninitialised */ + gsize count; /* number of styles */ + HighlightingStyle *styling; /* array of styles, NULL if not used or uninitialised */ gchar **keywords; - gchar *wordchars; /* NULL used for style sets with no styles */ + gchar *wordchars; /* NULL used for style sets with no styles */ } StyleSet;
-/* each filetype has a styleset except GEANY_FILETYPE_ALL */ -static StyleSet style_sets[GEANY_MAX_BUILT_IN_FILETYPES - 1] = {{NULL, NULL, NULL}}; +/* each filetype has a styleset except GEANY_FILETYPES_NONE, which uses common_style_set */ +static StyleSet style_sets[GEANY_MAX_BUILT_IN_FILETYPES - 1] = {{0, NULL, NULL, NULL}};
enum /* Geany common styling */ @@ -103,7 +104,10 @@
static void new_style_array(gint file_type_id, gint styling_count) { - style_sets[file_type_id].styling = g_new0(HighlightingStyle, styling_count); + StyleSet *set = &style_sets[file_type_id]; + + set->count = styling_count; + set->styling = g_new0(HighlightingStyle, styling_count); }
@@ -269,15 +273,29 @@ }
-static void set_sci_style(ScintillaObject *sci, gint style, gint ft, gint styling_index) +static HighlightingStyle *get_style(guint ft_id, guint styling_index) { - HighlightingStyle *style_ptr; + g_assert(ft_id < GEANY_MAX_BUILT_IN_FILETYPES);
- if (ft == GEANY_FILETYPES_NONE) - style_ptr = &common_style_set.styling[styling_index]; + if (ft_id == GEANY_FILETYPES_NONE) + { + g_assert(styling_index < GCS_MAX); + return &common_style_set.styling[styling_index]; + } else - style_ptr = &style_sets[ft].styling[styling_index]; + { + StyleSet *set = &style_sets[ft_id];
+ g_assert(styling_index < set->count); + return &set->styling[styling_index]; + } +} + + +static void set_sci_style(ScintillaObject *sci, gint style, guint ft_id, guint styling_index) +{ + HighlightingStyle *style_ptr = get_style(ft_id, 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); @@ -294,6 +312,7 @@ StyleSet *style_ptr; style_ptr = &style_sets[i];
+ style_ptr->count = 0; g_free(style_ptr->styling); g_strfreev(style_ptr->keywords); g_free(style_ptr->wordchars); @@ -3046,10 +3065,10 @@ if (ft_id < 0 || ft_id > GEANY_MAX_BUILT_IN_FILETYPES) return NULL;
- if (style_sets[ft_id].styling == NULL) - filetypes_load_config(ft_id, FALSE); + /* ensure filetype loaded */ + filetypes_load_config(ft_id, FALSE);
- /** TODO style_id might not be the real array index (Scintilla styles are not always synced - * with array indices) */ - return (const HighlightingStyle*) &style_sets[ft_id].styling[style_id]; + /* TODO: style_id might not be the real array index (Scintilla styles are not always synced + * with array indices) */ + return get_style(ft_id, style_id); }
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.