1 ! Copyright (C) 2008, 2010 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: alien.c-types alien.data alien.syntax alien.strings
4 io.encodings.string kernel sequences byte-arrays
5 io.encodings.utf8 math core-foundation core-foundation.arrays
6 destructors parser fry alien words ;
7 IN: core-foundation.strings
9 TYPEDEF: void* CFStringRef
11 TYPEDEF: int CFStringEncoding
12 CONSTANT: kCFStringEncodingMacRoman HEX: 0
13 CONSTANT: kCFStringEncodingWindowsLatin1 HEX: 0500
14 CONSTANT: kCFStringEncodingISOLatin1 HEX: 0201
15 CONSTANT: kCFStringEncodingNextStepLatin HEX: 0B01
16 CONSTANT: kCFStringEncodingASCII HEX: 0600
17 CONSTANT: kCFStringEncodingUnicode HEX: 0100
18 CONSTANT: kCFStringEncodingUTF8 HEX: 08000100
19 CONSTANT: kCFStringEncodingNonLossyASCII HEX: 0BFF
20 CONSTANT: kCFStringEncodingUTF16 HEX: 0100
21 CONSTANT: kCFStringEncodingUTF16BE HEX: 10000100
22 CONSTANT: kCFStringEncodingUTF16LE HEX: 14000100
23 CONSTANT: kCFStringEncodingUTF32 HEX: 0c000100
24 CONSTANT: kCFStringEncodingUTF32BE HEX: 18000100
25 CONSTANT: kCFStringEncodingUTF32LE HEX: 1c000100
27 FUNCTION: CFStringRef CFStringCreateWithBytes (
31 CFStringEncoding encoding,
32 Boolean isExternalRepresentation
35 FUNCTION: CFIndex CFStringGetLength ( CFStringRef theString ) ;
37 FUNCTION: void CFStringGetCharacters ( void* theString, CFIndex start, CFIndex length, void* buffer ) ;
39 FUNCTION: Boolean CFStringGetCString (
40 CFStringRef theString,
43 CFStringEncoding encoding
46 FUNCTION: CFIndex CFStringGetBytes (
47 CFStringRef theString,
49 CFStringEncoding encoding,
51 Boolean isExternalRepresentation,
57 FUNCTION: CFStringRef CFStringCreateWithCString (
60 CFStringEncoding encoding
63 : prepare-CFString ( string -- byte-array )
66 [ drop HEX: fffd ] when
69 : <CFString> ( string -- alien )
71 prepare-CFString dup length
72 kCFStringEncodingUTF8 f
73 CFStringCreateWithBytes
74 [ "CFStringCreateWithBytes failed" throw ] unless* ;
76 : CF>string ( alien -- string )
78 [ 0 swap <CFRange> kCFStringEncodingUTF8 0 f ] keep
79 4 * 1 + <byte-array> [
81 { CFIndex } [ CFStringGetBytes drop ] [ ]
84 swap head-slice utf8 decode ;
86 : CF>string-array ( alien -- seq )
87 CF>array [ CF>string ] map ;
89 : <CFStringArray> ( seq -- alien )
90 [ [ <CFString> &CFRelease ] map <CFArray> ] with-destructors ;
94 [ drop ] [ '[ _ [ _ <CFString> ] initialize-alien ] ] 2bi
95 (( -- alien )) define-declared ;