add alien.enums vocab with enum-c-types that convert between symbols and integer values in the FFI. update ENUM: to define symbolic enums, and take an optional base type

db4
Joe Groff 2010-04-12 23:58:58 -07:00 committed by Erik Charlebois
parent e730d3b6d5
commit d3f770d545
3 changed files with 58 additions and 20 deletions

View File

@ -0,0 +1,38 @@
! (c)2010 Joe Groff bsd license
USING: accessors alien.c-types arrays combinators delegate fry
kernel quotations sequences words.symbol ;
IN: alien.enums
TUPLE: enum-c-type base-type members ;
CONSULT: c-type-protocol enum-c-type
base-type>> ;
: map-to-case ( quot: ( x -- y ) -- case )
{ } map-as [ ] suffix ; inline
: enum-unboxer ( members -- quot )
[ first2 '[ _ ] 2array ] map-to-case '[ _ case ] ;
: enum-boxer ( members -- quot )
[ first2 swap '[ _ ] 2array ] map-to-case '[ _ case ] ;
M: enum-c-type c-type-boxed-class drop object ;
M: enum-c-type c-type-boxer-quot members>> enum-boxer ;
M: enum-c-type c-type-unboxer-quot members>> enum-unboxer ;
M: enum-c-type c-type-setter
[ members>> enum-unboxer ] [ base-type>> c-type-setter ] bi
'[ _ 2dip @ ] ;
C: <enum-c-type> enum-c-type
<PRIVATE
: define-enum-members ( member-names -- )
[ first define-symbol ] each ;
PRIVATE>
: define-enum ( word base-type members -- )
[ define-enum-members ] [ <enum-c-type> swap typedef ] bi ;

View File

@ -78,31 +78,31 @@ M: pointer return-type-name to>> return-type-name CHAR: * suffix ;
: next-enum-member ( members name value -- members value' ) : next-enum-member ( members name value -- members value' )
[ 2array suffix! ] [ 1 + ] bi ; [ 2array suffix! ] [ 1 + ] bi ;
: parse-enum-name ( -- name )
scan dup "f" =
[ drop f ]
[ (CREATE-C-TYPE) dup save-location ] if ;
: parse-enum-base-type ( -- base-type token )
scan dup "<" =
[ drop scan-object scan ]
[ [ int ] dip ] if ;
: parse-enum-member ( members name value -- members value' ) : parse-enum-member ( members name value -- members value' )
over "{" = over "{" =
[ 2drop scan scan-object next-enum-member "}" expect ] [ 2drop scan create-in scan-object next-enum-member "}" expect ]
[ next-enum-member ] if ; [ [ create-in ] dip next-enum-member ] if ;
: parse-enum-members ( members counter -- members ) : parse-enum-members ( members counter token -- members )
scan dup ";" = not dup ";" = not
[ swap parse-enum-member parse-enum-members ] [ 2drop ] if ; [ swap parse-enum-member scan parse-enum-members ] [ 2drop ] if ;
: define-enum-member ( name value -- )
[ create-in ] [ define-constant ] bi* ;
: define-enum-members ( members -- )
[ first2 define-enum-member ] each ;
PRIVATE> PRIVATE>
: parse-enum ( -- name members ) : parse-enum ( -- name base-type members )
scan dup "f" = parse-enum-name
[ drop f ] parse-enum-base-type
[ (CREATE-C-TYPE) dup save-location ] if [ V{ } clone 0 ] dip parse-enum-members ;
V{ } clone 0 parse-enum-members ;
: define-enum ( word members -- )
[ [ int swap typedef ] when* ] [ define-enum-members ] bi* ;
: scan-function-name ( -- return function ) : scan-function-name ( -- return function )
scan-c-type scan parse-pointers ; scan-c-type scan parse-pointers ;

View File

@ -1,6 +1,6 @@
! Copyright (C) 2005, 2010 Slava Pestov, Alex Chapman. ! Copyright (C) 2005, 2010 Slava Pestov, Alex Chapman.
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
USING: accessors arrays alien alien.c-types alien.arrays USING: accessors arrays alien alien.c-types alien.enums alien.arrays
alien.strings kernel math namespaces parser sequences words alien.strings kernel math namespaces parser sequences words
quotations math.parser splitting grouping effects assocs quotations math.parser splitting grouping effects assocs
combinators lexer strings.parser alien.parser fry vocabs.parser combinators lexer strings.parser alien.parser fry vocabs.parser