# See the License for the specific language governing permissions and
# limitations under the License.
-# Utilities and performant structure for the FFI with C
+# Structures and services for compatibility with the C language
module c
-import standard
-intrude import standard::collection::array
+
+import core
+intrude import core::collection::array
# A thin wrapper around a `NativeCArray` adding length information
abstract class CArray[E]
super size
end
- # Build from an `Array[Int]`
- new from(array: Array[Int])
+ # Create from an `SequenceRead[Int]`
+ new from(array: SequenceRead[Int])
do
var carray = new CIntArray(array.length)
for i in array.length.times do
# Wrapper around an array of `unsigned char` in C (`unsigned char*`) with length and destroy state
class CByteArray
- super CArray[Int]
+ super CArray[Byte]
redef type NATIVE: NativeCByteArray
# Allocate a new array of `size`
super size
end
- # Build from an `Array[Int]`
- new from(array: Array[Int])
+ # Create from a `SequenceRead[Byte]`
+ new from(array: SequenceRead[Byte])
do
var carray = new CByteArray(array.length)
for i in array.length.times do
end
return carray
end
+
+ # Safely move `n` bytes from `dst_offset` to `src_offset`, inside this array
+ #
+ # Require: all arguments greater than 0 and ranges within `length`
+ fun move(dst_offset, src_offset, n: Int)
+ do
+ assert dst_offset >= 0 and src_offset >= 0 and n >= 0
+ assert dst_offset + n <= length
+ assert src_offset + n <= length
+
+ native_array.move(dst_offset, src_offset, n)
+ end
end
# An array of `unsigned char` in C (`unsigned char*`)
extern class NativeCByteArray `{ unsigned char* `}
super NativeCArray
- redef type E: Int
+ redef type E: Byte
# Allocate a new array of `size`
new(size: Int) `{ return calloc(size, sizeof(unsigned char)); `}
redef fun []=(index, val) `{ self[index] = val; `}
redef fun +(offset) `{ return self + offset; `}
+
+ # Move `n` bytes from `dst_offset` to `src_offset`
+ fun move(dst_offset, src_offset, n: Int) `{
+ memmove(self+dst_offset, self+src_offset, n);
+ `}
end
# Wrapper around an array of `NativeString` in C (`char**`) with length and destroy state.
super size
end
- # Build from an `Array[NativeString]`
- new from(array: Array[NativeString])
+ # Create from an `SequenceRead[NativeString]`
+ new from(array: SequenceRead[NativeString])
do
var carray = new CNativeStringArray(array.length)
for i in array.length.times do