summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xconvertFileDs.py7
-rwxr-xr-xextractHintergrund.py7
2 files changed, 11 insertions, 3 deletions
diff --git a/convertFileDs.py b/convertFileDs.py
index 89e0cab..d5c234b 100755
--- a/convertFileDs.py
+++ b/convertFileDs.py
@@ -9,7 +9,7 @@ datastructure here. See EUMEL packet “file handling”.
import struct, copy
from collections import namedtuple
-from eumel import Dataspace, DataspaceTypeMismatch, HeapReferenceUnresolved
+from eumel import Dataspace, DataspaceTypeMismatch, HeapReferenceUnresolved, pagesize
Segment = namedtuple ('Segment', ['succ', 'pred', 'end'])
Sequence = namedtuple ('Sequence', ['index', 'segmentbegin', 'segmentend', 'lineno', 'lines'])
@@ -77,12 +77,13 @@ class FileDataspace (Dataspace):
Dataspace.__init__ (self, fd)
# header of the BOUND LIST (aka TYPE FILE)
+ start = fd.tell ()
self.used = self.parseSequence ()
self.parseInt (2)
self.parseSequence ()
self.parseSequence ()
self.parseInt (7)
- assert self.fd.tell () == 0x38
+ assert self.fd.tell ()-start == 0x30
rows = self.parseRows ()
@@ -150,6 +151,7 @@ if __name__ == '__main__':
parser = argparse.ArgumentParser(description='Convert EUMEL FILE dataspace into plain text file.')
parser.add_argument ('-v', '--verbose', help='Enable debugging messages', action='store_true')
+ parser.add_argument ('-s', '--skip', metavar='PAGES', type=int, default=0, help='Skip pages at the beginning of the file')
parser.add_argument ('file', help='Input file')
args = parser.parse_args ()
@@ -160,6 +162,7 @@ if __name__ == '__main__':
with open (args.file, 'rb') as fd:
try:
+ fd.seek (args.skip*pagesize)
ds = FileDataspace (fd)
linecount = len (ds.text.splitlines ())
if linecount != ds.used.lines:
diff --git a/extractHintergrund.py b/extractHintergrund.py
index 8f178a0..5795d8d 100755
--- a/extractHintergrund.py
+++ b/extractHintergrund.py
@@ -44,6 +44,7 @@ anchor = Struct(
Const(b"\xff"*4),
) * "System anchor block"
+assert pagesize//blockref.sizeof() == 128
blockTable = Array(pagesize//blockref.sizeof(), blockref)
# XXX: skip const
@@ -212,6 +213,10 @@ if __name__ == '__main__':
with open (f'{taskid:04d}_{dsid:04d}.ds', 'wb') as outfd:
os.ftruncate (outfd.fileno(), 0)
+ # the first page of a dataspace is used by the OS
+ # and not stored to the Hintergrund
+ outfd.seek (pagesize)
+
# get the first three pages
for ref in d.blocks:
copyblock (ref.value, fd, outfd)
@@ -219,7 +224,7 @@ if __name__ == '__main__':
# indirect block refs (level 4a)
assert len (d.blockTables) == 2
# first four entries of first table are empty and must not be written!
- copyBlockTable (d.blockTables[0].value, fd, outfd, 3)
+ copyBlockTable (d.blockTables[0].value, fd, outfd, 4)
copyBlockTable (d.blockTables[1].value, fd, outfd)
# segment tables (level 4b)