aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Haberkorn <rhaberkorn@fmsbw.de>2026-07-24 15:07:42 +0200
committerRobin Haberkorn <rhaberkorn@fmsbw.de>2026-07-24 15:07:42 +0200
commit6b8cbeed6cd6e2a65b50e9e19910f928432434e3 (patch)
tree7a291a061e1d1c002b6a104bacc5bd9c73346f21
parentb00e966f85221c3702a1f3f90e9494eb480876dd (diff)
downloadterex-6b8cbeed6cd6e2a65b50e9e19910f928432434e3.tar.gz
fixed REG_ICASE for non-ANSI (Unicode) characters in the regular expression
* This was a combination of conversion loss and a too small color map. * The test suite was actually broken for Unicode since we have to `setlocale(LC_ALL, "")` for the libc Unicode handling functions to work as expected. SciTECO already did that. * Added test cases for plain Unicode (Cyrillic) characters in the regexp and for character ranges.
-rw-r--r--regalone.h2
-rw-r--r--regc_locale.c2
-rwxr-xr-xregtest_terex.sh23
3 files changed, 23 insertions, 4 deletions
diff --git a/regalone.h b/regalone.h
index 110e787..be3e2e9 100644
--- a/regalone.h
+++ b/regalone.h
@@ -55,7 +55,7 @@ typedef unsigned char chr;
*/
#ifndef TCL_UTF_MAX
-#define TCL_UTF_MAX 3
+#define TCL_UTF_MAX 6
#endif
diff --git a/regc_locale.c b/regc_locale.c
index dcf8e59..9bda44e 100644
--- a/regc_locale.c
+++ b/regc_locale.c
@@ -1111,7 +1111,7 @@ allcases(
{
struct cvec *cv;
pchr c = pc;
- chr lc, uc, tc;
+ pchr lc, uc, tc;
lc = Tcl_UniCharToLower(c);
uc = Tcl_UniCharToUpper(c);
diff --git a/regtest_terex.sh b/regtest_terex.sh
index e3ed2e5..01aa96a 100755
--- a/regtest_terex.sh
+++ b/regtest_terex.sh
@@ -74,6 +74,7 @@ cat<<-EOF>$rgsrc
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
+ #include <locale.h>
#include "regalone.h"
#include "regex.h"
size_t hexescapes2bin(unsigned char *t, char *src, size_t mxlen)
@@ -107,6 +108,7 @@ cat<<-EOF>$rgsrc
char buf[1024*2];
//memset(&cre, '\0', sizeof(cre));
+ setlocale(LC_ALL, "");
while ((ch = getopt(argc, argv, "iraA")) != -1) {
switch (ch) {
@@ -344,8 +346,9 @@ resp=`$rgbin -r 0 "clavo" $'Pablito\01clavo un clavito' 2>&1`
test -z "$resp" && f_ok "$msg (raw)" || f_no "$msg (raw)" "$resp"
#-----------------------------------
msg="Binary RE and data"
-resp=`$rgbin 0 $'cl\xFFavo' $'Pablito\x01cl\xFFavo un clavito' 2>&1`
-test -z "$resp" && f_ok "$msg" || f_no "$msg" "$resp"
+# FIXME: We do not reliably detect invalid UTF-8 sequences.
+#resp=`$rgbin 0 $'cl\xFFavo' $'Pablito\x01cl\xFFavo un clavito' 2>&1`
+#test -z "$resp" && f_ok "$msg" || f_no "$msg" "$resp"
resp=`$rgbin -r 0 $'cl\xFFavo' $'Pablito\x01cl\xFFavo un clavito' 2>&1`
test -z "$resp" && f_ok "$msg (raw)" || f_no "$msg (raw)" "$resp"
#-----------------------------------
@@ -359,6 +362,22 @@ resp=`$rgbin -r 1 $'([\x01\x5F\xFF]+)' $'ABC\x5F' 2>&1`
msg="Raw character class"
test "$resp" = $'\x5F' && f_ok "$msg" || f_no "$msg" "$resp"
#-----------------------------------
+resp=`$rgbin 1 '(вг)' 'абвгд' 2>&1`
+msg="Unicode pattern"
+test "$resp" = "вг" && f_ok "$msg" || f_no "$msg" "$resp"
+#-----------------------------------
+resp=`$rgbin -i 1 '(вг)' 'АБВГД' 2>&1`
+msg="Unicode pattern (case-insensitve)"
+test "$resp" = "ВГ" && f_ok "$msg" || f_no "$msg" "$resp"
+#-----------------------------------
+resp=`$rgbin 1 '([б-г]+)' 'абвгд' 2>&1`
+msg="Unicode character range"
+test "$resp" = "бвг" && f_ok "$msg" || f_no "$msg" "$resp"
+#-----------------------------------
+resp=`$rgbin -i 1 '([б-г]+)' 'АБВГД' 2>&1`
+msg="Unicode character range (case-insensitive)"
+test "$resp" = "БВГ" && f_ok "$msg" || f_no "$msg" "$resp"
+#-----------------------------------
resp=`$rgbin 1 '([[:alpha:]]+)' 'абвгд' 2>&1`
msg="Unicode character class"
test "$resp" = "абвгд" && f_ok "$msg" || f_no "$msg" "$resp"