|
|
DataMuseum.dkPresents historical artifacts from the history of: RC4000/8000/9000 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about RC4000/8000/9000 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 11520 (0x2d00)
Types: TextFile
Names: »testpr4tx «
└─⟦01e83a425⟧ Bits:30008166 Bånd med SW8010 og SW8500 source code
└─⟦75ff9bef3⟧
└─⟦this⟧ »testpr4tx «
(
mode list.yes
lookup ttestprint
testprint=algol list.yes xref.yes bossline.yes
lib on.libsmmtpr testprint ttestprint
end
)
external
procedure test_print(doc,rec_no,coroutine,type,cur_clock,print,print_record);
string doc ;
integer rec_no,coroutine,type,cur_clock ;
boolean print ;
procedure print_record ;
begin
<************************************************************************
* *
* parameters: *
* ---------- *
* *
* doc call: document name of the backing storage file *
* holding the test records *
* *
* rec_no *) record number *
* call: = 0 start at first record *
* > 0 start after 'rec_no' records *
* < 0 start -'rec_no' records from logical end- *
* of-document *
* return: last read record number *
* *
* coroutine *) coroutine number *
* return: coroutine number in last read record *
* *
* type *) record type *
* return: record type in last read record *
* *
* cur_clock *) current clock, hhmmss *
* call: = 0 start at 'rec_no' record *
* > 0 start at the first record after 'rec_no' *
* record, where clock is greater than or *
* equal to 'cur_clock' *
* return: clock in last read record *
* *
* print print condition *
* = true if current record should be printed *
* = false if current record is skipped *
* *
* the condition is evaluated for each possible *
* record (jensens device), see below *
* *
* print_record procedure with formal parameters as follows *
* (they may not be changed by the procedure): *
* record integer array (1:8) *
* the record to be printed *
* rec_no integer *
* current record number *
* cur_date integer *
* current date, yymmdd *
* cur_clock integer *
* current clock, hhmmss *
* *
* *) the parameters are changed whenever a record is read; i.e. the *
* actual parameters can be used as operands in the print condition *
* in order to decide whether such a record may be printed or not *
* (jensens device). *
* *
* *
* function: *
* -------- *
* *
* after positioning according to 'rec_no' the records are scanned *
* until 'cur_clock' condition is satisfied. *
* subsequently the reading of records starts. the print condition is *
* evaluated for each record and - if it is true - the print_record *
* procedure is called. *
* the reading stops at logical end-of-document. *
* *
* logical end-of-document is met when at least one of the following *
* conditions is fulfilled *
* - physical end-of-document *
* - 'cur_date' < 80 01 01 or 'cur_date' > to day's date *
* - time in current record less than in previous record (or less *
* than zero) *
* *
* all exceptions besides 'end of document' are treated by std_error; *
* i e. the program.stops with a run time alarm. *
* *
* *
* examples: *
* -------- *
* *
* test_print(<:test:>,0,0,0,0,true,print_rec); *
* all records until logical end-of-document in the test record file *
* document 'test' is printed by means of the procedure print_rec. *
* *
* rec:= 200; *
* test_print(<:test:>,rec,0,0,0,rec <= 300,print_rec); *
* if rec < 301 then write(out,<:<10>file exhausted at record:>,rec); *
* the records from number 201 through 300 are printed; but if there is *
* not at least 300 records in the (logical) file a warning is written *
* on current output. *
* *
* rec:= -1000; *
* test_print(<:testfile:>,rec,cor,type,0, *
* cor = 1 or (cor mod 3 = 2 and *
* (type = 4 or type = 5 or type = 8)),print); *
* among the latest 1000 records in 'testfile' all records concerning *
* coroutine 1 are printed but if the records are produced by the co- *
* routines 2, 5, 8, ... only signal and wait records are printed; no *
* other records are printed. *
* *
* test_print(<:test:>,2000,cor,type,13 00 00,cor <> 0 or cor <> 7 or *
* type >= 1024,print_rec); *
* the 'test' file is started at the first record generated at 1 p.m. *
* (or later) after record number 2000 (exclusive). all user records *
* from all coroutines or system generated records not produced by *
* centrallogic or coroutine 7, are printed. *
* *
************************************************************************>
\f
integer
cur_date, <* yymmdd, corresponding to last_time *>
p_cur_clock, <* value of parameter cur_clock *>
rel_rec_no, <* number of records from logical end-of-document *>
res, <* value of last call of next_record *>
to_day; <* to day's date, yymmdd *>
integer field
cor, <* field in test record *>
operation; <* field in test record *>
long
last_time; <* last read time value from test record *>
long field
time; <* field in test record *>
integer array field
iaf; <* test record as integer array *>
zone
in(128,1,read_error);<* zone for test record document *>
\f
procedure read_error(in,status,halfwords);
zone in ;
integer status,halfwords ;
begin
integer array
zone_descr(1:20); <* zone description area *>
if logand(status,1 shift 18 <* end of document *>) <> 0 then
begin
get_zone6(in,zone_descr);
zone_descr(14):= zone_descr(19); <* record_base:= base_buffer_area *>
zone_descr(16):= 16; <* record_length:= 16 hw *>
set_zone6(in,zone_descr);
in.iaf.operation:= 3;
in.iaf.cor:= -1;
in.iaf.time:= -1;
status:= 0;
halfwords:= 128*4;
end
else
std_error(in,status,halfwords);
end;
integer
procedure next_record;
begin
real r;
next_record:= 0;
inrec6(in,16);
rec_no:= rec_no + 1;
type:= in.iaf.operation;
if type > 2 then
begin
coroutine:= abs in.iaf.cor;
if in.iaf.time < last_time then
next_record:= 1;
last_time:= in.iaf.time;
cur_date:= systime(4,last_time/10000,r);
cur_clock:= r;
if cur_date < 80 01 01 or
cur_date > to_day then
next_record:= 2;
end;
end;
\f
begin
real r,time;
systime(1,0,time);
to_day:= systime(4,time,r);
end;
iaf:= 0;
operation:= 2;
cor:= 12;
time:= 16;
\f
open(in,4,doc,1 shift 18);
p_cur_clock:= cur_clock;
last_time:= 0;
if rec_no < 0 then
begin
rel_rec_no:= -rec_no;
rec_no:= 0;
repeat until next_record > 0;
if rec_no > rel_rec_no then
rec_no:= rec_no - 1 - rel_rec_no
else
begin
write(out,<:<10>relative record number greater than max record number, i.e.:>,
rel_rec_no,<: >=:>,rec_no,<:<10>:>);
rec_no:= 0;
end;
end;
setposition(in,0,rec_no//32 <* i.e. records per segment *>);
inrec6(in,(rec_no mod 32)*16);
coroutine:=
cur_date:=
cur_clock:= 0;
last_time:= 0;
repeat
res:= next_record;
until cur_clock >= p_cur_clock or res > 0;
if res = 0 then
begin
repeat
if print then
print_record(in.iaf,rec_no,cur_date,cur_clock);
until next_record > 0;
end
else
write(out,<:<10>file exhausted; record number:>,rec_no,<:<10>:>);
write(out,false,768);
close(in,true);
end; <*test print*>
end
▶EOF◀