Skip to content

Commit

Permalink
pairtaghighliter: Remove a global variable
Browse files Browse the repository at this point in the history
Remove use of the 'sci' global variable and instead pass it as an
argument to each function requiring this data.

The use of global variables makes code harder to understand and debug,
and often leads to unexpected issues.  Here, it lead to a crash when
unloading the the plugin because an apparently innocent call used this
global variable before its initialization.  This was fixed in previous
commit, but removing use of the global variable hopefully will prevent
such bugs from reappearing later.
  • Loading branch information
b4n committed May 9, 2013
1 parent fdcf8f8 commit 139793f
Showing 1 changed file with 37 additions and 43 deletions.
80 changes: 37 additions & 43 deletions pairtaghighlighter/src/pair_tag_highlighter.c
Expand Up @@ -24,8 +24,6 @@ GeanyPlugin *geany_plugin;
GeanyData *geany_data;
GeanyFunctions *geany_functions;

static ScintillaObject *sci;

/* Is needed for clearing highlighting after moving cursor out
* from the tag */
static gint highlightedBrackets[] = {0, 0, 0, 0};
Expand All @@ -43,7 +41,7 @@ PLUGIN_SET_TRANSLATABLE_INFO(LOCALEDIR, GETTEXT_PACKAGE, _("Pair Tag Highlighter
* FALSE - to the left
* from the current cursor position to the start of the line.
*/
static gint findBracket(gint position, gint endOfSearchPos,
static gint findBracket(ScintillaObject *sci, gint position, gint endOfSearchPos,
gchar searchedBracket, gchar breakBracket, gboolean direction)
{
gint foundBracket = -1;
Expand Down Expand Up @@ -84,7 +82,7 @@ static gint findBracket(gint position, gint endOfSearchPos,
}


static void highlight_tag(gint openingBracket, gint closingBracket)
static void highlight_tag(ScintillaObject *sci, gint openingBracket, gint closingBracket)
{
scintilla_send_message(sci, SCI_SETINDICATORCURRENT, INDICATOR_TAGMATCH, 0);
scintilla_send_message(sci, SCI_INDICSETSTYLE,
Expand All @@ -96,14 +94,14 @@ static void highlight_tag(gint openingBracket, gint closingBracket)
}


static void clear_previous_highlighting(gint rangeStart, gint rangeEnd)
static void clear_previous_highlighting(ScintillaObject *sci, gint rangeStart, gint rangeEnd)
{
scintilla_send_message(sci, SCI_SETINDICATORCURRENT, INDICATOR_TAGMATCH, 0);
scintilla_send_message(sci, SCI_INDICATORCLEARRANGE, rangeStart, rangeEnd+1);
}


static gboolean is_tag_self_closing(gint closingBracket)
static gboolean is_tag_self_closing(ScintillaObject *sci, gint closingBracket)
{
gboolean isTagSelfClosing = FALSE;
gchar charBeforeBracket = sci_get_char_at(sci, closingBracket-1);
Expand All @@ -114,7 +112,7 @@ static gboolean is_tag_self_closing(gint closingBracket)
}


static gboolean is_tag_opening(gint openingBracket)
static gboolean is_tag_opening(ScintillaObject *sci, gint openingBracket)
{
gboolean isTagOpening = TRUE;
gchar charAfterBracket = sci_get_char_at(sci, openingBracket+1);
Expand All @@ -125,7 +123,7 @@ static gboolean is_tag_opening(gint openingBracket)
}


static void get_tag_name(gint openingBracket, gint closingBracket,
static void get_tag_name(ScintillaObject *sci, gint openingBracket, gint closingBracket,
gchar tagName[], gboolean isTagOpening)
{
gint nameStart = openingBracket + (TRUE == isTagOpening ? 1 : 2);
Expand All @@ -144,7 +142,7 @@ static void get_tag_name(gint openingBracket, gint closingBracket,
}


static void findMatchingOpeningTag(gchar *tagName, gint openingBracket)
static void findMatchingOpeningTag(ScintillaObject *sci, gchar *tagName, gint openingBracket)
{
gint pos;
gint openingTagsCount = 0;
Expand All @@ -155,16 +153,16 @@ static void findMatchingOpeningTag(gchar *tagName, gint openingBracket)
/* are we inside tag? */
gint lineNumber = sci_get_line_from_position(sci, pos);
gint lineStart = sci_get_position_from_line(sci, lineNumber);
gint matchingOpeningBracket = findBracket(pos, lineStart, '<', '\0', FALSE);
gint matchingClosingBracket = findBracket(pos, lineStart, '>', '\0', FALSE);
gint matchingOpeningBracket = findBracket(sci, pos, lineStart, '<', '\0', FALSE);
gint matchingClosingBracket = findBracket(sci, pos, lineStart, '>', '\0', FALSE);

if(-1 != matchingOpeningBracket && -1 != matchingClosingBracket
&& (matchingClosingBracket > matchingOpeningBracket))
{
/* we are inside of some tag. Let us check what tag*/
gchar matchingTagName[MAX_TAG_NAME];
gboolean isMatchingTagOpening = is_tag_opening(matchingOpeningBracket);
get_tag_name(matchingOpeningBracket, matchingClosingBracket,
gboolean isMatchingTagOpening = is_tag_opening(sci, matchingOpeningBracket);
get_tag_name(sci, matchingOpeningBracket, matchingClosingBracket,
matchingTagName, isMatchingTagOpening);
if(strcmp(tagName, matchingTagName) == 0)
{
Expand All @@ -186,7 +184,7 @@ static void findMatchingOpeningTag(gchar *tagName, gint openingBracket)
if(openingTagsCount == closingTagsCount)
{
/* matching tag is found */
highlight_tag(matchingOpeningBracket, matchingClosingBracket);
highlight_tag(sci, matchingOpeningBracket, matchingClosingBracket);
highlightedBrackets[2] = matchingOpeningBracket;
highlightedBrackets[3] = matchingClosingBracket;
break;
Expand All @@ -195,7 +193,7 @@ static void findMatchingOpeningTag(gchar *tagName, gint openingBracket)
}


static void findMatchingClosingTag(gchar *tagName, gint closingBracket)
static void findMatchingClosingTag(ScintillaObject *sci, gchar *tagName, gint closingBracket)
{
gint pos;
gint linesInDocument = sci_get_line_count(sci);
Expand All @@ -208,16 +206,16 @@ static void findMatchingClosingTag(gchar *tagName, gint closingBracket)
/* are we inside tag? */
gint lineNumber = sci_get_line_from_position(sci, pos);
gint lineEnd = sci_get_line_end_position(sci, lineNumber);
gint matchingOpeningBracket = findBracket(pos, endOfDocument, '<', '\0', TRUE);
gint matchingClosingBracket = findBracket(pos, endOfDocument, '>', '\0', TRUE);
gint matchingOpeningBracket = findBracket(sci, pos, endOfDocument, '<', '\0', TRUE);
gint matchingClosingBracket = findBracket(sci, pos, endOfDocument, '>', '\0', TRUE);

if(-1 != matchingOpeningBracket && -1 != matchingClosingBracket
&& (matchingClosingBracket > matchingOpeningBracket))
{
/* we are inside of some tag. Let us check what tag*/
gchar matchingTagName[64];
gboolean isMatchingTagOpening = is_tag_opening(matchingOpeningBracket);
get_tag_name(matchingOpeningBracket, matchingClosingBracket,
gboolean isMatchingTagOpening = is_tag_opening(sci, matchingOpeningBracket);
get_tag_name(sci, matchingOpeningBracket, matchingClosingBracket,
matchingTagName, isMatchingTagOpening);
if(strcmp(tagName, matchingTagName) == 0)
{
Expand All @@ -239,7 +237,7 @@ static void findMatchingClosingTag(gchar *tagName, gint closingBracket)
if(openingTagsCount == closingTagsCount)
{
/* matching tag is found */
highlight_tag(matchingOpeningBracket, matchingClosingBracket);
highlight_tag(sci, matchingOpeningBracket, matchingClosingBracket);
highlightedBrackets[2] = matchingOpeningBracket;
highlightedBrackets[3] = matchingClosingBracket;
break;
Expand All @@ -248,33 +246,33 @@ static void findMatchingClosingTag(gchar *tagName, gint closingBracket)
}


static void findMatchingTag(gint openingBracket, gint closingBracket)
static void findMatchingTag(ScintillaObject *sci, gint openingBracket, gint closingBracket)
{
gchar tagName[MAX_TAG_NAME];
gboolean isTagOpening = is_tag_opening(openingBracket);
get_tag_name(openingBracket, closingBracket, tagName, isTagOpening);
gboolean isTagOpening = is_tag_opening(sci, openingBracket);
get_tag_name(sci, openingBracket, closingBracket, tagName, isTagOpening);

if(TRUE == isTagOpening)
findMatchingClosingTag(tagName, closingBracket);
findMatchingClosingTag(sci, tagName, closingBracket);
else
findMatchingOpeningTag(tagName, openingBracket);
findMatchingOpeningTag(sci, tagName, openingBracket);
}


static void run_tag_highlighter(void)
static void run_tag_highlighter(ScintillaObject *sci)
{
gint position = sci_get_current_position(sci);
gint lineNumber = sci_get_current_line(sci);
gint lineStart = sci_get_position_from_line(sci, lineNumber);
gint lineEnd = sci_get_line_end_position(sci, lineNumber);
gint openingBracket = findBracket(position, lineStart, '<', '>', FALSE);
gint closingBracket = findBracket(position, lineEnd, '>', '<', TRUE);
gint openingBracket = findBracket(sci, position, lineStart, '<', '>', FALSE);
gint closingBracket = findBracket(sci, position, lineEnd, '>', '<', TRUE);
int i;

if(-1 == openingBracket || -1 == closingBracket)
{
clear_previous_highlighting(highlightedBrackets[0], highlightedBrackets[1]);
clear_previous_highlighting(highlightedBrackets[2], highlightedBrackets[3]);
clear_previous_highlighting(sci, highlightedBrackets[0], highlightedBrackets[1]);
clear_previous_highlighting(sci, highlightedBrackets[2], highlightedBrackets[3]);
for(i=0; i<3; i++)
highlightedBrackets[i] = 0;
return;
Expand All @@ -285,20 +283,20 @@ static void run_tag_highlighter(void)
if(openingBracket != highlightedBrackets[0] ||
closingBracket != highlightedBrackets[1])
{
clear_previous_highlighting(highlightedBrackets[0], highlightedBrackets[1]);
clear_previous_highlighting(highlightedBrackets[2], highlightedBrackets[3]);
clear_previous_highlighting(sci, highlightedBrackets[0], highlightedBrackets[1]);
clear_previous_highlighting(sci, highlightedBrackets[2], highlightedBrackets[3]);
}

highlightedBrackets[0] = openingBracket;
highlightedBrackets[1] = closingBracket;

/* Highlight current tag. Matching tag will be highlighted from
* findMatchingTag() functiong */
highlight_tag(openingBracket, closingBracket);
highlight_tag(sci, openingBracket, closingBracket);

/* Find matching tag only if a tag is not self-closing */
if(FALSE == is_tag_self_closing(closingBracket))
findMatchingTag(openingBracket, closingBracket);
if(FALSE == is_tag_self_closing(sci, closingBracket))
findMatchingTag(sci, openingBracket, closingBracket);
}


Expand All @@ -308,10 +306,7 @@ static gboolean on_editor_notify(GObject *obj, GeanyEditor *editor,
{
gint lexer;

/* setting global sci variable to be available in other functions */
sci = editor->sci;

lexer = sci_get_lexer(sci);
lexer = sci_get_lexer(editor->sci);
if(lexer != SCLEX_HTML)
{
return FALSE;
Expand All @@ -321,7 +316,7 @@ static gboolean on_editor_notify(GObject *obj, GeanyEditor *editor,
switch (nt->nmhdr.code)
{
case SCN_UPDATEUI:
run_tag_highlighter();
run_tag_highlighter(editor->sci);
break;
}

Expand All @@ -348,8 +343,7 @@ void plugin_cleanup(void)

if (doc)
{
sci = doc->editor->sci;
clear_previous_highlighting(highlightedBrackets[0], highlightedBrackets[1]);
clear_previous_highlighting(highlightedBrackets[2], highlightedBrackets[3]);
clear_previous_highlighting(doc->editor->sci, highlightedBrackets[0], highlightedBrackets[1]);
clear_previous_highlighting(doc->editor->sci, highlightedBrackets[2], highlightedBrackets[3]);
}
}

0 comments on commit 139793f

Please sign in to comment.