| 1 | // |
| 2 | // SWIG Typemap library |
| 3 | // Richard Palmer |
| 4 | // Oct 3, 2001 |
| 5 | // |
| 6 | // PHP4 implementation |
| 7 | // |
| 8 | // |
| 9 | // This library provides standard typemaps for modifying SWIG's behavior. |
| 10 | // With enough entries in this file, I hope that very few people actually |
| 11 | // ever need to write a typemap. |
| 12 | // |
| 13 | |
| 14 | // |
| 15 | // Define macros to define the following typemaps: |
| 16 | // |
| 17 | // TYPE *INPUT. Argument is passed in as native variable by value. |
| 18 | // TYPE *OUTPUT. Argument is returned as an array from the function call. |
| 19 | // TYPE *INOUT. Argument is passed in by value, and out as part of returned list |
| 20 | // TYPE *REFERENCE. Argument is passed in as native variable with value |
| 21 | // semantics. Variable value is changed with result. |
| 22 | // Use like this: |
| 23 | // int foo(int *REFERENCE); |
| 24 | // |
| 25 | // $a = 0; |
| 26 | // $rc = foo($a); |
| 27 | // |
| 28 | // Even though $a looks like it's passed by value, |
| 29 | // it's value can be changed by foo(). |
| 30 | // |
| 31 | %define double_typemap(TYPE) |
| 32 | %typemap(in) TYPE *INPUT(TYPE temp) |
| 33 | { |
| 34 | convert_to_double_ex($input); |
| 35 | temp = (TYPE) Z_DVAL_PP($input); |
| 36 | $1 = &temp; |
| 37 | } |
| 38 | %typemap(argout) TYPE *INPUT ""; |
| 39 | %typemap(in,numinputs=0) TYPE *OUTPUT(TYPE temp) |
| 40 | { |
| 41 | $1 = &temp; |
| 42 | } |
| 43 | %typemap(argout,fragment="t_output_helper") TYPE *OUTPUT |
| 44 | { |
| 45 | zval *o; |
| 46 | MAKE_STD_ZVAL(o); |
| 47 | ZVAL_DOUBLE(o,temp$argnum); |
| 48 | t_output_helper( &$result, o ); |
| 49 | } |
| 50 | %typemap(in) TYPE *REFERENCE (TYPE dvalue) |
| 51 | { |
| 52 | convert_to_double_ex($input); |
| 53 | dvalue = (TYPE) (*$input)->value.dval; |
| 54 | $1 = &dvalue; |
| 55 | } |
| 56 | %typemap(argout) TYPE *REFERENCE |
| 57 | { |
| 58 | $1->value.dval = (double)(lvalue$argnum); |
| 59 | $1->type = IS_DOUBLE; |
| 60 | } |
| 61 | %enddef |
| 62 | |
| 63 | %define int_typemap(TYPE) |
| 64 | %typemap(in) TYPE *INPUT(TYPE temp) |
| 65 | { |
| 66 | convert_to_long_ex($input); |
| 67 | temp = (TYPE) Z_LVAL_PP($input); |
| 68 | $1 = &temp; |
| 69 | } |
| 70 | %typemap(argout) TYPE *INPUT ""; |
| 71 | %typemap(in,numinputs=0) TYPE *OUTPUT(TYPE temp) |
| 72 | { |
| 73 | $1 = &temp; |
| 74 | } |
| 75 | %typemap(argout,fragment="t_output_helper") TYPE *OUTPUT |
| 76 | { |
| 77 | zval *o; |
| 78 | MAKE_STD_ZVAL(o); |
| 79 | ZVAL_LONG(o,temp$argnum); |
| 80 | t_output_helper( &$result, o ); |
| 81 | } |
| 82 | %typemap(in) TYPE *REFERENCE (TYPE lvalue) |
| 83 | { |
| 84 | convert_to_long_ex($input); |
| 85 | lvalue = (TYPE) (*$input)->value.lval; |
| 86 | $1 = &lvalue; |
| 87 | } |
| 88 | %typemap(argout) TYPE *REFERENCE |
| 89 | { |
| 90 | |
| 91 | (*$arg)->value.lval = (long)(lvalue$argnum); |
| 92 | (*$arg)->type = IS_LONG; |
| 93 | } |
| 94 | %enddef |
| 95 | |
| 96 | double_typemap(float); |
| 97 | double_typemap(double); |
| 98 | |
| 99 | int_typemap(int); |
| 100 | int_typemap(short); |
| 101 | int_typemap(long); |
| 102 | int_typemap(unsigned int); |
| 103 | int_typemap(unsigned short); |
| 104 | int_typemap(unsigned long); |
| 105 | int_typemap(unsigned char); |
| 106 | |
| 107 | %typemap(in) float *INOUT = float *INPUT; |
| 108 | %typemap(in) double *INOUT = double *INPUT; |
| 109 | |
| 110 | %typemap(in) int *INOUT = int *INPUT; |
| 111 | %typemap(in) short *INOUT = short *INPUT; |
| 112 | %typemap(in) long *INOUT = long *INPUT; |
| 113 | %typemap(in) unsigned *INOUT = unsigned *INPUT; |
| 114 | %typemap(in) unsigned short *INOUT = unsigned short *INPUT; |
| 115 | %typemap(in) unsigned long *INOUT = unsigned long *INPUT; |
| 116 | %typemap(in) unsigned char *INOUT = unsigned char *INPUT; |
| 117 | |
| 118 | %typemap(argout) float *INOUT = float *OUTPUT; |
| 119 | %typemap(argout) double *INOUT= double *OUTPUT; |
| 120 | |
| 121 | %typemap(argout) int *INOUT = int *OUTPUT; |
| 122 | %typemap(argout) short *INOUT = short *OUTPUT; |
| 123 | %typemap(argout) long *INOUT= long *OUTPUT; |
| 124 | %typemap(argout) unsigned short *INOUT= unsigned short *OUTPUT; |
| 125 | %typemap(argout) unsigned long *INOUT = unsigned long *OUTPUT; |
| 126 | %typemap(argout) unsigned char *INOUT = unsigned char *OUTPUT; |
| 127 | |
| 128 | %typemap(in) char INPUT[ANY] ( char temp[$1_dim0] ) |
| 129 | { |
| 130 | convert_to_string_ex($input); |
| 131 | char *val = Z_LVAL_PP($input); |
| 132 | strncpy(temp,val,$1_dim0); |
| 133 | $1 = temp; |
| 134 | } |
| 135 | %typemap(in,numinputs=0) char OUTPUT[ANY] ( char temp[$1_dim0] ) |
| 136 | { |
| 137 | $1 = temp; |
| 138 | } |
| 139 | %typemap(argout) char OUTPUT[ANY] |
| 140 | { |
| 141 | zval *o; |
| 142 | MAKE_STD_ZVAL(o); |
| 143 | ZVAL_STRINGL(o,temp$argnum,$1_dim0); |
| 144 | t_output_helper( &$result, o ); |
| 145 | } |
| 146 | |
| 147 | %typemap(in,numinputs=0) void **OUTPUT (int force), |
| 148 | void *&OUTPUT (int force) |
| 149 | { |
| 150 | /* If they pass NULL by reference, make it into a void* |
| 151 | This bit should go in arginit if arginit support init-ing scripting args */ |
| 152 | if(SWIG_ConvertPtr(*$input, (void **) &$1, $1_descriptor, 0) < 0) { |
| 153 | /* So... we didn't get a ref or ptr, but we'll accept NULL by reference */ |
| 154 | if ((*$input)->type==IS_NULL && PZVAL_IS_REF(*$input)) { |
| 155 | #ifdef __cplusplus |
| 156 | ptr=new $*1_ltype; |
| 157 | #else |
| 158 | ptr=($*1_ltype) calloc(1,sizeof($*1_ltype)); |
| 159 | #endif |
| 160 | $1=&ptr; |
| 161 | /* have to passback arg$arg too */ |
| 162 | force=1; |
| 163 | } else { /* wasn't a pre/ref/thing, OR anything like an int thing */ |
| 164 | force=0; |
| 165 | SWIG_PHP_Error(E_ERROR, "Type error in argument $arg of $symname."); |
| 166 | } |
| 167 | } else force=0; |
| 168 | } |
| 169 | |
| 170 | %typemap(argout) void **OUTPUT, |
| 171 | void *&OUTPUT |
| 172 | { |
| 173 | if (force$argnum) { /* pass back arg$argnum through params ($arg) if we can */ |
| 174 | if(! PZVAL_IS_REF(*$arg)) { |
| 175 | SWIG_PHP_Error(E_WARNING, "Parameter $argnum of $symname wasn't passed by reference"); |
| 176 | } else { |
| 177 | SWIG_SetPointerZval(*$arg, (void *) ptr$argnum, $*1_descriptor, 1); |
| 178 | } |
| 179 | } |
| 180 | } |