From 6814241c2394a9fc8951969a78a1a3f4437f3e71 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Thu, 25 Aug 2022 20:21:24 -0300 Subject: [PATCH] OMFExtractor: Improve header parsing and add OCFExtractor --- biostools/__main__.py | 1 + biostools/extractors.py | 81 ++++++++++++++++++++++++++++++++++++++--- 2 files changed, 76 insertions(+), 6 deletions(-) diff --git a/biostools/__main__.py b/biostools/__main__.py index b6320b5..3ef8959 100644 --- a/biostools/__main__.py +++ b/biostools/__main__.py @@ -127,6 +127,7 @@ def extract_process(queue, abort_flag, multifile_lock, dir_number_path, next_dir ] file_extractors += [ extractors.IntelExtractor(), + extractors.OCFExtractor(), extractors.OMFExtractor(), extractors.TrimondExtractor(), extractors.InterleaveExtractor(), diff --git a/biostools/extractors.py b/biostools/extractors.py index b13d32c..0716a4c 100644 --- a/biostools/extractors.py +++ b/biostools/extractors.py @@ -2103,25 +2103,93 @@ class MBRUnsafeExtractor(MBRSafeExtractor): return True +class OCFExtractor(Extractor): + """Extract Fujitsu/ICL OCF BIOS files.""" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + # RLE header. + self._snipac_pattern = re.compile(b'''SNIPAC([0-9A-F]{2})([\\x00-\\xFF]{4})''') + + def _expand_rle(self, match): + length, = struct.unpack(' file_size: - return False - elif struct.unpack(' file_size - 112: + omf_size, = struct.unpack(' file_size: return False + self.debug_print('Size', omf_size, 'timestamp', match.group(2), 'signature', match.group(3)) # Create destination directory and stop if it couldn't be created. if not util.try_makedirs(dest_dir): @@ -2133,6 +2201,7 @@ class OMFExtractor(Extractor): in_f = open(file_path, 'rb') # Read header. + in_f.seek(header_offset) header = in_f.read(112) # Copy payload.