libwz 0.1.0

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 (362) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +165 -0
  3. package/binding.gyp +149 -0
  4. package/deps/tiny-aes/.github/workflows/c-cpp.yml +27 -0
  5. package/deps/tiny-aes/CMakeLists.txt +17 -0
  6. package/deps/tiny-aes/Makefile +61 -0
  7. package/deps/tiny-aes/README.md +83 -0
  8. package/deps/tiny-aes/aes.c +572 -0
  9. package/deps/tiny-aes/aes.h +91 -0
  10. package/deps/tiny-aes/aes.hpp +12 -0
  11. package/deps/tiny-aes/conanfile.py +73 -0
  12. package/deps/tiny-aes/library.json +19 -0
  13. package/deps/tiny-aes/library.properties +11 -0
  14. package/deps/tiny-aes/test.c +316 -0
  15. package/deps/tiny-aes/test.cpp +2 -0
  16. package/deps/tiny-aes/test_package/CMakeLists.txt +11 -0
  17. package/deps/tiny-aes/test_package/conanfile.py +17 -0
  18. package/deps/tiny-aes/unlicense.txt +24 -0
  19. package/deps/zlib/.cmake-format.yaml +245 -0
  20. package/deps/zlib/.github/workflows/c-std.yml +268 -0
  21. package/deps/zlib/.github/workflows/cmake.yml +147 -0
  22. package/deps/zlib/.github/workflows/configure.yml +146 -0
  23. package/deps/zlib/.github/workflows/contribs.yml +64 -0
  24. package/deps/zlib/.github/workflows/fuzz.yml +25 -0
  25. package/deps/zlib/.github/workflows/msys-cygwin.yml +92 -0
  26. package/deps/zlib/.github/workflows/others.yml +153 -0
  27. package/deps/zlib/BUILD.bazel +134 -0
  28. package/deps/zlib/CMakeLists.txt +310 -0
  29. package/deps/zlib/ChangeLog +1669 -0
  30. package/deps/zlib/FAQ +371 -0
  31. package/deps/zlib/INDEX +67 -0
  32. package/deps/zlib/LICENSE +22 -0
  33. package/deps/zlib/MODULE.bazel +9 -0
  34. package/deps/zlib/Makefile.in +426 -0
  35. package/deps/zlib/README +115 -0
  36. package/deps/zlib/README-cmake.md +79 -0
  37. package/deps/zlib/adler32.c +164 -0
  38. package/deps/zlib/amiga/Makefile.pup +69 -0
  39. package/deps/zlib/amiga/Makefile.sas +68 -0
  40. package/deps/zlib/compress.c +99 -0
  41. package/deps/zlib/configure +1078 -0
  42. package/deps/zlib/contrib/CMakeLists.txt +61 -0
  43. package/deps/zlib/contrib/README.contrib +57 -0
  44. package/deps/zlib/contrib/ada/CMakeLists.txt +217 -0
  45. package/deps/zlib/contrib/ada/buffer_demo.adb +106 -0
  46. package/deps/zlib/contrib/ada/cmake/Modules/CMakeADACompiler.cmake.in +23 -0
  47. package/deps/zlib/contrib/ada/cmake/Modules/CMakeADAInformation.cmake +133 -0
  48. package/deps/zlib/contrib/ada/cmake/Modules/CMakeDetermineADACompiler.cmake +33 -0
  49. package/deps/zlib/contrib/ada/cmake/Modules/CMakeTestADACompiler.cmake +46 -0
  50. package/deps/zlib/contrib/ada/cmake/binder_helper.cmake +47 -0
  51. package/deps/zlib/contrib/ada/cmake/compile_helper.cmake +32 -0
  52. package/deps/zlib/contrib/ada/cmake/exe_link_helper.cmake +53 -0
  53. package/deps/zlib/contrib/ada/cmake/shared_link_helper.cmake +52 -0
  54. package/deps/zlib/contrib/ada/cmake/static_link_helper.cmake +25 -0
  55. package/deps/zlib/contrib/ada/mtest.adb +156 -0
  56. package/deps/zlib/contrib/ada/read.adb +156 -0
  57. package/deps/zlib/contrib/ada/readme.txt +65 -0
  58. package/deps/zlib/contrib/ada/test.adb +463 -0
  59. package/deps/zlib/contrib/ada/zlib-streams.adb +225 -0
  60. package/deps/zlib/contrib/ada/zlib-streams.ads +114 -0
  61. package/deps/zlib/contrib/ada/zlib-thin.adb +142 -0
  62. package/deps/zlib/contrib/ada/zlib-thin.ads +450 -0
  63. package/deps/zlib/contrib/ada/zlib.adb +701 -0
  64. package/deps/zlib/contrib/ada/zlib.ads +328 -0
  65. package/deps/zlib/contrib/ada/zlib.gpr +20 -0
  66. package/deps/zlib/contrib/blast/CMakeLists.txt +166 -0
  67. package/deps/zlib/contrib/blast/Makefile +14 -0
  68. package/deps/zlib/contrib/blast/README +4 -0
  69. package/deps/zlib/contrib/blast/blast-test.c +42 -0
  70. package/deps/zlib/contrib/blast/blast.c +422 -0
  71. package/deps/zlib/contrib/blast/blast.h +84 -0
  72. package/deps/zlib/contrib/blast/blastConfig.cmake.in +18 -0
  73. package/deps/zlib/contrib/blast/test/CMakeLists.txt +193 -0
  74. package/deps/zlib/contrib/blast/test/add_subdirectory_exclude_test.cmake.in +27 -0
  75. package/deps/zlib/contrib/blast/test/add_subdirectory_test.cmake.in +25 -0
  76. package/deps/zlib/contrib/blast/test/find_package_no_components_test.cmake.in +24 -0
  77. package/deps/zlib/contrib/blast/test/find_package_test.cmake.in +24 -0
  78. package/deps/zlib/contrib/blast/test/find_package_wrong_components_test.cmake.in +24 -0
  79. package/deps/zlib/contrib/blast/test.pk +0 -0
  80. package/deps/zlib/contrib/blast/test.txt +1 -0
  81. package/deps/zlib/contrib/blast/tester.cmake +28 -0
  82. package/deps/zlib/contrib/crc32vx/CMakeLists.txt +67 -0
  83. package/deps/zlib/contrib/crc32vx/README +9 -0
  84. package/deps/zlib/contrib/crc32vx/crc32_vx.c +254 -0
  85. package/deps/zlib/contrib/crc32vx/crc32_vx_hooks.h +9 -0
  86. package/deps/zlib/contrib/delphi/ZLib.pas +557 -0
  87. package/deps/zlib/contrib/delphi/ZLibConst.pas +11 -0
  88. package/deps/zlib/contrib/delphi/readme.txt +76 -0
  89. package/deps/zlib/contrib/delphi/zlibd32.mak +99 -0
  90. package/deps/zlib/contrib/dotzlib/DotZLib/AssemblyInfo.cs +58 -0
  91. package/deps/zlib/contrib/dotzlib/DotZLib/ChecksumImpl.cs +202 -0
  92. package/deps/zlib/contrib/dotzlib/DotZLib/CircularBuffer.cs +83 -0
  93. package/deps/zlib/contrib/dotzlib/DotZLib/CodecBase.cs +198 -0
  94. package/deps/zlib/contrib/dotzlib/DotZLib/Deflater.cs +106 -0
  95. package/deps/zlib/contrib/dotzlib/DotZLib/DotZLib.cs +288 -0
  96. package/deps/zlib/contrib/dotzlib/DotZLib/DotZLib.csproj +141 -0
  97. package/deps/zlib/contrib/dotzlib/DotZLib/GZipStream.cs +301 -0
  98. package/deps/zlib/contrib/dotzlib/DotZLib/Inflater.cs +105 -0
  99. package/deps/zlib/contrib/dotzlib/DotZLib/UnitTests.cs +274 -0
  100. package/deps/zlib/contrib/dotzlib/DotZLib.build +33 -0
  101. package/deps/zlib/contrib/dotzlib/DotZLib.chm +0 -0
  102. package/deps/zlib/contrib/dotzlib/DotZLib.sln +21 -0
  103. package/deps/zlib/contrib/dotzlib/LICENSE_1_0.txt +23 -0
  104. package/deps/zlib/contrib/dotzlib/readme.txt +58 -0
  105. package/deps/zlib/contrib/gcc_gvmat64/CMakeLists.txt +19 -0
  106. package/deps/zlib/contrib/gcc_gvmat64/gvmat64.S +570 -0
  107. package/deps/zlib/contrib/infback9/CMakeLists.txt +19 -0
  108. package/deps/zlib/contrib/infback9/README +1 -0
  109. package/deps/zlib/contrib/infback9/infback9.c +603 -0
  110. package/deps/zlib/contrib/infback9/infback9.h +37 -0
  111. package/deps/zlib/contrib/infback9/inffix9.h +107 -0
  112. package/deps/zlib/contrib/infback9/inflate9.h +47 -0
  113. package/deps/zlib/contrib/infback9/inftree9.c +319 -0
  114. package/deps/zlib/contrib/infback9/inftree9.h +61 -0
  115. package/deps/zlib/contrib/iostream/test.cpp +24 -0
  116. package/deps/zlib/contrib/iostream/zfstream.cpp +329 -0
  117. package/deps/zlib/contrib/iostream/zfstream.h +128 -0
  118. package/deps/zlib/contrib/iostream2/zstream.h +306 -0
  119. package/deps/zlib/contrib/iostream2/zstream_test.cpp +25 -0
  120. package/deps/zlib/contrib/iostream3/CMakeLists.txt +200 -0
  121. package/deps/zlib/contrib/iostream3/README +35 -0
  122. package/deps/zlib/contrib/iostream3/TODO +17 -0
  123. package/deps/zlib/contrib/iostream3/iostream3Config.cmake.in +23 -0
  124. package/deps/zlib/contrib/iostream3/test/CMakeLists.txt +191 -0
  125. package/deps/zlib/contrib/iostream3/test/add_subdirectory_exclude_test.cmake.in +27 -0
  126. package/deps/zlib/contrib/iostream3/test/add_subdirectory_test.cmake.in +25 -0
  127. package/deps/zlib/contrib/iostream3/test/find_package_no_components_test.cmake.in +24 -0
  128. package/deps/zlib/contrib/iostream3/test/find_package_test.cmake.in +24 -0
  129. package/deps/zlib/contrib/iostream3/test/find_package_wrong_components_test.cmake.in +24 -0
  130. package/deps/zlib/contrib/iostream3/test.cc +50 -0
  131. package/deps/zlib/contrib/iostream3/zfstream.cc +479 -0
  132. package/deps/zlib/contrib/iostream3/zfstream.h +466 -0
  133. package/deps/zlib/contrib/minizip/CMakeLists.txt +387 -0
  134. package/deps/zlib/contrib/minizip/LICENSE.Info-Zip +58 -0
  135. package/deps/zlib/contrib/minizip/Makefile +33 -0
  136. package/deps/zlib/contrib/minizip/Makefile.am +45 -0
  137. package/deps/zlib/contrib/minizip/MiniZip64_Changes.txt +6 -0
  138. package/deps/zlib/contrib/minizip/MiniZip64_info.txt +69 -0
  139. package/deps/zlib/contrib/minizip/configure.ac +32 -0
  140. package/deps/zlib/contrib/minizip/crypt.h +125 -0
  141. package/deps/zlib/contrib/minizip/ints.h +57 -0
  142. package/deps/zlib/contrib/minizip/ioapi.c +231 -0
  143. package/deps/zlib/contrib/minizip/ioapi.h +183 -0
  144. package/deps/zlib/contrib/minizip/iowin32.c +447 -0
  145. package/deps/zlib/contrib/minizip/iowin32.h +27 -0
  146. package/deps/zlib/contrib/minizip/make_vms.com +25 -0
  147. package/deps/zlib/contrib/minizip/miniunz.c +647 -0
  148. package/deps/zlib/contrib/minizip/miniunzip.1 +63 -0
  149. package/deps/zlib/contrib/minizip/minizip.1 +46 -0
  150. package/deps/zlib/contrib/minizip/minizip.c +511 -0
  151. package/deps/zlib/contrib/minizip/minizip.pc.in +13 -0
  152. package/deps/zlib/contrib/minizip/minizip.pc.txt +13 -0
  153. package/deps/zlib/contrib/minizip/minizipConfig.cmake.in +27 -0
  154. package/deps/zlib/contrib/minizip/mztools.c +294 -0
  155. package/deps/zlib/contrib/minizip/mztools.h +37 -0
  156. package/deps/zlib/contrib/minizip/skipset.h +366 -0
  157. package/deps/zlib/contrib/minizip/test/CMakeLists.txt +176 -0
  158. package/deps/zlib/contrib/minizip/test/add_subdirectory_exclude_test.cmake.in +29 -0
  159. package/deps/zlib/contrib/minizip/test/add_subdirectory_test.cmake.in +28 -0
  160. package/deps/zlib/contrib/minizip/test/find_package_no_components_test.cmake.in +26 -0
  161. package/deps/zlib/contrib/minizip/test/find_package_test.cmake.in +26 -0
  162. package/deps/zlib/contrib/minizip/test/find_package_wrong_components_test.cmake.in +26 -0
  163. package/deps/zlib/contrib/minizip/test/test_helper.cm +32 -0
  164. package/deps/zlib/contrib/minizip/unzip.c +1984 -0
  165. package/deps/zlib/contrib/minizip/unzip.h +442 -0
  166. package/deps/zlib/contrib/minizip/zip.c +2246 -0
  167. package/deps/zlib/contrib/minizip/zip.h +371 -0
  168. package/deps/zlib/contrib/nuget/nuget.csproj +45 -0
  169. package/deps/zlib/contrib/nuget/nuget.sln +22 -0
  170. package/deps/zlib/contrib/pascal/example.pas +599 -0
  171. package/deps/zlib/contrib/pascal/readme.txt +76 -0
  172. package/deps/zlib/contrib/pascal/zlibd32.mak +99 -0
  173. package/deps/zlib/contrib/pascal/zlibpas.pas +276 -0
  174. package/deps/zlib/contrib/puff/CMakeLists.txt +154 -0
  175. package/deps/zlib/contrib/puff/Makefile +42 -0
  176. package/deps/zlib/contrib/puff/README +63 -0
  177. package/deps/zlib/contrib/puff/bin-writer.c +26 -0
  178. package/deps/zlib/contrib/puff/puff.c +840 -0
  179. package/deps/zlib/contrib/puff/puff.h +35 -0
  180. package/deps/zlib/contrib/puff/puffConfig.cmake.in +18 -0
  181. package/deps/zlib/contrib/puff/pufftest.c +168 -0
  182. package/deps/zlib/contrib/puff/test/CMakeLists.txt +262 -0
  183. package/deps/zlib/contrib/puff/test/add_subdirectory_exclude_test.cmake.in +26 -0
  184. package/deps/zlib/contrib/puff/test/add_subdirectory_test.cmake.in +25 -0
  185. package/deps/zlib/contrib/puff/test/find_package_no_components_test.cmake.in +24 -0
  186. package/deps/zlib/contrib/puff/test/find_package_test.cmake.in +24 -0
  187. package/deps/zlib/contrib/puff/test/find_package_wrong_components_test.cmake.in +24 -0
  188. package/deps/zlib/contrib/puff/test/tester-cov.cmake +58 -0
  189. package/deps/zlib/contrib/puff/test/tester.cmake +16 -0
  190. package/deps/zlib/contrib/puff/zeros.raw +0 -0
  191. package/deps/zlib/contrib/testzlib/CMakeLists.txt +44 -0
  192. package/deps/zlib/contrib/testzlib/testzlib.c +275 -0
  193. package/deps/zlib/contrib/testzlib/testzlib.txt +10 -0
  194. package/deps/zlib/contrib/vstudio/readme.txt +22 -0
  195. package/deps/zlib/contrib/zlib1-dll/CMakeLists.txt +196 -0
  196. package/deps/zlib/contrib/zlib1-dll/readme.txt +21 -0
  197. package/deps/zlib/crc32.c +983 -0
  198. package/deps/zlib/crc32.h +9446 -0
  199. package/deps/zlib/deflate.c +2185 -0
  200. package/deps/zlib/deflate.h +383 -0
  201. package/deps/zlib/doc/algorithm.txt +209 -0
  202. package/deps/zlib/doc/crc-doc.1.0.pdf +0 -0
  203. package/deps/zlib/doc/rfc1950.txt +619 -0
  204. package/deps/zlib/doc/rfc1951.txt +955 -0
  205. package/deps/zlib/doc/rfc1952.txt +675 -0
  206. package/deps/zlib/doc/txtvsbin.txt +107 -0
  207. package/deps/zlib/examples/README.examples +54 -0
  208. package/deps/zlib/examples/enough.c +597 -0
  209. package/deps/zlib/examples/fitblk.c +233 -0
  210. package/deps/zlib/examples/gun.c +702 -0
  211. package/deps/zlib/examples/gzappend.c +504 -0
  212. package/deps/zlib/examples/gzjoin.c +449 -0
  213. package/deps/zlib/examples/gzlog.c +1061 -0
  214. package/deps/zlib/examples/gzlog.h +91 -0
  215. package/deps/zlib/examples/gznorm.c +474 -0
  216. package/deps/zlib/examples/zlib_how.html +550 -0
  217. package/deps/zlib/examples/zpipe.c +206 -0
  218. package/deps/zlib/examples/zran.c +546 -0
  219. package/deps/zlib/examples/zran.h +53 -0
  220. package/deps/zlib/gzclose.c +23 -0
  221. package/deps/zlib/gzguts.h +216 -0
  222. package/deps/zlib/gzlib.c +609 -0
  223. package/deps/zlib/gzread.c +668 -0
  224. package/deps/zlib/gzwrite.c +700 -0
  225. package/deps/zlib/infback.c +581 -0
  226. package/deps/zlib/inffast.c +321 -0
  227. package/deps/zlib/inffast.h +11 -0
  228. package/deps/zlib/inffixed.h +94 -0
  229. package/deps/zlib/inflate.c +1413 -0
  230. package/deps/zlib/inflate.h +126 -0
  231. package/deps/zlib/inftrees.c +424 -0
  232. package/deps/zlib/inftrees.h +64 -0
  233. package/deps/zlib/make_vms.com +867 -0
  234. package/deps/zlib/msdos/Makefile.bor +115 -0
  235. package/deps/zlib/msdos/Makefile.dj2 +104 -0
  236. package/deps/zlib/msdos/Makefile.emx +69 -0
  237. package/deps/zlib/msdos/Makefile.msc +112 -0
  238. package/deps/zlib/msdos/Makefile.tc +100 -0
  239. package/deps/zlib/os400/README400 +48 -0
  240. package/deps/zlib/os400/bndsrc +144 -0
  241. package/deps/zlib/os400/make.sh +383 -0
  242. package/deps/zlib/os400/zlibfixed.rpgle +578 -0
  243. package/deps/zlib/os400/zlibfree.rpgle +634 -0
  244. package/deps/zlib/qnx/package.qpg +141 -0
  245. package/deps/zlib/test/CMakeLists.txt +318 -0
  246. package/deps/zlib/test/add_subdirectory_exclude_test.cmake.in +29 -0
  247. package/deps/zlib/test/add_subdirectory_test.cmake.in +28 -0
  248. package/deps/zlib/test/example.c +552 -0
  249. package/deps/zlib/test/find_package_no_components_test.cmake.in +27 -0
  250. package/deps/zlib/test/find_package_test.cmake.in +27 -0
  251. package/deps/zlib/test/find_package_wrong_components_test.cmake.in +27 -0
  252. package/deps/zlib/test/infcover.c +672 -0
  253. package/deps/zlib/test/minigzip.c +592 -0
  254. package/deps/zlib/treebuild.xml +116 -0
  255. package/deps/zlib/trees.c +1119 -0
  256. package/deps/zlib/trees.h +128 -0
  257. package/deps/zlib/uncompr.c +101 -0
  258. package/deps/zlib/watcom/watcom_f.mak +43 -0
  259. package/deps/zlib/watcom/watcom_l.mak +43 -0
  260. package/deps/zlib/win32/DLL_FAQ.txt +381 -0
  261. package/deps/zlib/win32/Makefile.bor +109 -0
  262. package/deps/zlib/win32/Makefile.gcc +177 -0
  263. package/deps/zlib/win32/Makefile.msc +159 -0
  264. package/deps/zlib/win32/README-WIN32.txt +103 -0
  265. package/deps/zlib/win32/VisualC.txt +3 -0
  266. package/deps/zlib/win32/zlib.def +104 -0
  267. package/deps/zlib/win32/zlib1.rc +37 -0
  268. package/deps/zlib/zconf.h.in +551 -0
  269. package/deps/zlib/zlib.3 +149 -0
  270. package/deps/zlib/zlib.3.pdf +0 -0
  271. package/deps/zlib/zlib.h +2057 -0
  272. package/deps/zlib/zlib.map +116 -0
  273. package/deps/zlib/zlib.pc.cmakein +14 -0
  274. package/deps/zlib/zlib.pc.in +14 -0
  275. package/deps/zlib/zlibConfig.cmake.in +18 -0
  276. package/deps/zlib/zutil.c +313 -0
  277. package/deps/zlib/zutil.h +331 -0
  278. package/dist/index.d.ts +266 -0
  279. package/dist/index.js +1146 -0
  280. package/dist/libwz.js +5632 -0
  281. package/dist/libwz.wasm +0 -0
  282. package/include/wz/CRC32.h +182 -0
  283. package/include/wz/PngUtility.h +72 -0
  284. package/include/wz/PortalType.h +124 -0
  285. package/include/wz/Properties/WzBinaryProperty.h +70 -0
  286. package/include/wz/Properties/WzCanvasProperty.h +55 -0
  287. package/include/wz/Properties/WzConvexProperty.h +34 -0
  288. package/include/wz/Properties/WzDoubleProperty.h +32 -0
  289. package/include/wz/Properties/WzFloatProperty.h +30 -0
  290. package/include/wz/Properties/WzIntProperty.h +30 -0
  291. package/include/wz/Properties/WzLongProperty.h +30 -0
  292. package/include/wz/Properties/WzLuaProperty.h +31 -0
  293. package/include/wz/Properties/WzNullProperty.h +15 -0
  294. package/include/wz/Properties/WzPngProperty.h +53 -0
  295. package/include/wz/Properties/WzRawDataProperty.h +46 -0
  296. package/include/wz/Properties/WzShortProperty.h +31 -0
  297. package/include/wz/Properties/WzStringProperty.h +32 -0
  298. package/include/wz/Properties/WzSubProperty.h +35 -0
  299. package/include/wz/Properties/WzUOLProperty.h +44 -0
  300. package/include/wz/Properties/WzVectorProperty.h +40 -0
  301. package/include/wz/Properties/WzVideoProperty.h +43 -0
  302. package/include/wz/Result.h +58 -0
  303. package/include/wz/Util/Defines.h +16 -0
  304. package/include/wz/Util/ListFileParser.h +20 -0
  305. package/include/wz/Util/WzBinaryReader.h +95 -0
  306. package/include/wz/Util/WzBinaryWriter.h +72 -0
  307. package/include/wz/Util/WzBlobDataSource.h +30 -0
  308. package/include/wz/Util/WzDataSource.h +49 -0
  309. package/include/wz/Util/WzKeyGenerator.h +28 -0
  310. package/include/wz/Util/WzMutableKey.h +39 -0
  311. package/include/wz/Util/WzPath.h +37 -0
  312. package/include/wz/Util/WzStream.h +86 -0
  313. package/include/wz/Util/WzTool.h +42 -0
  314. package/include/wz/WzAESConstant.h +17 -0
  315. package/include/wz/WzDirectory.h +97 -0
  316. package/include/wz/WzEnums.h +76 -0
  317. package/include/wz/WzFile.h +99 -0
  318. package/include/wz/WzHeader.h +47 -0
  319. package/include/wz/WzImage.h +97 -0
  320. package/include/wz/WzImageProperty.h +92 -0
  321. package/include/wz/WzObject.h +55 -0
  322. package/include/wz/WzPropertyCollection.h +115 -0
  323. package/include/wz/wz.h +41 -0
  324. package/include/wz/wz_api.h +432 -0
  325. package/package.json +93 -0
  326. package/src/PngUtility.cpp +328 -0
  327. package/src/Properties/WzBinaryProperty.cpp +183 -0
  328. package/src/Properties/WzCanvasProperty.cpp +262 -0
  329. package/src/Properties/WzConvexProperty.cpp +159 -0
  330. package/src/Properties/WzDoubleProperty.cpp +12 -0
  331. package/src/Properties/WzFloatProperty.cpp +17 -0
  332. package/src/Properties/WzIntProperty.cpp +12 -0
  333. package/src/Properties/WzLongProperty.cpp +12 -0
  334. package/src/Properties/WzLuaProperty.cpp +37 -0
  335. package/src/Properties/WzNullProperty.cpp +11 -0
  336. package/src/Properties/WzPngProperty.cpp +637 -0
  337. package/src/Properties/WzRawDataProperty.cpp +116 -0
  338. package/src/Properties/WzShortProperty.cpp +12 -0
  339. package/src/Properties/WzStringProperty.cpp +44 -0
  340. package/src/Properties/WzSubProperty.cpp +129 -0
  341. package/src/Properties/WzUOLProperty.cpp +136 -0
  342. package/src/Properties/WzVectorProperty.cpp +22 -0
  343. package/src/Properties/WzVideoProperty.cpp +115 -0
  344. package/src/Util/ListFileParser.cpp +48 -0
  345. package/src/Util/WzBinaryReader.cpp +368 -0
  346. package/src/Util/WzBinaryWriter.cpp +305 -0
  347. package/src/Util/WzBlobDataSource.cpp +47 -0
  348. package/src/Util/WzDataSource.cpp +61 -0
  349. package/src/Util/WzKeyGenerator.cpp +43 -0
  350. package/src/Util/WzMutableKey.cpp +59 -0
  351. package/src/Util/WzStream.cpp +196 -0
  352. package/src/Util/WzTool.cpp +266 -0
  353. package/src/WzAESConstant.cpp +12 -0
  354. package/src/WzDirectory.cpp +669 -0
  355. package/src/WzEnums.cpp +20 -0
  356. package/src/WzFile.cpp +450 -0
  357. package/src/WzImage.cpp +350 -0
  358. package/src/WzImageProperty.cpp +469 -0
  359. package/src/WzObject.cpp +174 -0
  360. package/src/WzPropertyCollection.cpp +84 -0
  361. package/src/capi/wz_api.cpp +1996 -0
  362. package/src/node/binding.cpp +1776 -0
@@ -0,0 +1,1996 @@
1
+ #include "wz/wz_api.h"
2
+
3
+ #include <array>
4
+ #include <cstring>
5
+ #include <memory>
6
+ #include <optional>
7
+ #include <span>
8
+ #include <string>
9
+ #include <vector>
10
+
11
+ #include "wz/wz.h"
12
+
13
+ #ifdef __EMSCRIPTEN__
14
+ #include "wz/Util/WzBlobDataSource.h"
15
+ #endif
16
+
17
+ static thread_local std::string g_last_error_msg;
18
+ static thread_local wz_last_error_info g_last_error_info = {WZ_ERROR_NONE, ""};
19
+
20
+ static inline wz_error_code wz_clear_last_error() {
21
+ g_last_error_msg.clear();
22
+ g_last_error_info.code = WZ_ERROR_NONE;
23
+ g_last_error_info.message = g_last_error_msg.c_str();
24
+ return WZ_ERROR_NONE;
25
+ }
26
+
27
+ static_assert(static_cast<int>(wz::ErrorCode::Ok) == WZ_ERROR_NONE);
28
+ static_assert(static_cast<int>(wz::ErrorCode::NotImplemented) ==
29
+ WZ_ERROR_NOT_IMPLEMENTED);
30
+ static_assert(static_cast<int>(wz::ErrorCode::InvalidArgument) ==
31
+ WZ_ERROR_INVALID_ARGUMENT);
32
+ static_assert(static_cast<int>(wz::ErrorCode::ParseError) ==
33
+ WZ_ERROR_PARSE_ERROR);
34
+ static_assert(static_cast<int>(wz::ErrorCode::IoError) == WZ_ERROR_IO_ERROR);
35
+ static_assert(static_cast<int>(wz::ErrorCode::DataError) ==
36
+ WZ_ERROR_DATA_ERROR);
37
+ static_assert(static_cast<int>(wz::ErrorCode::NotFound) == WZ_ERROR_NOT_FOUND);
38
+
39
+ static inline wz_error_code wz_set_last_error(wz_error_code code,
40
+ const std::string& msg) {
41
+ g_last_error_msg = msg;
42
+ g_last_error_info.code = code;
43
+ g_last_error_info.message = g_last_error_msg.c_str();
44
+ return code;
45
+ }
46
+
47
+ static wz_error_code set_error_null(const char* fn) {
48
+ return wz_set_last_error(WZ_ERROR_NULL_HANDLE,
49
+ std::string(fn) + ": null handle");
50
+ }
51
+
52
+ static wz_error_code set_error_invalid_arg(const char* fn,
53
+ const char* arg_name) {
54
+ return wz_set_last_error(WZ_ERROR_INVALID_ARGUMENT,
55
+ std::string(fn) + ": " + arg_name + " is null");
56
+ }
57
+
58
+ static wz_error_code set_error_wrong_type(const char* fn) {
59
+ return wz_set_last_error(WZ_ERROR_WRONG_TYPE,
60
+ std::string(fn) + ": wrong property type");
61
+ }
62
+
63
+ static wz_error_code set_error_idx(const char* fn, int idx, size_t size) {
64
+ return wz_set_last_error(WZ_ERROR_INDEX_OUT_OF_RANGE,
65
+ std::string(fn) + ": index " + std::to_string(idx) +
66
+ " out of range [0, " + std::to_string(size) +
67
+ ")");
68
+ }
69
+
70
+ template <typename T>
71
+ static wz_error_code init_out(const char* fn, T* out) {
72
+ if (!out) return set_error_invalid_arg(fn, "out");
73
+ *out = T{};
74
+ return WZ_ERROR_NONE;
75
+ }
76
+
77
+ static wz_error_code result_void(const wz::Result<void>& result) {
78
+ if (!result.has_value()) {
79
+ return wz_set_last_error(static_cast<wz_error_code>(result.error().code()),
80
+ result.error().message());
81
+ }
82
+ return wz_clear_last_error();
83
+ }
84
+
85
+ static wz_error_code result_release_property(
86
+ wz::Result<std::unique_ptr<wz::WzImageProperty>> result) {
87
+ if (!result.has_value()) {
88
+ return wz_set_last_error(static_cast<wz_error_code>(result.error().code()),
89
+ result.error().message());
90
+ }
91
+ (void)result.value().release();
92
+ return wz_clear_last_error();
93
+ }
94
+
95
+ static wz_error_code result_release_object(
96
+ wz::Result<std::unique_ptr<wz::WzObject>> result) {
97
+ if (!result.has_value()) {
98
+ return wz_set_last_error(static_cast<wz_error_code>(result.error().code()),
99
+ result.error().message());
100
+ }
101
+ (void)result.value().release();
102
+ return wz_clear_last_error();
103
+ }
104
+
105
+ template <typename T>
106
+ static wz_error_code result_release_owned(
107
+ wz::Result<std::unique_ptr<T>> result) {
108
+ if (!result.has_value()) {
109
+ return wz_set_last_error(static_cast<wz_error_code>(result.error().code()),
110
+ result.error().message());
111
+ }
112
+ (void)result.value().release();
113
+ return wz_clear_last_error();
114
+ }
115
+
116
+ static wz_error_code result_bool(const wz::Result<bool>& result,
117
+ int* out_value) {
118
+ if (auto ec = init_out("result_bool", out_value); ec != WZ_ERROR_NONE) {
119
+ return ec;
120
+ }
121
+ if (!result.has_value()) {
122
+ return wz_set_last_error(static_cast<wz_error_code>(result.error().code()),
123
+ result.error().message());
124
+ }
125
+ *out_value = result.value() ? 1 : 0;
126
+ return wz_clear_last_error();
127
+ }
128
+
129
+ template <typename T>
130
+ static wz_error_code result_error(const wz::Result<T>& result) {
131
+ if (!result.has_value()) {
132
+ return wz_set_last_error(static_cast<wz_error_code>(result.error().code()),
133
+ result.error().message());
134
+ }
135
+ return WZ_ERROR_NONE;
136
+ }
137
+
138
+ static wz::WzImageProperty* unwrap_prop(wz_property p) {
139
+ return reinterpret_cast<wz::WzImageProperty*>(p);
140
+ }
141
+
142
+ static wz_property wrap_prop(wz::WzImageProperty* p) {
143
+ return reinterpret_cast<wz_property>(p);
144
+ }
145
+
146
+ static bool is_mutable_property_container(wz::WzImageProperty* p) {
147
+ if (!p) return false;
148
+ switch (p->PropertyType()) {
149
+ case wz::WzPropertyType::SubProperty:
150
+ case wz::WzPropertyType::Canvas:
151
+ case wz::WzPropertyType::Convex:
152
+ case wz::WzPropertyType::Raw:
153
+ return p->WzProperties() != nullptr;
154
+ default:
155
+ return false;
156
+ }
157
+ }
158
+
159
+ static wz::WzFile* unwrap_file(wz_file f) {
160
+ return reinterpret_cast<wz::WzFile*>(f);
161
+ }
162
+
163
+ static wz::WzDirectory* unwrap_dir(wz_dir d) {
164
+ return reinterpret_cast<wz::WzDirectory*>(d);
165
+ }
166
+
167
+ static wz::WzImage* unwrap_image(wz_image i) {
168
+ return reinterpret_cast<wz::WzImage*>(i);
169
+ }
170
+
171
+ static wz::WzObject* unwrap_object(wz_object o) {
172
+ return reinterpret_cast<wz::WzObject*>(o);
173
+ }
174
+
175
+ #ifdef __EMSCRIPTEN__
176
+ static std::shared_ptr<wz::WzBlobDataSource> make_blob_source(
177
+ void* userdata,
178
+ wz_blob_read_callback read_callback,
179
+ wz_blob_release_callback release_callback,
180
+ uint64_t size) {
181
+ auto release = [release_callback](void* ptr) {
182
+ if (release_callback) release_callback(ptr);
183
+ };
184
+ auto owner = std::shared_ptr<void>(userdata, release);
185
+ auto source = std::make_shared<wz::WzBlobDataSource>(
186
+ size,
187
+ [owner, read_callback](uint64_t offset, std::span<uint8_t> destination)
188
+ -> wz::Result<size_t> {
189
+ size_t bytes_read = 0;
190
+ const int ok = read_callback(owner.get(),
191
+ offset,
192
+ destination.data(),
193
+ destination.size(),
194
+ &bytes_read);
195
+ if (!ok) {
196
+ return std::unexpected(
197
+ wz::Error::IoError("Blob read callback failed"));
198
+ }
199
+ return bytes_read;
200
+ });
201
+ return source;
202
+ }
203
+ #endif
204
+
205
+ extern "C" {
206
+
207
+ wz_error_code wz_get_last_error_info(const wz_last_error_info** info) {
208
+ if (!info) {
209
+ return set_error_invalid_arg("wz_get_last_error_info", "info");
210
+ }
211
+ *info = &g_last_error_info;
212
+ return WZ_ERROR_NONE;
213
+ }
214
+
215
+ wz_error_code wz_open_file(const char* file_path,
216
+ int16_t game_version,
217
+ wz_maple_version version,
218
+ wz_file* out_file) {
219
+ if (auto ec = init_out("wz_open_file", out_file); ec != WZ_ERROR_NONE) {
220
+ return ec;
221
+ }
222
+ if (!file_path) return set_error_invalid_arg("wz_open_file", "file_path");
223
+ auto* f = new wz::WzFile(
224
+ file_path, game_version, static_cast<wz::WzMapleVersion>(version));
225
+ *out_file = reinterpret_cast<wz_file>(f);
226
+ return wz_clear_last_error();
227
+ }
228
+
229
+ wz_error_code wz_open_memory(const char* file_name,
230
+ const uint8_t* data,
231
+ size_t data_size,
232
+ int16_t game_version,
233
+ wz_maple_version version,
234
+ wz_file* out_file) {
235
+ if (auto ec = init_out("wz_open_memory", out_file); ec != WZ_ERROR_NONE) {
236
+ return ec;
237
+ }
238
+ if (!file_name) return set_error_invalid_arg("wz_open_memory", "file_name");
239
+ if (!data && data_size != 0) {
240
+ return set_error_invalid_arg("wz_open_memory", "data");
241
+ }
242
+
243
+ std::vector<uint8_t> bytes;
244
+ if (data_size > 0) {
245
+ bytes.assign(data, data + data_size);
246
+ }
247
+ auto source = std::make_shared<wz::WzMemoryDataSource>(std::move(bytes));
248
+ auto* f = new wz::WzFile(file_name,
249
+ source,
250
+ game_version,
251
+ static_cast<wz::WzMapleVersion>(version));
252
+ *out_file = reinterpret_cast<wz_file>(f);
253
+ return wz_clear_last_error();
254
+ }
255
+
256
+ wz_error_code wz_open_blob_source_with_callback(
257
+ void* userdata,
258
+ wz_blob_read_callback read_callback,
259
+ wz_blob_release_callback release_callback,
260
+ uint64_t size,
261
+ const char* file_name,
262
+ int16_t game_version,
263
+ wz_maple_version version,
264
+ wz_file* out_file) {
265
+ if (auto ec = init_out("wz_open_blob_source_with_callback", out_file);
266
+ ec != WZ_ERROR_NONE) {
267
+ return ec;
268
+ }
269
+ if (!file_name) {
270
+ return set_error_invalid_arg("wz_open_blob_source_with_callback",
271
+ "file_name");
272
+ }
273
+ if (!read_callback) {
274
+ return set_error_invalid_arg("wz_open_blob_source_with_callback",
275
+ "read_callback");
276
+ }
277
+ #ifdef __EMSCRIPTEN__
278
+ auto source =
279
+ make_blob_source(userdata, read_callback, release_callback, size);
280
+ auto* f = new wz::WzFile(file_name,
281
+ source,
282
+ game_version,
283
+ static_cast<wz::WzMapleVersion>(version));
284
+ *out_file = reinterpret_cast<wz_file>(f);
285
+ return wz_clear_last_error();
286
+ #else
287
+ (void)userdata;
288
+ (void)read_callback;
289
+ (void)release_callback;
290
+ (void)size;
291
+ (void)game_version;
292
+ (void)version;
293
+ return wz_set_last_error(WZ_ERROR_NOT_IMPLEMENTED,
294
+ "Blob sources require Emscripten");
295
+ #endif
296
+ }
297
+
298
+ wz_error_code wz_create_file(int16_t game_version,
299
+ wz_maple_version version,
300
+ wz_file* out_file) {
301
+ if (auto ec = init_out("wz_create_file", out_file); ec != WZ_ERROR_NONE) {
302
+ return ec;
303
+ }
304
+ auto* f =
305
+ new wz::WzFile(game_version, static_cast<wz::WzMapleVersion>(version));
306
+ *out_file = reinterpret_cast<wz_file>(f);
307
+ return wz_clear_last_error();
308
+ }
309
+
310
+ wz_error_code wz_open_file_with_iv(const char* file_path,
311
+ const uint8_t iv[4],
312
+ wz_file* out_file) {
313
+ if (auto ec = init_out("wz_open_file_with_iv", out_file);
314
+ ec != WZ_ERROR_NONE) {
315
+ return ec;
316
+ }
317
+ if (!file_path) {
318
+ return set_error_invalid_arg("wz_open_file_with_iv", "file_path");
319
+ }
320
+ if (!iv) return set_error_invalid_arg("wz_open_file_with_iv", "iv");
321
+ std::array<uint8_t, 4> iv_arr = {iv[0], iv[1], iv[2], iv[3]};
322
+ auto* f = new wz::WzFile(file_path, iv_arr);
323
+ *out_file = reinterpret_cast<wz_file>(f);
324
+ return wz_clear_last_error();
325
+ }
326
+
327
+ wz_error_code wz_open_memory_with_iv(const char* file_name,
328
+ const uint8_t* data,
329
+ size_t data_size,
330
+ const uint8_t iv[4],
331
+ wz_file* out_file) {
332
+ if (auto ec = init_out("wz_open_memory_with_iv", out_file);
333
+ ec != WZ_ERROR_NONE) {
334
+ return ec;
335
+ }
336
+ if (!file_name) {
337
+ return set_error_invalid_arg("wz_open_memory_with_iv", "file_name");
338
+ }
339
+ if (!data && data_size != 0) {
340
+ return set_error_invalid_arg("wz_open_memory_with_iv", "data");
341
+ }
342
+ if (!iv) return set_error_invalid_arg("wz_open_memory_with_iv", "iv");
343
+
344
+ std::vector<uint8_t> bytes;
345
+ if (data_size > 0) {
346
+ bytes.assign(data, data + data_size);
347
+ }
348
+ std::array<uint8_t, 4> iv_arr = {iv[0], iv[1], iv[2], iv[3]};
349
+ auto source = std::make_shared<wz::WzMemoryDataSource>(std::move(bytes));
350
+ auto* f = new wz::WzFile(file_name, source, iv_arr);
351
+ *out_file = reinterpret_cast<wz_file>(f);
352
+ return wz_clear_last_error();
353
+ }
354
+
355
+ wz_error_code wz_open_blob_source_with_callback_and_iv(
356
+ void* userdata,
357
+ wz_blob_read_callback read_callback,
358
+ wz_blob_release_callback release_callback,
359
+ uint64_t size,
360
+ const char* file_name,
361
+ const uint8_t iv[4],
362
+ wz_file* out_file) {
363
+ if (auto ec = init_out("wz_open_blob_source_with_callback_and_iv", out_file);
364
+ ec != WZ_ERROR_NONE) {
365
+ return ec;
366
+ }
367
+ if (!file_name) {
368
+ return set_error_invalid_arg("wz_open_blob_source_with_callback_and_iv",
369
+ "file_name");
370
+ }
371
+ if (!read_callback) {
372
+ return set_error_invalid_arg("wz_open_blob_source_with_callback_and_iv",
373
+ "read_callback");
374
+ }
375
+ if (!iv) {
376
+ return set_error_invalid_arg("wz_open_blob_source_with_callback_and_iv",
377
+ "iv");
378
+ }
379
+ #ifdef __EMSCRIPTEN__
380
+ std::array<uint8_t, 4> iv_arr = {iv[0], iv[1], iv[2], iv[3]};
381
+ auto source =
382
+ make_blob_source(userdata, read_callback, release_callback, size);
383
+ auto* f = new wz::WzFile(file_name, source, iv_arr);
384
+ *out_file = reinterpret_cast<wz_file>(f);
385
+ return wz_clear_last_error();
386
+ #else
387
+ (void)userdata;
388
+ (void)read_callback;
389
+ (void)release_callback;
390
+ (void)size;
391
+ return wz_set_last_error(WZ_ERROR_NOT_IMPLEMENTED,
392
+ "Blob sources require Emscripten");
393
+ #endif
394
+ }
395
+
396
+ wz_error_code wz_parse(wz_file file, wz_parse_status* out_status) {
397
+ if (auto ec = init_out("wz_parse", out_status); ec != WZ_ERROR_NONE) {
398
+ return ec;
399
+ }
400
+ if (!file) return set_error_null("wz_parse");
401
+ auto status = reinterpret_cast<wz::WzFile*>(file)->ParseWzFile();
402
+ *out_status = static_cast<wz_parse_status>(status);
403
+ if (status != wz::WzFileParseStatus::Success) {
404
+ return wz_set_last_error(WZ_ERROR_PARSE_ERROR,
405
+ wz::GetErrorDescription(status));
406
+ }
407
+ return wz_clear_last_error();
408
+ }
409
+
410
+ wz_error_code wz_close_file(wz_file file) {
411
+ if (!file) return wz_clear_last_error();
412
+ delete unwrap_file(file);
413
+ return wz_clear_last_error();
414
+ }
415
+
416
+ wz_error_code wz_file_save_to_disk(wz_file file, const char* file_path) {
417
+ if (!file) return set_error_null("wz_file_save_to_disk");
418
+ if (!file_path) {
419
+ return set_error_invalid_arg("wz_file_save_to_disk", "file_path");
420
+ }
421
+ return result_void(unwrap_file(file)->SaveToDisk(file_path));
422
+ }
423
+
424
+ wz_error_code wz_file_name(wz_file file, const char** out_name) {
425
+ if (auto ec = init_out("wz_file_name", out_name); ec != WZ_ERROR_NONE) {
426
+ return ec;
427
+ }
428
+ if (!file) return set_error_null("wz_file_name");
429
+ static thread_local std::string s;
430
+ s = reinterpret_cast<wz::WzFile*>(file)->Name();
431
+ *out_name = s.c_str();
432
+ return wz_clear_last_error();
433
+ }
434
+
435
+ wz_error_code wz_file_path(wz_file file, const char** out_path) {
436
+ if (auto ec = init_out("wz_file_path", out_path); ec != WZ_ERROR_NONE) {
437
+ return ec;
438
+ }
439
+ if (!file) return set_error_null("wz_file_path");
440
+ static thread_local std::string s;
441
+ s = reinterpret_cast<wz::WzFile*>(file)->FilePath();
442
+ *out_path = s.c_str();
443
+ return wz_clear_last_error();
444
+ }
445
+
446
+ wz_error_code wz_file_version(wz_file file, int16_t* out_version) {
447
+ if (auto ec = init_out("wz_file_version", out_version); ec != WZ_ERROR_NONE) {
448
+ return ec;
449
+ }
450
+ if (!file) return set_error_null("wz_file_version");
451
+ *out_version = reinterpret_cast<wz::WzFile*>(file)->Version();
452
+ return wz_clear_last_error();
453
+ }
454
+
455
+ wz_error_code wz_file_maple_version(wz_file file,
456
+ wz_maple_version* out_version) {
457
+ if (auto ec = init_out("wz_file_maple_version", out_version);
458
+ ec != WZ_ERROR_NONE) {
459
+ return ec;
460
+ }
461
+ if (!file) return set_error_null("wz_file_maple_version");
462
+ *out_version = static_cast<wz_maple_version>(
463
+ reinterpret_cast<wz::WzFile*>(file)->MapleVersion());
464
+ return wz_clear_last_error();
465
+ }
466
+
467
+ wz_error_code wz_file_get_wz_directory(wz_file file, wz_dir* out_dir) {
468
+ if (auto ec = init_out("wz_file_get_wz_directory", out_dir);
469
+ ec != WZ_ERROR_NONE) {
470
+ return ec;
471
+ }
472
+ if (!file) return set_error_null("wz_file_get_wz_directory");
473
+ *out_dir = reinterpret_cast<wz_dir>(
474
+ reinterpret_cast<wz::WzFile*>(file)->GetWzDirectory());
475
+ return wz_clear_last_error();
476
+ }
477
+
478
+ wz_error_code wz_file_is_64bit(wz_file file, int* out_is_64bit) {
479
+ if (auto ec = init_out("wz_file_is_64bit", out_is_64bit);
480
+ ec != WZ_ERROR_NONE) {
481
+ return ec;
482
+ }
483
+ if (!file) return set_error_null("wz_file_is_64bit");
484
+ *out_is_64bit = reinterpret_cast<wz::WzFile*>(file)->Is64BitWzFile() ? 1 : 0;
485
+ return wz_clear_last_error();
486
+ }
487
+
488
+ wz_error_code wz_file_is_unloaded(wz_file file, int* out_is_unloaded) {
489
+ if (auto ec = init_out("wz_file_is_unloaded", out_is_unloaded);
490
+ ec != WZ_ERROR_NONE) {
491
+ return ec;
492
+ }
493
+ if (!file) return set_error_null("wz_file_is_unloaded");
494
+ *out_is_unloaded = reinterpret_cast<wz::WzFile*>(file)->IsUnloaded() ? 1 : 0;
495
+ return wz_clear_last_error();
496
+ }
497
+
498
+ wz_error_code wz_file_version_hash(wz_file file, uint32_t* out_hash) {
499
+ if (auto ec = init_out("wz_file_version_hash", out_hash);
500
+ ec != WZ_ERROR_NONE) {
501
+ return ec;
502
+ }
503
+ if (!file) return set_error_null("wz_file_version_hash");
504
+ *out_hash = reinterpret_cast<wz::WzFile*>(file)->VersionHash();
505
+ return wz_clear_last_error();
506
+ }
507
+
508
+ wz_error_code wz_file_get_object_from_path(wz_file file,
509
+ const char* path,
510
+ int check_first_directory_name,
511
+ wz_object* out_object) {
512
+ if (auto ec = init_out("wz_file_get_object_from_path", out_object);
513
+ ec != WZ_ERROR_NONE) {
514
+ return ec;
515
+ }
516
+ if (!file) return set_error_null("wz_file_get_object_from_path");
517
+ if (!path) {
518
+ return set_error_invalid_arg("wz_file_get_object_from_path", "path");
519
+ }
520
+ *out_object = reinterpret_cast<wz_object>(
521
+ reinterpret_cast<wz::WzFile*>(file)->GetObjectFromPath(
522
+ path, check_first_directory_name != 0));
523
+ return wz_clear_last_error();
524
+ }
525
+
526
+ wz_error_code wz_dir_name(wz_dir dir, const char** out_name) {
527
+ if (auto ec = init_out("wz_dir_name", out_name); ec != WZ_ERROR_NONE) {
528
+ return ec;
529
+ }
530
+ if (!dir) return set_error_null("wz_dir_name");
531
+ static thread_local std::string s;
532
+ s = reinterpret_cast<wz::WzDirectory*>(dir)->Name();
533
+ *out_name = s.c_str();
534
+ return wz_clear_last_error();
535
+ }
536
+
537
+ wz_error_code wz_dir_count_images(wz_dir dir, int* out_count) {
538
+ if (auto ec = init_out("wz_dir_count_images", out_count);
539
+ ec != WZ_ERROR_NONE) {
540
+ return ec;
541
+ }
542
+ if (!dir) return set_error_null("wz_dir_count_images");
543
+ *out_count = static_cast<int>(
544
+ reinterpret_cast<wz::WzDirectory*>(dir)->WzImages().size());
545
+ return wz_clear_last_error();
546
+ }
547
+
548
+ wz_error_code wz_dir_count_directories(wz_dir dir, int* out_count) {
549
+ if (auto ec = init_out("wz_dir_count_directories", out_count);
550
+ ec != WZ_ERROR_NONE) {
551
+ return ec;
552
+ }
553
+ if (!dir) return set_error_null("wz_dir_count_directories");
554
+ *out_count = static_cast<int>(
555
+ reinterpret_cast<wz::WzDirectory*>(dir)->WzDirectories().size());
556
+ return wz_clear_last_error();
557
+ }
558
+
559
+ wz_error_code wz_dir_count_images_total(wz_dir dir, int* out_count) {
560
+ if (auto ec = init_out("wz_dir_count_images_total", out_count);
561
+ ec != WZ_ERROR_NONE) {
562
+ return ec;
563
+ }
564
+ if (!dir) return set_error_null("wz_dir_count_images_total");
565
+ *out_count = reinterpret_cast<wz::WzDirectory*>(dir)->CountImages();
566
+ return wz_clear_last_error();
567
+ }
568
+
569
+ wz_error_code wz_dir_get_image(wz_dir dir, int index, wz_image* out_image) {
570
+ if (auto ec = init_out("wz_dir_get_image", out_image); ec != WZ_ERROR_NONE) {
571
+ return ec;
572
+ }
573
+ if (!dir) return set_error_null("wz_dir_get_image");
574
+ auto* d = reinterpret_cast<wz::WzDirectory*>(dir);
575
+ size_t sz = d->WzImages().size();
576
+ if (index < 0 || index >= static_cast<int>(sz)) {
577
+ return set_error_idx("wz_dir_get_image", index, sz);
578
+ }
579
+ *out_image =
580
+ reinterpret_cast<wz_image>(d->WzImages()[static_cast<size_t>(index)]);
581
+ return wz_clear_last_error();
582
+ }
583
+
584
+ wz_error_code wz_dir_get_image_by_name(wz_dir dir,
585
+ const char* name,
586
+ wz_image* out_image) {
587
+ if (auto ec = init_out("wz_dir_get_image_by_name", out_image);
588
+ ec != WZ_ERROR_NONE) {
589
+ return ec;
590
+ }
591
+ if (!dir) return set_error_null("wz_dir_get_image_by_name");
592
+ if (!name) return set_error_invalid_arg("wz_dir_get_image_by_name", "name");
593
+ *out_image = reinterpret_cast<wz_image>(
594
+ reinterpret_cast<wz::WzDirectory*>(dir)->GetImageByName(name));
595
+ return wz_clear_last_error();
596
+ }
597
+
598
+ wz_error_code wz_dir_get_directory(wz_dir dir, int index, wz_dir* out_dir) {
599
+ if (auto ec = init_out("wz_dir_get_directory", out_dir);
600
+ ec != WZ_ERROR_NONE) {
601
+ return ec;
602
+ }
603
+ if (!dir) return set_error_null("wz_dir_get_directory");
604
+ auto* d = reinterpret_cast<wz::WzDirectory*>(dir);
605
+ size_t sz = d->WzDirectories().size();
606
+ if (index < 0 || index >= static_cast<int>(sz)) {
607
+ return set_error_idx("wz_dir_get_directory", index, sz);
608
+ }
609
+ *out_dir =
610
+ reinterpret_cast<wz_dir>(d->WzDirectories()[static_cast<size_t>(index)]);
611
+ return wz_clear_last_error();
612
+ }
613
+
614
+ wz_error_code wz_dir_get_directory_by_name(wz_dir dir,
615
+ const char* name,
616
+ wz_dir* out_dir) {
617
+ if (auto ec = init_out("wz_dir_get_directory_by_name", out_dir);
618
+ ec != WZ_ERROR_NONE) {
619
+ return ec;
620
+ }
621
+ if (!dir) return set_error_null("wz_dir_get_directory_by_name");
622
+ if (!name) {
623
+ return set_error_invalid_arg("wz_dir_get_directory_by_name", "name");
624
+ }
625
+ *out_dir = reinterpret_cast<wz_dir>(
626
+ reinterpret_cast<wz::WzDirectory*>(dir)->GetDirectoryByName(name));
627
+ return wz_clear_last_error();
628
+ }
629
+
630
+ wz_error_code wz_dir_create_directory(wz_dir dir,
631
+ const char* name,
632
+ wz_dir* out_dir) {
633
+ if (auto ec = init_out("wz_dir_create_directory", out_dir);
634
+ ec != WZ_ERROR_NONE) {
635
+ return ec;
636
+ }
637
+ if (!dir) return set_error_null("wz_dir_create_directory");
638
+ if (!name) return set_error_invalid_arg("wz_dir_create_directory", "name");
639
+ auto result = unwrap_dir(dir)->CreateDirectory(name);
640
+ if (!result.has_value()) {
641
+ return wz_set_last_error(static_cast<wz_error_code>(result.error().code()),
642
+ result.error().message());
643
+ }
644
+ *out_dir = reinterpret_cast<wz_dir>(result.value());
645
+ return wz_clear_last_error();
646
+ }
647
+
648
+ wz_error_code wz_dir_create_image(wz_dir dir,
649
+ const char* name,
650
+ wz_image* out_image) {
651
+ if (auto ec = init_out("wz_dir_create_image", out_image);
652
+ ec != WZ_ERROR_NONE) {
653
+ return ec;
654
+ }
655
+ if (!dir) return set_error_null("wz_dir_create_image");
656
+ if (!name) return set_error_invalid_arg("wz_dir_create_image", "name");
657
+ auto result = unwrap_dir(dir)->CreateImage(name);
658
+ if (!result.has_value()) {
659
+ return wz_set_last_error(static_cast<wz_error_code>(result.error().code()),
660
+ result.error().message());
661
+ }
662
+ *out_image = reinterpret_cast<wz_image>(result.value());
663
+ return wz_clear_last_error();
664
+ }
665
+
666
+ wz_error_code wz_dir_remove_directory(wz_dir dir, wz_dir child) {
667
+ if (!dir) return set_error_null("wz_dir_remove_directory");
668
+ if (!child) return set_error_null("wz_dir_remove_directory");
669
+ return result_release_owned(unwrap_dir(dir)->RemoveDirectory(unwrap_dir(child)));
670
+ }
671
+
672
+ wz_error_code wz_dir_remove_image(wz_dir dir, wz_image child) {
673
+ if (!dir) return set_error_null("wz_dir_remove_image");
674
+ if (!child) return set_error_null("wz_dir_remove_image");
675
+ return result_release_owned(unwrap_dir(dir)->RemoveImage(unwrap_image(child)));
676
+ }
677
+
678
+ wz_error_code wz_dir_block_size(wz_dir dir, int* out_block_size) {
679
+ if (auto ec = init_out("wz_dir_block_size", out_block_size);
680
+ ec != WZ_ERROR_NONE) {
681
+ return ec;
682
+ }
683
+ if (!dir) return set_error_null("wz_dir_block_size");
684
+ *out_block_size = reinterpret_cast<wz::WzDirectory*>(dir)->BlockSize();
685
+ return wz_clear_last_error();
686
+ }
687
+
688
+ wz_error_code wz_dir_checksum(wz_dir dir, int* out_checksum) {
689
+ if (auto ec = init_out("wz_dir_checksum", out_checksum);
690
+ ec != WZ_ERROR_NONE) {
691
+ return ec;
692
+ }
693
+ if (!dir) return set_error_null("wz_dir_checksum");
694
+ *out_checksum = reinterpret_cast<wz::WzDirectory*>(dir)->Checksum();
695
+ return wz_clear_last_error();
696
+ }
697
+
698
+ wz_error_code wz_dir_offset(wz_dir dir, int64_t* out_offset) {
699
+ if (auto ec = init_out("wz_dir_offset", out_offset); ec != WZ_ERROR_NONE) {
700
+ return ec;
701
+ }
702
+ if (!dir) return set_error_null("wz_dir_offset");
703
+ *out_offset = reinterpret_cast<wz::WzDirectory*>(dir)->Offset();
704
+ return wz_clear_last_error();
705
+ }
706
+
707
+ wz_error_code wz_image_name(wz_image img, const char** out_name) {
708
+ if (auto ec = init_out("wz_image_name", out_name); ec != WZ_ERROR_NONE) {
709
+ return ec;
710
+ }
711
+ if (!img) return set_error_null("wz_image_name");
712
+ static thread_local std::string s;
713
+ s = reinterpret_cast<wz::WzImage*>(img)->Name();
714
+ *out_name = s.c_str();
715
+ return wz_clear_last_error();
716
+ }
717
+
718
+ wz_error_code wz_image_is_parsed(wz_image img, int* out_is_parsed) {
719
+ if (auto ec = init_out("wz_image_is_parsed", out_is_parsed);
720
+ ec != WZ_ERROR_NONE) {
721
+ return ec;
722
+ }
723
+ if (!img) return set_error_null("wz_image_is_parsed");
724
+ *out_is_parsed = reinterpret_cast<wz::WzImage*>(img)->Parsed() ? 1 : 0;
725
+ return wz_clear_last_error();
726
+ }
727
+
728
+ wz_error_code wz_image_is_changed(wz_image img, int* out_is_changed) {
729
+ if (auto ec = init_out("wz_image_is_changed", out_is_changed);
730
+ ec != WZ_ERROR_NONE) {
731
+ return ec;
732
+ }
733
+ if (!img) return set_error_null("wz_image_is_changed");
734
+ *out_is_changed = reinterpret_cast<wz::WzImage*>(img)->Changed() ? 1 : 0;
735
+ return wz_clear_last_error();
736
+ }
737
+
738
+ wz_error_code wz_image_block_size(wz_image img, int* out_block_size) {
739
+ if (auto ec = init_out("wz_image_block_size", out_block_size);
740
+ ec != WZ_ERROR_NONE) {
741
+ return ec;
742
+ }
743
+ if (!img) return set_error_null("wz_image_block_size");
744
+ *out_block_size = reinterpret_cast<wz::WzImage*>(img)->BlockSize();
745
+ return wz_clear_last_error();
746
+ }
747
+
748
+ wz_error_code wz_image_checksum(wz_image img, int* out_checksum) {
749
+ if (auto ec = init_out("wz_image_checksum", out_checksum);
750
+ ec != WZ_ERROR_NONE) {
751
+ return ec;
752
+ }
753
+ if (!img) return set_error_null("wz_image_checksum");
754
+ *out_checksum = reinterpret_cast<wz::WzImage*>(img)->Checksum();
755
+ return wz_clear_last_error();
756
+ }
757
+
758
+ wz_error_code wz_image_offset(wz_image img, int64_t* out_offset) {
759
+ if (auto ec = init_out("wz_image_offset", out_offset); ec != WZ_ERROR_NONE) {
760
+ return ec;
761
+ }
762
+ if (!img) return set_error_null("wz_image_offset");
763
+ *out_offset = reinterpret_cast<wz::WzImage*>(img)->Offset();
764
+ return wz_clear_last_error();
765
+ }
766
+
767
+ wz_error_code wz_image_is_lua_wz_image(wz_image img, int* out_is_lua) {
768
+ if (auto ec = init_out("wz_image_is_lua_wz_image", out_is_lua);
769
+ ec != WZ_ERROR_NONE) {
770
+ return ec;
771
+ }
772
+ if (!img) return set_error_null("wz_image_is_lua_wz_image");
773
+ *out_is_lua = reinterpret_cast<wz::WzImage*>(img)->IsLuaWzImage() ? 1 : 0;
774
+ return wz_clear_last_error();
775
+ }
776
+
777
+ wz_error_code wz_image_parse(wz_image img, int* out_parsed) {
778
+ if (auto ec = init_out("wz_image_parse", out_parsed); ec != WZ_ERROR_NONE) {
779
+ return ec;
780
+ }
781
+ if (!img) return set_error_null("wz_image_parse");
782
+ return result_bool(reinterpret_cast<wz::WzImage*>(img)->ParseImage(),
783
+ out_parsed);
784
+ }
785
+
786
+ wz_error_code wz_image_count_properties(wz_image img, int* out_count) {
787
+ if (auto ec = init_out("wz_image_count_properties", out_count);
788
+ ec != WZ_ERROR_NONE) {
789
+ return ec;
790
+ }
791
+ if (!img) return set_error_null("wz_image_count_properties");
792
+ auto propsResult = reinterpret_cast<wz::WzImage*>(img)->WzPropertiesResult();
793
+ if (auto ec = result_error(propsResult); ec != WZ_ERROR_NONE) return ec;
794
+ auto* props = propsResult.value();
795
+ *out_count = props ? static_cast<int>(props->size()) : 0;
796
+ return wz_clear_last_error();
797
+ }
798
+
799
+ wz_error_code wz_image_get_property(wz_image img,
800
+ int index,
801
+ wz_property* out_property) {
802
+ if (auto ec = init_out("wz_image_get_property", out_property);
803
+ ec != WZ_ERROR_NONE) {
804
+ return ec;
805
+ }
806
+ if (!img) return set_error_null("wz_image_get_property");
807
+ auto propsResult = reinterpret_cast<wz::WzImage*>(img)->WzPropertiesResult();
808
+ if (auto ec = result_error(propsResult); ec != WZ_ERROR_NONE) return ec;
809
+ auto* props = propsResult.value();
810
+ if (!props) return wz_clear_last_error();
811
+ size_t sz = props->size();
812
+ if (index < 0 || index >= static_cast<int>(sz)) {
813
+ return set_error_idx("wz_image_get_property", index, sz);
814
+ }
815
+ *out_property = wrap_prop((*props)[static_cast<size_t>(index)]);
816
+ return wz_clear_last_error();
817
+ }
818
+
819
+ wz_error_code wz_image_get_from_path(wz_image img,
820
+ const char* path,
821
+ wz_property* out_property) {
822
+ if (auto ec = init_out("wz_image_get_from_path", out_property);
823
+ ec != WZ_ERROR_NONE) {
824
+ return ec;
825
+ }
826
+ if (!img) return set_error_null("wz_image_get_from_path");
827
+ if (!path) return set_error_invalid_arg("wz_image_get_from_path", "path");
828
+ auto propResult =
829
+ reinterpret_cast<wz::WzImage*>(img)->GetFromPathResult(path);
830
+ if (auto ec = result_error(propResult); ec != WZ_ERROR_NONE) return ec;
831
+ *out_property = wrap_prop(propResult.value());
832
+ return wz_clear_last_error();
833
+ }
834
+
835
+ wz_error_code wz_get_object_type(wz_object obj, wz_object_type* out_type) {
836
+ if (auto ec = init_out("wz_get_object_type", out_type); ec != WZ_ERROR_NONE) {
837
+ return ec;
838
+ }
839
+ if (!obj) return set_error_null("wz_get_object_type");
840
+ *out_type = static_cast<wz_object_type>(
841
+ reinterpret_cast<wz::WzObject*>(obj)->ObjectType());
842
+ return wz_clear_last_error();
843
+ }
844
+
845
+ wz_error_code wz_object_name(wz_object obj, const char** out_name) {
846
+ if (auto ec = init_out("wz_object_name", out_name); ec != WZ_ERROR_NONE) {
847
+ return ec;
848
+ }
849
+ if (!obj) return set_error_null("wz_object_name");
850
+ static thread_local std::string s;
851
+ s = reinterpret_cast<wz::WzObject*>(obj)->Name();
852
+ *out_name = s.c_str();
853
+ return wz_clear_last_error();
854
+ }
855
+
856
+ wz_error_code wz_object_get_parent(wz_object obj, wz_object* out_parent) {
857
+ if (auto ec = init_out("wz_object_get_parent", out_parent);
858
+ ec != WZ_ERROR_NONE) {
859
+ return ec;
860
+ }
861
+ if (!obj) return set_error_null("wz_object_get_parent");
862
+ *out_parent = reinterpret_cast<wz_object>(
863
+ reinterpret_cast<wz::WzObject*>(obj)->Parent());
864
+ return wz_clear_last_error();
865
+ }
866
+
867
+ wz_error_code wz_object_full_path(wz_object obj, const char** out_path) {
868
+ if (auto ec = init_out("wz_object_full_path", out_path);
869
+ ec != WZ_ERROR_NONE) {
870
+ return ec;
871
+ }
872
+ if (!obj) return set_error_null("wz_object_full_path");
873
+ static thread_local std::string s;
874
+ s = reinterpret_cast<wz::WzObject*>(obj)->FullPath();
875
+ *out_path = s.c_str();
876
+ return wz_clear_last_error();
877
+ }
878
+
879
+ wz_error_code wz_object_get_wz_file_parent(wz_object obj, wz_file* out_file) {
880
+ if (auto ec = init_out("wz_object_get_wz_file_parent", out_file);
881
+ ec != WZ_ERROR_NONE) {
882
+ return ec;
883
+ }
884
+ if (!obj) return set_error_null("wz_object_get_wz_file_parent");
885
+ *out_file = reinterpret_cast<wz_file>(
886
+ reinterpret_cast<wz::WzObject*>(obj)->WzFileParent());
887
+ return wz_clear_last_error();
888
+ }
889
+
890
+ wz_error_code wz_object_get_top_most_wz_directory(wz_object obj,
891
+ wz_object* out_object) {
892
+ if (auto ec = init_out("wz_object_get_top_most_wz_directory", out_object);
893
+ ec != WZ_ERROR_NONE) {
894
+ return ec;
895
+ }
896
+ if (!obj) return set_error_null("wz_object_get_top_most_wz_directory");
897
+ *out_object = reinterpret_cast<wz_object>(
898
+ reinterpret_cast<wz::WzObject*>(obj)->GetTopMostWzDirectory());
899
+ return wz_clear_last_error();
900
+ }
901
+
902
+ wz_error_code wz_object_get_top_most_wz_image(wz_object obj,
903
+ wz_object* out_object) {
904
+ if (auto ec = init_out("wz_object_get_top_most_wz_image", out_object);
905
+ ec != WZ_ERROR_NONE) {
906
+ return ec;
907
+ }
908
+ if (!obj) return set_error_null("wz_object_get_top_most_wz_image");
909
+ *out_object = reinterpret_cast<wz_object>(
910
+ reinterpret_cast<wz::WzObject*>(obj)->GetTopMostWzImage());
911
+ return wz_clear_last_error();
912
+ }
913
+
914
+ wz_error_code wz_object_at(wz_object obj,
915
+ const char* name,
916
+ wz_object* out_object) {
917
+ if (auto ec = init_out("wz_object_at", out_object); ec != WZ_ERROR_NONE) {
918
+ return ec;
919
+ }
920
+ if (!obj) return set_error_null("wz_object_at");
921
+ if (!name) return set_error_invalid_arg("wz_object_at", "name");
922
+ auto* wzObj = reinterpret_cast<wz::WzObject*>(obj);
923
+ if (wzObj->ObjectType() == wz::WzObjectType::Image) {
924
+ auto propResult = static_cast<wz::WzImage*>(wzObj)->GetPropertyByName(name);
925
+ if (auto ec = result_error(propResult); ec != WZ_ERROR_NONE) return ec;
926
+ *out_object = reinterpret_cast<wz_object>(propResult.value());
927
+ } else {
928
+ *out_object = reinterpret_cast<wz_object>((*wzObj)[name]);
929
+ }
930
+ return wz_clear_last_error();
931
+ }
932
+
933
+ wz_error_code wz_object_set_name(wz_object obj, const char* name) {
934
+ if (!obj) return set_error_null("wz_object_set_name");
935
+ if (!name) return set_error_invalid_arg("wz_object_set_name", "name");
936
+ return result_void(unwrap_object(obj)->Rename(name));
937
+ }
938
+
939
+ wz_error_code wz_object_remove(wz_object obj) {
940
+ if (!obj) return set_error_null("wz_object_remove");
941
+ return result_release_object(unwrap_object(obj)->Remove());
942
+ }
943
+
944
+ wz_error_code wz_object_free(wz_object obj) {
945
+ auto* wzObj = unwrap_object(obj);
946
+ if (!wzObj) return set_error_null("wz_object_free");
947
+ if (wzObj->ObjectType() == wz::WzObjectType::File) {
948
+ return wz_set_last_error(WZ_ERROR_INVALID_ARGUMENT,
949
+ "wz_object_free: use wz_close_file for files");
950
+ }
951
+ if (wzObj->Parent()) {
952
+ return wz_set_last_error(WZ_ERROR_INVALID_ARGUMENT,
953
+ "wz_object_free: object is owned by a WZ tree");
954
+ }
955
+ delete wzObj;
956
+ return wz_clear_last_error();
957
+ }
958
+
959
+ wz_error_code wz_property_get_type(wz_property prop,
960
+ wz_property_type* out_type) {
961
+ if (auto ec = init_out("wz_property_get_type", out_type);
962
+ ec != WZ_ERROR_NONE) {
963
+ return ec;
964
+ }
965
+ if (!prop) return set_error_null("wz_property_get_type");
966
+ *out_type = static_cast<wz_property_type>(unwrap_prop(prop)->PropertyType());
967
+ return wz_clear_last_error();
968
+ }
969
+
970
+ wz_error_code wz_property_is_raw_data(wz_property prop, int* out_is_raw) {
971
+ if (auto ec = init_out("wz_property_is_raw_data", out_is_raw);
972
+ ec != WZ_ERROR_NONE) {
973
+ return ec;
974
+ }
975
+ if (!prop) return set_error_null("wz_property_is_raw_data");
976
+ *out_is_raw = unwrap_prop(prop)->IsRawDataProperty() ? 1 : 0;
977
+ return wz_clear_last_error();
978
+ }
979
+
980
+ wz_error_code wz_property_is_video(wz_property prop, int* out_is_video) {
981
+ if (auto ec = init_out("wz_property_is_video", out_is_video);
982
+ ec != WZ_ERROR_NONE) {
983
+ return ec;
984
+ }
985
+ if (!prop) return set_error_null("wz_property_is_video");
986
+ *out_is_video = unwrap_prop(prop)->IsVideoProperty() ? 1 : 0;
987
+ return wz_clear_last_error();
988
+ }
989
+
990
+ wz_error_code wz_property_name(wz_property prop, const char** out_name) {
991
+ if (auto ec = init_out("wz_property_name", out_name); ec != WZ_ERROR_NONE) {
992
+ return ec;
993
+ }
994
+ if (!prop) return set_error_null("wz_property_name");
995
+ static thread_local std::string s;
996
+ s = unwrap_prop(prop)->Name();
997
+ *out_name = s.c_str();
998
+ return wz_clear_last_error();
999
+ }
1000
+
1001
+ wz_error_code wz_property_count_children(wz_property prop, int* out_count) {
1002
+ if (auto ec = init_out("wz_property_count_children", out_count);
1003
+ ec != WZ_ERROR_NONE) {
1004
+ return ec;
1005
+ }
1006
+ if (!prop) return set_error_null("wz_property_count_children");
1007
+ auto* wps = unwrap_prop(prop)->WzProperties();
1008
+ *out_count = wps ? static_cast<int>(wps->size()) : 0;
1009
+ return wz_clear_last_error();
1010
+ }
1011
+
1012
+ wz_error_code wz_property_get_child(wz_property prop,
1013
+ int index,
1014
+ wz_property* out_property) {
1015
+ if (auto ec = init_out("wz_property_get_child", out_property);
1016
+ ec != WZ_ERROR_NONE) {
1017
+ return ec;
1018
+ }
1019
+ if (!prop) return set_error_null("wz_property_get_child");
1020
+ auto* wps = unwrap_prop(prop)->WzProperties();
1021
+ if (!wps) return wz_clear_last_error();
1022
+ size_t sz = wps->size();
1023
+ if (index < 0 || index >= static_cast<int>(sz)) {
1024
+ return set_error_idx("wz_property_get_child", index, sz);
1025
+ }
1026
+ *out_property = wrap_prop((*wps)[static_cast<size_t>(index)]);
1027
+ return wz_clear_last_error();
1028
+ }
1029
+
1030
+ wz_error_code wz_property_get_child_by_name(wz_property prop,
1031
+ const char* name,
1032
+ wz_property* out_property) {
1033
+ if (auto ec = init_out("wz_property_get_child_by_name", out_property);
1034
+ ec != WZ_ERROR_NONE) {
1035
+ return ec;
1036
+ }
1037
+ if (!prop) return set_error_null("wz_property_get_child_by_name");
1038
+ if (!name) {
1039
+ return set_error_invalid_arg("wz_property_get_child_by_name", "name");
1040
+ }
1041
+ auto* wps = unwrap_prop(prop)->WzProperties();
1042
+ if (!wps) return wz_clear_last_error();
1043
+ for (auto* child : *wps) {
1044
+ if (child && child->Name() == name) {
1045
+ *out_property = wrap_prop(child);
1046
+ break;
1047
+ }
1048
+ }
1049
+ return wz_clear_last_error();
1050
+ }
1051
+
1052
+ wz_error_code wz_property_get_from_path(wz_property prop,
1053
+ const char* path,
1054
+ wz_property* out_property) {
1055
+ if (auto ec = init_out("wz_property_get_from_path", out_property);
1056
+ ec != WZ_ERROR_NONE) {
1057
+ return ec;
1058
+ }
1059
+ if (!prop) return set_error_null("wz_property_get_from_path");
1060
+ if (!path) return set_error_invalid_arg("wz_property_get_from_path", "path");
1061
+ *out_property = wrap_prop(unwrap_prop(prop)->GetFromPath(path));
1062
+ return wz_clear_last_error();
1063
+ }
1064
+
1065
+ wz_error_code wz_property_create_null(const char* name,
1066
+ wz_property* out_property) {
1067
+ if (auto ec = init_out("wz_property_create_null", out_property);
1068
+ ec != WZ_ERROR_NONE) {
1069
+ return ec;
1070
+ }
1071
+ if (!name) return set_error_invalid_arg("wz_property_create_null", "name");
1072
+ *out_property = wrap_prop(new wz::WzNullProperty(name));
1073
+ return wz_clear_last_error();
1074
+ }
1075
+
1076
+ wz_error_code wz_property_create_short(const char* name,
1077
+ int16_t value,
1078
+ wz_property* out_property) {
1079
+ if (auto ec = init_out("wz_property_create_short", out_property);
1080
+ ec != WZ_ERROR_NONE) {
1081
+ return ec;
1082
+ }
1083
+ if (!name) return set_error_invalid_arg("wz_property_create_short", "name");
1084
+ *out_property = wrap_prop(new wz::WzShortProperty(name, value));
1085
+ return wz_clear_last_error();
1086
+ }
1087
+
1088
+ wz_error_code wz_property_create_int(const char* name,
1089
+ int32_t value,
1090
+ wz_property* out_property) {
1091
+ if (auto ec = init_out("wz_property_create_int", out_property);
1092
+ ec != WZ_ERROR_NONE) {
1093
+ return ec;
1094
+ }
1095
+ if (!name) return set_error_invalid_arg("wz_property_create_int", "name");
1096
+ *out_property = wrap_prop(new wz::WzIntProperty(name, value));
1097
+ return wz_clear_last_error();
1098
+ }
1099
+
1100
+ wz_error_code wz_property_create_long(const char* name,
1101
+ int64_t value,
1102
+ wz_property* out_property) {
1103
+ if (auto ec = init_out("wz_property_create_long", out_property);
1104
+ ec != WZ_ERROR_NONE) {
1105
+ return ec;
1106
+ }
1107
+ if (!name) return set_error_invalid_arg("wz_property_create_long", "name");
1108
+ *out_property = wrap_prop(new wz::WzLongProperty(name, value));
1109
+ return wz_clear_last_error();
1110
+ }
1111
+
1112
+ wz_error_code wz_property_create_float(const char* name,
1113
+ float value,
1114
+ wz_property* out_property) {
1115
+ if (auto ec = init_out("wz_property_create_float", out_property);
1116
+ ec != WZ_ERROR_NONE) {
1117
+ return ec;
1118
+ }
1119
+ if (!name) return set_error_invalid_arg("wz_property_create_float", "name");
1120
+ *out_property = wrap_prop(new wz::WzFloatProperty(name, value));
1121
+ return wz_clear_last_error();
1122
+ }
1123
+
1124
+ wz_error_code wz_property_create_double(const char* name,
1125
+ double value,
1126
+ wz_property* out_property) {
1127
+ if (auto ec = init_out("wz_property_create_double", out_property);
1128
+ ec != WZ_ERROR_NONE) {
1129
+ return ec;
1130
+ }
1131
+ if (!name) return set_error_invalid_arg("wz_property_create_double", "name");
1132
+ *out_property = wrap_prop(new wz::WzDoubleProperty(name, value));
1133
+ return wz_clear_last_error();
1134
+ }
1135
+
1136
+ wz_error_code wz_property_create_string(const char* name,
1137
+ const char* value,
1138
+ wz_property* out_property) {
1139
+ if (auto ec = init_out("wz_property_create_string", out_property);
1140
+ ec != WZ_ERROR_NONE) {
1141
+ return ec;
1142
+ }
1143
+ if (!name) return set_error_invalid_arg("wz_property_create_string", "name");
1144
+ if (!value) {
1145
+ return set_error_invalid_arg("wz_property_create_string", "value");
1146
+ }
1147
+ *out_property = wrap_prop(new wz::WzStringProperty(name, value));
1148
+ return wz_clear_last_error();
1149
+ }
1150
+
1151
+ wz_error_code wz_property_create_sub(const char* name,
1152
+ wz_property* out_property) {
1153
+ if (auto ec = init_out("wz_property_create_sub", out_property);
1154
+ ec != WZ_ERROR_NONE) {
1155
+ return ec;
1156
+ }
1157
+ if (!name) return set_error_invalid_arg("wz_property_create_sub", "name");
1158
+ *out_property = wrap_prop(new wz::WzSubProperty(name));
1159
+ return wz_clear_last_error();
1160
+ }
1161
+
1162
+ wz_error_code wz_property_create_vector(const char* name,
1163
+ int32_t x,
1164
+ int32_t y,
1165
+ wz_property* out_property) {
1166
+ if (auto ec = init_out("wz_property_create_vector", out_property);
1167
+ ec != WZ_ERROR_NONE) {
1168
+ return ec;
1169
+ }
1170
+ if (!name) return set_error_invalid_arg("wz_property_create_vector", "name");
1171
+ *out_property = wrap_prop(new wz::WzVectorProperty(name, x, y));
1172
+ return wz_clear_last_error();
1173
+ }
1174
+
1175
+ wz_error_code wz_property_create_uol(const char* name,
1176
+ const char* value,
1177
+ wz_property* out_property) {
1178
+ if (auto ec = init_out("wz_property_create_uol", out_property);
1179
+ ec != WZ_ERROR_NONE) {
1180
+ return ec;
1181
+ }
1182
+ if (!name) return set_error_invalid_arg("wz_property_create_uol", "name");
1183
+ if (!value) return set_error_invalid_arg("wz_property_create_uol", "value");
1184
+ *out_property = wrap_prop(new wz::WzUOLProperty(name, value));
1185
+ return wz_clear_last_error();
1186
+ }
1187
+
1188
+ wz_error_code wz_property_free(wz_property prop) {
1189
+ auto* p = unwrap_prop(prop);
1190
+ if (!p) return set_error_null("wz_property_free");
1191
+ if (p->Parent()) {
1192
+ return wz_set_last_error(
1193
+ WZ_ERROR_INVALID_ARGUMENT,
1194
+ "wz_property_free: property is owned by a WZ tree");
1195
+ }
1196
+ delete p;
1197
+ return wz_clear_last_error();
1198
+ }
1199
+
1200
+ wz_error_code wz_image_add_property(wz_image img, wz_property prop) {
1201
+ if (!img) return set_error_null("wz_image_add_property");
1202
+ auto* p = unwrap_prop(prop);
1203
+ if (!p) return set_error_null("wz_image_add_property");
1204
+ return result_void(unwrap_image(img)->AddProperty(p));
1205
+ }
1206
+
1207
+ wz_error_code wz_property_add_child(wz_property parent, wz_property child) {
1208
+ auto* parentProp = unwrap_prop(parent);
1209
+ if (!parentProp) return set_error_null("wz_property_add_child");
1210
+ auto* childProp = unwrap_prop(child);
1211
+ if (!childProp) return set_error_null("wz_property_add_child");
1212
+ if (!is_mutable_property_container(parentProp))
1213
+ return set_error_wrong_type("wz_property_add_child");
1214
+ return result_void(parentProp->AddProperty(childProp));
1215
+ }
1216
+
1217
+ wz_error_code wz_image_remove_property(wz_image img, wz_property prop) {
1218
+ if (!img) return set_error_null("wz_image_remove_property");
1219
+ auto* p = unwrap_prop(prop);
1220
+ if (!p) return set_error_null("wz_image_remove_property");
1221
+ return result_release_property(unwrap_image(img)->RemoveProperty(p));
1222
+ }
1223
+
1224
+ wz_error_code wz_property_remove_child(wz_property parent, wz_property child) {
1225
+ auto* parentProp = unwrap_prop(parent);
1226
+ if (!parentProp) return set_error_null("wz_property_remove_child");
1227
+ auto* childProp = unwrap_prop(child);
1228
+ if (!childProp) return set_error_null("wz_property_remove_child");
1229
+ if (!is_mutable_property_container(parentProp)) {
1230
+ return set_error_wrong_type("wz_property_remove_child");
1231
+ }
1232
+ return result_release_property(parentProp->RemoveProperty(childProp));
1233
+ }
1234
+
1235
+ wz_error_code wz_image_clear_properties(wz_image img) {
1236
+ if (!img) return set_error_null("wz_image_clear_properties");
1237
+ return result_void(unwrap_image(img)->ClearProperties());
1238
+ }
1239
+
1240
+ wz_error_code wz_property_clear_children(wz_property prop) {
1241
+ auto* p = unwrap_prop(prop);
1242
+ if (!p) return set_error_null("wz_property_clear_children");
1243
+ if (!is_mutable_property_container(p))
1244
+ return set_error_wrong_type("wz_property_clear_children");
1245
+ return result_void(p->ClearProperties());
1246
+ }
1247
+
1248
+ wz_error_code wz_property_get_int(wz_property prop, int32_t* out_value) {
1249
+ if (auto ec = init_out("wz_property_get_int", out_value);
1250
+ ec != WZ_ERROR_NONE) {
1251
+ return ec;
1252
+ }
1253
+ if (!prop) return set_error_null("wz_property_get_int");
1254
+ *out_value = unwrap_prop(prop)->GetInt();
1255
+ return wz_clear_last_error();
1256
+ }
1257
+
1258
+ wz_error_code wz_property_get_short(wz_property prop, int16_t* out_value) {
1259
+ if (auto ec = init_out("wz_property_get_short", out_value);
1260
+ ec != WZ_ERROR_NONE) {
1261
+ return ec;
1262
+ }
1263
+ if (!prop) return set_error_null("wz_property_get_short");
1264
+ *out_value = unwrap_prop(prop)->GetShort();
1265
+ return wz_clear_last_error();
1266
+ }
1267
+
1268
+ wz_error_code wz_property_get_long(wz_property prop, int64_t* out_value) {
1269
+ if (auto ec = init_out("wz_property_get_long", out_value);
1270
+ ec != WZ_ERROR_NONE) {
1271
+ return ec;
1272
+ }
1273
+ if (!prop) return set_error_null("wz_property_get_long");
1274
+ *out_value = unwrap_prop(prop)->GetLong();
1275
+ return wz_clear_last_error();
1276
+ }
1277
+
1278
+ wz_error_code wz_property_get_float(wz_property prop, float* out_value) {
1279
+ if (auto ec = init_out("wz_property_get_float", out_value);
1280
+ ec != WZ_ERROR_NONE) {
1281
+ return ec;
1282
+ }
1283
+ if (!prop) return set_error_null("wz_property_get_float");
1284
+ *out_value = unwrap_prop(prop)->GetFloat();
1285
+ return wz_clear_last_error();
1286
+ }
1287
+
1288
+ wz_error_code wz_property_get_double(wz_property prop, double* out_value) {
1289
+ if (auto ec = init_out("wz_property_get_double", out_value);
1290
+ ec != WZ_ERROR_NONE) {
1291
+ return ec;
1292
+ }
1293
+ if (!prop) return set_error_null("wz_property_get_double");
1294
+ *out_value = unwrap_prop(prop)->GetDouble();
1295
+ return wz_clear_last_error();
1296
+ }
1297
+
1298
+ wz_error_code wz_property_get_string(wz_property prop, const char** out_value) {
1299
+ if (auto ec = init_out("wz_property_get_string", out_value);
1300
+ ec != WZ_ERROR_NONE) {
1301
+ return ec;
1302
+ }
1303
+ if (!prop) return set_error_null("wz_property_get_string");
1304
+ static thread_local std::string s;
1305
+ s = unwrap_prop(prop)->GetString();
1306
+ *out_value = s.c_str();
1307
+ return wz_clear_last_error();
1308
+ }
1309
+
1310
+ wz_error_code wz_property_get_bytes(wz_property prop,
1311
+ uint8_t* buffer,
1312
+ size_t buffer_size,
1313
+ size_t* out_size) {
1314
+ if (auto ec = init_out("wz_property_get_bytes", out_size);
1315
+ ec != WZ_ERROR_NONE) {
1316
+ return ec;
1317
+ }
1318
+ if (!prop) return set_error_null("wz_property_get_bytes");
1319
+ auto result = unwrap_prop(prop)->GetBytes();
1320
+ if (!result.has_value()) {
1321
+ return wz_set_last_error(static_cast<wz_error_code>(result.error().code()),
1322
+ result.error().message());
1323
+ }
1324
+ auto data = result.value();
1325
+ *out_size = data.size();
1326
+ if (buffer && buffer_size >= data.size()) {
1327
+ std::memcpy(buffer, data.data(), data.size());
1328
+ }
1329
+ return wz_clear_last_error();
1330
+ }
1331
+
1332
+ wz_error_code wz_int_get_value(wz_property prop, int32_t* out_value) {
1333
+ if (auto ec = init_out("wz_int_get_value", out_value); ec != WZ_ERROR_NONE) {
1334
+ return ec;
1335
+ }
1336
+ if (!prop) return set_error_null("wz_int_get_value");
1337
+ if (unwrap_prop(prop)->PropertyType() != wz::WzPropertyType::Int) {
1338
+ return set_error_wrong_type("wz_int_get_value");
1339
+ }
1340
+ *out_value = static_cast<wz::WzIntProperty*>(unwrap_prop(prop))->Value();
1341
+ return wz_clear_last_error();
1342
+ }
1343
+
1344
+ wz_error_code wz_int_set_value(wz_property prop, int32_t value) {
1345
+ if (!prop) return set_error_null("wz_int_set_value");
1346
+ if (unwrap_prop(prop)->PropertyType() != wz::WzPropertyType::Int) {
1347
+ return set_error_wrong_type("wz_int_set_value");
1348
+ }
1349
+ static_cast<wz::WzIntProperty*>(unwrap_prop(prop))->SetValue(value);
1350
+ return wz_clear_last_error();
1351
+ }
1352
+
1353
+ wz_error_code wz_short_get_value(wz_property prop, int16_t* out_value) {
1354
+ if (auto ec = init_out("wz_short_get_value", out_value);
1355
+ ec != WZ_ERROR_NONE) {
1356
+ return ec;
1357
+ }
1358
+ if (!prop) return set_error_null("wz_short_get_value");
1359
+ if (unwrap_prop(prop)->PropertyType() != wz::WzPropertyType::Short) {
1360
+ return set_error_wrong_type("wz_short_get_value");
1361
+ }
1362
+ *out_value = static_cast<wz::WzShortProperty*>(unwrap_prop(prop))->Value();
1363
+ return wz_clear_last_error();
1364
+ }
1365
+
1366
+ wz_error_code wz_short_set_value(wz_property prop, int16_t value) {
1367
+ if (!prop) return set_error_null("wz_short_set_value");
1368
+ if (unwrap_prop(prop)->PropertyType() != wz::WzPropertyType::Short) {
1369
+ return set_error_wrong_type("wz_short_set_value");
1370
+ }
1371
+ static_cast<wz::WzShortProperty*>(unwrap_prop(prop))->SetValue(value);
1372
+ return wz_clear_last_error();
1373
+ }
1374
+
1375
+ wz_error_code wz_long_get_value(wz_property prop, int64_t* out_value) {
1376
+ if (auto ec = init_out("wz_long_get_value", out_value); ec != WZ_ERROR_NONE) {
1377
+ return ec;
1378
+ }
1379
+ if (!prop) return set_error_null("wz_long_get_value");
1380
+ if (unwrap_prop(prop)->PropertyType() != wz::WzPropertyType::Long) {
1381
+ return set_error_wrong_type("wz_long_get_value");
1382
+ }
1383
+ *out_value = static_cast<wz::WzLongProperty*>(unwrap_prop(prop))->Value();
1384
+ return wz_clear_last_error();
1385
+ }
1386
+
1387
+ wz_error_code wz_long_set_value(wz_property prop, int64_t value) {
1388
+ if (!prop) return set_error_null("wz_long_set_value");
1389
+ if (unwrap_prop(prop)->PropertyType() != wz::WzPropertyType::Long) {
1390
+ return set_error_wrong_type("wz_long_set_value");
1391
+ }
1392
+ static_cast<wz::WzLongProperty*>(unwrap_prop(prop))->SetValue(value);
1393
+ return wz_clear_last_error();
1394
+ }
1395
+
1396
+ wz_error_code wz_float_get_value(wz_property prop, float* out_value) {
1397
+ if (auto ec = init_out("wz_float_get_value", out_value);
1398
+ ec != WZ_ERROR_NONE) {
1399
+ return ec;
1400
+ }
1401
+ if (!prop) return set_error_null("wz_float_get_value");
1402
+ if (unwrap_prop(prop)->PropertyType() != wz::WzPropertyType::Float) {
1403
+ return set_error_wrong_type("wz_float_get_value");
1404
+ }
1405
+ *out_value = static_cast<wz::WzFloatProperty*>(unwrap_prop(prop))->Value();
1406
+ return wz_clear_last_error();
1407
+ }
1408
+
1409
+ wz_error_code wz_float_set_value(wz_property prop, float value) {
1410
+ if (!prop) return set_error_null("wz_float_set_value");
1411
+ if (unwrap_prop(prop)->PropertyType() != wz::WzPropertyType::Float) {
1412
+ return set_error_wrong_type("wz_float_set_value");
1413
+ }
1414
+ static_cast<wz::WzFloatProperty*>(unwrap_prop(prop))->SetValue(value);
1415
+ return wz_clear_last_error();
1416
+ }
1417
+
1418
+ wz_error_code wz_double_get_value(wz_property prop, double* out_value) {
1419
+ if (auto ec = init_out("wz_double_get_value", out_value);
1420
+ ec != WZ_ERROR_NONE) {
1421
+ return ec;
1422
+ }
1423
+ if (!prop) return set_error_null("wz_double_get_value");
1424
+ if (unwrap_prop(prop)->PropertyType() != wz::WzPropertyType::Double) {
1425
+ return set_error_wrong_type("wz_double_get_value");
1426
+ }
1427
+ *out_value = static_cast<wz::WzDoubleProperty*>(unwrap_prop(prop))->Value();
1428
+ return wz_clear_last_error();
1429
+ }
1430
+
1431
+ wz_error_code wz_double_set_value(wz_property prop, double value) {
1432
+ if (!prop) return set_error_null("wz_double_set_value");
1433
+ if (unwrap_prop(prop)->PropertyType() != wz::WzPropertyType::Double) {
1434
+ return set_error_wrong_type("wz_double_set_value");
1435
+ }
1436
+ static_cast<wz::WzDoubleProperty*>(unwrap_prop(prop))->SetValue(value);
1437
+ return wz_clear_last_error();
1438
+ }
1439
+
1440
+ wz_error_code wz_string_get_value(wz_property prop, const char** out_value) {
1441
+ if (auto ec = init_out("wz_string_get_value", out_value);
1442
+ ec != WZ_ERROR_NONE) {
1443
+ return ec;
1444
+ }
1445
+ if (!prop) return set_error_null("wz_string_get_value");
1446
+ if (unwrap_prop(prop)->PropertyType() != wz::WzPropertyType::String) {
1447
+ return set_error_wrong_type("wz_string_get_value");
1448
+ }
1449
+ static thread_local std::string s;
1450
+ s = static_cast<wz::WzStringProperty*>(unwrap_prop(prop))->Value();
1451
+ *out_value = s.c_str();
1452
+ return wz_clear_last_error();
1453
+ }
1454
+
1455
+ wz_error_code wz_string_set_value(wz_property prop, const char* value) {
1456
+ if (!prop) return set_error_null("wz_string_set_value");
1457
+ if (!value) return set_error_invalid_arg("wz_string_set_value", "value");
1458
+ if (unwrap_prop(prop)->PropertyType() != wz::WzPropertyType::String) {
1459
+ return set_error_wrong_type("wz_string_set_value");
1460
+ }
1461
+ static_cast<wz::WzStringProperty*>(unwrap_prop(prop))->SetValue(value);
1462
+ return wz_clear_last_error();
1463
+ }
1464
+
1465
+ wz_error_code wz_png_width(wz_png_property png, int* out_width) {
1466
+ if (auto ec = init_out("wz_png_width", out_width); ec != WZ_ERROR_NONE) {
1467
+ return ec;
1468
+ }
1469
+ if (!png) return set_error_null("wz_png_width");
1470
+ *out_width = reinterpret_cast<wz::WzPngProperty*>(png)->Width();
1471
+ return wz_clear_last_error();
1472
+ }
1473
+
1474
+ wz_error_code wz_png_height(wz_png_property png, int* out_height) {
1475
+ if (auto ec = init_out("wz_png_height", out_height); ec != WZ_ERROR_NONE) {
1476
+ return ec;
1477
+ }
1478
+ if (!png) return set_error_null("wz_png_height");
1479
+ *out_height = reinterpret_cast<wz::WzPngProperty*>(png)->Height();
1480
+ return wz_clear_last_error();
1481
+ }
1482
+
1483
+ wz_error_code wz_png_format(wz_png_property png, int* out_format) {
1484
+ if (auto ec = init_out("wz_png_format", out_format); ec != WZ_ERROR_NONE) {
1485
+ return ec;
1486
+ }
1487
+ if (!png) return set_error_null("wz_png_format");
1488
+ *out_format =
1489
+ static_cast<int>(reinterpret_cast<wz::WzPngProperty*>(png)->Format());
1490
+ return wz_clear_last_error();
1491
+ }
1492
+
1493
+ wz_error_code wz_png_is_list_wz_used(wz_png_property png, int* out_is_used) {
1494
+ if (auto ec = init_out("wz_png_is_list_wz_used", out_is_used);
1495
+ ec != WZ_ERROR_NONE) {
1496
+ return ec;
1497
+ }
1498
+ if (!png) return set_error_null("wz_png_is_list_wz_used");
1499
+ *out_is_used =
1500
+ reinterpret_cast<wz::WzPngProperty*>(png)->ListWzUsed() ? 1 : 0;
1501
+ return wz_clear_last_error();
1502
+ }
1503
+
1504
+ wz_error_code wz_png_get_image(wz_png_property png,
1505
+ uint8_t* buffer,
1506
+ size_t buffer_size,
1507
+ size_t* out_size) {
1508
+ if (auto ec = init_out("wz_png_get_image", out_size); ec != WZ_ERROR_NONE) {
1509
+ return ec;
1510
+ }
1511
+ if (!png) return set_error_null("wz_png_get_image");
1512
+ auto result = reinterpret_cast<wz::WzPngProperty*>(png)->GetImage(false);
1513
+ if (!result.has_value()) {
1514
+ return wz_set_last_error(static_cast<wz_error_code>(result.error().code()),
1515
+ result.error().message());
1516
+ }
1517
+ auto& data = result.value();
1518
+ *out_size = data.size();
1519
+ if (buffer && buffer_size >= data.size()) {
1520
+ std::memcpy(buffer, data.data(), data.size());
1521
+ }
1522
+ return wz_clear_last_error();
1523
+ }
1524
+
1525
+ wz_error_code wz_png_get_compressed_bytes(wz_png_property png,
1526
+ uint8_t* buffer,
1527
+ size_t buffer_size,
1528
+ size_t* out_size) {
1529
+ if (auto ec = init_out("wz_png_get_compressed_bytes", out_size);
1530
+ ec != WZ_ERROR_NONE) {
1531
+ return ec;
1532
+ }
1533
+ if (!png) return set_error_null("wz_png_get_compressed_bytes");
1534
+ auto result =
1535
+ reinterpret_cast<wz::WzPngProperty*>(png)->GetCompressedBytes(false);
1536
+ if (!result.has_value()) {
1537
+ return wz_set_last_error(static_cast<wz_error_code>(result.error().code()),
1538
+ result.error().message());
1539
+ }
1540
+ auto& data = result.value();
1541
+ *out_size = data.size();
1542
+ if (buffer && buffer_size >= data.size()) {
1543
+ std::memcpy(buffer, data.data(), data.size());
1544
+ }
1545
+ return wz_clear_last_error();
1546
+ }
1547
+
1548
+ wz_error_code wz_png_save_to_file(wz_png_property png, const char* file_path) {
1549
+ if (!png) return set_error_null("wz_png_save_to_file");
1550
+ if (!file_path) {
1551
+ return set_error_invalid_arg("wz_png_save_to_file", "file_path");
1552
+ }
1553
+ return result_void(
1554
+ reinterpret_cast<wz::WzPngProperty*>(png)->SaveToFile(file_path));
1555
+ }
1556
+
1557
+ wz_error_code wz_canvas_get_png(wz_property canvas_prop,
1558
+ wz_png_property* out_png) {
1559
+ if (auto ec = init_out("wz_canvas_get_png", out_png); ec != WZ_ERROR_NONE) {
1560
+ return ec;
1561
+ }
1562
+ auto* p = unwrap_prop(canvas_prop);
1563
+ if (!p) return set_error_null("wz_canvas_get_png");
1564
+ if (p->PropertyType() != wz::WzPropertyType::Canvas) {
1565
+ return set_error_wrong_type("wz_canvas_get_png");
1566
+ }
1567
+ *out_png = reinterpret_cast<wz_png_property>(
1568
+ static_cast<wz::WzCanvasProperty*>(p)->PngProperty());
1569
+ return wz_clear_last_error();
1570
+ }
1571
+
1572
+ wz_error_code wz_canvas_contains_inlink(wz_property canvas_prop,
1573
+ int* out_contains) {
1574
+ if (auto ec = init_out("wz_canvas_contains_inlink", out_contains);
1575
+ ec != WZ_ERROR_NONE) {
1576
+ return ec;
1577
+ }
1578
+ auto* p = unwrap_prop(canvas_prop);
1579
+ if (!p) return set_error_null("wz_canvas_contains_inlink");
1580
+ if (p->PropertyType() != wz::WzPropertyType::Canvas) {
1581
+ return set_error_wrong_type("wz_canvas_contains_inlink");
1582
+ }
1583
+ *out_contains =
1584
+ static_cast<wz::WzCanvasProperty*>(p)->ContainsInlinkProperty() ? 1 : 0;
1585
+ return wz_clear_last_error();
1586
+ }
1587
+
1588
+ wz_error_code wz_canvas_contains_outlink(wz_property canvas_prop,
1589
+ int* out_contains) {
1590
+ if (auto ec = init_out("wz_canvas_contains_outlink", out_contains);
1591
+ ec != WZ_ERROR_NONE) {
1592
+ return ec;
1593
+ }
1594
+ auto* p = unwrap_prop(canvas_prop);
1595
+ if (!p) return set_error_null("wz_canvas_contains_outlink");
1596
+ if (p->PropertyType() != wz::WzPropertyType::Canvas) {
1597
+ return set_error_wrong_type("wz_canvas_contains_outlink");
1598
+ }
1599
+ *out_contains =
1600
+ static_cast<wz::WzCanvasProperty*>(p)->ContainsOutlinkProperty() ? 1 : 0;
1601
+ return wz_clear_last_error();
1602
+ }
1603
+
1604
+ wz_error_code wz_canvas_save_to_file(wz_property canvas_prop,
1605
+ const char* file_path) {
1606
+ auto* p = unwrap_prop(canvas_prop);
1607
+ if (!p) return set_error_null("wz_canvas_save_to_file");
1608
+ if (!file_path) {
1609
+ return set_error_invalid_arg("wz_canvas_save_to_file", "file_path");
1610
+ }
1611
+ if (p->PropertyType() != wz::WzPropertyType::Canvas) {
1612
+ return set_error_wrong_type("wz_canvas_save_to_file");
1613
+ }
1614
+ return result_void(
1615
+ static_cast<wz::WzCanvasProperty*>(p)->SaveToFile(file_path));
1616
+ }
1617
+
1618
+ wz_error_code wz_canvas_get_linked_wz_image_property(
1619
+ wz_property canvas_prop, wz_property* out_property) {
1620
+ if (auto ec =
1621
+ init_out("wz_canvas_get_linked_wz_image_property", out_property);
1622
+ ec != WZ_ERROR_NONE) {
1623
+ return ec;
1624
+ }
1625
+ auto* p = unwrap_prop(canvas_prop);
1626
+ if (!p) return set_error_null("wz_canvas_get_linked_wz_image_property");
1627
+ if (p->PropertyType() != wz::WzPropertyType::Canvas) {
1628
+ return set_error_wrong_type("wz_canvas_get_linked_wz_image_property");
1629
+ }
1630
+ auto linked_result =
1631
+ static_cast<wz::WzCanvasProperty*>(p)->GetLinkedWzImageProperty();
1632
+ if (!linked_result.has_value()) {
1633
+ return wz_set_last_error(
1634
+ static_cast<wz_error_code>(linked_result.error().code()),
1635
+ linked_result.error().message());
1636
+ }
1637
+ auto* linked = linked_result.value();
1638
+ *out_property = linked ? wrap_prop(linked) : nullptr;
1639
+ return wz_clear_last_error();
1640
+ }
1641
+
1642
+ wz_error_code wz_uol_get_value(wz_property uol_prop, const char** out_value) {
1643
+ if (auto ec = init_out("wz_uol_get_value", out_value); ec != WZ_ERROR_NONE) {
1644
+ return ec;
1645
+ }
1646
+ auto* p = unwrap_prop(uol_prop);
1647
+ if (!p) return set_error_null("wz_uol_get_value");
1648
+ if (p->PropertyType() != wz::WzPropertyType::UOL) {
1649
+ return set_error_wrong_type("wz_uol_get_value");
1650
+ }
1651
+ static thread_local std::string s;
1652
+ s = static_cast<wz::WzUOLProperty*>(p)->Value();
1653
+ *out_value = s.c_str();
1654
+ return wz_clear_last_error();
1655
+ }
1656
+
1657
+ wz_error_code wz_uol_set_value(wz_property uol_prop, const char* value) {
1658
+ auto* p = unwrap_prop(uol_prop);
1659
+ if (!p) return set_error_null("wz_uol_set_value");
1660
+ if (!value) return set_error_invalid_arg("wz_uol_set_value", "value");
1661
+ if (p->PropertyType() != wz::WzPropertyType::UOL) {
1662
+ return set_error_wrong_type("wz_uol_set_value");
1663
+ }
1664
+ static_cast<wz::WzUOLProperty*>(p)->SetValue(value);
1665
+ return wz_clear_last_error();
1666
+ }
1667
+
1668
+ wz_error_code wz_uol_get_link_value(wz_property uol_prop,
1669
+ wz_object* out_object) {
1670
+ if (auto ec = init_out("wz_uol_get_link_value", out_object);
1671
+ ec != WZ_ERROR_NONE) {
1672
+ return ec;
1673
+ }
1674
+ auto* p = unwrap_prop(uol_prop);
1675
+ if (!p) return set_error_null("wz_uol_get_link_value");
1676
+ if (p->PropertyType() != wz::WzPropertyType::UOL) {
1677
+ return set_error_wrong_type("wz_uol_get_link_value");
1678
+ }
1679
+ *out_object = reinterpret_cast<wz_object>(
1680
+ static_cast<wz::WzUOLProperty*>(p)->LinkValue());
1681
+ return wz_clear_last_error();
1682
+ }
1683
+
1684
+ wz_error_code wz_property_get_linked_wz_image_property(
1685
+ wz_property prop, wz_property* out_property) {
1686
+ if (auto ec =
1687
+ init_out("wz_property_get_linked_wz_image_property", out_property);
1688
+ ec != WZ_ERROR_NONE) {
1689
+ return ec;
1690
+ }
1691
+ if (!prop) return set_error_null("wz_property_get_linked_wz_image_property");
1692
+ auto* linked = unwrap_prop(prop)->GetLinkedWzImageProperty();
1693
+ *out_property = linked ? wrap_prop(linked) : nullptr;
1694
+ return wz_clear_last_error();
1695
+ }
1696
+
1697
+ wz_error_code wz_vector_get_x(wz_property vec_prop, int32_t* out_value) {
1698
+ if (auto ec = init_out("wz_vector_get_x", out_value); ec != WZ_ERROR_NONE) {
1699
+ return ec;
1700
+ }
1701
+ auto* p = unwrap_prop(vec_prop);
1702
+ if (!p) return set_error_null("wz_vector_get_x");
1703
+ if (p->PropertyType() != wz::WzPropertyType::Vector) {
1704
+ return set_error_wrong_type("wz_vector_get_x");
1705
+ }
1706
+ auto* vec = static_cast<wz::WzVectorProperty*>(p);
1707
+ *out_value = vec->X ? vec->X->Value() : 0;
1708
+ return wz_clear_last_error();
1709
+ }
1710
+
1711
+ wz_error_code wz_vector_get_y(wz_property vec_prop, int32_t* out_value) {
1712
+ if (auto ec = init_out("wz_vector_get_y", out_value); ec != WZ_ERROR_NONE) {
1713
+ return ec;
1714
+ }
1715
+ auto* p = unwrap_prop(vec_prop);
1716
+ if (!p) return set_error_null("wz_vector_get_y");
1717
+ if (p->PropertyType() != wz::WzPropertyType::Vector) {
1718
+ return set_error_wrong_type("wz_vector_get_y");
1719
+ }
1720
+ auto* vec = static_cast<wz::WzVectorProperty*>(p);
1721
+ *out_value = vec->Y ? vec->Y->Value() : 0;
1722
+ return wz_clear_last_error();
1723
+ }
1724
+
1725
+ wz_error_code wz_lua_get_data(wz_property lua_prop,
1726
+ uint8_t* buffer,
1727
+ size_t buffer_size,
1728
+ size_t* out_size) {
1729
+ if (auto ec = init_out("wz_lua_get_data", out_size); ec != WZ_ERROR_NONE) {
1730
+ return ec;
1731
+ }
1732
+ auto* p = unwrap_prop(lua_prop);
1733
+ if (!p) return set_error_null("wz_lua_get_data");
1734
+ if (p->PropertyType() != wz::WzPropertyType::Lua) {
1735
+ return set_error_wrong_type("wz_lua_get_data");
1736
+ }
1737
+ auto& data = static_cast<wz::WzLuaProperty*>(p)->Value();
1738
+ *out_size = data.size();
1739
+ if (buffer && buffer_size >= data.size()) {
1740
+ std::memcpy(buffer, data.data(), data.size());
1741
+ }
1742
+ return wz_clear_last_error();
1743
+ }
1744
+
1745
+ wz_error_code wz_lua_get_string(wz_property lua_prop, const char** out_value) {
1746
+ if (auto ec = init_out("wz_lua_get_string", out_value); ec != WZ_ERROR_NONE) {
1747
+ return ec;
1748
+ }
1749
+ auto* p = unwrap_prop(lua_prop);
1750
+ if (!p) return set_error_null("wz_lua_get_string");
1751
+ if (p->PropertyType() != wz::WzPropertyType::Lua) {
1752
+ return set_error_wrong_type("wz_lua_get_string");
1753
+ }
1754
+ static thread_local std::string s;
1755
+ s = static_cast<wz::WzLuaProperty*>(p)->GetString();
1756
+ *out_value = s.c_str();
1757
+ return wz_clear_last_error();
1758
+ }
1759
+
1760
+ wz_error_code wz_binary_get_data(wz_property binary_prop,
1761
+ uint8_t* buffer,
1762
+ size_t buffer_size,
1763
+ size_t* out_size) {
1764
+ if (auto ec = init_out("wz_binary_get_data", out_size); ec != WZ_ERROR_NONE) {
1765
+ return ec;
1766
+ }
1767
+ auto* p = unwrap_prop(binary_prop);
1768
+ if (!p) return set_error_null("wz_binary_get_data");
1769
+ if (p->PropertyType() != wz::WzPropertyType::Sound) {
1770
+ return set_error_wrong_type("wz_binary_get_data");
1771
+ }
1772
+ auto result = static_cast<wz::WzBinaryProperty*>(p)->GetBytes(false);
1773
+ if (!result.has_value()) {
1774
+ return wz_set_last_error(static_cast<wz_error_code>(result.error().code()),
1775
+ result.error().message());
1776
+ }
1777
+ auto& data = result.value();
1778
+ *out_size = data.size();
1779
+ if (buffer && buffer_size >= data.size()) {
1780
+ std::memcpy(buffer, data.data(), data.size());
1781
+ }
1782
+ return wz_clear_last_error();
1783
+ }
1784
+
1785
+ wz_error_code wz_binary_get_wav_playback(wz_property binary_prop,
1786
+ uint8_t* buffer,
1787
+ size_t buffer_size,
1788
+ size_t* out_size) {
1789
+ if (auto ec = init_out("wz_binary_get_wav_playback", out_size);
1790
+ ec != WZ_ERROR_NONE) {
1791
+ return ec;
1792
+ }
1793
+ auto* p = unwrap_prop(binary_prop);
1794
+ if (!p) return set_error_null("wz_binary_get_wav_playback");
1795
+ if (p->PropertyType() != wz::WzPropertyType::Sound) {
1796
+ return set_error_wrong_type("wz_binary_get_wav_playback");
1797
+ }
1798
+ auto result =
1799
+ static_cast<wz::WzBinaryProperty*>(p)->GetBytesForWAVPlayback(false);
1800
+ if (!result.has_value()) {
1801
+ return wz_set_last_error(static_cast<wz_error_code>(result.error().code()),
1802
+ result.error().message());
1803
+ }
1804
+ auto& data = result.value();
1805
+ *out_size = data.size();
1806
+ if (buffer && buffer_size >= data.size()) {
1807
+ std::memcpy(buffer, data.data(), data.size());
1808
+ }
1809
+ return wz_clear_last_error();
1810
+ }
1811
+
1812
+ wz_error_code wz_binary_get_length(wz_property binary_prop, int* out_length) {
1813
+ if (auto ec = init_out("wz_binary_get_length", out_length);
1814
+ ec != WZ_ERROR_NONE) {
1815
+ return ec;
1816
+ }
1817
+ auto* p = unwrap_prop(binary_prop);
1818
+ if (!p) return set_error_null("wz_binary_get_length");
1819
+ if (p->PropertyType() != wz::WzPropertyType::Sound) {
1820
+ return set_error_wrong_type("wz_binary_get_length");
1821
+ }
1822
+ *out_length = static_cast<wz::WzBinaryProperty*>(p)->Length();
1823
+ return wz_clear_last_error();
1824
+ }
1825
+
1826
+ wz_error_code wz_binary_get_frequency(wz_property binary_prop,
1827
+ int* out_frequency) {
1828
+ if (auto ec = init_out("wz_binary_get_frequency", out_frequency);
1829
+ ec != WZ_ERROR_NONE) {
1830
+ return ec;
1831
+ }
1832
+ auto* p = unwrap_prop(binary_prop);
1833
+ if (!p) return set_error_null("wz_binary_get_frequency");
1834
+ if (p->PropertyType() != wz::WzPropertyType::Sound) {
1835
+ return set_error_wrong_type("wz_binary_get_frequency");
1836
+ }
1837
+ *out_frequency = static_cast<wz::WzBinaryProperty*>(p)->Frequency();
1838
+ return wz_clear_last_error();
1839
+ }
1840
+
1841
+ wz_error_code wz_binary_get_type(wz_property binary_prop,
1842
+ wz_binary_type* out_type) {
1843
+ if (auto ec = init_out("wz_binary_get_type", out_type); ec != WZ_ERROR_NONE) {
1844
+ return ec;
1845
+ }
1846
+ auto* p = unwrap_prop(binary_prop);
1847
+ if (!p) return set_error_null("wz_binary_get_type");
1848
+ if (p->PropertyType() != wz::WzPropertyType::Sound) {
1849
+ return set_error_wrong_type("wz_binary_get_type");
1850
+ }
1851
+ *out_type = static_cast<wz_binary_type>(
1852
+ static_cast<wz::WzBinaryProperty*>(p)->Type());
1853
+ return wz_clear_last_error();
1854
+ }
1855
+
1856
+ wz_error_code wz_binary_is_header_encrypted(wz_property binary_prop,
1857
+ int* out_is_encrypted) {
1858
+ if (auto ec = init_out("wz_binary_is_header_encrypted", out_is_encrypted);
1859
+ ec != WZ_ERROR_NONE) {
1860
+ return ec;
1861
+ }
1862
+ auto* p = unwrap_prop(binary_prop);
1863
+ if (!p) return set_error_null("wz_binary_is_header_encrypted");
1864
+ if (p->PropertyType() != wz::WzPropertyType::Sound) {
1865
+ return set_error_wrong_type("wz_binary_is_header_encrypted");
1866
+ }
1867
+ *out_is_encrypted =
1868
+ static_cast<wz::WzBinaryProperty*>(p)->HeaderEncrypted() ? 1 : 0;
1869
+ return wz_clear_last_error();
1870
+ }
1871
+
1872
+ wz_error_code wz_binary_save_to_file(wz_property binary_prop,
1873
+ const char* file_path) {
1874
+ auto* p = unwrap_prop(binary_prop);
1875
+ if (!p) return set_error_null("wz_binary_save_to_file");
1876
+ if (!file_path) {
1877
+ return set_error_invalid_arg("wz_binary_save_to_file", "file_path");
1878
+ }
1879
+ if (p->PropertyType() != wz::WzPropertyType::Sound) {
1880
+ return set_error_wrong_type("wz_binary_save_to_file");
1881
+ }
1882
+ return result_void(
1883
+ static_cast<wz::WzBinaryProperty*>(p)->SaveToFile(file_path));
1884
+ }
1885
+
1886
+ wz_error_code wz_rawdata_get_data(wz_property raw_prop,
1887
+ uint8_t* buffer,
1888
+ size_t buffer_size,
1889
+ size_t* out_size) {
1890
+ if (auto ec = init_out("wz_rawdata_get_data", out_size);
1891
+ ec != WZ_ERROR_NONE) {
1892
+ return ec;
1893
+ }
1894
+ auto* p = unwrap_prop(raw_prop);
1895
+ if (!p) return set_error_null("wz_rawdata_get_data");
1896
+ if (!p->IsRawDataProperty()) {
1897
+ return set_error_wrong_type("wz_rawdata_get_data");
1898
+ }
1899
+ auto result = static_cast<wz::WzRawDataProperty*>(p)->GetBytes(false);
1900
+ if (!result.has_value()) {
1901
+ return wz_set_last_error(static_cast<wz_error_code>(result.error().code()),
1902
+ result.error().message());
1903
+ }
1904
+ auto& data = result.value();
1905
+ *out_size = data.size();
1906
+ if (buffer && buffer_size >= data.size()) {
1907
+ std::memcpy(buffer, data.data(), data.size());
1908
+ }
1909
+ return wz_clear_last_error();
1910
+ }
1911
+
1912
+ wz_error_code wz_rawdata_get_type(wz_property raw_prop, int* out_type) {
1913
+ if (auto ec = init_out("wz_rawdata_get_type", out_type);
1914
+ ec != WZ_ERROR_NONE) {
1915
+ return ec;
1916
+ }
1917
+ auto* p = unwrap_prop(raw_prop);
1918
+ if (!p) return set_error_null("wz_rawdata_get_type");
1919
+ if (!p->IsRawDataProperty()) {
1920
+ return set_error_wrong_type("wz_rawdata_get_type");
1921
+ }
1922
+ *out_type = static_cast<int>(static_cast<wz::WzRawDataProperty*>(p)->Type());
1923
+ return wz_clear_last_error();
1924
+ }
1925
+
1926
+ wz_error_code wz_video_get_data(wz_property video_prop,
1927
+ uint8_t* buffer,
1928
+ size_t buffer_size,
1929
+ size_t* out_size) {
1930
+ if (auto ec = init_out("wz_video_get_data", out_size); ec != WZ_ERROR_NONE) {
1931
+ return ec;
1932
+ }
1933
+ auto* p = unwrap_prop(video_prop);
1934
+ if (!p) return set_error_null("wz_video_get_data");
1935
+ if (!p->IsVideoProperty()) {
1936
+ return set_error_wrong_type("wz_video_get_data");
1937
+ }
1938
+ auto result = static_cast<wz::WzVideoProperty*>(p)->GetBytes(false);
1939
+ if (!result.has_value()) {
1940
+ return wz_set_last_error(static_cast<wz_error_code>(result.error().code()),
1941
+ result.error().message());
1942
+ }
1943
+ auto& data = result.value();
1944
+ *out_size = data.size();
1945
+ if (buffer && buffer_size >= data.size()) {
1946
+ std::memcpy(buffer, data.data(), data.size());
1947
+ }
1948
+ return wz_clear_last_error();
1949
+ }
1950
+
1951
+ wz_error_code wz_get_error_description(wz_parse_status status,
1952
+ const char** out_description) {
1953
+ if (auto ec = init_out("wz_get_error_description", out_description);
1954
+ ec != WZ_ERROR_NONE) {
1955
+ return ec;
1956
+ }
1957
+ static thread_local std::string s;
1958
+ s = wz::GetErrorDescription(static_cast<wz::WzFileParseStatus>(status));
1959
+ *out_description = s.c_str();
1960
+ return wz_clear_last_error();
1961
+ }
1962
+
1963
+ wz_error_code wz_detect_maple_version(const char* file_path,
1964
+ wz_maple_version* out_maple_version,
1965
+ int16_t* out_version) {
1966
+ if (auto ec = init_out("wz_detect_maple_version", out_maple_version);
1967
+ ec != WZ_ERROR_NONE) {
1968
+ return ec;
1969
+ }
1970
+ if (auto ec = init_out("wz_detect_maple_version", out_version);
1971
+ ec != WZ_ERROR_NONE) {
1972
+ return ec;
1973
+ }
1974
+ if (!file_path) {
1975
+ return set_error_invalid_arg("wz_detect_maple_version", "file_path");
1976
+ }
1977
+ int16_t ver = 0;
1978
+ auto mv = wz::WzTool::DetectMapleVersion(file_path, &ver);
1979
+ *out_maple_version = static_cast<wz_maple_version>(mv);
1980
+ *out_version = ver;
1981
+ return wz_clear_last_error();
1982
+ }
1983
+
1984
+ wz_error_code wz_get_iv_for_version(wz_maple_version ver,
1985
+ const uint8_t** out_iv) {
1986
+ if (auto ec = init_out("wz_get_iv_for_version", out_iv);
1987
+ ec != WZ_ERROR_NONE) {
1988
+ return ec;
1989
+ }
1990
+ static thread_local std::array<uint8_t, 4> iv;
1991
+ iv = wz::WzTool::GetIvByMapleVersion(static_cast<wz::WzMapleVersion>(ver));
1992
+ *out_iv = iv.data();
1993
+ return wz_clear_last_error();
1994
+ }
1995
+
1996
+ } // extern "C"