diff --git a/ChangeLog.adoc b/ChangeLog.adoc index 185d8143e..3b36e4b39 100644 --- a/ChangeLog.adoc +++ b/ChangeLog.adoc @@ -25,6 +25,7 @@ New features:: * core: add signals "buffer_user_input_xxx" and "buffer_user_closing_xxx" for buffers created with `/buffer add` (issue #1848) * core: add identifier in buffer lines (issue #901) * core: add option `unicode` in command `/debug` + * api: return newly allocated string in functions string_tolower and string_toupper * api: add function utf8_strncpy * trigger: add regex command "y" to translate chars, set default regex command to "s" (regex replace) (issue #1510) diff --git a/ReleaseNotes.adoc b/ReleaseNotes.adoc index dffcb2dd3..1be4a54b3 100644 --- a/ReleaseNotes.adoc +++ b/ReleaseNotes.adoc @@ -20,6 +20,14 @@ https://weechat.org/files/changelog/ChangeLog-devel.html[ChangeLog] [[v3.8]] == Version 3.8 (under dev) +[[v3.8_api_string_lower_upper]] +=== API functions string_tolower and string_toupper + +The functions link:https://weechat.org/doc/plugin/#_string_tolower[string_tolower] +and link:https://weechat.org/doc/plugin/#_string_toupper[string_toupper] +now return newly allocated string instead of doing the change in place. + +The returned string must then be freed after use. + [[v3.8_trigger_regex_command]] === Trigger regex command diff --git a/doc/en/weechat_plugin_api.en.adoc b/doc/en/weechat_plugin_api.en.adoc index 64f2efeb9..e8619b081 100644 --- a/doc/en/weechat_plugin_api.en.adoc +++ b/doc/en/weechat_plugin_api.en.adoc @@ -616,25 +616,34 @@ This function is not available in scripting API. ==== string_tolower -Convert UTF-8 string to lower case. +_Updated in 3.8._ + +Return a string with uppercase letters converted to lowercase. + +This function is locale independent: only letters `A` to `Z` without accents +are converted to lowercase. All other chars are kept as-is. Prototype: [source,c] ---- -void weechat_string_tolower (char *string); +char *weechat_string_tolower (const char *string); ---- Arguments: * _string_: string to convert +Return value: + +* string with lowercase letters (must be freed by calling "free" after use) + C example: [source,c] ---- -char str[] = "AbCdé"; -weechat_string_tolower (str); /* str is now: "abcdé" */ +char *str = weechat_string_tolower ("ABCD_É"); /* result: "abcd_É" */ +/* ... */ +free (str); ---- [NOTE] @@ -642,25 +651,34 @@ This function is not available in scripting API. ==== string_toupper -Convert UTF-8 string to upper case. +_Updated in 3.8._ + +Return a string with lowercase letters converted to uppercase. + +This function is locale independent: only letters `a` to `z` without accents +are converted to uppercase. All other chars are kept as-is. Prototype: [source,c] ---- -void weechat_string_toupper (char *string); +char *weechat_string_toupper (const char *string); ---- Arguments: * _string_: string to convert +Return value: + +* string with uppercase letters (must be freed by calling "free" after use) + C example: [source,c] ---- -char str[] = "AbCdé"; -weechat_string_toupper (str); /* str is now: "ABCDé" */ +char *str = weechat_string_toupper ("abcd_é"); /* result: "ABCD_é" */ +/* ... */ +free (str); ---- [NOTE] diff --git a/doc/fr/weechat_plugin_api.fr.adoc b/doc/fr/weechat_plugin_api.fr.adoc index a328da4d2..bac367bed 100644 --- a/doc/fr/weechat_plugin_api.fr.adoc +++ b/doc/fr/weechat_plugin_api.fr.adoc @@ -626,25 +626,36 @@ Cette fonction n'est pas disponible dans l'API script. ==== string_tolower -Convertir une chaîne UTF-8 en minuscules. +_Mis à jour dans la 3.8._ + +Retourner une chaîne avec les lettres majuscules converties en minuscules. + +Cette fonction n'est pas dépendante de la locale : seules les lettres `A` à `Z` +sans accents sont converties en minuscules. Tous les autres caractères sont +gardés tels quels. Prototype : [source,c] ---- -void weechat_string_tolower (char *string); +char *weechat_string_tolower (const char *string); ---- Paramètres : * _string_ : chaîne à convertir +Valeur de retour : + +* chaîne avec les lettres en minuscules (doit être supprimée par un appel à "free" + après utilisation) + Exemple en C : [source,c] ---- -char str[] = "AbCdé"; -weechat_string_tolower (str); /* str vaut maintenant : "abcdé" */ +char *str = weechat_string_tolower ("ABCD_É"); /* résultat : "abcd_É" */ +/* ... */ +free (str); ---- [NOTE] @@ -652,25 +663,36 @@ Cette fonction n'est pas disponible dans l'API script. ==== string_toupper -Convertir une chaîne UTF-8 en majuscules. +_Mis à jour dans la 3.8._ + +Retourner une chaîne avec les lettres minuscules converties en majuscules. + +Cette fonction n'est pas dépendante de la locale : seules les lettres `a` à `z` +sans accents sont converties en majuscules. Tous les autres caractères sont +gardés tels quels. Prototype : [source,c] ---- -void weechat_string_toupper (char *string); +char *weechat_string_toupper (const char *string); ---- Paramètres : * _string_ : chaîne à convertir +Valeur de retour : + +* chaîne avec les lettres en majuscules (doit être supprimée par un appel à "free" + après utilisation) + Exemple en C : [source,c] ---- -char str[] = "AbCdé"; -weechat_string_toupper (str); /* str vaut maintenant : "ABCDé" */ +char *str = weechat_string_toupper ("abcd_é"); /* résultat : "ABCD_é" */ +/* ... */ +free (str); ---- [NOTE] diff --git a/doc/it/weechat_plugin_api.it.adoc b/doc/it/weechat_plugin_api.it.adoc index 11a22812a..01604d555 100644 --- a/doc/it/weechat_plugin_api.it.adoc +++ b/doc/it/weechat_plugin_api.it.adoc @@ -652,25 +652,37 @@ Questa funzione non è disponibile nelle API per lo scripting. ==== string_tolower -Converte una stringa UTF-8 in minuscolo. +// TRANSLATION MISSING +_Updated in 3.8._ + +// TRANSLATION MISSING +Return a string with uppercase letters converted to lowercase. + +This function is locale independent: only letters `A` to `Z` without accents +are converted to lowercase. All other chars are kept as-is. Prototipo: [source,c] ---- -void weechat_string_tolower (char *string); +char *weechat_string_tolower (const char *string); ---- Argomenti: * _string_: stringa da convertire +Valore restituito: + +// TRANSLATION MISSING +* string with lowercase letters (must be freed by calling "free" after use) + Esempio in C: [source,c] ---- -char str[] = "AbCdé"; -weechat_string_tolower (str); /* str ora è: "abcdé" */ +char *str = weechat_string_tolower ("ABCD_É"); /* result: "abcd_É" */ +/* ... */ +free (str); ---- [NOTE] @@ -678,25 +690,37 @@ Questa funzione non è disponibile nelle API per lo scripting. ==== string_toupper -Converte una stringa UTF-8 in maiuscolo. +// TRANSLATION MISSING +_Updated in 3.8._ + +// TRANSLATION MISSING +Return a string with lowercase letters converted to uppercase. + +This function is locale independent: only letters `a` to `z` without accents +are converted to uppercase. All other chars are kept as-is. Prototipo: [source,c] ---- -void weechat_string_toupper (char *string); +char *weechat_string_toupper (const char *string); ---- Argomenti: * _string_: stringa da convertire +Valore restituito: + +// TRANSLATION MISSING +* string with uppercase letters (must be freed by calling "free" after use) + Esempio in C: [source,c] ---- -char str[] = "AbCdé"; -weechat_string_toupper (str); /* str ora è: "ABCDé" */ +char *str = weechat_string_toupper ("abcd_é"); /* result: "ABCD_é" */ +/* ... */ +free (str); ---- [NOTE] diff --git a/doc/ja/weechat_plugin_api.ja.adoc b/doc/ja/weechat_plugin_api.ja.adoc index 6feebc15a..0b5b042bb 100644 --- a/doc/ja/weechat_plugin_api.ja.adoc +++ b/doc/ja/weechat_plugin_api.ja.adoc @@ -630,25 +630,36 @@ free (str); ==== string_tolower -UTF-8 文字列を小文字に変換。 +_WeeChat バージョン 3.8 で更新。_ + +// TRANSLATION MISSING +Return a string with uppercase letters converted to lowercase. + +This function is locale independent: only letters `A` to `Z` without accents +are converted to lowercase. All other chars are kept as-is. プロトタイプ: [source,c] ---- -void weechat_string_tolower (char *string); +char *weechat_string_tolower (const char *string); ---- 引数: * _string_: 変換元の文字列 +戻り値: + +// TRANSLATION MISSING +* string with lowercase letters (must be freed by calling "free" after use) + C 言語での使用例: [source,c] ---- -char str[] = "AbCdé"; -weechat_string_tolower (str); /* str is now: "abcdé" */ +char *str = weechat_string_tolower ("ABCD_É"); /* result: "abcd_É" */ +/* ... */ +free (str); ---- [NOTE] @@ -656,25 +667,36 @@ weechat_string_tolower (str); /* str is now: "abcdé" */ ==== string_toupper -UTF-8 文字列を大文字に変換。 +_WeeChat バージョン 3.8 で更新。_ + +// TRANSLATION MISSING +Return a string with lowercase letters converted to uppercase. + +This function is locale independent: only letters `a` to `z` without accents +are converted to uppercase. All other chars are kept as-is. プロトタイプ: [source,c] ---- -void weechat_string_toupper (char *string); +char *weechat_string_toupper (const char *string); ---- 引数: * _string_: 変換元の文字列 +戻り値: + +// TRANSLATION MISSING +* string with uppercase letters (must be freed by calling "free" after use) + C 言語での使用例: [source,c] ---- -char str[] = "AbCdé"; -weechat_string_toupper (str); /* str is now: "ABCDé" */ +char *str = weechat_string_toupper ("abcd_é"); /* result: "ABCD_é" */ +/* ... */ +free (str); ---- [NOTE] diff --git a/doc/sr/weechat_plugin_api.sr.adoc b/doc/sr/weechat_plugin_api.sr.adoc index e14da7d95..3ec897791 100644 --- a/doc/sr/weechat_plugin_api.sr.adoc +++ b/doc/sr/weechat_plugin_api.sr.adoc @@ -591,25 +591,36 @@ free (str); ==== string_tolower -Конвертује UTF-8 стринг у мала слова. +_Ажурирано у верзији 3.8._ + +// TRANSLATION MISSING +Return a string with uppercase letters converted to lowercase. + +This function is locale independent: only letters `A` to `Z` without accents +are converted to lowercase. All other chars are kept as-is. Прототип: [source,c] ---- -void weechat_string_tolower (char *string); +char *weechat_string_tolower (const char *string); ---- Аргументи: * _string_: стринг који се конвертује +Повратна вредност: + +// TRANSLATION MISSING +* string with lowercase letters (must be freed by calling "free" after use) + C пример: [source,c] ---- -char str[] = "AbCdé"; -weechat_string_tolower (str); /* str је сада: „abcdé” */ +char *str = weechat_string_tolower ("ABCD_É"); /* result: „abcd_É” */ +/* ... */ +free (str); ---- [NOTE] @@ -617,25 +628,36 @@ weechat_string_tolower (str); /* str је сада: „abcdé” */ ==== string_toupper -Конвертује UTF-8 стринг у велика слова. +_Ажурирано у верзији 3.8._ + +// TRANSLATION MISSING +Return a string with lowercase letters converted to uppercase. + +This function is locale independent: only letters `a` to `z` without accents +are converted to uppercase. All other chars are kept as-is. Прототип: [source,c] ---- -void weechat_string_toupper (char *string); +char *weechat_string_toupper (const char *string); ---- Аргументи: * _string_: стринг који се конвертује +Повратна вредност: + +// TRANSLATION MISSING +* string with uppercase letters (must be freed by calling "free" after use) + C пример: [source,c] ---- -char str[] = "AbCdé"; -weechat_string_toupper (str); /* str је сада: „ABCDé” */ +char *str = weechat_string_toupper ("abcd_é"); /* result: „ABCD_é” */ +/* ... */ +free (str); ---- [NOTE] diff --git a/src/core/wee-eval.c b/src/core/wee-eval.c index 7d892b125..98cea96be 100644 --- a/src/core/wee-eval.c +++ b/src/core/wee-eval.c @@ -342,46 +342,6 @@ end: return (result) ? result : strdup (""); } -/* - * Converts string to lower case. - * - * Note: result must be freed after use. - */ - -char * -eval_string_lower (const char *text) -{ - char *tmp; - - tmp = strdup (text); - if (!tmp) - return strdup (""); - - string_tolower (tmp); - - return tmp; -} - -/* - * Converts string to upper case. - * - * Note: result must be freed after use. - */ - -char * -eval_string_upper (const char *text) -{ - char *tmp; - - tmp = strdup (text); - if (!tmp) - return strdup (""); - - string_toupper (tmp); - - return tmp; -} - /* * Hides chars in a string. * @@ -1650,14 +1610,14 @@ eval_replace_vars_cb (void *data, const char *text) /* convert to lower case */ if (strncmp (text, "lower:", 6) == 0) { - value = eval_string_lower (text + 6); + value = string_tolower (text + 6); goto end; } /* convert to upper case */ if (strncmp (text, "upper:", 6) == 0) { - value = eval_string_upper (text + 6); + value = string_toupper (text + 6); goto end; } diff --git a/src/core/wee-string.c b/src/core/wee-string.c index e41884950..369b232d4 100644 --- a/src/core/wee-string.c +++ b/src/core/wee-string.c @@ -308,33 +308,67 @@ string_repeat (const char *string, int count) } /* - * Converts string to lower case (locale independent). + * Converts uppercase letters to lowercase. + * + * This function is locale independent: only letters 'A' to 'Z' without accents + * are converted to lowercase. All other chars are kept as-is. + * + * Note: result must be freed after use. */ -void -string_tolower (char *string) +char * +string_tolower (const char *string) { - while (string && string[0]) + char *result, *ptr_result; + + if (!string) + return NULL; + + result = strdup (string); + if (!result) + return NULL; + + ptr_result = result; + while (ptr_result && ptr_result[0]) { - if ((string[0] >= 'A') && (string[0] <= 'Z')) - string[0] += ('a' - 'A'); - string = (char *)utf8_next_char (string); + if ((ptr_result[0] >= 'A') && (ptr_result[0] <= 'Z')) + ptr_result[0] += ('a' - 'A'); + ptr_result = (char *)utf8_next_char (ptr_result); } + + return result; } /* - * Converts string to upper case (locale independent). + * Converts lowercase letters to uppercase. + * + * This function is locale independent: only letters 'a' to 'z' without accents + * are converted to uppercase. All other chars are kept as-is. + * + * Note: result must be freed after use. */ -void -string_toupper (char *string) +char * +string_toupper (const char *string) { - while (string && string[0]) + char *result, *ptr_result; + + if (!string) + return NULL; + + result = strdup (string); + if (!result) + return NULL; + + ptr_result = result; + while (ptr_result && ptr_result[0]) { - if ((string[0] >= 'a') && (string[0] <= 'z')) - string[0] -= ('a' - 'A'); - string = (char *)utf8_next_char (string); + if ((ptr_result[0] >= 'a') && (ptr_result[0] <= 'z')) + ptr_result[0] -= ('a' - 'A'); + ptr_result = (char *)utf8_next_char (ptr_result); } + + return result; } /* diff --git a/src/core/wee-string.h b/src/core/wee-string.h index 62e04f76d..59cb4fb64 100644 --- a/src/core/wee-string.h +++ b/src/core/wee-string.h @@ -42,8 +42,8 @@ extern char *string_cut (const char *string, int length, int count_suffix, extern char *string_reverse (const char *string); extern char *string_reverse_screen (const char *string); extern char *string_repeat (const char *string, int count); -extern void string_tolower (char *string); -extern void string_toupper (char *string); +extern char *string_tolower (const char *string); +extern char *string_toupper (const char *string); extern int string_strcasecmp (const char *string1, const char *string2); extern int string_strcasecmp_range (const char *string1, const char *string2, int range); diff --git a/src/gui/gui-completion.c b/src/gui/gui-completion.c index e2459a781..5e07861f1 100644 --- a/src/gui/gui-completion.c +++ b/src/gui/gui-completion.c @@ -1144,6 +1144,7 @@ gui_completion_complete (struct t_gui_completion *completion) int length, word_found_seen, other_completion, partial_completion; int common_prefix_size, index, index2; struct t_gui_completion_word *ptr_completion_word, *ptr_completion_word2; + char *word_found_lower; length = utf8_strlen (completion->base_word); word_found_seen = 0; @@ -1262,7 +1263,12 @@ gui_completion_complete (struct t_gui_completion *completion) completion->word_found_is_nick = 0; completion->add_space = 0; completion->position = -1; - string_tolower (completion->word_found); + word_found_lower = string_tolower (completion->word_found); + if (word_found_lower) + { + free (completion->word_found); + completion->word_found = word_found_lower; + } /* alert user of partial completion */ if (CONFIG_BOOLEAN(config_completion_partial_completion_alert)) diff --git a/src/gui/gui-nick.c b/src/gui/gui-nick.c index d6fcfc982..9953194bc 100644 --- a/src/gui/gui-nick.c +++ b/src/gui/gui-nick.c @@ -182,10 +182,9 @@ gui_nick_get_forced_color (const char *nickname) if (forced_color) return forced_color; - nick_lower = strdup (nickname); + nick_lower = string_tolower (nickname); if (nick_lower) { - string_tolower (nick_lower); forced_color = hashtable_get (config_hashtable_nick_color_force, nick_lower); free (nick_lower); diff --git a/src/plugins/irc/irc-channel.c b/src/plugins/irc/irc-channel.c index cde58d8a0..455c025bf 100644 --- a/src/plugins/irc/irc-channel.c +++ b/src/plugins/irc/irc-channel.c @@ -399,10 +399,9 @@ irc_channel_create_buffer (struct t_irc_server *server, channel_name_lower = NULL; if (channel_type == IRC_CHANNEL_TYPE_CHANNEL) { - channel_name_lower = strdup (channel_name); + channel_name_lower = weechat_string_tolower (channel_name); if (channel_name_lower) { - weechat_string_tolower (channel_name_lower); manual_join = weechat_hashtable_has_key (server->join_manual, channel_name_lower); noswitch = weechat_hashtable_has_key (server->join_noswitch, diff --git a/src/plugins/irc/irc-command.c b/src/plugins/irc/irc-command.c index 6dde1afab..f906b8311 100644 --- a/src/plugins/irc/irc-command.c +++ b/src/plugins/irc/irc-command.c @@ -2877,10 +2877,9 @@ irc_command_join_server (struct t_irc_server *server, const char *arguments, strcat (new_args, channels[i]); if (manual_join || noswitch) { - channel_name = strdup (pos_channel); + channel_name = weechat_string_tolower (pos_channel); if (channel_name) { - weechat_string_tolower (channel_name); if (manual_join) { weechat_hashtable_set (server->join_manual, diff --git a/src/plugins/irc/irc-protocol.c b/src/plugins/irc/irc-protocol.c index af55f4095..fabf7e351 100644 --- a/src/plugins/irc/irc-protocol.c +++ b/src/plugins/irc/irc-protocol.c @@ -6730,15 +6730,12 @@ IRC_PROTOCOL_CALLBACK(470) } } - old_channel_lower = strdup (params[1]); + old_channel_lower = weechat_string_tolower (params[1]); if (old_channel_lower) { - weechat_string_tolower (old_channel_lower); - new_channel_lower = strdup (params[2]); + new_channel_lower = weechat_string_tolower (params[2]); if (new_channel_lower) { - weechat_string_tolower (new_channel_lower); - if (weechat_hashtable_has_key (server->join_manual, old_channel_lower)) { @@ -6750,7 +6747,6 @@ IRC_PROTOCOL_CALLBACK(470) weechat_hashtable_remove (server->join_manual, old_channel_lower); } - if (weechat_hashtable_has_key (server->join_noswitch, old_channel_lower)) { @@ -6762,10 +6758,8 @@ IRC_PROTOCOL_CALLBACK(470) weechat_hashtable_remove (server->join_noswitch, old_channel_lower); } - free (new_channel_lower); } - free (old_channel_lower); } } diff --git a/src/plugins/logger/logger.c b/src/plugins/logger/logger.c index 014ada811..10ba13452 100644 --- a/src/plugins/logger/logger.c +++ b/src/plugins/logger/logger.c @@ -297,7 +297,7 @@ logger_get_mask_for_buffer (struct t_gui_buffer *buffer) char * logger_get_mask_expanded (struct t_gui_buffer *buffer, const char *mask) { - char *mask2, *mask3, *mask4, *mask5, *mask6, *mask7, *dir_separator; + char *mask2, *mask3, *mask4, *mask5, *mask6, *mask7, *mask8, *dir_separator; int length; time_t seconds; struct tm *date_tmp; @@ -308,6 +308,7 @@ logger_get_mask_expanded (struct t_gui_buffer *buffer, const char *mask) mask5 = NULL; mask6 = NULL; mask7 = NULL; + mask8 = NULL; dir_separator = weechat_info_get ("dir_separator", ""); if (!dir_separator) @@ -360,7 +361,9 @@ logger_get_mask_expanded (struct t_gui_buffer *buffer, const char *mask) /* convert to lower case? */ if (weechat_config_boolean (logger_config_file_name_lower_case)) - weechat_string_tolower (mask7); + mask8 = weechat_string_tolower (mask7); + else + mask8 = strdup (mask7); if (weechat_logger_plugin->debug) { @@ -369,7 +372,7 @@ logger_get_mask_expanded (struct t_gui_buffer *buffer, const char *mask) "decoded mask = \"%s\"", LOGGER_PLUGIN_NAME, weechat_buffer_get_string (buffer, "name"), - mask, mask7); + mask, mask8); } end: @@ -384,8 +387,10 @@ end: free (mask5); if (mask6) free (mask6); + if (mask7) + free (mask7); - return mask7; + return mask8; } /* diff --git a/src/plugins/plugin-config.c b/src/plugins/plugin-config.c index c3a3646b5..b1fc6eae9 100644 --- a/src/plugins/plugin-config.c +++ b/src/plugins/plugin-config.c @@ -111,7 +111,7 @@ plugin_config_set (const char *plugin_name, const char *option_name, const char *value) { int length, rc; - char *option_full_name; + char *option_full_name, *option_full_name_lower; rc = WEECHAT_CONFIG_OPTION_SET_ERROR; @@ -121,8 +121,12 @@ plugin_config_set (const char *plugin_name, const char *option_name, { snprintf (option_full_name, length, "%s.%s", plugin_name, option_name); - string_tolower (option_full_name); - rc = plugin_config_set_internal (option_full_name, value); + option_full_name_lower = string_tolower (option_full_name); + if (option_full_name_lower) + { + rc = plugin_config_set_internal (option_full_name_lower, value); + free (option_full_name_lower); + } free (option_full_name); } @@ -199,7 +203,7 @@ plugin_config_set_desc (const char *plugin_name, const char *option_name, const char *description) { int length; - char *option_full_name; + char *option_full_name, *option_full_name_lower; length = strlen (plugin_name) + 1 + strlen (option_name) + 1; option_full_name = malloc (length); @@ -207,8 +211,13 @@ plugin_config_set_desc (const char *plugin_name, const char *option_name, { snprintf (option_full_name, length, "%s.%s", plugin_name, option_name); - string_tolower (option_full_name); - plugin_config_set_desc_internal (option_full_name, description); + option_full_name_lower = string_tolower (option_full_name); + if (option_full_name_lower) + { + plugin_config_set_desc_internal (option_full_name_lower, + description); + free (option_full_name_lower); + } free (option_full_name); } } diff --git a/src/plugins/relay/irc/relay-irc.c b/src/plugins/relay/irc/relay-irc.c index 1526b1eb3..929ee569d 100644 --- a/src/plugins/relay/irc/relay-irc.c +++ b/src/plugins/relay/irc/relay-irc.c @@ -1330,7 +1330,7 @@ relay_irc_recv (struct t_relay_client *client, const char *data) const char *irc_command, *str_num_params, *isupport, *pos_password; char str_time[128], str_signal[128], str_server_channel[256], *nick; char str_param[128], *str_args, *version, str_command[128], **params; - char *pos, *password, *irc_is_channel, *info, *error; + char *pos, *password, *irc_is_channel, *info, *error, *str_cmd_lower; long num_params; int i, redirect_msg; @@ -1766,11 +1766,15 @@ relay_irc_recv (struct t_relay_client *client, const char *data) redirect_msg = 1; snprintf (str_command, sizeof (str_command), "%s", irc_command); - weechat_string_tolower (str_command); - weechat_hashtable_set (hash_redirect, "pattern", - str_command); - weechat_hashtable_set (hash_redirect, "string", - params[0]); + str_cmd_lower = weechat_string_tolower (str_command); + if (str_cmd_lower) + { + weechat_hashtable_set (hash_redirect, "pattern", + str_cmd_lower); + weechat_hashtable_set (hash_redirect, "string", + params[0]); + free (str_cmd_lower); + } } } else if (weechat_strcasecmp (irc_command, "time") == 0) diff --git a/src/plugins/relay/relay-websocket.c b/src/plugins/relay/relay-websocket.c index 0f951448c..0fd57c023 100644 --- a/src/plugins/relay/relay-websocket.c +++ b/src/plugins/relay/relay-websocket.c @@ -72,7 +72,7 @@ void relay_websocket_save_header (struct t_relay_client *client, const char *message) { - char *pos, *name; + char *pos, *name, *name_lower; const char *ptr_value; /* ignore the "GET" request */ @@ -89,7 +89,12 @@ relay_websocket_save_header (struct t_relay_client *client, name = weechat_strndup (message, pos - message); if (!name) return; - weechat_string_tolower (name); + name_lower = weechat_string_tolower (name); + if (!name_lower) + { + free (name); + return; + } /* get pointer on header value */ ptr_value = pos + 1; @@ -99,9 +104,10 @@ relay_websocket_save_header (struct t_relay_client *client, } /* add header in the hashtable */ - weechat_hashtable_set (client->http_headers, name, ptr_value); + weechat_hashtable_set (client->http_headers, name_lower, ptr_value); free (name); + free (name_lower); } /* diff --git a/src/plugins/script/script-repo.c b/src/plugins/script/script-repo.c index bc0e18e4c..aa277b49a 100644 --- a/src/plugins/script/script-repo.c +++ b/src/plugins/script/script-repo.c @@ -760,9 +760,8 @@ script_repo_sha512sum_file (const char *filename) return NULL; weechat_string_base_encode (16, hash, hash_size, hash_hexa); - weechat_string_tolower (hash_hexa); - return strdup (hash_hexa); + return weechat_string_tolower (hash_hexa); } /* diff --git a/src/plugins/weechat-plugin.h b/src/plugins/weechat-plugin.h index 551f14008..229c3aba8 100644 --- a/src/plugins/weechat-plugin.h +++ b/src/plugins/weechat-plugin.h @@ -68,7 +68,7 @@ struct timeval; * please change the date with current one; for a second change at same * date, increment the 01, otherwise please keep 01. */ -#define WEECHAT_PLUGIN_API_VERSION "20221203-01" +#define WEECHAT_PLUGIN_API_VERSION "20221218-01" /* macros for defining plugin infos */ #define WEECHAT_PLUGIN_NAME(__name) \ @@ -287,8 +287,8 @@ struct t_weechat_plugin char *(*strndup) (const char *string, int bytes); char *(*string_cut) (const char *string, int length, int count_suffix, int screen, const char *cut_suffix); - void (*string_tolower) (char *string); - void (*string_toupper) (char *string); + char *(*string_tolower) (const char *string); + char *(*string_toupper) (const char *string); int (*strcasecmp) (const char *string1, const char *string2); int (*strcasecmp_range) (const char *string1, const char *string2, int range); diff --git a/tests/unit/core/test-core-string.cpp b/tests/unit/core/test-core-string.cpp index 525026799..ec8dce52c 100644 --- a/tests/unit/core/test-core-string.cpp +++ b/tests/unit/core/test-core-string.cpp @@ -188,13 +188,13 @@ TEST(CoreString, ToLower) { char *str; - str = strdup ("ABC"); + WEE_TEST_STR(NULL, string_tolower (NULL)); - string_tolower (NULL); - string_tolower (str); - STRCMP_EQUAL("abc", str); - - free (str); + WEE_TEST_STR("", string_tolower ("")); + WEE_TEST_STR("abcd_É", string_tolower ("ABCD_É")); + WEE_TEST_STR("À É Ï Ô Ü Ÿ Æ Œ Ç", string_tolower ("À É Ï Ô Ü Ÿ Æ Œ Ç")); + WEE_TEST_STR("€", string_tolower ("€")); + WEE_TEST_STR("[⛄]", string_tolower ("[⛄]")); } /* @@ -202,17 +202,17 @@ TEST(CoreString, ToLower) * string_toupper */ -TEST(CoreString, Case) +TEST(CoreString, ToUpper) { char *str; - str = strdup ("abc"); + WEE_TEST_STR(NULL, string_tolower (NULL)); - string_toupper (NULL); - string_toupper (str); - STRCMP_EQUAL("ABC", str); - - free (str); + WEE_TEST_STR("", string_toupper ("")); + WEE_TEST_STR("ABCD_é", string_toupper ("abcd_é")); + WEE_TEST_STR("à é ï ô ü ÿ æ œ ç", string_toupper ("à é ï ô ü ÿ æ œ ç")); + WEE_TEST_STR("€", string_toupper ("€")); + WEE_TEST_STR("[⛄]", string_toupper ("[⛄]")); } /*