From 9c838d262827777cbe8d524757b249bc341d3c08 Mon Sep 17 00:00:00 2001 From: Sebastien Helleu Date: Tue, 11 Mar 2014 15:07:36 +0100 Subject: [PATCH] api: add support of case insensitive search and search by buffer full name in function buffer_search (bug #34318) --- ChangeLog.asciidoc | 2 + doc/en/weechat_plugin_api.en.txt | 16 ++++--- doc/fr/weechat_plugin_api.fr.txt | 16 ++++--- doc/it/weechat_plugin_api.it.txt | 19 +++++--- doc/ja/weechat_plugin_api.ja.txt | 18 +++++--- src/gui/gui-buffer.c | 75 +++++++++++++++++++++----------- src/gui/gui-buffer.h | 2 +- 7 files changed, 102 insertions(+), 46 deletions(-) diff --git a/ChangeLog.asciidoc b/ChangeLog.asciidoc index b2c15fe6e..b3f699407 100644 --- a/ChangeLog.asciidoc +++ b/ChangeLog.asciidoc @@ -47,6 +47,8 @@ http://weechat.org/files/releasenotes/ReleaseNotes-devel.html[release notes] * core: add signals "key_combo_{default|search|cursor}" * core: display a warning in case of inconsistency between the options weechat.look.save_{config|layout}_on_exit +* api: add support of case insensitive search and search by buffer full name + in function buffer_search (bug #34318) * api: add option "signal" in function hook_set to send a signal to the child process * api: add support of escaped strings with format `${esc:xxx}` or `${\xxx}` in diff --git a/doc/en/weechat_plugin_api.en.txt b/doc/en/weechat_plugin_api.en.txt index 44edaa35e..45e33ef03 100644 --- a/doc/en/weechat_plugin_api.en.txt +++ b/doc/en/weechat_plugin_api.en.txt @@ -9972,6 +9972,8 @@ weechat.prnt(weechat.current_buffer(), "Text on current buffer") ==== weechat_buffer_search +_Updated in 0.4.4._ + Search a buffer by plugin and/or name. Prototype: @@ -9984,20 +9986,24 @@ struct t_gui_buffer *weechat_buffer_search (const char *plugin, Arguments: -* 'plugin': name of plugin +* 'plugin': name of plugin, following special value is allowed: +** `==`: the name used is the buffer full name (for example: + `irc.freenode.#weechat` instead of `freenode.#weechat`) + _(WeeChat ≥ 0.4.4)_ * 'name': name of buffer, if it is NULL or empty string, the current buffer is - returned (buffer displayed by current window) + returned (buffer displayed by current window); if the name starts with + `(?i)`, the search is case insensitive _(WeeChat ≥ 0.4.4)_ Return value: * pointer to buffer found, NULL if not found -C example: +C examples: [source,C] ---- -struct t_gui_buffer *my_buffer = weechat_buffer_search ("my_plugin", - "my_buffer"); +struct t_gui_buffer *buffer1 = weechat_buffer_search ("irc", "freenode.#weechat"); +struct t_gui_buffer *buffer2 = weechat_buffer_search ("==", "irc.freenode.#test"); /* WeeChat ≥ 0.4.4 */ ---- Script (Python): diff --git a/doc/fr/weechat_plugin_api.fr.txt b/doc/fr/weechat_plugin_api.fr.txt index 624b23cf3..4cb6eb10b 100644 --- a/doc/fr/weechat_plugin_api.fr.txt +++ b/doc/fr/weechat_plugin_api.fr.txt @@ -10164,6 +10164,8 @@ weechat.prnt(weechat.current_buffer(), "Texte sur le tampon courant") ==== weechat_buffer_search +_Mis à jour dans la 0.4.4._ + Rechercher un tampon par l'extension et/ou le nom. Prototype : @@ -10176,20 +10178,24 @@ struct t_gui_buffer *weechat_buffer_search (const char *plugin, Paramètres : -* 'plugin' : nom de l'extension +* 'plugin' : nom de l'extension, la valeur spéciale suivante est autorisée : +** `==` : le nom utilisé est le nom complet du tampon (par exemple : + `irc.freenode.#weechat` au lieu de `freenode.#weechat`) + _(WeeChat ≥ 0.4.4)_ * 'name' : nom du tampon, si c'est NULL ou une chaîne vide, le tampon courant - est retourné (tampon affiché par la fenêtre courante) + est retourné (tampon affiché par la fenêtre courante); si le nom commence par + `(?i)`, la recherche est insensible à la casse _(WeeChat ≥ 0.4.4)_ Valeur de retour : * pointeur vers le tampon trouvé, NULL s'il n'a pas été trouvé -Exemple en C : +Exemples en C : [source,C] ---- -struct t_gui_buffer *my_buffer = weechat_buffer_search ("mon_extension", - "mon_tampon"); +struct t_gui_buffer *buffer1 = weechat_buffer_search ("irc", "freenode.#weechat"); +struct t_gui_buffer *buffer2 = weechat_buffer_search ("==", "irc.freenode.#test"); /* WeeChat ≥ 0.4.4 */ ---- Script (Python) : diff --git a/doc/it/weechat_plugin_api.it.txt b/doc/it/weechat_plugin_api.it.txt index ff87f88ac..fb42c79b3 100644 --- a/doc/it/weechat_plugin_api.it.txt +++ b/doc/it/weechat_plugin_api.it.txt @@ -10219,6 +10219,9 @@ weechat.prnt(weechat.current_buffer(), "Testo sul buffer corrente") ==== weechat_buffer_search +// TRANSLATION MISSING +_Updated in 0.4.4._ + Cerca un buffer tramite plugin e/o nome. Prototipo: @@ -10231,9 +10234,15 @@ struct t_gui_buffer *weechat_buffer_search (const char *plugin, Argomenti: -* 'plugin': nome del plugin -* 'name': nome del buffer, se NULL o la stringa è vuota, viene - restituito il buffer corrente (buffer visualizzato dalla finestra corrente) +// TRANSLATION MISSING +* 'plugin': name of plugin, following special value is allowed: +** `==`: the name used is the buffer full name (for example: + `irc.freenode.#weechat` instead of `freenode.#weechat`) + _(WeeChat ≥ 0.4.4)_ +// TRANSLATION MISSING +* 'name': name of buffer, if it is NULL or empty string, the current buffer is + returned (buffer displayed by current window); if the name starts with + `(?i)`, the search is case insensitive _(WeeChat ≥ 0.4.4)_ Valore restituito: @@ -10243,8 +10252,8 @@ Esempio in C: [source,C] ---- -struct t_gui_buffer *my_buffer = weechat_buffer_search ("my_plugin", - "my_buffer"); +struct t_gui_buffer *buffer1 = weechat_buffer_search ("irc", "freenode.#weechat"); +struct t_gui_buffer *buffer2 = weechat_buffer_search ("==", "irc.freenode.#test"); /* WeeChat ≥ 0.4.4 */ ---- Script (Python): diff --git a/doc/ja/weechat_plugin_api.ja.txt b/doc/ja/weechat_plugin_api.ja.txt index bc95ca4f3..7dc2513b5 100644 --- a/doc/ja/weechat_plugin_api.ja.txt +++ b/doc/ja/weechat_plugin_api.ja.txt @@ -9990,6 +9990,8 @@ weechat.prnt(weechat.current_buffer(), "Text on current buffer") ==== weechat_buffer_search +_バージョン 0.4.4 で更新。_ + プラグインおよび名前でバッファを検索。 プロトタイプ: @@ -10002,9 +10004,15 @@ struct t_gui_buffer *weechat_buffer_search (const char *plugin, 引数: -* 'plugin': プラグインの名前 -* 'name': バッファの名前、NULL または空文字列の場合、現在のバッファ - (現在のウィンドウに表示されているバッファ) を返す +// TRANSLATION MISSING +* 'plugin': name of plugin, following special value is allowed: +** `==`: the name used is the buffer full name (for example: + `irc.freenode.#weechat` instead of `freenode.#weechat`) + _(WeeChat ≥ 0.4.4)_ +// TRANSLATION MISSING +* 'name': name of buffer, if it is NULL or empty string, the current buffer is + returned (buffer displayed by current window); if the name starts with + `(?i)`, the search is case insensitive _(WeeChat ≥ 0.4.4)_ 戻り値: @@ -10014,8 +10022,8 @@ C 言語での使用例: [source,C] ---- -struct t_gui_buffer *my_buffer = weechat_buffer_search ("my_plugin", - "my_buffer"); +struct t_gui_buffer *buffer1 = weechat_buffer_search ("irc", "freenode.#weechat"); +struct t_gui_buffer *buffer2 = weechat_buffer_search ("==", "irc.freenode.#test"); /* WeeChat ≥ 0.4.4 */ ---- スクリプト (Python) での使用例: diff --git a/src/gui/gui-buffer.c b/src/gui/gui-buffer.c index 53b214346..65ab5cd3c 100644 --- a/src/gui/gui-buffer.c +++ b/src/gui/gui-buffer.c @@ -2035,6 +2035,40 @@ gui_buffer_search_main () return NULL; } +/* + * Searches for a buffer by full name (example: "irc.freenode.#weechat"). + */ + +struct t_gui_buffer * +gui_buffer_search_by_full_name (const char *full_name) +{ + struct t_gui_buffer *ptr_buffer; + int case_sensitive; + + case_sensitive = 1; + if (strncmp (full_name, "(?i)", 4) == 0) + { + case_sensitive = 0; + full_name += 4; + } + + for (ptr_buffer = gui_buffers; ptr_buffer; + ptr_buffer = ptr_buffer->next_buffer) + { + if (ptr_buffer->full_name + && ((case_sensitive + && strcmp (ptr_buffer->full_name, full_name) == 0) + || (!case_sensitive + && string_strcasecmp (ptr_buffer->full_name, full_name) == 0))) + { + return ptr_buffer; + } + } + + /* buffer not found */ + return NULL; +} + /* * Searches for a buffer by plugin and name. */ @@ -2043,11 +2077,21 @@ struct t_gui_buffer * gui_buffer_search_by_name (const char *plugin, const char *name) { struct t_gui_buffer *ptr_buffer; - int plugin_match; + int plugin_match, case_sensitive; if (!name || !name[0]) return gui_current_window->buffer; + if (plugin && (strcmp (plugin, "==") == 0)) + return gui_buffer_search_by_full_name (name); + + case_sensitive = 1; + if (strncmp (name, "(?i)", 4) == 0) + { + case_sensitive = 0; + name += 4; + } + for (ptr_buffer = gui_buffers; ptr_buffer; ptr_buffer = ptr_buffer->next_buffer) { @@ -2059,7 +2103,11 @@ gui_buffer_search_by_name (const char *plugin, const char *name) if (strcmp (plugin, gui_buffer_get_plugin_name (ptr_buffer)) != 0) plugin_match = 0; } - if (plugin_match && (strcmp (ptr_buffer->name, name) == 0)) + if (plugin_match + && ((case_sensitive + && strcmp (ptr_buffer->name, name) == 0) + || (!case_sensitive + && string_strcasecmp (ptr_buffer->name, name) == 0))) { return ptr_buffer; } @@ -2070,29 +2118,6 @@ gui_buffer_search_by_name (const char *plugin, const char *name) return NULL; } -/* - * Searches for a buffer by full name (example: "irc.freenode.#weechat"). - */ - -struct t_gui_buffer * -gui_buffer_search_by_full_name (const char *full_name) -{ - struct t_gui_buffer *ptr_buffer; - - for (ptr_buffer = gui_buffers; ptr_buffer; - ptr_buffer = ptr_buffer->next_buffer) - { - if (ptr_buffer->full_name - && (strcmp (ptr_buffer->full_name, full_name) == 0)) - { - return ptr_buffer; - } - } - - /* buffer not found */ - return NULL; -} - /* * Searches for a buffer by plugin and partial name. */ diff --git a/src/gui/gui-buffer.h b/src/gui/gui-buffer.h index 7f9056edb..e3552aa73 100644 --- a/src/gui/gui-buffer.h +++ b/src/gui/gui-buffer.h @@ -280,9 +280,9 @@ extern void gui_buffer_add_value_num_displayed (struct t_gui_buffer *buffer, int value); extern int gui_buffer_is_main (const char *plugin_name, const char *name); extern struct t_gui_buffer *gui_buffer_search_main (); +extern struct t_gui_buffer *gui_buffer_search_by_full_name (const char *full_name); extern struct t_gui_buffer *gui_buffer_search_by_name (const char *plugin, const char *name); -extern struct t_gui_buffer *gui_buffer_search_by_full_name (const char *full_name); extern struct t_gui_buffer *gui_buffer_search_by_partial_name (const char *plugin, const char *name); extern struct t_gui_buffer *gui_buffer_search_by_number (int number);