86 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Factor
		
	
	
			
		
		
	
	
			86 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Factor
		
	
	
! Copyright (C) 2008, 2009 Slava Pestov.
 | 
						|
! 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 unicode.data ;
 | 
						|
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
 | 
						|
 | 
						|
FUNCTION: CFStringRef CFStringCreateWithBytes (
 | 
						|
    CFAllocatorRef alloc,
 | 
						|
    UInt8* bytes,
 | 
						|
    CFIndex numBytes,
 | 
						|
    CFStringEncoding encoding,
 | 
						|
    Boolean isExternalRepresentation
 | 
						|
) ;
 | 
						|
 | 
						|
FUNCTION: CFIndex CFStringGetLength ( CFStringRef theString ) ;
 | 
						|
 | 
						|
FUNCTION: void CFStringGetCharacters ( void* theString, CFIndex start, CFIndex length, void* buffer ) ;
 | 
						|
 | 
						|
FUNCTION: Boolean CFStringGetCString (
 | 
						|
    CFStringRef theString,
 | 
						|
    char* 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,
 | 
						|
    CFStringEncoding encoding
 | 
						|
) ;
 | 
						|
 | 
						|
: prepare-CFString ( string -- byte-array )
 | 
						|
    [
 | 
						|
        dup HEX: 10ffff >
 | 
						|
        [ drop CHAR: replacement-character ] when
 | 
						|
    ] map utf8 encode ;
 | 
						|
 | 
						|
: <CFString> ( string -- alien )
 | 
						|
    [ f ] dip
 | 
						|
    prepare-CFString dup length
 | 
						|
    kCFStringEncodingUTF8 f
 | 
						|
    CFStringCreateWithBytes
 | 
						|
    [ "CFStringCreateWithBytes failed" throw ] unless* ;
 | 
						|
 | 
						|
: CF>string ( alien -- string )
 | 
						|
    dup CFStringGetLength
 | 
						|
    [ 0 swap <CFRange> kCFStringEncodingUTF8 0 f ] keep
 | 
						|
    4 * 1 + <byte-array> [ dup length 0 <CFIndex> [ CFStringGetBytes drop ] keep ] keep
 | 
						|
    swap *CFIndex head-slice utf8 decode ;
 | 
						|
 | 
						|
: CF>string-array ( alien -- seq )
 | 
						|
    CF>array [ CF>string ] map ;
 | 
						|
 | 
						|
: <CFStringArray> ( seq -- alien )
 | 
						|
    [ [ <CFString> &CFRelease ] map <CFArray> ] with-destructors ;
 |