Home | History | Annotate | Download | only in php
      1 /* -----------------------------------------------------------------------------
      2  * globalvar.i
      3  *
      4  * Global variables - add the variable to PHP
      5  * ----------------------------------------------------------------------------- */
      6 
      7 %typemap(varinit) char *,
      8                   char []
      9 {
     10   zval *z_var;
     11   MAKE_STD_ZVAL(z_var);
     12   z_var->type = IS_STRING;
     13   if($1) {
     14       z_var->value.str.val = estrdup($1);
     15       z_var->value.str.len = strlen($1);
     16   } else {
     17       z_var->value.str.val = 0;
     18       z_var->value.str.len = 0;
     19   }
     20   zend_hash_add(&EG(symbol_table), (char*)"$1", sizeof("$1"), (void *)&z_var, sizeof(zval *), NULL);
     21 }
     22 
     23 %typemap(varinit) int,
     24 	          unsigned int,
     25                   unsigned short,
     26                   short,
     27                   unsigned short,
     28                   long,
     29                   unsigned long,
     30                   signed char,
     31                   unsigned char,
     32                   enum SWIGTYPE
     33 {
     34   zval *z_var;
     35   MAKE_STD_ZVAL(z_var);
     36   z_var->type = IS_LONG;
     37   z_var->value.lval = $1;
     38   zend_hash_add(&EG(symbol_table), (char*)"$1", sizeof("$1"), (void *)&z_var, sizeof(zval *), NULL);
     39 }
     40 
     41 %typemap(varinit) bool
     42 {
     43   zval *z_var;
     44   MAKE_STD_ZVAL(z_var);
     45   z_var->type = IS_BOOL;
     46   z_var->value.lval = ($1)?1:0;
     47   zend_hash_add(&EG(symbol_table), (char*)"$1", sizeof("$1"), (void *)&z_var, sizeof(zval *), NULL);
     48 }
     49 
     50 %typemap(varinit) float, double
     51 {
     52   zval *z_var;
     53   MAKE_STD_ZVAL(z_var);
     54   z_var->type = IS_DOUBLE;
     55   z_var->value.dval = $1;
     56   zend_hash_add(&EG(symbol_table), (char*)"$1", sizeof("$1"), (void *)&z_var,
     57   sizeof(zval *), NULL);
     58 }
     59 
     60 %typemap(varinit) char
     61 {
     62   zval *z_var;
     63   char c[2];
     64   MAKE_STD_ZVAL(z_var);
     65   c[0] = $1;
     66   c[1] = 0;
     67   z_var->type = IS_STRING;
     68   z_var->value.str.val = estrndup(c, 1);
     69   z_var->value.str.len = 1;
     70   zend_hash_add(&EG(symbol_table), (char*)"$1", sizeof("$1"), (void *)&z_var,
     71   sizeof(zval *), NULL);
     72 }
     73 
     74 %typemap(varinit) SWIGTYPE *, SWIGTYPE []
     75 {
     76   zval *z_var;
     77   MAKE_STD_ZVAL(z_var);
     78   SWIG_SetPointerZval(z_var, (void*)$1, $1_descriptor, 0);
     79   zend_hash_add(&EG(symbol_table), (char*)"$1", sizeof("$1"), (void *)&z_var,
     80   sizeof(zval *), NULL);
     81 }
     82 
     83 %typemap(varinit) SWIGTYPE, SWIGTYPE &
     84 {
     85   zval *z_var;
     86 
     87   MAKE_STD_ZVAL(z_var);
     88   SWIG_SetPointerZval(z_var, (void*)&$1, $&1_descriptor, 0);
     89   zend_hash_add(&EG(symbol_table), (char*)"$1", sizeof("$1"), (void*)&z_var,
     90   sizeof(zval *), NULL);
     91 }
     92 
     93 %typemap(varinit) char [ANY]
     94 {
     95   zval *z_var;
     96   MAKE_STD_ZVAL(z_var);
     97   z_var->type = IS_STRING;
     98   if ($1) {
     99     /* varinit char [ANY] */
    100     ZVAL_STRINGL(z_var,(char*)$1, $1_dim0, 1);
    101   }
    102   zend_hash_add(&EG(symbol_table), (char*)"$1", sizeof("$1"), (void*)&z_var, sizeof(zval *), NULL);
    103 }
    104 
    105 %typemap(varinit, fragment="swig_php_init_member_ptr") SWIGTYPE (CLASS::*)
    106 {
    107   void * p = emalloc(sizeof($1));
    108   memcpy(p, &$1, sizeof($1));
    109   zval * resource;
    110   MAKE_STD_ZVAL(resource);
    111   ZEND_REGISTER_RESOURCE(resource, p, swig_member_ptr);
    112   zend_hash_add(&EG(symbol_table), (char*)"$1", sizeof("$1"), (void*)&resource, sizeof(zval *), NULL);
    113 }
    114 
    115 %typemap(varin) int, unsigned int, short, unsigned short, long, unsigned long, signed char, unsigned char,  enum SWIGTYPE
    116 {
    117   zval **z_var;
    118 
    119   zend_hash_find(&EG(symbol_table), (char*)"$1", sizeof("$1"), (void**)&z_var);
    120   convert_to_long_ex(z_var);
    121   if ($1 != ($1_ltype)((*z_var)->value.lval)) {
    122     $1 = Z_LVAL_PP(z_var);
    123   }
    124 }
    125 
    126 %typemap(varin) bool
    127 {
    128   zval **z_var;
    129 
    130   zend_hash_find(&EG(symbol_table), (char*)"$1", sizeof("$1"), (void**)&z_var);
    131   convert_to_boolean_ex(z_var);
    132   if ($1 != ($1_ltype)((*z_var)->value.lval)) {
    133     $1 = Z_LVAL_PP(z_var);
    134   }
    135 }
    136 
    137 %typemap(varin) double,float
    138 {
    139   zval **z_var;
    140 
    141   zend_hash_find(&EG(symbol_table), (char*)"$1", sizeof("$1"), (void**)&z_var);
    142   convert_to_double_ex(z_var);
    143   if ($1 != ($1_ltype)((*z_var)->value.dval)) {
    144     $1 = Z_DVAL_PP(z_var);
    145   }
    146 }
    147 
    148 %typemap(varin) char
    149 {
    150   zval **z_var;
    151 
    152   zend_hash_find(&EG(symbol_table), (char*)"$1", sizeof("$1"), (void**)&z_var);
    153   convert_to_string_ex(z_var);
    154   if ($1 != *((*z_var)->value.str.val)) {
    155     $1 = *((*z_var)->value.str.val);
    156   }
    157 }
    158 
    159 %typemap(varin) char *
    160 {
    161   zval **z_var;
    162   char *s1;
    163 
    164   zend_hash_find(&EG(symbol_table), (char*)"$1", sizeof("$1"), (void**)&z_var);
    165   convert_to_string_ex(z_var);
    166   s1 = Z_STRVAL_PP(z_var);
    167   if ((s1 == NULL) || ($1 == NULL) || zend_binary_strcmp(s1, strlen(s1), $1, strlen($1))) {
    168     if (s1)
    169       $1 = estrdup(s1);
    170     else
    171       $1 = NULL;
    172   }
    173 }
    174 
    175 
    176 %typemap(varin) SWIGTYPE []
    177 {
    178   zval **z_var;
    179 
    180   zend_hash_find(&EG(symbol_table), (char*)"$1", sizeof("$1"), (void**)&z_var);
    181   if($1) {
    182     SWIG_SetPointerZval(*z_var, (void*)$1, $1_descriptor, $owner);
    183   }
    184 }
    185 
    186 %typemap(varin) char [ANY]
    187 {
    188  zval **z_var;
    189  char *s1;
    190 
    191  zend_hash_find(&EG(symbol_table), (char*)"$1", sizeof("$1"), (void**)&z_var);
    192  s1 = Z_STRVAL_PP(z_var);
    193  if((s1 == NULL) || ($1 == NULL) || zend_binary_strcmp(s1, strlen(s1), $1, strlen($1))) {
    194   if(s1)
    195     strncpy($1, s1, $1_dim0);
    196  }
    197 }
    198 
    199 %typemap(varin) SWIGTYPE
    200 {
    201   zval **z_var;
    202   $&1_ltype _temp;
    203 
    204   zend_hash_find(&EG(symbol_table), (char*)"$1", sizeof("$1"), (void**)&z_var);
    205   if (SWIG_ConvertPtr(*z_var, (void**)&_temp, $&1_descriptor, 0) < 0) {
    206     SWIG_PHP_Error(E_ERROR,"Type error in value of $symname. Expected $&1_descriptor");
    207   }
    208 
    209   $1 = *($&1_ltype)_temp;
    210 
    211 }
    212 
    213 %typemap(varin) SWIGTYPE *, SWIGTYPE &
    214 {
    215   zval **z_var;
    216   $1_ltype _temp;
    217 
    218   zend_hash_find(&EG(symbol_table), (char*)"$1", sizeof("$1"), (void**)&z_var);
    219   if (SWIG_ConvertPtr(*z_var, (void **)&_temp, $1_descriptor, 0) < 0) {
    220     SWIG_PHP_Error(E_ERROR,"Type error in value of $symname. Expected $&1_descriptor");
    221   }
    222 
    223   $1 = ($1_ltype)_temp;
    224 }
    225 
    226 %typemap(varin, fragment="swig_php_init_member_ptr") SWIGTYPE (CLASS::*)
    227 {
    228   zval **z_var;
    229 
    230   zend_hash_find(&EG(symbol_table), (char*)"$1", sizeof("$1"), (void**)&z_var);
    231   void * p = (void*)zend_fetch_resource(*z_var TSRMLS_CC, -1, SWIG_MEMBER_PTR, NULL, 1, swig_member_ptr);
    232   memcpy(&$1, p, sizeof($1));
    233 }
    234 
    235 %typemap(varout) int,
    236                  unsigned int,
    237                  unsigned short,
    238                  short,
    239                  long,
    240                  unsigned long,
    241                  signed char,
    242                  unsigned char,
    243                  enum SWIGTYPE
    244 {
    245   zval **z_var;
    246   zend_hash_find(&EG(symbol_table), (char*)"$1", sizeof("$1"), (void**)&z_var);
    247   if($1 != ($1_ltype)((*z_var)->value.lval)) {
    248     (*z_var)->value.lval = (long)$1;
    249   }
    250 }
    251 
    252 //SAMFIX need to cast zval->type, what if zend-hash_find fails? etc?
    253 %typemap(varout) bool
    254 {
    255   zval **z_var;
    256   zend_hash_find(&EG(symbol_table), (char*)"$1", sizeof("$1"), (void**)&z_var);
    257   if($1 != ($1_ltype)((*z_var)->value.lval)) {
    258     (*z_var)->value.lval = (long)$1;
    259   }
    260 }
    261 
    262 %typemap(varout) double, float
    263 {
    264   zval **z_var;
    265   zend_hash_find(&EG(symbol_table), (char*)"$1", sizeof("$1"), (void**)&z_var);
    266   if($1 != ($1_ltype)((*z_var)->value.dval)) {
    267     (*z_var)->value.dval = (double)$1;
    268   }
    269 }
    270 
    271 %typemap(varout) char
    272 {
    273   zval **z_var;
    274   zend_hash_find(&EG(symbol_table), (char*)"$1", sizeof("$1"), (void**)&z_var);
    275   if($1 != *((*z_var)->value.str.val)) {
    276     char c[2];
    277     efree((*z_var)->value.str.val);
    278     c[0] = $1;
    279     c[1] = 0;
    280     (*z_var)->value.str.val = estrdup(c);
    281   }
    282 }
    283 
    284 %typemap(varout) char *
    285 {
    286   zval **z_var;
    287   char *s1;
    288 
    289   zend_hash_find(&EG(symbol_table), (char*)"$1", sizeof("$1"), (void**)&z_var);
    290   s1 = Z_STRVAL_PP(z_var);
    291   if((s1 == NULL) || ($1 == NULL) || zend_binary_strcmp(s1, strlen(s1), $1, strlen($1) )) {
    292     if(s1)
    293       efree(s1);
    294     if($1) {
    295       (*z_var)->value.str.val = estrdup($1);
    296       (*z_var)->value.str.len = strlen($1) +1;
    297     } else {
    298       (*z_var)->value.str.val = 0;
    299       (*z_var)->value.str.len = 0;
    300     }
    301  }
    302 }
    303 
    304 %typemap(varout) SWIGTYPE
    305 {
    306   zval **z_var;
    307 
    308   zend_hash_find(&EG(symbol_table), (char*)"$1", sizeof("$1"), (void**)&z_var);
    309   SWIG_SetPointerZval(*z_var, (void*)&$1, $&1_descriptor, 0);
    310 }
    311 
    312 %typemap(varout) SWIGTYPE []
    313 {
    314   zval **z_var;
    315 
    316   zend_hash_find(&EG(symbol_table), (char*)"$1", sizeof("$1"), (void**)&z_var);
    317   if($1)
    318     SWIG_SetPointerZval(*z_var, (void*)$1, $1_descriptor, 0);
    319 }
    320 
    321 %typemap(varout) char [ANY]
    322 {
    323   zval **z_var;
    324   char *s1;
    325 deliberate error cos this code looks bogus to me
    326   zend_hash_find(&EG(symbol_table), (char*)"$1", sizeof("$1"), (void**)&z_var);
    327   s1 = Z_STRVAL_PP(z_var);
    328   if((s1 == NULL) || zend_binary_strcmp(s1, strlen(s1), $1, strlen($1))) {
    329     if($1) {
    330       (*z_var)->value.str.val = estrdup($1);
    331       (*z_var)->value.str.len = strlen($1)+1;
    332     } else {
    333       (*z_var)->value.str.val = 0;
    334       (*z_var)->value.str.len = 0;
    335     }
    336   }
    337 }
    338 
    339 %typemap(varout) SWIGTYPE *, SWIGTYPE &
    340 {
    341   zval **z_var;
    342 
    343   zend_hash_find(&EG(symbol_table), (char*)"$1", sizeof("$1"), (void**)&z_var);
    344   SWIG_SetPointerZval(*z_var, (void*)$1, $1_descriptor, 0);
    345 }
    346 
    347 %typemap(varout, fragment="swig_php_init_member_ptr") SWIGTYPE (CLASS::*)
    348 {
    349   void * p = emalloc(sizeof($1));
    350   memcpy(p, &$1, sizeof($1));
    351   zval * resource;
    352   MAKE_STD_ZVAL(resource);
    353   ZEND_REGISTER_RESOURCE(resource, p, swig_member_ptr);
    354   zend_hash_add(&EG(symbol_table), (char*)"$1", sizeof("$1"), (void*)&resource, sizeof(zval *), NULL);
    355 }
    356