1 ! Copyright (C) 2005, 2008 Slava Pestov, Alex Chapman.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors arrays alien alien.c-types alien.structs
4 alien.arrays alien.strings kernel math namespaces parser
5 sequences words quotations math.parser splitting grouping
6 effects prettyprint prettyprint.sections prettyprint.backend
7 assocs combinators lexer strings.parser ;
12 : parse-arglist ( return seq -- types effect )
13 2 group dup keys swap values [ "," ?tail drop ] map
14 rot dup "void" = [ drop { } ] [ 1array ] if <effect> ;
16 : function-quot ( type lib func types -- quot )
17 [ alien-invoke ] 2curry 2curry ;
19 : define-function ( return library function parameters -- )
20 >r pick r> parse-arglist
21 pick create-in dup reset-generic
22 >r >r function-quot r> r>
23 -rot define-declared ;
27 : indirect-quot ( function-ptr-quot return types abi -- quot )
28 [ alien-indirect ] 3curry compose ;
30 : define-indirect ( abi return function-ptr-quot function-name parameters -- )
31 >r pick r> parse-arglist
32 rot create-in dup reset-generic
33 >r >r swapd roll indirect-quot r> r>
34 -rot define-declared ;
36 : DLL" lexer get skip-blank parse-string dlopen parsed ; parsing
38 : ALIEN: scan string>number <alien> parsed ; parsing
40 : BAD-ALIEN <bad-alien> parsed ; parsing
42 : LIBRARY: scan "c-library" set ; parsing
45 scan "c-library" get scan ";" parse-tokens
46 [ "()" subseq? not ] filter
47 define-function ; parsing
50 scan scan typedef ; parsing
53 scan-word execute scan scan rot [ typedef ] [ 2drop ] if ; parsing
58 >r 2dup r> define-struct-early
59 define-struct ; parsing
62 scan in get parse-definition define-union ; parsing
67 [ >r create-in r> 1quotation define ] 2each ;
72 { [ dup expired? ] [ drop \ BAD-ALIEN pprint-word ] }
73 { [ dup pinned-c-ptr? not ] [ drop "( displaced alien )" text ] }
74 [ \ ALIEN: [ alien-address pprint* ] pprint-prefix ]
77 M: dll pprint* dll-path dup "DLL\" " "\"" pprint-string ;