From a4362512f7ca766e22f1054928e445fe83dbb014 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Mon, 2 Feb 2009 13:44:44 -0600 Subject: [PATCH] doesn't bomb if string contains invalid codepoints > 0x10ffff --- basis/core-foundation/strings/strings-tests.factor | 8 ++++++-- basis/core-foundation/strings/strings.factor | 13 +++++++++++-- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/basis/core-foundation/strings/strings-tests.factor b/basis/core-foundation/strings/strings-tests.factor index 932da8530e..1c52752b21 100644 --- a/basis/core-foundation/strings/strings-tests.factor +++ b/basis/core-foundation/strings/strings-tests.factor @@ -1,6 +1,7 @@ ! Copyright (C) 2008 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. -USING: core-foundation.strings core-foundation tools.test kernel ; +USING: core-foundation.strings core-foundation tools.test kernel +strings ; IN: core-foundation [ ] [ "Hello" CFRelease ] unit-test @@ -8,4 +9,7 @@ IN: core-foundation [ "Hello\u003456" ] [ "Hello\u003456" [ CF>string ] [ CFRelease ] bi ] unit-test [ "Hello\u013456" ] [ "Hello\u013456" [ CF>string ] [ CFRelease ] bi ] unit-test [ ] [ "\0" CFRelease ] unit-test -[ "\0" ] [ "\0" [ CF>string ] [ CFRelease ] bi ] unit-test \ No newline at end of file +[ "\0" ] [ "\0" [ CF>string ] [ CFRelease ] bi ] unit-test + +! This shouldn't fail +[ ] [ { HEX: 123456 } >string CFRelease ] unit-test \ No newline at end of file diff --git a/basis/core-foundation/strings/strings.factor b/basis/core-foundation/strings/strings.factor index e5eef4299b..21f3d7efd4 100644 --- a/basis/core-foundation/strings/strings.factor +++ b/basis/core-foundation/strings/strings.factor @@ -2,7 +2,7 @@ ! See http://factorcode.org/license.txt for BSD license. USING: alien.syntax alien.strings io.encodings.string kernel sequences byte-arrays io.encodings.utf8 math core-foundation -core-foundation.arrays destructors ; +core-foundation.arrays destructors unicode.data ; IN: core-foundation.strings TYPEDEF: void* CFStringRef @@ -59,8 +59,17 @@ FUNCTION: CFStringRef CFStringCreateWithCString ( CFStringEncoding encoding ) ; +: prepare-CFString ( string -- byte-array ) + [ + dup HEX: 10ffff > + [ drop CHAR: replacement-character ] when + ] map utf8 encode ; + : ( string -- alien ) - [ f ] dip utf8 encode dup length kCFStringEncodingUTF8 f CFStringCreateWithBytes + [ f ] dip + prepare-CFString dup length + kCFStringEncodingUTF8 f + CFStringCreateWithBytes [ "CFStringCreateWithBytes failed" throw ] unless* ; : CF>string ( alien -- string )