! Copyright (C) 2005, 2010 Slava Pestov, Alex Chapman. ! See http://factorcode.org/license.txt for BSD license. USING: accessors arrays alien alien.c-types alien.arrays alien.strings kernel math namespaces parser sequences words quotations math.parser splitting grouping effects assocs combinators lexer strings.parser alien.parser fry vocabs.parser words.constant alien.libraries ; IN: alien.syntax SYNTAX: DLL" lexer get skip-blank parse-string dlopen suffix! ; SYNTAX: ALIEN: 16 scan-base suffix! ; SYNTAX: BAD-ALIEN suffix! ; SYNTAX: LIBRARY: scan "c-library" set ; SYNTAX: FUNCTION: (FUNCTION:) define-declared ; SYNTAX: CALLBACK: (CALLBACK:) define-inline ; SYNTAX: TYPEDEF: scan-c-type CREATE-C-TYPE dup save-location typedef ; : define-enum-members ( counter -- ) scan dup ";" = not [ dup "{" = [ 2drop scan create-in scan-word [ define-constant ] keep "}" expect ] [ create-in swap [ define-constant ] keep ] if 1 + define-enum-members ] [ 2drop ] if ; SYNTAX: C-ENUM: 0 define-enum-members ; SYNTAX: C-TYPED-ENUM: int CREATE-C-TYPE dup save-location typedef 0 define-enum-members ; SYNTAX: C-TYPE: void CREATE-C-TYPE typedef ; ERROR: no-such-symbol name library ; : address-of ( name library -- value ) 2dup load-library dlsym [ 2nip ] [ no-such-symbol ] if* ; SYNTAX: &: scan "c-library" get '[ _ _ address-of ] append! ; : global-quot ( type word -- quot ) name>> "c-library" get '[ _ _ address-of 0 ] swap c-type-getter-boxer append ; : define-global ( type word -- ) [ nip ] [ global-quot ] 2bi (( -- value )) define-declared ; SYNTAX: C-GLOBAL: scan-c-type CREATE-WORD define-global ; SYNTAX: pointer: scan-c-type suffix! ;