1
0
mirror of https://github.com/weechat/weechat.git synced 2026-06-12 14:14:48 +02:00

api: rename char comparison functions "utf8_char*" to "string_char*"

This commit is contained in:
Sébastien Helleu
2022-12-24 17:33:22 +01:00
parent 083032972d
commit a67556907d
18 changed files with 579 additions and 576 deletions
+2 -1
View File
@@ -26,7 +26,8 @@ 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 arithmetic difference between chars in functions string_strcasecmp, string_strcasecmp_range, string_strncasecmp, string_strncasecmp_range, string_strcmp_ignore_chars, utf8_charcmp, utf8_charcasecmp, utf8_charcasecmp_range
* api: rename char comparison functions "utf8_char*" to "string_char*"
* api: return arithmetic difference between chars in functions string_charcmp, string_charcasecmp, string_charcasecmp_range, string_strcasecmp, string_strcasecmp_range, string_strncasecmp, string_strncasecmp_range, string_strcmp_ignore_chars
* 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)
+3 -3
View File
@@ -26,14 +26,14 @@ https://weechat.org/files/changelog/ChangeLog-devel.html[ChangeLog]
The following functions now return arithmetic result of subtracting the last
compared char in string2 from the last compared char in string1:
* string_charcmp
* string_charcasecmp
* string_charcasecmp_range
* string_strcasecmp
* string_strcasecmp_range
* string_strncasecmp
* string_strncasecmp_range
* string_strcmp_ignore_chars
* utf8_charcmp
* utf8_charcasecmp
* utf8_charcasecmp_range
Example with WeeChat 3.8:
+75 -75
View File
@@ -692,6 +692,81 @@ free (str);
[NOTE]
This function is not available in scripting API.
==== string_charcmp
_Updated in 1.0, 3.8._
Compare two chars.
Prototype:
[source,c]
----
int weechat_string_charcmp (const char *string1, const char *string2);
----
Arguments:
* _string1_: first string for comparison
* _string2_: second string for comparison
Return value: arithmetic result of subtracting the first char in _string2_ from
the first char in _string1_:
* < 0 if char1 < char2
* 0 if char1 == char2
* > 0 if char1 > char2
C example:
[source,c]
----
int diff = weechat_string_charcmp ("aaa", "ccc"); /* == -2 */
----
[NOTE]
This function is not available in scripting API.
==== string_charcasecmp
_Updated in 1.0, 3.8._
Compare two chars, ignoring case.
[NOTE]
Behavior has changed in version 3.8: now all uppercase letters are properly
converted to lowercase (by calling function `towlower`), in addition to the
range `A` to `Z`.
Prototype:
[source,c]
----
int weechat_string_charcasecmp (const char *string1, const char *string2);
----
Arguments:
* _string1_: first string for comparison
* _string2_: second string for comparison
Return value: arithmetic result of subtracting the first char in _string2_
(converted to lowercase) from the first char in _string1_ (converted to lowercase):
* < 0 if char1 < char2
* 0 if char1 == char2
* > 0 if char1 > char2
C example:
[source,c]
----
int diff = weechat_string_charcasecmp ("aaa", "CCC"); /* == -2 */
----
[NOTE]
This function is not available in scripting API.
==== strcasecmp
_Updated in 1.0, 3.8._
@@ -3637,81 +3712,6 @@ int length_on_screen = weechat_utf8_strlen_screen ("é"); /* == 1 */
[NOTE]
This function is not available in scripting API.
==== utf8_charcmp
_Updated in 1.0, 3.8._
Compare two UTF-8 chars.
Prototype:
[source,c]
----
int weechat_utf8_charcmp (const char *string1, const char *string2);
----
Arguments:
* _string1_: first string for comparison
* _string2_: second string for comparison
Return value: arithmetic result of subtracting the first char in _string2_ from
the first char in _string1_:
* < 0 if char1 < char2
* 0 if char1 == char2
* > 0 if char1 > char2
C example:
[source,c]
----
int diff = weechat_utf8_charcmp ("aaa", "ccc"); /* == -2 */
----
[NOTE]
This function is not available in scripting API.
==== utf8_charcasecmp
_Updated in 1.0, 3.8._
Compare two UTF-8 chars, ignoring case.
[NOTE]
Behavior has changed in version 3.8: now all uppercase letters are properly
converted to lowercase (by calling function `towlower`), in addition to the
range `A` to `Z`.
Prototype:
[source,c]
----
int weechat_utf8_charcasecmp (const char *string1, const char *string2);
----
Arguments:
* _string1_: first string for comparison
* _string2_: second string for comparison
Return value: arithmetic result of subtracting the first char in _string2_
(converted to lowercase) from the first char in _string1_ (converted to lowercase):
* < 0 if char1 < char2
* 0 if char1 == char2
* > 0 if char1 > char2
C example:
[source,c]
----
int diff = weechat_utf8_charcasecmp ("aaa", "CCC"); /* == -2 */
----
[NOTE]
This function is not available in scripting API.
==== utf8_char_size_screen
_Updated in 3.8._
+75 -75
View File
@@ -706,6 +706,81 @@ free (str);
[NOTE]
Cette fonction n'est pas disponible dans l'API script.
==== string_charcmp
_Mis à jour dans la 1.0, 3.8._
Comparer deux caractères.
Prototype :
[source,c]
----
int weechat_string_charcmp (const char *string1, const char *string2);
----
Paramètres :
* _string1_ : première chaîne pour la comparaison
* _string2_ : seconde chaîne pour la comparaison
Valeur de retour : résultat de la soustraction du premier caractère dans _string2_
du premier caractère dans _string1_ :
* < 0 si char1 < char2
* 0 si char1 == char2
* > 0 si char1 > char2
Exemple en C :
[source,c]
----
int diff = weechat_string_charcmp ("aaa", "ccc"); /* == -2 */
----
[NOTE]
Cette fonction n'est pas disponible dans l'API script.
==== string_charcasecmp
_Mis à jour dans la 1.0, 3.8._
Comparer deux caractères en ignorant la casse.
[NOTE]
Le comportement a changé dans la version 3.8 : désormais toutes les lettres en
majuscules sont correctement converties en minuscules (par appel à la fonction
`towlower`), en plus de l'intervalle de `A` à `Z`.
Prototype :
[source,c]
----
int weechat_string_charcasecmp (const char *string1, const char *string2);
----
Paramètres :
* _string1_ : première chaîne pour la comparaison
* _string2_ : seconde chaîne pour la comparaison
Valeur de retour : résultat de la soustraction du premier caractère dans _string2_
(converti en minuscule) du premier caractère dans _string1_ (converti en minuscule) :
* < 0 si char1 < char2
* 0 si char1 == char2
* > 0 si char1 > char2
Exemple en C :
[source,c]
----
int diff = weechat_string_charcasecmp ("aaa", "CCC"); /* == -2 */
----
[NOTE]
Cette fonction n'est pas disponible dans l'API script.
==== strcasecmp
_Mis à jour dans la 1.0, 3.8._
@@ -3703,81 +3778,6 @@ int length_on_screen = weechat_utf8_strlen_screen ("é"); /* == 1 */
[NOTE]
Cette fonction n'est pas disponible dans l'API script.
==== utf8_charcmp
_Mis à jour dans la 1.0, 3.8._
Comparer deux caractères UTF-8.
Prototype :
[source,c]
----
int weechat_utf8_charcmp (const char *string1, const char *string2);
----
Paramètres :
* _string1_ : première chaîne pour la comparaison
* _string2_ : seconde chaîne pour la comparaison
Valeur de retour : résultat de la soustraction du premier caractère dans _string2_
du premier caractère dans _string1_ :
* < 0 si char1 < char2
* 0 si char1 == char2
* > 0 si char1 > char2
Exemple en C :
[source,c]
----
int diff = weechat_utf8_charcmp ("aaa", "ccc"); /* == -2 */
----
[NOTE]
Cette fonction n'est pas disponible dans l'API script.
==== utf8_charcasecmp
_Mis à jour dans la 1.0, 3.8._
Comparer deux caractères UTF-8 en ignorant la casse.
[NOTE]
Le comportement a changé dans la version 3.8 : désormais toutes les lettres en
majuscules sont correctement converties en minuscules (par appel à la fonction
`towlower`), en plus de l'intervalle de `A` à `Z`.
Prototype :
[source,c]
----
int weechat_utf8_charcasecmp (const char *string1, const char *string2);
----
Paramètres :
* _string1_ : première chaîne pour la comparaison
* _string2_ : seconde chaîne pour la comparaison
Valeur de retour : résultat de la soustraction du premier caractère dans _string2_
(converti en minuscule) du premier caractère dans _string1_ (converti en minuscule) :
* < 0 si char1 < char2
* 0 si char1 == char2
* > 0 si char1 > char2
Exemple en C :
[source,c]
----
int diff = weechat_utf8_charcasecmp ("aaa", "CCC"); /* == -2 */
----
[NOTE]
Cette fonction n'est pas disponible dans l'API script.
==== utf8_char_size_screen
_Mis à jour dans la 3.8._
+82 -82
View File
@@ -734,6 +734,88 @@ free (str);
[NOTE]
Questa funzione non è disponibile nelle API per lo scripting.
==== string_charcmp
// TRANSLATION MISSING
_Updated in 1.0, 3.8._
Confronta due caratteri.
Prototipo:
[source,c]
----
int weechat_string_charcmp (const char *string1, const char *string2);
----
Argomenti:
* _string1_: prima stringa da comparare
* _string2_: seconda stringa da comparare
// TRANSLATION MISSING
Return value: arithmetic result of subtracting the first char in _string2_ from
the first char in _string1_:
// TRANSLATION MISSING
* < 0 if char1 < char2
* 0 if char1 == char2
* > 0 if char1 > char2
Esempio in C:
[source,c]
----
int diff = weechat_string_charcmp ("aaa", "ccc"); /* == -2 */
----
[NOTE]
Questa funzione non è disponibile nelle API per lo scripting.
==== string_charcasecmp
// TRANSLATION MISSING
_Updated in 1.0, 3.8._
Confronta due caratteri, ignorando la sensibilità alle maiuscole.
// TRANSLATION MISSING
[NOTE]
Behavior has changed in version 3.8: now all uppercase letters are properly
converted to lowercase (by calling function `towlower`), in addition to the
range `A` to `Z`.
Prototipo:
[source,c]
----
int weechat_string_charcasecmp (const char *string1, const char *string2);
----
Argomenti:
* _string1_: prima stringa da comparare
* _string2_: seconda stringa da comparare
// TRANSLATION MISSING
Return value: arithmetic result of subtracting the first char in _string2_
(converted to lowercase) from the first char in _string1_ (converted to lowercase):
// TRANSLATION MISSING
* < 0 if char1 < char2
* 0 if char1 == char2
* > 0 if char1 > char2
Esempio in C:
[source,c]
----
int diff = weechat_string_charcasecmp ("aaa", "CCC"); /* == -2 */
----
[NOTE]
Questa funzione non è disponibile nelle API per lo scripting.
==== strcasecmp
// TRANSLATION MISSING
@@ -3803,88 +3885,6 @@ int length_on_screen = weechat_utf8_strlen_screen ("é"); /* == 1 */
[NOTE]
Questa funzione non è disponibile nelle API per lo scripting.
==== utf8_charcmp
// TRANSLATION MISSING
_Updated in 1.0, 3.8._
Confronta due caratteri UTF-8.
Prototipo:
[source,c]
----
int weechat_utf8_charcmp (const char *string1, const char *string2);
----
Argomenti:
* _string1_: prima stringa da comparare
* _string2_: seconda stringa da comparare
// TRANSLATION MISSING
Return value: arithmetic result of subtracting the first char in _string2_ from
the first char in _string1_:
// TRANSLATION MISSING
* < 0 if char1 < char2
* 0 if char1 == char2
* > 0 if char1 > char2
Esempio in C:
[source,c]
----
int diff = weechat_utf8_charcmp ("aaa", "ccc"); /* == -2 */
----
[NOTE]
Questa funzione non è disponibile nelle API per lo scripting.
==== utf8_charcasecmp
// TRANSLATION MISSING
_Updated in 1.0, 3.8._
Confronta due caratteri UTF-8, ignorando la sensibilità alle maiuscole.
// TRANSLATION MISSING
[NOTE]
Behavior has changed in version 3.8: now all uppercase letters are properly
converted to lowercase (by calling function `towlower`), in addition to the
range `A` to `Z`.
Prototipo:
[source,c]
----
int weechat_utf8_charcasecmp (const char *string1, const char *string2);
----
Argomenti:
* _string1_: prima stringa da comparare
* _string2_: seconda stringa da comparare
// TRANSLATION MISSING
Return value: arithmetic result of subtracting the first char in _string2_
(converted to lowercase) from the first char in _string1_ (converted to lowercase):
// TRANSLATION MISSING
* < 0 if char1 < char2
* 0 if char1 == char2
* > 0 if char1 > char2
Esempio in C:
[source,c]
----
int diff = weechat_utf8_charcasecmp ("aaa", "CCC"); /* == -2 */
----
[NOTE]
Questa funzione non è disponibile nelle API per lo scripting.
==== utf8_char_size_screen
// TRANSLATION MISSING
+80 -80
View File
@@ -710,6 +710,86 @@ free (str);
[NOTE]
スクリプト API ではこの関数を利用できません。
==== string_charcmp
_WeeChat バージョン 1.0, 3.8 で更新。_
2 つの 文字を比較。
プロトタイプ:
[source,c]
----
int weechat_string_charcmp (const char *string1, const char *string2);
----
引数:
* _string1_: 1 番目の比較文字列
* _string2_: 2 番目の比較文字列
// TRANSLATION MISSING
Return value: arithmetic result of subtracting the first char in _string2_ from
the first char in _string1_:
// TRANSLATION MISSING
* < 0 if char1 < char2
* 0 if char1 == char2
* > 0 if char1 > char2
C 言語での使用例:
[source,c]
----
int diff = weechat_string_charcmp ("aaa", "ccc"); /* == -2 */
----
[NOTE]
スクリプト API ではこの関数を利用できません。
==== string_charcasecmp
_WeeChat バージョン 1.0, 3.8 で更新。_
大文字小文字の違いを無視して、2 つの 文字を比較。
// TRANSLATION MISSING
[NOTE]
Behavior has changed in version 3.8: now all uppercase letters are properly
converted to lowercase (by calling function `towlower`), in addition to the
range `A` to `Z`.
プロトタイプ:
[source,c]
----
int weechat_string_charcasecmp (const char *string1, const char *string2);
----
引数:
* _string1_: 1 番目の比較文字列
* _string2_: 2 番目の比較文字列
// TRANSLATION MISSING
Return value: arithmetic result of subtracting the first char in _string2_
(converted to lowercase) from the first char in _string1_ (converted to lowercase):
// TRANSLATION MISSING
* < 0 if char1 < char2
* 0 if char1 == char2
* > 0 if char1 > char2
C 言語での使用例:
[source,c]
----
int diff = weechat_string_charcasecmp ("aaa", "CCC"); /* == -2 */
----
[NOTE]
スクリプト API ではこの関数を利用できません。
==== strcasecmp
_WeeChat バージョン 1.0, 3.8 で更新。_
@@ -3731,86 +3811,6 @@ int length_on_screen = weechat_utf8_strlen_screen ("é"); /* == 1 */
[NOTE]
スクリプト API ではこの関数を利用できません。
==== utf8_charcmp
_WeeChat バージョン 1.0, 3.8 で更新。_
2 つの UTF-8 文字を比較。
プロトタイプ:
[source,c]
----
int weechat_utf8_charcmp (const char *string1, const char *string2);
----
引数:
* _string1_: 1 番目の比較文字列
* _string2_: 2 番目の比較文字列
// TRANSLATION MISSING
Return value: arithmetic result of subtracting the first char in _string2_ from
the first char in _string1_:
// TRANSLATION MISSING
* < 0 if char1 < char2
* 0 if char1 == char2
* > 0 if char1 > char2
C 言語での使用例:
[source,c]
----
int diff = weechat_utf8_charcmp ("aaa", "ccc"); /* == -2 */
----
[NOTE]
スクリプト API ではこの関数を利用できません。
==== utf8_charcasecmp
_WeeChat バージョン 1.0, 3.8 で更新。_
大文字小文字の違いを無視して、2 つの UTF-8 文字を比較。
// TRANSLATION MISSING
[NOTE]
Behavior has changed in version 3.8: now all uppercase letters are properly
converted to lowercase (by calling function `towlower`), in addition to the
range `A` to `Z`.
プロトタイプ:
[source,c]
----
int weechat_utf8_charcasecmp (const char *string1, const char *string2);
----
引数:
* _string1_: 1 番目の比較文字列
* _string2_: 2 番目の比較文字列
// TRANSLATION MISSING
Return value: arithmetic result of subtracting the first char in _string2_
(converted to lowercase) from the first char in _string1_ (converted to lowercase):
// TRANSLATION MISSING
* < 0 if char1 < char2
* 0 if char1 == char2
* > 0 if char1 > char2
C 言語での使用例:
[source,c]
----
int diff = weechat_utf8_charcasecmp ("aaa", "CCC"); /* == -2 */
----
[NOTE]
スクリプト API ではこの関数を利用できません。
==== utf8_char_size_screen
_WeeChat バージョン 3.8 で更新。_
+80 -80
View File
@@ -671,6 +671,86 @@ free (str);
[NOTE]
Ова функција није доступна у API скриптовања.
==== string_charcmp
_Ажурирано у верзији 1.0, 3.8._
Пореди два карактера.
Прототип:
[source,c]
----
int weechat_string_charcmp (const char *string1, const char *string2);
----
Аргументи:
* _string1_: први стринг за поређење
* _string2_: други стринг за поређење
// TRANSLATION MISSING
Return value: arithmetic result of subtracting the first char in _string2_ from
the first char in _string1_:
// TRANSLATION MISSING
* < 0 if char1 < char2
* 0 if char1 == char2
* > 0 if char1 > char2
C пример:
[source,c]
----
int diff = weechat_string_charcmp ("aaa", "ccc"); /* == -2 */
----
[NOTE]
Ова функција није доступна у API скриптовања.
==== string_charcasecmp
_Ажурирано у верзији 1.0, 3.8._
Пореди два карактера, уз игнорисање разлике у величини слова.
// TRANSLATION MISSING
[NOTE]
Behavior has changed in version 3.8: now all uppercase letters are properly
converted to lowercase (by calling function `towlower`), in addition to the
range `A` to `Z`.
Прототип:
[source,c]
----
int weechat_string_charcasecmp (const char *string1, const char *string2);
----
Аргументи:
* _string1_: први стринг за поређење
* _string2_: други стринг за поређење
// TRANSLATION MISSING
Return value: arithmetic result of subtracting the first char in _string2_
(converted to lowercase) from the first char in _string1_ (converted to lowercase):
// TRANSLATION MISSING
* < 0 if char1 < char2
* 0 if char1 == char2
* > 0 if char1 > char2
C пример:
[source,c]
----
int diff = weechat_string_charcasecmp ("aaa", "CCC"); /* == -2 */
----
[NOTE]
Ова функција није доступна у API скриптовања.
==== strcasecmp
_Ажурирано у верзији 1.0, 3.8._
@@ -3540,86 +3620,6 @@ int length_on_screen = weechat_utf8_strlen_screen ("é"); /* == 1 */
[NOTE]
Ова функција није доступна у API скриптовања.
==== utf8_charcmp
_Ажурирано у верзији 1.0, 3.8._
Пореди два UTF-8 карактера.
Прототип:
[source,c]
----
int weechat_utf8_charcmp (const char *string1, const char *string2);
----
Аргументи:
* _string1_: први стринг за поређење
* _string2_: други стринг за поређење
// TRANSLATION MISSING
Return value: arithmetic result of subtracting the first char in _string2_ from
the first char in _string1_:
// TRANSLATION MISSING
* < 0 if char1 < char2
* 0 if char1 == char2
* > 0 if char1 > char2
C пример:
[source,c]
----
int diff = weechat_utf8_charcmp ("aaa", "ccc"); /* == -2 */
----
[NOTE]
Ова функција није доступна у API скриптовања.
==== utf8_charcasecmp
_Ажурирано у верзији 1.0, 3.8._
Пореди два UTF-8 карактера, уз игнорисање разлике у величини слова.
// TRANSLATION MISSING
[NOTE]
Behavior has changed in version 3.8: now all uppercase letters are properly
converted to lowercase (by calling function `towlower`), in addition to the
range `A` to `Z`.
Прототип:
[source,c]
----
int weechat_utf8_charcasecmp (const char *string1, const char *string2);
----
Аргументи:
* _string1_: први стринг за поређење
* _string2_: други стринг за поређење
// TRANSLATION MISSING
Return value: arithmetic result of subtracting the first char in _string2_
(converted to lowercase) from the first char in _string1_ (converted to lowercase):
// TRANSLATION MISSING
* < 0 if char1 < char2
* 0 if char1 == char2
* > 0 if char1 > char2
C пример:
[source,c]
----
int diff = weechat_utf8_charcasecmp ("aaa", "CCC"); /* == -2 */
----
[NOTE]
Ова функција није доступна у API скриптовања.
==== utf8_char_size_screen
_Ажурирано у верзији 3.8._
+108 -15
View File
@@ -393,6 +393,97 @@ string_toupper (const char *string)
return string_dyn_free (result, 0);
}
/*
* Compares two chars (case sensitive).
*
* Returns: arithmetic result of subtracting the first char in string2
* from the first char in string1:
* < 0: string1 < string2
* 0: string1 == string2
* > 0: string1 > string2
*/
int
string_charcmp (const char *string1, const char *string2)
{
return utf8_char_int (string1) - utf8_char_int (string2);
}
/*
* Compares two chars (case insensitive).
*
* Returns: arithmetic result of subtracting the first char in string2
* (converted to lowercase) from the first char in string1 (converted
* to lowercase):
* < 0: string1 < string2
* 0: string1 == string2
* > 0: string1 > string2
*/
int
string_charcasecmp (const char *string1, const char *string2)
{
wint_t wchar1, wchar2;
/*
* optimization for single-byte chars: only letters A-Z must be converted
* to lowercase; this is faster than calling `towlower`
*/
if (string1 && !((unsigned char)(string1[0]) & 0x80)
&& string2 && !((unsigned char)(string2[0]) & 0x80))
{
wchar1 = string1[0];
if ((wchar1 >= 'A') && (wchar1 <= 'Z'))
wchar1 += ('a' - 'A');
wchar2 = string2[0];
if ((wchar2 >= 'A') && (wchar2 <= 'Z'))
wchar2 += ('a' - 'A');
}
else
{
wchar1 = towlower (utf8_char_int (string1));
wchar2 = towlower (utf8_char_int (string2));
}
return wchar1 - wchar2;
}
/*
* Compares two chars (case insensitive using a range).
*
* The range is the number of chars which can be converted from upper to lower
* case. For example 26 = all letters of alphabet, 29 = all letters + 3 chars.
*
* Examples:
* - range = 26: A-Z ==> a-z
* - range = 29: A-Z [ \ ] ==> a-z { | }
* - range = 30: A-Z [ \ ] ^ ==> a-z { | } ~
* (ranges 29 and 30 are used by some protocols like IRC)
*
* Returns: arithmetic result of subtracting the last compared char in string2
* (converted to lowercase) from the last compared char in string1 (converted
* to lowercase):
* < 0: string1 < string2
* 0: string1 == string2
* > 0: string1 > string2
*/
int
string_charcasecmp_range (const char *string1, const char *string2, int range)
{
wchar_t wchar1, wchar2;
wchar1 = utf8_char_int (string1);
if ((wchar1 >= (wchar_t)'A') && (wchar1 < (wchar_t)('A' + range)))
wchar1 += ('a' - 'A');
wchar2 = utf8_char_int (string2);
if ((wchar2 >= (wchar_t)'A') && (wchar2 < (wchar_t)('A' + range)))
wchar2 += ('a' - 'A');
return wchar1 - wchar2;
}
/*
* Compares two strings (case insensitive).
*
@@ -411,7 +502,7 @@ string_strcasecmp (const char *string1, const char *string2)
while (string1 && string1[0] && string2 && string2[0])
{
diff = utf8_charcasecmp (string1, string2);
diff = string_charcasecmp (string1, string2);
if (diff != 0)
return diff;
@@ -419,7 +510,7 @@ string_strcasecmp (const char *string1, const char *string2)
string2 = utf8_next_char (string2);
}
return utf8_charcasecmp (string1, string2);
return string_charcasecmp (string1, string2);
}
/*
@@ -449,7 +540,7 @@ string_strcasecmp_range (const char *string1, const char *string2, int range)
while (string1 && string1[0] && string2 && string2[0])
{
diff = utf8_charcasecmp_range (string1, string2, range);
diff = string_charcasecmp_range (string1, string2, range);
if (diff != 0)
return diff;
@@ -457,7 +548,7 @@ string_strcasecmp_range (const char *string1, const char *string2, int range)
string2 = utf8_next_char (string2);
}
return utf8_charcasecmp_range (string1, string2, range);
return string_charcasecmp_range (string1, string2, range);
}
/*
@@ -479,7 +570,7 @@ string_strncasecmp (const char *string1, const char *string2, int max)
count = 0;
while ((count < max) && string1 && string1[0] && string2 && string2[0])
{
diff = utf8_charcasecmp (string1, string2);
diff = string_charcasecmp (string1, string2);
if (diff != 0)
return diff;
@@ -491,7 +582,7 @@ string_strncasecmp (const char *string1, const char *string2, int max)
if (count >= max)
return 0;
else
return utf8_charcasecmp (string1, string2);
return string_charcasecmp (string1, string2);
}
/*
@@ -523,7 +614,7 @@ string_strncasecmp_range (const char *string1, const char *string2, int max,
count = 0;
while ((count < max) && string1 && string1[0] && string2 && string2[0])
{
diff = utf8_charcasecmp_range (string1, string2, range);
diff = string_charcasecmp_range (string1, string2, range);
if (diff != 0)
return diff;
@@ -535,7 +626,7 @@ string_strncasecmp_range (const char *string1, const char *string2, int max,
if (count >= max)
return 0;
else
return utf8_charcasecmp_range (string1, string2, range);
return string_charcasecmp_range (string1, string2, range);
}
/*
@@ -572,13 +663,14 @@ string_strcmp_ignore_chars (const char *string1, const char *string2,
if (!string1 || !string1[0] || !string2 || !string2[0])
{
return (case_sensitive) ?
utf8_charcmp (string1, string2) :
utf8_charcasecmp (string1, string2);
string_charcmp (string1, string2) :
string_charcasecmp (string1, string2);
}
/* look at diff */
diff = (case_sensitive) ?
utf8_charcmp (string1, string2) : utf8_charcasecmp (string1, string2);
string_charcmp (string1, string2) :
string_charcasecmp (string1, string2);
if (diff != 0)
return diff;
@@ -596,7 +688,8 @@ string_strcmp_ignore_chars (const char *string1, const char *string2,
}
}
return (case_sensitive) ?
utf8_charcmp (string1, string2) : utf8_charcasecmp (string1, string2);
string_charcmp (string1, string2) :
string_charcasecmp (string1, string2);
}
/*
@@ -1984,7 +2077,7 @@ string_translate_chars (const char *string,
ptr_chars2 = chars2;
while (ptr_chars1 && ptr_chars1[0] && ptr_chars2 && ptr_chars2[0])
{
if (utf8_charcmp (ptr_chars1, ptr_string) == 0)
if (string_charcmp (ptr_chars1, ptr_string) == 0)
{
string_dyn_concat (result, ptr_chars2, utf8_char_size (ptr_chars2));
translated = 1;
@@ -3736,7 +3829,7 @@ string_is_command_char (const char *string)
while (ptr_command_chars && ptr_command_chars[0])
{
if (utf8_charcmp (ptr_command_chars, string) == 0)
if (string_charcmp (ptr_command_chars, string) == 0)
return 1;
ptr_command_chars = utf8_next_char (ptr_command_chars);
}
@@ -3798,7 +3891,7 @@ string_input_for_buffer (const char *string)
return string;
/* check if first char is doubled: if yes, then it's not a command */
if (utf8_charcmp (string, next_char) == 0)
if (string_charcmp (string, next_char) == 0)
return next_char;
/* string is a command */
+4
View File
@@ -44,6 +44,10 @@ extern char *string_reverse_screen (const char *string);
extern char *string_repeat (const char *string, int count);
extern char *string_tolower (const char *string);
extern char *string_toupper (const char *string);
extern int string_charcmp (const char *string1, const char *string2);
extern int string_charcasecmp (const char *string1, const char *string2);
extern int string_charcasecmp_range (const char *string1, const char *string2,
int range);
extern int string_strcasecmp (const char *string1, const char *string2);
extern int string_strcasecmp_range (const char *string1, const char *string2,
int range);
-91
View File
@@ -528,97 +528,6 @@ utf8_strlen_screen (const char *string)
return size_screen;
}
/*
* Compares two UTF-8 chars (case sensitive).
*
* Returns: arithmetic result of subtracting the first char in string2
* from the first char in string1:
* < 0: string1 < string2
* 0: string1 == string2
* > 0: string1 > string2
*/
int
utf8_charcmp (const char *string1, const char *string2)
{
return utf8_char_int (string1) - utf8_char_int (string2);
}
/*
* Compares two UTF-8 chars (case insensitive).
*
* Returns: arithmetic result of subtracting the first char in string2
* (converted to lowercase) from the first char in string1 (converted
* to lowercase):
* < 0: string1 < string2
* 0: string1 == string2
* > 0: string1 > string2
*/
int
utf8_charcasecmp (const char *string1, const char *string2)
{
wint_t wchar1, wchar2;
/*
* optimization for single-byte chars: only letters A-Z must be converted
* to lowercase; this is faster than calling `towlower`
*/
if (string1 && !((unsigned char)(string1[0]) & 0x80)
&& string2 && !((unsigned char)(string2[0]) & 0x80))
{
wchar1 = string1[0];
if ((wchar1 >= 'A') && (wchar1 <= 'Z'))
wchar1 += ('a' - 'A');
wchar2 = string2[0];
if ((wchar2 >= 'A') && (wchar2 <= 'Z'))
wchar2 += ('a' - 'A');
}
else
{
wchar1 = towlower (utf8_char_int (string1));
wchar2 = towlower (utf8_char_int (string2));
}
return wchar1 - wchar2;
}
/*
* Compares two UTF-8 chars (case insensitive using a range).
*
* The range is the number of chars which can be converted from upper to lower
* case. For example 26 = all letters of alphabet, 29 = all letters + 3 chars.
*
* Examples:
* - range = 26: A-Z ==> a-z
* - range = 29: A-Z [ \ ] ==> a-z { | }
* - range = 30: A-Z [ \ ] ^ ==> a-z { | } ~
* (ranges 29 and 30 are used by some protocols like IRC)
*
* Returns: arithmetic result of subtracting the last compared char in string2
* (converted to lowercase) from the last compared char in string1 (converted
* to lowercase):
* < 0: string1 < string2
* 0: string1 == string2
* > 0: string1 > string2
*/
int
utf8_charcasecmp_range (const char *string1, const char *string2, int range)
{
wchar_t wchar1, wchar2;
wchar1 = utf8_char_int (string1);
if ((wchar1 >= (wchar_t)'A') && (wchar1 < (wchar_t)('A' + range)))
wchar1 += ('a' - 'A');
wchar2 = utf8_char_int (string2);
if ((wchar2 >= (wchar_t)'A') && (wchar2 < (wchar_t)('A' + range)))
wchar2 += ('a' - 'A');
return wchar1 - wchar2;
}
/*
* Moves forward N chars in an UTF-8 string.
*
-4
View File
@@ -41,10 +41,6 @@ extern int utf8_char_size (const char *string);
extern int utf8_strlen (const char *string);
extern int utf8_strnlen (const char *string, int bytes);
extern int utf8_strlen_screen (const char *string);
extern int utf8_charcmp (const char *string1, const char *string2);
extern int utf8_charcasecmp (const char *string1, const char *string2);
extern int utf8_charcasecmp_range (const char *string1, const char *string2,
int range);
extern int utf8_char_size_screen (const char *string);
extern const char *utf8_add_offset (const char *string, int offset);
extern int utf8_real_pos (const char *string, int pos);
+4 -4
View File
@@ -1034,11 +1034,11 @@ gui_completion_common_prefix_size (struct t_arraylist *list,
ptr_completion_word =
(struct t_gui_completion_word *)(list->data[i]);
if (!utf_char
|| (utf8_charcasecmp (utf_char,
ptr_completion_word->word) == 0))
|| (string_charcasecmp (utf_char,
ptr_completion_word->word) == 0))
{
if ((ptr_completion_word->word[ptr_char - ptr_first_item] == '\0')
|| (utf8_charcasecmp (
|| (string_charcasecmp (
ptr_char,
ptr_completion_word->word + (ptr_char - ptr_first_item)) != 0))
{
@@ -1112,7 +1112,7 @@ gui_completion_partial_build_list (struct t_gui_completion *completion,
{
ptr_completion_word =
(struct t_gui_completion_word *)list_temp->data[index];
if (utf8_charcasecmp (utf_char, ptr_completion_word->word) == 0)
if (string_charcasecmp (utf_char, ptr_completion_word->word) == 0)
{
arraylist_remove (list_temp, index);
items_count++;
+1 -1
View File
@@ -731,7 +731,7 @@ gui_key_cmp (const char *key, const char *search, int context)
while (search[0])
{
diff = utf8_charcmp (key, search);
diff = string_charcmp (key, search);
if (diff != 0)
return diff;
key = utf8_next_char (key);
+2 -2
View File
@@ -605,6 +605,8 @@ plugin_load (const char *filename, int init_plugin, int argc, char **argv)
new_plugin->string_cut = &string_cut;
new_plugin->string_tolower = &string_tolower;
new_plugin->string_toupper = &string_toupper;
new_plugin->string_charcmp = &string_charcmp;
new_plugin->string_charcasecmp = &string_charcasecmp;
new_plugin->strcasecmp = &string_strcasecmp;
new_plugin->strcasecmp_range = &string_strcasecmp_range;
new_plugin->strncasecmp = &string_strncasecmp;
@@ -658,8 +660,6 @@ plugin_load (const char *filename, int init_plugin, int argc, char **argv)
new_plugin->utf8_strlen = &utf8_strlen;
new_plugin->utf8_strnlen = &utf8_strnlen;
new_plugin->utf8_strlen_screen = &utf8_strlen_screen;
new_plugin->utf8_charcmp = &utf8_charcmp;
new_plugin->utf8_charcasecmp = &utf8_charcasecmp;
new_plugin->utf8_char_size_screen = &utf8_char_size_screen;
new_plugin->utf8_add_offset = &utf8_add_offset;
new_plugin->utf8_real_pos = &utf8_real_pos;
+1 -1
View File
@@ -701,7 +701,7 @@ trigger_regex_split (const char *str_regex,
/* search the delimiter (which can be more than one char) */
pos = weechat_utf8_next_char (ptr_regex);
while (pos[0] && (weechat_utf8_charcmp (ptr_regex, pos) == 0))
while (pos[0] && (weechat_string_charcmp (ptr_regex, pos) == 0))
{
pos = weechat_utf8_next_char (pos);
}
+7 -7
View File
@@ -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 "20221218-01"
#define WEECHAT_PLUGIN_API_VERSION "20221224-01"
/* macros for defining plugin infos */
#define WEECHAT_PLUGIN_NAME(__name) \
@@ -289,6 +289,8 @@ struct t_weechat_plugin
int screen, const char *cut_suffix);
char *(*string_tolower) (const char *string);
char *(*string_toupper) (const char *string);
int (*string_charcmp) (const char *string1, const char *string2);
int (*string_charcasecmp) (const char *string1, const char *string2);
int (*strcasecmp) (const char *string1, const char *string2);
int (*strcasecmp_range) (const char *string1, const char *string2,
int range);
@@ -372,8 +374,6 @@ struct t_weechat_plugin
int (*utf8_strlen) (const char *string);
int (*utf8_strnlen) (const char *string, int bytes);
int (*utf8_strlen_screen) (const char *string);
int (*utf8_charcmp) (const char *string1, const char *string2);
int (*utf8_charcasecmp) (const char *string1, const char *string2);
int (*utf8_char_size_screen) (const char *string);
const char *(*utf8_add_offset) (const char *string, int offset);
int (*utf8_real_pos) (const char *string, int pos);
@@ -1229,6 +1229,10 @@ extern int weechat_plugin_end (struct t_weechat_plugin *plugin);
(weechat_plugin->string_tolower)(__string)
#define weechat_string_toupper(__string) \
(weechat_plugin->string_toupper)(__string)
#define weechat_string_charcmp(__string1, __string2) \
(weechat_plugin->string_charcmp)(__string1, __string2)
#define weechat_string_charcasecmp(__string1, __string2) \
(weechat_plugin->string_charcasecmp)(__string1, __string2)
#define weechat_strcasecmp(__string1, __string2) \
(weechat_plugin->strcasecmp)(__string1, __string2)
#define weechat_strcasecmp_range(__string1, __string2, __range) \
@@ -1365,10 +1369,6 @@ extern int weechat_plugin_end (struct t_weechat_plugin *plugin);
(weechat_plugin->utf8_strnlen)(__string, __bytes)
#define weechat_utf8_strlen_screen(__string) \
(weechat_plugin->utf8_strlen_screen)(__string)
#define weechat_utf8_charcmp(__string1, __string2) \
(weechat_plugin->utf8_charcmp)(__string1, __string2)
#define weechat_utf8_charcasecmp(__string1, __string2) \
(weechat_plugin->utf8_charcasecmp)(__string1, __string2)
#define weechat_utf8_char_size_screen(__string) \
(weechat_plugin->utf8_char_size_screen)(__string)
#define weechat_utf8_add_offset(__string, __offset) \
+55 -1
View File
@@ -455,6 +455,60 @@ TEST(CoreString, Repeat)
STRCMP_EQUAL("noëlnoël", string_repeat ("noël", 2));
}
/*
* Tests functions:
* string_charcmp
* string_charcasecmp
* string_charcasecmp_range
*/
TEST(CoreString, CharComparison)
{
/* case-sensitive comparison */
LONGS_EQUAL(0, string_charcmp (NULL, NULL));
LONGS_EQUAL(-97, string_charcmp (NULL, "abc"));
LONGS_EQUAL(97, string_charcmp ("abc", NULL));
LONGS_EQUAL(0, string_charcmp ("axx", "azz"));
LONGS_EQUAL(-2, string_charcmp ("A", "C"));
LONGS_EQUAL(2, string_charcmp ("C", "A"));
LONGS_EQUAL(-32, string_charcmp ("A", "a"));
LONGS_EQUAL(-8129, string_charcmp ("ë", ""));
LONGS_EQUAL(235, string_charcmp ("ë", ""));
LONGS_EQUAL(-235, string_charcmp ("", "ë"));
/* case-insensitive comparison */
LONGS_EQUAL(0, string_charcasecmp (NULL, NULL));
LONGS_EQUAL(-97, string_charcasecmp (NULL, "abc"));
LONGS_EQUAL(97, string_charcasecmp ("abc", NULL));
LONGS_EQUAL(0, string_charcasecmp ("axx", "azz"));
LONGS_EQUAL(-2, string_charcasecmp ("A", "C"));
LONGS_EQUAL(2, string_charcasecmp ("C", "A"));
LONGS_EQUAL(0, string_charcasecmp ("A", "a"));
LONGS_EQUAL(-8129, string_charcasecmp ("ë", ""));
/* case-insensitive comparison with a range */
LONGS_EQUAL(0, string_charcasecmp_range (NULL, NULL, 30));
LONGS_EQUAL(-97, string_charcasecmp_range (NULL, "abc", 30));
LONGS_EQUAL(97, string_charcasecmp_range ("abc", NULL, 30));
LONGS_EQUAL(0, string_charcasecmp_range ("axx", "azz", 30));
LONGS_EQUAL(-2, string_charcasecmp_range ("A", "C", 30));
LONGS_EQUAL(2, string_charcasecmp_range ("C", "A", 30));
LONGS_EQUAL(0, string_charcasecmp_range ("A", "a", 30));
LONGS_EQUAL(-8129, string_charcasecmp_range ("ë", "", 30));
LONGS_EQUAL(0, string_charcasecmp_range ("[", "{", 30));
LONGS_EQUAL(0, string_charcasecmp_range ("]", "}", 30));
LONGS_EQUAL(0, string_charcasecmp_range ("\\", "|", 30));
LONGS_EQUAL(0, string_charcasecmp_range ("^", "~", 30));
LONGS_EQUAL(-32, string_charcasecmp_range ("[", "{", 26));
LONGS_EQUAL(32, string_charcasecmp_range ("{", "[", 26));
LONGS_EQUAL(-32, string_charcasecmp_range ("]", "}", 26));
LONGS_EQUAL(32, string_charcasecmp_range ("}", "]", 26));
LONGS_EQUAL(-32, string_charcasecmp_range ("\\", "|", 26));
LONGS_EQUAL(32, string_charcasecmp_range ("|", "\\", 26));
LONGS_EQUAL(-32, string_charcasecmp_range ("^", "~", 26));
LONGS_EQUAL(32, string_charcasecmp_range ("~", "^", 26));
}
/*
* Tests functions:
* string_strcasecmp
@@ -464,7 +518,7 @@ TEST(CoreString, Repeat)
* string_strcmp_ignore_chars
*/
TEST(CoreString, Comparison)
TEST(CoreString, StringComparison)
{
/* case-insensitive comparison */
LONGS_EQUAL(0, string_strcasecmp (NULL, NULL));
-54
View File
@@ -591,60 +591,6 @@ TEST(CoreUtf8, Size)
config_file_option_reset (config_look_tab_width, 1);
}
/*
* Tests functions:
* utf8_charcmp
* utf8_charcasecmp
* utf8_charcasecmp_range
*/
TEST(CoreUtf8, Comparison)
{
/* case-sensitive comparison */
LONGS_EQUAL(0, utf8_charcmp (NULL, NULL));
LONGS_EQUAL(-97, utf8_charcmp (NULL, "abc"));
LONGS_EQUAL(97, utf8_charcmp ("abc", NULL));
LONGS_EQUAL(0, utf8_charcmp ("axx", "azz"));
LONGS_EQUAL(-2, utf8_charcmp ("A", "C"));
LONGS_EQUAL(2, utf8_charcmp ("C", "A"));
LONGS_EQUAL(-32, utf8_charcmp ("A", "a"));
LONGS_EQUAL(-8129, utf8_charcmp ("ë", ""));
LONGS_EQUAL(235, utf8_charcmp ("ë", ""));
LONGS_EQUAL(-235, utf8_charcmp ("", "ë"));
/* case-insensitive comparison */
LONGS_EQUAL(0, utf8_charcasecmp (NULL, NULL));
LONGS_EQUAL(-97, utf8_charcasecmp (NULL, "abc"));
LONGS_EQUAL(97, utf8_charcasecmp ("abc", NULL));
LONGS_EQUAL(0, utf8_charcasecmp ("axx", "azz"));
LONGS_EQUAL(-2, utf8_charcasecmp ("A", "C"));
LONGS_EQUAL(2, utf8_charcasecmp ("C", "A"));
LONGS_EQUAL(0, utf8_charcasecmp ("A", "a"));
LONGS_EQUAL(-8129, utf8_charcasecmp ("ë", ""));
/* case-insensitive comparison with a range */
LONGS_EQUAL(0, utf8_charcasecmp_range (NULL, NULL, 30));
LONGS_EQUAL(-97, utf8_charcasecmp_range (NULL, "abc", 30));
LONGS_EQUAL(97, utf8_charcasecmp_range ("abc", NULL, 30));
LONGS_EQUAL(0, utf8_charcasecmp_range ("axx", "azz", 30));
LONGS_EQUAL(-2, utf8_charcasecmp_range ("A", "C", 30));
LONGS_EQUAL(2, utf8_charcasecmp_range ("C", "A", 30));
LONGS_EQUAL(0, utf8_charcasecmp_range ("A", "a", 30));
LONGS_EQUAL(-8129, utf8_charcasecmp_range ("ë", "", 30));
LONGS_EQUAL(0, utf8_charcasecmp_range ("[", "{", 30));
LONGS_EQUAL(0, utf8_charcasecmp_range ("]", "}", 30));
LONGS_EQUAL(0, utf8_charcasecmp_range ("\\", "|", 30));
LONGS_EQUAL(0, utf8_charcasecmp_range ("^", "~", 30));
LONGS_EQUAL(-32, utf8_charcasecmp_range ("[", "{", 26));
LONGS_EQUAL(32, utf8_charcasecmp_range ("{", "[", 26));
LONGS_EQUAL(-32, utf8_charcasecmp_range ("]", "}", 26));
LONGS_EQUAL(32, utf8_charcasecmp_range ("}", "]", 26));
LONGS_EQUAL(-32, utf8_charcasecmp_range ("\\", "|", 26));
LONGS_EQUAL(32, utf8_charcasecmp_range ("|", "\\", 26));
LONGS_EQUAL(-32, utf8_charcasecmp_range ("^", "~", 26));
LONGS_EQUAL(32, utf8_charcasecmp_range ("~", "^", 26));
}
/*
* Tests functions:
* utf8_strndup