1 ! Copyright (C) 2008, 2009 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: alien.syntax alien.strings io.encodings.string kernel
4 sequences byte-arrays io.encodings.utf8 math core-foundation
5 core-foundation.arrays destructors parser fry alien words ;
6 IN: core-foundation.strings
8 TYPEDEF: void* CFStringRef
10 TYPEDEF: int CFStringEncoding
11 CONSTANT: kCFStringEncodingMacRoman HEX: 0
12 CONSTANT: kCFStringEncodingWindowsLatin1 HEX: 0500
13 CONSTANT: kCFStringEncodingISOLatin1 HEX: 0201
14 CONSTANT: kCFStringEncodingNextStepLatin HEX: 0B01
15 CONSTANT: kCFStringEncodingASCII HEX: 0600
16 CONSTANT: kCFStringEncodingUnicode HEX: 0100
17 CONSTANT: kCFStringEncodingUTF8 HEX: 08000100
18 CONSTANT: kCFStringEncodingNonLossyASCII HEX: 0BFF
19 CONSTANT: kCFStringEncodingUTF16 HEX: 0100
20 CONSTANT: kCFStringEncodingUTF16BE HEX: 10000100
21 CONSTANT: kCFStringEncodingUTF16LE HEX: 14000100
22 CONSTANT: kCFStringEncodingUTF32 HEX: 0c000100
23 CONSTANT: kCFStringEncodingUTF32BE HEX: 18000100
24 CONSTANT: kCFStringEncodingUTF32LE HEX: 1c000100
26 FUNCTION: CFStringRef CFStringCreateWithBytes (
30 CFStringEncoding encoding,
31 Boolean isExternalRepresentation
34 FUNCTION: CFIndex CFStringGetLength ( CFStringRef theString ) ;
36 FUNCTION: void CFStringGetCharacters ( void* theString, CFIndex start, CFIndex length, void* buffer ) ;
38 FUNCTION: Boolean CFStringGetCString (
39 CFStringRef theString,
42 CFStringEncoding encoding
45 FUNCTION: CFIndex CFStringGetBytes (
46 CFStringRef theString,
48 CFStringEncoding encoding,
50 Boolean isExternalRepresentation,
56 FUNCTION: CFStringRef CFStringCreateWithCString (
59 CFStringEncoding encoding
62 : prepare-CFString ( string -- byte-array )
65 [ drop HEX: fffd ] when
68 : <CFString> ( string -- alien )
70 prepare-CFString dup length
71 kCFStringEncodingUTF8 f
72 CFStringCreateWithBytes
73 [ "CFStringCreateWithBytes failed" throw ] unless* ;
75 : CF>string ( alien -- string )
77 [ 0 swap <CFRange> kCFStringEncodingUTF8 0 f ] keep
78 4 * 1 + <byte-array> [ dup length 0 <CFIndex> [ CFStringGetBytes drop ] keep ] keep
79 swap *CFIndex head-slice utf8 decode ;
81 : CF>string-array ( alien -- seq )
82 CF>array [ CF>string ] map ;
84 : <CFStringArray> ( seq -- alien )
85 [ [ <CFString> &CFRelease ] map <CFArray> ] with-destructors ;
89 [ drop ] [ '[ _ [ _ <CFString> ] initialize-alien ] ] 2bi
90 (( -- alien )) define-declared ;