USING: alien alien.c-types kernel windows.ole32 combinators.lib parser splitting sequences.lib sequences namespaces assocs quotations shuffle accessors words macros alien.syntax fry ; IN: windows.com.syntax com-interface-definition TUPLE: com-function-definition name return parameters ; C: com-function-definition SYMBOL: +com-interface-definitions+ +com-interface-definitions+ get-global [ H{ } +com-interface-definitions+ set-global ] unless : find-com-interface-definition ( name -- definition ) dup "f" = [ drop f ] [ dup +com-interface-definitions+ get-global at* [ nip ] [ swap " COM interface hasn't been defined" append throw ] if ] if ; : save-com-interface-definition ( definition -- ) dup name>> +com-interface-definitions+ get-global set-at ; : (parse-com-function) ( tokens -- definition ) [ second ] [ first ] [ 3 tail 2 group [ first ] map "void*" prefix ] tri ; : parse-com-functions ( -- functions ) ";" parse-tokens { ")" } split harvest [ (parse-com-function) ] map ; : (iid-word) ( definition -- word ) name>> "-iid" append create-in ; : (function-word) ( function interface -- word ) name>> "::" rot name>> 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 -- ) -rot [ (function-word) swap ] 2keep drop { return>> parameters>> } get-slots [ com-invoke ] 3curry define ; : define-words-for-com-interface ( definition -- ) [ [ (iid-word) ] [ iid>> 1quotation ] bi define ] [ name>> "com-interface" swap typedef ] [ dup family-tree-functions [ (define-word-for-function) ] with each-index ] tri ; PRIVATE> : COM-INTERFACE: scan scan find-com-interface-definition scan string>guid parse-com-functions dup save-com-interface-definition define-words-for-com-interface ; parsing