padding and use t_output_helper. git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@7468 626c5289-ae23-0410-ae9c-e8d60b6d4f22
180 lines
4.8 KiB
OpenEdge ABL
180 lines
4.8 KiB
OpenEdge ABL
//
|
|
// SWIG Typemap library
|
|
// Richard Palmer
|
|
// Oct 3, 2001
|
|
//
|
|
// PHP4 implementation
|
|
//
|
|
//
|
|
// This library provides standard typemaps for modifying SWIG's behavior.
|
|
// With enough entries in this file, I hope that very few people actually
|
|
// ever need to write a typemap.
|
|
//
|
|
|
|
//
|
|
// Define macros to define the following typemaps:
|
|
//
|
|
// TYPE *INPUT. Argument is passed in as native variable by value.
|
|
// TYPE *OUTPUT. Argument is returned as an array from the function call.
|
|
// TYPE *INOUT. Argument is passed in by value, and out as part of returned list
|
|
// TYPE *REFERENCE. Argument is passed in as native variable with value
|
|
// semantics. Variable value is changed with result.
|
|
// Use like this:
|
|
// int foo(int *REFERENCE);
|
|
//
|
|
// $a = 0;
|
|
// $rc = foo($a);
|
|
//
|
|
// Even though $a looks like it's passed by value,
|
|
// it's value can be changed by foo().
|
|
//
|
|
%define double_typemap(TYPE)
|
|
%typemap(in) TYPE *INPUT(TYPE temp)
|
|
{
|
|
convert_to_double_ex($input);
|
|
temp = (TYPE) Z_DVAL_PP($input);
|
|
$1 = &temp;
|
|
}
|
|
%typemap(argout) TYPE *INPUT "";
|
|
%typemap(in,numinputs=0) TYPE *OUTPUT(TYPE temp)
|
|
{
|
|
$1 = &temp;
|
|
}
|
|
%typemap(argout,fragment="t_output_helper") TYPE *OUTPUT
|
|
{
|
|
zval *o;
|
|
MAKE_STD_ZVAL(o);
|
|
ZVAL_DOUBLE(o,temp$argnum);
|
|
t_output_helper( &$result, o );
|
|
}
|
|
%typemap(in) TYPE *REFERENCE (TYPE dvalue)
|
|
{
|
|
convert_to_double_ex($input);
|
|
dvalue = (TYPE) (*$input)->value.dval;
|
|
$1 = &dvalue;
|
|
}
|
|
%typemap(argout) TYPE *REFERENCE
|
|
{
|
|
$1->value.dval = (double)(lvalue$argnum);
|
|
$1->type = IS_DOUBLE;
|
|
}
|
|
%enddef
|
|
|
|
%define int_typemap(TYPE)
|
|
%typemap(in) TYPE *INPUT(TYPE temp)
|
|
{
|
|
convert_to_long_ex($input);
|
|
temp = (TYPE) Z_LVAL_PP($input);
|
|
$1 = &temp;
|
|
}
|
|
%typemap(argout) TYPE *INPUT "";
|
|
%typemap(in,numinputs=0) TYPE *OUTPUT(TYPE temp)
|
|
{
|
|
$1 = &temp;
|
|
}
|
|
%typemap(argout,fragment="t_output_helper") TYPE *OUTPUT
|
|
{
|
|
zval *o;
|
|
MAKE_STD_ZVAL(o);
|
|
ZVAL_LONG(o,temp$argnum);
|
|
t_output_helper( &$result, o );
|
|
}
|
|
%typemap(in) TYPE *REFERENCE (TYPE lvalue)
|
|
{
|
|
convert_to_long_ex($input);
|
|
lvalue = (TYPE) (*$input)->value.lval;
|
|
$1 = &lvalue;
|
|
}
|
|
%typemap(argout) TYPE *REFERENCE
|
|
{
|
|
|
|
(*$arg)->value.lval = (long)(lvalue$argnum);
|
|
(*$arg)->type = IS_LONG;
|
|
}
|
|
%enddef
|
|
|
|
double_typemap(float);
|
|
double_typemap(double);
|
|
|
|
int_typemap(int);
|
|
int_typemap(short);
|
|
int_typemap(long);
|
|
int_typemap(unsigned int);
|
|
int_typemap(unsigned short);
|
|
int_typemap(unsigned long);
|
|
int_typemap(unsigned char);
|
|
|
|
%typemap(in) float *INOUT = float *INPUT;
|
|
%typemap(in) double *INOUT = double *INPUT;
|
|
|
|
%typemap(in) int *INOUT = int *INPUT;
|
|
%typemap(in) short *INOUT = short *INPUT;
|
|
%typemap(in) long *INOUT = long *INPUT;
|
|
%typemap(in) unsigned *INOUT = unsigned *INPUT;
|
|
%typemap(in) unsigned short *INOUT = unsigned short *INPUT;
|
|
%typemap(in) unsigned long *INOUT = unsigned long *INPUT;
|
|
%typemap(in) unsigned char *INOUT = unsigned char *INPUT;
|
|
|
|
%typemap(argout) float *INOUT = float *OUTPUT;
|
|
%typemap(argout) double *INOUT= double *OUTPUT;
|
|
|
|
%typemap(argout) int *INOUT = int *OUTPUT;
|
|
%typemap(argout) short *INOUT = short *OUTPUT;
|
|
%typemap(argout) long *INOUT= long *OUTPUT;
|
|
%typemap(argout) unsigned short *INOUT= unsigned short *OUTPUT;
|
|
%typemap(argout) unsigned long *INOUT = unsigned long *OUTPUT;
|
|
%typemap(argout) unsigned char *INOUT = unsigned char *OUTPUT;
|
|
|
|
%typemap(in) char INPUT[ANY] ( char temp[$1_dim0] )
|
|
{
|
|
convert_to_string_ex($input);
|
|
char *val = Z_LVAL_PP($input);
|
|
strncpy(temp,val,$1_dim0);
|
|
$1 = temp;
|
|
}
|
|
%typemap(in,numinputs=0) char OUTPUT[ANY] ( char temp[$1_dim0] )
|
|
{
|
|
$1 = temp;
|
|
}
|
|
%typemap(argout) char OUTPUT[ANY]
|
|
{
|
|
zval *o;
|
|
MAKE_STD_ZVAL(o);
|
|
ZVAL_STRINGL(o,temp$argnum,$1_dim0);
|
|
t_output_helper( &$result, o );
|
|
}
|
|
|
|
%typemap(in,numinputs=0) void **OUTPUT (int force),
|
|
void *&OUTPUT (int force)
|
|
{
|
|
/* If they pass NULL by reference, make it into a void*
|
|
This bit should go in arginit if arginit support init-ing scripting args */
|
|
if(SWIG_ConvertPtr(*$input, (void **) &$1, $1_descriptor, 0) < 0) {
|
|
/* So... we didn't get a ref or ptr, but we'll accept NULL by reference */
|
|
if ((*$input)->type==IS_NULL && PZVAL_IS_REF(*$input)) {
|
|
#ifdef __cplusplus
|
|
ptr=new $*1_ltype;
|
|
#else
|
|
ptr=($*1_ltype) calloc(1,sizeof($*1_ltype));
|
|
#endif
|
|
$1=&ptr;
|
|
/* have to passback arg$arg too */
|
|
force=1;
|
|
} else { /* wasn't a pre/ref/thing, OR anything like an int thing */
|
|
force=0;
|
|
SWIG_PHP_Error(E_ERROR, "Type error in argument $arg of $symname.");
|
|
}
|
|
} else force=0;
|
|
}
|
|
|
|
%typemap(argout) void **OUTPUT,
|
|
void *&OUTPUT
|
|
{
|
|
if (force$argnum) { /* pass back arg$argnum through params ($arg) if we can */
|
|
if(! PZVAL_IS_REF(*$arg)) {
|
|
SWIG_PHP_Error(E_WARNING, "Parameter $argnum of $symname wasn't passed by reference");
|
|
} else {
|
|
SWIG_SetPointerZval(*$arg, (void *) ptr$argnum, $*1_descriptor, 1);
|
|
}
|
|
}
|
|
}
|