: parse-c-type-name ( name -- word )
dup search [ ] [ no-word ] ?if ;
-: parse-c-type ( string -- type )
+: parse-array-type ( name -- dims c-type )
+ "[" split unclip
+ [ [ "]" ?tail drop parse-word ] map ] dip ;
+
+: (parse-c-type) ( string -- type )
{
- { [ dup "void" = ] [ drop void ] }
- { [ CHAR: ] over member? ] [ parse-array-type parse-c-type-name prefix ] }
- { [ dup search c-type-word? ] [ parse-c-type-name ] }
- { [ "**" ?tail ] [ drop void* ] }
- { [ "*" ?tail ] [ parse-c-type-name resolve-pointer-type ] }
- [ dup search [ no-c-type ] [ no-word ] ?if ]
+ { [ dup "void" = ] [ drop void ] }
+ { [ CHAR: ] over member? ] [ parse-array-type parse-c-type-name prefix ] }
+ { [ dup search ] [ parse-c-type-name ] }
+ { [ "*" ?tail ] [ (parse-c-type) <pointer> ] }
+ [ dup search [ ] [ no-word ] ?if ]
} cond ;
+: valid-c-type? ( c-type -- ? )
+ { [ array? ] [ c-type-word? ] [ pointer? ] [ void? ] } 1|| ;
+
+: parse-c-type ( string -- type )
+ (parse-c-type) dup valid-c-type? [ no-c-type ] unless ;
+
: scan-c-type ( -- c-type )
scan dup "{" =
[ drop \ } parse-until >array ]
type-name current-vocab create :> type-word
type-word [ reset-generic ] [ reset-c-type ] bi
void* type-word typedef
- parameters return parse-arglist :> callback-effect :> types
+ parameters return parse-arglist :> ( types callback-effect )
type-word callback-effect "callback-effect" set-word-prop
type-word lib "callback-library" set-word-prop
type-word return types lib library-abi callback-quot (( quot -- alien )) ;