diff --git a/basis/alien/enums/enums.factor b/basis/alien/enums/enums.factor new file mode 100644 index 0000000000..7cef34369d --- /dev/null +++ b/basis/alien/enums/enums.factor @@ -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 + + + +: define-enum ( word base-type members -- ) + [ define-enum-members ] [ swap typedef ] bi ; + diff --git a/basis/alien/parser/parser.factor b/basis/alien/parser/parser.factor index 731cc4d6b5..07f0d49f2f 100755 --- a/basis/alien/parser/parser.factor +++ b/basis/alien/parser/parser.factor @@ -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 ; diff --git a/basis/alien/syntax/syntax.factor b/basis/alien/syntax/syntax.factor index be137b1da8..570ebf60a5 100755 --- a/basis/alien/syntax/syntax.factor +++ b/basis/alien/syntax/syntax.factor @@ -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