~ubuntu-branches/ubuntu/gutsy/lasso/gutsy-security

« back to all changes in this revision

Viewing changes to php/patch_swig_output.py

  • Committer: Bazaar Package Importer
  • Author(s): Stephan Hermann
  • Date: 2005-09-16 02:16:49 UTC
  • mfrom: (1.1.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20050916021649-lr5tuka6pfmmks44
Tags: 0.6.2-3ubuntu1
* debian/control: removed hardcoded php dependency, added php:Depends
  substvar
* debian/rules: added phpapiver, added substitution of php:Depends

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#! /usr/bin/env python
 
2
# -*- coding: UTF-8 -*-
 
3
#
 
4
# $Id: patch_swig_output.py,v 1.13 2005/02/08 11:35:14 fpeters Exp $
 
5
#
 
6
# SWIG based PHP binding for Lasso Library
 
7
#
 
8
# Copyright (C) 2004, 2005 Entr'ouvert
 
9
# http://lasso.entrouvert.org
 
10
#
 
11
# Authors: See AUTHORS file in top-level directory.
 
12
#
 
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.
 
17
 
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.
 
22
 
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
 
26
 
 
27
 
 
28
"""Correct SWIG output for PHP binding.
 
29
 
 
30
The PHP binding of SWIG version 1.3.22 has several bugs:
 
31
 
 
32
(1) It wraps NULL pointers into non NULL PHP objects.
 
33
 
 
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.
 
36
 
 
37
(3) It handles badly optional arguments of methods.
 
38
 
 
39
This program corrects (1) and (2), by replacing things like:
 
40
    if (!result) {
 
41
        ZVAL_NULL(return_value);
 
42
    } else {
 
43
        swig_type_info *ty = SWIG_TypeDynamicCast(SWIGTYPE_p_LassoXXX, (void **) &result);
 
44
        SWIG_SetPointerZval(return_value, (void *)result, ty, 1);
 
45
    }
 
46
 
 
47
    /* Wrap this return value */
 
48
    if (this_ptr) {
 
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 */
 
56
        zval *obj, *_cPtr;
 
57
        MAKE_STD_ZVAL(obj);
 
58
        MAKE_STD_ZVAL(_cPtr);
 
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);
 
63
        *return_value=*obj;
 
64
    }
 
65
with:
 
66
    if (!result) {
 
67
        ZVAL_NULL(return_value);
 
68
    } else {
 
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 */
 
72
    if (this_ptr) {
 
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 */
 
80
        zval *obj, *_cPtr;
 
81
        MAKE_STD_ZVAL(obj);
 
82
        MAKE_STD_ZVAL(_cPtr);
 
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);
 
87
        *return_value=*obj;
 
88
    }}
 
89
and
 
90
    if (!result) {
 
91
        ZVAL_NULL(return_value);
 
92
    } else {
 
93
        swig_type_info *ty = SWIG_TypeDynamicCast(SWIGTYPE_p_LassoXXX, (void **) &result);
 
94
        SWIG_SetPointerZval(return_value, (void *)result, ty, 0);
 
95
    }
 
96
 
 
97
    /* Wrap this return value */
 
98
    {
 
99
        /* ALTERNATIVE Constructor, make an object wrapper */
 
100
        zval *obj, *_cPtr;
 
101
        MAKE_STD_ZVAL(obj);
 
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);
 
107
        *return_value=*obj;
 
108
    }
 
109
with:
 
110
    if (!result) {
 
111
        ZVAL_NULL(return_value);
 
112
    } else {
 
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 */
 
116
    {
 
117
        /* ALTERNATIVE Constructor, make an object wrapper */
 
118
        zval *obj, *_cPtr;
 
119
        MAKE_STD_ZVAL(obj);
 
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);
 
125
        *return_value=*obj;
 
126
    }}
 
127
 
 
128
This program corrects (3), by replacing things like:
 
129
    if(zend_get_parameters_array_ex(arg_count-argbase,args)!=SUCCESS)
 
130
with:
 
131
    if(zend_get_parameters_array_ex(arg_count,args)!=SUCCESS)
 
132
and by replacing:
 
133
    if(arg_count > 1) {
 
134
with:
 
135
    if(arg_count > 1 - argbase) {
 
136
"""
 
137
 
 
138
import re
 
139
import sys
 
140
 
 
141
wrap = sys.stdin.read()
 
142
 
 
143
# (1)
 
144
begin = """
 
145
    }
 
146
    
 
147
    /* Wrap this return value */
 
148
"""
 
149
end = """
 
150
        *return_value=*obj;
 
151
    }
 
152
"""
 
153
i = wrap.find(begin)
 
154
while i >= 0:
 
155
    j = wrap.find(end, i) + len(end)
 
156
    segment = wrap[i:j]
 
157
    segment = segment.replace(begin, """
 
158
    /* Wrap this return value */
 
159
""")
 
160
    segment = segment.replace(end, """
 
161
        *return_value=*obj;
 
162
    }}
 
163
""")
 
164
    wrap = '%s%s%s' % (wrap[:i], segment, wrap[j:])
 
165
    i = wrap.find(begin, i + len(segment))
 
166
 
 
167
# (2)
 
168
begin = 'swig_type_info *ty = SWIG_TypeDynamicCast('
 
169
end = """
 
170
        *return_value=*obj;
 
171
    }}
 
172
"""
 
173
i = wrap.find(begin)
 
174
while i >= 0:
 
175
    j = wrap.find(end, i) + len(end)
 
176
    if j < len(end): # bails out if not found
 
177
        break
 
178
    segment = wrap[i:j]
 
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))
 
184
 
 
185
# (3)
 
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)')
 
188
for i in range(10):
 
189
    wrap = wrap.replace('if(arg_count > %d) {' % i, 'if(arg_count > %d - argbase) {' % i)
 
190
 
 
191
 
 
192
wrap = re.sub(r'zend_register_internal_class_ex(.*)NULL,NULL\)',
 
193
    r'zend_register_internal_class_ex\1NULL,NULL TSRMLS_CC)',  wrap)
 
194
 
 
195
wrap = re.sub('zend_rsrc_list_get_rsrc_type(.*)lval',
 
196
    r'zend_rsrc_list_get_rsrc_type\1lval TSRMLS_CC', wrap)
 
197
 
 
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')
 
201
 
 
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')
 
204
 
 
205
print wrap