home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
simtel
/
sigm
/
vols000
/
vol079
/
eraq.pli
< prev
next >
Wrap
Text File
|
1984-04-29
|
4KB
|
174 lines
/* eraq - conditional file erase program (with query)
The default fcb (from the command line) is used to search for
matching files and each match is printed on the console for
delete confirmation. A table is built of files to be deleted
so as to not lose the search position in the directory.
The maximum number of fcbs in the table is given by LIST_LNGTH
below, if this number is exceeded or free space exhausted the
table entries are deleted and the search restarted. */
eraq: procedure options(main);
%replace
TRUE by '1'b,
FALSE by '0'b,
VERSION by 'ERAQ 1.0',
VERDATE by '02/05/81',
HELP_CMD by 'HELP ',
EOF by '^Z',
INTRRPT by '^C',
LIST_LNGTH by 512;
%include 'diomod.dcl';
declare
version_date char(8) external static init(VERDATE);
declare
1 default1 based(dfcb0()),
3 space fixed(7),
3 command char(8);
declare
fcbp pointer,
1 dir_fcb based(fcbp),
3 drive fixed(7),
3 fname char(8),
3 ftype char(3),
3 fext fixed(7);
declare
1 del_fcb based,
3 dr fixed(7),
3 fn char(8),
3 ft char(3),
3 fe fixed(7);
declare
1 default_fcb based(dfcb0()),
3 spacer bit(8),
3 name char(11);
declare
delp(LIST_LNGTH) pointer,
drv bin fixed(7) based(dfcb0()),
dir_mask(0:127) bit(8) based(dbuff()),
(i,n) bin fixed static init(0);
on error(7) begin;
n = n - 1;
put skip list('List space exhausted');
call delete_list;
do i = 1 to n;
free delp(i)->del_fcb;
end;
n = 0;
go to redo;
end;
put list(VERSION);
if command = HELP_CMD then do;
put skip list('ERAQ - Erase with Query');
put skip(2) list('Command line:');
put list(' ERAQ <ambiguous filename>');
put skip(2);
call reboot();
end;
redo:
PUT SKIP;
if index(default_fcb.name,'?') = 0 then do;
call delete(dfcb0());
end;
else do;
call setdma(dbuff());
i = sear(dfcb0());
if i > -1 then do;
do while(i > -1);
unspec(i) = unspec(i) & '00000011'b; /* for CP/M 1.4 */
fcbp = addr(dir_mask(i * 32));
if drive = user() then do;
drive = drv;
if query() then
call add_to_list;
i = searn();
end;
end;
call delete_list;
end;
else
put skip list('File not found');
end;
call reboot();
/* user - procedure to get user number if version > = cp/m 2.0 */
user: procedure returns(fixed(7));
if vers() = '0000'b4 then
return(0);
else
return(getusr());
end user;
/* add_to_list - add fcb to delete list */
add_to_list: procedure;
n = n + 1;
if n > LIST_LNGTH then
signal error(7);
allocate del_fcb set(delp(n));
delp(n)->del_fcb = dir_fcb;
end add_to_list;
/* delete_list - delete fcbs in delete list */
delete_list: procedure;
put skip list('Deleting: ');
do i = 1 to n;
put list('.');
call delete(delp(i));
call abort_test;
end;
put skip list(n,'file(s) deleted');
end delete_list;
/* query - query and delete if response is 'y'es */
query: procedure returns(bit(1));
declare
c char(1);
put skip;
if drive > 0 then
put list(ascii(64+drive)||':');
put list(fname||'.'||ftype,'?');
c = rdcon();
if c = EOF then do;
call delete_list;
call reboot();
end;
else if c = INTRRPT then
call reboot();
else if translate(c,'Y','y') = 'Y' then
return(TRUE);
else
return(FALSE);
end query;
/* abort_test - abort if console character */
abort_test: procedure;
dcl c char(1);
if break() then do;
c = rdcon();
put skip list('Abort (Y/N)? ');
c = rdcon();
if c = 'Y' | c ='y' then do;
put skip list('Aborted');
call reboot();
end;
end;
end abort_test;
end eraq;