Cython 3.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- Cython/Build/BuildExecutable.py +169 -0
- Cython/Build/Cache.py +199 -0
- Cython/Build/Cythonize.py +323 -0
- Cython/Build/Dependencies.py +1306 -0
- Cython/Build/Distutils.py +1 -0
- Cython/Build/Inline.py +463 -0
- Cython/Build/IpythonMagic.py +560 -0
- Cython/Build/SharedModule.py +76 -0
- Cython/Build/Tests/TestCyCache.py +194 -0
- Cython/Build/Tests/TestCythonizeArgsParser.py +481 -0
- Cython/Build/Tests/TestDependencies.py +133 -0
- Cython/Build/Tests/TestInline.py +177 -0
- Cython/Build/Tests/TestIpythonMagic.py +287 -0
- Cython/Build/Tests/TestRecythonize.py +212 -0
- Cython/Build/Tests/TestStripLiterals.py +155 -0
- Cython/Build/Tests/__init__.py +1 -0
- Cython/Build/__init__.py +8 -0
- Cython/CodeWriter.py +811 -0
- Cython/Compiler/AnalysedTreeTransforms.py +97 -0
- Cython/Compiler/Annotate.py +326 -0
- Cython/Compiler/AutoDocTransforms.py +320 -0
- Cython/Compiler/Buffer.py +680 -0
- Cython/Compiler/Builtin.py +934 -0
- Cython/Compiler/CmdLine.py +259 -0
- Cython/Compiler/Code.pxd +148 -0
- Cython/Compiler/Code.py +3375 -0
- Cython/Compiler/CodeGeneration.py +33 -0
- Cython/Compiler/CythonScope.py +187 -0
- Cython/Compiler/Dataclass.py +868 -0
- Cython/Compiler/DebugFlags.py +24 -0
- Cython/Compiler/Errors.py +295 -0
- Cython/Compiler/ExprNodes.py +15267 -0
- Cython/Compiler/FlowControl.pxd +97 -0
- Cython/Compiler/FlowControl.py +1455 -0
- Cython/Compiler/FusedNode.py +1002 -0
- Cython/Compiler/Future.py +16 -0
- Cython/Compiler/Interpreter.py +57 -0
- Cython/Compiler/Lexicon.py +340 -0
- Cython/Compiler/LineTable.py +114 -0
- Cython/Compiler/Main.py +853 -0
- Cython/Compiler/MatchCaseNodes.py +259 -0
- Cython/Compiler/MemoryView.py +922 -0
- Cython/Compiler/ModuleNode.py +4024 -0
- Cython/Compiler/Naming.py +374 -0
- Cython/Compiler/Nodes.py +10826 -0
- Cython/Compiler/Optimize.py +5256 -0
- Cython/Compiler/Options.py +835 -0
- Cython/Compiler/ParseTreeTransforms.pxd +77 -0
- Cython/Compiler/ParseTreeTransforms.py +4509 -0
- Cython/Compiler/Parsing.pxd +9 -0
- Cython/Compiler/Parsing.py +4789 -0
- Cython/Compiler/Pipeline.py +439 -0
- Cython/Compiler/PyrexTypes.py +5762 -0
- Cython/Compiler/Pythran.py +232 -0
- Cython/Compiler/Scanning.pxd +40 -0
- Cython/Compiler/Scanning.py +577 -0
- Cython/Compiler/StringEncoding.py +347 -0
- Cython/Compiler/Symtab.py +3080 -0
- Cython/Compiler/Tests/TestBuffer.py +105 -0
- Cython/Compiler/Tests/TestBuiltin.py +72 -0
- Cython/Compiler/Tests/TestCmdLine.py +586 -0
- Cython/Compiler/Tests/TestCode.py +86 -0
- Cython/Compiler/Tests/TestFlowControl.py +65 -0
- Cython/Compiler/Tests/TestGrammar.py +202 -0
- Cython/Compiler/Tests/TestMemView.py +71 -0
- Cython/Compiler/Tests/TestParseTreeTransforms.py +285 -0
- Cython/Compiler/Tests/TestScanning.py +134 -0
- Cython/Compiler/Tests/TestSignatureMatching.py +73 -0
- Cython/Compiler/Tests/TestStringEncoding.py +33 -0
- Cython/Compiler/Tests/TestTreeFragment.py +63 -0
- Cython/Compiler/Tests/TestTreePath.py +103 -0
- Cython/Compiler/Tests/TestTypes.py +75 -0
- Cython/Compiler/Tests/TestUtilityLoad.py +112 -0
- Cython/Compiler/Tests/TestVisitor.py +61 -0
- Cython/Compiler/Tests/Utils.py +36 -0
- Cython/Compiler/Tests/__init__.py +1 -0
- Cython/Compiler/TreeFragment.py +278 -0
- Cython/Compiler/TreePath.py +303 -0
- Cython/Compiler/TypeInference.py +584 -0
- Cython/Compiler/TypeSlots.py +1181 -0
- Cython/Compiler/UFuncs.py +311 -0
- Cython/Compiler/UtilNodes.py +389 -0
- Cython/Compiler/UtilityCode.py +344 -0
- Cython/Compiler/Version.py +8 -0
- Cython/Compiler/Visitor.pxd +53 -0
- Cython/Compiler/Visitor.py +861 -0
- Cython/Compiler/__init__.py +1 -0
- Cython/Coverage.py +448 -0
- Cython/Debugger/Cygdb.py +175 -0
- Cython/Debugger/DebugWriter.py +82 -0
- Cython/Debugger/Tests/TestLibCython.py +275 -0
- Cython/Debugger/Tests/__init__.py +1 -0
- Cython/Debugger/Tests/cfuncs.c +8 -0
- Cython/Debugger/Tests/codefile +49 -0
- Cython/Debugger/Tests/test_libcython_in_gdb.py +578 -0
- Cython/Debugger/Tests/test_libpython_in_gdb.py +90 -0
- Cython/Debugger/__init__.py +1 -0
- Cython/Debugger/libcython.py +1548 -0
- Cython/Debugger/libpython.py +2821 -0
- Cython/Debugging.py +20 -0
- Cython/Distutils/__init__.py +2 -0
- Cython/Distutils/build_ext.py +139 -0
- Cython/Distutils/extension.py +96 -0
- Cython/Distutils/old_build_ext.py +351 -0
- Cython/Includes/cpython/__init__.pxd +173 -0
- Cython/Includes/cpython/array.pxd +174 -0
- Cython/Includes/cpython/bool.pxd +37 -0
- Cython/Includes/cpython/buffer.pxd +112 -0
- Cython/Includes/cpython/bytearray.pxd +33 -0
- Cython/Includes/cpython/bytes.pxd +200 -0
- Cython/Includes/cpython/cellobject.pxd +35 -0
- Cython/Includes/cpython/ceval.pxd +8 -0
- Cython/Includes/cpython/codecs.pxd +121 -0
- Cython/Includes/cpython/complex.pxd +60 -0
- Cython/Includes/cpython/contextvars.pxd +145 -0
- Cython/Includes/cpython/conversion.pxd +36 -0
- Cython/Includes/cpython/datetime.pxd +395 -0
- Cython/Includes/cpython/descr.pxd +26 -0
- Cython/Includes/cpython/dict.pxd +187 -0
- Cython/Includes/cpython/exc.pxd +263 -0
- Cython/Includes/cpython/fileobject.pxd +57 -0
- Cython/Includes/cpython/float.pxd +47 -0
- Cython/Includes/cpython/function.pxd +65 -0
- Cython/Includes/cpython/genobject.pxd +25 -0
- Cython/Includes/cpython/getargs.pxd +12 -0
- Cython/Includes/cpython/instance.pxd +25 -0
- Cython/Includes/cpython/iterator.pxd +36 -0
- Cython/Includes/cpython/iterobject.pxd +24 -0
- Cython/Includes/cpython/list.pxd +92 -0
- Cython/Includes/cpython/long.pxd +149 -0
- Cython/Includes/cpython/longintrepr.pxd +14 -0
- Cython/Includes/cpython/mapping.pxd +63 -0
- Cython/Includes/cpython/marshal.pxd +66 -0
- Cython/Includes/cpython/mem.pxd +120 -0
- Cython/Includes/cpython/memoryview.pxd +50 -0
- Cython/Includes/cpython/method.pxd +49 -0
- Cython/Includes/cpython/module.pxd +208 -0
- Cython/Includes/cpython/number.pxd +258 -0
- Cython/Includes/cpython/object.pxd +433 -0
- Cython/Includes/cpython/pycapsule.pxd +143 -0
- Cython/Includes/cpython/pylifecycle.pxd +68 -0
- Cython/Includes/cpython/pyport.pxd +8 -0
- Cython/Includes/cpython/pystate.pxd +95 -0
- Cython/Includes/cpython/pythread.pxd +53 -0
- Cython/Includes/cpython/ref.pxd +67 -0
- Cython/Includes/cpython/sequence.pxd +134 -0
- Cython/Includes/cpython/set.pxd +119 -0
- Cython/Includes/cpython/slice.pxd +70 -0
- Cython/Includes/cpython/time.pxd +129 -0
- Cython/Includes/cpython/tuple.pxd +72 -0
- Cython/Includes/cpython/type.pxd +53 -0
- Cython/Includes/cpython/unicode.pxd +639 -0
- Cython/Includes/cpython/version.pxd +32 -0
- Cython/Includes/cpython/weakref.pxd +78 -0
- Cython/Includes/libc/__init__.pxd +1 -0
- Cython/Includes/libc/complex.pxd +35 -0
- Cython/Includes/libc/errno.pxd +127 -0
- Cython/Includes/libc/float.pxd +43 -0
- Cython/Includes/libc/limits.pxd +28 -0
- Cython/Includes/libc/locale.pxd +46 -0
- Cython/Includes/libc/math.pxd +209 -0
- Cython/Includes/libc/setjmp.pxd +10 -0
- Cython/Includes/libc/signal.pxd +64 -0
- Cython/Includes/libc/stddef.pxd +9 -0
- Cython/Includes/libc/stdint.pxd +105 -0
- Cython/Includes/libc/stdio.pxd +80 -0
- Cython/Includes/libc/stdlib.pxd +72 -0
- Cython/Includes/libc/string.pxd +50 -0
- Cython/Includes/libc/threads.pxd +84 -0
- Cython/Includes/libc/time.pxd +51 -0
- Cython/Includes/libcpp/__init__.pxd +4 -0
- Cython/Includes/libcpp/algorithm.pxd +320 -0
- Cython/Includes/libcpp/any.pxd +16 -0
- Cython/Includes/libcpp/atomic.pxd +59 -0
- Cython/Includes/libcpp/barrier.pxd +22 -0
- Cython/Includes/libcpp/bit.pxd +29 -0
- Cython/Includes/libcpp/cast.pxd +12 -0
- Cython/Includes/libcpp/cmath.pxd +518 -0
- Cython/Includes/libcpp/complex.pxd +106 -0
- Cython/Includes/libcpp/deque.pxd +165 -0
- Cython/Includes/libcpp/exception.pxd +86 -0
- Cython/Includes/libcpp/execution.pxd +15 -0
- Cython/Includes/libcpp/forward_list.pxd +63 -0
- Cython/Includes/libcpp/functional.pxd +26 -0
- Cython/Includes/libcpp/future.pxd +103 -0
- Cython/Includes/libcpp/iterator.pxd +34 -0
- Cython/Includes/libcpp/latch.pxd +17 -0
- Cython/Includes/libcpp/limits.pxd +61 -0
- Cython/Includes/libcpp/list.pxd +117 -0
- Cython/Includes/libcpp/map.pxd +252 -0
- Cython/Includes/libcpp/memory.pxd +115 -0
- Cython/Includes/libcpp/mutex.pxd +130 -0
- Cython/Includes/libcpp/numbers.pxd +15 -0
- Cython/Includes/libcpp/numeric.pxd +131 -0
- Cython/Includes/libcpp/optional.pxd +34 -0
- Cython/Includes/libcpp/pair.pxd +1 -0
- Cython/Includes/libcpp/queue.pxd +25 -0
- Cython/Includes/libcpp/random.pxd +166 -0
- Cython/Includes/libcpp/semaphore.pxd +44 -0
- Cython/Includes/libcpp/set.pxd +228 -0
- Cython/Includes/libcpp/shared_mutex.pxd +72 -0
- Cython/Includes/libcpp/span.pxd +87 -0
- Cython/Includes/libcpp/stack.pxd +11 -0
- Cython/Includes/libcpp/stop_token.pxd +105 -0
- Cython/Includes/libcpp/string.pxd +355 -0
- Cython/Includes/libcpp/string_view.pxd +181 -0
- Cython/Includes/libcpp/typeindex.pxd +15 -0
- Cython/Includes/libcpp/typeinfo.pxd +10 -0
- Cython/Includes/libcpp/unordered_map.pxd +193 -0
- Cython/Includes/libcpp/unordered_set.pxd +152 -0
- Cython/Includes/libcpp/utility.pxd +30 -0
- Cython/Includes/libcpp/vector.pxd +186 -0
- Cython/Includes/openmp.pxd +50 -0
- Cython/Includes/posix/__init__.pxd +1 -0
- Cython/Includes/posix/dlfcn.pxd +14 -0
- Cython/Includes/posix/fcntl.pxd +86 -0
- Cython/Includes/posix/ioctl.pxd +4 -0
- Cython/Includes/posix/mman.pxd +101 -0
- Cython/Includes/posix/resource.pxd +57 -0
- Cython/Includes/posix/select.pxd +21 -0
- Cython/Includes/posix/signal.pxd +73 -0
- Cython/Includes/posix/stat.pxd +98 -0
- Cython/Includes/posix/stdio.pxd +37 -0
- Cython/Includes/posix/stdlib.pxd +29 -0
- Cython/Includes/posix/strings.pxd +9 -0
- Cython/Includes/posix/time.pxd +71 -0
- Cython/Includes/posix/types.pxd +30 -0
- Cython/Includes/posix/uio.pxd +26 -0
- Cython/Includes/posix/unistd.pxd +271 -0
- Cython/Includes/posix/wait.pxd +38 -0
- Cython/Plex/Actions.pxd +24 -0
- Cython/Plex/Actions.py +119 -0
- Cython/Plex/DFA.pxd +14 -0
- Cython/Plex/DFA.py +164 -0
- Cython/Plex/Errors.py +48 -0
- Cython/Plex/Lexicons.py +178 -0
- Cython/Plex/Machines.pxd +36 -0
- Cython/Plex/Machines.py +238 -0
- Cython/Plex/Regexps.py +539 -0
- Cython/Plex/Scanners.pxd +47 -0
- Cython/Plex/Scanners.py +360 -0
- Cython/Plex/Transitions.pxd +14 -0
- Cython/Plex/Transitions.py +239 -0
- Cython/Plex/__init__.py +34 -0
- Cython/Runtime/__init__.py +1 -0
- Cython/Runtime/refnanny.pyx +237 -0
- Cython/Shadow.py +690 -0
- Cython/Shadow.pyi +521 -0
- Cython/StringIOTree.py +170 -0
- Cython/Tempita/__init__.py +4 -0
- Cython/Tempita/_looper.py +154 -0
- Cython/Tempita/_tempita.py +1091 -0
- Cython/TestUtils.py +410 -0
- Cython/Tests/TestCodeWriter.py +128 -0
- Cython/Tests/TestCythonUtils.py +202 -0
- Cython/Tests/TestJediTyper.py +223 -0
- Cython/Tests/TestShadow.py +114 -0
- Cython/Tests/TestStringIOTree.py +67 -0
- Cython/Tests/TestTestUtils.py +90 -0
- Cython/Tests/__init__.py +1 -0
- Cython/Tests/xmlrunner.py +390 -0
- Cython/Utility/AsyncGen.c +1002 -0
- Cython/Utility/Buffer.c +875 -0
- Cython/Utility/BufferFormatFromTypeInfo.pxd +2 -0
- Cython/Utility/Builtins.c +776 -0
- Cython/Utility/CConvert.pyx +134 -0
- Cython/Utility/CMath.c +104 -0
- Cython/Utility/CommonStructures.c +118 -0
- Cython/Utility/Complex.c +378 -0
- Cython/Utility/Coroutine.c +2206 -0
- Cython/Utility/CpdefEnums.pyx +103 -0
- Cython/Utility/CppConvert.pyx +279 -0
- Cython/Utility/CppSupport.cpp +143 -0
- Cython/Utility/CythonFunction.c +1794 -0
- Cython/Utility/Dataclasses.c +185 -0
- Cython/Utility/Dataclasses.py +112 -0
- Cython/Utility/Embed.c +125 -0
- Cython/Utility/Exceptions.c +1012 -0
- Cython/Utility/ExtensionTypes.c +809 -0
- Cython/Utility/FunctionArguments.c +965 -0
- Cython/Utility/ImportExport.c +987 -0
- Cython/Utility/Lock.c +136 -0
- Cython/Utility/MemoryView.pxd +187 -0
- Cython/Utility/MemoryView.pyx +1481 -0
- Cython/Utility/MemoryView_C.c +1046 -0
- Cython/Utility/ModuleSetupCode.c +3059 -0
- Cython/Utility/NumpyImportArray.c +46 -0
- Cython/Utility/ObjectHandling.c +3342 -0
- Cython/Utility/Optimize.c +1589 -0
- Cython/Utility/Overflow.c +404 -0
- Cython/Utility/Printing.c +86 -0
- Cython/Utility/Profile.c +709 -0
- Cython/Utility/StringTools.c +1259 -0
- Cython/Utility/TestCyUtilityLoader.pyx +8 -0
- Cython/Utility/TestCythonScope.pyx +75 -0
- Cython/Utility/TestUtilityLoader.c +12 -0
- Cython/Utility/TypeConversion.c +1284 -0
- Cython/Utility/UFuncs.pyx +50 -0
- Cython/Utility/UFuncs_C.c +89 -0
- Cython/Utility/__init__.py +28 -0
- Cython/Utility/arrayarray.h +148 -0
- Cython/Utils.py +687 -0
- Cython/__init__.py +10 -0
- Cython/__init__.pyi +7 -0
- Cython/py.typed +0 -0
- cython-3.1.0.dist-info/COPYING.txt +19 -0
- cython-3.1.0.dist-info/LICENSE.txt +176 -0
- cython-3.1.0.dist-info/METADATA +636 -0
- cython-3.1.0.dist-info/RECORD +316 -0
- cython-3.1.0.dist-info/WHEEL +5 -0
- cython-3.1.0.dist-info/entry_points.txt +4 -0
- cython-3.1.0.dist-info/top_level.txt +3 -0
- cython.py +29 -0
- pyximport/__init__.py +4 -0
- pyximport/pyxbuild.py +160 -0
- pyximport/pyximport.py +482 -0
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Cython -- encoding related tools
|
|
3
|
+
#
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
import re
|
|
7
|
+
import sys
|
|
8
|
+
|
|
9
|
+
join_bytes = b''.join
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class UnicodeLiteralBuilder:
|
|
13
|
+
"""Assemble a unicode string.
|
|
14
|
+
"""
|
|
15
|
+
def __init__(self):
|
|
16
|
+
self.chars = []
|
|
17
|
+
|
|
18
|
+
def append(self, characters):
|
|
19
|
+
assert isinstance(characters, str), f"Expected str, got {type(characters)}"
|
|
20
|
+
self.chars.append(characters)
|
|
21
|
+
|
|
22
|
+
if sys.maxunicode == 65535:
|
|
23
|
+
def append_charval(self, char_number):
|
|
24
|
+
if char_number > 65535:
|
|
25
|
+
# wide Unicode character on narrow platform => replace
|
|
26
|
+
# by surrogate pair
|
|
27
|
+
char_number -= 0x10000
|
|
28
|
+
self.chars.append( chr((char_number // 1024) + 0xD800) )
|
|
29
|
+
self.chars.append( chr((char_number % 1024) + 0xDC00) )
|
|
30
|
+
else:
|
|
31
|
+
self.chars.append( chr(char_number) )
|
|
32
|
+
else:
|
|
33
|
+
def append_charval(self, char_number):
|
|
34
|
+
self.chars.append( chr(char_number) )
|
|
35
|
+
|
|
36
|
+
def append_uescape(self, char_number, escape_string):
|
|
37
|
+
self.append_charval(char_number)
|
|
38
|
+
|
|
39
|
+
def getstring(self):
|
|
40
|
+
return EncodedString(''.join(self.chars))
|
|
41
|
+
|
|
42
|
+
def getstrings(self):
|
|
43
|
+
return (None, self.getstring())
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
class BytesLiteralBuilder:
|
|
47
|
+
"""Assemble a byte string or char value.
|
|
48
|
+
"""
|
|
49
|
+
def __init__(self, target_encoding):
|
|
50
|
+
self.chars = []
|
|
51
|
+
self.target_encoding = target_encoding
|
|
52
|
+
|
|
53
|
+
def append(self, characters):
|
|
54
|
+
if isinstance(characters, str):
|
|
55
|
+
characters = characters.encode(self.target_encoding)
|
|
56
|
+
assert isinstance(characters, bytes), str(type(characters))
|
|
57
|
+
self.chars.append(characters)
|
|
58
|
+
|
|
59
|
+
def append_charval(self, char_number):
|
|
60
|
+
self.chars.append( chr(char_number).encode('ISO-8859-1') )
|
|
61
|
+
|
|
62
|
+
def append_uescape(self, char_number, escape_string):
|
|
63
|
+
self.append(escape_string)
|
|
64
|
+
|
|
65
|
+
def getstring(self):
|
|
66
|
+
# this *must* return a byte string!
|
|
67
|
+
return bytes_literal(join_bytes(self.chars), self.target_encoding)
|
|
68
|
+
|
|
69
|
+
def getchar(self):
|
|
70
|
+
# this *must* return a byte string!
|
|
71
|
+
return self.getstring()
|
|
72
|
+
|
|
73
|
+
def getstrings(self):
|
|
74
|
+
return (self.getstring(), None)
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
class StrLiteralBuilder:
|
|
78
|
+
"""Assemble both a bytes and a unicode representation of a string.
|
|
79
|
+
"""
|
|
80
|
+
def __init__(self, target_encoding):
|
|
81
|
+
self._bytes = BytesLiteralBuilder(target_encoding)
|
|
82
|
+
self._unicode = UnicodeLiteralBuilder()
|
|
83
|
+
|
|
84
|
+
def append(self, characters):
|
|
85
|
+
self._bytes.append(characters)
|
|
86
|
+
self._unicode.append(characters)
|
|
87
|
+
|
|
88
|
+
def append_charval(self, char_number):
|
|
89
|
+
self._bytes.append_charval(char_number)
|
|
90
|
+
self._unicode.append_charval(char_number)
|
|
91
|
+
|
|
92
|
+
def append_uescape(self, char_number, escape_string):
|
|
93
|
+
self._bytes.append(escape_string)
|
|
94
|
+
self._unicode.append_charval(char_number)
|
|
95
|
+
|
|
96
|
+
def getstrings(self):
|
|
97
|
+
return (self._bytes.getstring(), self._unicode.getstring())
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
class EncodedString(str):
|
|
101
|
+
# unicode string subclass to keep track of the original encoding.
|
|
102
|
+
# 'encoding' is None for unicode strings and the source encoding
|
|
103
|
+
# otherwise
|
|
104
|
+
encoding = None
|
|
105
|
+
|
|
106
|
+
def __deepcopy__(self, memo):
|
|
107
|
+
return self
|
|
108
|
+
|
|
109
|
+
def byteencode(self):
|
|
110
|
+
assert self.encoding is not None
|
|
111
|
+
return self.encode(self.encoding)
|
|
112
|
+
|
|
113
|
+
def utf8encode(self):
|
|
114
|
+
assert self.encoding is None
|
|
115
|
+
return self.encode("UTF-8")
|
|
116
|
+
|
|
117
|
+
@property
|
|
118
|
+
def is_unicode(self):
|
|
119
|
+
return self.encoding is None
|
|
120
|
+
|
|
121
|
+
def contains_surrogates(self):
|
|
122
|
+
return string_contains_surrogates(self)
|
|
123
|
+
|
|
124
|
+
def as_utf8_string(self):
|
|
125
|
+
return bytes_literal(self.utf8encode(), 'utf8')
|
|
126
|
+
|
|
127
|
+
def as_c_string_literal(self):
|
|
128
|
+
# first encodes the string then produces a c string literal
|
|
129
|
+
if self.encoding is None:
|
|
130
|
+
s = self.as_utf8_string()
|
|
131
|
+
else:
|
|
132
|
+
s = bytes_literal(self.byteencode(), self.encoding)
|
|
133
|
+
return s.as_c_string_literal()
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
def string_contains_surrogates(ustring):
|
|
137
|
+
"""
|
|
138
|
+
Check if the unicode string contains surrogate code points
|
|
139
|
+
on a CPython platform with wide (UCS-4) or narrow (UTF-16)
|
|
140
|
+
Unicode, i.e. characters that would be spelled as two
|
|
141
|
+
separate code units on a narrow platform.
|
|
142
|
+
"""
|
|
143
|
+
for c in map(ord, ustring):
|
|
144
|
+
if c > 65535: # can only happen on wide platforms
|
|
145
|
+
return True
|
|
146
|
+
if 0xD800 <= c <= 0xDFFF:
|
|
147
|
+
return True
|
|
148
|
+
return False
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
def string_contains_lone_surrogates(ustring):
|
|
152
|
+
"""
|
|
153
|
+
Check if the unicode string contains lone surrogate code points
|
|
154
|
+
on a CPython platform with wide (UCS-4) or narrow (UTF-16)
|
|
155
|
+
Unicode, i.e. characters that would be spelled as two
|
|
156
|
+
separate code units on a narrow platform, but that do not form a pair.
|
|
157
|
+
"""
|
|
158
|
+
last_was_start = False
|
|
159
|
+
unicode_uses_surrogate_encoding = sys.maxunicode == 65535
|
|
160
|
+
for c in map(ord, ustring):
|
|
161
|
+
# surrogates tend to be rare
|
|
162
|
+
if c < 0xD800 or c > 0xDFFF:
|
|
163
|
+
if last_was_start:
|
|
164
|
+
return True
|
|
165
|
+
elif not unicode_uses_surrogate_encoding:
|
|
166
|
+
# on 32bit Unicode platforms, there is never a pair
|
|
167
|
+
return True
|
|
168
|
+
elif c <= 0xDBFF:
|
|
169
|
+
if last_was_start:
|
|
170
|
+
return True # lone start
|
|
171
|
+
last_was_start = True
|
|
172
|
+
else:
|
|
173
|
+
if not last_was_start:
|
|
174
|
+
return True # lone end
|
|
175
|
+
last_was_start = False
|
|
176
|
+
return last_was_start
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
class BytesLiteral(bytes):
|
|
180
|
+
# bytes subclass that is compatible with EncodedString
|
|
181
|
+
encoding = None
|
|
182
|
+
|
|
183
|
+
def __deepcopy__(self, memo):
|
|
184
|
+
return self
|
|
185
|
+
|
|
186
|
+
def byteencode(self):
|
|
187
|
+
return bytes(self)
|
|
188
|
+
|
|
189
|
+
def utf8encode(self):
|
|
190
|
+
assert False, "this is not a unicode string: %r" % self
|
|
191
|
+
|
|
192
|
+
def __str__(self):
|
|
193
|
+
"""Fake-decode the byte string to unicode to support %
|
|
194
|
+
formatting of unicode strings.
|
|
195
|
+
"""
|
|
196
|
+
return self.decode('ISO-8859-1')
|
|
197
|
+
|
|
198
|
+
is_unicode = False
|
|
199
|
+
|
|
200
|
+
def as_c_string_literal(self):
|
|
201
|
+
value = split_string_literal(escape_byte_string(self))
|
|
202
|
+
return '"%s"' % value
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
def bytes_literal(s, encoding):
|
|
206
|
+
assert isinstance(s, bytes)
|
|
207
|
+
s = BytesLiteral(s)
|
|
208
|
+
s.encoding = encoding
|
|
209
|
+
return s
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
def encoded_string(s, encoding):
|
|
213
|
+
assert isinstance(s, (str, bytes))
|
|
214
|
+
s = EncodedString(s)
|
|
215
|
+
if encoding is not None:
|
|
216
|
+
s.encoding = encoding
|
|
217
|
+
return s
|
|
218
|
+
|
|
219
|
+
def encoded_string_or_bytes_literal(s, encoding):
|
|
220
|
+
if isinstance(s, bytes):
|
|
221
|
+
return bytes_literal(s, encoding)
|
|
222
|
+
else:
|
|
223
|
+
return encoded_string(s, encoding)
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
char_from_escape_sequence = {
|
|
227
|
+
r'\a' : '\a',
|
|
228
|
+
r'\b' : '\b',
|
|
229
|
+
r'\f' : '\f',
|
|
230
|
+
r'\n' : '\n',
|
|
231
|
+
r'\r' : '\r',
|
|
232
|
+
r'\t' : '\t',
|
|
233
|
+
r'\v' : '\v',
|
|
234
|
+
}.get
|
|
235
|
+
|
|
236
|
+
_c_special = ('\\', '??', '"') + tuple(map(chr, range(32)))
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
def _to_escape_sequence(s):
|
|
240
|
+
if s in '\n\r\t':
|
|
241
|
+
return repr(s)[1:-1]
|
|
242
|
+
elif s == '"':
|
|
243
|
+
return r'\"'
|
|
244
|
+
elif s == '\\':
|
|
245
|
+
return r'\\'
|
|
246
|
+
else:
|
|
247
|
+
# within a character sequence, oct passes much better than hex
|
|
248
|
+
return ''.join([f'\\{ord(c):03o}' for c in s])
|
|
249
|
+
|
|
250
|
+
|
|
251
|
+
def _build_specials_replacer():
|
|
252
|
+
subexps = []
|
|
253
|
+
replacements = {}
|
|
254
|
+
for special in _c_special:
|
|
255
|
+
regexp = ''.join(['[%s]' % c.replace('\\', '\\\\') for c in special])
|
|
256
|
+
subexps.append(regexp)
|
|
257
|
+
replacements[special.encode('ASCII')] = _to_escape_sequence(special).encode('ASCII')
|
|
258
|
+
sub = re.compile(('(%s)' % '|'.join(subexps)).encode('ASCII')).sub
|
|
259
|
+
def replace_specials(m):
|
|
260
|
+
return replacements[m.group(1)]
|
|
261
|
+
def replace(s):
|
|
262
|
+
return sub(replace_specials, s)
|
|
263
|
+
return replace
|
|
264
|
+
|
|
265
|
+
_replace_specials = _build_specials_replacer()
|
|
266
|
+
|
|
267
|
+
|
|
268
|
+
def escape_char(c):
|
|
269
|
+
c = c.decode('ISO-8859-1')
|
|
270
|
+
if c in '\n\r\t\\':
|
|
271
|
+
return repr(c)[1:-1]
|
|
272
|
+
elif c == "'":
|
|
273
|
+
return "\\'"
|
|
274
|
+
n = ord(c)
|
|
275
|
+
if n < 32 or n > 127:
|
|
276
|
+
# hex works well for characters
|
|
277
|
+
return "\\x%02X" % n
|
|
278
|
+
else:
|
|
279
|
+
return c
|
|
280
|
+
|
|
281
|
+
def escape_byte_string(s):
|
|
282
|
+
"""Escape a byte string so that it can be written into C code.
|
|
283
|
+
Note that this returns a Unicode string instead which, when
|
|
284
|
+
encoded as ASCII, will result in the correct byte sequence
|
|
285
|
+
being written.
|
|
286
|
+
"""
|
|
287
|
+
s = _replace_specials(s)
|
|
288
|
+
try:
|
|
289
|
+
return s.decode("ASCII") # trial decoding: plain ASCII => done
|
|
290
|
+
except UnicodeDecodeError:
|
|
291
|
+
pass
|
|
292
|
+
s_new = bytearray()
|
|
293
|
+
append, extend = s_new.append, s_new.extend
|
|
294
|
+
for b in s:
|
|
295
|
+
if b >= 128:
|
|
296
|
+
extend((f'\\{b:03o}').encode('ASCII'))
|
|
297
|
+
else:
|
|
298
|
+
append(b)
|
|
299
|
+
return s_new.decode('ASCII')
|
|
300
|
+
|
|
301
|
+
def split_string_literal(s, limit=2000):
|
|
302
|
+
# MSVC can't handle long string literals.
|
|
303
|
+
if len(s) < limit:
|
|
304
|
+
return s
|
|
305
|
+
else:
|
|
306
|
+
start = 0
|
|
307
|
+
chunks = []
|
|
308
|
+
while start < len(s):
|
|
309
|
+
end = start + limit
|
|
310
|
+
if len(s) > end-4 and '\\' in s[end-4:end]:
|
|
311
|
+
end -= 4 - s[end-4:end].find('\\') # just before the backslash
|
|
312
|
+
while s[end-1] == '\\':
|
|
313
|
+
end -= 1
|
|
314
|
+
if end == start:
|
|
315
|
+
# must have been a long line of backslashes
|
|
316
|
+
end = start + limit - (limit % 2) - 4
|
|
317
|
+
break
|
|
318
|
+
chunks.append(s[start:end])
|
|
319
|
+
start = end
|
|
320
|
+
return '""'.join(chunks)
|
|
321
|
+
|
|
322
|
+
def encode_pyunicode_string(s):
|
|
323
|
+
"""Create Py_UNICODE[] representation of a given unicode string.
|
|
324
|
+
"""
|
|
325
|
+
s = list(map(ord, s)) + [0]
|
|
326
|
+
|
|
327
|
+
if sys.maxunicode >= 0x10000: # Wide build or Py3.3
|
|
328
|
+
utf16, utf32 = [], s
|
|
329
|
+
for code_point in s:
|
|
330
|
+
if code_point >= 0x10000: # outside of BMP
|
|
331
|
+
high, low = divmod(code_point - 0x10000, 1024)
|
|
332
|
+
utf16.append(high + 0xD800)
|
|
333
|
+
utf16.append(low + 0xDC00)
|
|
334
|
+
else:
|
|
335
|
+
utf16.append(code_point)
|
|
336
|
+
else:
|
|
337
|
+
utf16, utf32 = s, []
|
|
338
|
+
for code_unit in s:
|
|
339
|
+
if 0xDC00 <= code_unit <= 0xDFFF and utf32 and 0xD800 <= utf32[-1] <= 0xDBFF:
|
|
340
|
+
high, low = utf32[-1], code_unit
|
|
341
|
+
utf32[-1] = ((high & 0x3FF) << 10) + (low & 0x3FF) + 0x10000
|
|
342
|
+
else:
|
|
343
|
+
utf32.append(code_unit)
|
|
344
|
+
|
|
345
|
+
if utf16 == utf32:
|
|
346
|
+
utf16 = []
|
|
347
|
+
return ",".join(map(str, utf16)), ",".join(map(str, utf32))
|