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.
Files changed (316) hide show
  1. Cython/Build/BuildExecutable.py +169 -0
  2. Cython/Build/Cache.py +199 -0
  3. Cython/Build/Cythonize.py +323 -0
  4. Cython/Build/Dependencies.py +1306 -0
  5. Cython/Build/Distutils.py +1 -0
  6. Cython/Build/Inline.py +463 -0
  7. Cython/Build/IpythonMagic.py +560 -0
  8. Cython/Build/SharedModule.py +76 -0
  9. Cython/Build/Tests/TestCyCache.py +194 -0
  10. Cython/Build/Tests/TestCythonizeArgsParser.py +481 -0
  11. Cython/Build/Tests/TestDependencies.py +133 -0
  12. Cython/Build/Tests/TestInline.py +177 -0
  13. Cython/Build/Tests/TestIpythonMagic.py +287 -0
  14. Cython/Build/Tests/TestRecythonize.py +212 -0
  15. Cython/Build/Tests/TestStripLiterals.py +155 -0
  16. Cython/Build/Tests/__init__.py +1 -0
  17. Cython/Build/__init__.py +8 -0
  18. Cython/CodeWriter.py +811 -0
  19. Cython/Compiler/AnalysedTreeTransforms.py +97 -0
  20. Cython/Compiler/Annotate.py +326 -0
  21. Cython/Compiler/AutoDocTransforms.py +320 -0
  22. Cython/Compiler/Buffer.py +680 -0
  23. Cython/Compiler/Builtin.py +934 -0
  24. Cython/Compiler/CmdLine.py +259 -0
  25. Cython/Compiler/Code.pxd +148 -0
  26. Cython/Compiler/Code.py +3375 -0
  27. Cython/Compiler/CodeGeneration.py +33 -0
  28. Cython/Compiler/CythonScope.py +187 -0
  29. Cython/Compiler/Dataclass.py +868 -0
  30. Cython/Compiler/DebugFlags.py +24 -0
  31. Cython/Compiler/Errors.py +295 -0
  32. Cython/Compiler/ExprNodes.py +15267 -0
  33. Cython/Compiler/FlowControl.pxd +97 -0
  34. Cython/Compiler/FlowControl.py +1455 -0
  35. Cython/Compiler/FusedNode.py +1002 -0
  36. Cython/Compiler/Future.py +16 -0
  37. Cython/Compiler/Interpreter.py +57 -0
  38. Cython/Compiler/Lexicon.py +340 -0
  39. Cython/Compiler/LineTable.py +114 -0
  40. Cython/Compiler/Main.py +853 -0
  41. Cython/Compiler/MatchCaseNodes.py +259 -0
  42. Cython/Compiler/MemoryView.py +922 -0
  43. Cython/Compiler/ModuleNode.py +4024 -0
  44. Cython/Compiler/Naming.py +374 -0
  45. Cython/Compiler/Nodes.py +10826 -0
  46. Cython/Compiler/Optimize.py +5256 -0
  47. Cython/Compiler/Options.py +835 -0
  48. Cython/Compiler/ParseTreeTransforms.pxd +77 -0
  49. Cython/Compiler/ParseTreeTransforms.py +4509 -0
  50. Cython/Compiler/Parsing.pxd +9 -0
  51. Cython/Compiler/Parsing.py +4789 -0
  52. Cython/Compiler/Pipeline.py +439 -0
  53. Cython/Compiler/PyrexTypes.py +5762 -0
  54. Cython/Compiler/Pythran.py +232 -0
  55. Cython/Compiler/Scanning.pxd +40 -0
  56. Cython/Compiler/Scanning.py +577 -0
  57. Cython/Compiler/StringEncoding.py +347 -0
  58. Cython/Compiler/Symtab.py +3080 -0
  59. Cython/Compiler/Tests/TestBuffer.py +105 -0
  60. Cython/Compiler/Tests/TestBuiltin.py +72 -0
  61. Cython/Compiler/Tests/TestCmdLine.py +586 -0
  62. Cython/Compiler/Tests/TestCode.py +86 -0
  63. Cython/Compiler/Tests/TestFlowControl.py +65 -0
  64. Cython/Compiler/Tests/TestGrammar.py +202 -0
  65. Cython/Compiler/Tests/TestMemView.py +71 -0
  66. Cython/Compiler/Tests/TestParseTreeTransforms.py +285 -0
  67. Cython/Compiler/Tests/TestScanning.py +134 -0
  68. Cython/Compiler/Tests/TestSignatureMatching.py +73 -0
  69. Cython/Compiler/Tests/TestStringEncoding.py +33 -0
  70. Cython/Compiler/Tests/TestTreeFragment.py +63 -0
  71. Cython/Compiler/Tests/TestTreePath.py +103 -0
  72. Cython/Compiler/Tests/TestTypes.py +75 -0
  73. Cython/Compiler/Tests/TestUtilityLoad.py +112 -0
  74. Cython/Compiler/Tests/TestVisitor.py +61 -0
  75. Cython/Compiler/Tests/Utils.py +36 -0
  76. Cython/Compiler/Tests/__init__.py +1 -0
  77. Cython/Compiler/TreeFragment.py +278 -0
  78. Cython/Compiler/TreePath.py +303 -0
  79. Cython/Compiler/TypeInference.py +584 -0
  80. Cython/Compiler/TypeSlots.py +1181 -0
  81. Cython/Compiler/UFuncs.py +311 -0
  82. Cython/Compiler/UtilNodes.py +389 -0
  83. Cython/Compiler/UtilityCode.py +344 -0
  84. Cython/Compiler/Version.py +8 -0
  85. Cython/Compiler/Visitor.pxd +53 -0
  86. Cython/Compiler/Visitor.py +861 -0
  87. Cython/Compiler/__init__.py +1 -0
  88. Cython/Coverage.py +448 -0
  89. Cython/Debugger/Cygdb.py +175 -0
  90. Cython/Debugger/DebugWriter.py +82 -0
  91. Cython/Debugger/Tests/TestLibCython.py +275 -0
  92. Cython/Debugger/Tests/__init__.py +1 -0
  93. Cython/Debugger/Tests/cfuncs.c +8 -0
  94. Cython/Debugger/Tests/codefile +49 -0
  95. Cython/Debugger/Tests/test_libcython_in_gdb.py +578 -0
  96. Cython/Debugger/Tests/test_libpython_in_gdb.py +90 -0
  97. Cython/Debugger/__init__.py +1 -0
  98. Cython/Debugger/libcython.py +1548 -0
  99. Cython/Debugger/libpython.py +2821 -0
  100. Cython/Debugging.py +20 -0
  101. Cython/Distutils/__init__.py +2 -0
  102. Cython/Distutils/build_ext.py +139 -0
  103. Cython/Distutils/extension.py +96 -0
  104. Cython/Distutils/old_build_ext.py +351 -0
  105. Cython/Includes/cpython/__init__.pxd +173 -0
  106. Cython/Includes/cpython/array.pxd +174 -0
  107. Cython/Includes/cpython/bool.pxd +37 -0
  108. Cython/Includes/cpython/buffer.pxd +112 -0
  109. Cython/Includes/cpython/bytearray.pxd +33 -0
  110. Cython/Includes/cpython/bytes.pxd +200 -0
  111. Cython/Includes/cpython/cellobject.pxd +35 -0
  112. Cython/Includes/cpython/ceval.pxd +8 -0
  113. Cython/Includes/cpython/codecs.pxd +121 -0
  114. Cython/Includes/cpython/complex.pxd +60 -0
  115. Cython/Includes/cpython/contextvars.pxd +145 -0
  116. Cython/Includes/cpython/conversion.pxd +36 -0
  117. Cython/Includes/cpython/datetime.pxd +395 -0
  118. Cython/Includes/cpython/descr.pxd +26 -0
  119. Cython/Includes/cpython/dict.pxd +187 -0
  120. Cython/Includes/cpython/exc.pxd +263 -0
  121. Cython/Includes/cpython/fileobject.pxd +57 -0
  122. Cython/Includes/cpython/float.pxd +47 -0
  123. Cython/Includes/cpython/function.pxd +65 -0
  124. Cython/Includes/cpython/genobject.pxd +25 -0
  125. Cython/Includes/cpython/getargs.pxd +12 -0
  126. Cython/Includes/cpython/instance.pxd +25 -0
  127. Cython/Includes/cpython/iterator.pxd +36 -0
  128. Cython/Includes/cpython/iterobject.pxd +24 -0
  129. Cython/Includes/cpython/list.pxd +92 -0
  130. Cython/Includes/cpython/long.pxd +149 -0
  131. Cython/Includes/cpython/longintrepr.pxd +14 -0
  132. Cython/Includes/cpython/mapping.pxd +63 -0
  133. Cython/Includes/cpython/marshal.pxd +66 -0
  134. Cython/Includes/cpython/mem.pxd +120 -0
  135. Cython/Includes/cpython/memoryview.pxd +50 -0
  136. Cython/Includes/cpython/method.pxd +49 -0
  137. Cython/Includes/cpython/module.pxd +208 -0
  138. Cython/Includes/cpython/number.pxd +258 -0
  139. Cython/Includes/cpython/object.pxd +433 -0
  140. Cython/Includes/cpython/pycapsule.pxd +143 -0
  141. Cython/Includes/cpython/pylifecycle.pxd +68 -0
  142. Cython/Includes/cpython/pyport.pxd +8 -0
  143. Cython/Includes/cpython/pystate.pxd +95 -0
  144. Cython/Includes/cpython/pythread.pxd +53 -0
  145. Cython/Includes/cpython/ref.pxd +67 -0
  146. Cython/Includes/cpython/sequence.pxd +134 -0
  147. Cython/Includes/cpython/set.pxd +119 -0
  148. Cython/Includes/cpython/slice.pxd +70 -0
  149. Cython/Includes/cpython/time.pxd +129 -0
  150. Cython/Includes/cpython/tuple.pxd +72 -0
  151. Cython/Includes/cpython/type.pxd +53 -0
  152. Cython/Includes/cpython/unicode.pxd +639 -0
  153. Cython/Includes/cpython/version.pxd +32 -0
  154. Cython/Includes/cpython/weakref.pxd +78 -0
  155. Cython/Includes/libc/__init__.pxd +1 -0
  156. Cython/Includes/libc/complex.pxd +35 -0
  157. Cython/Includes/libc/errno.pxd +127 -0
  158. Cython/Includes/libc/float.pxd +43 -0
  159. Cython/Includes/libc/limits.pxd +28 -0
  160. Cython/Includes/libc/locale.pxd +46 -0
  161. Cython/Includes/libc/math.pxd +209 -0
  162. Cython/Includes/libc/setjmp.pxd +10 -0
  163. Cython/Includes/libc/signal.pxd +64 -0
  164. Cython/Includes/libc/stddef.pxd +9 -0
  165. Cython/Includes/libc/stdint.pxd +105 -0
  166. Cython/Includes/libc/stdio.pxd +80 -0
  167. Cython/Includes/libc/stdlib.pxd +72 -0
  168. Cython/Includes/libc/string.pxd +50 -0
  169. Cython/Includes/libc/threads.pxd +84 -0
  170. Cython/Includes/libc/time.pxd +51 -0
  171. Cython/Includes/libcpp/__init__.pxd +4 -0
  172. Cython/Includes/libcpp/algorithm.pxd +320 -0
  173. Cython/Includes/libcpp/any.pxd +16 -0
  174. Cython/Includes/libcpp/atomic.pxd +59 -0
  175. Cython/Includes/libcpp/barrier.pxd +22 -0
  176. Cython/Includes/libcpp/bit.pxd +29 -0
  177. Cython/Includes/libcpp/cast.pxd +12 -0
  178. Cython/Includes/libcpp/cmath.pxd +518 -0
  179. Cython/Includes/libcpp/complex.pxd +106 -0
  180. Cython/Includes/libcpp/deque.pxd +165 -0
  181. Cython/Includes/libcpp/exception.pxd +86 -0
  182. Cython/Includes/libcpp/execution.pxd +15 -0
  183. Cython/Includes/libcpp/forward_list.pxd +63 -0
  184. Cython/Includes/libcpp/functional.pxd +26 -0
  185. Cython/Includes/libcpp/future.pxd +103 -0
  186. Cython/Includes/libcpp/iterator.pxd +34 -0
  187. Cython/Includes/libcpp/latch.pxd +17 -0
  188. Cython/Includes/libcpp/limits.pxd +61 -0
  189. Cython/Includes/libcpp/list.pxd +117 -0
  190. Cython/Includes/libcpp/map.pxd +252 -0
  191. Cython/Includes/libcpp/memory.pxd +115 -0
  192. Cython/Includes/libcpp/mutex.pxd +130 -0
  193. Cython/Includes/libcpp/numbers.pxd +15 -0
  194. Cython/Includes/libcpp/numeric.pxd +131 -0
  195. Cython/Includes/libcpp/optional.pxd +34 -0
  196. Cython/Includes/libcpp/pair.pxd +1 -0
  197. Cython/Includes/libcpp/queue.pxd +25 -0
  198. Cython/Includes/libcpp/random.pxd +166 -0
  199. Cython/Includes/libcpp/semaphore.pxd +44 -0
  200. Cython/Includes/libcpp/set.pxd +228 -0
  201. Cython/Includes/libcpp/shared_mutex.pxd +72 -0
  202. Cython/Includes/libcpp/span.pxd +87 -0
  203. Cython/Includes/libcpp/stack.pxd +11 -0
  204. Cython/Includes/libcpp/stop_token.pxd +105 -0
  205. Cython/Includes/libcpp/string.pxd +355 -0
  206. Cython/Includes/libcpp/string_view.pxd +181 -0
  207. Cython/Includes/libcpp/typeindex.pxd +15 -0
  208. Cython/Includes/libcpp/typeinfo.pxd +10 -0
  209. Cython/Includes/libcpp/unordered_map.pxd +193 -0
  210. Cython/Includes/libcpp/unordered_set.pxd +152 -0
  211. Cython/Includes/libcpp/utility.pxd +30 -0
  212. Cython/Includes/libcpp/vector.pxd +186 -0
  213. Cython/Includes/openmp.pxd +50 -0
  214. Cython/Includes/posix/__init__.pxd +1 -0
  215. Cython/Includes/posix/dlfcn.pxd +14 -0
  216. Cython/Includes/posix/fcntl.pxd +86 -0
  217. Cython/Includes/posix/ioctl.pxd +4 -0
  218. Cython/Includes/posix/mman.pxd +101 -0
  219. Cython/Includes/posix/resource.pxd +57 -0
  220. Cython/Includes/posix/select.pxd +21 -0
  221. Cython/Includes/posix/signal.pxd +73 -0
  222. Cython/Includes/posix/stat.pxd +98 -0
  223. Cython/Includes/posix/stdio.pxd +37 -0
  224. Cython/Includes/posix/stdlib.pxd +29 -0
  225. Cython/Includes/posix/strings.pxd +9 -0
  226. Cython/Includes/posix/time.pxd +71 -0
  227. Cython/Includes/posix/types.pxd +30 -0
  228. Cython/Includes/posix/uio.pxd +26 -0
  229. Cython/Includes/posix/unistd.pxd +271 -0
  230. Cython/Includes/posix/wait.pxd +38 -0
  231. Cython/Plex/Actions.pxd +24 -0
  232. Cython/Plex/Actions.py +119 -0
  233. Cython/Plex/DFA.pxd +14 -0
  234. Cython/Plex/DFA.py +164 -0
  235. Cython/Plex/Errors.py +48 -0
  236. Cython/Plex/Lexicons.py +178 -0
  237. Cython/Plex/Machines.pxd +36 -0
  238. Cython/Plex/Machines.py +238 -0
  239. Cython/Plex/Regexps.py +539 -0
  240. Cython/Plex/Scanners.pxd +47 -0
  241. Cython/Plex/Scanners.py +360 -0
  242. Cython/Plex/Transitions.pxd +14 -0
  243. Cython/Plex/Transitions.py +239 -0
  244. Cython/Plex/__init__.py +34 -0
  245. Cython/Runtime/__init__.py +1 -0
  246. Cython/Runtime/refnanny.pyx +237 -0
  247. Cython/Shadow.py +690 -0
  248. Cython/Shadow.pyi +521 -0
  249. Cython/StringIOTree.py +170 -0
  250. Cython/Tempita/__init__.py +4 -0
  251. Cython/Tempita/_looper.py +154 -0
  252. Cython/Tempita/_tempita.py +1091 -0
  253. Cython/TestUtils.py +410 -0
  254. Cython/Tests/TestCodeWriter.py +128 -0
  255. Cython/Tests/TestCythonUtils.py +202 -0
  256. Cython/Tests/TestJediTyper.py +223 -0
  257. Cython/Tests/TestShadow.py +114 -0
  258. Cython/Tests/TestStringIOTree.py +67 -0
  259. Cython/Tests/TestTestUtils.py +90 -0
  260. Cython/Tests/__init__.py +1 -0
  261. Cython/Tests/xmlrunner.py +390 -0
  262. Cython/Utility/AsyncGen.c +1002 -0
  263. Cython/Utility/Buffer.c +875 -0
  264. Cython/Utility/BufferFormatFromTypeInfo.pxd +2 -0
  265. Cython/Utility/Builtins.c +776 -0
  266. Cython/Utility/CConvert.pyx +134 -0
  267. Cython/Utility/CMath.c +104 -0
  268. Cython/Utility/CommonStructures.c +118 -0
  269. Cython/Utility/Complex.c +378 -0
  270. Cython/Utility/Coroutine.c +2206 -0
  271. Cython/Utility/CpdefEnums.pyx +103 -0
  272. Cython/Utility/CppConvert.pyx +279 -0
  273. Cython/Utility/CppSupport.cpp +143 -0
  274. Cython/Utility/CythonFunction.c +1794 -0
  275. Cython/Utility/Dataclasses.c +185 -0
  276. Cython/Utility/Dataclasses.py +112 -0
  277. Cython/Utility/Embed.c +125 -0
  278. Cython/Utility/Exceptions.c +1012 -0
  279. Cython/Utility/ExtensionTypes.c +809 -0
  280. Cython/Utility/FunctionArguments.c +965 -0
  281. Cython/Utility/ImportExport.c +987 -0
  282. Cython/Utility/Lock.c +136 -0
  283. Cython/Utility/MemoryView.pxd +187 -0
  284. Cython/Utility/MemoryView.pyx +1481 -0
  285. Cython/Utility/MemoryView_C.c +1046 -0
  286. Cython/Utility/ModuleSetupCode.c +3059 -0
  287. Cython/Utility/NumpyImportArray.c +46 -0
  288. Cython/Utility/ObjectHandling.c +3342 -0
  289. Cython/Utility/Optimize.c +1589 -0
  290. Cython/Utility/Overflow.c +404 -0
  291. Cython/Utility/Printing.c +86 -0
  292. Cython/Utility/Profile.c +709 -0
  293. Cython/Utility/StringTools.c +1259 -0
  294. Cython/Utility/TestCyUtilityLoader.pyx +8 -0
  295. Cython/Utility/TestCythonScope.pyx +75 -0
  296. Cython/Utility/TestUtilityLoader.c +12 -0
  297. Cython/Utility/TypeConversion.c +1284 -0
  298. Cython/Utility/UFuncs.pyx +50 -0
  299. Cython/Utility/UFuncs_C.c +89 -0
  300. Cython/Utility/__init__.py +28 -0
  301. Cython/Utility/arrayarray.h +148 -0
  302. Cython/Utils.py +687 -0
  303. Cython/__init__.py +10 -0
  304. Cython/__init__.pyi +7 -0
  305. Cython/py.typed +0 -0
  306. cython-3.1.0.dist-info/COPYING.txt +19 -0
  307. cython-3.1.0.dist-info/LICENSE.txt +176 -0
  308. cython-3.1.0.dist-info/METADATA +636 -0
  309. cython-3.1.0.dist-info/RECORD +316 -0
  310. cython-3.1.0.dist-info/WHEEL +5 -0
  311. cython-3.1.0.dist-info/entry_points.txt +4 -0
  312. cython-3.1.0.dist-info/top_level.txt +3 -0
  313. cython.py +29 -0
  314. pyximport/__init__.py +4 -0
  315. pyximport/pyxbuild.py +160 -0
  316. 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))