|
|
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: 5376 (0x1500)
Types: TextFile
Names: »textendcf «
└─⟦01e83a425⟧ Bits:30008166 Bånd med SW8010 og SW8500 source code
└─⟦75ff9bef3⟧
└─⟦this⟧ »textendcf «
(
head 1
extendcf=algol list.yes survey.yes
end
head 1
)
extendcf
external
procedure extendcf(z, extension);
value extension;
zone z;
integer extension;
comment
the procedure extends the cf-file currently being processed by
the zone z, which must be in one of the normal 6 cf-states
(read-only, read-update, or update-all, -m or -l).
the positive integer extension defines how many segments the
file should be extended.
the file will, depending on type, be extended with an integral
number of buckets or blocks, at least one.
if an error occurs in a call of a monitor-procedure, resultcf will
be equal to: result-of-monitor-call * 10000 + number-of-monitor-fnc,
otherwise resultcf will be equal to the result of opencf.
in the first case the file has not been extended, but the situation
is as it was before.
the mode-procedures and opencf are called and may
cause alarms and calls of jump-proc.
in case of hard errors on backing store stderror, or the block-proc
of zone z may be called.
;
begin
integer i, fnc, readonlyl, filetype, savezstate,
savelength, saveresult, oldsegs, newsegs, increment,
headsegs, i5, b52, b53, cfbufrefrel, ibufrefrel;
integer array zdescr, savezdescr, tail(1:20);
integer field zgiveup, zstate, recordbase, recordlength,
basebufferarea, bufferlength, ifld;
real array field zdocname;
comment
init field-variables for zone-descriptor;
zdocname:= 2;
zgiveup:= 20;
zstate:= 26;
recordbase:= 28;
recordlength:= 32;
basebufferarea:= 38;
bufferlength:= 40;
comment
init variables for reference to file-cf;
readonlyl:= 22;
i5 := 96;
b52:= 34;
b53:= 36;
comment
start saving the old state;
saveresult:= 1;
getzone6(z, zdescr);
savezstate:= zdescr.zstate;
filetype:= if savezstate < readonlyl then 0 else 1;
comment
the zonestate is changed to readonly in order to ensure that the
file is properly updated, and to check the current zone-state;
readonlycf(z);
getzone6(z, zdescr);
comment
let current record describe the whole buffer, and change the
zonestate to after-declaration;
zdescr.zstate:= 4;
zdescr.recordbase:= zdescr.basebufferarea;
zdescr.recordlength:= zdescr.bufferlength * 4;
setzone6(z, zdescr);
ibufrefrel := z(1) shift (-24) extract 24 + 1;
cfbufrefrel:= z(1) extract 24 + 1;
comment find headsegs and increment from file head;
if filetype = 0 then
begin
comment master;
headsegs:= 0;
ifld:= ibufrefrel + i5 + 16;
increment:= z.ifld shift(-12); <* segsperbuck *>
end master
else
begin
comment list;
ifld:= cfbufrefrel + b52;
headsegs := z.ifld; <* segs in head *>
ifld:= cfbufrefrel + b53;
increment:= z.ifld; <* segs in block *>
end list;
savelength:= (cfbufrefrel + 18)//4;
begin
real array savetables(1:savelength);
comment
in this block the first part of the zone-buffer, which
contains the chain-tables and the jump-specification,
is saved, and the file is extended and reopened;
for i:= 1 step 1 until savelength do
savetables(i):= z(i);
comment
get tail of old entry by lookup;
fnc:= 42; i:= monitor(fnc, z, 0, tail);
if i>0 then goto error;
oldsegs:= tail(1);
newsegs:= headsegs + (oldsegs + extension - headsegs)
//increment * increment;
if newsegs <= oldsegs then
newsegs:= newsegs + increment;
if newsegs <= oldsegs then
begin
comment error;
saveresult:= 999999;
goto reopen;
end;
tail(1):= newsegs;
comment
change the size of the entry;
fnc:= 44; i:= monitor(fnc, z, 0, tail);
if i > 0 then
begin
error:
saveresult:= i * 10000 + fnc;
end error;
reopen:
; comment
open the file again;
i:= 1;
opencf(z, string zdescr.zdocname(increase(i)), zdescr.zgiveup);
if saveresult = 1 then saveresult:= resultcf;
getzone6(z, savezdescr);
comment
restore the first part of the zone-buffer;
setzone6(z, zdescr);
for i:= 1 step 1 until savelength do
z(i):= savetables(i);
setzone6(z, savezdescr);
end block of savetables;
comment
restore zonestate;
i:= savezstate - readonlyl + (if filetype = 0 then 7 else 2);
case i of
begin
;
;
readupdcf(z);
updateallcf(z);
end case i;
resultcf:= saveresult;
end extendcf;
end
▶EOF◀