first attempt at implementating FIELD: for arrays
Currently only char arrays are implemented, and for the single indexed array form: BEGIN-STRUCT: foo FIELD: char[100] bar END-STRUCT my-foo foo-bar => "hello" "X" 0 set-foo-bar my-foo foo-bar => "Xello"darcs
parent
267108e601
commit
9d266acdf0
|
@ -110,6 +110,15 @@ USING: alien compiler kernel kernel-internals math namespaces ;
|
|||
"unbox_char_string" "unboxer-function" set
|
||||
] "char*" (define-primitive-type)
|
||||
|
||||
[
|
||||
[ swap <displaced-alien> alien>char-string ] "getter" set
|
||||
[ swap <displaced-alien> 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> alien>u16-string ] "getter" set
|
||||
[ >r >r alien-address r> r> set-alien-unsigned-cell ] "setter" set
|
||||
|
|
|
@ -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 ;
|
||||
|
|
Loading…
Reference in New Issue