Cython 3.2.0__cp39-abi3-win32.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 +350 -0
- Cython/Build/Dependencies.py +1314 -0
- Cython/Build/Distutils.py +1 -0
- Cython/Build/Inline.py +463 -0
- Cython/Build/IpythonMagic.py +560 -0
- Cython/Build/SharedModule.py +94 -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 +11 -0
- Cython/CodeWriter.py +815 -0
- Cython/Compiler/AnalysedTreeTransforms.py +97 -0
- Cython/Compiler/Annotate.py +328 -0
- Cython/Compiler/AutoDocTransforms.py +320 -0
- Cython/Compiler/Buffer.py +680 -0
- Cython/Compiler/Builtin.py +984 -0
- Cython/Compiler/CmdLine.py +263 -0
- Cython/Compiler/Code.pxd +149 -0
- Cython/Compiler/Code.py +3746 -0
- Cython/Compiler/Code.pyd +0 -0
- Cython/Compiler/CodeGeneration.py +33 -0
- Cython/Compiler/CythonScope.py +191 -0
- Cython/Compiler/Dataclass.py +864 -0
- Cython/Compiler/DebugFlags.py +24 -0
- Cython/Compiler/Errors.py +297 -0
- Cython/Compiler/ExprNodes.py +15562 -0
- Cython/Compiler/FlowControl.pxd +97 -0
- Cython/Compiler/FlowControl.py +1451 -0
- Cython/Compiler/FlowControl.pyd +0 -0
- Cython/Compiler/FusedNode.py +971 -0
- Cython/Compiler/FusedNode.pyd +0 -0
- Cython/Compiler/Future.py +16 -0
- Cython/Compiler/Interpreter.py +57 -0
- Cython/Compiler/Lexicon.py +421 -0
- Cython/Compiler/LineTable.py +114 -0
- Cython/Compiler/LineTable.pyd +0 -0
- Cython/Compiler/Main.py +857 -0
- Cython/Compiler/MatchCaseNodes.py +259 -0
- Cython/Compiler/MemoryView.py +905 -0
- Cython/Compiler/ModuleNode.py +4235 -0
- Cython/Compiler/Naming.py +363 -0
- Cython/Compiler/Nodes.py +10831 -0
- Cython/Compiler/Optimize.py +5288 -0
- Cython/Compiler/Options.py +843 -0
- Cython/Compiler/ParseTreeTransforms.pxd +78 -0
- Cython/Compiler/ParseTreeTransforms.py +4638 -0
- Cython/Compiler/Parsing.pxd +9 -0
- Cython/Compiler/Parsing.py +4775 -0
- Cython/Compiler/Parsing.pyd +0 -0
- Cython/Compiler/Pipeline.py +439 -0
- Cython/Compiler/PyrexTypes.py +5870 -0
- Cython/Compiler/Pythran.py +232 -0
- Cython/Compiler/Scanning.pxd +48 -0
- Cython/Compiler/Scanning.py +701 -0
- Cython/Compiler/Scanning.pyd +0 -0
- Cython/Compiler/StringEncoding.py +298 -0
- Cython/Compiler/Symtab.py +3073 -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 +144 -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 +21 -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 +591 -0
- Cython/Compiler/TypeSlots.py +1174 -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/Visitor.pyd +0 -0
- Cython/Compiler/__init__.py +1 -0
- Cython/Coverage.py +448 -0
- Cython/Debugger/Cygdb.py +177 -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 +178 -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 +141 -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 +234 -0
- Cython/Includes/libc/time.pxd +52 -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/condition_variable.pxd +322 -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 +387 -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 +43 -0
- Cython/Includes/libcpp/set.pxd +228 -0
- Cython/Includes/libcpp/shared_mutex.pxd +96 -0
- Cython/Includes/libcpp/span.pxd +87 -0
- Cython/Includes/libcpp/stack.pxd +11 -0
- Cython/Includes/libcpp/stop_token.pxd +117 -0
- Cython/Includes/libcpp/string.pxd +355 -0
- Cython/Includes/libcpp/string_view.pxd +183 -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/numpy/math.pxd +150 -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/Actions.pyd +0 -0
- Cython/Plex/DFA.pxd +14 -0
- Cython/Plex/DFA.py +164 -0
- Cython/Plex/DFA.pyd +0 -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/Machines.pyd +0 -0
- Cython/Plex/Regexps.py +535 -0
- Cython/Plex/Scanners.pxd +45 -0
- Cython/Plex/Scanners.py +328 -0
- Cython/Plex/Scanners.pyd +0 -0
- Cython/Plex/Transitions.pxd +14 -0
- Cython/Plex/Transitions.py +239 -0
- Cython/Plex/Transitions.pyd +0 -0
- Cython/Plex/__init__.py +34 -0
- Cython/Runtime/__init__.py +1 -0
- Cython/Runtime/refnanny.pyd +0 -0
- Cython/Runtime/refnanny.pyx +237 -0
- Cython/Shadow.py +690 -0
- Cython/Shadow.pyi +521 -0
- Cython/StringIOTree.py +170 -0
- Cython/StringIOTree.pyd +0 -0
- Cython/Tempita/__init__.py +4 -0
- Cython/Tempita/_looper.py +154 -0
- Cython/Tempita/_tempita.py +1091 -0
- Cython/Tempita/_tempita.pyd +0 -0
- Cython/TestUtils.py +422 -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 +1031 -0
- Cython/Utility/Buffer.c +865 -0
- Cython/Utility/BufferFormatFromTypeInfo.pxd +2 -0
- Cython/Utility/Builtins.c +810 -0
- Cython/Utility/CConvert.pyx +134 -0
- Cython/Utility/CMath.c +104 -0
- Cython/Utility/CommonStructures.c +226 -0
- Cython/Utility/Complex.c +378 -0
- Cython/Utility/Coroutine.c +2300 -0
- Cython/Utility/CpdefEnums.pyx +103 -0
- Cython/Utility/CppConvert.pyx +282 -0
- Cython/Utility/CppSupport.cpp +151 -0
- Cython/Utility/CythonFunction.c +1832 -0
- Cython/Utility/Dataclasses.c +101 -0
- Cython/Utility/Embed.c +121 -0
- Cython/Utility/Exceptions.c +1016 -0
- Cython/Utility/ExtensionTypes.c +996 -0
- Cython/Utility/FunctionArguments.c +1043 -0
- Cython/Utility/FusedFunction.pyx +44 -0
- Cython/Utility/ImportExport.c +907 -0
- Cython/Utility/MemoryView.pxd +188 -0
- Cython/Utility/MemoryView.pyx +1482 -0
- Cython/Utility/MemoryView_C.c +927 -0
- Cython/Utility/ModuleSetupCode.c +3203 -0
- Cython/Utility/NumpyImportArray.c +46 -0
- Cython/Utility/ObjectHandling.c +3273 -0
- Cython/Utility/Optimize.c +1603 -0
- Cython/Utility/Overflow.c +384 -0
- Cython/Utility/Printing.c +86 -0
- Cython/Utility/Profile.c +732 -0
- Cython/Utility/StringTools.c +1379 -0
- Cython/Utility/Synchronization.c +399 -0
- Cython/Utility/TString.c +356 -0
- Cython/Utility/TestCyUtilityLoader.pyx +8 -0
- Cython/Utility/TestCythonScope.pyx +75 -0
- Cython/Utility/TestUtilityLoader.c +12 -0
- Cython/Utility/TypeConversion.c +1385 -0
- Cython/Utility/UFuncs.pyx +50 -0
- Cython/Utility/UFuncs_C.c +89 -0
- Cython/Utility/__init__.py +28 -0
- Cython/Utility/arrayarray.h +167 -0
- Cython/Utils.py +687 -0
- Cython/Utils.pyd +0 -0
- Cython/__init__.py +10 -0
- Cython/__init__.pyi +7 -0
- Cython/py.typed +0 -0
- cython-3.2.0.dist-info/METADATA +85 -0
- cython-3.2.0.dist-info/RECORD +333 -0
- cython-3.2.0.dist-info/WHEEL +5 -0
- cython-3.2.0.dist-info/entry_points.txt +4 -0
- cython-3.2.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,298 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Cython -- encoding related tools
|
|
3
|
+
#
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
import re
|
|
7
|
+
import sys
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class UnicodeLiteralBuilder:
|
|
11
|
+
"""Assemble a unicode string.
|
|
12
|
+
"""
|
|
13
|
+
def __init__(self):
|
|
14
|
+
self.chars = []
|
|
15
|
+
|
|
16
|
+
def append(self, characters):
|
|
17
|
+
assert isinstance(characters, str), f"Expected str, got {type(characters)}"
|
|
18
|
+
self.chars.append(characters)
|
|
19
|
+
|
|
20
|
+
def append_charval(self, char_number):
|
|
21
|
+
self.chars.append( chr(char_number) )
|
|
22
|
+
|
|
23
|
+
def append_uescape(self, char_number, escape_string):
|
|
24
|
+
self.append_charval(char_number)
|
|
25
|
+
|
|
26
|
+
def getstring(self):
|
|
27
|
+
return EncodedString(''.join(self.chars))
|
|
28
|
+
|
|
29
|
+
def getstrings(self):
|
|
30
|
+
return (None, self.getstring())
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class BytesLiteralBuilder:
|
|
34
|
+
"""Assemble a byte string or char value.
|
|
35
|
+
"""
|
|
36
|
+
def __init__(self, target_encoding):
|
|
37
|
+
self.chars = []
|
|
38
|
+
self.target_encoding = target_encoding
|
|
39
|
+
|
|
40
|
+
def append(self, characters):
|
|
41
|
+
if isinstance(characters, str):
|
|
42
|
+
characters = characters.encode(self.target_encoding)
|
|
43
|
+
assert isinstance(characters, bytes), str(type(characters))
|
|
44
|
+
self.chars.append(characters)
|
|
45
|
+
|
|
46
|
+
def append_charval(self, char_number):
|
|
47
|
+
self.chars.append( chr(char_number).encode('ISO-8859-1') )
|
|
48
|
+
|
|
49
|
+
def append_uescape(self, char_number, escape_string):
|
|
50
|
+
self.append(escape_string)
|
|
51
|
+
|
|
52
|
+
def getstring(self):
|
|
53
|
+
# this *must* return a byte string!
|
|
54
|
+
return bytes_literal(b''.join(self.chars), self.target_encoding)
|
|
55
|
+
|
|
56
|
+
def getchar(self):
|
|
57
|
+
# this *must* return a byte string!
|
|
58
|
+
return self.getstring()
|
|
59
|
+
|
|
60
|
+
def getstrings(self):
|
|
61
|
+
return (self.getstring(), None)
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
class StrLiteralBuilder:
|
|
65
|
+
"""Assemble both a bytes and a unicode representation of a string.
|
|
66
|
+
"""
|
|
67
|
+
def __init__(self, target_encoding):
|
|
68
|
+
self._bytes = BytesLiteralBuilder(target_encoding)
|
|
69
|
+
self._unicode = UnicodeLiteralBuilder()
|
|
70
|
+
|
|
71
|
+
def append(self, characters):
|
|
72
|
+
self._bytes.append(characters)
|
|
73
|
+
self._unicode.append(characters)
|
|
74
|
+
|
|
75
|
+
def append_charval(self, char_number):
|
|
76
|
+
self._bytes.append_charval(char_number)
|
|
77
|
+
self._unicode.append_charval(char_number)
|
|
78
|
+
|
|
79
|
+
def append_uescape(self, char_number, escape_string):
|
|
80
|
+
self._bytes.append(escape_string)
|
|
81
|
+
self._unicode.append_charval(char_number)
|
|
82
|
+
|
|
83
|
+
def getstrings(self):
|
|
84
|
+
return (self._bytes.getstring(), self._unicode.getstring())
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
class EncodedString(str):
|
|
88
|
+
# unicode string subclass to keep track of the original encoding.
|
|
89
|
+
# 'encoding' is None for unicode strings and the source encoding
|
|
90
|
+
# otherwise
|
|
91
|
+
encoding = None
|
|
92
|
+
|
|
93
|
+
def __deepcopy__(self, memo):
|
|
94
|
+
return self
|
|
95
|
+
|
|
96
|
+
def byteencode(self):
|
|
97
|
+
assert self.encoding is not None
|
|
98
|
+
return self.encode(self.encoding)
|
|
99
|
+
|
|
100
|
+
def utf8encode(self):
|
|
101
|
+
assert self.encoding is None
|
|
102
|
+
return self.encode("UTF-8")
|
|
103
|
+
|
|
104
|
+
@property
|
|
105
|
+
def is_unicode(self):
|
|
106
|
+
return self.encoding is None
|
|
107
|
+
|
|
108
|
+
def as_utf8_string(self):
|
|
109
|
+
return bytes_literal(self.utf8encode(), 'utf8')
|
|
110
|
+
|
|
111
|
+
def as_c_string_literal(self):
|
|
112
|
+
# first encodes the string then produces a c string literal
|
|
113
|
+
if self.encoding is None:
|
|
114
|
+
s = self.as_utf8_string()
|
|
115
|
+
else:
|
|
116
|
+
s = bytes_literal(self.byteencode(), self.encoding)
|
|
117
|
+
return s.as_c_string_literal()
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def string_contains_lone_surrogates(ustring):
|
|
121
|
+
"""
|
|
122
|
+
Check if the unicode string contains lone surrogate code points
|
|
123
|
+
on a CPython platform with wide (UCS-4) or narrow (UTF-16)
|
|
124
|
+
Unicode, i.e. characters that would be spelled as two
|
|
125
|
+
separate code units on a narrow platform, but that do not form a pair.
|
|
126
|
+
"""
|
|
127
|
+
for c in map(ord, ustring):
|
|
128
|
+
# Surrogates tend to be rare, so we use separate conditions.
|
|
129
|
+
if 0xD800 <= c and c <= 0xDFFF:
|
|
130
|
+
# on 32bit Unicode platforms, there is never a pair
|
|
131
|
+
return True
|
|
132
|
+
return False
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
class BytesLiteral(bytes):
|
|
136
|
+
# bytes subclass that is compatible with EncodedString
|
|
137
|
+
encoding = None
|
|
138
|
+
|
|
139
|
+
def __deepcopy__(self, memo):
|
|
140
|
+
return self
|
|
141
|
+
|
|
142
|
+
def byteencode(self):
|
|
143
|
+
return bytes(self)
|
|
144
|
+
|
|
145
|
+
def utf8encode(self):
|
|
146
|
+
assert False, "this is not a unicode string: %r" % self
|
|
147
|
+
|
|
148
|
+
def __str__(self):
|
|
149
|
+
"""Fake-decode the byte string to unicode to support %
|
|
150
|
+
formatting of unicode strings.
|
|
151
|
+
"""
|
|
152
|
+
return self.decode('ISO-8859-1')
|
|
153
|
+
|
|
154
|
+
is_unicode = False
|
|
155
|
+
|
|
156
|
+
def as_c_string_literal(self):
|
|
157
|
+
value = split_string_literal(escape_byte_string(self))
|
|
158
|
+
return '"%s"' % value
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
def bytes_literal(s, encoding):
|
|
162
|
+
assert isinstance(s, bytes)
|
|
163
|
+
s = BytesLiteral(s)
|
|
164
|
+
s.encoding = encoding
|
|
165
|
+
return s
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
def encoded_string(s, encoding):
|
|
169
|
+
assert isinstance(s, (str, bytes))
|
|
170
|
+
s = EncodedString(s)
|
|
171
|
+
if encoding is not None:
|
|
172
|
+
s.encoding = encoding
|
|
173
|
+
return s
|
|
174
|
+
|
|
175
|
+
def encoded_string_or_bytes_literal(s, encoding):
|
|
176
|
+
if isinstance(s, bytes):
|
|
177
|
+
return bytes_literal(s, encoding)
|
|
178
|
+
else:
|
|
179
|
+
return encoded_string(s, encoding)
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
char_from_escape_sequence = {
|
|
183
|
+
r'\a' : '\a',
|
|
184
|
+
r'\b' : '\b',
|
|
185
|
+
r'\f' : '\f',
|
|
186
|
+
r'\n' : '\n',
|
|
187
|
+
r'\r' : '\r',
|
|
188
|
+
r'\t' : '\t',
|
|
189
|
+
r'\v' : '\v',
|
|
190
|
+
}.get
|
|
191
|
+
|
|
192
|
+
_c_special = ('\\', '??', '"') + tuple(map(chr, range(32)))
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
def _to_escape_sequence(s):
|
|
196
|
+
if s in '\n\r\t':
|
|
197
|
+
return repr(s)[1:-1]
|
|
198
|
+
elif s == '"':
|
|
199
|
+
return r'\"'
|
|
200
|
+
elif s == '\\':
|
|
201
|
+
return r'\\'
|
|
202
|
+
else:
|
|
203
|
+
# within a character sequence, oct passes much better than hex
|
|
204
|
+
return ''.join([f'\\{ord(c):03o}' for c in s])
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
def _build_specials_replacer():
|
|
208
|
+
subexps = []
|
|
209
|
+
replacements = {}
|
|
210
|
+
for special in _c_special:
|
|
211
|
+
regexp = ''.join(['[%s]' % c.replace('\\', '\\\\') for c in special])
|
|
212
|
+
subexps.append(regexp)
|
|
213
|
+
replacements[special.encode('ASCII')] = _to_escape_sequence(special).encode('ASCII')
|
|
214
|
+
sub = re.compile(('(%s)' % '|'.join(subexps)).encode('ASCII')).sub
|
|
215
|
+
def replace_specials(m):
|
|
216
|
+
return replacements[m.group(1)]
|
|
217
|
+
def replace(s):
|
|
218
|
+
return sub(replace_specials, s)
|
|
219
|
+
return replace
|
|
220
|
+
|
|
221
|
+
_replace_specials = _build_specials_replacer()
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
def escape_char(c):
|
|
225
|
+
c = c.decode('ISO-8859-1')
|
|
226
|
+
if c in '\n\r\t\\':
|
|
227
|
+
return repr(c)[1:-1]
|
|
228
|
+
elif c == "'":
|
|
229
|
+
return "\\'"
|
|
230
|
+
n = ord(c)
|
|
231
|
+
if n < 32 or n >= 127:
|
|
232
|
+
# hex works well for characters
|
|
233
|
+
return "\\x%02X" % n
|
|
234
|
+
else:
|
|
235
|
+
# strictly £, @ and ` (which fall in this list) are only allowed
|
|
236
|
+
# in C23. But practically they're well-supported earlier.
|
|
237
|
+
return c
|
|
238
|
+
|
|
239
|
+
def escape_byte_string(s):
|
|
240
|
+
"""Escape a byte string so that it can be written into C code.
|
|
241
|
+
Note that this returns a Unicode string instead which, when
|
|
242
|
+
encoded as ASCII, will result in the correct byte sequence
|
|
243
|
+
being written.
|
|
244
|
+
"""
|
|
245
|
+
s = _replace_specials(s)
|
|
246
|
+
try:
|
|
247
|
+
return s.decode("ASCII") # trial decoding: plain ASCII => done
|
|
248
|
+
except UnicodeDecodeError:
|
|
249
|
+
pass
|
|
250
|
+
s_new = bytearray()
|
|
251
|
+
append, extend = s_new.append, s_new.extend
|
|
252
|
+
for b in s:
|
|
253
|
+
if b >= 127:
|
|
254
|
+
extend(b'\\%03o' % b)
|
|
255
|
+
else:
|
|
256
|
+
append(b)
|
|
257
|
+
return s_new.decode('ASCII')
|
|
258
|
+
|
|
259
|
+
def split_string_literal(s, limit=2000):
|
|
260
|
+
# MSVC can't handle long string literals.
|
|
261
|
+
if len(s) < limit:
|
|
262
|
+
return s
|
|
263
|
+
else:
|
|
264
|
+
start = 0
|
|
265
|
+
chunks = []
|
|
266
|
+
while start < len(s):
|
|
267
|
+
end = start + limit
|
|
268
|
+
if len(s) > end-4 and '\\' in s[end-4:end]:
|
|
269
|
+
end -= 4 - s[end-4:end].find('\\') # just before the backslash
|
|
270
|
+
while s[end-1] == '\\':
|
|
271
|
+
end -= 1
|
|
272
|
+
if end == start:
|
|
273
|
+
# must have been a long line of backslashes
|
|
274
|
+
end = start + limit - (limit % 2) - 4
|
|
275
|
+
break
|
|
276
|
+
chunks.append(s[start:end])
|
|
277
|
+
start = end
|
|
278
|
+
return '""'.join(chunks)
|
|
279
|
+
|
|
280
|
+
|
|
281
|
+
def encode_pyunicode_string(characters):
|
|
282
|
+
"""Create Py_UNICODE[] representation of a given unicode string.
|
|
283
|
+
"""
|
|
284
|
+
characters = list(map(ord, characters))
|
|
285
|
+
characters.append(0)
|
|
286
|
+
|
|
287
|
+
utf16, utf32 = [], characters
|
|
288
|
+
for code_point in characters:
|
|
289
|
+
if code_point >= 0x10000: # outside of BMP
|
|
290
|
+
high, low = divmod(code_point - 0x10000, 1024)
|
|
291
|
+
utf16.append(high + 0xD800)
|
|
292
|
+
utf16.append(low + 0xDC00)
|
|
293
|
+
else:
|
|
294
|
+
utf16.append(code_point)
|
|
295
|
+
|
|
296
|
+
if utf16 == utf32:
|
|
297
|
+
utf16 = []
|
|
298
|
+
return ",".join(map(str, utf16)), ",".join(map(str, utf32))
|