objutils 0.10.15__tar.gz → 0.10.17__tar.gz

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 (279) hide show
  1. {objutils-0.10.15 → objutils-0.10.17}/.pre-commit-config.yaml +1 -1
  2. {objutils-0.10.15 → objutils-0.10.17}/PKG-INFO +1 -1
  3. {objutils-0.10.15 → objutils-0.10.17}/docs/howto.rst +76 -0
  4. {objutils-0.10.15 → objutils-0.10.17}/docs/session.rst +68 -0
  5. {objutils-0.10.15 → objutils-0.10.17}/docs/tutorial.rst +100 -8
  6. {objutils-0.10.15 → objutils-0.10.17}/objutils/__init__.py +1 -1
  7. {objutils-0.10.15 → objutils-0.10.17}/objutils/dwarf/__init__.py +0 -1
  8. {objutils-0.10.15 → objutils-0.10.17}/objutils/dwarf/encoding.py +0 -2
  9. {objutils-0.10.15 → objutils-0.10.17}/objutils/dwarf/readers.py +0 -1
  10. {objutils-0.10.15 → objutils-0.10.17}/objutils/elf/model.py +0 -2
  11. {objutils-0.10.15 → objutils-0.10.17}/objutils/hexfile.py +0 -6
  12. {objutils-0.10.15 → objutils-0.10.17}/objutils/image.py +75 -18
  13. {objutils-0.10.15 → objutils-0.10.17}/objutils/registry.py +0 -2
  14. {objutils-0.10.15 → objutils-0.10.17}/objutils/section.py +306 -35
  15. objutils-0.10.17/objutils/tests/test_asam_alternate_modes.py +711 -0
  16. objutils-0.10.17/objutils/tests/test_extended.py +56 -0
  17. objutils-0.10.17/objutils/tests/test_pdb_typeinfo_dump.py +126 -0
  18. objutils-0.10.17/objutils/tests/test_probe_uniqueness.py +71 -0
  19. {objutils-0.10.15 → objutils-0.10.17}/objutils/tests/test_section.py +54 -0
  20. {objutils-0.10.15 → objutils-0.10.17}/objutils/version.py +1 -1
  21. {objutils-0.10.15 → objutils-0.10.17}/poetry.lock +124 -129
  22. {objutils-0.10.15 → objutils-0.10.17}/pyproject.toml +2 -2
  23. {objutils-0.10.15 → objutils-0.10.17}/.clang-format +0 -0
  24. {objutils-0.10.15 → objutils-0.10.17}/.codacy.yml +0 -0
  25. {objutils-0.10.15 → objutils-0.10.17}/.codeclimate.yml +0 -0
  26. {objutils-0.10.15 → objutils-0.10.17}/.coveralls.yml +0 -0
  27. {objutils-0.10.15 → objutils-0.10.17}/.github/FUNDING.yml +0 -0
  28. {objutils-0.10.15 → objutils-0.10.17}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  29. {objutils-0.10.15 → objutils-0.10.17}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  30. {objutils-0.10.15 → objutils-0.10.17}/.github/ISSUE_TEMPLATE/documentation.yml +0 -0
  31. {objutils-0.10.15 → objutils-0.10.17}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  32. {objutils-0.10.15 → objutils-0.10.17}/.github/ISSUE_TEMPLATE.md +0 -0
  33. {objutils-0.10.15 → objutils-0.10.17}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  34. {objutils-0.10.15 → objutils-0.10.17}/.github/copilot-instructions.md +0 -0
  35. {objutils-0.10.15 → objutils-0.10.17}/.github/workflows/pythonapp.yml +0 -0
  36. {objutils-0.10.15 → objutils-0.10.17}/.gitignore +0 -0
  37. {objutils-0.10.15 → objutils-0.10.17}/.idea/.gitignore +0 -0
  38. {objutils-0.10.15 → objutils-0.10.17}/.idea/copilot.data.migration.ask2agent.xml +0 -0
  39. {objutils-0.10.15 → objutils-0.10.17}/.idea/deployment.xml +0 -0
  40. {objutils-0.10.15 → objutils-0.10.17}/.idea/inspectionProfiles/profiles_settings.xml +0 -0
  41. {objutils-0.10.15 → objutils-0.10.17}/.idea/misc.xml +0 -0
  42. {objutils-0.10.15 → objutils-0.10.17}/.idea/modules.xml +0 -0
  43. {objutils-0.10.15 → objutils-0.10.17}/.idea/pyLspTools.xml +0 -0
  44. {objutils-0.10.15 → objutils-0.10.17}/.idea/pyProjectModel.xml +0 -0
  45. {objutils-0.10.15 → objutils-0.10.17}/.idea/vcs.xml +0 -0
  46. {objutils-0.10.15 → objutils-0.10.17}/.pylintrc +0 -0
  47. {objutils-0.10.15 → objutils-0.10.17}/.readthedocs.yml +0 -0
  48. {objutils-0.10.15 → objutils-0.10.17}/.travis.yml +0 -0
  49. {objutils-0.10.15 → objutils-0.10.17}/CMakeLists.txt +0 -0
  50. {objutils-0.10.15 → objutils-0.10.17}/CODE_OF_CONDUCT.md +0 -0
  51. {objutils-0.10.15 → objutils-0.10.17}/CONTRIBUTORS +0 -0
  52. {objutils-0.10.15 → objutils-0.10.17}/LICENSE +0 -0
  53. {objutils-0.10.15 → objutils-0.10.17}/MANIFEST.in +0 -0
  54. {objutils-0.10.15 → objutils-0.10.17}/PULL_REQUEST_TEMPLATE.md +0 -0
  55. {objutils-0.10.15 → objutils-0.10.17}/appveyor.yml +0 -0
  56. {objutils-0.10.15 → objutils-0.10.17}/bandit.yml +0 -0
  57. {objutils-0.10.15 → objutils-0.10.17}/docs/Data_Formats.pdf +0 -0
  58. {objutils-0.10.15 → objutils-0.10.17}/docs/ELF_Format.pdf +0 -0
  59. {objutils-0.10.15 → objutils-0.10.17}/docs/KNOWN_GOOD_DWARF_REFERENCE.md +0 -0
  60. {objutils-0.10.15 → objutils-0.10.17}/docs/README.rst +0 -0
  61. {objutils-0.10.15 → objutils-0.10.17}/docs/apidoc.sh +0 -0
  62. {objutils-0.10.15 → objutils-0.10.17}/docs/conf.py +0 -0
  63. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/.buildinfo +0 -0
  64. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/.buildinfo.bak +0 -0
  65. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/.doctrees/README.doctree +0 -0
  66. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/.doctrees/environment.pickle +0 -0
  67. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/.doctrees/howto.doctree +0 -0
  68. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/.doctrees/index.doctree +0 -0
  69. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/.doctrees/installation.doctree +0 -0
  70. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/.doctrees/modules.doctree +0 -0
  71. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/.doctrees/objutils.doctree +0 -0
  72. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/.doctrees/objutils.elf.doctree +0 -0
  73. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/.doctrees/scripts.doctree +0 -0
  74. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/.doctrees/session.doctree +0 -0
  75. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/.doctrees/tutorial.doctree +0 -0
  76. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/README.html +0 -0
  77. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_images/objutils_basic.png +0 -0
  78. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_modules/index.html +0 -0
  79. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_modules/objutils/ash.html +0 -0
  80. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_modules/objutils/binfile.html +0 -0
  81. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_modules/objutils/checksums.html +0 -0
  82. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_modules/objutils/cosmac.html +0 -0
  83. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_modules/objutils/elf/defs.html +0 -0
  84. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_modules/objutils/elf.html +0 -0
  85. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_modules/objutils/emon52.html +0 -0
  86. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_modules/objutils/etek.html +0 -0
  87. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_modules/objutils/exceptions.html +0 -0
  88. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_modules/objutils/fpc.html +0 -0
  89. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_modules/objutils/hexdump.html +0 -0
  90. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_modules/objutils/hexfile.html +0 -0
  91. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_modules/objutils/ihex.html +0 -0
  92. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_modules/objutils/image.html +0 -0
  93. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_modules/objutils/logger.html +0 -0
  94. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_modules/objutils/mostec.html +0 -0
  95. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_modules/objutils/pickleif.html +0 -0
  96. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_modules/objutils/rca.html +0 -0
  97. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_modules/objutils/readers.html +0 -0
  98. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_modules/objutils/registry.html +0 -0
  99. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_modules/objutils/section.html +0 -0
  100. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_modules/objutils/sig.html +0 -0
  101. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_modules/objutils/srec.html +0 -0
  102. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_modules/objutils/tek.html +0 -0
  103. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_modules/objutils/titxt.html +0 -0
  104. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_modules/objutils/utils.html +0 -0
  105. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_modules/objutils.html +0 -0
  106. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_sources/README.rst.txt +0 -0
  107. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_sources/howto.rst.txt +0 -0
  108. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_sources/index.rst.txt +0 -0
  109. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_sources/installation.rst.txt +0 -0
  110. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_sources/modules.rst.txt +0 -0
  111. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_sources/objutils.elf.rst.txt +0 -0
  112. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_sources/objutils.rst.txt +0 -0
  113. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_sources/scripts.rst.txt +0 -0
  114. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_sources/session.rst.txt +0 -0
  115. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_sources/tutorial.rst.txt +0 -0
  116. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_static/alabaster.css +0 -0
  117. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_static/basic.css +0 -0
  118. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_static/check-solid.svg +0 -0
  119. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_static/clipboard.min.js +0 -0
  120. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_static/copy-button.svg +0 -0
  121. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_static/copybutton.css +0 -0
  122. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_static/copybutton.js +0 -0
  123. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_static/copybutton_funcs.js +0 -0
  124. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_static/custom.css +0 -0
  125. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_static/doctools.js +0 -0
  126. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_static/documentation_options.js +0 -0
  127. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_static/file.png +0 -0
  128. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_static/github-banner.svg +0 -0
  129. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_static/language_data.js +0 -0
  130. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_static/minus.png +0 -0
  131. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_static/plus.png +0 -0
  132. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_static/pygments.css +0 -0
  133. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_static/scripts/bootstrap.js +0 -0
  134. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_static/scripts/bootstrap.js.LICENSE.txt +0 -0
  135. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_static/scripts/fontawesome.js +0 -0
  136. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_static/scripts/fontawesome.js.LICENSE.txt +0 -0
  137. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_static/scripts/pydata-sphinx-theme.js +0 -0
  138. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_static/searchtools.js +0 -0
  139. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_static/sphinx_highlight.js +0 -0
  140. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_static/styles/pydata-sphinx-theme.css +0 -0
  141. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_static/styles/theme.css +0 -0
  142. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_static/vendor/fontawesome/webfonts/fa-brands-400.ttf +0 -0
  143. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_static/vendor/fontawesome/webfonts/fa-brands-400.woff2 +0 -0
  144. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_static/vendor/fontawesome/webfonts/fa-regular-400.ttf +0 -0
  145. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_static/vendor/fontawesome/webfonts/fa-regular-400.woff2 +0 -0
  146. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_static/vendor/fontawesome/webfonts/fa-solid-900.ttf +0 -0
  147. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_static/vendor/fontawesome/webfonts/fa-solid-900.woff2 +0 -0
  148. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/_static/webpack-macros.html +0 -0
  149. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/genindex.html +0 -0
  150. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/howto.html +0 -0
  151. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/index.html +0 -0
  152. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/installation.html +0 -0
  153. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/modules.html +0 -0
  154. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/objects.inv +0 -0
  155. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/objutils.elf.html +0 -0
  156. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/objutils.html +0 -0
  157. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/py-modindex.html +0 -0
  158. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/scripts.html +0 -0
  159. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/search.html +0 -0
  160. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/searchindex.js +0 -0
  161. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/session.html +0 -0
  162. {objutils-0.10.15 → objutils-0.10.17}/docs/docs/_build/html/tutorial.html +0 -0
  163. {objutils-0.10.15 → objutils-0.10.17}/docs/elf-64-gen.pdf +0 -0
  164. {objutils-0.10.15 → objutils-0.10.17}/docs/example0.srec +0 -0
  165. {objutils-0.10.15 → objutils-0.10.17}/docs/index.rst +0 -0
  166. {objutils-0.10.15 → objutils-0.10.17}/docs/installation.rst +0 -0
  167. {objutils-0.10.15 → objutils-0.10.17}/docs/make.bat +0 -0
  168. {objutils-0.10.15 → objutils-0.10.17}/docs/modules.rst +0 -0
  169. {objutils-0.10.15 → objutils-0.10.17}/docs/objutils.elf.rst +0 -0
  170. {objutils-0.10.15 → objutils-0.10.17}/docs/objutils.rst +0 -0
  171. {objutils-0.10.15 → objutils-0.10.17}/docs/objutils_banner.png +0 -0
  172. {objutils-0.10.15 → objutils-0.10.17}/docs/objutils_basic.png +0 -0
  173. {objutils-0.10.15 → objutils-0.10.17}/docs/objutils_dark.jpg +0 -0
  174. {objutils-0.10.15 → objutils-0.10.17}/docs/objutils_social.jpg +0 -0
  175. {objutils-0.10.15 → objutils-0.10.17}/docs/requirements.txt +0 -0
  176. {objutils-0.10.15 → objutils-0.10.17}/docs/scripts.rst +0 -0
  177. {objutils-0.10.15 → objutils-0.10.17}/docs/tutorial1.ipynb +0 -0
  178. {objutils-0.10.15 → objutils-0.10.17}/objutils/.coveragerc +0 -0
  179. {objutils-0.10.15 → objutils-0.10.17}/objutils/.vscode/launch.json +0 -0
  180. {objutils-0.10.15 → objutils-0.10.17}/objutils/.vscode/settings.json +0 -0
  181. {objutils-0.10.15 → objutils-0.10.17}/objutils/a2l_test.shf +0 -0
  182. {objutils-0.10.15 → objutils-0.10.17}/objutils/ash.py +0 -0
  183. {objutils-0.10.15 → objutils-0.10.17}/objutils/binfile.py +0 -0
  184. {objutils-0.10.15 → objutils-0.10.17}/objutils/checksums.py +0 -0
  185. {objutils-0.10.15 → objutils-0.10.17}/objutils/cosmac.py +0 -0
  186. {objutils-0.10.15 → objutils-0.10.17}/objutils/dwarf/attrparser.py +0 -0
  187. {objutils-0.10.15 → objutils-0.10.17}/objutils/dwarf/c_generator.py +0 -0
  188. {objutils-0.10.15 → objutils-0.10.17}/objutils/dwarf/constants.py +0 -0
  189. {objutils-0.10.15 → objutils-0.10.17}/objutils/dwarf/lineprog.py +0 -0
  190. {objutils-0.10.15 → objutils-0.10.17}/objutils/dwarf/sm.py +0 -0
  191. {objutils-0.10.15 → objutils-0.10.17}/objutils/dwarf/traverser.py +0 -0
  192. {objutils-0.10.15 → objutils-0.10.17}/objutils/elf/__init__.py +0 -0
  193. {objutils-0.10.15 → objutils-0.10.17}/objutils/elf/arm/__init__.py +0 -0
  194. {objutils-0.10.15 → objutils-0.10.17}/objutils/elf/arm/attributes.py +0 -0
  195. {objutils-0.10.15 → objutils-0.10.17}/objutils/elf/defs.py +0 -0
  196. {objutils-0.10.15 → objutils-0.10.17}/objutils/emon52.py +0 -0
  197. {objutils-0.10.15 → objutils-0.10.17}/objutils/etek.py +0 -0
  198. {objutils-0.10.15 → objutils-0.10.17}/objutils/exceptions.py +0 -0
  199. {objutils-0.10.15 → objutils-0.10.17}/objutils/extensions/__init__.py +0 -0
  200. {objutils-0.10.15 → objutils-0.10.17}/objutils/extensions/ctre.hpp +0 -0
  201. {objutils-0.10.15 → objutils-0.10.17}/objutils/extensions/difflib.h +0 -0
  202. {objutils-0.10.15 → objutils-0.10.17}/objutils/extensions/elf_parser.cpp +0 -0
  203. {objutils-0.10.15 → objutils-0.10.17}/objutils/extensions/elf_parser.hpp +0 -0
  204. {objutils-0.10.15 → objutils-0.10.17}/objutils/extensions/exceptions.cpp +0 -0
  205. {objutils-0.10.15 → objutils-0.10.17}/objutils/extensions/exceptions.hpp +0 -0
  206. {objutils-0.10.15 → objutils-0.10.17}/objutils/extensions/hexfile.cpp +0 -0
  207. {objutils-0.10.15 → objutils-0.10.17}/objutils/extensions/wrapper.cpp +0 -0
  208. {objutils-0.10.15 → objutils-0.10.17}/objutils/fpc.py +0 -0
  209. {objutils-0.10.15 → objutils-0.10.17}/objutils/hexdump.py +0 -0
  210. {objutils-0.10.15 → objutils-0.10.17}/objutils/ieee695.py +0 -0
  211. {objutils-0.10.15 → objutils-0.10.17}/objutils/ihex.py +0 -0
  212. {objutils-0.10.15 → objutils-0.10.17}/objutils/logger.py +0 -0
  213. {objutils-0.10.15 → objutils-0.10.17}/objutils/mostec.py +0 -0
  214. {objutils-0.10.15 → objutils-0.10.17}/objutils/objutils.code-workspace +0 -0
  215. {objutils-0.10.15 → objutils-0.10.17}/objutils/oocdtxt.py +0 -0
  216. {objutils-0.10.15 → objutils-0.10.17}/objutils/pecoff/__init__.py +0 -0
  217. {objutils-0.10.15 → objutils-0.10.17}/objutils/pecoff/defs.py +0 -0
  218. {objutils-0.10.15 → objutils-0.10.17}/objutils/pecoff/model.py +0 -0
  219. {objutils-0.10.15 → objutils-0.10.17}/objutils/pecoff/pdb/__init__.py +0 -0
  220. {objutils-0.10.15 → objutils-0.10.17}/objutils/pickleif.py +0 -0
  221. {objutils-0.10.15 → objutils-0.10.17}/objutils/rca.py +0 -0
  222. {objutils-0.10.15 → objutils-0.10.17}/objutils/readers.py +0 -0
  223. {objutils-0.10.15 → objutils-0.10.17}/objutils/scripts/arduino_build_artifacts.py +0 -0
  224. {objutils-0.10.15 → objutils-0.10.17}/objutils/scripts/oj_cgen.py +0 -0
  225. {objutils-0.10.15 → objutils-0.10.17}/objutils/scripts/oj_coff_extract.py +0 -0
  226. {objutils-0.10.15 → objutils-0.10.17}/objutils/scripts/oj_coff_import.py +0 -0
  227. {objutils-0.10.15 → objutils-0.10.17}/objutils/scripts/oj_coff_info.py +0 -0
  228. {objutils-0.10.15 → objutils-0.10.17}/objutils/scripts/oj_coff_syms.py +0 -0
  229. {objutils-0.10.15 → objutils-0.10.17}/objutils/scripts/oj_dwarf_import.py +0 -0
  230. {objutils-0.10.15 → objutils-0.10.17}/objutils/scripts/oj_dwarf_info.py +0 -0
  231. {objutils-0.10.15 → objutils-0.10.17}/objutils/scripts/oj_elf_arm_attrs.py +0 -0
  232. {objutils-0.10.15 → objutils-0.10.17}/objutils/scripts/oj_elf_extract.py +0 -0
  233. {objutils-0.10.15 → objutils-0.10.17}/objutils/scripts/oj_elf_import.py +0 -0
  234. {objutils-0.10.15 → objutils-0.10.17}/objutils/scripts/oj_elf_info.py +0 -0
  235. {objutils-0.10.15 → objutils-0.10.17}/objutils/scripts/oj_elf_syms.py +0 -0
  236. {objutils-0.10.15 → objutils-0.10.17}/objutils/scripts/oj_hex_info.py +0 -0
  237. {objutils-0.10.15 → objutils-0.10.17}/objutils/scripts/oj_hex_merge.py +0 -0
  238. {objutils-0.10.15 → objutils-0.10.17}/objutils/scripts/oj_hex_split.py +0 -0
  239. {objutils-0.10.15 → objutils-0.10.17}/objutils/shf.py +0 -0
  240. {objutils-0.10.15 → objutils-0.10.17}/objutils/sig.py +0 -0
  241. {objutils-0.10.15 → objutils-0.10.17}/objutils/srec.py +0 -0
  242. {objutils-0.10.15 → objutils-0.10.17}/objutils/symbols.py +0 -0
  243. {objutils-0.10.15 → objutils-0.10.17}/objutils/tek.py +0 -0
  244. {objutils-0.10.15 → objutils-0.10.17}/objutils/tests/__init__.py +0 -0
  245. {objutils-0.10.15 → objutils-0.10.17}/objutils/tests/test_arm_attributes.py +0 -0
  246. {objutils-0.10.15 → objutils-0.10.17}/objutils/tests/test_ash.py +0 -0
  247. {objutils-0.10.15 → objutils-0.10.17}/objutils/tests/test_c_generator.py +0 -0
  248. {objutils-0.10.15 → objutils-0.10.17}/objutils/tests/test_checksums.py +0 -0
  249. {objutils-0.10.15 → objutils-0.10.17}/objutils/tests/test_cygpath.py +0 -0
  250. {objutils-0.10.15 → objutils-0.10.17}/objutils/tests/test_diff_bin.py +0 -0
  251. {objutils-0.10.15 → objutils-0.10.17}/objutils/tests/test_elf.py +0 -0
  252. {objutils-0.10.15 → objutils-0.10.17}/objutils/tests/test_emon52.py +0 -0
  253. {objutils-0.10.15 → objutils-0.10.17}/objutils/tests/test_etek.py +0 -0
  254. {objutils-0.10.15 → objutils-0.10.17}/objutils/tests/test_examples_cgen.py +0 -0
  255. {objutils-0.10.15 → objutils-0.10.17}/objutils/tests/test_fpc.py +0 -0
  256. {objutils-0.10.15 → objutils-0.10.17}/objutils/tests/test_hexdump.py +0 -0
  257. {objutils-0.10.15 → objutils-0.10.17}/objutils/tests/test_hexfile.py +0 -0
  258. {objutils-0.10.15 → objutils-0.10.17}/objutils/tests/test_ihex.py +0 -0
  259. {objutils-0.10.15 → objutils-0.10.17}/objutils/tests/test_image.py +0 -0
  260. {objutils-0.10.15 → objutils-0.10.17}/objutils/tests/test_mostec.py +0 -0
  261. {objutils-0.10.15 → objutils-0.10.17}/objutils/tests/test_oocdtxt.py +0 -0
  262. {objutils-0.10.15 → objutils-0.10.17}/objutils/tests/test_readers.py +0 -0
  263. {objutils-0.10.15 → objutils-0.10.17}/objutils/tests/test_registry.py +0 -0
  264. {objutils-0.10.15 → objutils-0.10.17}/objutils/tests/test_repr.py +0 -0
  265. {objutils-0.10.15 → objutils-0.10.17}/objutils/tests/test_section_join.py +0 -0
  266. {objutils-0.10.15 → objutils-0.10.17}/objutils/tests/test_shf.py +0 -0
  267. {objutils-0.10.15 → objutils-0.10.17}/objutils/tests/test_sm.py +0 -0
  268. {objutils-0.10.15 → objutils-0.10.17}/objutils/tests/test_srec.py +0 -0
  269. {objutils-0.10.15 → objutils-0.10.17}/objutils/tests/test_tek.py +0 -0
  270. {objutils-0.10.15 → objutils-0.10.17}/objutils/tests/test_titext.py +0 -0
  271. {objutils-0.10.15 → objutils-0.10.17}/objutils/titxt.py +0 -0
  272. {objutils-0.10.15 → objutils-0.10.17}/objutils/utils/__init__.py +0 -0
  273. {objutils-0.10.15 → objutils-0.10.17}/objutils/utils/arduino.py +0 -0
  274. {objutils-0.10.15 → objutils-0.10.17}/objutils/utils/diff.py +0 -0
  275. {objutils-0.10.15 → objutils-0.10.17}/requirements.txt +0 -0
  276. {objutils-0.10.15 → objutils-0.10.17}/setup.cfg +0 -0
  277. {objutils-0.10.15 → objutils-0.10.17}/setup.py +0 -0
  278. {objutils-0.10.15 → objutils-0.10.17}/test_join_sections.py +0 -0
  279. {objutils-0.10.15 → objutils-0.10.17}/test_requirements.txt +0 -0
@@ -42,7 +42,7 @@ repos:
42
42
  args: ["--line-length=132"]
43
43
 
44
44
  - repo: https://github.com/astral-sh/ruff-pre-commit
45
- rev: v0.16.0
45
+ rev: v0.16.1
46
46
  hooks:
47
47
  - id: ruff
48
48
  args: ["--fix", "--exit-non-zero-on-fix"]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: objutils
3
- Version: 0.10.15
3
+ Version: 0.10.17
4
4
  Summary: Objectfile library for Python
5
5
  Keywords: hex files,intel hex,s19,srec,srecords,object files,map files,embedded,microcontroller,ECU,shf,rfc4194
6
6
  Author-Email: Christoph Schueler <cpu12.gems@googlemail.com>
@@ -75,6 +75,82 @@ Read/write ASAM values (incl. word-swap byte orders)
75
75
  img.write_asam_string(0x3010, "MOTOR", "ASCII")
76
76
  name = img.read_asam_string(0x3010, "ASCII")
77
77
 
78
+ Read/write ASAM strings with encoding override
79
+ ----------------------------------------------
80
+
81
+ Some ECUs store Latin-1 (or other non-UTF-8) characters in a field that is
82
+ declared ``ASCII`` in the A2L description. Use the ``encoding`` keyword to
83
+ override the codec without changing the ASAM dtype name:
84
+
85
+ .. code-block:: python
86
+
87
+ from objutils import Image, Section
88
+
89
+ img = Image([Section(0x4000, bytes(64))])
90
+
91
+ # The string contains "Ü" (0xDC in Latin-1) – would fail with plain ASCII
92
+ img.write_asam_string(0x4000, "MOTOR_ÜBERDREHZAHL", "ASCII", encoding="latin-1")
93
+ name = img.read_asam_string(0x4000, "ASCII", encoding="latin-1")
94
+ # name == 'MOTOR_ÜBERDREHZAHL'
95
+
96
+ The ``encoding`` parameter is accepted by both ``read_asam_string`` and
97
+ ``write_asam_string`` on ``Section`` as well as ``Image``.
98
+
99
+ Read/write ASAM characteristic maps with ALTERNATE_WITH_X
100
+ ---------------------------------------------------------
101
+
102
+ ``ALTERNATE_WITH_X`` stores each X-column preceded by its X-axis coordinate:
103
+ ``[x[0], f(0,0), f(0,1), …, x[1], f(1,0), f(1,1), …]``.
104
+
105
+ .. code-block:: python
106
+
107
+ import numpy as np
108
+ from objutils import Image, Section
109
+
110
+ # ASAM shape (X=3, Y=4) → numpy shape (4, 3)
111
+ matrix = np.array(
112
+ [[11, 21, 31],
113
+ [12, 22, 32],
114
+ [13, 23, 33],
115
+ [14, 24, 34]],
116
+ dtype=np.uint8,
117
+ )
118
+ x_axis = np.array([10, 20, 30], dtype=np.uint8)
119
+
120
+ total = 3 * (1 + 4) # num_x * (axis_byte + num_y * element_byte)
121
+ img = Image([Section(0x8000, bytes(total + 8))])
122
+
123
+ img.write_asam_ndarray(0x8000, matrix, "UBYTE", "MSB_LAST",
124
+ index_mode="ALTERNATE_WITH_X", x_axis=x_axis)
125
+
126
+ result = img.read_asam_ndarray(0x8000, 0, "UBYTE",
127
+ shape=(3, 4), byte_order="MSB_LAST",
128
+ index_mode="ALTERNATE_WITH_X")
129
+ # result.values → matrix
130
+ # result.axis → x_axis
131
+
132
+ Read/write ASAM characteristic maps with ALTERNATE_WITH_Y
133
+ ---------------------------------------------------------
134
+
135
+ ``ALTERNATE_WITH_Y`` stores each Y-row preceded by its Y-axis coordinate:
136
+ ``[y[0], f(0,0), f(1,0), …, y[1], f(0,1), f(1,1), …]``.
137
+
138
+ .. code-block:: python
139
+
140
+ y_axis = np.array([1, 2, 3, 4], dtype=np.uint8)
141
+
142
+ total_y = 4 * (1 + 3) # num_y * (axis_byte + num_x * element_byte)
143
+ img2 = Image([Section(0x9000, bytes(total_y + 8))])
144
+
145
+ img2.write_asam_ndarray(0x9000, matrix, "UBYTE", "MSB_LAST",
146
+ index_mode="ALTERNATE_WITH_Y", y_axis=y_axis)
147
+
148
+ result2 = img2.read_asam_ndarray(0x9000, 0, "UBYTE",
149
+ shape=(3, 4), byte_order="MSB_LAST",
150
+ index_mode="ALTERNATE_WITH_Y")
151
+ # result2.values → matrix
152
+ # result2.axis → y_axis
153
+
78
154
  Extract loadable image from ELF
79
155
  -------------------------------
80
156
 
@@ -163,6 +163,15 @@ ASAM strings
163
163
  >>> img.read_asam_string(0x3020, "UTF8")
164
164
  'Drehzahl'
165
165
 
166
+ When an ECU stores non-ASCII characters in a nominally ASCII field, override
167
+ the codec with an explicit ``encoding`` keyword argument:
168
+
169
+ .. code-block:: python
170
+
171
+ >>> img.write_asam_string(0x3030, "MOTOR_ÜBERDREHZAHL", "ASCII", encoding="latin-1")
172
+ >>> img.read_asam_string(0x3030, "ASCII", encoding="latin-1")
173
+ 'MOTOR_ÜBERDREHZAHL'
174
+
166
175
  ASAM numeric arrays
167
176
  -------------------
168
177
 
@@ -202,6 +211,65 @@ ASAM ndarrays (NumPy)
202
211
  >>> np.array_equal(matrix_rt, matrix)
203
212
  True
204
213
 
214
+ ASAM ndarrays — ALTERNATE_WITH_X / ALTERNATE_WITH_Y
215
+ ----------------------------------------------------
216
+
217
+ For characteristic maps (2-D) the ``ALTERNATE_WITH_X`` and ``ALTERNATE_WITH_Y``
218
+ index modes interleave axis coordinate values with the function values in memory.
219
+
220
+ **ALTERNATE_WITH_X** — each X-column is preceded by its X-axis coordinate:
221
+
222
+ .. code-block:: python
223
+
224
+ >>> import numpy as np
225
+ >>> from objutils import Image, Section
226
+
227
+ >>> # Value matrix numpy shape (Y=2, X=3); ASAM shape (X=3, Y=2)
228
+ >>> vals = np.array([[11, 21, 31], [12, 22, 32]], dtype=np.uint8)
229
+ >>> x_ax = np.array([10, 20, 30], dtype=np.uint8)
230
+
231
+ >>> total = 3 * (1 + 2) # num_x * (axis_byte + num_y)
232
+ >>> img = Image([Section(0xA000, bytes(total + 8))])
233
+ >>> img.write_asam_ndarray(0xA000, vals, "UBYTE", "MSB_LAST",
234
+ ... index_mode="ALTERNATE_WITH_X", x_axis=x_ax)
235
+
236
+ >>> # Raw memory: [10, 11, 12, 20, 21, 22, 30, 31, 32]
237
+ >>> list(img.read(0xA000, total))
238
+ [10, 11, 12, 20, 21, 22, 30, 31, 32]
239
+
240
+ >>> result = img.read_asam_ndarray(0xA000, 0, "UBYTE",
241
+ ... shape=(3, 2), byte_order="MSB_LAST",
242
+ ... index_mode="ALTERNATE_WITH_X")
243
+ >>> np.array_equal(result.values, vals)
244
+ True
245
+ >>> np.array_equal(result.axis, x_ax)
246
+ True
247
+
248
+ **ALTERNATE_WITH_Y** — each Y-row is preceded by its Y-axis coordinate:
249
+
250
+ .. code-block:: python
251
+
252
+ >>> y_ax = np.array([100, 200], dtype=np.uint8)
253
+
254
+ >>> total_y = 2 * (1 + 3) # num_y * (axis_byte + num_x)
255
+ >>> img2 = Image([Section(0xB000, bytes(total_y + 8))])
256
+ >>> img2.write_asam_ndarray(0xB000, vals, "UBYTE", "MSB_LAST",
257
+ ... index_mode="ALTERNATE_WITH_Y", y_axis=y_ax)
258
+
259
+ >>> # Raw memory: [100, 11, 21, 31, 200, 12, 22, 32]
260
+ >>> list(img2.read(0xB000, total_y))
261
+ [100, 11, 21, 31, 200, 12, 22, 32]
262
+
263
+ >>> result2 = img2.read_asam_ndarray(0xB000, 0, "UBYTE",
264
+ ... shape=(3, 2), byte_order="MSB_LAST",
265
+ ... index_mode="ALTERNATE_WITH_Y")
266
+ >>> np.array_equal(result2.values, vals)
267
+ True
268
+
269
+ ``read_asam_ndarray`` returns an ``AlternateArrayResult`` named tuple for
270
+ these modes. Access the parts via ``result.values`` / ``result.axis``, or
271
+ unpack: ``values, axis = result``.
272
+
205
273
  What next?
206
274
  ----------
207
275
 
@@ -178,13 +178,35 @@ side by side in one small image.
178
178
  - ``UTF16``
179
179
  - ``UTF32``
180
180
 
181
+ .. rubric:: Encoding override for ASAM strings
182
+
183
+ When an ECU stores text that cannot be decoded with the default ASAM mapping
184
+ (for example Latin-1 characters in a nominally ASCII field), pass an explicit
185
+ ``encoding`` keyword argument to override:
186
+
187
+ .. code-block:: python
188
+
189
+ from objutils import Image, Section
190
+
191
+ img = Image([Section(0x4000, bytes(64))])
192
+
193
+ # Write a string that contains a non-ASCII character (Ü = 0xDC in Latin-1)
194
+ img.write_asam_string(0x4000, "MOTOR_ÜBERDREHZAHL", "ASCII", encoding="latin-1")
195
+
196
+ # Read it back with the same override
197
+ text = img.read_asam_string(0x4000, "ASCII", encoding="latin-1")
198
+ # text == 'MOTOR_ÜBERDREHZAHL'
199
+
200
+ Without ``encoding=...`` the codec is derived from *dtype* as usual
201
+ (``ASCII`` → ``"ascii"``, ``UTF8`` → ``"utf-8"``, …).
202
+
181
203
  .. rubric:: ASAM Array Cheat Sheet
182
204
 
183
205
  Quick reference for the ASAM array helpers on ``Image`` and ``Section``.
184
206
 
185
207
  .. list-table::
186
208
  :header-rows: 1
187
- :widths: 30 18 22 20
209
+ :widths: 30 18 28 20
188
210
 
189
211
  * - Method
190
212
  - ``length`` semantics
@@ -198,10 +220,14 @@ Quick reference for the ASAM array helpers on ``Image`` and ``Section``.
198
220
  - n/a (from ``len(data)``)
199
221
  - ``None``
200
222
  - scalar lists/tuples
201
- * - ``read_asam_ndarray(...)``
223
+ * - ``read_asam_ndarray(...)`` ROW_DIR / COLUMN_DIR
202
224
  - element count
203
225
  - ``numpy.ndarray``
204
226
  - matrix/tensor data
227
+ * - ``read_asam_ndarray(...)`` ALTERNATE_WITH_X/Y
228
+ - ignored (derived from shape)
229
+ - ``AlternateArrayResult(values, axis)``
230
+ - interleaved axis+value maps
205
231
  * - ``write_asam_ndarray(...)``
206
232
  - n/a (from ``array.nbytes``)
207
233
  - ``None``
@@ -217,13 +243,77 @@ Quick reference for the ASAM array helpers on ``Image`` and ``Section``.
217
243
  .. note::
218
244
  **ASAM index modes**
219
245
 
220
- ``index_mode="ROW_DIR"`` (default) uses C-like row-major layout
221
- where X increments fastest. ``index_mode="COLUMN_DIR"`` swaps only
222
- X and Y (not true Fortran-order for dims > 2).
246
+ +------------------------+---------------------------------------------------+
247
+ | ``index_mode`` | Memory layout |
248
+ +========================+===================================================+
249
+ | ``ROW_DIR`` (default) | C-order row-major; X increments fastest |
250
+ +------------------------+---------------------------------------------------+
251
+ | ``COLUMN_DIR`` | X and Y swapped; not true Fortran for dims > 2 |
252
+ +------------------------+---------------------------------------------------+
253
+ | ``ALTERNATE_WITH_X`` | 2-D maps only: each X-column preceded by its |
254
+ | | X-axis coordinate value in memory |
255
+ +------------------------+---------------------------------------------------+
256
+ | ``ALTERNATE_WITH_Y`` | 2-D maps only: each Y-row preceded by its Y-axis |
257
+ | | coordinate value in memory |
258
+ +------------------------+---------------------------------------------------+
259
+
260
+ For ``ALTERNATE_WITH_X`` / ``ALTERNATE_WITH_Y``:
261
+
262
+ - Pass axis values with ``x_axis=<array>`` or ``y_axis=<array>`` to
263
+ ``write_asam_ndarray``.
264
+ - ``read_asam_ndarray`` returns an ``AlternateArrayResult(values, axis)``
265
+ named tuple; unpack with ``values, axis = result`` or access as
266
+ ``result.values`` / ``result.axis``.
267
+ - The ``length`` parameter of ``read_asam_ndarray`` is ignored for these
268
+ modes; the byte count is derived from ``shape``.
269
+
270
+ ``shape`` always uses **ASAM convention** ``(X, Y, Z, …)`` – reversed
271
+ compared to numpy ``(…, Z, Y, X)``.
272
+
273
+ .. rubric:: ALTERNATE_WITH_X example (map, 5 columns × 4 rows)
274
+
275
+ .. code-block:: python
276
+
277
+ import numpy as np
278
+ from objutils import Image, Section
279
+
280
+ # Value matrix: shape (4, 5) in numpy = ASAM shape (X=5, Y=4)
281
+ matrix = np.array(
282
+ [[11, 21, 31, 41, 51],
283
+ [12, 22, 32, 42, 52],
284
+ [13, 23, 33, 43, 53],
285
+ [14, 24, 34, 44, 54]],
286
+ dtype=np.uint8,
287
+ )
288
+ x_axis = np.array([10, 20, 30, 40, 50], dtype=np.uint8)
289
+
290
+ # Memory: x[0]=10, col0=[11,12,13,14], x[1]=20, col1=[21,22,23,24], …
291
+ img = Image([Section(0x8000, bytes(5 * (1 + 4) + 16))])
292
+ img.write_asam_ndarray(0x8000, matrix, "UBYTE", "MSB_LAST",
293
+ index_mode="ALTERNATE_WITH_X", x_axis=x_axis)
294
+
295
+ result = img.read_asam_ndarray(0x8000, 0, "UBYTE",
296
+ shape=(5, 4), byte_order="MSB_LAST",
297
+ index_mode="ALTERNATE_WITH_X")
298
+ assert np.array_equal(result.values, matrix)
299
+ assert np.array_equal(result.axis, x_axis)
300
+
301
+ .. rubric:: ALTERNATE_WITH_Y example (map, 5 columns × 4 rows)
302
+
303
+ .. code-block:: python
304
+
305
+ y_axis = np.array([1, 2, 3, 4], dtype=np.uint8)
306
+
307
+ # Memory: y[0]=1, row0=[11,21,31,41,51], y[1]=2, row1=[12,22,32,42,52], …
308
+ img2 = Image([Section(0x9000, bytes(4 * (1 + 5) + 16))])
309
+ img2.write_asam_ndarray(0x9000, matrix, "UBYTE", "MSB_LAST",
310
+ index_mode="ALTERNATE_WITH_Y", y_axis=y_axis)
223
311
 
224
- ``shape`` uses **ASAM convention** ``(X, Y, Z, …)`` which is reversed
225
- compared to numpy ``(…, Z, Y, X)``. ``length`` is the **element count**,
226
- not byte count.
312
+ result2 = img2.read_asam_ndarray(0x9000, 0, "UBYTE",
313
+ shape=(5, 4), byte_order="MSB_LAST",
314
+ index_mode="ALTERNATE_WITH_Y")
315
+ assert np.array_equal(result2.values, matrix)
316
+ assert np.array_equal(result2.axis, y_axis)
227
317
 
228
318
  .. warning::
229
319
  **Frequent pitfalls**
@@ -232,6 +322,8 @@ Quick reference for the ASAM array helpers on ``Image`` and ``Section``.
232
322
  - Forgetting that byte order is applied per element, not per full buffer.
233
323
  - Passing unsupported ASAM dtype names (must be values like ``UWORD``/``ULONG``).
234
324
  - Assuming MSW swapping affects 8-bit types (it does not).
325
+ - Using ``ALTERNATE_WITH_X`` / ``ALTERNATE_WITH_Y`` with a 1-D array or
326
+ without a 2-D ``shape`` parameter.
235
327
 
236
328
  .. rubric:: Copy/paste example: ULONG array roundtrip
237
329
 
@@ -13,7 +13,7 @@ Registers CODECS and implements an interface to them.
13
13
  The first parameter is always the codec name.
14
14
  """
15
15
 
16
- __version__ = "0.10.15"
16
+ __version__ = "0.10.17"
17
17
 
18
18
  __all__ = [
19
19
  "Image",
@@ -300,7 +300,6 @@ class Readers:
300
300
  """
301
301
 
302
302
 
303
-
304
303
  @dataclass
305
304
  class DIEAttribute:
306
305
  """Parsed DIE attribute with value.
@@ -64,12 +64,10 @@ class ULEBError(ConstructError):
64
64
  """Raised when ULEB128 parsing or building encounters an error."""
65
65
 
66
66
 
67
-
68
67
  class SLEBError(ConstructError):
69
68
  """Raised when SLEB128 parsing or building encounters an error."""
70
69
 
71
70
 
72
-
73
71
  @singleton
74
72
  class ULEB(Construct):
75
73
  """Unsigned LEB128 (Little-Endian Base-128) Variable-Length Integer.
@@ -69,7 +69,6 @@ class Readers:
69
69
  """
70
70
 
71
71
 
72
-
73
72
  class DwarfReaders:
74
73
  """High-Level DWARF Data Reader Interface.
75
74
 
@@ -1183,7 +1183,6 @@ class DebugInformation(Base, RidMixIn):
1183
1183
  """
1184
1184
 
1185
1185
 
1186
-
1187
1186
  class CompilationUnit(Base, RidMixIn):
1188
1187
  __tablename__ = "compilationunit"
1189
1188
  """ORM model for DWARF Compilation Unit (CU).
@@ -1193,7 +1192,6 @@ class CompilationUnit(Base, RidMixIn):
1193
1192
  """
1194
1193
 
1195
1194
 
1196
-
1197
1195
  def calculateCacheSize(value: int) -> int:
1198
1196
  """Convert cache size in bytes to SQLite PRAGMA format.
1199
1197
 
@@ -335,32 +335,26 @@ class HexFileError(Exception):
335
335
  """Base exception for all hex file operations."""
336
336
 
337
337
 
338
-
339
338
  class ParseError(HexFileError):
340
339
  """Base for parsing-related errors."""
341
340
 
342
341
 
343
-
344
342
  class InvalidRecordTypeError(ParseError):
345
343
  """Raised when record type is not recognized."""
346
344
 
347
345
 
348
-
349
346
  class InvalidRecordLengthError(ParseError):
350
347
  """Raised when record length doesn't match data."""
351
348
 
352
349
 
353
-
354
350
  class InvalidRecordChecksumError(ParseError):
355
351
  """Raised when checksum validation fails."""
356
352
 
357
353
 
358
-
359
354
  class AddressRangeToLargeError(HexFileError):
360
355
  """Raised when address exceeds format capabilities."""
361
356
 
362
357
 
363
-
364
358
  # Deprecated alias for backward compatibility
365
359
  Invalidrecord_typeError = InvalidRecordTypeError
366
360
 
@@ -689,13 +689,31 @@ class Image:
689
689
  """Write a numeric ASAM datatype with ECU byte order semantics."""
690
690
  self._call_address_function("write_asam_numeric", addr, value, dtype, byte_order, **kws)
691
691
 
692
- def read_asam_string(self, addr: int, dtype: str, length: int = -1, **kws: Any) -> str:
693
- """Read an ASAM string datatype (ASCII/UTF8/UTF16/UTF32)."""
694
- return self._call_address_function("read_asam_string", addr, dtype, length, **kws)
692
+ def read_asam_string(self, addr: int, dtype: str, length: int = -1, encoding: str | None = None, **kws: Any) -> str:
693
+ """Read an ASAM string datatype (ASCII/UTF8/UTF16/UTF32).
695
694
 
696
- def write_asam_string(self, addr: int, value: str, dtype: str, **kws: Any) -> None:
697
- """Write an ASAM string datatype (ASCII/UTF8/UTF16/UTF32)."""
698
- self._call_address_function("write_asam_string", addr, value, dtype, **kws)
695
+ Args:
696
+ addr: Absolute memory address to read from.
697
+ dtype: ASAM string datatype (``"ASCII"``, ``"UTF8"``, ``"UTF16"``, ``"UTF32"``).
698
+ length: Number of bytes, or ``-1`` for null-terminated (default: -1).
699
+ encoding: Optional Python codec name overriding the encoding implied by *dtype*
700
+ (e.g. ``"latin-1"``, ``"cp1252"``). Useful when raw bytes cannot be decoded
701
+ with the standard ASAM mapping.
702
+ """
703
+ return self._call_address_function("read_asam_string", addr, dtype, length, encoding=encoding, **kws)
704
+
705
+ def write_asam_string(self, addr: int, value: str, dtype: str, encoding: str | None = None, **kws: Any) -> None:
706
+ """Write an ASAM string datatype (ASCII/UTF8/UTF16/UTF32).
707
+
708
+ Args:
709
+ addr: Absolute memory address to write to.
710
+ value: String to write.
711
+ dtype: ASAM string datatype (``"ASCII"``, ``"UTF8"``, ``"UTF16"``, ``"UTF32"``).
712
+ encoding: Optional Python codec name overriding the encoding implied by *dtype*
713
+ (e.g. ``"latin-1"``, ``"cp1252"``). Useful when the string contains
714
+ characters outside the standard ASAM mapping.
715
+ """
716
+ self._call_address_function("write_asam_string", addr, value, dtype, encoding=encoding, **kws)
699
717
 
700
718
  def read_asam_numeric_array(
701
719
  self,
@@ -780,11 +798,29 @@ class Image:
780
798
 
781
799
  Args:
782
800
  addr: Absolute memory address to write to.
783
- array: NumPy ndarray (shape in numpy convention).
784
- dtype: ASAM datatype name.
785
- byte_order: ASAM byte order string.
786
- index_mode: ``"ROW_DIR"`` (default) or ``"COLUMN_DIR"``.
787
- **kws: Passed through to section method.
801
+ array: NumPy ndarray (shape in numpy convention, i.e. rows × columns).
802
+ dtype: ASAM datatype name (e.g. ``"UWORD"``, ``"ULONG"``).
803
+ byte_order: ASAM byte order string (e.g. ``"MSB_FIRST"``, ``"MSB_LAST"``).
804
+ index_mode: Memory layout mode:
805
+
806
+ - ``"ROW_DIR"`` (default) – C-order row-major; X increments fastest.
807
+ - ``"COLUMN_DIR"`` – X and Y swapped; not true Fortran-order for
808
+ dims > 2.
809
+ - ``"ALTERNATE_WITH_X"`` – 2-D maps only; each X-column is preceded
810
+ by its X-axis coordinate value. Pass axis values via
811
+ ``x_axis=<array>`` in *kws*.
812
+ - ``"ALTERNATE_WITH_Y"`` – 2-D maps only; each Y-row is preceded by
813
+ its Y-axis coordinate value. Pass axis values via
814
+ ``y_axis=<array>`` in *kws*.
815
+ **kws: Keyword arguments passed through to the section method.
816
+ Relevant for ALTERNATE modes:
817
+
818
+ - ``x_axis`` (array-like): X-axis coordinate values for
819
+ ``ALTERNATE_WITH_X``.
820
+ - ``y_axis`` (array-like): Y-axis coordinate values for
821
+ ``ALTERNATE_WITH_Y``.
822
+ - ``axis_dtype`` (str): ASAM datatype for axis values (defaults
823
+ to the same as *dtype*).
788
824
  """
789
825
  self._call_address_function("write_asam_ndarray", addr, array, dtype, byte_order, index_mode=index_mode, **kws)
790
826
 
@@ -829,15 +865,36 @@ class Image:
829
865
 
830
866
  Args:
831
867
  addr: Start address to read from.
832
- length: Number of **elements** (not bytes).
833
- dtype: ASAM datatype name.
834
- shape: Dimensions in **ASAM** order ``(X, Y, Z, ...)``.
835
- byte_order: ASAM byte order string.
836
- index_mode: ``"ROW_DIR"`` (default) or ``"COLUMN_DIR"``.
837
- **kws: Passed through to section method.
868
+ length: Number of **elements** (not bytes). Ignored for
869
+ ``ALTERNATE_WITH_X`` and ``ALTERNATE_WITH_Y`` – the byte count
870
+ is derived from *shape* in those modes.
871
+ dtype: ASAM datatype name (e.g. ``"UWORD"``, ``"ULONG"``).
872
+ shape: Dimensions in **ASAM** order ``(X, Y, Z, ...)``, which is
873
+ the reverse of numpy order ``(..., Z, Y, X)``.
874
+ **Required** for ``ALTERNATE_WITH_X`` and ``ALTERNATE_WITH_Y``.
875
+ byte_order: ASAM byte order string (e.g. ``"MSB_FIRST"``, ``"MSB_LAST"``).
876
+ index_mode: Memory layout mode:
877
+
878
+ - ``"ROW_DIR"`` (default) – C-order row-major; X increments fastest.
879
+ - ``"COLUMN_DIR"`` – X and Y swapped; not true Fortran-order for
880
+ dims > 2.
881
+ - ``"ALTERNATE_WITH_X"`` – 2-D maps only; each X-column is preceded
882
+ by its X-axis coordinate value in memory.
883
+ - ``"ALTERNATE_WITH_Y"`` – 2-D maps only; each Y-row is preceded by
884
+ its Y-axis coordinate value in memory.
885
+ **kws: Keyword arguments passed through to the section method.
886
+ Relevant for ALTERNATE modes:
887
+
888
+ - ``axis_dtype`` (str): ASAM datatype for axis values (defaults
889
+ to the same as *dtype*).
838
890
 
839
891
  Returns:
840
- NumPy ndarray with shape in numpy convention.
892
+ - ``numpy.ndarray`` with shape in numpy convention for ``ROW_DIR``
893
+ and ``COLUMN_DIR``.
894
+ - :class:`~objutils.section.AlternateArrayResult` ``(values, axis)``
895
+ named tuple for ``ALTERNATE_WITH_X`` and ``ALTERNATE_WITH_Y``.
896
+ Access via ``result.values`` / ``result.axis`` or unpack:
897
+ ``values, axis = result``.
841
898
  """
842
899
  return self._call_address_function(
843
900
  "read_asam_ndarray", addr, length, dtype, shape=shape, byte_order=byte_order, index_mode=index_mode, **kws
@@ -211,7 +211,6 @@ class CodecDoesNotExistError(Exception):
211
211
  """
212
212
 
213
213
 
214
-
215
214
  class CodecAlreadyExistError(Exception):
216
215
  """Raised when attempting to register a format that already exists.
217
216
 
@@ -230,7 +229,6 @@ class CodecAlreadyExistError(Exception):
230
229
  """
231
230
 
232
231
 
233
-
234
232
  class Codec(NamedTuple):
235
233
  """Container for format reader, writer, and metadata.
236
234