diff --git a/library/compiler/alien/primitive-types.factor b/library/compiler/alien/primitive-types.factor index 7d162ca965..ec064271ee 100644 --- a/library/compiler/alien/primitive-types.factor +++ b/library/compiler/alien/primitive-types.factor @@ -110,6 +110,15 @@ USING: alien compiler kernel kernel-internals math namespaces ; "unbox_char_string" "unboxer-function" set ] "char*" (define-primitive-type) +[ + [ swap alien>char-string ] "getter" set + [ swap swap set-alien-unsigned-1 ] "setter" set + 1 "width" set + 1 "align" set + "box_char_array" "boxer-function" set + "unbox_char_array" "unboxer-function" set +] "char[]" (define-primitive-type) + [ [ alien-unsigned-cell alien>u16-string ] "getter" set [ >r >r alien-address r> r> set-alien-unsigned-cell ] "setter" set diff --git a/library/compiler/alien/structs.factor b/library/compiler/alien/structs.factor index b50e090465..09ed26d287 100644 --- a/library/compiler/alien/structs.factor +++ b/library/compiler/alien/structs.factor @@ -28,11 +28,16 @@ sequences strings words ; "set-" swap append create-in >r c-setter* swap add* r> swap define-compound ; +: parse-c-decl ( string -- count name ) + "[]" split "" swap remove unclip >r dup empty? + [ drop 1 ] [ [ string>number ] map product ] if r> over 1 > [ "[]" append ] when ; + : define-field ( offset type name -- offset ) - >r dup >r c-align align r> r> + >r parse-c-decl [ c-align ] keep + >r swapd align r> r> "struct-name" get swap "-" swap append3 3dup define-getter 3dup define-setter - drop c-size + ; + drop c-size rot * + ; : define-member ( max type -- max ) c-size max ;