New features::
+ * core: improve case convert and insensitive char comparisons (issue #258)
* core: add color attributes "blink" and "dim" (half bright) (issue #1855)
* core: allow command `/toggle` to create option before setting the value, if allowed in the section (issue #1837)
* core: add signals "buffer_user_input_xxx" and "buffer_user_closing_xxx" for buffers created with `/buffer add` (issue #1848)
_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.
+Return a string with uppercase letters converted to lowercase.
+
+[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`. +
+Moreover, a newly allocated string is returned and must be freed after use.
Prototype:
[source,c]
----
-char *str = weechat_string_tolower ("ABCD_Ã\89"); /* result: "abcd_Ã\89" */
+char *str = weechat_string_tolower ("ABCD_Ã\89"); /* result: "abcd_é" */
/* ... */
free (str);
----
_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.
+Return a string with lowercase letters converted to uppercase.
+
+[NOTE]
+Behavior has changed in version 3.8: now all lowercase letters are properly
+converted to uppercase (by calling function `towupper`), in addition to the
+range `a` to `z`. +
+Moreover, a newly allocated string is returned and must be freed after use.
Prototype:
[source,c]
----
-char *str = weechat_string_toupper ("abcd_é"); /* result: "ABCD_é" */
+char *str = weechat_string_toupper ("abcd_é"); /* result: "ABCD_Ã\89" */
/* ... */
free (str);
----
==== strcasecmp
-_Updated in 1.0._
+_Updated in 1.0, 3.8._
+
+Case insensitive string comparison.
-Locale and case independent string comparison.
+[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 diff = weechat_strcasecmp ("aaa", "CCC"); /* == -2 */
+int diff;
+diff = weechat_strcasecmp ("aaa", "CCC"); /* == -1 */
+diff = weechat_strcasecmp ("noël", "NOËL"); /* == 0 */
----
[NOTE]
==== strncasecmp
-_Updated in 1.0._
+_Updated in 1.0, 3.8._
+
+Case insensitive string comparison, for _max_ chars.
-Locale and case independent string comparison, for _max_ chars.
+[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:
==== strcmp_ignore_chars
-_Updated in 1.0._
+_Updated in 1.0, 3.8._
-Locale (and optionally case independent) string comparison, ignoring some
-chars.
+String comparison ignoring some chars.
Prototype:
* _chars_ignored_: string with chars to ignored
* _case_sensitive_: 1 for case sensitive comparison, otherwise 0
+[NOTE]
+Behavior has changed in version 3.8 when _case_sensitive_ is set to 0: now all
+uppercase letters are properly converted to lowercase (by calling function
+`towlower`), in addition to the range `A` to `Z`.
+
Return value:
* -1 if string1 < string2
==== strcasestr
-_Updated in 1.3._
+_Updated in 1.3, 3.8._
+
+Case insensitive string search.
-Locale and case independent string search.
+[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:
==== string_match
-_Updated in 1.0._
+_Updated in 1.0, 3.8._
Check if a string matches a mask.
Since version 1.0, wildcards are allowed inside the mask
(not only beginning/end of mask).
+[NOTE]
+Behavior has changed in version 3.8 when _case_sensitive_ is set to 0: now all
+uppercase letters are properly converted to lowercase (by calling function
+`towlower`), in addition to the range `A` to `Z`.
+
Return value:
* 1 if string matches mask, otherwise 0
==== string_match_list
-_WeeChat ≥ 2.5._
+_WeeChat ≥ 2.5, updated in 3.8._
Check if a string matches a list of masks where negative mask is allowed
with the format "!word". A negative mask has higher priority than a standard
is compared to the string with the function <<_string_match,string_match>>
* _case_sensitive_: 1 for case sensitive comparison, otherwise 0
+[NOTE]
+Behavior has changed in version 3.8 when _case_sensitive_ is set to 0: now all
+uppercase letters are properly converted to lowercase (by calling function
+`towlower`), in addition to the range `A` to `Z`.
+
Return value:
* 1 if string matches list of masks (at least one mask matches and no negative
==== utf8_charcasecmp
-_Updated in 1.0._
+_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]
_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.
+Retourner une chaîne avec les lettres majuscules converties en minuscules.
+
+[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`. +
+De plus, une chaîne nouvellement allouée est retournée et doit être libérée après
+utilisation.
Prototype :
[source,c]
----
-char *str = weechat_string_tolower ("ABCD_Ã\89"); /* résultat : "abcd_Ã\89" */
+char *str = weechat_string_tolower ("ABCD_Ã\89"); /* résultat : "abcd_é" */
/* ... */
free (str);
----
_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.
+Retourner une chaîne avec les lettres minuscules converties en majuscules.
+
+[NOTE]
+Le comportement a changé dans la version 3.8 : désormais toutes les lettres en
+minuscules sont correctement converties en majuscules (par appel à la fonction
+`towupper`), en plus de l'intervalle de `a` à `z`. +
+De plus, une chaîne nouvellement allouée est retournée et doit être libérée après
+utilisation.
Prototype :
[source,c]
----
-char *str = weechat_string_toupper ("abcd_é"); /* résultat : "ABCD_é" */
+char *str = weechat_string_toupper ("abcd_é"); /* résultat : "ABCD_Ã\89" */
/* ... */
free (str);
----
==== strcasecmp
-_Mis à jour dans la 1.0._
+_Mis à jour dans la 1.0, 3.8._
+
+Comparer deux chaînes indépendemment de la casse.
-Comparer deux chaînes indépendemment de la locale et de 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 diff = weechat_strcasecmp ("aaa", "CCC"); /* == -2 */
+int diff;
+diff = weechat_strcasecmp ("aaa", "CCC"); /* == -1 */
+diff = weechat_strcasecmp ("noël", "NOËL"); /* == 0 */
----
[NOTE]
==== strncasecmp
-_Mis à jour dans la 1.0._
+_Mis à jour dans la 1.0, 3.8._
-Comparer deux chaînes indépendemment de la locale et de la casse, pour _max_
-caractères.
+Comparer deux chaînes indépendemment de la casse, pour _max_ caractères.
+
+[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 :
==== strcmp_ignore_chars
-_Mis à jour dans la 1.0._
+_Mis à jour dans la 1.0, 3.8._
-Comparer deux chaînes indépendemment de la locale (et en option de la casse), en
-ignorant des caractères.
+Comparer deux chaînes en ignorant des caractères.
Prototype :
* _chars_ignored_ : chaîne avec les caractères à ignorer
* _case_sensitive_ : 1 pour une comparaison tenant compte de la casse, sinon 0
+[NOTE]
+Le comportement a changé dans la version 3.8 lorsque _case_sensitive_ est
+positionné à 0 : 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`.
+
Valeur de retour :
* -1 si string1 < string2
==== strcasestr
-_Mis à jour dans la 1.3._
+_Mis à jour dans la 1.3, 3.8._
-Rechercher une chaîne indépendemment de la locale et de la casse.
+Rechercher une chaîne indépendemment de 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 :
==== string_match
-_Mis à jour dans la 1.0._
+_Mis à jour dans la 1.0, 3.8._
Vérifier si une chaîne correspond à un masque.
Depuis la version 1.0, les caractères joker sont autorisés à l'intérieur du
masque (pas seulement au début et à la fin du masque).
+[NOTE]
+Le comportement a changé dans la version 3.8 lorsque _case_sensitive_ est
+positionné à 0 : 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`.
+
Valeur de retour :
* 1 si la chaîne correspond au masque, sinon 0
==== string_match_list
-_WeeChat ≥ 2.5._
+_WeeChat ≥ 2.5, mis à jour dans la 3.8._
Vérifier si une chaîne correspond à une liste de masques. Des masques négatifs
sont autorisés avec le format "!mot". Un masque négatif a une priorité plus
<<_string_match,string_match>>
* _case_sensitive_ : 1 pour une comparaison tenant compte de la casse, sinon 0
+[NOTE]
+Le comportement a changé dans la version 3.8 lorsque _case_sensitive_ est
+positionné à 0 : 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`.
+
Valeur de retour :
* 1 si la chaîne correspond à la liste de masques (au moins un masque correspond
==== utf8_charcasecmp
-_Mis à jour dans la 1.0._
+_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]
_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.
+Return a string with uppercase letters converted to lowercase.
+
+[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`. +
+Moreover, a newly allocated string is returned and must be freed after use.
Prototipo:
[source,c]
----
-char *str = weechat_string_tolower ("ABCD_Ã\89"); /* result: "abcd_Ã\89" */
+char *str = weechat_string_tolower ("ABCD_Ã\89"); /* result: "abcd_é" */
/* ... */
free (str);
----
_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.
+Return a string with lowercase letters converted to uppercase.
+
+[NOTE]
+Behavior has changed in version 3.8: now all lowercase letters are properly
+converted to uppercase (by calling function `towupper`), in addition to the
+range `a` to `z`. +
+Moreover, a newly allocated string is returned and must be freed after use.
Prototipo:
[source,c]
----
-char *str = weechat_string_toupper ("abcd_é"); /* result: "ABCD_é" */
+char *str = weechat_string_toupper ("abcd_é"); /* result: "ABCD_Ã\89" */
/* ... */
free (str);
----
==== strcasecmp
// TRANSLATION MISSING
-_Updated in 1.0._
+_Updated in 1.0, 3.8._
-Confronta stringa non sensibile alle maiuscole e alla localizzazione.
+// TRANSLATION MISSING
+Case insensitive string comparison.
+
+// 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 diff = weechat_strcasecmp ("aaa", "CCC"); /* == -2 */
+int diff;
+diff = weechat_strcasecmp ("aaa", "CCC"); /* == -1 */
+diff = weechat_strcasecmp ("noël", "NOËL"); /* == 0 */
----
[NOTE]
==== strncasecmp
// TRANSLATION MISSING
-_Updated in 1.0._
+_Updated in 1.0, 3.8._
-Confronta stringa indipendente non sensibile alle maiuscole e alla
-localizzazione, per un numero _max_ di caratteri.
+// TRANSLATION MISSING
+Case insensitive string comparison, for _max_ chars.
+
+// 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:
==== strcmp_ignore_chars
// TRANSLATION MISSING
-_Updated in 1.0._
+_Updated in 1.0, 3.8._
-Confronta una stringa localizzata (e opzionalmente non sensibile alle
-maiuscole), ignorando alcuni caratteri.
+// TRANSLATION MISSING
+String comparison ignoring some chars.
Prototipo:
* _chars_ignored_: stringa con caratteri da ignorare
* _case_sensitive_: 1 per il confronto sensibile alle maiuscole, altrimenti 0
+// TRANSLATION MISSING
+[NOTE]
+Behavior has changed in version 3.8 when _case_sensitive_ is set to 0: now all
+uppercase letters are properly converted to lowercase (by calling function
+`towlower`), in addition to the range `A` to `Z`.
+
Valore restituito:
* -1 se stringa1 < stringa2
==== strcasestr
// TRANSLATION MISSING
-_Updated in 1.3._
+_Updated in 1.3, 3.8._
+
+// TRANSLATION MISSING
+Case insensitive string search.
-Cerca una stringa non sensibile alle maiuscole e indipendente dalla
-localizzazione.
+// 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:
==== string_match
// TRANSLATION MISSING
-_Updated in 1.0._
+_Updated in 1.0, 3.8._
Verifica se una stringa coincide ad una mask.
Since version 1.0, wildcards are allowed inside the mask
(not only beginning/end of mask).
+// TRANSLATION MISSING
+[NOTE]
+Behavior has changed in version 3.8 when _case_sensitive_ is set to 0: now all
+uppercase letters are properly converted to lowercase (by calling function
+`towlower`), in addition to the range `A` to `Z`.
+
Valore restituito:
* 1 se la stringa coincide alla mask, altrimenti 0
==== string_match_list
-_WeeChat ≥ 2.5._
+// TRANSLATION MISSING
+_WeeChat ≥ 2.5, updated in 3.8._
// TRANSLATION MISSING
Check if a string matches a list of masks where negative mask is allowed
is compared to the string with the function <<_string_match,string_match>>
* _case_sensitive_: 1 for case sensitive comparison, otherwise 0
+// TRANSLATION MISSING
+[NOTE]
+Behavior has changed in version 3.8 when _case_sensitive_ is set to 0: now all
+uppercase letters are properly converted to lowercase (by calling function
+`towlower`), in addition to the range `A` to `Z`.
+
Valore restituito:
// TRANSLATION MISSING
==== utf8_charcasecmp
// TRANSLATION MISSING
-_Updated in 1.0._
+_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]
_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.
+Return a string with uppercase letters converted to lowercase.
+
+[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`. +
+Moreover, a newly allocated string is returned and must be freed after use.
プロトタイプ:
[source,c]
----
-char *str = weechat_string_tolower ("ABCD_Ã\89"); /* result: "abcd_Ã\89" */
+char *str = weechat_string_tolower ("ABCD_Ã\89"); /* result: "abcd_é" */
/* ... */
free (str);
----
_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.
+Return a string with lowercase letters converted to uppercase.
+
+[NOTE]
+Behavior has changed in version 3.8: now all lowercase letters are properly
+converted to uppercase (by calling function `towupper`), in addition to the
+range `a` to `z`. +
+Moreover, a newly allocated string is returned and must be freed after use.
プロトタイプ:
[source,c]
----
-char *str = weechat_string_toupper ("abcd_é"); /* result: "ABCD_é" */
+char *str = weechat_string_toupper ("abcd_é"); /* result: "ABCD_Ã\89" */
/* ... */
free (str);
----
==== strcasecmp
-_WeeChat バージョン 1.0 で更新。_
+_WeeChat バージョン 1.0, 3.8 で更新。_
-ロケールと大文字小文字を無視して文字列を比較。
+// TRANSLATION MISSING
+Case insensitive string comparison.
+
+// 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_strcasecmp (const char *string1, const char *string2);
+int diff;
+diff = weechat_strcasecmp ("aaa", "CCC"); /* == -1 */
+diff = weechat_strcasecmp ("noël", "NOËL"); /* == 0 */
----
引数:
[source,c]
----
-int diff = weechat_strcasecmp ("aaa", "CCC"); /* == -2 */
+int diff = weechat_strcasecmp ("aaa", "CCC"); /* == -1 */
----
[NOTE]
_WeeChat バージョン 1.0 で更新。_
-ロケールと大文字小文字を無視して _max_ 文字だけ文字列を比較。
+// TRANSLATION MISSING
+Case insensitive string comparison, for _max_ chars.
+
+// 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`.
プロトタイプ:
==== strcmp_ignore_chars
-_WeeChat バージョン 1.0 で更新。_
+_WeeChat バージョン 1.0, 3.8 で更新。_
-一部の文字列を無視して、ロケールに依存して
-(オプションで大文字小文字の区別をしない) 文字列を比較。
+// TRANSLATION MISSING
+String comparison ignoring some chars.
プロトタイプ:
* _chars_ignored_: 無視する文字
* _case_sensitive_: 大文字小文字を区別して比較する場合は 1、区別しない場合は 0
+// TRANSLATION MISSING
+[NOTE]
+Behavior has changed in version 3.8 when _case_sensitive_ is set to 0: now all
+uppercase letters are properly converted to lowercase (by calling function
+`towlower`), in addition to the range `A` to `Z`.
+
戻り値:
* string1 < string2 の場合は -1
==== strcasestr
-_WeeChat バージョン 1.3 で更新。_
+_WeeChat バージョン 1.3, 3.8 で更新。_
+
+// TRANSLATION MISSING
+Case insensitive string search.
-ロケールと大文字小文字を区別して文字列を検索。
+// 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`.
プロトタイプ:
==== string_match
-_WeeChat バージョン 1.0 で更新。_
+_WeeChat バージョン 1.0, 3.8 で更新。_
文字列がマスクにマッチするか確認。
WeeChat バージョン 1.0 以上の場合、ワイルドカードをマスクの内部で使うことが可能です
(マスクの最初および最後だけではありません)。
+// TRANSLATION MISSING
+[NOTE]
+Behavior has changed in version 3.8 when _case_sensitive_ is set to 0: now all
+uppercase letters are properly converted to lowercase (by calling function
+`towlower`), in addition to the range `A` to `Z`.
+
戻り値:
* マスクにマッチした場合は 1、それ以外は 0
==== string_match_list
-_WeeChat バージョン 2.5 以上で利用可。_
+// TRANSLATION MISSING
+_WeeChat ≥ 2.5, updated in 3.8._
文字列が否定マスク
(書式: "!word")
各マスクは関数 <<_string_match,string_match>> で文字列と比較されます
* _case_sensitive_: 大文字と小文字を区別する場合は 1、区別しない場合は 0
+// TRANSLATION MISSING
+[NOTE]
+Behavior has changed in version 3.8 when _case_sensitive_ is set to 0: now all
+uppercase letters are properly converted to lowercase (by calling function
+`towlower`), in addition to the range `A` to `Z`.
+
戻り値:
* 1 if string matches list of masks (at least one mask matches and no negative
==== utf8_charcasecmp
-_WeeChat バージョン 1.0 で更新。_
+_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]
_Ажурирано у верзији 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.
+Return a string with uppercase letters converted to lowercase.
+
+[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`. +
+Moreover, a newly allocated string is returned and must be freed after use.
Прототип:
[source,c]
----
-char *str = weechat_string_tolower ("ABCD_Ã\89"); /* result: â\80\9eabcd_Ã\89” */
+char *str = weechat_string_tolower ("ABCD_Ã\89"); /* result: â\80\9eabcd_é” */
/* ... */
free (str);
----
_Ажурирано у верзији 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.
+Return a string with lowercase letters converted to uppercase.
+
+[NOTE]
+Behavior has changed in version 3.8: now all lowercase letters are properly
+converted to uppercase (by calling function `towupper`), in addition to the
+range `a` to `z`. +
+Moreover, a newly allocated string is returned and must be freed after use.
Прототип:
[source,c]
----
-char *str = weechat_string_toupper ("abcd_é"); /* result: â\80\9eABCD_é” */
+char *str = weechat_string_toupper ("abcd_é"); /* result: â\80\9eABCD_Ã\89” */
/* ... */
free (str);
----
==== strcasecmp
-_Ажурирано у верзији 1.0._
+_Ажурирано у верзији 1.0, 3.8._
-Поређење стрингова независно од величине слова и локал подешавања.
+// TRANSLATION MISSING
+Case insensitive string comparison.
+
+// 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 diff = weechat_strcasecmp ("aaa", "CCC"); /* == -2 */
+int diff;
+diff = weechat_strcasecmp ("aaa", "CCC"); /* == -1 */
+diff = weechat_strcasecmp ("noël", "NOËL"); /* == 0 */
----
[NOTE]
_Ажурирано у верзији 1.0._
-Поређење стрингова независно од величине слова и локал подешавања, за _max_ карактера.
+// TRANSLATION MISSING
+Case insensitive string comparison, for _max_ chars.
+
+// 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`.
Прототип:
==== strcmp_ignore_chars
-_Ажурирано у верзији 1.0._
+_Ажурирано у верзији 1.0, 3.8._
-Поређење стрингова према локал подешавању (и необавезно независно од величине слова), уз игнорисање неких карактера.
+// TRANSLATION MISSING
+String comparison ignoring some chars.
Прототип:
* _chars_ignored_: стринг са карактерима који се игноришу
* _case_sensitive_: 1 за поређење које прави разлику у величини слова, у супротном 0
+// TRANSLATION MISSING
+[NOTE]
+Behavior has changed in version 3.8 when _case_sensitive_ is set to 0: now all
+uppercase letters are properly converted to lowercase (by calling function
+`towlower`), in addition to the range `A` to `Z`.
+
Повратна вредност:
* -1 ако је string1 < string2
==== strcasestr
-_Ажурирано у верзији 1.3._
+_Ажурирано у верзији 1.3, 3.8._
+
+// TRANSLATION MISSING
+Case insensitive string search.
-Претрага стринга независно од величине слова и локал подешавања.
+// 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`.
Прототип:
==== string_match
-_Ажурирано у верзији 1.0._
+_Ажурирано у верзији 1.0, 3.8._
Провера да ли стринг задовољава маску.
[NOTE]
Почевши од верзије 1.0, у маски се дозвољава употреба џокера (не само на почетку/крају маске).
+// TRANSLATION MISSING
+[NOTE]
+Behavior has changed in version 3.8 when _case_sensitive_ is set to 0: now all
+uppercase letters are properly converted to lowercase (by calling function
+`towlower`), in addition to the range `A` to `Z`.
+
Повратна вредност:
* 1 ако стринг задовољава маску, у супротном 0
==== string_match_list
-_WeeChat ≥ 2.5._
+_WeeChat ≥ 2.5, ажурирано у верзији 3.8._
Проверава да ли стринг задовољава листу маски, при чему је дозвољена употреба негативних маски у формату „!реч”. Негативна маска има виши приоритет у односу на стандардну маску.
* _masks_: листа маски, са NULL након последње маске у листи; свака маска се пореди са стрингом функцијом <<_string_match,string_match>>
* _case_sensitive_: 1 за поређење које прави разлику у величини слова, у супротном 0
+// TRANSLATION MISSING
+[NOTE]
+Behavior has changed in version 3.8 when _case_sensitive_ is set to 0: now all
+uppercase letters are properly converted to lowercase (by calling function
+`towlower`), in addition to the range `A` to `Z`.
+
Повратна вредност:
* 1 ако стринг задовољава листу маски (барем једна од маски је задовољена и ниједна од негативних маски), у супротном 0
==== utf8_charcasecmp
-_Ажурирано у верзији 1.0._
+_Ажурирано у верзији 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]
/* char1 */
item = string_strndup (ptr_item, pos - ptr_item);
item2 = string_convert_escaped_chars (item);
- (*word_chars)[i].char1 = utf8_wide_char (item2);
+ (*word_chars)[i].char1 = utf8_char_int (item2);
if (item)
free (item);
if (item2)
/* char2 */
item = strdup (pos + 1);
item2 = string_convert_escaped_chars (item);
- (*word_chars)[i].char2 = utf8_wide_char (item2);
+ (*word_chars)[i].char2 = utf8_char_int (item2);
if (item)
free (item);
if (item2)
if ((*word_chars)[i].wc_class == (wctype_t)0)
{
item = string_convert_escaped_chars (ptr_item);
- (*word_chars)[i].char1 = utf8_wide_char (item);
+ (*word_chars)[i].char1 = utf8_char_int (item);
(*word_chars)[i].char2 = (*word_chars)[i].char1;
if (item)
free (item);
#include <string.h>
#include <ctype.h>
#include <wctype.h>
-#include <regex.h>
#include <wchar.h>
+#include <regex.h>
#include <stdint.h>
#include <gcrypt.h>
}
/*
- * 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.
+ * Converts string to lowercase (locale dependent).
*/
char *
string_tolower (const char *string)
{
- char *result, *ptr_result;
+ char **result, utf_char[5];
if (!string)
return NULL;
- result = strdup (string);
+ result = string_dyn_alloc (strlen (string) + 1);
if (!result)
return NULL;
- ptr_result = result;
- while (ptr_result && ptr_result[0])
+ while (string && string[0])
{
- if ((ptr_result[0] >= 'A') && (ptr_result[0] <= 'Z'))
- ptr_result[0] += ('a' - 'A');
- ptr_result = (char *)utf8_next_char (ptr_result);
+ if (!((unsigned char)(string[0]) & 0x80))
+ {
+ /*
+ * optimization for single-byte char: only letters A-Z must be
+ * converted to lowercase; this is faster than calling `towlower`
+ */
+ if ((string[0] >= 'A') && (string[0] <= 'Z'))
+ utf_char[0] = string[0] + ('a' - 'A');
+ else
+ utf_char[0] = string[0];
+ utf_char[1] = '\0';
+ string_dyn_concat (result, utf_char, -1);
+ string++;
+ }
+ else
+ {
+ /* char ≥ 2 bytes, use `towlower` */
+ utf8_int_string (towlower (utf8_char_int (string)), utf_char);
+ string_dyn_concat (result, utf_char, -1);
+ string = (char *)utf8_next_char (string);
+ }
}
-
- return result;
+ return string_dyn_free (result, 0);
}
/*
- * 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.
+ * Converts string to uppercase (locale dependent).
*/
char *
string_toupper (const char *string)
{
- char *result, *ptr_result;
+ char **result, utf_char[5];
if (!string)
return NULL;
- result = strdup (string);
+ result = string_dyn_alloc (strlen (string) + 1);
if (!result)
return NULL;
- ptr_result = result;
- while (ptr_result && ptr_result[0])
+ while (string && string[0])
{
- if ((ptr_result[0] >= 'a') && (ptr_result[0] <= 'z'))
- ptr_result[0] -= ('a' - 'A');
- ptr_result = (char *)utf8_next_char (ptr_result);
+ if (!((unsigned char)(string[0]) & 0x80))
+ {
+ /*
+ * optimization for single-byte char: only letters a-z must be
+ * converted to uppercase; this is faster than calling `towupper`
+ */
+ if ((string[0] >= 'a') && (string[0] <= 'z'))
+ utf_char[0] = string[0] - ('a' - 'A');
+ else
+ utf_char[0] = string[0];
+ utf_char[1] = '\0';
+ string_dyn_concat (result, utf_char, -1);
+ string++;
+ }
+ else
+ {
+ /* char ≥ 2 bytes, use `towupper` */
+ utf8_int_string (towupper (utf8_char_int (string)), utf_char);
+ string_dyn_concat (result, utf_char, -1);
+ string = (char *)utf8_next_char (string);
+ }
}
-
- return result;
+ return string_dyn_free (result, 0);
}
/*
wint_t c;
int i, match;
- c = utf8_wide_char (string);
-
- if (c == WEOF)
+ if (!string || !string[0])
return 0;
+ c = utf8_char_int (string);
+
for (i = 0; i < word_chars_count; i++)
{
if (word_chars[i].wc_class != (wctype_t)0)
return num_bytes;
}
-/*
- * Gets wide char from string (first char).
- *
- * Returns the char as "wint_t", WEOF is string was NULL/empty or in case of
- * error.
- */
-
-wint_t
-utf8_wide_char (const char *string)
-{
- int char_size;
- wint_t result;
-
- if (!string || !string[0])
- return WEOF;
-
- char_size = utf8_char_size (string);
- switch (char_size)
- {
- case 1:
- result = (wint_t)string[0];
- break;
- case 2:
- result = ((wint_t)((unsigned char)string[0])) << 8
- | ((wint_t)((unsigned char)string[1]));
- break;
- case 3:
- result = ((wint_t)((unsigned char)string[0])) << 16
- | ((wint_t)((unsigned char)string[1])) << 8
- | ((wint_t)((unsigned char)string[2]));
- break;
- case 4:
- result = ((wint_t)((unsigned char)string[0])) << 24
- | ((wint_t)((unsigned char)string[1])) << 16
- | ((wint_t)((unsigned char)string[2])) << 8
- | ((wint_t)((unsigned char)string[3]));
- break;
- default:
- result = WEOF;
- }
- return result;
-}
-
/*
* Gets size of UTF-8 char (in bytes).
*
if (!string1 || !string2)
return (string1) ? 1 : ((string2) ? -1 : 0);
- wchar1 = utf8_wide_char (string1);
- if ((wchar1 >= 'A') && (wchar1 <= 'Z'))
- wchar1 += ('a' - 'A');
-
- wchar2 = utf8_wide_char (string2);
- if ((wchar2 >= 'A') && (wchar2 <= 'Z'))
- wchar2 += ('a' - 'A');
+ /*
+ * optimization for single-byte chars: only letters A-Z must be converted
+ * to lowercase; this is faster than calling `towlower`
+ */
+ if (!((unsigned char)(string1[0]) & 0x80)
+ && !((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) ? -1 : ((wchar1 == wchar2) ? 0 : 1);
}
int
utf8_charcasecmp_range (const char *string1, const char *string2, int range)
{
- wint_t wchar1, wchar2;
+ wchar_t wchar1, wchar2;
if (!string1 || !string2)
return (string1) ? 1 : ((string2) ? -1 : 0);
- wchar1 = utf8_wide_char (string1);
- if ((wchar1 >= (wint_t)'A') && (wchar1 < (wint_t)('A' + range)))
+ wchar1 = utf8_char_int (string1);
+ if ((wchar1 >= (wchar_t)'A') && (wchar1 < (wchar_t)('A' + range)))
wchar1 += ('a' - 'A');
- wchar2 = utf8_wide_char (string2);
- if ((wchar2 >= (wint_t)'A') && (wchar2 < (wint_t)('A' + range)))
+ wchar2 = utf8_char_int (string2);
+ if ((wchar2 >= (wchar_t)'A') && (wchar2 < (wchar_t)('A' + range)))
wchar2 += ('a' - 'A');
return (wchar1 < wchar2) ? -1 : ((wchar1 == wchar2) ? 0 : 1);
extern const char *utf8_next_char (const char *string);
extern int utf8_char_int (const char *string);
extern int utf8_int_string (unsigned int unicode_value, char *string);
-extern wint_t utf8_wide_char (const char *string);
extern int utf8_char_size (const char *string);
extern int utf8_strlen (const char *string);
extern int utf8_strnlen (const char *string, int bytes);
/* test case conversion: to lower case */
WEE_CHECK_EVAL("", "${lower:}");
WEE_CHECK_EVAL("this is a test", "${lower:This is a TEST}");
- WEE_CHECK_EVAL("testÃ\89 testé", "${lower:TESTÉ Testé}");
+ WEE_CHECK_EVAL("testé testé", "${lower:TESTÉ Testé}");
/* test case conversion: to upper case */
WEE_CHECK_EVAL("", "${upper:}");
WEE_CHECK_EVAL("THIS IS A TEST", "${upper:This is a TEST}");
- WEE_CHECK_EVAL("TESTÃ\89 TESTé", "${upper:TESTÉ Testé}");
+ WEE_CHECK_EVAL("TESTÃ\89 TESTÃ\89", "${upper:TESTÉ Testé}");
/* test hidden chars */
WEE_CHECK_EVAL("", "${hide:invalid}");
WEE_TEST_STR(NULL, string_tolower (NULL));
WEE_TEST_STR("", string_tolower (""));
- WEE_TEST_STR("abcd_É", string_tolower ("ABCD_É"));
- 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 ("[⛄]"));
}
WEE_TEST_STR(NULL, string_tolower (NULL));
WEE_TEST_STR("", string_toupper (""));
- WEE_TEST_STR("ABCD_é", string_toupper ("abcd_é"));
- 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 ("[⛄]"));
}
STRCMP_EQUAL(UNICODE_CJK_YELLOW, result);
LONGS_EQUAL(4, utf8_int_string (0x24b62, result));
STRCMP_EQUAL(UNICODE_HAN_CHAR, result);
-
- /* get wide char */
- LONGS_EQUAL(WEOF, utf8_wide_char (NULL));
- LONGS_EQUAL(WEOF, utf8_wide_char (""));
- LONGS_EQUAL(65, utf8_wide_char ("A"));
- LONGS_EQUAL(0xc3ab, utf8_wide_char ("ë"));
- LONGS_EQUAL(0xe282ac, utf8_wide_char ("€"));
- LONGS_EQUAL(0xe2bba9, utf8_wide_char (UNICODE_CJK_YELLOW));
- LONGS_EQUAL(0xf0a4ada2, utf8_wide_char (UNICODE_HAN_CHAR));
}
/*