diff --git a/configure.in b/configure.in index 5919d9823..0d38548d4 100644 --- a/configure.in +++ b/configure.in @@ -55,7 +55,7 @@ AC_CHECK_LIB(ncursesw, initscr, LIBNCURSESW_FOUND=1, LIBNCURSESW_FOUND=0) # Checks for header files AC_HEADER_STDC -AC_CHECK_HEADERS([arpa/inet.h libintl.h limits.h locale.h netdb.h netinet/in.h stdlib.h string.h sys/socket.h sys/time.h sys/types.h unistd.h pwd.h errno.h]) +AC_CHECK_HEADERS([arpa/inet.h libintl.h limits.h locale.h netdb.h netinet/in.h stdlib.h string.h sys/socket.h sys/time.h sys/types.h unistd.h pwd.h errno.h regex.h]) # Checks for typedefs, structures, and compiler characteristics AC_HEADER_TIME @@ -78,7 +78,7 @@ AC_MSG_RESULT($ac_cv_type_socklen_t) # Checks for library functions. AC_FUNC_SELECT_ARGTYPES AC_TYPE_SIGNAL -AC_CHECK_FUNCS([gethostbyname gethostname getsockname gettimeofday inet_ntoa memset mkdir select setlocale socket strcasecmp strchr strdup strncasecmp strpbrk strrchr strstr uname]) +AC_CHECK_FUNCS([gethostbyname gethostname getsockname gettimeofday inet_ntoa memset mkdir select setlocale socket strcasecmp strchr strdup strncasecmp strpbrk strrchr strstr uname regexec]) # Variables in config.h diff --git a/src/irc/irc-recv.c b/src/irc/irc-recv.c index 341d1166b..a9bc88be4 100644 --- a/src/irc/irc-recv.c +++ b/src/irc/irc-recv.c @@ -33,6 +33,7 @@ #include #include #include +#include #include "../common/weechat.h" #include "irc.h" @@ -3661,8 +3662,18 @@ irc_cmd_recv_322 (t_irc_server *server, char *host, char *nick, char *arguments) else pos = arguments; - irc_display_prefix (server, server->buffer, PREFIX_SERVER); - gui_printf (server->buffer, "%s\n", pos); + if (server->cmd_list_re) + { + if (regexec (server->cmd_list_re, pos, 0, NULL, 0) == 0) { + irc_display_prefix (server, server->buffer, PREFIX_SERVER); + gui_printf (server->buffer, "%s\n", pos); + } + } + else + { + irc_display_prefix (server, server->buffer, PREFIX_SERVER); + gui_printf (server->buffer, "%s\n", pos); + } } return 0; } diff --git a/src/irc/irc-send.c b/src/irc/irc-send.c index 92d3fccce..f43fe18fb 100644 --- a/src/irc/irc-send.c +++ b/src/irc/irc-send.c @@ -33,6 +33,7 @@ #include #include #include +#include #include "../common/weechat.h" #include "irc.h" @@ -1117,11 +1118,41 @@ irc_cmd_send_list (t_irc_server *server, t_irc_channel *channel, { /* make gcc happy */ (void) channel; + char buffer[512]; + int ret; + + if (server->cmd_list_re) + { + regfree (server->cmd_list_re); + free (server->cmd_list_re); + server->cmd_list_re = NULL; + } if (arguments) - server_sendf (server, "LIST %s\r\n", arguments); + { + server->cmd_list_re = (regex_t *) malloc (sizeof (regex_t)); + if (server->cmd_list_re) + { + if ((ret = regcomp (server->cmd_list_re, arguments, REG_NOSUB | REG_ICASE)) != 0) + { + regerror (ret, server->cmd_list_re, buffer, sizeof(buffer)); + gui_printf (server->buffer, + _("%s \"%s\" is not a valid regular expression (%s)\n"), + WEECHAT_ERROR, arguments, buffer); + } + else + server_sendf (server, "LIST\r\n"); + } + else + { + gui_printf (server->buffer, + _("%s unable to alloc memory for regular expression\n"), + WEECHAT_ERROR); + } + } else - server_sendf (server, "LIST\r\n"); + server_sendf (server, "LIST\r\n"); + return 0; } diff --git a/src/irc/irc-server.c b/src/irc/irc-server.c index 933598dae..c5be5ef9b 100644 --- a/src/irc/irc-server.c +++ b/src/irc/irc-server.c @@ -110,6 +110,9 @@ server_init (t_irc_server *server) server->saved_buffer = NULL; server->channels = NULL; server->last_channel = NULL; + + /* regexp vars */ + server->cmd_list_re = NULL; } /* diff --git a/src/irc/irc.h b/src/irc/irc.h index 71c6b42ab..715972758 100644 --- a/src/irc/irc.h +++ b/src/irc/irc.h @@ -28,6 +28,7 @@ #include #include #include +#include #ifdef HAVE_GNUTLS #include @@ -177,6 +178,9 @@ struct t_irc_server t_irc_channel *last_channel; /* last opened channal on server */ t_irc_server *prev_server; /* link to previous server */ t_irc_server *next_server; /* link to next server */ + + /* regexp vars */ + regex_t *cmd_list_re; /* compiled Regular Expression for /list */ }; /* irc commands */ diff --git a/weechat/configure.in b/weechat/configure.in index 5919d9823..0d38548d4 100644 --- a/weechat/configure.in +++ b/weechat/configure.in @@ -55,7 +55,7 @@ AC_CHECK_LIB(ncursesw, initscr, LIBNCURSESW_FOUND=1, LIBNCURSESW_FOUND=0) # Checks for header files AC_HEADER_STDC -AC_CHECK_HEADERS([arpa/inet.h libintl.h limits.h locale.h netdb.h netinet/in.h stdlib.h string.h sys/socket.h sys/time.h sys/types.h unistd.h pwd.h errno.h]) +AC_CHECK_HEADERS([arpa/inet.h libintl.h limits.h locale.h netdb.h netinet/in.h stdlib.h string.h sys/socket.h sys/time.h sys/types.h unistd.h pwd.h errno.h regex.h]) # Checks for typedefs, structures, and compiler characteristics AC_HEADER_TIME @@ -78,7 +78,7 @@ AC_MSG_RESULT($ac_cv_type_socklen_t) # Checks for library functions. AC_FUNC_SELECT_ARGTYPES AC_TYPE_SIGNAL -AC_CHECK_FUNCS([gethostbyname gethostname getsockname gettimeofday inet_ntoa memset mkdir select setlocale socket strcasecmp strchr strdup strncasecmp strpbrk strrchr strstr uname]) +AC_CHECK_FUNCS([gethostbyname gethostname getsockname gettimeofday inet_ntoa memset mkdir select setlocale socket strcasecmp strchr strdup strncasecmp strpbrk strrchr strstr uname regexec]) # Variables in config.h diff --git a/weechat/src/irc/irc-recv.c b/weechat/src/irc/irc-recv.c index 341d1166b..a9bc88be4 100644 --- a/weechat/src/irc/irc-recv.c +++ b/weechat/src/irc/irc-recv.c @@ -33,6 +33,7 @@ #include #include #include +#include #include "../common/weechat.h" #include "irc.h" @@ -3661,8 +3662,18 @@ irc_cmd_recv_322 (t_irc_server *server, char *host, char *nick, char *arguments) else pos = arguments; - irc_display_prefix (server, server->buffer, PREFIX_SERVER); - gui_printf (server->buffer, "%s\n", pos); + if (server->cmd_list_re) + { + if (regexec (server->cmd_list_re, pos, 0, NULL, 0) == 0) { + irc_display_prefix (server, server->buffer, PREFIX_SERVER); + gui_printf (server->buffer, "%s\n", pos); + } + } + else + { + irc_display_prefix (server, server->buffer, PREFIX_SERVER); + gui_printf (server->buffer, "%s\n", pos); + } } return 0; } diff --git a/weechat/src/irc/irc-send.c b/weechat/src/irc/irc-send.c index 92d3fccce..f43fe18fb 100644 --- a/weechat/src/irc/irc-send.c +++ b/weechat/src/irc/irc-send.c @@ -33,6 +33,7 @@ #include #include #include +#include #include "../common/weechat.h" #include "irc.h" @@ -1117,11 +1118,41 @@ irc_cmd_send_list (t_irc_server *server, t_irc_channel *channel, { /* make gcc happy */ (void) channel; + char buffer[512]; + int ret; + + if (server->cmd_list_re) + { + regfree (server->cmd_list_re); + free (server->cmd_list_re); + server->cmd_list_re = NULL; + } if (arguments) - server_sendf (server, "LIST %s\r\n", arguments); + { + server->cmd_list_re = (regex_t *) malloc (sizeof (regex_t)); + if (server->cmd_list_re) + { + if ((ret = regcomp (server->cmd_list_re, arguments, REG_NOSUB | REG_ICASE)) != 0) + { + regerror (ret, server->cmd_list_re, buffer, sizeof(buffer)); + gui_printf (server->buffer, + _("%s \"%s\" is not a valid regular expression (%s)\n"), + WEECHAT_ERROR, arguments, buffer); + } + else + server_sendf (server, "LIST\r\n"); + } + else + { + gui_printf (server->buffer, + _("%s unable to alloc memory for regular expression\n"), + WEECHAT_ERROR); + } + } else - server_sendf (server, "LIST\r\n"); + server_sendf (server, "LIST\r\n"); + return 0; } diff --git a/weechat/src/irc/irc-server.c b/weechat/src/irc/irc-server.c index 933598dae..c5be5ef9b 100644 --- a/weechat/src/irc/irc-server.c +++ b/weechat/src/irc/irc-server.c @@ -110,6 +110,9 @@ server_init (t_irc_server *server) server->saved_buffer = NULL; server->channels = NULL; server->last_channel = NULL; + + /* regexp vars */ + server->cmd_list_re = NULL; } /* diff --git a/weechat/src/irc/irc.h b/weechat/src/irc/irc.h index 71c6b42ab..715972758 100644 --- a/weechat/src/irc/irc.h +++ b/weechat/src/irc/irc.h @@ -28,6 +28,7 @@ #include #include #include +#include #ifdef HAVE_GNUTLS #include @@ -177,6 +178,9 @@ struct t_irc_server t_irc_channel *last_channel; /* last opened channal on server */ t_irc_server *prev_server; /* link to previous server */ t_irc_server *next_server; /* link to next server */ + + /* regexp vars */ + regex_t *cmd_list_re; /* compiled Regular Expression for /list */ }; /* irc commands */