[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