コード例 #1
0
def preprocess_source(source, filename=None, include_dirs=[]):
    """
	``preprocess_source`` run the C preprocessor on the given source or source filename.

	:param str source: source to pre-process
	:param str filename: optional filename to pre-process
	:param list(str) include_dirs: list of string directories to use as include directories.
	:return: returns a tuple of (preprocessed_source, error_string)
	:rtype: tuple(str,str)
	:Example:

		>>> source = "#define TEN 10\\nint x[TEN];\\n"
		>>> preprocess_source(source)
		('#line 1 "input"\\n\\n#line 2 "input"\\n int x [ 10 ] ;\\n', '')
		>>>
	"""
    if filename is None:
        filename = "input"
    dir_buf = (ctypes.c_char_p * len(include_dirs))()
    for i in range(0, len(include_dirs)):
        dir_buf[i] = include_dirs[i].encode('charmap')
    output = ctypes.c_char_p()
    errors = ctypes.c_char_p()
    result = core.BNPreprocessSource(source, filename, output, errors, dir_buf,
                                     len(include_dirs))
    output_str = output.value
    error_str = errors.value
    core.BNFreeString(ctypes.cast(output, ctypes.POINTER(ctypes.c_byte)))
    core.BNFreeString(ctypes.cast(errors, ctypes.POINTER(ctypes.c_byte)))
    if result:
        return (output_str, error_str)
    return (None, error_str)
コード例 #2
0
def preprocess_source(
        source: str,
        filename: str = None,
        include_dirs: Optional[List[str]] = None) -> Tuple[Optional[str], str]:
    """
	``preprocess_source`` run the C preprocessor on the given source or source filename.

	:param str source: source to pre-process
	:param str filename: optional filename to pre-process
	:param include_dirs: list of string directories to use as include directories.
	:type include_dirs: list(str)
	:return: returns a tuple of (preprocessed_source, error_string)
	:rtype: tuple(str,str)
	:Example:

		>>> source = "#define TEN 10\\nint x[TEN];\\n"
		>>> preprocess_source(source)
		('#line 1 "input"\\n\\n#line 2 "input"\\n int x [ 10 ] ;\\n', '')
		>>>
	"""
    if filename is None:
        filename = "input"
    if include_dirs is None:
        include_dirs = []
    dir_buf = (ctypes.c_char_p * len(include_dirs))()
    for i in range(0, len(include_dirs)):
        dir_buf[i] = include_dirs[i].encode('charmap')
    output = ctypes.c_char_p()
    errors = ctypes.c_char_p()
    result = core.BNPreprocessSource(source, filename, output, errors, dir_buf,
                                     len(include_dirs))
    assert output.value is not None
    assert errors.value is not None
    output_str = output.value.decode('utf-8')
    error_str = errors.value.decode('utf-8')
    core.free_string(output)
    core.free_string(errors)
    if result:
        return output_str, error_str
    return None, error_str