55 lines
1.7 KiB
Python
55 lines
1.7 KiB
Python
import os
|
|
|
|
|
|
def parse_distributions_h(ffi, inc_dir):
|
|
"""
|
|
Parse distributions.h located in inc_dir for CFFI, filling in the ffi.cdef
|
|
|
|
Read the function declarations without the "#define ..." macros that will
|
|
be filled in when loading the library.
|
|
"""
|
|
|
|
with open(os.path.join(inc_dir, 'random', 'bitgen.h')) as fid:
|
|
s = []
|
|
for line in fid:
|
|
# massage the include file
|
|
if line.strip().startswith('#'):
|
|
continue
|
|
s.append(line)
|
|
ffi.cdef('\n'.join(s))
|
|
|
|
with open(os.path.join(inc_dir, 'random', 'distributions.h')) as fid:
|
|
s = []
|
|
in_skip = 0
|
|
ignoring = False
|
|
for line in fid:
|
|
# check for and remove extern "C" guards
|
|
if ignoring:
|
|
if line.strip().startswith('#endif'):
|
|
ignoring = False
|
|
continue
|
|
if line.strip().startswith('#ifdef __cplusplus'):
|
|
ignoring = True
|
|
|
|
# massage the include file
|
|
if line.strip().startswith('#'):
|
|
continue
|
|
|
|
# skip any inlined function definition
|
|
# which starts with 'static inline xxx(...) {'
|
|
# and ends with a closing '}'
|
|
if line.strip().startswith('static inline'):
|
|
in_skip += line.count('{')
|
|
continue
|
|
elif in_skip > 0:
|
|
in_skip += line.count('{')
|
|
in_skip -= line.count('}')
|
|
continue
|
|
|
|
# replace defines with their value or remove them
|
|
line = line.replace('DECLDIR', '')
|
|
line = line.replace('RAND_INT_TYPE', 'int64_t')
|
|
s.append(line)
|
|
ffi.cdef('\n'.join(s))
|
|
|