factor/basis/windows/com/syntax/syntax.factor

100 lines
3.0 KiB
Factor

USING: alien alien.c-types alien.accessors alien.parser
effects kernel windows.ole32 parser lexer splitting grouping
sequences namespaces assocs quotations generalizations
accessors words macros alien.syntax fry arrays layouts math
classes.struct windows.kernel32 locals ;
FROM: alien.parser.private => parse-pointers return-type-name ;
IN: windows.com.syntax
<PRIVATE
MACRO: com-invoke ( n return parameters -- )
[ 2nip length ] 3keep
'[
_ npick *void* _ cell * alien-cell _ _
stdcall alien-indirect
] ;
TUPLE: com-interface-definition word parent iid functions ;
C: <com-interface-definition> com-interface-definition
TUPLE: com-function-definition return name parameter-types parameter-names ;
C: <com-function-definition> com-function-definition
SYMBOL: +com-interface-definitions+
+com-interface-definitions+ get-global
[ H{ } +com-interface-definitions+ set-global ]
unless
ERROR: no-com-interface interface ;
: find-com-interface-definition ( name -- definition )
[
dup +com-interface-definitions+ get-global at*
[ nip ] [ drop no-com-interface ] if
] [ f ] if* ;
: save-com-interface-definition ( definition -- )
dup word>> +com-interface-definitions+ get-global set-at ;
: (parse-com-function) ( return name -- definition )
")" scan-c-args
[ pointer: void prefix ] [ "this" prefix ] bi*
<com-function-definition> ;
:: (parse-com-functions) ( functions -- )
scan dup ";" = [ drop ] [
parse-c-type scan parse-pointers
(parse-com-function) functions push
functions (parse-com-functions)
] if ;
: parse-com-functions ( -- functions )
V{ } clone [ (parse-com-functions) ] keep >array ;
: (iid-word) ( definition -- word )
word>> name>> "-iid" append create-in ;
: (function-word) ( function interface -- word )
swap [ word>> name>> "::" ] [ name>> ] bi*
3append create-in ;
: family-tree ( definition -- definitions )
dup parent>> [ family-tree ] [ { } ] if*
swap suffix ;
: family-tree-functions ( definition -- functions )
dup parent>> [ family-tree-functions ] [ { } ] if*
swap functions>> append ;
:: (define-word-for-function) ( function interface n -- )
function interface (function-word)
n function [ return>> ] [ parameter-types>> ] bi '[ _ _ _ com-invoke ]
function [ parameter-names>> ] [ return>> ] bi function-effect
define-declared ;
: define-words-for-com-interface ( definition -- )
[ [ (iid-word) ] [ iid>> 1quotation ] bi (( -- iid )) define-declared ]
[
dup family-tree-functions
[ (define-word-for-function) ] with each-index
] bi ;
PRIVATE>
SYNTAX: COM-INTERFACE:
CREATE-C-TYPE
void* over typedef
scan-object find-com-interface-definition
scan string>guid
parse-com-functions
<com-interface-definition>
dup save-com-interface-definition
define-words-for-com-interface ;
SYNTAX: GUID: scan string>guid suffix! ;
USE: vocabs.loader
{ "windows.com" "prettyprint" } "windows.com.prettyprint" require-when