+STRUCT: malloced
+ { byte-array void* }
+ { len uint }
+ { offset uint } ;
+
+: <malloced> ( len -- malloced )
+ malloced malloc-struct
+ over 1 + <byte-array> malloc-byte-array >>byte-array
+ swap >>len
+ 0 >>offset ;
+
+: append-oom? ( malloced string -- ? )
+ [ [ len>> ] [ offset>> ] bi - ]
+ [ length ] bi* < ;
+
+: realloc-malloced ( malloced -- malloced' )
+ dup len>> 2 *
+ '[ [ _ 1 + realloc ] change-byte-array ] keep >>len ;
+
+: append-malloced ( malloced string -- )
+ 2dup append-oom?
+ [ [ realloc-malloced ] dip append-malloced ] [
+ [
+ [
+ [ offset>> ] [ byte-array>> ] bi <displaced-alien>
+ ] dip [ utf8 string>alien ] [ length ] bi memcpy
+ ] [
+ '[ _ length + ] change-offset drop
+ ] 2bi
+ ] if ;
+
+: malloced>string ( malloced -- string )
+ [ byte-array>> utf8 alien>string ] [ free ] bi ;