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
chris.double 2006-09-14 23:51:47 +00:00
parent 267108e601
commit 9d266acdf0
2 changed files with 16 additions and 2 deletions

View File

@ -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

View File

@ -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 ;