From d063af761e1c7617ae788456954a986d91dde600 Mon Sep 17 00:00:00 2001 From: Oldes Date: Sat, 27 May 2023 15:08:55 +0200 Subject: [PATCH] FIX: corrupted output from `trace` on Posix systems resolves: https://github.com/Oldes/Rebol-issues/issues/1322 --- src/core/s-unicode.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/core/s-unicode.c b/src/core/s-unicode.c index c9a04d0893..5a510ea261 100644 --- a/src/core/s-unicode.c +++ b/src/core/s-unicode.c @@ -783,7 +783,7 @@ Boolean isLegalUTF8Sequence(const UTF8 *source, const UTF8 *sourceEnd) { /*********************************************************************** ** -*/ REBCNT Encode_UTF8(REBYTE *dst, REBINT max, void *src, REBCNT *len, REBFLG uni, REBFLG ccr) +*/ REBCNT Encode_UTF8(REBYTE *dst, REBINT max, void *src, REBLEN *len, REBFLG uni, REBFLG ccr) /* ** Encode the unicode into UTF8 byte string. ** @@ -801,11 +801,17 @@ Boolean isLegalUTF8Sequence(const UTF8 *source, const UTF8 *sourceEnd) { REBYTE *bs = dst; // save start REBYTE *bp = (REBYTE*)src; REBUNI *up = (REBUNI*)src; - REBCNT cnt; + REBLEN cnt; if (len) cnt = *len; else { - cnt = (REBCNT)(uni ? wcslen((const wchar_t*)bp) : LEN_BYTES((REBYTE*)bp)); + if (uni) { + // not using wcslen, because on some systems wchar_t has 4 bytes! + cnt = 0; + while (*up++ != 0 && cnt < max) cnt++; + up = (REBUNI*)src; + } else + cnt = LEN_BYTES(bp); } for (; max > 0 && cnt > 0; cnt--) { @@ -833,7 +839,6 @@ Boolean isLegalUTF8Sequence(const UTF8 *source, const UTF8 *sourceEnd) { } if (len) *len = dst - bs; - return uni ? up - (REBUNI*)src : bp - (REBYTE*)src; }