Alien-SVN
view release on metacpan or search on metacpan
src/subversion/build/generator/swig/header_wrappers.py view on Meta::CPAN
r'\(([^)]+)\);');
"""Regular expression for parsing batons"""
_re_batons = re.compile(r'void\s*\*\s*(\w*baton\w*)');
"""Regular expression for parsing parameter names from a parameter list"""
_re_param_names = re.compile(r'\b(\w+)\s*\)*\s*(?:,|$)')
"""Regular expression for parsing comments"""
_re_comments = re.compile(r'/\*.*?\*/')
def _write_swig_interface_file(self, base_fname, batons, includes, structs,
callbacks):
"""Convert a header file into a SWIG header file"""
# Calculate output filename from base filename
output_fname = os.path.join(self.proxy_dir,
self.proxy_filename(base_fname))
# Open a temporary output file
self.ofile = tempfile.TemporaryFile(dir=self.proxy_dir)
self.ofile.write('/* Proxy classes for %s\n' % base_fname)
self.ofile.write(' * DO NOT EDIT -- AUTOMATICALLY GENERATED\n')
self.ofile.write(' * BY build/generator/swig/header_wrappers.py */\n')
# Write list of structs for which we shouldn't define constructors
# by default
self._write_nodefault_calls(structs)
# Write typemaps for the callbacks
self._write_callback_typemaps(callbacks)
# Write typemaps for the batons
self._write_baton_typemaps(batons)
# Write includes into the SWIG interface file
self._write_includes(includes, base_fname)
# Write proxy definitions into the SWIG interface file
self._write_proxy_definitions(structs)
# Write callback definitions into the SWIG interface file
self._write_callbacks(callbacks)
# Copy the temporary file over to the result file.
# Ideally we'd simply rename the temporary file to output_fname,
# but NamedTemporaryFile() only supports its 'delete' parameter
# in python 2.6 and above, and renaming the file while it's opened
# exclusively is probably not a good idea.
outputfile = open(output_fname, 'w')
self.ofile.seek(0)
shutil.copyfileobj(self.ofile, outputfile)
# Close our temporary file.
# It will also be deleted automatically.
self.ofile.close()
# Close our output file, too.
outputfile.close()
def process_header_file(self, fname):
"""Generate a wrapper around a header file"""
# Read the contents of the header file
contents = open(fname).read()
# Remove comments
contents = self._re_comments.sub("", contents)
# Get list of includes
includes = unique(self._re_includes.findall(contents))
# Get list of structs
structs = unique(self._re_structs.findall(contents))
# Get list of batons
batons = unique(self._re_batons.findall(contents))
# Get list of callbacks
callbacks = (self._re_struct_callbacks.findall(contents) +
self._re_typed_callbacks.findall(contents))
# Get the location of the output file
base_fname = os.path.basename(fname)
# Write the SWIG interface file
self._write_swig_interface_file(base_fname, batons, includes, structs,
callbacks)
def write(self):
"""Generate wrappers for all header files"""
for fname in self.header_files:
self.process_header_file(fname)
if __name__ == "__main__":
if len(sys.argv) < 3:
print("""Usage: %s build.conf swig [ subversion/include/header_file.h ]
Generates SWIG proxy wrappers around Subversion header files. If no header
files are specified, generate wrappers for subversion/include/*.h. """ % \
os.path.basename(sys.argv[0]))
else:
gen = Generator(sys.argv[1], sys.argv[2])
if len(sys.argv) > 3:
for fname in sys.argv[3:]:
gen.process_header_file(fname)
else:
gen.write()
( run in 0.372 second using v1.01-cache-2.11-cpan-501a3233654 )