USE: lists
USE: math
USE: namespaces
+USE: parser
USE: stack
USE: strings
USE: words
"set-" swap cat2 "in" get create >r
[ "setter" get ] bind cons r> swap define-compound ;
-: define-field ( offset spec -- offset )
- unswons >r c-type dup >r [ "width" get ] bind align r> r>
+: define-field ( offset type name -- offset )
+ >r c-type dup >r [ "width" get ] bind align r> r>
"struct-name" get swap "-" swap cat3
( offset type name -- )
3dup define-getter 3dup define-setter
#! alien.
[
"struct-name" set
- 0 swap [ define-field ] each
+ 0 swap [ unswons define-field ] each
dup define-constructor
dup define-local-constructor
define-struct-type
] with-scope ;
+: BEGIN-STRUCT: ( -- offset )
+ scan "struct-name" set 0 ; parsing
+
+: FIELD: ( offset -- offset )
+ scan scan define-field ; parsing
+
+: END-STRUCT ( offset -- )
+ dup define-constructor
+ dup define-local-constructor
+ define-struct-type ; parsing
+
global [ <namespace> "c-types" set ] bind
[
--- /dev/null
+! :folding=indent:collapseFolds=1:
+
+! $Id$
+!
+! Copyright (C) 2004 Slava Pestov.
+!
+! Redistribution and use in source and binary forms, with or without
+! modification, are permitted provided that the following conditions are met:
+!
+! 1. Redistributions of source code must retain the above copyright notice,
+! this list of conditions and the following disclaimer.
+!
+! 2. Redistributions in binary form must reproduce the above copyright notice,
+! this list of conditions and the following disclaimer in the documentation
+! and/or other materials provided with the distribution.
+!
+! THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+! INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+! FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+! DEVELOPERS AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+! SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+! PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+! OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+! WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+! ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+IN: alien
+USE: compiler
+USE: errors
+USE: lists
+USE: math
+USE: namespaces
+USE: parser
+USE: stack
+USE: words
+
+: BEGIN-ENUM:
+ #! C-style enumartions. Their use is not encouraged unless
+ #! it is for C library interfaces. Used like this:
+ #!
+ #! BEGIN-ENUM 0
+ #! ENUM: x
+ #! ENUM: y
+ #! ENUM: z
+ #! END-ENUM
+ #!
+ #! This is the same as : x 0 ; : y 1 ; : z 2 ;.
+ scan str>number ; parsing
+
+: ENUM:
+ dup CREATE swap unit define-compound succ ; parsing
+
+: END-ENUM
+ drop ; parsing
+
+: alien-call ( ... returns library function parameters -- ... )
+ #! Call a C library function.
+ #! 'returns' is a type spec, and 'parameters' is a list of
+ #! type specs. 'library' is an entry in the "libraries"
+ #! namespace.
+ "alien-call cannot be interpreted." throw ;
+
+: library ( name -- handle )
+ "libraries" get get* ;
+
+: alien-function ( function library -- )
+ library dlsym ;
+
+: compile-alien-call
+ pop-literal reverse PARAMETERS >r
+ pop-literal pop-literal alien-function CALL drop
+ r> CLEANUP
+ pop-literal RETURNS ;
+
+global [ <namespace> "libraries" set ] bind
+
+[ alien-call compile-alien-call ]
+unswons "compiling" swap set-word-property