| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | ! Copyright (C) 2005, 2007 Slava Pestov, Alex Chapman. | 
					
						
							|  |  |  | ! See http://factorcode.org/license.txt for BSD license. | 
					
						
							| 
									
										
										
										
											2007-12-30 15:08:01 -05:00
										 |  |  | USING: arrays alien alien.c-types alien.structs alien.arrays | 
					
						
							|  |  |  | kernel math namespaces parser sequences words quotations | 
					
						
							|  |  |  | math.parser splitting effects prettyprint prettyprint.sections | 
					
						
							| 
									
										
										
										
											2007-11-07 19:26:39 -05:00
										 |  |  | prettyprint.backend assocs combinators ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | IN: alien.syntax | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <PRIVATE
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : parse-arglist ( return seq -- types effect )
 | 
					
						
							|  |  |  |     2 group dup keys swap values
 | 
					
						
							|  |  |  |     rot dup "void" = [ drop { } ] [ 1array ] if <effect> ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : function-quot ( type lib func types -- quot )
 | 
					
						
							|  |  |  |     [ alien-invoke ] 2curry 2curry ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : define-function ( return library function parameters -- )
 | 
					
						
							|  |  |  |     >r pick r> parse-arglist | 
					
						
							|  |  |  |     pick create-in dup reset-generic | 
					
						
							|  |  |  |     >r >r function-quot r> r>  | 
					
						
							|  |  |  |     -rot define-declared ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | PRIVATE>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-13 01:58:56 -05:00
										 |  |  | : indirect-quot ( function-ptr-quot return types abi -- quot )
 | 
					
						
							|  |  |  |     [ alien-indirect ] 3curry compose ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : define-indirect ( abi return function-ptr-quot function-name parameters -- )
 | 
					
						
							|  |  |  |     >r pick r> parse-arglist | 
					
						
							|  |  |  |     rot create-in dup reset-generic | 
					
						
							|  |  |  |     >r >r swapd roll indirect-quot r> r> | 
					
						
							|  |  |  |     -rot define-declared ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | : DLL" skip-blank parse-string dlopen parsed ; parsing | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : ALIEN: scan string>number <alien> parsed ; parsing | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : LIBRARY: scan "c-library" set ; parsing | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : FUNCTION: | 
					
						
							|  |  |  |     scan "c-library" get scan ";" parse-tokens | 
					
						
							|  |  |  |     [ "()" subseq? not ] subset | 
					
						
							|  |  |  |     define-function ; parsing | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : TYPEDEF: | 
					
						
							|  |  |  |     scan scan typedef ; parsing | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-13 03:09:08 -05:00
										 |  |  | : TYPEDEF-IF: | 
					
						
							|  |  |  |     scan-word execute scan scan rot [ typedef ] [ 2drop ] if ; parsing | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | : C-STRUCT: | 
					
						
							|  |  |  |     scan in get
 | 
					
						
							|  |  |  |     parse-definition | 
					
						
							|  |  |  |     >r 2dup r> define-struct-early | 
					
						
							|  |  |  |     define-struct ; parsing | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : C-UNION: | 
					
						
							|  |  |  |     scan in get parse-definition define-union ; parsing | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : C-ENUM: | 
					
						
							|  |  |  |     ";" parse-tokens | 
					
						
							|  |  |  |     dup length
 | 
					
						
							| 
									
										
										
										
											2008-01-02 19:36:36 -05:00
										 |  |  |     [ >r create-in r> 1quotation define ] 2each ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  |     parsing | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: alien pprint* | 
					
						
							| 
									
										
										
										
											2007-11-07 19:26:39 -05:00
										 |  |  |     { | 
					
						
							|  |  |  |         { [ dup expired? ] [ drop "( alien expired )" text ] } | 
					
						
							|  |  |  |         { [ dup pinned-c-ptr? not ] [ drop "( displaced alien )" text ] } | 
					
						
							|  |  |  |         { [ t ] [ \ ALIEN: [ alien-address pprint* ] pprint-prefix ] } | 
					
						
							|  |  |  |     } cond ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-12-03 19:19:18 -05:00
										 |  |  | M: dll pprint* dll-path dup "DLL\" " "\"" pprint-string ;
 |