]> gitweb.factorcode.org Git - factor.git/blob - basis/alien/parser/parser.factor
Merge branch 'master' of git://factorcode.org/git/factor
[factor.git] / basis / alien / parser / parser.factor
1 ! Copyright (C) 2008, 2009 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: alien alien.c-types arrays assocs effects grouping kernel
4 parser sequences splitting words fry locals lexer namespaces
5 summary ;
6 IN: alien.parser
7
8 ERROR: invalid-c-name name ;
9
10 M: invalid-c-name summary
11     drop "The C pointer asterisk must be part of the type string." ;
12
13 : check-c-name ( string -- string )
14     dup [ CHAR: * = ] any? [ invalid-c-name ] when ;
15
16 : parse-arglist ( parameters return -- types effect )
17     [ 2 group unzip [ "," ?tail drop check-c-name ] map ]
18     [ [ { } ] [ 1array ] if-void ]
19     bi* <effect> ;
20
21 : function-quot ( return library function types -- quot )
22     '[ _ _ _ _ alien-invoke ] ;
23
24 :: make-function ( return library function parameters -- word quot effect )
25     function check-c-name create-in dup reset-generic
26     return library function
27     parameters return parse-arglist [ function-quot ] dip ;
28
29 : (FUNCTION:) ( -- word quot effect )
30     scan "c-library" get scan ";" parse-tokens
31     [ "()" subseq? not ] filter
32     make-function ;
33
34 : define-function ( return library function parameters -- )
35     make-function define-declared ;