mirror of
https://github.com/softwarejanitor/DOS33.git
synced 2024-12-30 11:30:41 +00:00
Added subdir functionality
This commit is contained in:
parent
4ad157c616
commit
bc21aadf56
55
ProDOS.pm
55
ProDOS.pm
@ -265,7 +265,7 @@ sub parse_key_vol_dir_blk {
|
|||||||
if ($storage_type != 0) {
|
if ($storage_type != 0) {
|
||||||
my $f_type = $ftype{$file_type};
|
my $f_type = $ftype{$file_type};
|
||||||
$f_type = sprintf("\$%02x", $file_type) unless defined $f_type;
|
$f_type = sprintf("\$%02x", $file_type) unless defined $f_type;
|
||||||
push @files, { 'filename' => $fname, 'ftype' => $f_type, 'used' => $blocks_used, 'mdate' => $mdate, 'cdate' => $cdate, 'atype' => $aux_type, 'atype' => $atype, 'access' => $access, 'eof' => $endfile };
|
push @files, { 'filename' => $fname, 'ftype' => $f_type, 'used' => $blocks_used, 'mdate' => $mdate, 'cdate' => $cdate, 'atype' => $aux_type, 'atype' => $atype, 'access' => $access, 'eof' => $endfile, 'keyptr' => $key_pointer };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -331,7 +331,7 @@ sub parse_vol_dir_blk {
|
|||||||
if ($storage_type != 0) {
|
if ($storage_type != 0) {
|
||||||
my $f_type = $ftype{$file_type};
|
my $f_type = $ftype{$file_type};
|
||||||
$f_type = sprintf("\$%02x", $file_type) unless defined $f_type;
|
$f_type = sprintf("\$%02x", $file_type) unless defined $f_type;
|
||||||
push @files, { 'filename' => $fname, 'ftype' => $f_type, 'used' => $blocks_used, 'mdate' => $mdate, 'cdate' => $cdate, 'atype' => $aux_type, 'atype' => $atype, 'access' => $access, 'eof' => $endfile };
|
push @files, { 'filename' => $fname, 'ftype' => $f_type, 'used' => $blocks_used, 'mdate' => $mdate, 'cdate' => $cdate, 'atype' => $aux_type, 'atype' => $atype, 'access' => $access, 'eof' => $endfile, 'keyptr' => $key_pointer };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -362,7 +362,7 @@ sub parse_subdir_hdr_blk {
|
|||||||
|
|
||||||
$debug = 1 if defined $dbg && $dbg;
|
$debug = 1 if defined $dbg && $dbg;
|
||||||
|
|
||||||
my ($prv_vol_dir_blk, $nxt_vol_dir_blk, $storage_type_name_length, $subdir_name, $creation_ymd, $creation_hm, $version, $min_version, $access, $entry_length, $entries_per_block, $file_count, $parent_pointer, $parent_entry, $parent_entry_length, $dir_ents) = unpack $subdir_hdr_blk_tmpl, $buf;
|
my ($prv_vol_dir_blk, $nxt_vol_dir_blk, $storage_type_name_length, $subdir_name, $foo, $creation_ymd, $creation_hm, $version, $min_version, $access, $entry_length, $entries_per_block, $file_count, $parent_pointer, $parent_entry, $parent_entry_length, $dir_ents) = unpack $subdir_hdr_blk_tmpl, $buf;
|
||||||
|
|
||||||
my $storage_type = $storage_type_name_length & 0xf0;
|
my $storage_type = $storage_type_name_length & 0xf0;
|
||||||
my $name_length = $storage_type_name_length & 0x0f;
|
my $name_length = $storage_type_name_length & 0x0f;
|
||||||
@ -374,11 +374,16 @@ sub parse_subdir_hdr_blk {
|
|||||||
my @files = ();
|
my @files = ();
|
||||||
for (my $i = 0; $i < 12; $i++) {
|
for (my $i = 0; $i < 12; $i++) {
|
||||||
my $storage_type_name_length = shift @flds;
|
my $storage_type_name_length = shift @flds;
|
||||||
|
print sprintf("storage_type_name_length=%02x\n", $storage_type_name_length) if $debug;
|
||||||
my $storage_type = $storage_type_name_length & 0xf0;
|
my $storage_type = $storage_type_name_length & 0xf0;
|
||||||
|
print sprintf("storage_type=%02x\n", $storage_type) if $debug;
|
||||||
my $name_length = $storage_type_name_length & 0x0f;
|
my $name_length = $storage_type_name_length & 0x0f;
|
||||||
|
print sprintf("name_length=%02x\n", $name_length) if $debug;
|
||||||
my $file_name = shift @flds;
|
my $file_name = shift @flds;
|
||||||
my $fname = substr($file_name, 0, $name_length);
|
my $fname = substr($file_name, 0, $name_length);
|
||||||
|
print sprintf("fname=%s\n", $fname) if $debug;
|
||||||
my $file_type = shift @flds;
|
my $file_type = shift @flds;
|
||||||
|
print sprintf("file_type=%02x\n", $file_type) if $debug;
|
||||||
my $key_pointer = shift @flds;
|
my $key_pointer = shift @flds;
|
||||||
my $blocks_used = shift @flds;
|
my $blocks_used = shift @flds;
|
||||||
my $eof = shift @flds;
|
my $eof = shift @flds;
|
||||||
@ -402,11 +407,11 @@ sub parse_subdir_hdr_blk {
|
|||||||
if ($storage_type != 0) {
|
if ($storage_type != 0) {
|
||||||
my $f_type = $ftype{$file_type};
|
my $f_type = $ftype{$file_type};
|
||||||
$f_type = sprintf("\$%02x", $file_type) unless defined $f_type;
|
$f_type = sprintf("\$%02x", $file_type) unless defined $f_type;
|
||||||
push @files, { 'filename' => $fname, 'ftype' => $f_type, 'used' => $blocks_used, 'mdate' => $mdate, 'cdate' => $cdate, 'atype' => $aux_type, 'atype' => $atype, 'access' => $access, 'eof' => $endfile };
|
push @files, { 'filename' => $fname, 'ftype' => $f_type, 'used' => $blocks_used, 'mdate' => $mdate, 'cdate' => $cdate, 'atype' => $aux_type, 'atype' => $atype, 'access' => $access, 'eof' => $endfile, 'keyptr' => $key_pointer };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return $prv_vol_dir_blk, $nxt_vol_dir_blk, $storage_type_name_length, $subdir_name, $creation_ymd, $creation_hm, $version, $min_version, $access, $entry_length, $entries_per_block, $file_count, $parent_pointer, $parent_entry, $parent_entry_length, @files;
|
return $prv_vol_dir_blk, $nxt_vol_dir_blk, $storage_type_name_length, $subdir_nm, $creation_ymd, $creation_hm, $version, $min_version, $access, $entry_length, $entries_per_block, $file_count, $parent_pointer, $parent_entry, $parent_entry_length, @files;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub get_subdir_hdr {
|
sub get_subdir_hdr {
|
||||||
@ -418,13 +423,34 @@ sub get_subdir_hdr {
|
|||||||
|
|
||||||
if (read_blk($pofile, $subdir_blk, \$buf)) {
|
if (read_blk($pofile, $subdir_blk, \$buf)) {
|
||||||
dump_blk($buf) if $debug;
|
dump_blk($buf) if $debug;
|
||||||
dump_blk($buf);
|
|
||||||
return parse_subdir_hdr_blk($buf, $debug);
|
return parse_subdir_hdr_blk($buf, $debug);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub list_files {
|
||||||
|
my ($pofile, $pre, $dirname, $files) = @_;
|
||||||
|
|
||||||
|
print "$pre/$dirname\n";
|
||||||
|
|
||||||
|
foreach my $file (@{$files}) {
|
||||||
|
my $lck = ' ';
|
||||||
|
if ($file->{'access'} == 0x01) {
|
||||||
|
$lck = '*';
|
||||||
|
}
|
||||||
|
print sprintf("$pre%s%-15s %3s %7d %16s %16s %7s %s\n", $lck, $file->{'filename'}, $file->{'ftype'}, $file->{'used'}, $file->{'mdate'}, $file->{'cdate'}, $file->{'eof'}, $file->{'atype'});
|
||||||
|
|
||||||
|
if ($file->{'ftype'} eq 'DIR') {
|
||||||
|
my $subdir_blk = $file->{'keyptr'};
|
||||||
|
|
||||||
|
my ($prv_vol_dir_blk, $nxt_vol_dir_blk, $storage_type_name_length, $subdir_name, $creation_ymd, $creation_hm, $version, $min_version, $access, $entry_length, $entries_per_block, $file_count, $parent_pointer, $parent_entry, $parent_entry_length, @subfiles) = get_subdir_hdr($pofile, $subdir_blk, $debug);
|
||||||
|
|
||||||
|
list_files($pofile, ' ' . $pre, $subdir_name, \@subfiles);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#
|
#
|
||||||
# Get disk catalog.
|
# Get disk catalog.
|
||||||
#
|
#
|
||||||
@ -445,6 +471,14 @@ sub cat {
|
|||||||
$lck = '*';
|
$lck = '*';
|
||||||
}
|
}
|
||||||
print sprintf("%s%-15s %3s %7d %16s %16s %7s %s\n", $lck, $file->{'filename'}, $file->{'ftype'}, $file->{'used'}, $file->{'mdate'}, $file->{'cdate'}, $file->{'eof'}, $file->{'atype'});
|
print sprintf("%s%-15s %3s %7d %16s %16s %7s %s\n", $lck, $file->{'filename'}, $file->{'ftype'}, $file->{'used'}, $file->{'mdate'}, $file->{'cdate'}, $file->{'eof'}, $file->{'atype'});
|
||||||
|
|
||||||
|
if ($file->{'ftype'} eq 'DIR') {
|
||||||
|
my $subdir_blk = $file->{'keyptr'};
|
||||||
|
|
||||||
|
my ($prv_vol_dir_blk, $nxt_vol_dir_blk, $storage_type_name_length, $subdir_name, $creation_ymd, $creation_hm, $version, $min_version, $access, $entry_length, $entries_per_block, $file_count, $parent_pointer, $parent_entry, $parent_entry_length, @subfiles) = get_subdir_hdr($pofile, $subdir_blk, $debug);
|
||||||
|
my $pre = ' ';
|
||||||
|
list_files($pofile, ' ' . $pre, $subdir_name, \@subfiles);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
my $vol_dir_blk = $nxt_vol_dir_blk;
|
my $vol_dir_blk = $nxt_vol_dir_blk;
|
||||||
@ -457,6 +491,15 @@ sub cat {
|
|||||||
$lck = '*';
|
$lck = '*';
|
||||||
}
|
}
|
||||||
print sprintf("%s%-15s %3s %7d %16s %16s %7s %s\n", $lck, $file->{'filename'}, $file->{'ftype'}, $file->{'used'}, $file->{'mdate'}, $file->{'cdate'}, $file->{'eof'}, $file->{'atype'});
|
print sprintf("%s%-15s %3s %7d %16s %16s %7s %s\n", $lck, $file->{'filename'}, $file->{'ftype'}, $file->{'used'}, $file->{'mdate'}, $file->{'cdate'}, $file->{'eof'}, $file->{'atype'});
|
||||||
|
|
||||||
|
if ($file->{'ftype'} eq 'DIR') {
|
||||||
|
my $subdir_blk = $file->{'keyptr'};
|
||||||
|
|
||||||
|
my ($prv_vol_dir_blk, $nxt_vol_dir_blk, $storage_type_name_length, $subdir_name, $creation_ymd, $creation_hm, $version, $min_version, $access, $entry_length, $entries_per_block, $file_count, $parent_pointer, $parent_entry, $parent_entry_length, @subfiles) = get_subdir_hdr($pofile, $subdir_blk, $debug);
|
||||||
|
|
||||||
|
my $pre = ' ';
|
||||||
|
list_files($pofile, ' ' . $pre, $subdir_name, \@subfiles);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
$vol_dir_blk = $nxt_vol_dir_blk;
|
$vol_dir_blk = $nxt_vol_dir_blk;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user