summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSebastien Helleu <flashcode@flashtux.org>2013-08-17 11:51:50 +0200
committerSebastien Helleu <flashcode@flashtux.org>2013-08-17 11:51:50 +0200
commit600ee3ddf37c070cab373346661d55718d2130b9 (patch)
treeff8c99c98ed7c4371eb4a6641a056d9b28ac6c71 /src
parentc6249603368de12acfac60868d4bddd18d29abba (diff)
downloadweechat-600ee3ddf37c070cab373346661d55718d2130b9.zip
core: add search of regular expression in buffer, don't reset search type on a new search, select where to search (messages/prefixes)
Key changed in search context: - ctrl+"r": switch search type: string/regex New keys in search context: - alt+"c": case (in)sensitive search - tab: search in messages/prefixes/both
Diffstat (limited to 'src')
-rw-r--r--src/core/wee-command.c6
-rw-r--r--src/gui/curses/gui-curses-chat.c10
-rw-r--r--src/gui/curses/gui-curses-key.c16
-rw-r--r--src/gui/gui-bar-item.c36
-rw-r--r--src/gui/gui-buffer.c31
-rw-r--r--src/gui/gui-buffer.h6
-rw-r--r--src/gui/gui-color.c1
-rw-r--r--src/gui/gui-input.c102
-rw-r--r--src/gui/gui-input.h5
-rw-r--r--src/gui/gui-line.c51
-rw-r--r--src/gui/gui-line.h4
-rw-r--r--src/gui/gui-window.c19
12 files changed, 226 insertions, 61 deletions
diff --git a/src/core/wee-command.c b/src/core/wee-command.c
index dd2df49d4..f285cd73f 100644
--- a/src/core/wee-command.c
+++ b/src/core/wee-command.c
@@ -2507,6 +2507,10 @@ COMMAND_CALLBACK(input)
gui_input_search_next (buffer);
else if (string_strcasecmp (argv[1], "search_switch_case") == 0)
gui_input_search_switch_case (buffer);
+ else if (string_strcasecmp (argv[1], "search_switch_regex") == 0)
+ gui_input_search_switch_regex (buffer);
+ else if (string_strcasecmp (argv[1], "search_switch_where") == 0)
+ gui_input_search_switch_where (buffer);
else if (string_strcasecmp (argv[1], "search_stop") == 0)
gui_input_search_stop (buffer);
else if (string_strcasecmp (argv[1], "delete_previous_char") == 0)
@@ -6523,6 +6527,8 @@ command_init ()
"completion\n"
" search_text: search text in buffer\n"
" search_switch_case: switch exact case for search\n"
+ " search_switch_regex: switch search type: string/regular expression\n"
+ " search_switch_where: switch search in messages/prefixes\n"
" search_previous: search previous line\n"
" search_next: search next line\n"
" search_stop: stop search\n"
diff --git a/src/gui/curses/gui-curses-chat.c b/src/gui/curses/gui-curses-chat.c
index e28dc92a6..b62dc52ff 100644
--- a/src/gui/curses/gui-curses-chat.c
+++ b/src/gui/curses/gui-curses-chat.c
@@ -1201,12 +1201,15 @@ gui_chat_display_line (struct t_gui_window *window, struct t_gui_line *line,
ptr_data = (message_with_tags) ?
message_with_tags : line->data->message;
message_with_search = NULL;
- if (window->buffer->text_search != GUI_TEXT_SEARCH_DISABLED)
+ if ((window->buffer->text_search != GUI_TEXT_SEARCH_DISABLED)
+ && (window->buffer->text_search_where & GUI_TEXT_SEARCH_IN_MESSAGE)
+ && (!window->buffer->text_search_regex
+ || window->buffer->text_search_regex_compiled))
{
message_with_search = gui_color_emphasize (ptr_data,
window->buffer->input_buffer,
window->buffer->text_search_exact,
- NULL);
+ window->buffer->text_search_regex_compiled);
if (message_with_search)
ptr_data = message_with_search;
}
@@ -1321,8 +1324,7 @@ gui_chat_display_line (struct t_gui_window *window, struct t_gui_line *line,
/* display marker if line is matching user search */
if (window->buffer->text_search != GUI_TEXT_SEARCH_DISABLED)
{
- if (gui_line_search_text (line, window->buffer->input_buffer,
- window->buffer->text_search_exact))
+ if (gui_line_search_text (window->buffer, line))
{
gui_window_set_weechat_color (GUI_WINDOW_OBJECTS(window)->win_chat,
GUI_COLOR_CHAT_TEXT_FOUND);
diff --git a/src/gui/curses/gui-curses-key.c b/src/gui/curses/gui-curses-key.c
index 3d632886b..ef0bc7b92 100644
--- a/src/gui/curses/gui-curses-key.c
+++ b/src/gui/curses/gui-curses-key.c
@@ -223,7 +223,9 @@ gui_key_default_bindings (int context)
{
BIND(/* Enter */ "ctrl-M", "/input search_stop");
BIND(/* Enter */ "ctrl-J", "/input search_stop");
- BIND(/* ^R */ "ctrl-R", "/input search_switch_case");
+ BIND(/* m-c */ "meta-c", "/input search_switch_case");
+ BIND(/* ^R */ "ctrl-R", "/input search_switch_regex");
+ BIND(/* tab */ "ctrl-I", "/input search_switch_where");
BIND(/* up */ "meta2-A", "/input search_previous");
BIND(/* down */ "meta2-B", "/input search_next");
}
@@ -433,12 +435,16 @@ gui_key_flush (int paste)
|| (strcmp (input_old, gui_current_window->buffer->input_buffer) != 0)))
{
/*
- * if current input is longer than old input, and that
- * beginning of current input is exactly equal to old input,
- * then do nothing (search will not find any result and can
- * take some time on buffer with many lines..)
+ * if following conditions are all true, then do not search
+ * again (search will not find any result and can take some time
+ * on a buffer with many lines):
+ * - old search was not successful
+ * - searching a string (not a regex)
+ * - current input is longer than old input
+ * - beginning of current input is exactly equal to old input.
*/
if (!gui_current_window->buffer->text_search_found
+ && !gui_current_window->buffer->text_search_regex
&& (input_old != NULL)
&& (input_old[0])
&& (gui_current_window->buffer->input_buffer != NULL)
diff --git a/src/gui/gui-bar-item.c b/src/gui/gui-bar-item.c
index b7a601a84..d12c5a9f1 100644
--- a/src/gui/gui-bar-item.c
+++ b/src/gui/gui-bar-item.c
@@ -700,10 +700,7 @@ char *
gui_bar_item_default_input_search (void *data, struct t_gui_bar_item *item,
struct t_gui_window *window)
{
- char *text_search = N_("Text search");
- char *text_search_exact = N_("Text search (exact)");
- char *ptr_message, *buf;
- int length;
+ char str_search[1024];
/* make C compiler happy */
(void) data;
@@ -715,22 +712,21 @@ gui_bar_item_default_input_search (void *data, struct t_gui_bar_item *item,
if (window->buffer->text_search == GUI_TEXT_SEARCH_DISABLED)
return NULL;
- ptr_message = (window->buffer->text_search_exact) ?
- _(text_search_exact) : _(text_search);
- length = 16 + strlen (ptr_message) + 1;
- buf = malloc (length);
- if (buf)
- {
- snprintf (buf, length, "%s%s",
- (window->buffer->text_search_found
- || !window->buffer->input_buffer
- || !window->buffer->input_buffer[0]) ?
- GUI_COLOR_CUSTOM_BAR_FG :
- gui_color_get_custom (gui_color_get_name (CONFIG_COLOR(config_color_input_text_not_found))),
- ptr_message);
- }
-
- return buf;
+ snprintf (str_search, sizeof (str_search), "%s%s (%s %s,%s%s%s)",
+ (window->buffer->text_search_found
+ || !window->buffer->input_buffer
+ || !window->buffer->input_buffer[0]) ?
+ GUI_COLOR_CUSTOM_BAR_FG :
+ gui_color_get_custom (gui_color_get_name (CONFIG_COLOR(config_color_input_text_not_found))),
+ _("Search"),
+ (window->buffer->text_search_exact) ? "==" : "~",
+ (window->buffer->text_search_regex) ? "regex" : "str",
+ (window->buffer->text_search_where & GUI_TEXT_SEARCH_IN_PREFIX) ? "pre" : "",
+ ((window->buffer->text_search_where & GUI_TEXT_SEARCH_IN_PREFIX)
+ && (window->buffer->text_search_where & GUI_TEXT_SEARCH_IN_MESSAGE)) ? "|" : "",
+ (window->buffer->text_search_where & GUI_TEXT_SEARCH_IN_MESSAGE) ? "msg" : "");
+
+ return strdup (str_search);
}
/*
diff --git a/src/gui/gui-buffer.c b/src/gui/gui-buffer.c
index 5b33a8c58..daa461ac0 100644
--- a/src/gui/gui-buffer.c
+++ b/src/gui/gui-buffer.c
@@ -81,7 +81,8 @@ char *gui_buffer_properties_get_integer[] =
"nicklist_count", "nicklist_groups_count", "nicklist_nicks_count",
"nicklist_visible_count", "input", "input_get_unknown_commands",
"input_size", "input_length", "input_pos", "input_1st_display",
- "num_history", "text_search", "text_search_exact", "text_search_found",
+ "num_history", "text_search", "text_search_exact", "text_search_regex",
+ "text_search_where", "text_search_found",
NULL
};
char *gui_buffer_properties_get_string[] =
@@ -91,7 +92,7 @@ char *gui_buffer_properties_get_string[] =
NULL
};
char *gui_buffer_properties_get_pointer[] =
-{ "plugin", "highlight_regex_compiled",
+{ "plugin", "text_search_regex_compiled", "highlight_regex_compiled",
NULL
};
char *gui_buffer_properties_set[] =
@@ -538,6 +539,9 @@ gui_buffer_new (struct t_weechat_plugin *plugin,
/* text search */
new_buffer->text_search = GUI_TEXT_SEARCH_DISABLED;
new_buffer->text_search_exact = 0;
+ new_buffer->text_search_regex = 0;
+ new_buffer->text_search_regex_compiled = NULL;
+ new_buffer->text_search_where = 0;
new_buffer->text_search_found = 0;
new_buffer->text_search_input = NULL;
@@ -895,6 +899,10 @@ gui_buffer_get_integer (struct t_gui_buffer *buffer, const char *property)
return buffer->text_search;
else if (string_strcasecmp (property, "text_search_exact") == 0)
return buffer->text_search_exact;
+ else if (string_strcasecmp (property, "text_search_regex") == 0)
+ return buffer->text_search_regex;
+ else if (string_strcasecmp (property, "text_search_where") == 0)
+ return buffer->text_search_where;
else if (string_strcasecmp (property, "text_search_found") == 0)
return buffer->text_search_found;
}
@@ -958,6 +966,8 @@ gui_buffer_get_pointer (struct t_gui_buffer *buffer, const char *property)
{
if (string_strcasecmp (property, "plugin") == 0)
return buffer->plugin;
+ else if (string_strcasecmp (property, "text_search_regex_compiled") == 0)
+ return buffer->text_search_regex_compiled;
else if (string_strcasecmp (property, "highlight_regex_compiled") == 0)
return buffer->highlight_regex_compiled;
}
@@ -2244,6 +2254,11 @@ gui_buffer_close (struct t_gui_buffer *buffer)
free (buffer->input_undo_snap);
if (buffer->text_search_input)
free (buffer->text_search_input);
+ if (buffer->text_search_regex_compiled)
+ {
+ regfree (buffer->text_search_regex_compiled);
+ free (buffer->text_search_regex_compiled);
+ }
if (buffer->highlight_words)
free (buffer->highlight_words);
if (buffer->highlight_regex)
@@ -3225,6 +3240,9 @@ gui_buffer_hdata_buffer_cb (void *data, const char *hdata_name)
HDATA_VAR(struct t_gui_buffer, num_history, INTEGER, 0, NULL, NULL);
HDATA_VAR(struct t_gui_buffer, text_search, INTEGER, 0, NULL, NULL);
HDATA_VAR(struct t_gui_buffer, text_search_exact, INTEGER, 0, NULL, NULL);
+ HDATA_VAR(struct t_gui_buffer, text_search_regex, INTEGER, 0, NULL, NULL);
+ HDATA_VAR(struct t_gui_buffer, text_search_regex_compiled, POINTER, 0, NULL, NULL);
+ HDATA_VAR(struct t_gui_buffer, text_search_where, INTEGER, 0, NULL, NULL);
HDATA_VAR(struct t_gui_buffer, text_search_found, INTEGER, 0, NULL, NULL);
HDATA_VAR(struct t_gui_buffer, text_search_input, STRING, 0, NULL, NULL);
HDATA_VAR(struct t_gui_buffer, highlight_words, STRING, 0, NULL, NULL);
@@ -3398,6 +3416,12 @@ gui_buffer_add_to_infolist (struct t_infolist *infolist,
return 0;
if (!infolist_new_var_integer (ptr_item, "text_search_exact", buffer->text_search_exact))
return 0;
+ if (!infolist_new_var_integer (ptr_item, "text_search_regex", buffer->text_search_regex))
+ return 0;
+ if (!infolist_new_var_pointer (ptr_item, "text_search_regex_compiled", buffer->text_search_regex_compiled))
+ return 0;
+ if (!infolist_new_var_integer (ptr_item, "text_search_where", buffer->text_search_where))
+ return 0;
if (!infolist_new_var_integer (ptr_item, "text_search_found", buffer->text_search_found))
return 0;
if (!infolist_new_var_string (ptr_item, "text_search_input", buffer->text_search_input))
@@ -3600,6 +3624,9 @@ gui_buffer_print_log ()
log_printf (" num_history . . . . . . : %d", ptr_buffer->num_history);
log_printf (" text_search . . . . . . : %d", ptr_buffer->text_search);
log_printf (" text_search_exact . . . : %d", ptr_buffer->text_search_exact);
+ log_printf (" text_search_regex . . . : %d", ptr_buffer->text_search_regex);
+ log_printf (" text_search_regex_compiled: 0x%lx", ptr_buffer->text_search_regex_compiled);
+ log_printf (" text_search_where . . . : %d", ptr_buffer->text_search_where);
log_printf (" text_search_found . . . : %d", ptr_buffer->text_search_found);
log_printf (" text_search_input . . . : '%s'", ptr_buffer->text_search_input);
log_printf (" highlight_words . . . . : '%s'", ptr_buffer->highlight_words);
diff --git a/src/gui/gui-buffer.h b/src/gui/gui-buffer.h
index e1704cf9f..f9de9c4b1 100644
--- a/src/gui/gui-buffer.h
+++ b/src/gui/gui-buffer.h
@@ -50,6 +50,9 @@ enum t_gui_buffer_notify
#define GUI_TEXT_SEARCH_BACKWARD 1
#define GUI_TEXT_SEARCH_FORWARD 2
+#define GUI_TEXT_SEARCH_IN_MESSAGE 1
+#define GUI_TEXT_SEARCH_IN_PREFIX 2
+
#define GUI_BUFFER_INPUT_BLOCK_SIZE 256
/* buffer structures */
@@ -158,6 +161,9 @@ struct t_gui_buffer
/* text search */
int text_search; /* text search type */
int text_search_exact; /* exact search (case sensitive) ? */
+ int text_search_regex; /* search with a regex */
+ regex_t *text_search_regex_compiled; /* regex used to search */
+ int text_search_where; /* search where? prefix and/or msg */
int text_search_found; /* 1 if text found, otherwise 0 */
char *text_search_input; /* input saved before text search */
diff --git a/src/gui/gui-color.c b/src/gui/gui-color.c
index d9e4d3e8e..f5f65dcca 100644
--- a/src/gui/gui-color.c
+++ b/src/gui/gui-color.c
@@ -658,6 +658,7 @@ gui_color_emphasize (const char *string,
if (regex)
{
/* search next match using the regex */
+ regex_match.rm_so = -1;
rc = regexec (regex, ptr_no_color, 1, &regex_match, 0);
/*
diff --git a/src/gui/gui-input.c b/src/gui/gui-input.c
index 831482134..a97f485f7 100644
--- a/src/gui/gui-input.c
+++ b/src/gui/gui-input.c
@@ -556,11 +556,47 @@ gui_input_search_text (struct t_gui_buffer *buffer)
}
/*
- * Searches backward in buffer (default key: up during search).
+ * Compiles regex used to search text in buffer.
*/
void
-gui_input_search_previous (struct t_gui_buffer *buffer)
+gui_input_search_compile_regex (struct t_gui_buffer *buffer)
+{
+ int flags;
+
+ /* remove the compiled regex */
+ if (buffer->text_search_regex_compiled)
+ {
+ regfree (buffer->text_search_regex_compiled);
+ free (buffer->text_search_regex_compiled);
+ buffer->text_search_regex_compiled = NULL;
+ }
+
+ /* compile regex */
+ if (buffer->text_search_regex)
+ {
+ buffer->text_search_regex_compiled = malloc (sizeof (*buffer->text_search_regex_compiled));
+ if (buffer->text_search_regex_compiled)
+ {
+ flags = REG_EXTENDED;
+ if (!buffer->text_search_exact)
+ flags |= REG_ICASE;
+ if (string_regcomp (buffer->text_search_regex_compiled,
+ buffer->input_buffer, flags) != 0)
+ {
+ free (buffer->text_search_regex_compiled);
+ buffer->text_search_regex_compiled = NULL;
+ }
+ }
+ }
+}
+
+/*
+ * Switches case for search in buffer (default key: meta-c during search).
+ */
+
+void
+gui_input_search_switch_case (struct t_gui_buffer *buffer)
{
struct t_gui_window *window;
@@ -568,17 +604,19 @@ gui_input_search_previous (struct t_gui_buffer *buffer)
if (window && (window->buffer->type == GUI_BUFFER_TYPE_FORMATTED)
&& (window->buffer->text_search != GUI_TEXT_SEARCH_DISABLED))
{
- window->buffer->text_search = GUI_TEXT_SEARCH_BACKWARD;
- (void) gui_window_search_text (window);
+ window->buffer->text_search_exact ^= 1;
+ gui_window_search_restart (window);
+ gui_input_search_signal (buffer);
}
}
/*
- * Searches forward in buffer (default key: down during search).
+ * Switches string/regex for search in buffer (default key: ctrl-R during
+ * search).
*/
void
-gui_input_search_next (struct t_gui_buffer *buffer)
+gui_input_search_switch_regex (struct t_gui_buffer *buffer)
{
struct t_gui_window *window;
@@ -586,17 +624,18 @@ gui_input_search_next (struct t_gui_buffer *buffer)
if (window && (window->buffer->type == GUI_BUFFER_TYPE_FORMATTED)
&& (window->buffer->text_search != GUI_TEXT_SEARCH_DISABLED))
{
- window->buffer->text_search = GUI_TEXT_SEARCH_FORWARD;
- (void) gui_window_search_text (window);
+ window->buffer->text_search_regex ^= 1;
+ gui_window_search_restart (window);
+ gui_input_search_signal (buffer);
}
}
/*
- * Switches case for search in buffer (default key: ctrl-R during search).
+ * Switches search in messages/prefixes (default key: tab during search).
*/
void
-gui_input_search_switch_case (struct t_gui_buffer *buffer)
+gui_input_search_switch_where (struct t_gui_buffer *buffer)
{
struct t_gui_window *window;
@@ -604,13 +643,54 @@ gui_input_search_switch_case (struct t_gui_buffer *buffer)
if (window && (window->buffer->type == GUI_BUFFER_TYPE_FORMATTED)
&& (window->buffer->text_search != GUI_TEXT_SEARCH_DISABLED))
{
- window->buffer->text_search_exact ^= 1;
+ if (window->buffer->text_search_where == GUI_TEXT_SEARCH_IN_MESSAGE)
+ window->buffer->text_search_where = GUI_TEXT_SEARCH_IN_PREFIX;
+ else if (window->buffer->text_search_where == GUI_TEXT_SEARCH_IN_PREFIX)
+ window->buffer->text_search_where = GUI_TEXT_SEARCH_IN_MESSAGE | GUI_TEXT_SEARCH_IN_PREFIX;
+ else
+ window->buffer->text_search_where = GUI_TEXT_SEARCH_IN_MESSAGE;
gui_window_search_restart (window);
gui_input_search_signal (buffer);
}
}
/*
+ * Searches backward in buffer (default key: up during search).
+ */
+
+void
+gui_input_search_previous (struct t_gui_buffer *buffer)
+{
+ struct t_gui_window *window;
+
+ window = gui_window_search_with_buffer (buffer);
+ if (window && (window->buffer->type == GUI_BUFFER_TYPE_FORMATTED)
+ && (window->buffer->text_search != GUI_TEXT_SEARCH_DISABLED))
+ {
+ window->buffer->text_search = GUI_TEXT_SEARCH_BACKWARD;
+ (void) gui_window_search_text (window);
+ }
+}
+
+/*
+ * Searches forward in buffer (default key: down during search).
+ */
+
+void
+gui_input_search_next (struct t_gui_buffer *buffer)
+{
+ struct t_gui_window *window;
+
+ window = gui_window_search_with_buffer (buffer);
+ if (window && (window->buffer->type == GUI_BUFFER_TYPE_FORMATTED)
+ && (window->buffer->text_search != GUI_TEXT_SEARCH_DISABLED))
+ {
+ window->buffer->text_search = GUI_TEXT_SEARCH_FORWARD;
+ (void) gui_window_search_text (window);
+ }
+}
+
+/*
* Stops text search (default key: return during search).
*/
diff --git a/src/gui/gui-input.h b/src/gui/gui-input.h
index 5d93cefcb..77961b6f5 100644
--- a/src/gui/gui-input.h
+++ b/src/gui/gui-input.h
@@ -44,9 +44,12 @@ extern void gui_input_return (struct t_gui_buffer *buffer);
extern void gui_input_complete_next (struct t_gui_buffer *buffer);
extern void gui_input_complete_previous (struct t_gui_buffer *buffer);
extern void gui_input_search_text (struct t_gui_buffer *buffer);
+extern void gui_input_search_compile_regex (struct t_gui_buffer *buffer);
+extern void gui_input_search_switch_case (struct t_gui_buffer *buffer);
+extern void gui_input_search_switch_regex (struct t_gui_buffer *buffer);
+extern void gui_input_search_switch_where (struct t_gui_buffer *buffer);
extern void gui_input_search_previous (struct t_gui_buffer *buffer);
extern void gui_input_search_next (struct t_gui_buffer *buffer);
-extern void gui_input_search_switch_case (struct t_gui_buffer *buffer);
extern void gui_input_search_stop (struct t_gui_buffer *buffer);
extern void gui_input_delete_previous_char (struct t_gui_buffer *buffer);
extern void gui_input_delete_next_char (struct t_gui_buffer *buffer);
diff --git a/src/gui/gui-line.c b/src/gui/gui-line.c
index a283312e0..92bb6f5ef 100644
--- a/src/gui/gui-line.c
+++ b/src/gui/gui-line.c
@@ -398,37 +398,70 @@ gui_line_get_next_displayed (struct t_gui_line *line)
*/
int
-gui_line_search_text (struct t_gui_line *line, const char *text,
- int case_sensitive)
+gui_line_search_text (struct t_gui_buffer *buffer, struct t_gui_line *line)
{
char *prefix, *message;
int rc;
- if (!line || !line->data->message || !text || !text[0])
+ if (!line || !line->data->message
+ || !buffer->input_buffer || !buffer->input_buffer[0])
+ {
return 0;
+ }
rc = 0;
- if (line->data->prefix)
+ if ((buffer->text_search_where & GUI_TEXT_SEARCH_IN_PREFIX)
+ && line->data->prefix)
{
prefix = gui_color_decode (line->data->prefix, NULL);
if (prefix)
{
- if ((case_sensitive && (strstr (prefix, text)))
- || (!case_sensitive && (string_strcasestr (prefix, text))))
+ if (buffer->text_search_regex)
+ {
+ if (buffer->text_search_regex_compiled)
+ {
+ if (regexec (buffer->text_search_regex_compiled,
+ prefix, 0, NULL, 0) == 0)
+ {
+ rc = 1;
+ }
+ }
+ }
+ else if ((buffer->text_search_exact
+ && (strstr (prefix, buffer->input_buffer)))
+ || (!buffer->text_search_exact
+ && (string_strcasestr (prefix, buffer->input_buffer))))
+ {
rc = 1;
+ }
free (prefix);
}
}
- if (!rc)
+ if (!rc && (buffer->text_search_where & GUI_TEXT_SEARCH_IN_MESSAGE))
{
message = gui_color_decode (line->data->message, NULL);
if (message)
{
- if ((case_sensitive && (strstr (message, text)))
- || (!case_sensitive && (string_strcasestr (message, text))))
+ if (buffer->text_search_regex)
+ {
+ if (buffer->text_search_regex_compiled)
+ {
+ if (regexec (buffer->text_search_regex_compiled,
+ message, 0, NULL, 0) == 0)
+ {
+ rc = 1;
+ }
+ }
+ }
+ else if ((buffer->text_search_exact
+ && (strstr (message, buffer->input_buffer)))
+ || (!buffer->text_search_exact
+ && (string_strcasestr (message, buffer->input_buffer))))
+ {
rc = 1;
+ }
free (message);
}
}
diff --git a/src/gui/gui-line.h b/src/gui/gui-line.h
index 483e53fce..7004b6353 100644
--- a/src/gui/gui-line.h
+++ b/src/gui/gui-line.h
@@ -80,8 +80,8 @@ extern struct t_gui_line *gui_line_get_first_displayed (struct t_gui_buffer *buf
extern struct t_gui_line *gui_line_get_last_displayed (struct t_gui_buffer *buffer);
extern struct t_gui_line *gui_line_get_prev_displayed (struct t_gui_line *line);
extern struct t_gui_line *gui_line_get_next_displayed (struct t_gui_line *line);
-extern int gui_line_search_text (struct t_gui_line *line, const char *text,
- int case_sensitive);
+extern int gui_line_search_text (struct t_gui_buffer *buffer,
+ struct t_gui_line *line);
extern int gui_line_match_regex (struct t_gui_line_data *line_data,
regex_t *regex_prefix,
regex_t *regex_message);
diff --git a/src/gui/gui-window.c b/src/gui/gui-window.c
index 1b4caf8cf..7e1fc4fb4 100644
--- a/src/gui/gui-window.c
+++ b/src/gui/gui-window.c
@@ -1502,9 +1502,7 @@ gui_window_search_text (struct t_gui_window *window)
gui_line_get_last_displayed (window->buffer);
while (ptr_line)
{
- if (gui_line_search_text (ptr_line,
- window->buffer->input_buffer,
- window->buffer->text_search_exact))
+ if (gui_line_search_text (window->buffer, ptr_line))
{
window->scroll->start_line = ptr_line;
window->scroll->start_line_pos = 0;
@@ -1527,9 +1525,7 @@ gui_window_search_text (struct t_gui_window *window)
gui_line_get_first_displayed (window->buffer);
while (ptr_line)
{
- if (gui_line_search_text (ptr_line,
- window->buffer->input_buffer,
- window->buffer->text_search_exact))
+ if (gui_line_search_text (window->buffer, ptr_line))
{
window->scroll->start_line = ptr_line;
window->scroll->start_line_pos = 0;
@@ -1553,8 +1549,10 @@ void
gui_window_search_start (struct t_gui_window *window)
{
window->buffer->text_search = GUI_TEXT_SEARCH_BACKWARD;
- window->buffer->text_search_exact = 0;
+ if (window->buffer->text_search_where == 0)
+ window->buffer->text_search_where = GUI_TEXT_SEARCH_IN_MESSAGE;
window->buffer->text_search_found = 0;
+ gui_input_search_compile_regex (window->buffer);
if (window->buffer->text_search_input)
{
free (window->buffer->text_search_input);
@@ -1577,6 +1575,7 @@ gui_window_search_restart (struct t_gui_window *window)
window->scroll->start_line_pos = 0;
window->buffer->text_search = GUI_TEXT_SEARCH_BACKWARD;
window->buffer->text_search_found = 0;
+ gui_input_search_compile_regex (window->buffer);
if (gui_window_search_text (window))
window->buffer->text_search_found = 1;
else
@@ -1599,6 +1598,12 @@ gui_window_search_stop (struct t_gui_window *window)
{
window->buffer->text_search = GUI_TEXT_SEARCH_DISABLED;
window->buffer->text_search = 0;
+ if (window->buffer->text_search_regex_compiled)
+ {
+ regfree (window->buffer->text_search_regex_compiled);
+ free (window->buffer->text_search_regex_compiled);
+ window->buffer->text_search_regex_compiled = NULL;
+ }
gui_input_delete_line (window->buffer);
if (window->buffer->text_search_input)
{