From db4537c76c0e4c5e7c3b9c1c00921ed219543ff5 Mon Sep 17 00:00:00 2001 From: Oldes Date: Tue, 31 Mar 2020 13:14:38 +0200 Subject: [PATCH] FIX: length? of any-word! fixes: https://github.com/Oldes/Rebol-issues/issues/1740 fixes: https://github.com/Oldes/Rebol-issues/issues/2224 --- src/core/s-unicode.c | 14 ++++++++++++++ src/core/t-word.c | 4 ++-- src/tests/run-tests.r3 | 1 + src/tests/units/word-test.r3 | 25 +++++++++++++++++++++++++ 4 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 src/tests/units/word-test.r3 diff --git a/src/core/s-unicode.c b/src/core/s-unicode.c index a577104ac7..821d880623 100644 --- a/src/core/s-unicode.c +++ b/src/core/s-unicode.c @@ -972,6 +972,20 @@ ConversionResult ConvertUTF8toUTF32 ( return dst; } +/*********************************************************************** +** +*/ REBCNT Length_As_UTF8_Code_Points(REBYTE *src) +/* +** Returns number of code points encoded in UTF-8. +** +***********************************************************************/ +{ + REBCNT size = 0; + while (*src) { + size += (*src++ & 0xC0) != 0x80; + } + return size; +} /*********************************************************************** ** diff --git a/src/core/t-word.c b/src/core/t-word.c index f3673ef6e2..e862e64960 100644 --- a/src/core/t-word.c +++ b/src/core/t-word.c @@ -84,8 +84,8 @@ switch (action) { case A_LENGTHQ: - diff = (REBINT)LEN_BYTES(Get_Sym_Name(VAL_WORD_SYM(val))); - if (type != REB_WORD) diff++; + diff = (REBINT)Length_As_UTF8_Code_Points(Get_Sym_Name(VAL_WORD_SYM(val))); + //if (type != REB_WORD) diff++; // in case that the _decoration_ should be also counted (#abc :abc abc: 'abc) DS_Ret_Int(diff); break; diff --git a/src/tests/run-tests.r3 b/src/tests/run-tests.r3 index 3186868d6d..9c22893ffd 100644 --- a/src/tests/run-tests.r3 +++ b/src/tests/run-tests.r3 @@ -40,6 +40,7 @@ dt [ ;- delta time wrap load %units/tuple-test.r3 wrap load %units/typeset-test.r3 wrap load %units/vector-test.r3 + wrap load %units/word-test.r3 ;- cryptography tests: wrap load %units/aes-test.r3 wrap load %units/chacha20-test.r3 diff --git a/src/tests/units/word-test.r3 b/src/tests/units/word-test.r3 new file mode 100644 index 0000000000..7977811925 --- /dev/null +++ b/src/tests/units/word-test.r3 @@ -0,0 +1,25 @@ +Rebol [ + Title: "Rebol3 word test script" + Author: "Oldes, Peter W A Wood" + File: %word-test.r3 + Tabs: 4 + Needs: [%../quick-test-module.r3] +] + +~~~start-file~~~ "WORD!" + +===start-group=== "word" + --test-- "Length? any-word!" + ;@@ https://github.com/Oldes/Rebol-issues/issues/1740 + ;@@ https://github.com/Oldes/Rebol-issues/issues/2224 + --assert 1 = length? #a + --assert 1 = length? 'a + --assert 1 = length? quote 'a + --assert 2 = length? #ša + --assert 2 = length? quote 'ša + --assert 1 = length? to-word to-string to-char 126 + --assert 1 = length? to-word to-string to-char 128 + +===end-group=== + +~~~end-file~~~ \ No newline at end of file