Merge branch 'inlinec' of git://github.com/jedahu/factor

db4
Slava Pestov 2009-07-06 02:41:56 -05:00
commit 6aaad1ea9f
1 changed files with 58 additions and 19 deletions

View File

@ -1,9 +1,10 @@
! Copyright (C) 2009 Jeremy Hughes. ! Copyright (C) 2009 Jeremy Hughes.
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
USING: accessors alien.inline.compiler alien.libraries USING: accessors alien.inline.compiler alien.libraries
alien.parser arrays fry generalizations io.files io.files.info alien.parser arrays assocs effects fry generalizations grouping
io.files.temp kernel lexer math.order multiline namespaces io.files io.files.info io.files.temp kernel lexer math
sequences system vocabs.loader vocabs.parser words ; math.order math.ranges multiline namespaces sequences splitting
strings system vocabs.loader vocabs.parser words ;
IN: alien.inline IN: alien.inline
<PRIVATE <PRIVATE
@ -12,21 +13,55 @@ SYMBOL: library-is-c++
SYMBOL: compiler-args SYMBOL: compiler-args
SYMBOL: c-strings SYMBOL: c-strings
: return-library-function-params ( -- return library function params ) : annotate-effect ( types effect -- types effect' )
scan c-library get scan ")" parse-tokens [ in>> ] [ out>> ] bi [
[ "(" subseq? not ] filter [ zip
[ dup CHAR: - = [ drop CHAR: space ] when ] map [ over pointer-to-primitive? [ ">" prepend ] when ]
] 3dip ; assoc-map unzip
] dip <effect> ;
: factor-function ( return library function params -- )
[ dup "const " head? [ 6 tail ] when ] 3dip
make-function define-declared ;
: c-function-string ( return library function params -- str ) : function-types-effect ( -- function types effect )
[ nip ] dip scan scan swap ")" parse-tokens
" " join "(" prepend ")" append 3array " " join [ "(" subseq? not ] filter swap parse-arglist ;
: types-effect>params-return ( types effect -- params return )
[ in>> zip ]
[ nip out>> dup length 0 > [ first ] [ drop "void" ] if ]
2bi ;
: arg-list ( types -- params )
CHAR: a swap length CHAR: a + [a,b]
[ 1string ] map ;
: factorize-type ( str -- str' )
"const-" ?head drop
"unsigned-" ?head [ "u" prepend ] when
"long-" ?head [ "long" prepend ] when ;
: cify-type ( str -- str' )
{ { CHAR: - CHAR: space } } substitute ;
: factor-function ( function types effect -- word quot effect )
annotate-effect [ c-library get ] 3dip
[ [ factorize-type ] map ] dip
types-effect>params-return factorize-type -roll
concat make-function ;
: prototype-string ( function types effect -- str )
[ [ cify-type ] map ] dip
types-effect>params-return cify-type -rot
[ " " join ] map ", " join
"(" prepend ")" append 3array " " join
library-is-c++ get [ "extern \"C\" " prepend ] when ; library-is-c++ get [ "extern \"C\" " prepend ] when ;
: prototype-string' ( function types return -- str )
[ dup arg-list ] <effect> prototype-string ;
: append-function-body ( prototype-str -- str )
" {\n" append parse-here append "\n}\n" append ;
: library-path ( -- str ) : library-path ( -- str )
"lib" c-library get library-suffix "lib" c-library get library-suffix
3array concat temp-file ; 3array concat temp-file ;
@ -53,10 +88,14 @@ PRIVATE>
compile-library? [ compile-library ] when compile-library? [ compile-library ] when
c-library get library-path "cdecl" add-library ; c-library get library-path "cdecl" add-library ;
: define-c-function ( return library function params -- ) : define-c-function ( function types effect -- )
[ factor-function ] 4 nkeep c-function-string [ factor-function define-declared ] 3keep prototype-string
" {\n" append parse-here append "\n}\n" append append-function-body c-strings get push ;
c-strings get push ;
: define-c-function' ( function effect -- )
[ in>> ] keep [ factor-function define-declared ] 3keep
out>> prototype-string'
append-function-body c-strings get push ;
: define-c-link ( str -- ) : define-c-link ( str -- )
"-l" prepend compiler-args get push ; "-l" prepend compiler-args get push ;
@ -83,6 +122,6 @@ SYNTAX: C-LINK/FRAMEWORK: scan define-c-link/framework ;
SYNTAX: C-INCLUDE: scan define-c-include ; SYNTAX: C-INCLUDE: scan define-c-include ;
SYNTAX: C-FUNCTION: SYNTAX: C-FUNCTION:
return-library-function-params define-c-function ; function-types-effect define-c-function ;
SYNTAX: ;C-LIBRARY compile-c-library ; SYNTAX: ;C-LIBRARY compile-c-library ;