| 
									
										
										
										
											2008-04-20 06:15:46 -04:00
										 |  |  | ! 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 | 
					
						
							| 
									
										
										
										
											2008-12-08 19:49:02 -05:00
										 |  |  | io.encodings.utf8 io.streams.byte-array io.streams.memory system | 
					
						
							|  |  |  | alien strings cpu.architecture fry vocabs.loader combinators ;
 | 
					
						
							| 
									
										
										
										
											2008-04-20 06:15:46 -04:00
										 |  |  | IN: alien.strings | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-23 03:46:35 -04:00
										 |  |  | GENERIC# alien>string 1 ( c-ptr encoding -- string/f )
 | 
					
						
							| 
									
										
										
										
											2008-04-20 20:29:58 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | M: c-ptr alien>string | 
					
						
							| 
									
										
										
										
											2008-11-29 14:37:38 -05:00
										 |  |  |     [ <memory-stream> ] [ <decoder> ] bi*
 | 
					
						
							| 
									
										
										
										
											2008-04-20 06:15:46 -04:00
										 |  |  |     "\0" swap stream-read-until drop ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-20 20:29:58 -04:00
										 |  |  | M: f alien>string | 
					
						
							|  |  |  |     drop ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-20 06:15:46 -04:00
										 |  |  | ERROR: invalid-c-string string ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : check-string ( string -- )
 | 
					
						
							|  |  |  |     0 over memq? [ invalid-c-string ] [ drop ] if ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | GENERIC# string>alien 1 ( string encoding -- byte-array )
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-20 23:20:13 -04:00
										 |  |  | M: c-ptr string>alien drop ;
 | 
					
						
							| 
									
										
										
										
											2008-04-20 06:15:46 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 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 ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-29 05:59:29 -05:00
										 |  |  | M: string-type c-type-class | 
					
						
							|  |  |  |     drop object ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-20 06:15:46 -04:00
										 |  |  | 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 | 
					
						
							| 
									
										
										
										
											2008-12-02 01:24:00 -05:00
										 |  |  |     second '[ _ alien>string ] ;
 | 
					
						
							| 
									
										
										
										
											2008-04-20 06:15:46 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | M: string-type c-type-unboxer-quot | 
					
						
							| 
									
										
										
										
											2008-12-02 01:24:00 -05:00
										 |  |  |     second '[ _ string>alien ] ;
 | 
					
						
							| 
									
										
										
										
											2008-04-20 06:15:46 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | M: string-type c-type-getter | 
					
						
							|  |  |  |     drop [ alien-cell ] ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: string-type c-type-setter | 
					
						
							|  |  |  |     drop [ set-alien-cell ] ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-08 19:49:02 -05:00
										 |  |  | HOOK: alien>native-string os ( alien -- string )
 | 
					
						
							| 
									
										
										
										
											2008-04-20 06:15:46 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-08 19:49:02 -05:00
										 |  |  | HOOK: native-string>alien os ( string -- alien )
 | 
					
						
							| 
									
										
										
										
											2008-04-20 06:15:46 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : dll-path ( dll -- string )
 | 
					
						
							| 
									
										
										
										
											2008-06-28 03:36:20 -04:00
										 |  |  |     path>> alien>native-string ;
 | 
					
						
							| 
									
										
										
										
											2008-04-20 06:15:46 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : string>symbol ( str -- alien )
 | 
					
						
							| 
									
										
										
										
											2008-12-08 19:49:02 -05:00
										 |  |  |     dup string?
 | 
					
						
							|  |  |  |     [ native-string>alien ] | 
					
						
							|  |  |  |     [ [ native-string>alien ] map ] if ;
 | 
					
						
							| 
									
										
										
										
											2008-04-20 06:15:46 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | { "char*" utf8 } "char*" typedef | 
					
						
							|  |  |  | "char*" "uchar*" typedef | 
					
						
							| 
									
										
										
										
											2008-12-08 19:49:02 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     { [ os windows? ] [ "alien.strings.windows" require ] } | 
					
						
							|  |  |  |     { [ os unix? ] [ "alien.strings.unix" require ] } | 
					
						
							|  |  |  | } cond
 |