xref: /llvm-project/lldb/packages/Python/lldbsuite/support/encoded_file.py (revision 2238dcc39358353cac21df75c3c3286ab20b8f53)
1"""
2Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
3See https://llvm.org/LICENSE.txt for license information.
4SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
5
6Prepares language bindings for LLDB build process.  Run with --help
7to see a description of the supported command line arguments.
8"""
9
10# Python modules:
11import io
12
13
14def _encoded_write(old_write, encoding):
15    def impl(s):
16        # If we were asked to write a `bytes` decode it as unicode before
17        # attempting to write.
18        if isinstance(s, bytes):
19            s = s.decode(encoding, "replace")
20        # Filter unreadable characters, Python 3 is stricter than python 2 about them.
21        import re
22
23        s = re.sub(r"[^\x00-\x7f]", r" ", s)
24        return old_write(s)
25
26    return impl
27
28
29"""
30Create a Text I/O file object that can be written to with either unicode strings
31or byte strings.
32"""
33
34
35def open(
36    file, encoding, mode="r", buffering=-1, errors=None, newline=None, closefd=True
37):
38    wrapped_file = io.open(
39        file,
40        mode=mode,
41        buffering=buffering,
42        encoding=encoding,
43        errors=errors,
44        newline=newline,
45        closefd=closefd,
46    )
47    new_write = _encoded_write(getattr(wrapped_file, "write"), encoding)
48    setattr(wrapped_file, "write", new_write)
49    return wrapped_file
50