dissect.cstruct 4.8.dev9__py3-none-any.whl → 5.0.dev6__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. dissect/cstruct/__init__.py +2 -2
  2. dissect/cstruct/bitbuffer.py +3 -3
  3. dissect/cstruct/compiler.py +7 -7
  4. dissect/cstruct/cstruct.py +196 -75
  5. dissect/cstruct/{exceptions.py → exception.py} +4 -4
  6. dissect/cstruct/expression.py +188 -271
  7. dissect/cstruct/lexer.py +584 -0
  8. dissect/cstruct/parser.py +444 -593
  9. dissect/cstruct/tools/stubgen.py +18 -22
  10. dissect/cstruct/types/base.py +74 -31
  11. dissect/cstruct/types/char.py +12 -8
  12. dissect/cstruct/types/enum.py +33 -13
  13. dissect/cstruct/types/int.py +9 -7
  14. dissect/cstruct/types/leb128.py +6 -4
  15. dissect/cstruct/types/packed.py +19 -10
  16. dissect/cstruct/types/pointer.py +74 -56
  17. dissect/cstruct/types/structure.py +128 -28
  18. dissect/cstruct/types/void.py +6 -4
  19. dissect/cstruct/types/wchar.py +19 -14
  20. dissect/cstruct/{utils.py → util.py} +60 -35
  21. {dissect_cstruct-4.8.dev9.dist-info → dissect_cstruct-5.0.dev6.dist-info}/METADATA +1 -1
  22. dissect_cstruct-5.0.dev6.dist-info/RECORD +32 -0
  23. {dissect_cstruct-4.8.dev9.dist-info → dissect_cstruct-5.0.dev6.dist-info}/scm_file_list.json +4 -2
  24. dissect_cstruct-5.0.dev6.dist-info/scm_version.json +8 -0
  25. dissect_cstruct-4.8.dev9.dist-info/RECORD +0 -31
  26. dissect_cstruct-4.8.dev9.dist-info/scm_version.json +0 -8
  27. {dissect_cstruct-4.8.dev9.dist-info → dissect_cstruct-5.0.dev6.dist-info}/WHEEL +0 -0
  28. {dissect_cstruct-4.8.dev9.dist-info → dissect_cstruct-5.0.dev6.dist-info}/entry_points.txt +0 -0
  29. {dissect_cstruct-4.8.dev9.dist-info → dissect_cstruct-5.0.dev6.dist-info}/licenses/COPYRIGHT +0 -0
  30. {dissect_cstruct-4.8.dev9.dist-info → dissect_cstruct-5.0.dev6.dist-info}/licenses/LICENSE +0 -0
  31. {dissect_cstruct-4.8.dev9.dist-info → dissect_cstruct-5.0.dev6.dist-info}/top_level.txt +0 -0
@@ -7,13 +7,14 @@ import sys
7
7
  from enum import Enum
8
8
  from typing import TYPE_CHECKING
9
9
 
10
- from dissect.cstruct.types.pointer import Pointer
11
- from dissect.cstruct.types.structure import Structure
12
-
13
10
  if TYPE_CHECKING:
14
11
  from collections.abc import Iterator
15
12
  from typing import Literal
16
13
 
14
+ from dissect.cstruct.cstruct import AllowedEndianness
15
+ from dissect.cstruct.types.base import BaseType
16
+ from dissect.cstruct.types.structure import Structure
17
+
17
18
  # Regular ANSI colors
18
19
  COLOR_RED = "\033[0;31m"
19
20
  COLOR_GREEN = "\033[0;32m"
@@ -51,13 +52,16 @@ COLOR_CLEAR_BOLD = "\033[1;0m"
51
52
 
52
53
  PRINTABLE = string.digits + string.ascii_letters + string.punctuation + " "
53
54
 
54
- ENDIANNESS_MAP: dict[str, Literal["big", "little"]] = {
55
- "@": sys.byteorder,
56
- "=": sys.byteorder,
55
+
56
+ ENDIANNESS_TO_BYTEORDER_MAP: dict[AllowedEndianness, Literal["big", "little"]] = {
57
57
  "<": "little",
58
58
  ">": "big",
59
59
  "!": "big",
60
+ "@": sys.byteorder,
61
+ "=": sys.byteorder,
60
62
  "network": "big",
63
+ "little": "little",
64
+ "big": "big",
61
65
  }
62
66
 
63
67
  Palette = list[tuple[int, str]]
@@ -263,14 +267,15 @@ def _dumpstruct(
263
267
  continue
264
268
 
265
269
  value = getattr(structure, field._name)
266
- if isinstance(value, (str, Pointer, Enum)):
267
- value = repr(value)
268
- elif isinstance(value, int):
270
+
271
+ if isinstance(value, int) and not isinstance(value, Enum):
269
272
  value = hex(value)
270
273
  elif isinstance(value, list):
271
274
  value = pprint.pformat(value)
272
275
  if "\n" in value:
273
276
  value = value.replace("\n", f"\n{' ' * (len(field._name) + 4)}")
277
+ else:
278
+ value = repr(value)
274
279
 
275
280
  if color:
276
281
  foreground, background = colors[ci % len(colors)]
@@ -316,118 +321,124 @@ def dumpstruct(
316
321
  if output not in ("print", "string"):
317
322
  raise ValueError(f"Invalid output argument: {output!r} (should be 'print' or 'string').")
318
323
 
319
- if isinstance(obj, Structure):
320
- return _dumpstruct(obj, obj.dumps(), offset, color, output, autoskip)
321
- if issubclass(obj, Structure) and data is not None:
324
+ if isinstance(obj, type) and data is not None:
322
325
  return _dumpstruct(obj(data), data, offset, color, output, autoskip)
323
- raise ValueError("Invalid arguments")
326
+
327
+ return _dumpstruct(obj, obj.dumps(), offset, color, output, autoskip)
324
328
 
325
329
 
326
- def pack(value: int, size: int | None = None, endian: str = "little") -> bytes:
330
+ def pack(value: int, size: int | None = None, endian: AllowedEndianness = "little") -> bytes:
327
331
  """Pack an integer value to a given bit size, endianness.
328
332
 
329
333
  Arguments:
330
334
  value: Value to pack.
331
335
  size: Integer size in bits.
332
- endian: Endianness to use (little, big, network, <, > or !)
336
+ endian: Endianness to use (little, big, network, <, >, !, @ or =).
333
337
  """
338
+ if endian not in ENDIANNESS_TO_BYTEORDER_MAP:
339
+ raise ValueError(f"Invalid endianness: {endian!r} (should be little, big, network, <, >, !, @ or =)")
340
+
334
341
  size = ((size or value.bit_length()) + 7) // 8
335
- return value.to_bytes(size, ENDIANNESS_MAP.get(endian, endian), signed=value < 0)
342
+ return value.to_bytes(size, ENDIANNESS_TO_BYTEORDER_MAP[endian], signed=value < 0)
336
343
 
337
344
 
338
- def unpack(value: bytes, size: int | None = None, endian: str = "little", sign: bool = False) -> int:
345
+ def unpack(value: bytes, size: int | None = None, endian: AllowedEndianness = "little", sign: bool = False) -> int:
339
346
  """Unpack an integer value from a given bit size, endianness and sign.
340
347
 
341
348
  Arguments:
342
349
  value: Value to unpack.
343
350
  size: Integer size in bits.
344
- endian: Endianness to use (little, big, network, <, > or !)
351
+ endian: Endianness to use (little, big, network, <, >, !, @ or =).
345
352
  sign: Signedness of the integer.
346
353
  """
347
354
  if size and len(value) != size // 8:
348
355
  raise ValueError(f"Invalid byte value, expected {size // 8} bytes, got {len(value)} bytes")
349
- return int.from_bytes(value, ENDIANNESS_MAP.get(endian, endian), signed=sign)
356
+
357
+ if endian not in ENDIANNESS_TO_BYTEORDER_MAP:
358
+ raise ValueError(f"Invalid endianness: {endian!r} (should be little, big, network, <, >, !, @ or =)")
359
+
360
+ return int.from_bytes(value, ENDIANNESS_TO_BYTEORDER_MAP[endian], signed=sign)
350
361
 
351
362
 
352
- def p8(value: int, endian: str = "little") -> bytes:
363
+ def p8(value: int, endian: AllowedEndianness = "little") -> bytes:
353
364
  """Pack an 8 bit integer.
354
365
 
355
366
  Arguments:
356
367
  value: Value to pack.
357
- endian: Endianness to use (little, big, network, <, > or !)
368
+ endian: Endianness to use (little, big, network, <, >, !, @ or =).
358
369
  """
359
370
  return pack(value, 8, endian)
360
371
 
361
372
 
362
- def p16(value: int, endian: str = "little") -> bytes:
373
+ def p16(value: int, endian: AllowedEndianness = "little") -> bytes:
363
374
  """Pack a 16 bit integer.
364
375
 
365
376
  Arguments:
366
377
  value: Value to pack.
367
- endian: Endianness to use (little, big, network, <, > or !)
378
+ endian: Endianness to use (little, big, network, <, >, !, @ or =).
368
379
  """
369
380
  return pack(value, 16, endian)
370
381
 
371
382
 
372
- def p32(value: int, endian: str = "little") -> bytes:
383
+ def p32(value: int, endian: AllowedEndianness = "little") -> bytes:
373
384
  """Pack a 32 bit integer.
374
385
 
375
386
  Arguments:
376
387
  value: Value to pack.
377
- endian: Endianness to use (little, big, network, <, > or !)
388
+ endian: Endianness to use (little, big, network, <, >, !, @ or =).
378
389
  """
379
390
  return pack(value, 32, endian)
380
391
 
381
392
 
382
- def p64(value: int, endian: str = "little") -> bytes:
393
+ def p64(value: int, endian: AllowedEndianness = "little") -> bytes:
383
394
  """Pack a 64 bit integer.
384
395
 
385
396
  Arguments:
386
397
  value: Value to pack.
387
- endian: Endianness to use (little, big, network, <, > or !)
398
+ endian: Endianness to use (little, big, network, <, >, !, @ or =).
388
399
  """
389
400
  return pack(value, 64, endian)
390
401
 
391
402
 
392
- def u8(value: bytes, endian: str = "little", sign: bool = False) -> int:
403
+ def u8(value: bytes, endian: AllowedEndianness = "little", sign: bool = False) -> int:
393
404
  """Unpack an 8 bit integer.
394
405
 
395
406
  Arguments:
396
407
  value: Value to unpack.
397
- endian: Endianness to use (little, big, network, <, > or !)
408
+ endian: Endianness to use (little, big, network, <, >, !, @ or =).
398
409
  sign: Signedness of the integer.
399
410
  """
400
411
  return unpack(value, 8, endian, sign)
401
412
 
402
413
 
403
- def u16(value: bytes, endian: str = "little", sign: bool = False) -> int:
414
+ def u16(value: bytes, endian: AllowedEndianness = "little", sign: bool = False) -> int:
404
415
  """Unpack a 16 bit integer.
405
416
 
406
417
  Arguments:
407
418
  value: Value to unpack.
408
- endian: Endianness to use (little, big, network, <, > or !)
419
+ endian: Endianness to use (little, big, network, <, >, !, @ or =).
409
420
  sign: Signedness of the integer.
410
421
  """
411
422
  return unpack(value, 16, endian, sign)
412
423
 
413
424
 
414
- def u32(value: bytes, endian: str = "little", sign: bool = False) -> int:
425
+ def u32(value: bytes, endian: AllowedEndianness = "little", sign: bool = False) -> int:
415
426
  """Unpack a 32 bit integer.
416
427
 
417
428
  Arguments:
418
429
  value: Value to unpack.
419
- endian: Endianness to use (little, big, network, <, > or !)
430
+ endian: Endianness to use (little, big, network, <, >, !, @ or =).
420
431
  sign: Signedness of the integer.
421
432
  """
422
433
  return unpack(value, 32, endian, sign)
423
434
 
424
435
 
425
- def u64(value: bytes, endian: str = "little", sign: bool = False) -> int:
436
+ def u64(value: bytes, endian: AllowedEndianness = "little", sign: bool = False) -> int:
426
437
  """Unpack a 64 bit integer.
427
438
 
428
439
  Arguments:
429
440
  value: Value to unpack.
430
- endian: Endianness to use (little, big, network, <, > or !)
441
+ endian: Endianness to use (little, big, network, <, >, !, @ or =).
431
442
  sign: Signedness of the integer.
432
443
  """
433
444
  return unpack(value, 64, endian, sign)
@@ -468,3 +479,17 @@ def swap64(value: int) -> int:
468
479
  value: Integer to swap.
469
480
  """
470
481
  return swap(value, 64)
482
+
483
+
484
+ def sizeof(type_: type[BaseType] | BaseType) -> int:
485
+ """Get the size of a type in bytes."""
486
+ return len(type_)
487
+
488
+
489
+ def offsetof(type_: type[Structure], name: str) -> int:
490
+ """Get the offset of a field in a structure."""
491
+ if (field := type_.fields.get(name)) is None:
492
+ raise ValueError(f"Structure '{type_.__name__}' does not have a field named '{name}'")
493
+ if (offset := field.offset) is None:
494
+ raise ValueError(f"Field '{field._name}' of structure '{type_.__name__}' does not have a known offset")
495
+ return offset
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dissect.cstruct
3
- Version: 4.8.dev9
3
+ Version: 5.0.dev6
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
@@ -0,0 +1,32 @@
1
+ dissect/cstruct/__init__.py,sha256=8VNVQfPH4aH5V_kD-jvtLPwQ-ag9ppKHTy3dbxIR6ik,1378
2
+ dissect/cstruct/bitbuffer.py,sha256=lZuLUOluHx4mzFGRp62_FO45_iJwXayyzv9-v8b0Q08,2687
3
+ dissect/cstruct/compiler.py,sha256=vVg2H-pi9ugQ8Xvhs1JQ--4BjA5gtO2tW-1W8jr36V4,14283
4
+ dissect/cstruct/cstruct.py,sha256=bsCesSpbE0H4MUsHwb2iEbeadOBlOSAVENwyoP-UkP8,24929
5
+ dissect/cstruct/exception.py,sha256=RqD08LuBkbMqa3iQ1A05DNN8XgEmQR_SUnguwe9LGo8,316
6
+ dissect/cstruct/expression.py,sha256=MEwqHGgqA2fUk4kYk4lRLDWNTAMhB4-saJ5BgTxl7OA,7956
7
+ dissect/cstruct/lexer.py,sha256=NDUfAWgyxgRNRuVO8ExXQ51LqQXS2mv9bywVa_M7tFQ,19665
8
+ dissect/cstruct/parser.py,sha256=xCK-1O8c86sVFvjaXXSRgTsJWWd0ncKM6KJf2wbyGG8,21348
9
+ dissect/cstruct/util.py,sha256=S__kLEb9HKZg_WZR4CGtXDxkIkERLKbzFTHoU8FT8tU,15313
10
+ dissect/cstruct/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
+ dissect/cstruct/tools/stubgen.py,sha256=FLQieYE-MeKK31DcrDzwNUropUYHPjwdfcDb1X2L6j4,7651
12
+ dissect/cstruct/types/__init__.py,sha256=6P71Pu94Dv7RNjZpDZ19pqzx-G0QzmQw4q0-3zWALso,911
13
+ dissect/cstruct/types/base.py,sha256=TkU2a1TK1oDafz_9PTQfZuQT7g4aTRsKnG_-Q4jelsQ,12652
14
+ dissect/cstruct/types/char.py,sha256=XAXlKZXbo88WJN-JPW4w4vzcuNgyvLl3Bpn8RLs9pVo,2707
15
+ dissect/cstruct/types/enum.py,sha256=YIWyP3H0tdxmuSI82enoULiN0YevpnU0UaY5ioBCYfI,8518
16
+ dissect/cstruct/types/flag.py,sha256=7xxQjFEDPHSQOxBHgcc75WzPiAxflOquwr7Z7c3erLE,2347
17
+ dissect/cstruct/types/int.py,sha256=Ewejng5pBYnQHPtzL5W0wQMJVUPYyrY8ALES8mFaabI,1324
18
+ dissect/cstruct/types/leb128.py,sha256=V97XTJT_Xbw1LpTwTN1OkjPHuQQAQUxd8OGuA6yEDmE,2387
19
+ dissect/cstruct/types/packed.py,sha256=78nQWm-yylgfK3858nN-XZhO5jiqyO-piGNEyPD2ps4,2458
20
+ dissect/cstruct/types/pointer.py,sha256=eGMrB_tTnKXKmYrcqyA_12IdukXcxRG3WOeQ1dgt7lk,3927
21
+ dissect/cstruct/types/structure.py,sha256=_oMqkXtiF4PFHOh2eRXlkKo0Sb9T0CtrHZMvijJWtmM,37573
22
+ dissect/cstruct/types/void.py,sha256=LCYnTcxsFPaxln36QEUxWuCZVioHRRckMuqtlm6tH54,1218
23
+ dissect/cstruct/types/wchar.py,sha256=YwYE2T-QYYjvO-5O83_VUlzPtrjX_w0bD9Q3rtsO7sM,2870
24
+ dissect_cstruct-5.0.dev6.dist-info/licenses/COPYRIGHT,sha256=H-18RXfshdH9AdHwW2eO1Xa-5s6tY5eipHh5c0whDu4,316
25
+ dissect_cstruct-5.0.dev6.dist-info/licenses/LICENSE,sha256=PhUqiw6jAh2KbBdVRPBq_hfAvfcTBin7nZ3CK7NQbTM,11341
26
+ dissect_cstruct-5.0.dev6.dist-info/METADATA,sha256=i6LEcERc5fpAuARF_fyAa5tF6dDifNqK1ME9k8w7eLg,9255
27
+ dissect_cstruct-5.0.dev6.dist-info/WHEEL,sha256=K260EYznzXsJYBQGqmI8VTxEdiZYNvDZwW9cBh9-_MA,91
28
+ dissect_cstruct-5.0.dev6.dist-info/entry_points.txt,sha256=z53zqZqwD2OLrAkRwrP4wTeiU9CQe7xrMly0T2c0_wQ,71
29
+ dissect_cstruct-5.0.dev6.dist-info/scm_file_list.json,sha256=qZZ_g1Xx93SzRIqQt_5slI4M_CHi3AeoUBF9uqiDfDQ,2306
30
+ dissect_cstruct-5.0.dev6.dist-info/scm_version.json,sha256=fQVyKh0noL65fQHScjM0BBhoAJ2DxEOsu4SaVlpzeWs,162
31
+ dissect_cstruct-5.0.dev6.dist-info/top_level.txt,sha256=Mn-CQzEYsAbkxrUI0TnplHuXnGVKzxpDw_po_sXpvv4,8
32
+ dissect_cstruct-5.0.dev6.dist-info/RECORD,,
@@ -12,12 +12,13 @@
12
12
  ".gitignore",
13
13
  "dissect/cstruct/cstruct.py",
14
14
  "dissect/cstruct/__init__.py",
15
- "dissect/cstruct/exceptions.py",
16
15
  "dissect/cstruct/compiler.py",
17
16
  "dissect/cstruct/expression.py",
18
- "dissect/cstruct/utils.py",
17
+ "dissect/cstruct/exception.py",
19
18
  "dissect/cstruct/parser.py",
19
+ "dissect/cstruct/lexer.py",
20
20
  "dissect/cstruct/bitbuffer.py",
21
+ "dissect/cstruct/util.py",
21
22
  "dissect/cstruct/types/int.py",
22
23
  "dissect/cstruct/types/__init__.py",
23
24
  "dissect/cstruct/types/leb128.py",
@@ -40,6 +41,7 @@
40
41
  "tests/test_types_union.py",
41
42
  "tests/test_tools_stubgen.py",
42
43
  "tests/test_basic.py",
44
+ "tests/test_lexer.py",
43
45
  "tests/test_types_int.py",
44
46
  "tests/test_expression.py",
45
47
  "tests/utils.py",
@@ -0,0 +1,8 @@
1
+ {
2
+ "tag": "5.0.dev0",
3
+ "distance": 6,
4
+ "node": "g8fd15061a9f9618417a62277bc6f2d625768fdd2",
5
+ "dirty": true,
6
+ "branch": "main",
7
+ "node_date": "2026-07-16"
8
+ }
@@ -1,31 +0,0 @@
1
- dissect/cstruct/__init__.py,sha256=Z47dU_PpbZyc2ZSyu-ww-ncX6igaTw0ItVHzVgiaiKI,1380
2
- dissect/cstruct/bitbuffer.py,sha256=bid_N4ZsaTeC3x5Fzs8viUrldT863dMPtEDih20Nt6k,2644
3
- dissect/cstruct/compiler.py,sha256=uOjteLdoUIVNSX71TsBAusW8U085RRH9dXkbK3dp1vY,14203
4
- dissect/cstruct/cstruct.py,sha256=-qTwlvlhFME2WKlweJ8RfIOnxyevoF64N0fuE4okvzM,20409
5
- dissect/cstruct/exceptions.py,sha256=SX05-_HqQn8lYC7SBHv5OrYEepYRMNmRiIzVPW8bvMQ,330
6
- dissect/cstruct/expression.py,sha256=mf5GFGLAn_2Tz3QK86Yqoi317l8cjMcffBKzP2STE6M,10841
7
- dissect/cstruct/parser.py,sha256=Mk8QbkDov_xfauZnp2MqUmFGOPZlp7O2rSLYbB9S3g4,24550
8
- dissect/cstruct/utils.py,sha256=jSWZY8AWoLHF1W9ix-7EH2eI7pTHzLfnSfQHWH1qgKM,14190
9
- dissect/cstruct/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
- dissect/cstruct/tools/stubgen.py,sha256=wvl07h3VnJZWe9ygX4QMxjEH1ZcWaI_6_pSdAJoOEXk,7820
11
- dissect/cstruct/types/__init__.py,sha256=6P71Pu94Dv7RNjZpDZ19pqzx-G0QzmQw4q0-3zWALso,911
12
- dissect/cstruct/types/base.py,sha256=-NYmoX4vEfaFsnAIwQ0nZCz8X2qKEomgpnef2jB4klQ,9708
13
- dissect/cstruct/types/char.py,sha256=9XYCjCF0D_5o3EYnmIcjev-5GI2NzxOhd1ct1xF6SAM,2457
14
- dissect/cstruct/types/enum.py,sha256=vOsD99P7VLhj6vcH_ow1jmyipLP63FmqUQ9GLZ1L8Pc,7565
15
- dissect/cstruct/types/flag.py,sha256=7xxQjFEDPHSQOxBHgcc75WzPiAxflOquwr7Z7c3erLE,2347
16
- dissect/cstruct/types/int.py,sha256=MGsdUxJt-lj3nl9wzAgGX8cb_vJOtGLiCHwYZs1j_IA,1156
17
- dissect/cstruct/types/leb128.py,sha256=kDmsWGXX6vr1bm4uJcilsrQ7JABdQRio16rBZV21pno,2243
18
- dissect/cstruct/types/packed.py,sha256=tpZpb8tiSMXr1np6p0-nZqT4sY7zieO-4E16lmMmqJA,2128
19
- dissect/cstruct/types/pointer.py,sha256=PqeJOoNBUfMd5uO2kpF6OHeW7Q6R1N1W1V4q1MakN4I,3912
20
- dissect/cstruct/types/structure.py,sha256=I9LVeZ81rNE5GDT6wxpUL-PqMO31Ae6TVLLzTGyd6mM,33012
21
- dissect/cstruct/types/void.py,sha256=Gvh0HqI6jQSj2uesdo3J8-G41brWCz8pmP16l8xTBxE,1074
22
- dissect/cstruct/types/wchar.py,sha256=N9Y_XX2_hZEe2DwepJjxsB6xuRJ6zINRalcUofR59kY,2608
23
- dissect_cstruct-4.8.dev9.dist-info/licenses/COPYRIGHT,sha256=H-18RXfshdH9AdHwW2eO1Xa-5s6tY5eipHh5c0whDu4,316
24
- dissect_cstruct-4.8.dev9.dist-info/licenses/LICENSE,sha256=PhUqiw6jAh2KbBdVRPBq_hfAvfcTBin7nZ3CK7NQbTM,11341
25
- dissect_cstruct-4.8.dev9.dist-info/METADATA,sha256=fJPIx_vU4eO86goKEZQiuzMkhAXnMz74hkZPo2SCFTA,9255
26
- dissect_cstruct-4.8.dev9.dist-info/WHEEL,sha256=K260EYznzXsJYBQGqmI8VTxEdiZYNvDZwW9cBh9-_MA,91
27
- dissect_cstruct-4.8.dev9.dist-info/entry_points.txt,sha256=z53zqZqwD2OLrAkRwrP4wTeiU9CQe7xrMly0T2c0_wQ,71
28
- dissect_cstruct-4.8.dev9.dist-info/scm_file_list.json,sha256=7uE9QF1ctA5UjFpM9_OWmXeCn_A_osGyUh-6w4MJV_A,2249
29
- dissect_cstruct-4.8.dev9.dist-info/scm_version.json,sha256=h58edttPGk9dM9JAByXJVawy7O8spyqIVLgUpKibp5c,157
30
- dissect_cstruct-4.8.dev9.dist-info/top_level.txt,sha256=Mn-CQzEYsAbkxrUI0TnplHuXnGVKzxpDw_po_sXpvv4,8
31
- dissect_cstruct-4.8.dev9.dist-info/RECORD,,
@@ -1,8 +0,0 @@
1
- {
2
- "tag": "4.7",
3
- "distance": 9,
4
- "node": "g91f2347ef234a41eb3ea6ae55defb9e80379e12a",
5
- "dirty": true,
6
- "branch": "main",
7
- "node_date": "2026-07-06"
8
- }