#!/usr/bin/env python from __future__ import division, absolute_import, print_function import sys import re import os unused_internal_funcs = ['__Pyx_PrintItem', '__Pyx_PrintNewline', '__Pyx_ReRaise', #'__Pyx_GetExcValue', '__Pyx_ArgTypeTest', '__Pyx_SetVtable', '__Pyx_GetVtable', '__Pyx_CreateClass'] if __name__ == '__main__': # Use cython here so that long docstrings are broken up. # This is needed for some VC++ compilers. os.system('cython mtrand.pyx') mtrand_c = open('mtrand.c', 'r') processed = open('mtrand_pp.c', 'w') unused_funcs_str = '(' + '|'.join(unused_internal_funcs) + ')' uifpat = re.compile(r'static \w+ \*?'+unused_funcs_str+r'.*/\*proto\*/') linepat = re.compile(r'/\* ".*/mtrand.pyx":') for linenum, line in enumerate(mtrand_c): m = re.match(r'^(\s+arrayObject\w*\s*=\s*[(])[(]PyObject\s*[*][)]', line) if m: line = '%s(PyArrayObject *)%s' % (m.group(1), line[m.end():]) m = uifpat.match(line) if m: line = '' m = re.search(unused_funcs_str, line) if m: print("%s was declared unused, but is used at line %d" % (m.group(), linenum+1), file=sys.stderr) line = linepat.sub(r'/* "mtrand.pyx":', line) processed.write(line) mtrand_c.close() processed.close() os.rename('mtrand_pp.c', 'mtrand.c')