+# An array of `unsigned char` in C (`unsigned char*`)
+extern class NativeCByteArray `{ unsigned char* `}
+ super NativeCArray
+ redef type E: Byte
+
+ # Allocate a new array of `size`
+ new(size: Int) `{ return calloc(size, sizeof(unsigned char)); `}
+
+ redef fun [](index) `{ return self[index]; `}
+ redef fun []=(index, val) `{ self[index] = val; `}
+
+ redef fun +(offset) `{ return self + offset; `}
+end
+
+# Wrapper around an array of `NativeString` in C (`char**`) with length and destroy state.
+class CNativeStringArray
+ super CArray[NativeString]
+
+ redef type NATIVE: NativeCStringArray
+
+ # Initialize a new NativeCStringArray of `size` elements.
+ init(size: Int) is old_style_init do
+ native_array = new NativeCStringArray(size)
+ super size
+ end
+
+ # Create from an `SequenceRead[NativeString]`
+ new from(array: SequenceRead[NativeString])
+ do
+ var carray = new CNativeStringArray(array.length)
+ for i in array.length.times do
+ carray[i] = array[i]
+ end
+ return carray