- newOrNil works like new, but sets the variable to nil if the heap allocation failed - change stdlib to use newOrNil in openfile and openvolumeid - changes to programs that use openvolumeid
52 lines
1.4 KiB
ObjectPascal
52 lines
1.4 KiB
ObjectPascal
(* Copyright 2021-2024 Sebastian Lederer. See the file LICENSE.md for details *)
|
|
program dumpdir;
|
|
var volname:string;
|
|
volid:integer;
|
|
|
|
(* we use some stuff internal to stdlib.pas *)
|
|
procedure getdirslot(volumeid:integer;slotNo:integer;var result:DirectorySlot;var error:integer);
|
|
external;
|
|
|
|
procedure dumpdir(volid:integer);
|
|
var dirs:DirectorySlot;
|
|
i:integer;
|
|
lastSlot:integer;
|
|
error:integer;
|
|
begin
|
|
lastSlot := volumeTable[volid].part.dirSize - 1;
|
|
openvolumeid(volid, error); (* we just ignore error here because
|
|
we should always have enough heap space *)
|
|
for i := 0 to lastSlot do
|
|
begin
|
|
getdirslot(volid, i, dirs, error);
|
|
with dirs do
|
|
begin
|
|
write('slot ', i, ' ', name, ' ', sizeBytes, ' G', generation);
|
|
if SlotFirst in flags then write(' First');
|
|
if SlotExtent in flags then write(' Extent');
|
|
if SlotReserved in flags then write(' Resvd');
|
|
if SlotDeleted in flags then write(' Del');
|
|
if SlotFree in flags then write(' Free');
|
|
if SlotEndScan in flags then write(' End');
|
|
writeln;
|
|
if SlotEndScan in flags then break;
|
|
end;
|
|
end;
|
|
|
|
closevolumeid(volid);
|
|
end;
|
|
|
|
begin
|
|
if ParamCount > 0 then
|
|
volname := ParamStr(1)
|
|
else
|
|
begin
|
|
write('Volume name> ');
|
|
readln(volname);
|
|
end;
|
|
volid := findvolume(volname);
|
|
if volid < 1 then
|
|
writeln('Volume not found.')
|
|
else
|
|
dumpdir(volid);
|
|
end.
|