1 USING: alien alien.c-types alien.accessors alien.parser
2 effects kernel windows.ole32 parser lexer splitting grouping
3 sequences namespaces assocs quotations generalizations
4 accessors words macros alien.syntax fry arrays layouts math
5 classes.struct windows.kernel32 ;
10 MACRO: com-invoke ( n return parameters -- )
13 _ npick *void* _ cell * alien-cell _ _
14 "stdcall" alien-indirect
17 TUPLE: com-interface-definition word parent iid functions ;
18 C: <com-interface-definition> com-interface-definition
20 TUPLE: com-function-definition name return parameters ;
21 C: <com-function-definition> com-function-definition
23 SYMBOL: +com-interface-definitions+
24 +com-interface-definitions+ get-global
25 [ H{ } +com-interface-definitions+ set-global ]
28 ERROR: no-com-interface interface ;
30 : find-com-interface-definition ( name -- definition )
32 dup +com-interface-definitions+ get-global at*
33 [ nip ] [ drop no-com-interface ] if
36 : save-com-interface-definition ( definition -- )
37 dup word>> +com-interface-definitions+ get-global set-at ;
39 : (parse-com-function) ( tokens -- definition )
43 3 tail [ CHAR: , swap remove ] map
44 2 group [ first2 normalize-c-arg 2array ] map
45 { void* "this" } prefix
47 <com-function-definition> ;
49 : parse-com-functions ( -- functions )
50 ";" parse-tokens { ")" } split harvest
51 [ (parse-com-function) ] map ;
53 : (iid-word) ( definition -- word )
54 word>> name>> "-iid" append create-in ;
56 : (function-word) ( function interface -- word )
57 swap [ word>> name>> "::" ] [ name>> ] bi*
60 : family-tree ( definition -- definitions )
61 dup parent>> [ family-tree ] [ { } ] if*
64 : family-tree-functions ( definition -- functions )
65 dup parent>> [ family-tree-functions ] [ { } ] if*
66 swap functions>> append ;
68 : (invocation-quot) ( function return parameters -- quot )
69 [ first ] map [ com-invoke ] 3curry ;
71 : (stack-effect-from-return-and-parameters) ( return parameters -- stack-effect )
74 [ dup void? [ drop { } ] [ 1array ] if ] bi*
77 : (define-word-for-function) ( function interface n -- )
78 -rot [ (function-word) swap ] 2keep drop
79 [ return>> ] [ parameters>> ] bi
80 [ (invocation-quot) ] 2keep
81 (stack-effect-from-return-and-parameters)
84 : define-words-for-com-interface ( definition -- )
85 [ [ (iid-word) ] [ iid>> 1quotation ] bi (( -- iid )) define-declared ]
86 [ word>> void* swap typedef ]
88 dup family-tree-functions
89 [ (define-word-for-function) ] with each-index
95 SYNTAX: COM-INTERFACE:
97 scan-object find-com-interface-definition
100 <com-interface-definition>
101 dup save-com-interface-definition
102 define-words-for-com-interface ;
104 SYNTAX: GUID: scan string>guid parsed ;
106 USING: vocabs vocabs.loader ;
108 "prettyprint" vocab [
109 "windows.com.prettyprint" require