mirror of https://github.com/swig/swig.git
69 lines
2.1 KiB
OpenEdge ABL
69 lines
2.1 KiB
OpenEdge ABL
/* Check that SWIG_FromUint8Array and SWIG_ToUint8Array reach the C
|
|
compiler rather than being consumed by the SWIG preprocessor.
|
|
|
|
Only the jsc and napi libraries define these as macros - for node and v8 they
|
|
are functions, so the check only bites for jsc and napi. The functions are
|
|
used by JavaScript for the Uint8Array type. */
|
|
|
|
%module javascript_uint8array_fragment
|
|
|
|
/* Include JavaScript Uint8Array functions */
|
|
%include <javascriptuint8array.swg>
|
|
|
|
%wrapper %{
|
|
/* Code inserted verbatim like this is not macro expanded by SWIG, so
|
|
SWIG_FromUint8Array and SWIG_ToUint8Array have to be usable by the C compiler.
|
|
The typemaps go through these aliases so that %set_output and other SWIG macros
|
|
can still be used - these are not expanded in a verbatim block either. */
|
|
#define swig_fromuint8array(a, b, c, d) SWIG_FromUint8Array(a, b, c, d)
|
|
#define swig_touint8array(a, b) SWIG_ToUint8Array(a, b)
|
|
%}
|
|
|
|
%typemap(in,fragment="SWIG_FromUint8Array") (const void *data, size_t len) (void *buf = NULL, int alloc = 0) {
|
|
size_t len = 0;
|
|
int res = swig_fromuint8array($input, &buf, &len, &alloc);
|
|
if (!SWIG_IsOK(res)) {
|
|
%argument_fail(res,"$type",$symname, $argnum);
|
|
}
|
|
$1 = %reinterpret_cast(buf, $1_ltype);
|
|
$2 = %numeric_cast(len, $2_ltype);
|
|
}
|
|
|
|
%typemap(freearg,noblock=1,match="in") (const void *data, size_t len) {
|
|
if (alloc$argnum == SWIG_NEWOBJ) {
|
|
%delete_array((%reinterpret_cast(buf$argnum, unsigned char *)));
|
|
}
|
|
}
|
|
|
|
%typemap(out,noblock=1,fragment="SWIG_ToUint8Array") struct data_t {
|
|
%set_output(swig_touint8array($1.data, $1.len));
|
|
}
|
|
|
|
/* Only the functions are wrapped - the struct is deliberately not exposed, so
|
|
that the in and out typemaps above are the only thing under test. */
|
|
%{
|
|
|
|
struct data_t {
|
|
size_t len;
|
|
void* data;
|
|
};
|
|
|
|
struct data_t getData()
|
|
{
|
|
static struct data_t r = { 5, (void*)"\x1\x2\x3\x4\x5" };
|
|
return r;
|
|
}
|
|
|
|
int verifyData(const void *data, size_t len) {
|
|
unsigned char *ptr = (unsigned char *)data;
|
|
return ptr != NULL && len == 5 &&
|
|
ptr[0] == 5 && ptr[1] == 4 &&
|
|
ptr[2] == 3 && ptr[3] == 2 &&
|
|
ptr[4] == 1;
|
|
}
|
|
|
|
%}
|
|
|
|
struct data_t getData();
|
|
int verifyData(const void *data, size_t len);
|