diff options
author | ailin-nemui <ailin-nemui@users.noreply.github.com> | 2017-01-03 12:45:27 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-01-03 12:45:27 +0100 |
commit | 5787e2b4befb61585fc312843bd7a5efd0101dce (patch) | |
tree | c0073992aa598692aceffa8a10a4695cdb068585 | |
parent | 91f48c6f0e03e53c0968a5433d672ea966006e59 (diff) | |
parent | 1f72b8e66a06b484dde20b6031c766a2129e0bd2 (diff) | |
download | irssi-5787e2b4befb61585fc312843bd7a5efd0101dce.zip |
Merge pull request #412 from LemonBoy/pcre-regexp
Use GLib's regexp interface (backed by PCRE)
-rw-r--r-- | configure.ac | 18 | ||||
-rw-r--r-- | src/common.h | 2 | ||||
-rw-r--r-- | src/core/ignore.c | 28 | ||||
-rw-r--r-- | src/core/ignore.h | 6 | ||||
-rw-r--r-- | src/core/misc.c | 2 | ||||
-rw-r--r-- | src/fe-common/core/fe-ignore.c | 5 | ||||
-rw-r--r-- | src/fe-common/core/hilight-text.c | 41 | ||||
-rw-r--r-- | src/fe-common/core/hilight-text.h | 6 | ||||
-rw-r--r-- | src/fe-text/textbuffer.c | 40 |
9 files changed, 114 insertions, 34 deletions
diff --git a/configure.ac b/configure.ac index bf87f5aa..8d588408 100644 --- a/configure.ac +++ b/configure.ac @@ -21,7 +21,7 @@ AC_PATH_PROG(perlpath, perl) AC_CHECK_HEADERS(unistd.h dirent.h sys/ioctl.h sys/resource.h) # check posix headers.. -AC_CHECK_HEADERS(sys/socket.h sys/time.h sys/utsname.h regex.h) +AC_CHECK_HEADERS(sys/socket.h sys/time.h sys/utsname.h) AC_SYS_LARGEFILE @@ -144,6 +144,15 @@ AC_ARG_ENABLE(true-color, fi, want_truecolor=no) +AC_ARG_ENABLE(gregex, +[ --disable-gregex Build without GRegex (fall back to regex.h)], + if test x$enableval = xno ; then + want_gregex=no + else + want_gregex=yes + fi, + want_gregex=yes) + dnl ** dnl ** just some generic stuff... dnl ** @@ -534,6 +543,12 @@ else want_truecolor=no fi +if test "x$want_gregex" = "xyes"; then + AC_DEFINE([USE_GREGEX], [], [use GRegex for regular expressions]) +else + want_gregex=no +fi + AH_TEMPLATE(HAVE_GMODULE) AH_TEMPLATE(HAVE_SOCKS_H, [misc..]) AH_TEMPLATE(HAVE_STATIC_PERL) @@ -648,6 +663,7 @@ echo echo "Building with 64bit DCC support .. : $offt_64bit" echo "Building with true color support.. : $want_truecolor" +echo "Building with GRegex ............. : $want_gregex" echo echo "If there are any problems, read the INSTALL file." diff --git a/src/common.h b/src/common.h index 0a7b72f0..43596580 100644 --- a/src/common.h +++ b/src/common.h @@ -6,7 +6,7 @@ #define IRSSI_GLOBAL_CONFIG "irssi.conf" /* config file name in /etc/ */ #define IRSSI_HOME_CONFIG "config" /* config file name in ~/.irssi/ */ -#define IRSSI_ABI_VERSION 6 +#define IRSSI_ABI_VERSION 7 #define DEFAULT_SERVER_ADD_PORT 6667 diff --git a/src/core/ignore.c b/src/core/ignore.c index 2047dc9d..bf8db04f 100644 --- a/src/core/ignore.c +++ b/src/core/ignore.c @@ -67,11 +67,12 @@ static int ignore_match_pattern(IGNORE_REC *rec, const char *text) return FALSE; if (rec->regexp) { -#ifdef HAVE_REGEX_H +#ifdef USE_GREGEX + return rec->preg != NULL && + g_regex_match(rec->preg, text, 0, NULL); +#else return rec->regexp_compiled && regexec(&rec->preg, text, 0, NULL, 0) == 0; -#else - return FALSE; #endif } @@ -326,12 +327,27 @@ static void ignore_remove_config(IGNORE_REC *rec) static void ignore_init_rec(IGNORE_REC *rec) { -#ifdef HAVE_REGEX_H +#ifdef USE_GREGEX + if (rec->preg != NULL) + g_regex_unref(rec->preg); + + if (rec->regexp && rec->pattern != NULL) { + GError *re_error; + + rec->preg = g_regex_new(rec->pattern, G_REGEX_OPTIMIZE | G_REGEX_RAW | G_REGEX_CASELESS, 0, &re_error); + + if (rec->preg == NULL) { + g_warning("Failed to compile regexp '%s': %s", rec->pattern, re_error->message); + g_error_free(re_error); + } + } +#else char *errbuf; int errcode, errbuf_len; if (rec->regexp_compiled) regfree(&rec->preg); rec->regexp_compiled = FALSE; + if (rec->regexp && rec->pattern != NULL) { errcode = regcomp(&rec->preg, rec->pattern, REG_EXTENDED|REG_ICASE|REG_NOSUB); @@ -365,7 +381,9 @@ static void ignore_destroy(IGNORE_REC *rec, int send_signal) if (send_signal) signal_emit("ignore destroyed", 1, rec); -#ifdef HAVE_REGEX_H +#ifdef USE_GREGEX + if (rec->preg != NULL) g_regex_unref(rec->preg); +#else if (rec->regexp_compiled) regfree(&rec->preg); #endif if (rec->channels != NULL) g_strfreev(rec->channels); diff --git a/src/core/ignore.h b/src/core/ignore.h index f889740f..80ae1d12 100644 --- a/src/core/ignore.h +++ b/src/core/ignore.h @@ -1,7 +1,7 @@ #ifndef __IGNORE_H #define __IGNORE_H -#ifdef HAVE_REGEX_H +#ifndef USE_GREGEX # include <regex.h> #endif @@ -20,7 +20,9 @@ struct _IGNORE_REC { unsigned int regexp:1; unsigned int fullword:1; unsigned int replies:1; /* ignore replies to nick in channel */ -#ifdef HAVE_REGEX_H +#ifdef USE_GREGEX + GRegex *preg; +#else unsigned int regexp_compiled:1; /* should always be TRUE, unless regexp is invalid */ regex_t preg; #endif diff --git a/src/core/misc.c b/src/core/misc.c index 0bb1f7e6..1cfa15b6 100644 --- a/src/core/misc.c +++ b/src/core/misc.c @@ -22,7 +22,7 @@ #include "misc.h" #include "commands.h" -#ifdef HAVE_REGEX_H +#ifndef USE_GREGEX # include <regex.h> #endif diff --git a/src/fe-common/core/fe-ignore.c b/src/fe-common/core/fe-ignore.c index 52b11e6b..800e881d 100644 --- a/src/fe-common/core/fe-ignore.c +++ b/src/fe-common/core/fe-ignore.c @@ -58,7 +58,10 @@ static void ignore_print(int index, IGNORE_REC *rec) g_string_append(options, "-regexp "); if (rec->pattern == NULL) g_string_append(options, "[INVALID! -pattern missing] "); -#ifdef HAVE_REGEX_H +#ifdef USE_GREGEX + else if (rec->preg == NULL) + g_string_append(options, "[INVALID!] "); +#else else if (!rec->regexp_compiled) g_string_append(options, "[INVALID!] "); #endif diff --git a/src/fe-common/core/hilight-text.c b/src/fe-common/core/hilight-text.c index 4691a708..037cde5c 100644 --- a/src/fe-common/core/hilight-text.c +++ b/src/fe-common/core/hilight-text.c @@ -101,7 +101,9 @@ static void hilight_destroy(HILIGHT_REC *rec) { g_return_if_fail(rec != NULL); -#ifdef HAVE_REGEX_H +#ifdef USE_GREGEX + if (rec->preg != NULL) g_regex_unref(rec->preg); +#else if (rec->regexp_compiled) regfree(&rec->preg); #endif if (rec->channels != NULL) g_strfreev(rec->channels); @@ -120,7 +122,12 @@ static void hilights_destroy_all(void) static void hilight_init_rec(HILIGHT_REC *rec) { -#ifdef HAVE_REGEX_H +#ifdef USE_GREGEX + if (rec->preg != NULL) + g_regex_unref(rec->preg); + + rec->preg = g_regex_new(rec->text, G_REGEX_OPTIMIZE | G_REGEX_RAW | G_REGEX_CASELESS, 0, NULL); +#else if (rec->regexp_compiled) regfree(&rec->preg); if (!rec->regexp) rec->regexp_compiled = FALSE; @@ -194,13 +201,24 @@ static HILIGHT_REC *hilight_find(const char *text, char **channels) return NULL; } -static int hilight_match_text(HILIGHT_REC *rec, const char *text, +static gboolean hilight_match_text(HILIGHT_REC *rec, const char *text, int *match_beg, int *match_end) { - char *match; + gboolean ret = FALSE; if (rec->regexp) { -#ifdef HAVE_REGEX_H +#ifdef USE_GREGEX + if (rec->preg != NULL) { + GMatchInfo *match; + + g_regex_match (rec->preg, text, 0, &match); + + if (g_match_info_matches(match)) + ret = g_match_info_fetch_pos(match, 0, match_beg, match_end); + + g_match_info_free(match); + } +#else regmatch_t rmatch[1]; if (rec->regexp_compiled && @@ -210,10 +228,12 @@ static int hilight_match_text(HILIGHT_REC *rec, const char *text, *match_beg = rmatch[0].rm_so; *match_end = rmatch[0].rm_eo; } - return TRUE; + ret = TRUE; } #endif } else { + char *match; + if (rec->case_sensitive) { match = rec->fullword ? strstr_full(text, rec->text) : @@ -228,11 +248,11 @@ static int hilight_match_text(HILIGHT_REC *rec, const char *text, *match_beg = (int) (match-text); *match_end = *match_beg + strlen(rec->text); } - return TRUE; + ret = TRUE; } } - return FALSE; + return ret; } #define hilight_match_level(rec, level) \ @@ -509,7 +529,10 @@ static void hilight_print(int index, HILIGHT_REC *rec) if (rec->case_sensitive) g_string_append(options, "-matchcase "); if (rec->regexp) { g_string_append(options, "-regexp "); -#ifdef HAVE_REGEX_H +#ifdef USE_GREGEX + if (rec->preg == NULL) + g_string_append(options, "[INVALID!] "); +#else if (!rec->regexp_compiled) g_string_append(options, "[INVALID!] "); #endif diff --git a/src/fe-common/core/hilight-text.h b/src/fe-common/core/hilight-text.h index ae05e1ca..76beec1f 100644 --- a/src/fe-common/core/hilight-text.h +++ b/src/fe-common/core/hilight-text.h @@ -1,7 +1,7 @@ #ifndef __HILIGHT_TEXT_H #define __HILIGHT_TEXT_H -#ifdef HAVE_REGEX_H +#ifndef USE_GREGEX # include <regex.h> #endif @@ -24,7 +24,9 @@ struct _HILIGHT_REC { unsigned int fullword:1; /* match `text' only for full words */ unsigned int regexp:1; /* `text' is a regular expression */ unsigned int case_sensitive:1;/* `text' must match case */ -#ifdef HAVE_REGEX_H +#ifdef USE_GREGEX + GRegex *preg; +#else unsigned int regexp_compiled:1; /* should always be TRUE, unless regexp is invalid */ regex_t preg; #endif diff --git a/src/fe-text/textbuffer.c b/src/fe-text/textbuffer.c index 24ee62bc..ae4636a5 100644 --- a/src/fe-text/textbuffer.c +++ b/src/fe-text/textbuffer.c @@ -27,7 +27,7 @@ #include "textbuffer.h" -#ifdef HAVE_REGEX_H +#ifndef USE_GREGEX # include <regex.h> #endif @@ -537,7 +537,9 @@ GList *textbuffer_find_text(TEXT_BUFFER_REC *buffer, LINE_REC *startline, int before, int after, int regexp, int fullword, int case_sensitive) { -#ifdef HAVE_REGEX_H +#ifdef USE_GREGEX + GRegex *preg; +#else regex_t preg; #endif LINE_REC *line, *pre_line; @@ -549,16 +551,23 @@ GList *textbuffer_find_text(TEXT_BUFFER_REC *buffer, LINE_REC *startline, g_return_val_if_fail(buffer != NULL, NULL); g_return_val_if_fail(text != NULL, NULL); +#ifdef USE_GREGEX + preg = NULL; + + if (regexp) { + preg = g_regex_new(text, G_REGEX_RAW | (case_sensitive ? 0 : G_REGEX_CASELESS), 0, NULL); + + if (preg == NULL) + return NULL; + } +#else if (regexp) { -#ifdef HAVE_REGEX_H int flags = REG_EXTENDED | REG_NOSUB | (case_sensitive ? 0 : REG_ICASE); if (regcomp(&preg, text, flags) != 0) return NULL; -#else - return NULL; -#endif } +#endif matches = NULL; match_after = 0; str = g_string_new(NULL); @@ -577,12 +586,15 @@ GList *textbuffer_find_text(TEXT_BUFFER_REC *buffer, LINE_REC *startline, if (*text != '\0') { textbuffer_line2text(line, FALSE, str); - if (line_matched) - line_matched = -#ifdef HAVE_REGEX_H - regexp ? regexec(&preg, str->str, 0, NULL, 0) == 0 : + if (line_matched) { + line_matched = regexp ? +#ifdef USE_GREGEX + g_regex_match(preg, str->str, 0, NULL) +#else + regexec(&preg, str->str, 0, NULL, 0) == 0 #endif - match_func(str->str, text) != NULL; + : match_func(str->str, text) != NULL; + } } if (line_matched) { @@ -610,7 +622,11 @@ GList *textbuffer_find_text(TEXT_BUFFER_REC *buffer, LINE_REC *startline, matches = g_list_append(matches, NULL); } } -#ifdef HAVE_REGEX_H + +#ifdef USE_GREGEX + if (preg != NULL) + g_regex_unref(preg); +#else if (regexp) regfree(&preg); #endif g_string_free(str, TRUE); |