Files
Pierre-Marie de Rodat 60c63ad79f Preprocessing: add handling for the new -e gnatprep switch
(cherry picked from commit 6830a1a07d)
2025-10-21 15:50:26 +02:00

73 lines
2.4 KiB
Plaintext

## vim: ft=makopython
class LineMode(_Enum):
"""
Determine how the preprocessor treats directives and disabled lines in
the output.
``delete_lines``
Just delete these lines: this breaks line number correspondance
between the original source and the preprocessed one. This
corresponds to GNATprep's default mode.
``blank_lines``
Replace these lines with empty lines. This corresponds to GNATprep's
``-b`` option.
``comment_lines``
Preserve these lines and emit a ``--!`` comment marker in front of
them. This corresponds to GNATprep's ``-c`` option.
``empty_comment_lines``
These lines are replaced with exactly ``--!``. This corresponds to
GNATprep's ``-e`` option.
"""
delete_lines = "delete_lines"
blank_lines = "blank_lines"
comment_lines = "comment_lines"
empty_comment_lines = "empty_comment_lines"
_name = "LineMode"
_c_to_py = [
delete_lines, blank_lines, comment_lines, empty_comment_lines
]
_py_to_c = {name: index for index, name in enumerate(_c_to_py)}
@classmethod
def create_preprocessor_from_file(
cls,
filename: str,
path: List[str],
line_mode: Optional[FileReader.LineMode]
) -> FileReader:
${py_doc('libadalang.create_preprocessor_from_file', 8)}
# Create an array of C strings to hold the path directories
c_dirs = [ctypes.c_char_p(_unwrap_filename(d)) for d in path]
c_path_data = (ctypes.c_char_p * len(c_dirs))()
for i, d in enumerate(c_dirs):
c_path_data[i] = d
# Create the pointer to this array, with the expected type according to
# ctypes.
c_path_type = ctypes.POINTER(ctypes.c_char_p)
c_path = ctypes.cast(ctypes.byref(c_path_data), c_path_type)
# Pass the line mode to force, if any
if line_mode is not None:
lm = ctypes.c_int(FileReader.LineMode._unwrap(line_mode))
lm_ref = ctypes.byref(lm)
else:
lm_ref = ctypes.POINTER(ctypes.c_int)()
# We can now create the file reader itself
c_value = _create_preprocessor_from_file(
_unwrap_filename(filename), c_path, len(c_dirs), lm_ref
)
return cls(c_value)