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

api: add functions string_strcmp and string_strncmp

This commit is contained in:
Sébastien Helleu
2022-12-24 18:29:35 +01:00
parent 0dd1d4133b
commit 21f3575016
11 changed files with 494 additions and 1 deletions
+1
View File
@@ -26,6 +26,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: add functions string_strcmp and string_strncmp
* 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
+71
View File
@@ -768,6 +768,77 @@ int diff = weechat_string_charcasecmp ("aaa", "CCC"); /* == -2 */
[NOTE]
This function is not available in scripting API.
==== strcmp
_WeeChat ≥ 3.8._
Case sensitive string comparison.
Prototype:
[source,c]
----
int weechat_strcmp (const char *string1, const char *string2);
----
Arguments:
* _string1_: first string for comparison
* _string2_: second string for comparison
Return value: arithmetic result of subtracting the last compared UTF-8 char in
_string2_ from the last compared UTF-8 char in _string1_:
* < 0 if string1 < string2
* 0 if string1 == string2
* > 0 if string1 > string2
C example:
[source,c]
----
int diff = weechat_strcmp ("aaa", "ccc"); /* == -2 */
----
[NOTE]
This function is not available in scripting API.
==== strncmp
_WeeChat ≥ 3.8._
Case sensitive string comparison, for _max_ chars.
Prototype:
[source,c]
----
int weechat_strncmp (const char *string1, const char *string2, int max);
----
Arguments:
* _string1_: first string for comparison
* _string2_: second string for comparison
* _max_: max chars to compare
Return value: arithmetic result of subtracting the last compared UTF-8 char in
_string2_ from the last compared UTF-8 char in _string1_:
* < 0 if string1 < string2
* 0 if string1 == string2
* > 0 if string1 > string2
C example:
[source,c]
----
int diff = weechat_strncmp ("aabb", "aacc", 2); /* == 0 */
----
[NOTE]
This function is not available in scripting API.
==== strcasecmp
_Updated in 1.0, 3.8._
+71
View File
@@ -782,6 +782,77 @@ int diff = weechat_string_charcasecmp ("aaa", "CCC"); /* == -2 */
[NOTE]
Cette fonction n'est pas disponible dans l'API script.
==== strcmp
_WeeChat ≥ 3.8._
Comparer deux chaînes.
Prototype :
[source,c]
----
int weechat_strcmp (const char *string1, const char *string2);
----
Paramètres :
* _string1_ : première chaîne à comparer
* _string2_ : seconde chaîne à comparer
Valeur de retour : résultat de la soustraction du dernier caractère UTF-8 comparé
dans _string2_ du dernier caractère UTF-8 comparé dans _string1_ :
* < 0 si string1 < string2
* 0 si string1 == string2
* > 0 si string1 > string2
Exemple en C :
[source,c]
----
int diff = weechat_strcmp ("aaa", "ccc"); /* == -2 */
----
[NOTE]
Cette fonction n'est pas disponible dans l'API script.
==== strncmp
_WeeChat ≥ 3.8._
Comparer deux chaînes, pour _max_ caractères.
Prototype :
[source,c]
----
int weechat_strncmp (const char *string1, const char *string2, int max);
----
Paramètres :
* _string1_ : première chaîne à comparer
* _string2_ : seconde chaîne à comparer
* _max_ : nombre maximum de caractères à comparer
Valeur de retour : résultat de la soustraction du dernier caractère UTF-8 comparé
dans _string2_ du dernier caractère UTF-8 comparé dans _string1_ :
* < 0 si string1 < string2
* 0 si string1 == string2
* > 0 si string1 > string2
Exemple en C :
[source,c]
----
int diff = weechat_strncmp ("aabb", "aacc", 2); /* == 0 */
----
[NOTE]
Cette fonction n'est pas disponible dans l'API script.
==== strcasecmp
_Mis à jour dans la 1.0, 3.8._
+79
View File
@@ -816,6 +816,85 @@ int diff = weechat_string_charcasecmp ("aaa", "CCC"); /* == -2 */
[NOTE]
Questa funzione non è disponibile nelle API per lo scripting.
==== strcmp
// TRANSLATION MISSING
_WeeChat ≥ 3.8._
// TRANSLATION MISSING
Case sensitive string comparison.
Prototipo:
[source,c]
----
int weechat_strcmp (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 last compared UTF-8 char in
_string2_ from the last compared UTF-8 char in _string1_:
// TRANSLATION MISSING
* < 0 if string1 < string2
* 0 if string1 == string2
* > 0 if string1 > string2
Esempio in C:
[source,c]
----
int diff = weechat_strcmp ("aaa", "ccc"); /* == -2 */
----
[NOTE]
Questa funzione non è disponibile nelle API per lo scripting.
==== strncmp
// TRANSLATION MISSING
_WeeChat ≥ 3.8._
// TRANSLATION MISSING
Case sensitive string comparison, for _max_ chars.
Prototipo:
[source,c]
----
int weechat_strncmp (const char *string1, const char *string2, int max);
----
Argomenti:
* _string1_: prima stringa da comparare
* _string2_: seconda stringa da comparare
* _max_: numero massimo di caratteri da comparare
// TRANSLATION MISSING
Return value: arithmetic result of subtracting the last compared UTF-8 char in
_string2_ from the last compared UTF-8 char in _string1_:
// TRANSLATION MISSING
* < 0 if string1 < string2
* 0 if string1 == string2
* > 0 if string1 > string2
Esempio in C:
[source,c]
----
int diff = weechat_strncmp ("aabb", "aacc", 2); /* == 0 */
----
[NOTE]
Questa funzione non è disponibile nelle API per lo scripting.
==== strcasecmp
// TRANSLATION MISSING
+77
View File
@@ -791,6 +791,83 @@ int diff = weechat_string_charcasecmp ("aaa", "CCC"); /* == -2 */
[NOTE]
スクリプト API ではこの関数を利用できません。
==== strcmp
_WeeChat ≥ 3.8_
// TRANSLATION MISSING
Case sensitive string comparison.
プロトタイプ:
[source,c]
----
int weechat_strcmp (const char *string1, const char *string2);
----
引数:
* _string1_: 1 番目の比較対象の文字列
* _string2_: 2 番目の比較対象の文字列
// TRANSLATION MISSING
Return value: arithmetic result of subtracting the last compared UTF-8 char in
_string2_ from the last compared UTF-8 char in _string1_:
// TRANSLATION MISSING
* < 0 if string1 < string2
* 0 if string1 == string2
* > 0 if string1 > string2
C 言語での使用例:
[source,c]
----
int diff = weechat_strcmp ("aaa", "ccc"); /* == -2 */
----
[NOTE]
スクリプト API ではこの関数を利用できません。
==== strncmp
_WeeChat ≥ 3.8_
// TRANSLATION MISSING
Case sensitive string comparison, for _max_ chars.
プロトタイプ:
[source,c]
----
int weechat_strncmp (const char *string1, const char *string2, int max);
----
引数:
* _string1_: 1 番目の比較対象の文字列
* _string2_: 2 番目の比較対象の文字列
* _max_: 比較する文字数の最大値
// TRANSLATION MISSING
Return value: arithmetic result of subtracting the last compared UTF-8 char in
_string2_ from the last compared UTF-8 char in _string1_:
// TRANSLATION MISSING
* < 0 if string1 < string2
* 0 if string1 == string2
* > 0 if string1 > string2
C 言語での使用例:
[source,c]
----
int diff = weechat_strncmp ("aabb", "aacc", 2); /* == 0 */
----
[NOTE]
スクリプト API ではこの関数を利用できません。
==== strcasecmp
_WeeChat バージョン 1.0, 3.8 で更新。_
+79
View File
@@ -752,6 +752,85 @@ int diff = weechat_string_charcasecmp ("aaa", "CCC"); /* == -2 */
[NOTE]
Ова функција није доступна у API скриптовања.
==== strcmp
_WeeChat ≥ 3.8._
// TRANSLATION MISSING
Case sensitive string comparison.
Прототип:
[source,c]
----
int weechat_strcmp (const char *string1, const char *string2);
----
Аргументи:
* _string1_: први стринг за поређење
* _string2_: други стринг за поређење
Повратна вредност:
// TRANSLATION MISSING
Return value: arithmetic result of subtracting the last compared UTF-8 char in
_string2_ from the last compared UTF-8 char in _string1_:
// TRANSLATION MISSING
* < 0 if string1 < string2
* 0 if string1 == string2
* > 0 if string1 > string2
C пример:
[source,c]
----
int diff = weechat_strcmp ("aaa", "ccc"); /* == -2 */
----
[NOTE]
Ова функција није доступна у API скриптовања.
==== strncmp
_WeeChat ≥ 3.8._
// TRANSLATION MISSING
Case sensitive string comparison, for _max_ chars.
Прототип:
[source,c]
----
int weechat_strncmp (const char *string1, const char *string2, int max);
----
Аргументи:
* _string1_: први стринг за поређење
* _string2_: други стринг за поређење
* _max_: максимални број карактера који се пореде
// TRANSLATION MISSING
Return value: arithmetic result of subtracting the last compared UTF-8 char in
_string2_ from the last compared UTF-8 char in _string1_:
// TRANSLATION MISSING
* < 0 if string1 < string2
* 0 if string1 == string2
* > 0 if string1 > string2
C пример:
[source,c]
----
int diff = weechat_strncmp ("aabb", "aacc", 2); /* == 0 */
----
[NOTE]
Ова функција није доступна у API скриптовања.
==== strcasecmp
_Ажурирано у верзији 1.0, 3.8._
+61
View File
@@ -484,6 +484,67 @@ string_charcasecmp_range (const char *string1, const char *string2, int range)
return wchar1 - wchar2;
}
/*
* Compares two strings (case sensitive).
*
* Returns: arithmetic result of subtracting the last compared UTF-8 char in
* string2 from the last compared UTF-8 char in string1:
* < 0: string1 < string2
* 0: string1 == string2
* > 0: string1 > string2
*/
int
string_strcmp (const char *string1, const char *string2)
{
int diff;
while (string1 && string1[0] && string2 && string2[0])
{
diff = string_charcmp (string1, string2);
if (diff != 0)
return diff;
string1 = utf8_next_char (string1);
string2 = utf8_next_char (string2);
}
return string_charcmp (string1, string2);
}
/*
* Compares two strings with max length (case sensitive).
*
* Returns: arithmetic result of subtracting the last compared UTF-8 char in
* string2 from the last compared UTF-8 char in string1:
* < 0: string1 < string2
* 0: string1 == string2
* > 0: string1 > string2
*/
int
string_strncmp (const char *string1, const char *string2, int max)
{
int count, diff;
count = 0;
while ((count < max) && string1 && string1[0] && string2 && string2[0])
{
diff = string_charcmp (string1, string2);
if (diff != 0)
return diff;
string1 = utf8_next_char (string1);
string2 = utf8_next_char (string2);
count++;
}
if (count >= max)
return 0;
else
return string_charcmp (string1, string2);
}
/*
* Compares two strings (case insensitive).
*
+2
View File
@@ -48,6 +48,8 @@ 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_strcmp (const char *string1, const char *string2);
extern int string_strncmp (const char *string1, const char *string2, int max);
extern int string_strcasecmp (const char *string1, const char *string2);
extern int string_strcasecmp_range (const char *string1, const char *string2,
int range);
+2
View File
@@ -607,6 +607,8 @@ plugin_load (const char *filename, int init_plugin, int argc, char **argv)
new_plugin->string_toupper = &string_toupper;
new_plugin->string_charcmp = &string_charcmp;
new_plugin->string_charcasecmp = &string_charcasecmp;
new_plugin->strcmp = &string_strcmp;
new_plugin->strncmp = &string_strncmp;
new_plugin->strcasecmp = &string_strcasecmp;
new_plugin->strcasecmp_range = &string_strcasecmp_range;
new_plugin->strncasecmp = &string_strncasecmp;
+7 -1
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 "20221224-01"
#define WEECHAT_PLUGIN_API_VERSION "20221224-02"
/* macros for defining plugin infos */
#define WEECHAT_PLUGIN_NAME(__name) \
@@ -291,6 +291,8 @@ struct t_weechat_plugin
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 (*strcmp) (const char *string1, const char *string2);
int (*strncmp) (const char *string1, const char *string2, int max);
int (*strcasecmp) (const char *string1, const char *string2);
int (*strcasecmp_range) (const char *string1, const char *string2,
int range);
@@ -1233,6 +1235,10 @@ extern int weechat_plugin_end (struct t_weechat_plugin *plugin);
(weechat_plugin->string_charcmp)(__string1, __string2)
#define weechat_string_charcasecmp(__string1, __string2) \
(weechat_plugin->string_charcasecmp)(__string1, __string2)
#define weechat_strcmp(__string1, __string2) \
(weechat_plugin->strcmp)(__string1, __string2)
#define weechat_strncmp(__string1, __string2, __max) \
(weechat_plugin->strncmp)(__string1, __string2, __max)
#define weechat_strcasecmp(__string1, __string2) \
(weechat_plugin->strcasecmp)(__string1, __string2)
#define weechat_strcasecmp_range(__string1, __string2, __range) \
+44
View File
@@ -511,6 +511,8 @@ TEST(CoreString, CharComparison)
/*
* Tests functions:
* string_strcmp
* string_strncmp
* string_strcasecmp
* string_strncasecmp
* string_strcasecmp_range
@@ -520,6 +522,48 @@ TEST(CoreString, CharComparison)
TEST(CoreString, StringComparison)
{
/* case-sensitive comparison */
LONGS_EQUAL(0, string_strcmp (NULL, NULL));
LONGS_EQUAL(-97, string_strcmp (NULL, "abc"));
LONGS_EQUAL(97, string_strcmp ("abc", NULL));
LONGS_EQUAL(-98, string_strcmp ("", "b"));
LONGS_EQUAL(98, string_strcmp ("b", ""));
LONGS_EQUAL(0, string_strcmp ("abc", "abc"));
LONGS_EQUAL(32, string_strcmp ("abc", "ABC"));
LONGS_EQUAL(0, string_strcmp ("ABC", "ABC"));
LONGS_EQUAL(-3, string_strcmp ("abc", "def"));
LONGS_EQUAL(29, string_strcmp ("abc", "DEF"));
LONGS_EQUAL(-35, string_strcmp ("ABC", "def"));
LONGS_EQUAL(-3, string_strcmp ("ABC", "DEF"));
LONGS_EQUAL(3, string_strcmp ("def", "abc"));
LONGS_EQUAL(35, string_strcmp ("def", "ABC"));
LONGS_EQUAL(-29, string_strcmp ("DEF", "abc"));
LONGS_EQUAL(3, string_strcmp ("DEF", "ABC"));
/* case-sensitive comparison with max length */
LONGS_EQUAL(0, string_strncmp (NULL, NULL, 3));
LONGS_EQUAL(-97, string_strncmp (NULL, "abc", 3));
LONGS_EQUAL(97, string_strncmp ("abc", NULL, 3));
LONGS_EQUAL(-98, string_strncmp ("", "b", 3));
LONGS_EQUAL(98, string_strncmp ("b", "", 3));
LONGS_EQUAL(0, string_strncmp ("abc", "abc", 3));
LONGS_EQUAL(0, string_strncmp ("abcabc", "abcdef", 3));
LONGS_EQUAL(-3, string_strncmp ("abcabc", "abcdef", 6));
LONGS_EQUAL(32, string_strncmp ("abc", "ABC", 3));
LONGS_EQUAL(32, string_strncmp ("abcabc", "ABCDEF", 3));
LONGS_EQUAL(32, string_strncmp ("abcabc", "ABCDEF", 6));
LONGS_EQUAL(0, string_strncmp ("ABC", "ABC", 3));
LONGS_EQUAL(0, string_strncmp ("ABCABC", "ABCDEF", 3));
LONGS_EQUAL(-3, string_strncmp ("ABCABC", "ABCDEF", 6));
LONGS_EQUAL(-3, string_strncmp ("abc", "def", 3));
LONGS_EQUAL(29, string_strncmp ("abc", "DEF", 3));
LONGS_EQUAL(-35, string_strncmp ("ABC", "def", 3));
LONGS_EQUAL(-3, string_strncmp ("ABC", "DEF", 3));
LONGS_EQUAL(3, string_strncmp ("def", "abc", 3));
LONGS_EQUAL(35, string_strncmp ("def", "ABC", 3));
LONGS_EQUAL(-29, string_strncmp ("DEF", "abc", 3));
LONGS_EQUAL(3, string_strncmp ("DEF", "ABC", 3));
/* case-insensitive comparison */
LONGS_EQUAL(0, string_strcasecmp (NULL, NULL));
LONGS_EQUAL(-97, string_strcasecmp (NULL, "abc"));