mirror of
https://github.com/robmcmullen/atrcopy.git
synced 2024-06-06 11:29:29 +00:00
Added file parsing in atari dos dirent
This commit is contained in:
parent
92fb9986b6
commit
3c98331cf6
|
@ -91,6 +91,12 @@ class Filesystem:
|
||||||
|
|
||||||
####
|
####
|
||||||
|
|
||||||
|
@property
|
||||||
|
def max_file_size(self):
|
||||||
|
return len(self.media)
|
||||||
|
|
||||||
|
####
|
||||||
|
|
||||||
def iter_segments(self):
|
def iter_segments(self):
|
||||||
if self.boot is not None:
|
if self.boot is not None:
|
||||||
yield self.boot
|
yield self.boot
|
||||||
|
|
|
@ -110,6 +110,7 @@ class AtariDosDirent(Dirent):
|
||||||
])
|
])
|
||||||
|
|
||||||
def __init__(self, filesystem, parent, file_num, start):
|
def __init__(self, filesystem, parent, file_num, start):
|
||||||
|
self.file_num = file_num
|
||||||
Dirent.__init__(self, filesystem, parent, file_num, start, 16)
|
Dirent.__init__(self, filesystem, parent, file_num, start, 16)
|
||||||
self.flag = 0
|
self.flag = 0
|
||||||
self.opened_output = False
|
self.opened_output = False
|
||||||
|
@ -124,10 +125,8 @@ class AtariDosDirent(Dirent):
|
||||||
self.basename = b''
|
self.basename = b''
|
||||||
self.ext = b''
|
self.ext = b''
|
||||||
self.is_sane = True
|
self.is_sane = True
|
||||||
self.current_sector = 0
|
|
||||||
self.current_read = 0
|
|
||||||
self.sectors_seen = None
|
|
||||||
self.parse_raw_dirent()
|
self.parse_raw_dirent()
|
||||||
|
self.get_file()
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return "File #%-2d (%s) %03d %-8s%-3s %03d" % (self.file_num, self.summary, self.starting_sector, self.basename.decode("latin1"), self.ext.decode("latin1"), self.num_sectors)
|
return "File #%-2d (%s) %03d %-8s%-3s %03d" % (self.file_num, self.summary, self.starting_sector, self.basename.decode("latin1"), self.ext.decode("latin1"), self.num_sectors)
|
||||||
|
@ -202,6 +201,33 @@ class AtariDosDirent(Dirent):
|
||||||
self.deleted = True
|
self.deleted = True
|
||||||
self._in_use = False
|
self._in_use = False
|
||||||
|
|
||||||
|
def get_file(self):
|
||||||
|
media = self.filesystem.media
|
||||||
|
offsets = np.empty(self.filesystem.max_file_size, dtype=np.uint32)
|
||||||
|
length = 0
|
||||||
|
next_sector = self.starting_sector
|
||||||
|
sectors_seen = set()
|
||||||
|
|
||||||
|
while next_sector > 0:
|
||||||
|
index, size = media.get_index_of_sector(next_sector)
|
||||||
|
num_bytes = media[index + size - 1]
|
||||||
|
file_num = media[index + size - 3] >> 2
|
||||||
|
if file_num != self.file_num:
|
||||||
|
raise errors.FileNumberMismatchError164(f"Expecting file {self.file_num}, found {file_num}")
|
||||||
|
sectors_seen.add(next_sector)
|
||||||
|
|
||||||
|
offsets[length:length + num_bytes] = np.arange(index, index+num_bytes)
|
||||||
|
length += num_bytes
|
||||||
|
|
||||||
|
next_sector = ((media[index + size - 3] & 0x3) << 8) + media[index + size - 2]
|
||||||
|
if next_sector in sectors_seen:
|
||||||
|
raise errors.InvalidFile(f"Bad sector pointer data: attempting to reread sector {next_sector}")
|
||||||
|
|
||||||
|
offsets = np.copy(offsets[0:length])
|
||||||
|
file_segment = Segment(media, offsets, name=self.filename)
|
||||||
|
self.segments = [file_segment]
|
||||||
|
return file_segment
|
||||||
|
|
||||||
def update_sector_info(self, sector_list):
|
def update_sector_info(self, sector_list):
|
||||||
self.num_sectors = sector_list.num_sectors
|
self.num_sectors = sector_list.num_sectors
|
||||||
self.starting_sector = sector_list.first_sector
|
self.starting_sector = sector_list.first_sector
|
||||||
|
|
|
@ -202,14 +202,13 @@ class Segment:
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def verbose_info(self):
|
def verbose_info(self):
|
||||||
|
lines = []
|
||||||
name = self.verbose_name or self.name
|
name = self.verbose_name or self.name
|
||||||
if self.rawdata.is_indexed:
|
lines.append(f"{name}: {len(self)} bytes")
|
||||||
s = "%s ($%04x bytes) non-contiguous file; file index of first byte: $%04x" % (name, len(self), self.rawdata.order[0])
|
for s in self.segments:
|
||||||
else:
|
v = s.segment_info(" ")
|
||||||
s = "%s ($%04x bytes)" % (name, len(self))
|
lines.extend(v)
|
||||||
if self.error:
|
return "\n".join(lines)
|
||||||
s += " error='%s'" % self.error
|
|
||||||
return s
|
|
||||||
|
|
||||||
def segment_info(self, indent=""):
|
def segment_info(self, indent=""):
|
||||||
lines = []
|
lines = []
|
||||||
|
@ -423,8 +422,8 @@ class Segment:
|
||||||
return comments
|
return comments
|
||||||
|
|
||||||
def set_comment_at(self, index, text):
|
def set_comment_at(self, index, text):
|
||||||
rawindex = self.get_raw_index(index)
|
rawindex = self.container_offset[index]
|
||||||
self.rawdata.extra.comments[rawindex] = text
|
self.container.comments[rawindex] = text
|
||||||
|
|
||||||
def set_comment(self, ranges, text):
|
def set_comment(self, ranges, text):
|
||||||
self.set_style_ranges(ranges, comment=True)
|
self.set_style_ranges(ranges, comment=True)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user