]> gitweb.factorcode.org Git - factor.git/blob - basis/core-foundation/strings/strings.factor
4c7e9ba26158869f2307e64e64ead1468c565ac2
[factor.git] / basis / core-foundation / strings / strings.factor
1 ! Copyright (C) 2008, 2009 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: alien.c-types alien.syntax alien.strings io.encodings.string
4 kernel sequences byte-arrays io.encodings.utf8 math core-foundation
5 core-foundation.arrays destructors parser fry alien words ;
6 IN: core-foundation.strings
7
8 TYPEDEF: void* CFStringRef
9
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
25
26 FUNCTION: CFStringRef CFStringCreateWithBytes (
27     CFAllocatorRef alloc,
28     UInt8* bytes,
29     CFIndex numBytes,
30     CFStringEncoding encoding,
31     Boolean isExternalRepresentation
32 ) ;
33
34 FUNCTION: CFIndex CFStringGetLength ( CFStringRef theString ) ;
35
36 FUNCTION: void CFStringGetCharacters ( void* theString, CFIndex start, CFIndex length, void* buffer ) ;
37
38 FUNCTION: Boolean CFStringGetCString (
39     CFStringRef theString,
40     UInt8* buffer,
41     CFIndex bufferSize,
42     CFStringEncoding encoding
43 ) ;
44
45 FUNCTION: CFIndex CFStringGetBytes (
46    CFStringRef theString,
47    CFRange range,
48    CFStringEncoding encoding,
49    UInt8 lossByte,
50    Boolean isExternalRepresentation,
51    UInt8* buffer,
52    CFIndex maxBufLen,
53    CFIndex* usedBufLen
54 ) ;
55
56 FUNCTION: CFStringRef CFStringCreateWithCString (
57     CFAllocatorRef alloc,
58     UInt8* cStr,
59     CFStringEncoding encoding
60 ) ;
61
62 : prepare-CFString ( string -- byte-array )
63     [
64         dup HEX: 10ffff >
65         [ drop HEX: fffd ] when
66     ] map utf8 encode ;
67
68 : <CFString> ( string -- alien )
69     [ f ] dip
70     prepare-CFString dup length
71     kCFStringEncodingUTF8 f
72     CFStringCreateWithBytes
73     [ "CFStringCreateWithBytes failed" throw ] unless* ;
74
75 : CF>string ( alien -- string )
76     dup CFStringGetLength
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 ;
80
81 : CF>string-array ( alien -- seq )
82     CF>array [ CF>string ] map ;
83
84 : <CFStringArray> ( seq -- alien )
85     [ [ <CFString> &CFRelease ] map <CFArray> ] with-destructors ;
86
87 SYNTAX: CFSTRING: 
88     CREATE scan-object 
89     [ drop ] [ '[ _ [ _ <CFString> ] initialize-alien ] ] 2bi
90     (( -- alien )) define-declared ;