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