2
# -*- coding: UTF-8 -*-
4
# $Id: patch_swig_output.py,v 1.13 2005/02/08 11:35:14 fpeters Exp $
6
# SWIG based PHP binding for Lasso Library
8
# Copyright (C) 2004, 2005 Entr'ouvert
9
# http://lasso.entrouvert.org
11
# Authors: See AUTHORS file in top-level directory.
13
# This program is free software; you can redistribute it and/or modify
14
# it under the terms of the GNU General Public License as published by
15
# the Free Software Foundation; either version 2 of the License, or
16
# (at your option) any later version.
18
# This program is distributed in the hope that it will be useful,
19
# but WITHOUT ANY WARRANTY; without even the implied warranty of
20
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21
# GNU General Public License for more details.
23
# You should have received a copy of the GNU General Public License
24
# along with this program; if not, write to the Free Software
25
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
28
"""Correct SWIG output for PHP binding.
30
The PHP binding of SWIG version 1.3.22 has several bugs:
32
(1) It wraps NULL pointers into non NULL PHP objects.
34
(2) It doesn't handle dynamic cast of function results well: After the C object is dynamically
35
casted, it creates a statically casted PHP object.
37
(3) It handles badly optional arguments of methods.
39
This program corrects (1) and (2), by replacing things like:
41
ZVAL_NULL(return_value);
43
swig_type_info *ty = SWIG_TypeDynamicCast(SWIGTYPE_p_LassoXXX, (void **) &result);
44
SWIG_SetPointerZval(return_value, (void *)result, ty, 1);
47
/* Wrap this return value */
49
/* NATIVE Constructor, use this_ptr */
50
zval *_cPtr; MAKE_STD_ZVAL(_cPtr);
51
*_cPtr = *return_value;
52
INIT_ZVAL(*return_value);
53
add_property_zval(this_ptr,"_cPtr",_cPtr);
54
} else if (! this_ptr) {
55
/* ALTERNATIVE Constructor, make an object wrapper */
59
*_cPtr = *return_value;
60
INIT_ZVAL(*return_value);
61
object_init_ex(obj,ptr_ce_swig_LassoXXX);
62
add_property_zval(obj,"_cPtr",_cPtr);
67
ZVAL_NULL(return_value);
69
swig_type_info *ty = SWIG_TypeDynamicCast(SWIGTYPE_p_LassoXXX, (void **) &result);
70
SWIG_SetPointerZval(return_value, (void *)result, ty, 1);
71
/* Wrap this return value */
73
/* NATIVE Constructor, use this_ptr */
74
zval *_cPtr; MAKE_STD_ZVAL(_cPtr);
75
*_cPtr = *return_value;
76
INIT_ZVAL(*return_value);
77
add_property_zval(this_ptr,"_cPtr",_cPtr);
78
} else if (! this_ptr) {
79
/* ALTERNATIVE Constructor, make an object wrapper */
83
*_cPtr = *return_value;
84
INIT_ZVAL(*return_value);
85
object_init_ex(obj,get_node_info_with_swig(ty)->php);
86
add_property_zval(obj,"_cPtr",_cPtr);
91
ZVAL_NULL(return_value);
93
swig_type_info *ty = SWIG_TypeDynamicCast(SWIGTYPE_p_LassoXXX, (void **) &result);
94
SWIG_SetPointerZval(return_value, (void *)result, ty, 0);
97
/* Wrap this return value */
99
/* ALTERNATIVE Constructor, make an object wrapper */
102
MAKE_STD_ZVAL(_cPtr);
103
*_cPtr = *return_value;
104
INIT_ZVAL(*return_value);
105
object_init_ex(obj,ptr_ce_swig_LassoXXX);
106
add_property_zval(obj,"_cPtr",_cPtr);
111
ZVAL_NULL(return_value);
113
swig_type_info *ty = SWIG_TypeDynamicCast(SWIGTYPE_p_LassoXXX, (void **) &result);
114
SWIG_SetPointerZval(return_value, (void *)result, ty, 0);
115
/* Wrap this return value */
117
/* ALTERNATIVE Constructor, make an object wrapper */
120
MAKE_STD_ZVAL(_cPtr);
121
*_cPtr = *return_value;
122
INIT_ZVAL(*return_value);
123
object_init_ex(obj,get_node_info_with_swig(ty)->php);
124
add_property_zval(obj,"_cPtr",_cPtr);
128
This program corrects (3), by replacing things like:
129
if(zend_get_parameters_array_ex(arg_count-argbase,args)!=SUCCESS)
131
if(zend_get_parameters_array_ex(arg_count,args)!=SUCCESS)
135
if(arg_count > 1 - argbase) {
141
wrap = sys.stdin.read()
147
/* Wrap this return value */
155
j = wrap.find(end, i) + len(end)
157
segment = segment.replace(begin, """
158
/* Wrap this return value */
160
segment = segment.replace(end, """
164
wrap = '%s%s%s' % (wrap[:i], segment, wrap[j:])
165
i = wrap.find(begin, i + len(segment))
168
begin = 'swig_type_info *ty = SWIG_TypeDynamicCast('
175
j = wrap.find(end, i) + len(end)
176
if j < len(end): # bails out if not found
179
x = segment.find('object_init_ex(obj,') + len('object_init_ex(obj,')
180
y = segment.find(')', x)
181
segment = '%s%s%s' % (segment[:x], 'get_node_info_with_swig(ty)->php', segment[y:])
182
wrap = '%s%s%s' % (wrap[:i], segment, wrap[j:])
183
i = wrap.find(begin, i + len(segment))
186
wrap = wrap.replace('if(zend_get_parameters_array_ex(arg_count-argbase,args)!=SUCCESS)',
187
'if(zend_get_parameters_array_ex(arg_count,args)!=SUCCESS)')
189
wrap = wrap.replace('if(arg_count > %d) {' % i, 'if(arg_count > %d - argbase) {' % i)
192
wrap = re.sub(r'zend_register_internal_class_ex(.*)NULL,NULL\)',
193
r'zend_register_internal_class_ex\1NULL,NULL TSRMLS_CC)', wrap)
195
wrap = re.sub('zend_rsrc_list_get_rsrc_type(.*)lval',
196
r'zend_rsrc_list_get_rsrc_type\1lval TSRMLS_CC', wrap)
198
wrap = wrap.replace('int argbase=0 ;\n \n \n', 'int argbase=0 ;\n TSRMLS_FETCH();\n\n')
199
wrap = wrap.replace('zval *return_value=&_return_value;',
200
'zval *return_value=&_return_value;\n TSRMLS_FETCH();\n')
202
wrap = wrap.replace('int argbase=0 ;\n \n {\n node_info *info, *super;\n%s' % (' \n'*8),
203
'int argbase=0 ;\n\n TSRMLS_FETCH();\n {\n node_info *info, *super;\n')