home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power-Programmierung
/
CD1.mdf
/
pascal
/
library
/
dos
/
asm_sour
/
file.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1984-07-21
|
19KB
|
552 lines
{ $LIST+, $DEBUG+, $BRAVE+, $LINESIZE:132, $PAGESIZE:80, $OCODE+ }
{ $ERRORS:50, $MATHCK+, $RANGECK+, $INITCK+, $INDEXCK+, $ENTRY+ }
{ $LINE+, $RUNTIME+, $SYMTAB+, $WARN+, $GOTO- }
{ $TITLE:'FILE DATA BASE --- AEM$SCRATCH' }
{ $MESSAGE:'PASCAL - COMPILATION OPTIONS SET' }
{ $MESSAGE:'SYSTEM - COMPILATION BEGINS' }
{$LIST-}
{$INCLUDE:'A:FILKQQ.INC'}
{$INCLUDE:'A:FILUQQ.INC'}
{$LIST+}
program file_code (input,output); uses filkqq,filuqq;
const
maxname = 20;
maxstrg = 30;
blank = ' ';
type
stindex = byte;
idxrng = 0..30;
varstrng = lstring(maxname);
fixstrng = string(maxname);
maxstrng = string(maxstrg);
maxlstrng = lstring(maxstrg);
entrytype = record
name : record
lastname, firstname : fixstrng;
midinit : char
end;
addr : record
street : maxstrng;
city : fixstrng;
state : string (2);
zip : string(5)
end;
phone : record
number : string(8);
areacod : string(3)
end;
dob : string(8)
end;
nodeptr = ^node;
node = record
entry : entrytype;
next : nodeptr
end;
VAR [STATIC]
hol : nodeptr;
reccount : integer;
recfil : file of entrytype;
curtime, curdate : string(10);
option : char;
length : idxrng;
saved : boolean;
procedure recdisp (const curdisp : nodeptr; const reccount : integer); extern;
procedure expand; extern; {expand the cursor to a large block}
procedure contract; extern; {contract the cursor to normal scan line}
procedure endxqq; extern;
procedure getdata (var newrecord : entrytype); extern;
procedure view (const hol : nodeptr); extern;
procedure beep;external;
procedure date (var s : string); extern;
procedure time (var s : string); extern;
procedure locate (row, column : integer); extern;
procedure cls; extern;
procedure keyboard (var temp : string; var length:idxrng; width:integer); extern;
procedure browse (const hol : nodeptr; const reccount : integer);
var
option : char;
length : idxrng;
current : nodeptr;
count : integer;
label exit;
begin
count := 0;
time (curtime); date (curdate);
current := hol;
while current <> nil do
begin
count := count + 1;
recdisp (current,reccount);
current := current^.next; {get next record}
locate (20,1); write (output, null : 60);
locate (22,1); write (output, null : 60);
locate (23,1); write (output, null : 60);
if current = nil then goto exit;
locate (23,1); write (output, count : 1, ' of ', reccount : 1);
locate (23,70); write (output, 'More...');
keyboard (option,length,1)
end;
exit:
locate (23,1); write (output, null:78);
locate (23,1); write (output, 'End'); locate (23,70); write (output, 'EOF');
locate (24,1); write (output, null:78);
locate (24,1); write (output, 'Strike any key to return to primary options');
keyboard (option,length,1);
return
end; {procedure}
procedure menu_display;
begin
cls;
locate (22, 1);
time (curtime);
write (output, 'Time: ', curtime, null:4, 'Date: ', curdate);
locate (2,26);
write (output, 'PRIMARY OPTIONS');
locate (4,5); write (output, '<I>nsert NEW record');
locate (4,45); write (output, '<D>elete OLD record');
locate (5,5); write (output, '<U>pdate OLD record');
locate (5,45); write (output, '<V>iew OLD record');
locate (6,5); write (output, '<B>rowse current file');
locate (6,45); write (output, '<F>ile with save');
locate (7,05); write (output, '<A>bort without save');
locate (10,5); write (output, 'OPTIONS (');
write (output, 'I');
if hol <> nil then write (output,'DUVBF') else write (output, blank,blank,blank,blank,blank);
write (output, 'A)');
write (output, ' --> ')
end;
procedure lookup (const key : entrytype; var current,previous : nodeptr;
const hol : nodeptr; var found : boolean) [public];
var
notfound : boolean; {true if next node must be examined}
begin
previous := nil; notfound := true; current := hol;
found := false;
while notfound and (current <> nil) do
with current^ do
if key.name.lastname <= entry.name.lastname then
notfound := false
else {move pointers to next node and look again}
begin
previous := current;
current := next
end;
if current <> nil then {see if the name was found}
if key.name.lastname = current^.entry.name.lastname then
found := true
else found := false
end; {procedure listsearch}
procedure initialize (var hol : nodeptr;
var reccount : integer);
var skipchar, fstat : char;
i : idxrng;
current, newnode, previous : nodeptr;
found : boolean;
begin
cls;
expand;
reccount := 0;
hol := nil;
locate (1,1);
time (curtime);
date (curdate);
write (output, 'Execution on: ', curtime : 12, curdate);
locate (3,1);
write (output, 'Enter filename to update --> ');
readfn (input, recfil);
locate (5,1);
readln (input);
write ('Is this file new? (Y/N) : ');
readln (input, fstat);
if (fstat = 'n') OR (fstat = 'N') THEN
begin
recfil.trap := true;
reset (recfil); {reset does performs an implied get operation}
if recfil.errs <> 00 then {file not found or disk error}
begin
writeln (output, 'File not on volume, or Disk error');
contract;
endxqq {library terminate call}
end;
writeln (output);
writeln (output, 'Existing file, opened');
writeln (output);
{$NILCK-} {stop nil checking temporarily}
while not eof (recfil) do {load the list with existing file}
begin
new(newnode);
newnode^.entry := recfil^;
current := hol; previous := nil;
lookup (newnode^.entry,current,previous,hol,found);
reccount := reccount + 1;
get (recfil);
if previous <> nil then
begin
newnode^.next := previous^.next;
previous^.next := newnode
end
else
begin
newnode^.next := hol;
hol := newnode
end
end
end
else
begin
writeln (output);
writeln (output);
writeln (output, 'New file');
writeln (output, 'File will be created');
rewrite (recfil);
writeln (output, 'Created')
end;
locate (15,1);
write (output, 'Hit <ENTER> to continue...');
keyboard (skipchar, i, 1);
cls;
writeln (output)
{$NILCK+} {restart nil reference checking}
end;
procedure updrec (var hol : nodeptr; const reccount : integer);
var
tmpstrng : maxstrng;
temp : entrytype;
current, previous : nodeptr;
found : boolean;
select : char;
maxlen, length, i : idxrng;
procedure chngstrng (var curstrng : string; const newstrng : string; const length: idxrng; maxlen : idxrng);
var
j : idxrng;
begin
for j := 1 to length do
curstrng [j] := newstrng [j];
for j := length+1 to maxlen do
curstrng [j] := blank
end; {procedure}
begin {updrec}
current := hol;
cls; time (curtime);
locate (1,1);
write (output, 'Page: UPDATE', null : 4, 'Primary key cannot be modified');
locate (2,1); write (output, 'Time: ', curtime, null:3, 'Date: ', curdate);
locate (5,1); write (output, 'Enter LAST name to modify --> ');
locate (5,32); for i := 1 to 20 do write (output, '.');
locate (5,32); keyboard (temp.name.lastname, length, 20);
for i := length + 1 to 20 do
[ write (output, blank);
temp.name.lastname [i] := blank ];
locate (4,1); write (output, '*Update Record: ', temp.name.lastname);
lookup (temp,current,previous,hol,found);
if found then
begin
recdisp (current, reccount);
with current^.entry do
begin
locate (6,13); keyboard (tmpstrng, length, 20);
if length > 0 then {change string}
chngstrng (name.firstname, tmpstrng, length, 20);
locate (6,56); keyboard (tmpstrng, length, 1);
if length > 0 then
chngstrng (name.midinit, tmpstrng, length, 1);
locate (11,9); keyboard (tmpstrng, length, 30);
if length > 0 then
chngstrng (addr.street, tmpstrng, length, 30);
locate (12, 7); keyboard (tmpstrng, length, 20);
if length > 0 then
chngstrng (addr.city, tmpstrng, length, 20);
locate (12,48); keyboard (tmpstrng, length, 2);
if length > 0 then
chngstrng (addr.state, tmpstrng, length,2 );
locate (12,66); keyboard (tmpstrng, length, 5);
if length > 0 then
chngstrng (addr.zip, tmpstrng, length, 5);
locate (14,12); keyboard (tmpstrng, length, 3);
if length > 0 then
chngstrng (phone.areacod, tmpstrng, length, 3);
locate (14,24); keyboard (tmpstrng, length, 8);
if length > 0 then
chngstrng (phone.number, tmpstrng, length, 8);
end;
locate (20,1 ); write (output, null : 60);
locate (22,1 ); write (output, null : 60);
locate (20,1 ); write (output, '*Modified.');
locate (22,1 ); write (output, 'Strike any key to return to primary options...');
keyboard (select, i, 1);
return {to caller -- primary options}
end
else {record requested is not found}
begin
cls;
locate (1,1); write (output, '*UPDATE');
locate (4,1); write (output, 'Search failure:');
locate (6,1); write (output, 'Record: ', temp.name.lastname, ' Not found -- Update not done');
locate (8,1); write (output, 'Strike any key to return to primary options...');
keyboard (select, i, 1);
return
end
end; {procedure}
procedure insrec (var hol : nodeptr; var reccount : integer);
var
temp : entrytype;
newnode, current, previous : nodeptr;
found : boolean;
select : char;
i : idxrng;
begin
getdata (temp);
lookup (temp, current, previous, hol, found);
if not found then {insert the record}
begin
reccount := reccount + 1;
new (newnode);
newnode^.entry := temp;
if previous <> nil then
begin
newnode^.next := previous^.next;
previous^.next := newnode
end
else {node goes at the head of the list (hol)}
begin
newnode^.next := hol;
hol := newnode
end;
locate (23,1);
write ('*** NEW record, Saved: (# ',reccount:1,') ', temp.name.lastname);
locate (24,1); write ('Strike any key to continue...');
keyboard (select, i, 1)
end
else {this record already exists}
begin
cls;
locate (2,1);
write (output, '*** Unable to insert record:');
locate (4,1);
write (output, '*** ', temp.name.lastname, ' Already exists');
locate (5,1);
write (output, '*** DUPLICATE primary keys are not allowed');
locate (20,1);
write ('[U]pdate, or [R]eturn --> ');
keyboard (select, i, 1);
if (select = 'U') or (select = 'u') then
updrec (hol,reccount)
else
return
end
end;
procedure delrec (var hol : nodeptr; var reccount : integer);
var
newnode, current, previous : nodeptr;
found : boolean;
select : char;
i, length : idxrng;
lnam : fixstrng;
temp : entrytype;
procedure delrcrd (var hol : nodeptr);
begin {all the search variables are in a level above this, and visible}
if previous <> nil then
previous^.next := current^.next
else
hol := current^.next;
dispose (current);
reccount := reccount - 1
end; {delrcrd}
begin {delrec}
cls;
if hol = nil then {no records to save}
begin
locate (1,1);
write (output, 'Internal file contains NO records.');
locate (3,1);
write (output, 'No records to delete now.');
locate (7,1);
write (output, 'Strike any key to return to primary options');
keyboard (select,i,1);
return
end;
locate (1,1);
time (curtime);
write (output, 'Delete record: ', curtime, null : 3, curdate);
locate (1,70); write (output, 'DEL');
locate (2,1);
write (output, 'Page: DEL: <File unchanged>');
locate (5,1);
write (output, 'Enter LAST name of record to delete --> ');
locate (5,42); for i := 1 to 20 do write (output, '.');
locate (5,42); keyboard (lnam, length, 20);
beep; for i := length+1 to 20 do write (output, blank);
temp.name.lastname := lnam;
for i := length + 1 to 20 do {pad out garbage from asm routine}
temp.name.lastname [i] := blank;
lookup (temp, current, previous, hol, found);
if not found then
begin
locate (8,1);
write (output, '*** Requested record not found (');
for i := 1 to length do
write (output, lnam[i]);
write (output, ')');
locate (9,1);
write (output, '*** File unable to be modified');
locate (15,1);
write (output, 'Strike any key to return to primary options');
keyboard (select,i,1)
end
else {record will be deleted}
begin
locate (8,1);
write (output, '*** Requested record located:');
locate (9,1);
write (output, '*** Delete? --> ');
keyboard (select,length,1);
if (select = 'Y') or (select = 'y') then
delrcrd (hol)
else
begin
locate (15,1);
write (output, 'Record delete NOT confirmed');
locate (17,1);
write (output, 'Strike any key to return to primary options');
keyboard (select,i,1);
return
end
end
end; {procedure}
procedure filrec (const hol : nodeptr; const reccount : integer;
var saved : boolean);
var
i : idxrng;
select : char;
current : nodeptr;
begin
cls;
if hol = nil then {no records to save}
begin
locate (1,1);
write (output, 'Internal file contains NO records.');
locate (3,1);
write (output, 'File remains unchanged.');
locate (7,1);
write (output, 'Strike any key to return to primary options');
keyboard (select,i,1);
return
end;
locate (1,1);
write (output, 'File records:',null:10, reccount : 1, ' Records to be saved');
locate (1,70);
write (output, 'FILE');
locate (2,1);
write (output, 'PAGE: SAVE', null : 10, 'Permanent File Modification');
locate (3,1);
time (curtime);
write (output, 'File will be rewritten', ' Time: ', curtime, null : 4, 'Date: ', curdate);
locate (10,1);
write (output, 'Writing ', reccount : 1, ' record(s) on file');
locate (12,1);
write (output, 'Writing ', sizeof(hol^.entry) * wrd(reccount) : 1 : 16,
'H bytes ', '(',sizeof(hol^.entry) * wrd(reccount): 1, ')');
rewrite (recfil);
current := hol;
while current <> nil do
begin
recfil^ := current^.entry;
put (recfil);
current := current^.next
end;
locate (15,1);
close (recfil);
reset (recfil);
write (output, 'Completed');
locate (20,1); write (output, 'Strike any key to return to primary options');
keyboard (select,i,1);
saved := true
end; {procedure}
begin {main}
date (curdate);
time (curtime);
cls;
saved := false;
initialize (hol, reccount);
menu_display;
keyboard (option,length,1);
while not (option in ['A','a']) do
begin
case option of
'I','i' : insrec (hol, reccount);
'D','d' : delrec (hol, reccount);
'F','f' : filrec (hol, reccount,saved);
'U','u' : updrec (hol, reccount);
'V','v' : view (hol);
'B','b' : browse (hol,reccount);
otherwise beep
end; {case}
menu_display;
keyboard (option,length,1)
end;
cls;
if not saved and (hol <> nil) then {file modified, not saved}
begin
locate (1,1);
write (output, 'Record file has not been saved.');
locate (3,1);
write (output, 'Internal file contains: ', sizeof(hol^.entry) * wrd(reccount) : 1, null:3,
'(',sizeof(hol^.entry) * wrd(reccount):1:16,'H) bytes');
locate (5,1); write (output, 'Continue ABORT sequence, with no save? ');
keyboard (option,length,1);
if not (option in ['Y','y']) then
begin
locate (7,1); write (output, 'File will be saved');
filrec (hol, reccount, saved)
end
else
begin
locate (7,1); write (output, 'Abort confirmed.');
locate (8,1); write (output, 'Input file unchanged.')
end
end; {if not saved}
writeln (output);
writeln (output);
locate (20,1); write (output, null : 60);
locate (20,1); write (output, 'Returning to DOS');
writeln (output);
writeln (output,' EOJ :');
time (curtime);
contract;
locate (23,1); write (output, 'Execution terminated normally on ', curdate, null:2, curtime)
end.