-! Copyright (C) 2008 Slava Pestov.
+! Copyright (C) 2008, 2010 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
-USING: alien.syntax alien.strings kernel sequences byte-arrays
-io.encodings.utf8 math core-foundation core-foundation.arrays ;
+USING: alien.c-types alien.data alien.syntax alien.strings
+io.encodings.string kernel sequences byte-arrays
+io.encodings.utf8 math core-foundation core-foundation.arrays
+core-foundation.data destructors parser fry alien words ;
IN: core-foundation.strings
TYPEDEF: void* CFStringRef
TYPEDEF: int CFStringEncoding
-CONSTANT: kCFStringEncodingMacRoman HEX: 0
-CONSTANT: kCFStringEncodingWindowsLatin1 HEX: 0500
-CONSTANT: kCFStringEncodingISOLatin1 HEX: 0201
-CONSTANT: kCFStringEncodingNextStepLatin HEX: 0B01
-CONSTANT: kCFStringEncodingASCII HEX: 0600
-CONSTANT: kCFStringEncodingUnicode HEX: 0100
-CONSTANT: kCFStringEncodingUTF8 HEX: 08000100
-CONSTANT: kCFStringEncodingNonLossyASCII HEX: 0BFF
-CONSTANT: kCFStringEncodingUTF16 HEX: 0100
-CONSTANT: kCFStringEncodingUTF16BE HEX: 10000100
-CONSTANT: kCFStringEncodingUTF16LE HEX: 14000100
-CONSTANT: kCFStringEncodingUTF32 HEX: 0c000100
-CONSTANT: kCFStringEncodingUTF32BE HEX: 18000100
-CONSTANT: kCFStringEncodingUTF32LE HEX: 1c000100
+CONSTANT: kCFStringEncodingMacRoman 0x0
+CONSTANT: kCFStringEncodingWindowsLatin1 0x0500
+CONSTANT: kCFStringEncodingISOLatin1 0x0201
+CONSTANT: kCFStringEncodingNextStepLatin 0x0B01
+CONSTANT: kCFStringEncodingASCII 0x0600
+CONSTANT: kCFStringEncodingUnicode 0x0100
+CONSTANT: kCFStringEncodingUTF8 0x08000100
+CONSTANT: kCFStringEncodingNonLossyASCII 0x0BFF
+CONSTANT: kCFStringEncodingUTF16 0x0100
+CONSTANT: kCFStringEncodingUTF16BE 0x10000100
+CONSTANT: kCFStringEncodingUTF16LE 0x14000100
+CONSTANT: kCFStringEncodingUTF32 0x0c000100
+CONSTANT: kCFStringEncodingUTF32BE 0x18000100
+CONSTANT: kCFStringEncodingUTF32LE 0x1c000100
FUNCTION: CFStringRef CFStringCreateWithBytes (
CFAllocatorRef alloc,
FUNCTION: Boolean CFStringGetCString (
CFStringRef theString,
- char* buffer,
+ UInt8* buffer,
CFIndex bufferSize,
CFStringEncoding encoding
) ;
+FUNCTION: CFIndex CFStringGetBytes (
+ CFStringRef theString,
+ CFRange range,
+ CFStringEncoding encoding,
+ UInt8 lossByte,
+ Boolean isExternalRepresentation,
+ UInt8* buffer,
+ CFIndex maxBufLen,
+ CFIndex* usedBufLen
+) ;
+
FUNCTION: CFStringRef CFStringCreateWithCString (
CFAllocatorRef alloc,
- char* cStr,
+ UInt8* cStr,
CFStringEncoding encoding
) ;
+FUNCTION: CFStringRef CFCopyDescription ( CFTypeRef cf ) ;
+FUNCTION: CFStringRef CFCopyTypeIDDescription ( CFTypeID type_id ) ;
+
+: prepare-CFString ( string -- byte-array )
+ [
+ dup 0x10ffff >
+ [ drop 0xfffd ] when
+ ] map utf8 encode ;
+
: <CFString> ( string -- alien )
- f swap utf8 string>alien kCFStringEncodingUTF8 CFStringCreateWithCString
- [ "CFStringCreateWithCString failed" throw ] unless* ;
+ [ f ] dip
+ prepare-CFString dup length
+ kCFStringEncodingUTF8 f
+ CFStringCreateWithBytes
+ [ "CFStringCreateWithBytes failed" throw ] unless* ;
: CF>string ( alien -- string )
- dup CFStringGetLength 4 * 1 + <byte-array> [
+ dup CFStringGetLength
+ [ 0 swap <CFRange> kCFStringEncodingUTF8 0 f ] keep
+ 4 * 1 + <byte-array> [
dup length
- kCFStringEncodingUTF8
- CFStringGetCString
- [ "CFStringGetCString failed" throw ] unless
- ] keep utf8 alien>string ;
+ { CFIndex } [ CFStringGetBytes drop ] with-out-parameters
+ ] keep
+ swap head-slice utf8 decode ;
: CF>string-array ( alien -- seq )
CF>array [ CF>string ] map ;
: <CFStringArray> ( seq -- alien )
- [ <CFString> ] map [ <CFArray> ] [ [ CFRelease ] each ] bi ;
+ [ [ <CFString> &CFRelease ] map <CFArray> ] with-destructors ;
+
+: CF>description ( cf -- description )
+ [ CFCopyDescription &CFRelease CF>string ] with-destructors ;
+: CFType>description ( cf -- description )
+ CFGetTypeID [ CFCopyTypeIDDescription &CFRelease CF>string ] with-destructors ;
+
+SYNTAX: CFSTRING:
+ scan-new-word scan-object
+ [ drop ] [ '[ _ [ _ <CFString> ] initialize-alien ] ] 2bi
+ ( -- alien ) define-declared ;