[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v4 08/12] qcow2_format.py: add field-formatting class
From: |
Vladimir Sementsov-Ogievskiy |
Subject: |
[PATCH v4 08/12] qcow2_format.py: add field-formatting class |
Date: |
Thu, 4 Jun 2020 20:41:31 +0300 |
Allow formatter class in structure definition instead of hacking with
'mask'. This will simplify further introduction of new formatters.
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
---
tests/qemu-iotests/qcow2_format.py | 35 +++++++++++++++++++++---------
1 file changed, 25 insertions(+), 10 deletions(-)
diff --git a/tests/qemu-iotests/qcow2_format.py
b/tests/qemu-iotests/qcow2_format.py
index d71f578377..ceb09bde5a 100644
--- a/tests/qemu-iotests/qcow2_format.py
+++ b/tests/qemu-iotests/qcow2_format.py
@@ -2,6 +2,25 @@ import struct
import string
+class Qcow2Field:
+
+ def __init__(self, value):
+ self.value = value
+
+ def __str__(self):
+ return str(self.value)
+
+
+class Flags64(Qcow2Field):
+
+ def __str__(self):
+ bits = []
+ for bit in range(64):
+ if self.value & (1 << bit):
+ bits.append(bit)
+ return str(bits)
+
+
class Qcow2StructMeta(type):
# Mapping from c types to python struct format
@@ -46,14 +65,10 @@ class Qcow2Struct(metaclass=Qcow2StructMeta):
def dump(self):
for f in self.fields:
value = self.__dict__[f[2]]
- if f[1] == 'mask':
- bits = []
- for bit in range(64):
- if value & (1 << bit):
- bits.append(bit)
- value_str = str(bits)
- else:
+ if isinstance(f[1], str):
value_str = f[1].format(value)
+ else:
+ value_str = str(f[1](value))
print('{:<25} {}'.format(f[2], value_str))
@@ -93,9 +108,9 @@ class QcowHeader(Qcow2Struct):
('u64', '{:#x}', 'snapshot_offset'),
# Version 3 header fields
- ('u64', 'mask', 'incompatible_features'),
- ('u64', 'mask', 'compatible_features'),
- ('u64', 'mask', 'autoclear_features'),
+ ('u64', Flags64, 'incompatible_features'),
+ ('u64', Flags64, 'compatible_features'),
+ ('u64', Flags64, 'autoclear_features'),
('u32', '{}', 'refcount_order'),
('u32', '{}', 'header_length'),
)
--
2.21.0
- Re: [PATCH v4 06/12] qcow2_format.py: use strings to specify c-type of struct fields, (continued)
- [PATCH v4 07/12] qcow2_format.py: separate generic functionality of structure classes, Vladimir Sementsov-Ogievskiy, 2020/06/04
- [PATCH v4 03/12] qcow2_format.py: drop new line printing at end of dump(), Vladimir Sementsov-Ogievskiy, 2020/06/04
- [PATCH v4 05/12] qcow2_format.py: use modern string formatting, Vladimir Sementsov-Ogievskiy, 2020/06/04
- [PATCH v4 10/12] qcow2_format: refactor QcowHeaderExtension as a subclass of Qcow2Struct, Vladimir Sementsov-Ogievskiy, 2020/06/04
- [PATCH v4 08/12] qcow2_format.py: add field-formatting class,
Vladimir Sementsov-Ogievskiy <=
- [PATCH v4 04/12] qcow2_format.py: use tuples instead of lists for fields, Vladimir Sementsov-Ogievskiy, 2020/06/04
- [PATCH v4 11/12] qcow2: QcowHeaderExtension print names for extension magics, Vladimir Sementsov-Ogievskiy, 2020/06/04
- [PATCH v4 12/12] qcow2_format.py: dump bitmaps header extension, Vladimir Sementsov-Ogievskiy, 2020/06/04