Rand Stats

NativeHelpers::CBuffer

github:scovit

Build Status

NAME

NativeHelpers::CBuffer - A type for storing a caller allocated Buffer

SYNOPSIS

    use NativeHelpers::CBuffer;

   class CBuffer is repr('CPointer') is export

The CBuffer object, is repr("CPointer"), as such, it can be directly used in NativeCall signatures in the place of a Pointer.

DESCRIPTION

NativeHelpers::CBuffer is a convinent way to store buffers and C NULL terminated strings

EXAMPLE

    use NativeHelpers::CBuffer;

    my CBuffer $buf = CBuffer.new(100); # Allocates a buffer of 100 bytes

    sub strncpy(CBuffer, Str, size_t) is native { };
    strncpy($buf, "Uella!", 100);

    say $buf; # Uella!

METHODS

multi new (Int)

    multi method new(Int $size, :$with, :$of-type where { $of-type  $types } = uint8)

Allocates a buffer of size $size elements, of type $of-type and with content a copy of $with. Where $with can be either a Str or a Blob, and $of-type can be any of:

    my $types = (uint8, int8, uint16, int16, uint32, int32, uint64, int64, size_t, long, ulong, longlong, ulonglong);

multi new (Blob)

    multi method new(Blob $init)

Allocates a buffer and store the content of the $init parameter.

multi new (Str)

    multi method new(Str $init)

Allocates a buffer and store the content of the $init parameter as a NULL-terminated ASCII string.

elems

    method elems(--> Int:D)

Return the number of elements stored

bytes

    method bytes(--> Int:D)

Return the number of bytes stored

type

    method type()

Return the type of the elements stored

Blob

    method Blob(--> Blob:D)

Return a copy of the content as a Blob

Pointer

    method Pointer(--> Pointer)

Return the pointer to the allocated buffer of type Pointer[self.type]

Str

    method Str(--> Str:D)

Return a Str with the content decoded as null-terminated ASCII

gist

same as method Str

free

     method free()

Calls free the allocated buffer

BUGS, TODOS and WARNINGS

At the moment, the CBuffer is immutable on the perl side, once created and initialized, it's content can be modified only by C functions. At the moment, the CBuffer is not resizable.

The CBuffer uses NativeCall to allocate memory, beware of not using CBuffer in modules to allocate runtime memory during compilation. In other words, do not use CBuffer.new in BEGIN blocks or constant declarations, any abuse will result in Segmentation faults and/or memory corruption!

In order to declare C-stile #define constants in modules, use perl sub (or macro) instead:

   # the following, is equivalent to
     #define STRING_CONST     "The string"

   sub STRING_CONST is export { CBuffer.new("The string") };

AUTHOR

Vittore F. Scolari vittore.scolari@pasteur.fr

COPYRIGHT AND LICENSE

Copyright 2017 Institut Pasteur

This library is free software; you can redistribute it and/or modify it under the Artistic License 2.0.