Cython 3.3.0__cp315-cp315-win_amd64.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 (339) hide show
  1. Cython/Build/BuildExecutable.py +156 -0
  2. Cython/Build/Cache.py +199 -0
  3. Cython/Build/Cythonize.py +349 -0
  4. Cython/Build/Dependencies.py +1281 -0
  5. Cython/Build/Distutils.py +1 -0
  6. Cython/Build/Inline.py +467 -0
  7. Cython/Build/IpythonMagic.py +559 -0
  8. Cython/Build/SharedModule.py +165 -0
  9. Cython/Build/Tests/TestCyCache.py +195 -0
  10. Cython/Build/Tests/TestCythonizeArgsParser.py +480 -0
  11. Cython/Build/Tests/TestDependencies.py +133 -0
  12. Cython/Build/Tests/TestInline.py +177 -0
  13. Cython/Build/Tests/TestIpythonMagic.py +303 -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 +825 -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 +679 -0
  23. Cython/Compiler/Builtin.py +1102 -0
  24. Cython/Compiler/CmdLine.py +373 -0
  25. Cython/Compiler/Code.cp315-win_amd64.pyd +0 -0
  26. Cython/Compiler/Code.pxd +154 -0
  27. Cython/Compiler/Code.py +3760 -0
  28. Cython/Compiler/CodeGeneration.py +33 -0
  29. Cython/Compiler/CythonScope.py +208 -0
  30. Cython/Compiler/Dataclass.py +890 -0
  31. Cython/Compiler/DebugFlags.py +24 -0
  32. Cython/Compiler/Errors.py +310 -0
  33. Cython/Compiler/ExprNodes.py +16273 -0
  34. Cython/Compiler/FlowControl.cp315-win_amd64.pyd +0 -0
  35. Cython/Compiler/FlowControl.pxd +112 -0
  36. Cython/Compiler/FlowControl.py +1573 -0
  37. Cython/Compiler/FusedNode.cp315-win_amd64.pyd +0 -0
  38. Cython/Compiler/FusedNode.py +978 -0
  39. Cython/Compiler/Future.py +16 -0
  40. Cython/Compiler/Interpreter.py +57 -0
  41. Cython/Compiler/Lexicon.py +422 -0
  42. Cython/Compiler/LineTable.cp315-win_amd64.pyd +0 -0
  43. Cython/Compiler/LineTable.py +114 -0
  44. Cython/Compiler/Main.py +856 -0
  45. Cython/Compiler/MatchCaseNodes.py +2200 -0
  46. Cython/Compiler/MemoryView.py +930 -0
  47. Cython/Compiler/ModuleNode.py +4548 -0
  48. Cython/Compiler/Naming.py +370 -0
  49. Cython/Compiler/Nodes.py +11304 -0
  50. Cython/Compiler/Optimize.py +5564 -0
  51. Cython/Compiler/Options.py +840 -0
  52. Cython/Compiler/ParseTreeTransforms.pxd +80 -0
  53. Cython/Compiler/ParseTreeTransforms.py +4808 -0
  54. Cython/Compiler/Parsing.cp315-win_amd64.pyd +0 -0
  55. Cython/Compiler/Parsing.pxd +9 -0
  56. Cython/Compiler/Parsing.py +4809 -0
  57. Cython/Compiler/Pipeline.py +439 -0
  58. Cython/Compiler/PyrexTypes.py +6588 -0
  59. Cython/Compiler/Pythran.py +232 -0
  60. Cython/Compiler/Scanning.cp315-win_amd64.pyd +0 -0
  61. Cython/Compiler/Scanning.pxd +70 -0
  62. Cython/Compiler/Scanning.py +720 -0
  63. Cython/Compiler/StringEncoding.cp315-win_amd64.pyd +0 -0
  64. Cython/Compiler/StringEncoding.py +354 -0
  65. Cython/Compiler/Symtab.py +3121 -0
  66. Cython/Compiler/Tests/TestBuffer.py +105 -0
  67. Cython/Compiler/Tests/TestBuiltin.py +196 -0
  68. Cython/Compiler/Tests/TestCmdLine.py +652 -0
  69. Cython/Compiler/Tests/TestCode.py +145 -0
  70. Cython/Compiler/Tests/TestFlowControl.py +65 -0
  71. Cython/Compiler/Tests/TestGrammar.py +202 -0
  72. Cython/Compiler/Tests/TestMemView.py +71 -0
  73. Cython/Compiler/Tests/TestParseTreeTransforms.py +285 -0
  74. Cython/Compiler/Tests/TestScanning.py +132 -0
  75. Cython/Compiler/Tests/TestSignatureMatching.py +73 -0
  76. Cython/Compiler/Tests/TestStringEncoding.py +20 -0
  77. Cython/Compiler/Tests/TestTreeFragment.py +63 -0
  78. Cython/Compiler/Tests/TestTreePath.py +103 -0
  79. Cython/Compiler/Tests/TestTypes.py +119 -0
  80. Cython/Compiler/Tests/TestUtilityLoad.py +112 -0
  81. Cython/Compiler/Tests/TestVisitor.py +119 -0
  82. Cython/Compiler/Tests/Utils.py +36 -0
  83. Cython/Compiler/Tests/__init__.py +1 -0
  84. Cython/Compiler/TreeFragment.py +279 -0
  85. Cython/Compiler/TreePath.py +303 -0
  86. Cython/Compiler/TypeInference.py +611 -0
  87. Cython/Compiler/TypeSlots.py +1329 -0
  88. Cython/Compiler/UFuncs.py +317 -0
  89. Cython/Compiler/UtilNodes.py +389 -0
  90. Cython/Compiler/UtilityCode.py +354 -0
  91. Cython/Compiler/Version.py +8 -0
  92. Cython/Compiler/Visitor.cp315-win_amd64.pyd +0 -0
  93. Cython/Compiler/Visitor.pxd +52 -0
  94. Cython/Compiler/Visitor.py +914 -0
  95. Cython/Compiler/__init__.py +1 -0
  96. Cython/Coverage.py +448 -0
  97. Cython/Debugger/Cygdb.py +214 -0
  98. Cython/Debugger/DebugWriter.py +82 -0
  99. Cython/Debugger/Tests/TestLibCython.py +280 -0
  100. Cython/Debugger/Tests/__init__.py +1 -0
  101. Cython/Debugger/Tests/cfuncs.c +8 -0
  102. Cython/Debugger/Tests/codefile +49 -0
  103. Cython/Debugger/Tests/test_libcython_in_gdb.py +580 -0
  104. Cython/Debugger/Tests/test_libpython_in_gdb.py +90 -0
  105. Cython/Debugger/__init__.py +1 -0
  106. Cython/Debugger/libcython.py +1548 -0
  107. Cython/Debugger/libpython.py +2821 -0
  108. Cython/Debugging.py +20 -0
  109. Cython/Distutils/__init__.py +2 -0
  110. Cython/Distutils/build_ext.py +143 -0
  111. Cython/Distutils/extension.py +96 -0
  112. Cython/Distutils/old_build_ext.py +351 -0
  113. Cython/Includes/cpython/__init__.pxd +173 -0
  114. Cython/Includes/cpython/array.pxd +152 -0
  115. Cython/Includes/cpython/bool.pxd +37 -0
  116. Cython/Includes/cpython/buffer.pxd +112 -0
  117. Cython/Includes/cpython/bytearray.pxd +33 -0
  118. Cython/Includes/cpython/bytes.pxd +200 -0
  119. Cython/Includes/cpython/cellobject.pxd +35 -0
  120. Cython/Includes/cpython/ceval.pxd +8 -0
  121. Cython/Includes/cpython/codecs.pxd +121 -0
  122. Cython/Includes/cpython/complex.pxd +60 -0
  123. Cython/Includes/cpython/contextvars.pxd +145 -0
  124. Cython/Includes/cpython/conversion.pxd +36 -0
  125. Cython/Includes/cpython/datetime.pxd +395 -0
  126. Cython/Includes/cpython/descr.pxd +26 -0
  127. Cython/Includes/cpython/dict.pxd +268 -0
  128. Cython/Includes/cpython/exc.pxd +263 -0
  129. Cython/Includes/cpython/fileobject.pxd +57 -0
  130. Cython/Includes/cpython/float.pxd +56 -0
  131. Cython/Includes/cpython/frozendict.pxd +37 -0
  132. Cython/Includes/cpython/function.pxd +65 -0
  133. Cython/Includes/cpython/genobject.pxd +25 -0
  134. Cython/Includes/cpython/getargs.pxd +12 -0
  135. Cython/Includes/cpython/instance.pxd +25 -0
  136. Cython/Includes/cpython/iterator.pxd +36 -0
  137. Cython/Includes/cpython/iterobject.pxd +24 -0
  138. Cython/Includes/cpython/list.pxd +144 -0
  139. Cython/Includes/cpython/long.pxd +180 -0
  140. Cython/Includes/cpython/longintrepr.pxd +14 -0
  141. Cython/Includes/cpython/mapping.pxd +63 -0
  142. Cython/Includes/cpython/marshal.pxd +66 -0
  143. Cython/Includes/cpython/mem.pxd +120 -0
  144. Cython/Includes/cpython/memoryview.pxd +50 -0
  145. Cython/Includes/cpython/method.pxd +49 -0
  146. Cython/Includes/cpython/module.pxd +208 -0
  147. Cython/Includes/cpython/number.pxd +258 -0
  148. Cython/Includes/cpython/object.pxd +430 -0
  149. Cython/Includes/cpython/pycapsule.pxd +143 -0
  150. Cython/Includes/cpython/pylifecycle.pxd +68 -0
  151. Cython/Includes/cpython/pyport.pxd +8 -0
  152. Cython/Includes/cpython/pystate.pxd +95 -0
  153. Cython/Includes/cpython/pythread.pxd +53 -0
  154. Cython/Includes/cpython/ref.pxd +141 -0
  155. Cython/Includes/cpython/sentinel.pxd +17 -0
  156. Cython/Includes/cpython/sequence.pxd +134 -0
  157. Cython/Includes/cpython/set.pxd +119 -0
  158. Cython/Includes/cpython/slice.pxd +70 -0
  159. Cython/Includes/cpython/time.pxd +129 -0
  160. Cython/Includes/cpython/tuple.pxd +72 -0
  161. Cython/Includes/cpython/type.pxd +146 -0
  162. Cython/Includes/cpython/unicode.pxd +639 -0
  163. Cython/Includes/cpython/version.pxd +32 -0
  164. Cython/Includes/cpython/weakref.pxd +78 -0
  165. Cython/Includes/libc/__init__.pxd +1 -0
  166. Cython/Includes/libc/complex.pxd +35 -0
  167. Cython/Includes/libc/errno.pxd +127 -0
  168. Cython/Includes/libc/float.pxd +43 -0
  169. Cython/Includes/libc/limits.pxd +28 -0
  170. Cython/Includes/libc/locale.pxd +46 -0
  171. Cython/Includes/libc/math.pxd +209 -0
  172. Cython/Includes/libc/setjmp.pxd +10 -0
  173. Cython/Includes/libc/signal.pxd +64 -0
  174. Cython/Includes/libc/stddef.pxd +9 -0
  175. Cython/Includes/libc/stdint.pxd +105 -0
  176. Cython/Includes/libc/stdio.pxd +80 -0
  177. Cython/Includes/libc/stdlib.pxd +72 -0
  178. Cython/Includes/libc/string.pxd +50 -0
  179. Cython/Includes/libc/threads.pxd +234 -0
  180. Cython/Includes/libc/time.pxd +52 -0
  181. Cython/Includes/libcpp/__init__.pxd +4 -0
  182. Cython/Includes/libcpp/algorithm.pxd +320 -0
  183. Cython/Includes/libcpp/any.pxd +16 -0
  184. Cython/Includes/libcpp/atomic.pxd +59 -0
  185. Cython/Includes/libcpp/barrier.pxd +22 -0
  186. Cython/Includes/libcpp/bit.pxd +29 -0
  187. Cython/Includes/libcpp/cast.pxd +12 -0
  188. Cython/Includes/libcpp/cmath.pxd +518 -0
  189. Cython/Includes/libcpp/complex.pxd +106 -0
  190. Cython/Includes/libcpp/condition_variable.pxd +322 -0
  191. Cython/Includes/libcpp/deque.pxd +165 -0
  192. Cython/Includes/libcpp/exception.pxd +216 -0
  193. Cython/Includes/libcpp/execution.pxd +15 -0
  194. Cython/Includes/libcpp/forward_list.pxd +63 -0
  195. Cython/Includes/libcpp/functional.pxd +26 -0
  196. Cython/Includes/libcpp/future.pxd +103 -0
  197. Cython/Includes/libcpp/iterator.pxd +34 -0
  198. Cython/Includes/libcpp/latch.pxd +17 -0
  199. Cython/Includes/libcpp/limits.pxd +61 -0
  200. Cython/Includes/libcpp/list.pxd +117 -0
  201. Cython/Includes/libcpp/map.pxd +252 -0
  202. Cython/Includes/libcpp/memory.pxd +115 -0
  203. Cython/Includes/libcpp/mutex.pxd +387 -0
  204. Cython/Includes/libcpp/numbers.pxd +15 -0
  205. Cython/Includes/libcpp/numeric.pxd +131 -0
  206. Cython/Includes/libcpp/optional.pxd +34 -0
  207. Cython/Includes/libcpp/pair.pxd +1 -0
  208. Cython/Includes/libcpp/queue.pxd +25 -0
  209. Cython/Includes/libcpp/random.pxd +166 -0
  210. Cython/Includes/libcpp/semaphore.pxd +43 -0
  211. Cython/Includes/libcpp/set.pxd +228 -0
  212. Cython/Includes/libcpp/shared_mutex.pxd +96 -0
  213. Cython/Includes/libcpp/span.pxd +87 -0
  214. Cython/Includes/libcpp/stack.pxd +11 -0
  215. Cython/Includes/libcpp/stop_token.pxd +117 -0
  216. Cython/Includes/libcpp/string.pxd +355 -0
  217. Cython/Includes/libcpp/string_view.pxd +183 -0
  218. Cython/Includes/libcpp/typeindex.pxd +15 -0
  219. Cython/Includes/libcpp/typeinfo.pxd +10 -0
  220. Cython/Includes/libcpp/unordered_map.pxd +193 -0
  221. Cython/Includes/libcpp/unordered_set.pxd +152 -0
  222. Cython/Includes/libcpp/utility.pxd +30 -0
  223. Cython/Includes/libcpp/vector.pxd +186 -0
  224. Cython/Includes/numpy/math.pxd +150 -0
  225. Cython/Includes/openmp.pxd +50 -0
  226. Cython/Includes/posix/__init__.pxd +1 -0
  227. Cython/Includes/posix/dlfcn.pxd +14 -0
  228. Cython/Includes/posix/fcntl.pxd +86 -0
  229. Cython/Includes/posix/ioctl.pxd +4 -0
  230. Cython/Includes/posix/mman.pxd +101 -0
  231. Cython/Includes/posix/resource.pxd +57 -0
  232. Cython/Includes/posix/select.pxd +21 -0
  233. Cython/Includes/posix/signal.pxd +73 -0
  234. Cython/Includes/posix/stat.pxd +98 -0
  235. Cython/Includes/posix/stdio.pxd +37 -0
  236. Cython/Includes/posix/stdlib.pxd +29 -0
  237. Cython/Includes/posix/strings.pxd +9 -0
  238. Cython/Includes/posix/time.pxd +71 -0
  239. Cython/Includes/posix/types.pxd +30 -0
  240. Cython/Includes/posix/uio.pxd +26 -0
  241. Cython/Includes/posix/unistd.pxd +271 -0
  242. Cython/Includes/posix/wait.pxd +38 -0
  243. Cython/LZSS.cp315-win_amd64.pyd +0 -0
  244. Cython/LZSS.py +184 -0
  245. Cython/Plex/Actions.cp315-win_amd64.pyd +0 -0
  246. Cython/Plex/Actions.pxd +24 -0
  247. Cython/Plex/Actions.py +119 -0
  248. Cython/Plex/DFA.cp315-win_amd64.pyd +0 -0
  249. Cython/Plex/DFA.pxd +14 -0
  250. Cython/Plex/DFA.py +164 -0
  251. Cython/Plex/Errors.py +48 -0
  252. Cython/Plex/Lexicons.py +178 -0
  253. Cython/Plex/Machines.cp315-win_amd64.pyd +0 -0
  254. Cython/Plex/Machines.pxd +36 -0
  255. Cython/Plex/Machines.py +238 -0
  256. Cython/Plex/Regexps.py +535 -0
  257. Cython/Plex/Scanners.cp315-win_amd64.pyd +0 -0
  258. Cython/Plex/Scanners.pxd +45 -0
  259. Cython/Plex/Scanners.py +328 -0
  260. Cython/Plex/Transitions.cp315-win_amd64.pyd +0 -0
  261. Cython/Plex/Transitions.pxd +14 -0
  262. Cython/Plex/Transitions.py +239 -0
  263. Cython/Plex/__init__.py +34 -0
  264. Cython/Runtime/__init__.py +1 -0
  265. Cython/Runtime/refnanny.cp315-win_amd64.pyd +0 -0
  266. Cython/Runtime/refnanny.pyx +237 -0
  267. Cython/Shadow.py +1174 -0
  268. Cython/StringIOTree.cp315-win_amd64.pyd +0 -0
  269. Cython/StringIOTree.py +169 -0
  270. Cython/Tempita/__init__.py +4 -0
  271. Cython/Tempita/_looper.py +154 -0
  272. Cython/Tempita/_tempita.cp315-win_amd64.pyd +0 -0
  273. Cython/Tempita/_tempita.py +1087 -0
  274. Cython/TestUtils.py +472 -0
  275. Cython/Tests/TestCodeWriter.py +128 -0
  276. Cython/Tests/TestCythonUtils.py +202 -0
  277. Cython/Tests/TestJediTyper.py +223 -0
  278. Cython/Tests/TestShadow.py +125 -0
  279. Cython/Tests/TestStringIOTree.py +68 -0
  280. Cython/Tests/TestTestUtils.py +89 -0
  281. Cython/Tests/__init__.py +1 -0
  282. Cython/Tests/xmlrunner.py +390 -0
  283. Cython/Utility/AsyncGen.c +1152 -0
  284. Cython/Utility/Buffer.c +866 -0
  285. Cython/Utility/BufferFormatFromTypeInfo.pxd +2 -0
  286. Cython/Utility/Builtins.c +1068 -0
  287. Cython/Utility/CConvert.pyx +153 -0
  288. Cython/Utility/CMath.c +104 -0
  289. Cython/Utility/CommonStructures.c +244 -0
  290. Cython/Utility/Complex.c +378 -0
  291. Cython/Utility/Coroutine.c +2344 -0
  292. Cython/Utility/CpdefEnums.pyx +119 -0
  293. Cython/Utility/CppConvert.pyx +282 -0
  294. Cython/Utility/CppSupport.cpp +151 -0
  295. Cython/Utility/CythonFunction.c +2185 -0
  296. Cython/Utility/Dataclasses.c +101 -0
  297. Cython/Utility/Embed.c +129 -0
  298. Cython/Utility/Exceptions.c +1331 -0
  299. Cython/Utility/Exceptions_Cy.pyx +109 -0
  300. Cython/Utility/ExtensionTypes.c +1199 -0
  301. Cython/Utility/FunctionArguments.c +1052 -0
  302. Cython/Utility/FusedFunction.pyx +44 -0
  303. Cython/Utility/ImportExport.c +972 -0
  304. Cython/Utility/MatchCase.c +981 -0
  305. Cython/Utility/MatchCase_Cy.pyx +12 -0
  306. Cython/Utility/MemoryView.pxd +108 -0
  307. Cython/Utility/MemoryView.pyx +1499 -0
  308. Cython/Utility/MemoryView_C.c +1056 -0
  309. Cython/Utility/ModuleSetupCode.c +3319 -0
  310. Cython/Utility/NumpyImportArray.c +46 -0
  311. Cython/Utility/ObjectHandling.c +3404 -0
  312. Cython/Utility/Optimize.c +2564 -0
  313. Cython/Utility/Overflow.c +378 -0
  314. Cython/Utility/Profile.c +736 -0
  315. Cython/Utility/StringTools.c +1534 -0
  316. Cython/Utility/Synchronization.c +438 -0
  317. Cython/Utility/TString.c +369 -0
  318. Cython/Utility/TestCyUtilityLoader.pyx +8 -0
  319. Cython/Utility/TestCythonScope.pyx +75 -0
  320. Cython/Utility/TestUtilityLoader.c +12 -0
  321. Cython/Utility/TypeConversion.c +1588 -0
  322. Cython/Utility/UFuncs.pyx +50 -0
  323. Cython/Utility/UFuncs_C.c +89 -0
  324. Cython/Utility/__init__.py +28 -0
  325. Cython/Utility/arrayarray.h +172 -0
  326. Cython/Utils.cp315-win_amd64.pyd +0 -0
  327. Cython/Utils.py +680 -0
  328. Cython/__init__.py +12 -0
  329. Cython/_shared.cp315-win_amd64.pyd +0 -0
  330. Cython/py.typed +0 -0
  331. cython-3.3.0.dist-info/METADATA +555 -0
  332. cython-3.3.0.dist-info/RECORD +339 -0
  333. cython-3.3.0.dist-info/WHEEL +5 -0
  334. cython-3.3.0.dist-info/entry_points.txt +4 -0
  335. cython-3.3.0.dist-info/top_level.txt +3 -0
  336. cython.py +29 -0
  337. pyximport/__init__.py +4 -0
  338. pyximport/pyxbuild.py +160 -0
  339. pyximport/pyximport.py +482 -0
@@ -0,0 +1,354 @@
1
+ #
2
+ # Cython -- encoding related tools
3
+ #
4
+
5
+ # cython: infer_types=True
6
+
7
+ import re
8
+ import cython
9
+
10
+ @cython.final
11
+ @cython.cclass
12
+ class UnicodeLiteralBuilder:
13
+ """Assemble a unicode string.
14
+ """
15
+ _chars: list
16
+
17
+ def __init__(self):
18
+ self._chars = []
19
+
20
+ @property
21
+ def chars(self) -> list:
22
+ return self._chars
23
+
24
+ @cython.ccall
25
+ def append(self, characters):
26
+ assert isinstance(characters, str), f"Expected str, got {type(characters)}"
27
+ self._chars.append(characters)
28
+
29
+ @cython.ccall
30
+ def append_charval(self, char_number):
31
+ self._chars.append( chr(char_number) )
32
+
33
+ def append_uescape(self, char_number, escape_string):
34
+ self.append_charval(char_number)
35
+
36
+ @cython.ccall
37
+ def getstring(self):
38
+ return EncodedString(''.join(self._chars))
39
+
40
+ def getstrings(self):
41
+ return (None, self.getstring())
42
+
43
+
44
+ @cython.final
45
+ @cython.cclass
46
+ class BytesLiteralBuilder:
47
+ """Assemble a byte string or char value.
48
+ """
49
+ _chars: list
50
+ _target_encoding: str
51
+
52
+ def __init__(self, target_encoding):
53
+ self._chars = []
54
+ self._target_encoding = target_encoding
55
+
56
+ @property
57
+ def chars(self) -> list:
58
+ return self._chars
59
+
60
+ @cython.ccall
61
+ def append(self, characters):
62
+ if isinstance(characters, str):
63
+ characters = characters.encode(self._target_encoding)
64
+ assert isinstance(characters, bytes), str(type(characters))
65
+ self._chars.append(characters)
66
+
67
+ @cython.ccall
68
+ def append_charval(self, char_number):
69
+ self._chars.append( chr(char_number).encode('ISO-8859-1') )
70
+
71
+ def append_uescape(self, char_number, escape_string):
72
+ self.append(escape_string)
73
+
74
+ @cython.ccall
75
+ def getstring(self):
76
+ # this *must* return a byte string!
77
+ return bytes_literal(b''.join(self._chars), self._target_encoding)
78
+
79
+ def getchar(self):
80
+ # this *must* return a byte string!
81
+ return self.getstring()
82
+
83
+ def getstrings(self):
84
+ return (self.getstring(), None)
85
+
86
+
87
+ @cython.final
88
+ @cython.cclass
89
+ class StrLiteralBuilder:
90
+ """Assemble both a bytes and a unicode representation of a string.
91
+ """
92
+ _bytes: BytesLiteralBuilder
93
+ _unicode: UnicodeLiteralBuilder
94
+
95
+ def __init__(self, target_encoding):
96
+ self._bytes = BytesLiteralBuilder(target_encoding)
97
+ self._unicode = UnicodeLiteralBuilder()
98
+
99
+ @cython.ccall
100
+ def append(self, characters):
101
+ self._bytes.append(characters)
102
+ self._unicode.append(characters)
103
+
104
+ @cython.ccall
105
+ def append_charval(self, char_number):
106
+ self._bytes.append_charval(char_number)
107
+ self._unicode.append_charval(char_number)
108
+
109
+ def append_uescape(self, char_number, escape_string):
110
+ self._bytes.append(escape_string)
111
+ self._unicode.append_charval(char_number)
112
+
113
+ def getstrings(self):
114
+ return (self._bytes.getstring(), self._unicode.getstring())
115
+
116
+
117
+ class EncodedString(str):
118
+ # unicode string subclass to keep track of the original encoding.
119
+ # 'encoding' is None for unicode strings and the source encoding
120
+ # otherwise
121
+ encoding = None
122
+
123
+ def __deepcopy__(self, memo):
124
+ return self
125
+
126
+ def byteencode(self):
127
+ assert self.encoding is not None
128
+ return self.encode(self.encoding)
129
+
130
+ def utf8encode(self):
131
+ assert self.encoding is None, self.encoding
132
+ return self.encode("UTF-8")
133
+
134
+ @property
135
+ def is_unicode(self):
136
+ return self.encoding is None
137
+
138
+ def as_utf8_string(self):
139
+ return bytes_literal(self.utf8encode(), 'utf8')
140
+
141
+ def as_c_string_literal(self):
142
+ # first encodes the string then produces a c string literal
143
+ if self.encoding is None:
144
+ s = self.as_utf8_string()
145
+ else:
146
+ s = bytes_literal(self.byteencode(), self.encoding)
147
+ return s.as_c_string_literal()
148
+
149
+
150
+ def string_contains_lone_surrogates(ustring):
151
+ """
152
+ Check if the unicode string contains lone surrogate code points
153
+ on a CPython platform with wide (UCS-4) or narrow (UTF-16)
154
+ Unicode, i.e. characters that would be spelled as two
155
+ separate code units on a narrow platform, but that do not form a pair.
156
+ """
157
+ for c in map(ord, ustring):
158
+ # Surrogates tend to be rare, so we use separate conditions.
159
+ if 0xD800 <= c and c <= 0xDFFF:
160
+ # on 32bit Unicode platforms, there is never a pair
161
+ return True
162
+ return False
163
+
164
+
165
+ class BytesLiteral(bytes):
166
+ # bytes subclass that is compatible with EncodedString
167
+ encoding = None
168
+
169
+ def __deepcopy__(self, memo):
170
+ return self
171
+
172
+ def byteencode(self):
173
+ return bytes(self)
174
+
175
+ def utf8encode(self):
176
+ assert False, f"this is not a unicode string: {self!r}"
177
+
178
+ def __str__(self):
179
+ """Fake-decode the byte string to unicode to support %
180
+ formatting of unicode strings.
181
+ """
182
+ return self.decode('ISO-8859-1')
183
+
184
+ is_unicode = False
185
+
186
+ def as_c_string_literal(self):
187
+ value = split_string_literal(escape_byte_string(self))
188
+ return f'"{value}"'
189
+
190
+
191
+ @cython.ccall
192
+ def bytes_literal(s, encoding):
193
+ assert isinstance(s, bytes)
194
+ s = BytesLiteral(s)
195
+ s.encoding = encoding
196
+ return s
197
+
198
+
199
+ @cython.ccall
200
+ def encoded_string(s, encoding):
201
+ assert isinstance(s, (str, bytes))
202
+ s = EncodedString(s)
203
+ if encoding is not None:
204
+ s.encoding = encoding
205
+ return s
206
+
207
+ def encoded_string_or_bytes_literal(s, encoding):
208
+ if isinstance(s, bytes):
209
+ return bytes_literal(s, encoding)
210
+ else:
211
+ return encoded_string(s, encoding)
212
+
213
+
214
+ char_from_escape_sequence = {
215
+ r'\a' : '\a',
216
+ r'\b' : '\b',
217
+ r'\f' : '\f',
218
+ r'\n' : '\n',
219
+ r'\r' : '\r',
220
+ r'\t' : '\t',
221
+ r'\v' : '\v',
222
+ }.get
223
+
224
+
225
+ @cython.cfunc
226
+ def _to_escape_sequence(s: str) -> str:
227
+ if s in '\n\r\t':
228
+ return repr(s)[1:-1]
229
+ elif s == '"':
230
+ return r'\"'
231
+ elif s == '\\':
232
+ return r'\\'
233
+ else:
234
+ # within a character sequence, oct passes much better than hex
235
+ return ''.join([f'\\{ord(c):03o}' for c in s])
236
+
237
+
238
+ @cython.cfunc
239
+ def _build_specials_replacer():
240
+ subexps = []
241
+ replacements = {}
242
+
243
+ _c_special: tuple = ('\\', '??', '"', "'") + tuple(map(chr, range(32)))
244
+
245
+ special: str
246
+ for special in _c_special:
247
+ regexp = ''.join(['[%s]' % c.replace('\\', '\\\\') for c in special])
248
+ subexps.append(regexp)
249
+ replacements[special.encode('ASCII')] = _to_escape_sequence(special).encode('ASCII')
250
+
251
+ sub = re.compile(('(%s)' % '|'.join(subexps)).encode('ASCII')).sub
252
+ def replace_specials(m):
253
+ return replacements[m.group(1)]
254
+ def replace(s):
255
+ return sub(replace_specials, s)
256
+ return replace
257
+
258
+ _replace_specials = cython.declare(object, _build_specials_replacer())
259
+
260
+
261
+ def escape_char(char):
262
+ c: cython.Py_UCS4 = char.decode('ISO-8859-1')
263
+ if c in '\n\r\t\\':
264
+ return repr(c)[1:-1]
265
+ elif c == "'":
266
+ return "\\'"
267
+ n = ord(c)
268
+ if n < 32 or n >= 127:
269
+ # hex works well for characters
270
+ return f"\\x{n:02X}"
271
+ else:
272
+ # strictly £, @ and ` (which fall in this list) are only allowed
273
+ # in C23. But practically they're well-supported earlier.
274
+ return c
275
+
276
+
277
+ @cython.ccall
278
+ def escape_byte_string(bytestring) -> str:
279
+ """Escape a byte string so that it can be written into C code.
280
+ Note that this returns a Unicode string instead which, when
281
+ encoded as ASCII, will result in the correct byte sequence
282
+ being written.
283
+ """
284
+ s: bytes = _replace_specials(bytestring)
285
+ try:
286
+ return s.decode("ASCII") # trial decoding: plain ASCII => done
287
+ except UnicodeDecodeError:
288
+ pass
289
+
290
+ s_new = bytearray()
291
+ append, extend = s_new.append, s_new.extend
292
+ for b in s:
293
+ if b >= 127:
294
+ extend(b'\\%03o' % b)
295
+ else:
296
+ append(b)
297
+ return s_new.decode('ASCII')
298
+
299
+
300
+ @cython.ccall
301
+ def split_string_literal(s: str, limit: cython.int = 2000) -> str:
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
+
323
+ def encode_pyunicode_string(string):
324
+ """Create Py_UNICODE[] representation of a given unicode string.
325
+ """
326
+ utf16 = None # Start lazy, we won't need it for BMP strings.
327
+ utf32 = []
328
+
329
+ characters = cython.cast(str, string) # was EncodedString or str
330
+ code_point: cython.Py_UCS4
331
+
332
+ for code_point in characters:
333
+ charval = ord(code_point)
334
+ ch = f"{charval:d}"
335
+ if code_point >= 0x10000: # outside of BMP
336
+ if utf16 is None:
337
+ utf16 = utf32[:]
338
+ high, low = divmod(charval - 0x10000, 1024)
339
+ utf16.append(f"{high + 0xD800:d}")
340
+ utf16.append(f"{low + 0xDC00:d}")
341
+ elif utf16 is not None:
342
+ utf16.append(ch)
343
+ utf32.append(ch)
344
+
345
+ if utf16 is not None:
346
+ utf16.append('0')
347
+ utf16_string = ','.join(utf16)
348
+ else:
349
+ utf16_string = None
350
+
351
+ utf32.append('0')
352
+ utf32_string = ','.join(utf32)
353
+
354
+ return (utf16_string, utf32_string)