home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
cpm
/
turbopas
/
tkermit.lbr
/
KDIR.PQS
/
KDIR.PAS
Wrap
Pascal/Delphi Source File
|
1985-02-09
|
7KB
|
192 lines
procedure adjust_fn(fileref : string15; var drive : string1;
var filename : string15; var filetype : string3);
(* This procedure converts a string into the standard CP/M format
for processing. This format is all upper case, and inserts ?'s
into the string if the wildcards ? or * are found in the string.
Finally, the string is expanded so spaces are placed in any
unfilled positions in the name. these are placed in the middle of
the filename, i.e. abc.de is converted to 'abc . de'.
*)
var
insert_pos, count : integer;
begin
for count := 1 to length(fileref) do (* convert to upper case *)
if (fileref[count] in ['a'..'z']) then
fileref[count] := chr(ord(fileref[count]) and $df);
if pos('.', fileref) <> 0 then (* separate the file name and type *)
begin
filename := copy(fileref, 1, pos('.', fileref) - 1);
filetype := copy(fileref, pos('.', fileref) + 1, 3);
end
else
begin
filename := fileref;
filetype := ''; (* no file type in this case *)
end;
if pos(':', filename) <> 0 then (* check for drive spec *)
begin
drive := copy(filename, 1, pos(':', filename) - 1);
delete(filename, 1, pos(':', filename));
if filename = '' then
begin
filename := '*';
filetype := '*';
end;
end
else
drive := '!'; (* dummy value for param *)
while (pos('*',filename) <> 0) do (* find any '*' wildcards *)
begin
insert_pos := pos('*', filename); (* find the spot *)
delete(filename, insert_pos, 1); (* get rid of * *)
while (length(filename) < 8) do
(* insert ?'s until filename is filled. Note that the first '*'
will fill the string, so any other *'s in the name will be
deleted and replaced with a single '?'. '*k*' will be
converted to '??????k?'
*)
insert('?', filename, insert_pos);
end;
while pos('*',filetype) <> 0 do (* do the same for the filetype *)
begin
insert_pos := pos('*', filetype);
delete(filetype, insert_pos, 1);
while (length(filetype) < 3) do
insert('?', filetype, insert_pos);
end;
while length(filename) < 8 do (* fill out the filename with spaces *)
filename := filename + ' ';
while length(filetype) < 3 do (* do the same for the filetype *)
filetype := filetype + ' ';
end; (* adjust_fn *)
procedure init_fcb(infile : string15);
(* initialize an fcb with a filename and filetype for use with BDOS
calls
*)
var
count : integer;
drive : string1;
filename : string[15];
filetype : string[3];
begin
adjust_fn(infile, drive, filename, filetype); (* put filespec in proper form *)
if drive in ['A'..'P'] then
fcb[1] := ord(drive) - 64 (* store the drive spec *)
else
fcb[1] := 0; (* use default drive *)
for count := 1 to 8 do (* put in the filename. Array operation, not string *)
fcb[1 + count] := ord(filename[count]);
for count := 1 to 3 do (* same for filetype. Must be integers here *)
fcb[9 + count] := ord(filetype[count]);
for count := 13 to 36 do (* rest of FCB is 0's *)
fcb[count] := 0;
end;
procedure searchfirst(var result : integer);
(* search for first BDOS call. Result is position in DMA buffer of
filespec, or 255 if no file is found *)
begin
result := bdos($11, addr(fcb));
end;
procedure searchnext(var result : integer);
(* search for next BDOS call. Result is same as above *)
begin
result := bdos($12, addr(fcb));
end;
procedure dir; (* generate directory listing *)
(* generate a directory listing. This is a CP/M dependent procedure and
would have to be changed for other operating systems. No size
information is printed
*)
var
filename : string[15];
filetype : string[3];
index, count, result : integer;
begin
if arg1 = '' then
arg1 := '*.*'; (* we'll read all the filenames *)
init_fcb(arg1); (* set up the FCB *)
bdos($1a, addr(dma)); (* set up the dma address *)
searchfirst(result); (* look for the first directory entry *)
count := 0; (* cont for formatting output into 4 per line *)
if result <> 255 then (* write the first filename *)
begin
writeln;
writeln('Directory listing for ', arg1);
writeln;
for index := ((result * 32) + 1) to ((result * 32) + 9) do
write(chr(dma[index]));
write('.');
for index := ((result * 32) + 10) to ((result * 32) + 12) do
write(chr(dma[index]));
write(' : ');
count := count + 1;
end
else
writeln('no file'); (* guess it doen't exist *)
while (result <> 255) do
begin
searchnext(result); (* keep looking *)
if result <> 255 then
begin
count := count + 1; (* bump the display counter *)
for index := (result * 32) + 1 to ((result * 32) + 9) do
write(chr(dma[index]));
write('.');
for index := ((result * 32) + 10) to ((result * 32) + 12) do
write(chr(dma[index]));
if ((count mod 5) = 0) then
writeln
else
write(' : ');
end;
end;
writeln;
end;
procedure delfile; (* delete the selected files *)
var
result : integer;
fileref : string15;
procedure deletefile(var result : integer);
begin
result := bdos($13, addr(fcb));
end;
begin (* delfile *)
if arg1 = '' then
begin
writeln;
write('Enter file(s) to erase: ');
readln(arg1);
end;
init_fcb(arg1);
deletefile(result);
if result in [0..3] then
writeln('File(s) deleted.')
else
writeln('File(s) not found.');
writeln;
end; (* delfile *)