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' )
[ 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' )
over "{" =
[ 2drop scan scan-object next-enum-member "}" expect ]
[ next-enum-member ] if ;
[ 2drop scan create-in scan-object next-enum-member "}" expect ]
[ [ create-in ] dip next-enum-member ] if ;
: parse-enum-members ( members counter -- members )
scan dup ";" = not
[ swap parse-enum-member parse-enum-members ] [ 2drop ] if ;
: define-enum-member ( name value -- )
[ create-in ] [ define-constant ] bi* ;
: define-enum-members ( members -- )
[ first2 define-enum-member ] each ;
: parse-enum-members ( members counter token -- members )
dup ";" = not
[ swap parse-enum-member scan parse-enum-members ] [ 2drop ] if ;
PRIVATE>
: parse-enum ( -- name members )
scan dup "f" =
[ drop f ]
[ (CREATE-C-TYPE) dup save-location ] if
V{ } clone 0 parse-enum-members ;
: define-enum ( word members -- )
[ [ int swap typedef ] when* ] [ define-enum-members ] bi* ;
: parse-enum ( -- name base-type members )
parse-enum-name
parse-enum-base-type
[ V{ } clone 0 ] dip parse-enum-members ;
: scan-function-name ( -- return function )
scan-c-type scan parse-pointers ;

View File

@ -1,6 +1,6 @@
! 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
USING: accessors arrays alien alien.c-types alien.enums 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