[geany/geany] e503f8: Use GRegex for build error regex matching

Nick Treleaven git-noreply at xxxxx
Thu Jul 26 00:02:34 UTC 2012


Branch:      refs/heads/document-messages
Author:      Nick Treleaven <nick.treleaven at btinternet.com>
Committer:   Nick Treleaven <nick.treleaven at btinternet.com>
Date:        Mon, 26 Dec 2011 17:42:13
Commit:      e503f8262a30cbda0cc5dcd69a8e5678deda1f40
             https://github.com/geany/geany/commit/e503f8262a30cbda0cc5dcd69a8e5678deda1f40

Log Message:
-----------
Use GRegex for build error regex matching


Modified Paths:
--------------
    src/filetypes.c
    src/filetypesprivate.h

Modified: src/filetypes.c
53 files changed, 23 insertions(+), 30 deletions(-)
===================================================================
@@ -1114,10 +1114,10 @@ static void set_error_regex(GeanyFiletype *ft, gchar *string)
 {
 	setptr(ft->error_regex_string, string);
 
-	if (ft->priv->error_regex_compiled)
-		regfree(&ft->priv->error_regex);
+	if (ft->priv->error_regex)
+		g_regex_unref(ft->priv->error_regex);
 
-	ft->priv->error_regex_compiled = FALSE;
+	ft->priv->error_regex = NULL;
 	/* regex will be compiled when needed */
 }
 
@@ -1533,26 +1533,18 @@ GeanyFiletype *filetypes_lookup_by_name(const gchar *name)
 }
 
 
-static gchar *get_regex_match_string(const gchar *message, regmatch_t *pmatch, guint match_idx)
+static void compile_regex(GeanyFiletype *ft, gchar *regstr)
 {
-	return g_strndup(&message[pmatch[match_idx].rm_so],
-		pmatch[match_idx].rm_eo - pmatch[match_idx].rm_so);
-}
-
-
-static void compile_regex(GeanyFiletype *ft, regex_t *regex, gchar *regstr)
-{
-	gint retval = regcomp(regex, regstr, REG_EXTENDED);
-
-	ft->priv->error_regex_compiled = (retval == 0);	/* prevent recompilation */
+	GError *error = NULL;
+	GRegex *regex = g_regex_new(regstr, 0, 0, &error);
 
-	if (G_UNLIKELY(retval != 0))
+	if (!regex)
 	{
-		gchar buf[256];
-		regerror(retval, regex, buf, sizeof buf);
 		ui_set_statusbar(TRUE, _("Bad regex for filetype %s: %s"),
-			filetypes_get_display_name(ft), buf);
+			filetypes_get_display_name(ft), error->message);
+		g_error_free(error);
 	}
+	ft->priv->error_regex = regex;
 	/* regex will be freed in set_error_regex(). */
 }
 
@@ -1563,8 +1555,7 @@ gboolean filetypes_parse_error_message(GeanyFiletype *ft, const gchar *message,
 	gchar *regstr;
 	gchar **tmp;
 	GeanyDocument *doc;
-	regex_t *regex;
-	regmatch_t pmatch[3];
+	GMatchInfo *minfo;
 
 	if (ft == NULL)
 	{
@@ -1576,7 +1567,6 @@ gboolean filetypes_parse_error_message(GeanyFiletype *ft, const gchar *message,
 	if (tmp == NULL)
 		return FALSE;
 	regstr = *tmp;
-	regex = &ft->priv->error_regex;
 
 	*filename = NULL;
 	*line = -1;
@@ -1584,24 +1574,26 @@ gboolean filetypes_parse_error_message(GeanyFiletype *ft, const gchar *message,
 	if (G_UNLIKELY(! NZV(regstr)))
 		return FALSE;
 
-	if (!ft->priv->error_regex_compiled || regstr != ft->priv->last_string)
+	if (!ft->priv->error_regex || regstr != ft->priv->last_error_pattern)
 	{
-		compile_regex(ft, regex, regstr);
-		ft->priv->last_string = regstr;
+		compile_regex(ft, regstr);
+		ft->priv->last_error_pattern = regstr;
 	}
-	if (!ft->priv->error_regex_compiled)	/* regex error */
+	if (!ft->priv->error_regex)
 		return FALSE;
 
-	if (regexec(regex, message, G_N_ELEMENTS(pmatch), pmatch, 0) != 0)
+	if (!g_regex_match(ft->priv->error_regex, message, 0, &minfo))
+	{
+		g_match_info_free(minfo);
 		return FALSE;
-
-	if (pmatch[0].rm_so != -1 && pmatch[1].rm_so != -1 && pmatch[2].rm_so != -1)
+	}
+	if (g_match_info_get_match_count(minfo) >= 3)
 	{
 		gchar *first, *second, *end;
 		glong l;
 
-		first = get_regex_match_string(message, pmatch, 1);
-		second = get_regex_match_string(message, pmatch, 2);
+		first = g_match_info_fetch(minfo, 1);
+		second = g_match_info_fetch(minfo, 2);
 		l = strtol(first, &end, 10);
 		if (*end == '\0')	/* first is purely decimals */
 		{
@@ -1625,6 +1617,7 @@ gboolean filetypes_parse_error_message(GeanyFiletype *ft, const gchar *message,
 			}
 		}
 	}
+	g_match_info_free(minfo);
 	return *filename != NULL;
 }
 


Modified: src/filetypesprivate.h
12 files changed, 2 insertions(+), 10 deletions(-)
===================================================================
@@ -24,21 +24,13 @@
 #ifndef GEANY_FILETYPES_PRIVATE_H
 #define GEANY_FILETYPES_PRIVATE_H
 
-#ifdef HAVE_REGEX_H
-# include <regex.h>
-#else
-# include "gnuregex.h"
-#endif
-
-
 /* Private GeanyFiletype fields */
 typedef struct GeanyFiletypePrivate
 {
 	GtkWidget	*menu_item;			/* holds a pointer to the menu item for this filetype */
 	gboolean	keyfile_loaded;
-	regex_t		error_regex;
-	gboolean	error_regex_compiled;
-	gchar		*last_string; /* last one compiled */
+	GRegex		*error_regex;
+	gchar		*last_error_pattern;
 	gboolean	custom;
 	gint		symbol_list_sort_mode;
 	gboolean	xml_indent_tags; /* XML tag autoindentation, for HTML and XML filetypes */


@@ Diff output truncated at 100000 characters. @@


--------------
This E-Mail was brought to you by github_commit_mail.py (Source: TBD).



More information about the Commits mailing list