| 
									
										
										
										
											2011-09-12 03:56:24 -04:00
										 |  |  | ! Copyright (C) 2008, 2011 Slava Pestov. | 
					
						
							| 
									
										
										
										
											2009-05-02 14:45:38 -04:00
										 |  |  | ! See http://factorcode.org/license.txt for BSD license. | 
					
						
							| 
									
										
										
										
											2014-05-20 14:53:36 -04:00
										 |  |  | USING: accessors alien arrays byte-arrays byte-vectors init io | 
					
						
							|  |  |  | io.encodings io.encodings.ascii io.encodings.utf16n | 
					
						
							|  |  |  | io.encodings.utf8 io.streams.byte-array io.streams.memory kernel | 
					
						
							|  |  |  | kernel.private math namespaces sequences sequences.private | 
					
						
							|  |  |  | strings strings.private system system.private ;
 | 
					
						
							| 
									
										
										
										
											2009-05-02 14:45:38 -04:00
										 |  |  | IN: alien.strings | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | GENERIC# alien>string 1 ( c-ptr encoding -- string/f )
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: c-ptr alien>string | 
					
						
							|  |  |  |     [ <memory-stream> ] [ <decoder> ] bi*
 | 
					
						
							|  |  |  |     "\0" swap stream-read-until drop ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-26 10:13:30 -04:00
										 |  |  | M: object alien>string | 
					
						
							|  |  |  |     [ underlying>> ] dip alien>string ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-02 14:45:38 -04:00
										 |  |  | M: f alien>string | 
					
						
							|  |  |  |     drop ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ERROR: invalid-c-string string ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : check-string ( string -- )
 | 
					
						
							| 
									
										
										
										
											2009-10-28 16:02:00 -04:00
										 |  |  |     0 over member-eq? [ invalid-c-string ] [ drop ] if ;
 | 
					
						
							| 
									
										
										
										
											2009-05-02 14:45:38 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | GENERIC# string>alien 1 ( string encoding -- byte-array )
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: c-ptr string>alien drop ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-20 14:53:36 -04:00
										 |  |  | <PRIVATE
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : fast-string? ( string encoding -- ? )
 | 
					
						
							|  |  |  |     [ aux>> not ] [ { ascii utf8 } member-eq? ] bi* and ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : string>alien-fast ( string encoding -- byte-array )
 | 
					
						
							|  |  |  |     { string object } declare ! aux>> must be f | 
					
						
							|  |  |  |     drop [ length ] keep over [ | 
					
						
							|  |  |  |         1 + (byte-array) [ | 
					
						
							|  |  |  |             [ | 
					
						
							|  |  |  |                 [ [ string-nth-fast ] 2keep drop ] | 
					
						
							|  |  |  |                 [ set-nth-unsafe ] bi*
 | 
					
						
							|  |  |  |             ] 2curry each-integer
 | 
					
						
							|  |  |  |         ] keep
 | 
					
						
							|  |  |  |     ] keep 0 swap pick set-nth-unsafe ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : string>alien-slow ( string encoding -- byte-array )
 | 
					
						
							|  |  |  |     { string object } declare | 
					
						
							|  |  |  |     over length 1 + over guess-encoded-length <byte-vector> [ | 
					
						
							|  |  |  |         swap <encoder> [ stream-write ] [ 0 swap stream-write1 ] bi
 | 
					
						
							|  |  |  |     ] keep B{ } like ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | PRIVATE>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-02 14:45:38 -04:00
										 |  |  | M: string string>alien | 
					
						
							|  |  |  |     over check-string | 
					
						
							| 
									
										
										
										
											2014-05-20 14:53:36 -04:00
										 |  |  |     2dup fast-string? | 
					
						
							|  |  |  |     [ string>alien-fast ] | 
					
						
							|  |  |  |     [ string>alien-slow ] if ;
 | 
					
						
							| 
									
										
										
										
											2009-05-02 14:45:38 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-29 20:55:27 -04:00
										 |  |  | M: tuple string>alien drop underlying>> ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-20 23:40:19 -05:00
										 |  |  | HOOK: native-string-encoding os ( -- encoding ) foldable
 | 
					
						
							| 
									
										
										
										
											2009-05-02 14:45:38 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-20 23:40:19 -05:00
										 |  |  | M: unix native-string-encoding utf8 ;
 | 
					
						
							|  |  |  | M: windows native-string-encoding utf16n ;
 | 
					
						
							| 
									
										
										
										
											2009-05-02 14:45:38 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-20 23:40:19 -05:00
										 |  |  | : alien>native-string ( alien -- string )
 | 
					
						
							|  |  |  |     native-string-encoding alien>string ; inline
 | 
					
						
							| 
									
										
										
										
											2009-05-05 10:12:39 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-20 23:40:19 -05:00
										 |  |  | : native-string>alien ( string -- alien )
 | 
					
						
							|  |  |  |     native-string-encoding string>alien ; inline
 | 
					
						
							| 
									
										
										
										
											2009-05-02 14:45:38 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : dll-path ( dll -- string )
 | 
					
						
							|  |  |  |     path>> alien>native-string ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-12 03:56:24 -04:00
										 |  |  | GENERIC: string>symbol ( str/seq -- alien )
 | 
					
						
							| 
									
										
										
										
											2009-05-05 15:41:38 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-12 03:56:24 -04:00
										 |  |  | M: string string>symbol utf8 string>alien ;
 | 
					
						
							| 
									
										
										
										
											2009-05-05 15:41:38 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-12 03:56:24 -04:00
										 |  |  | M: sequence string>symbol [ utf8 string>alien ] map ;
 | 
					
						
							| 
									
										
										
										
											2009-05-05 15:41:38 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-13 17:46:22 -04:00
										 |  |  | : (symbol>string) ( alien -- str )
 | 
					
						
							| 
									
										
										
										
											2011-09-12 03:56:24 -04:00
										 |  |  |     utf8 alien>string ;
 | 
					
						
							| 
									
										
										
										
											2009-05-02 14:45:38 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-13 17:46:22 -04:00
										 |  |  | GENERIC: symbol>string ( symbol(s) -- string(s) )
 | 
					
						
							|  |  |  | M: byte-array symbol>string (symbol>string) ;
 | 
					
						
							|  |  |  | M: array symbol>string [ (symbol>string) ] map ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-02 14:45:38 -04:00
										 |  |  | [ | 
					
						
							| 
									
										
										
										
											2011-11-02 15:54:31 -04:00
										 |  |  |     OBJ-CPU special-object utf8 alien>string string>cpu \ cpu set-global
 | 
					
						
							|  |  |  |     OBJ-OS special-object utf8 alien>string string>os \ os set-global
 | 
					
						
							|  |  |  |     OBJ-VM-COMPILER special-object utf8 alien>string \ vm-compiler set-global
 | 
					
						
							| 
									
										
										
										
											2009-10-19 22:17:02 -04:00
										 |  |  | ] "alien.strings" add-startup-hook |