112 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Factor
		
	
	
		
		
			
		
	
	
			112 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Factor
		
	
	
| 
								 | 
							
								! Copyright (C) 2008 Slava Pestov.
							 | 
						||
| 
								 | 
							
								! See http://factorcode.org/license.txt for BSD license.
							 | 
						||
| 
								 | 
							
								USING: arrays sequences kernel accessors math alien.accessors
							 | 
						||
| 
								 | 
							
								alien.c-types byte-arrays words io io.encodings
							 | 
						||
| 
								 | 
							
								io.streams.byte-array io.streams.memory io.encodings.utf8
							 | 
						||
| 
								 | 
							
								io.encodings.utf16 system alien strings cpu.architecture ;
							 | 
						||
| 
								 | 
							
								IN: alien.strings
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								GENERIC# alien>string 1 ( c-ptr encoding -- string/f )
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								M: c-ptr alien>string
							 | 
						||
| 
								 | 
							
								    >r <memory-stream> r> <decoder>
							 | 
						||
| 
								 | 
							
								    "\0" swap stream-read-until drop ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								M: f alien>string
							 | 
						||
| 
								 | 
							
								    drop ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								ERROR: invalid-c-string string ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: check-string ( string -- )
							 | 
						||
| 
								 | 
							
								    0 over memq? [ invalid-c-string ] [ drop ] if ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								GENERIC# string>alien 1 ( string encoding -- byte-array )
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								M: c-ptr string>alien drop ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								M: string string>alien
							 | 
						||
| 
								 | 
							
								    over check-string
							 | 
						||
| 
								 | 
							
								    <byte-writer>
							 | 
						||
| 
								 | 
							
								    [ stream-write ]
							 | 
						||
| 
								 | 
							
								    [ 0 swap stream-write1 ]
							 | 
						||
| 
								 | 
							
								    [ stream>> >byte-array ]
							 | 
						||
| 
								 | 
							
								    tri ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: malloc-string ( string encoding -- alien )
							 | 
						||
| 
								 | 
							
								    string>alien malloc-byte-array ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								PREDICATE: string-type < pair
							 | 
						||
| 
								 | 
							
								    first2 [ "char*" = ] [ word? ] bi* and ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								M: string-type c-type ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								M: string-type heap-size
							 | 
						||
| 
								 | 
							
								    drop "void*" heap-size ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								M: string-type c-type-align
							 | 
						||
| 
								 | 
							
								    drop "void*" c-type-align ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								M: string-type c-type-stack-align?
							 | 
						||
| 
								 | 
							
								    drop "void*" c-type-stack-align? ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								M: string-type unbox-parameter
							 | 
						||
| 
								 | 
							
								    drop "void*" unbox-parameter ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								M: string-type unbox-return
							 | 
						||
| 
								 | 
							
								    drop "void*" unbox-return ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								M: string-type box-parameter
							 | 
						||
| 
								 | 
							
								    drop "void*" box-parameter ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								M: string-type box-return
							 | 
						||
| 
								 | 
							
								    drop "void*" box-return ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								M: string-type stack-size
							 | 
						||
| 
								 | 
							
								    drop "void*" stack-size ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								M: string-type c-type-reg-class
							 | 
						||
| 
								 | 
							
								    drop int-regs ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								M: string-type c-type-boxer
							 | 
						||
| 
								 | 
							
								    drop "void*" c-type-boxer ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								M: string-type c-type-unboxer
							 | 
						||
| 
								 | 
							
								    drop "void*" c-type-unboxer ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								M: string-type c-type-boxer-quot
							 | 
						||
| 
								 | 
							
								    second [ alien>string ] curry [ ] like ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								M: string-type c-type-unboxer-quot
							 | 
						||
| 
								 | 
							
								    second [ string>alien ] curry [ ] like ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								M: string-type c-type-getter
							 | 
						||
| 
								 | 
							
								    drop [ alien-cell ] ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								M: string-type c-type-setter
							 | 
						||
| 
								 | 
							
								    drop [ set-alien-cell ] ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								! Native-order UTF-16
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								SINGLETON: utf16n
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: utf16n ( -- descriptor )
							 | 
						||
| 
								 | 
							
								    little-endian? utf16le utf16be ? ; foldable
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								M: utf16n <decoder> drop utf16n <decoder> ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								M: utf16n <encoder> drop utf16n <encoder> ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: alien>native-string ( alien -- string )
							 | 
						||
| 
								 | 
							
								    os windows? [ utf16n ] [ utf8 ] if alien>string ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: dll-path ( dll -- string )
							 | 
						||
| 
								 | 
							
								    path>> alien>native-string ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: string>symbol ( str -- alien )
							 | 
						||
| 
								 | 
							
								    [ os wince? [ utf16n ] [ utf8 ] if string>alien ]
							 | 
						||
| 
								 | 
							
								    over string? [ call ] [ map ] if ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								{ "char*" utf8 } "char*" typedef
							 | 
						||
| 
								 | 
							
								{ "char*" utf16n } "wchar_t*" typedef
							 | 
						||
| 
								 | 
							
								"char*" "uchar*" typedef
							 |