<CFString> doesn't bomb if string contains invalid codepoints > 0x10ffff

db4
Slava Pestov 2009-02-02 13:44:44 -06:00
parent 669548e62e
commit a4362512f7
2 changed files with 17 additions and 4 deletions

View File

@ -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" <CFString> CFRelease ] unit-test
@ -9,3 +10,6 @@ IN: core-foundation
[ "Hello\u013456" ] [ "Hello\u013456" <CFString> [ CF>string ] [ CFRelease ] bi ] unit-test
[ ] [ "\0" <CFString> CFRelease ] unit-test
[ "\0" ] [ "\0" <CFString> [ CF>string ] [ CFRelease ] bi ] unit-test
! This shouldn't fail
[ ] [ { HEX: 123456 } >string <CFString> CFRelease ] unit-test

View File

@ -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 ;
: <CFString> ( 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 )