{ } [
[ C-TYPE: hi TYPEDEF: void* hi ] with-compilation-unit
] unit-test
+
+[
+"IN: alien.parser.tests
+USING: alien.c-types alien.syntax ;
+ENUM: tv_peripherals_4 < uchar
+{ appletv 1 } { chromecast 2 } { roku 444 } ;" eval( -- )
+] [ error>> enum-values-outside-c-type-interval? ] must-fail-with
! Copyright (C) 2008, 2010 Slava Pestov, Doug Coleman, Joe Groff.
! See http://factorcode.org/license.txt for BSD license.
+
USING: accessors alien alien.c-types alien.enums alien.libraries
-arrays classes classes.parser combinators combinators.short-circuit
-compiler.units effects fry kernel lexer locals math namespaces parser
-sequences splitting summary vocabs.parser words ;
+arrays classes classes.parser combinators
+combinators.short-circuit compiler.units effects fry kernel
+lexer locals math math.order namespaces parser sequences
+splitting summary vocabs.parser words ;
+
IN: alien.parser
SYMBOL: current-library
dup ";" = not
[ swap parse-enum-member scan-token parse-enum-members ] [ 2drop ] if ;
+ERROR: enum-values-outside-c-type-interval name base-type values ;
+
+: check-enum-members ( name base-type members -- name base-type members )
+ over c-type-interval '[ second _ _ between? ] dupd reject
+ [ nip enum-values-outside-c-type-interval ] unless-empty ;
+
PRIVATE>
: parse-enum ( -- name base-type members )
parse-enum-name
parse-enum-base-type
- [ V{ } clone 0 ] dip parse-enum-members ;
+ [ V{ } clone 0 ] dip parse-enum-members
+ check-enum-members ;
: scan-function-name ( -- return function )
scan-c-type scan-token parse-pointers ;