dissect.cstruct 4.8.dev8__tar.gz → 4.8.dev9__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 (79) hide show
  1. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/PKG-INFO +1 -1
  2. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/dissect/cstruct/cstruct.py +29 -0
  3. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/dissect.cstruct.egg-info/PKG-INFO +1 -1
  4. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/dissect.cstruct.egg-info/SOURCES.txt +2 -0
  5. dissect_cstruct-4.8.dev9/dissect.cstruct.egg-info/scm_file_list.json +76 -0
  6. dissect_cstruct-4.8.dev9/dissect.cstruct.egg-info/scm_version.json +8 -0
  7. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/tests/test_basic.py +29 -0
  8. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/.git-blame-ignore-revs +0 -0
  9. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/.gitattributes +0 -0
  10. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/CHANGELOG.md +0 -0
  11. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/COPYRIGHT +0 -0
  12. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/LICENSE +0 -0
  13. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/MANIFEST.in +0 -0
  14. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/README.md +0 -0
  15. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/dissect/cstruct/__init__.py +0 -0
  16. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/dissect/cstruct/bitbuffer.py +0 -0
  17. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/dissect/cstruct/compiler.py +0 -0
  18. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/dissect/cstruct/exceptions.py +0 -0
  19. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/dissect/cstruct/expression.py +0 -0
  20. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/dissect/cstruct/parser.py +0 -0
  21. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/dissect/cstruct/tools/__init__.py +0 -0
  22. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/dissect/cstruct/tools/stubgen.py +0 -0
  23. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/dissect/cstruct/types/__init__.py +0 -0
  24. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/dissect/cstruct/types/base.py +0 -0
  25. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/dissect/cstruct/types/char.py +0 -0
  26. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/dissect/cstruct/types/enum.py +0 -0
  27. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/dissect/cstruct/types/flag.py +0 -0
  28. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/dissect/cstruct/types/int.py +0 -0
  29. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/dissect/cstruct/types/leb128.py +0 -0
  30. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/dissect/cstruct/types/packed.py +0 -0
  31. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/dissect/cstruct/types/pointer.py +0 -0
  32. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/dissect/cstruct/types/structure.py +0 -0
  33. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/dissect/cstruct/types/void.py +0 -0
  34. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/dissect/cstruct/types/wchar.py +0 -0
  35. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/dissect/cstruct/utils.py +0 -0
  36. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/dissect.cstruct.egg-info/dependency_links.txt +0 -0
  37. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/dissect.cstruct.egg-info/entry_points.txt +0 -0
  38. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/dissect.cstruct.egg-info/requires.txt +0 -0
  39. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/dissect.cstruct.egg-info/top_level.txt +0 -0
  40. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/examples/disk.py +0 -0
  41. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/examples/mirai.py +0 -0
  42. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/examples/pe.py +0 -0
  43. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/examples/protobuf.py +0 -0
  44. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/examples/secdesc.py +0 -0
  45. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/pyproject.toml +0 -0
  46. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/setup.cfg +0 -0
  47. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/tests/__init__.py +0 -0
  48. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/tests/_data/testdef.txt +0 -0
  49. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/tests/_docs/Makefile +0 -0
  50. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/tests/_docs/__init__.py +0 -0
  51. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/tests/_docs/conf.py +0 -0
  52. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/tests/_docs/index.rst +0 -0
  53. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/tests/conftest.py +0 -0
  54. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/tests/test_align.py +0 -0
  55. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/tests/test_annotations.py +0 -0
  56. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/tests/test_benchmark.py +0 -0
  57. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/tests/test_bitbuffer.py +0 -0
  58. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/tests/test_bitfield.py +0 -0
  59. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/tests/test_compiler.py +0 -0
  60. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/tests/test_ctypes.py +0 -0
  61. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/tests/test_expression.py +0 -0
  62. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/tests/test_parser.py +0 -0
  63. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/tests/test_tools_stubgen.py +0 -0
  64. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/tests/test_types_base.py +0 -0
  65. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/tests/test_types_char.py +0 -0
  66. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/tests/test_types_custom.py +0 -0
  67. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/tests/test_types_enum.py +0 -0
  68. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/tests/test_types_flag.py +0 -0
  69. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/tests/test_types_int.py +0 -0
  70. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/tests/test_types_leb128.py +0 -0
  71. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/tests/test_types_packed.py +0 -0
  72. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/tests/test_types_pointer.py +0 -0
  73. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/tests/test_types_structure.py +0 -0
  74. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/tests/test_types_union.py +0 -0
  75. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/tests/test_types_void.py +0 -0
  76. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/tests/test_types_wchar.py +0 -0
  77. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/tests/test_utils.py +0 -0
  78. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/tests/utils.py +0 -0
  79. {dissect_cstruct-4.8.dev8 → dissect_cstruct-4.8.dev9}/tox.ini +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dissect.cstruct
3
- Version: 4.8.dev8
3
+ Version: 4.8.dev9
4
4
  Summary: A Dissect module implementing a parser for C-like structures: structure parsing in Python made easy
5
5
  Author-email: Dissect Team <dissect@fox-it.com>
6
6
  License-Expression: Apache-2.0
@@ -1,5 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import copy
3
4
  import ctypes as _ctypes
4
5
  import struct
5
6
  import sys
@@ -25,6 +26,7 @@ from dissect.cstruct.types import (
25
26
  Void,
26
27
  Wchar,
27
28
  )
29
+ from dissect.cstruct.types.base import MetaType
28
30
 
29
31
  if TYPE_CHECKING:
30
32
  from collections.abc import Iterable
@@ -206,6 +208,25 @@ class cstruct:
206
208
 
207
209
  raise AttributeError(f"Invalid attribute: {attr}")
208
210
 
211
+ def __copy__(self) -> cstruct:
212
+ cs = cstruct(endian=self.endian, pointer=self.pointer.__name__)
213
+ cs._anonymous_count = self._anonymous_count
214
+ cs.consts = self.consts.copy()
215
+ cs.lookups = self.lookups.copy()
216
+ cs.includes = self.includes.copy()
217
+
218
+ # Update typedefs to point to the new cstruct instance
219
+ for name, type in self.typedefs.items():
220
+ if name in cs.typedefs:
221
+ continue
222
+
223
+ if isinstance(type, MetaType):
224
+ new_type = copy.copy(type)
225
+ new_type.cs = cs
226
+ cs.typedefs[name] = new_type
227
+
228
+ return cs
229
+
209
230
  def _next_anonymous(self) -> str:
210
231
  name = f"__anonymous_{self._anonymous_count}__"
211
232
  self._anonymous_count += 1
@@ -328,6 +349,14 @@ class cstruct:
328
349
 
329
350
  raise ResolveError(f"Recursion limit exceeded while resolving type {name}")
330
351
 
352
+ def copy(self) -> cstruct:
353
+ """Create a copy of this cstruct instance.
354
+
355
+ Returns:
356
+ A new cstruct instance with the same types and settings as this one.
357
+ """
358
+ return copy.copy(self)
359
+
331
360
  def _make_type(
332
361
  self,
333
362
  name: str,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dissect.cstruct
3
- Version: 4.8.dev8
3
+ Version: 4.8.dev9
4
4
  Summary: A Dissect module implementing a parser for C-like structures: structure parsing in Python made easy
5
5
  Author-email: Dissect Team <dissect@fox-it.com>
6
6
  License-Expression: Apache-2.0
@@ -12,6 +12,8 @@ dissect.cstruct.egg-info/SOURCES.txt
12
12
  dissect.cstruct.egg-info/dependency_links.txt
13
13
  dissect.cstruct.egg-info/entry_points.txt
14
14
  dissect.cstruct.egg-info/requires.txt
15
+ dissect.cstruct.egg-info/scm_file_list.json
16
+ dissect.cstruct.egg-info/scm_version.json
15
17
  dissect.cstruct.egg-info/top_level.txt
16
18
  dissect/cstruct/__init__.py
17
19
  dissect/cstruct/bitbuffer.py
@@ -0,0 +1,76 @@
1
+ {
2
+ "files": [
3
+ "README.md",
4
+ "tox.ini",
5
+ "LICENSE",
6
+ "pyproject.toml",
7
+ "COPYRIGHT",
8
+ "CHANGELOG.md",
9
+ ".git-blame-ignore-revs",
10
+ ".gitattributes",
11
+ "MANIFEST.in",
12
+ ".gitignore",
13
+ "dissect/cstruct/cstruct.py",
14
+ "dissect/cstruct/__init__.py",
15
+ "dissect/cstruct/exceptions.py",
16
+ "dissect/cstruct/compiler.py",
17
+ "dissect/cstruct/expression.py",
18
+ "dissect/cstruct/utils.py",
19
+ "dissect/cstruct/parser.py",
20
+ "dissect/cstruct/bitbuffer.py",
21
+ "dissect/cstruct/types/int.py",
22
+ "dissect/cstruct/types/__init__.py",
23
+ "dissect/cstruct/types/leb128.py",
24
+ "dissect/cstruct/types/flag.py",
25
+ "dissect/cstruct/types/void.py",
26
+ "dissect/cstruct/types/char.py",
27
+ "dissect/cstruct/types/pointer.py",
28
+ "dissect/cstruct/types/structure.py",
29
+ "dissect/cstruct/types/enum.py",
30
+ "dissect/cstruct/types/base.py",
31
+ "dissect/cstruct/types/wchar.py",
32
+ "dissect/cstruct/types/packed.py",
33
+ "dissect/cstruct/tools/__init__.py",
34
+ "dissect/cstruct/tools/stubgen.py",
35
+ "tests/test_types_char.py",
36
+ "tests/test_ctypes.py",
37
+ "tests/test_types_custom.py",
38
+ "tests/__init__.py",
39
+ "tests/test_types_leb128.py",
40
+ "tests/test_types_union.py",
41
+ "tests/test_tools_stubgen.py",
42
+ "tests/test_basic.py",
43
+ "tests/test_types_int.py",
44
+ "tests/test_expression.py",
45
+ "tests/utils.py",
46
+ "tests/test_align.py",
47
+ "tests/test_utils.py",
48
+ "tests/test_compiler.py",
49
+ "tests/test_types_enum.py",
50
+ "tests/test_types_wchar.py",
51
+ "tests/test_bitfield.py",
52
+ "tests/test_types_structure.py",
53
+ "tests/test_parser.py",
54
+ "tests/test_annotations.py",
55
+ "tests/conftest.py",
56
+ "tests/test_types_void.py",
57
+ "tests/test_types_flag.py",
58
+ "tests/test_benchmark.py",
59
+ "tests/test_types_pointer.py",
60
+ "tests/test_types_packed.py",
61
+ "tests/test_types_base.py",
62
+ "tests/test_bitbuffer.py",
63
+ "tests/_data/testdef.txt",
64
+ "tests/_docs/__init__.py",
65
+ "tests/_docs/Makefile",
66
+ "tests/_docs/index.rst",
67
+ "tests/_docs/conf.py",
68
+ "examples/secdesc.py",
69
+ "examples/disk.py",
70
+ "examples/pe.py",
71
+ "examples/mirai.py",
72
+ "examples/protobuf.py",
73
+ ".github/pull_request_template.md",
74
+ ".github/workflows/dissect-ci.yml"
75
+ ]
76
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "tag": "4.7",
3
+ "distance": 9,
4
+ "node": "g91f2347ef234a41eb3ea6ae55defb9e80379e12a",
5
+ "dirty": true,
6
+ "branch": "main",
7
+ "node_date": "2026-07-06"
8
+ }
@@ -532,3 +532,32 @@ def test_linked_list(cs: cstruct) -> None:
532
532
 
533
533
  assert obj.data == 1
534
534
  assert obj.next.data == 2
535
+
536
+
537
+ def test_copy(cs: cstruct) -> None:
538
+ """Test that copying a cstruct instance works as expected."""
539
+ cdef = """
540
+ struct test {
541
+ uint32 a;
542
+ };
543
+ """
544
+ cs.load(cdef)
545
+
546
+ cs_copy = cs.copy()
547
+
548
+ # Modify the copy and verify the original is unchanged
549
+ cs_copy.load("""
550
+ struct test2 {
551
+ uint16 b;
552
+ };
553
+ """)
554
+
555
+ assert "test" in cs.typedefs
556
+ assert "test2" not in cs.typedefs
557
+
558
+ assert "test" in cs_copy.typedefs
559
+ assert "test2" in cs_copy.typedefs
560
+
561
+ # Verify that types in the copied cstruct reference the copied cstruct
562
+ assert cs_copy.resolve("test").cs is cs_copy
563
+ assert cs_copy.resolve("test2").cs is cs_copy