|
|
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: 10752 (0x2a00)
Types: TextFile
Names: »topensq «
└─⟦01e83a425⟧ Bits:30008166 Bånd med SW8010 og SW8500 source code
└─⟦75ff9bef3⟧
└─⟦this⟧ »topensq «
(
head 1
resultsq = set bs opensq 3 576.0 0 4.0
logsq = set bs opensq 5 512.0 0 4.0
if 0.yes
opensq = algol spill.yes list.yes bossline.yes blocks.yes xref.yes survey.yes
if 0.no
opensq = algol spill.yes survey.yes
)
sq-system, opensq
release 13.0, eah, 01.02.81
external
integer procedure opensq(z, doc, giveup, function);
value giveup, function;
zone z;
string doc;
integer giveup, function;
comment
makes an sq-file available for recordprocessing by the standard i/o-procedures
invar, outvar, changevar, inrec6, and outrec6.
call:
opensq(z, doc, giveup, function)
opensq (return value, integer)
the number of records in the file.
z (call and return value, zone)
as for algol procedure open.
doc (call value, string)
as for algol procedure open.
giveup (call value, integer)
as for algol procedure open.
function (call value, integer)
this integer is used as two halfwords, which specify the use of
the file:
function:= recordsize shift 12 add mode
recordsize = 0 means that invar, outvar, or changevar will be
used after this call.
recordsize > 0 means that inrec6, or outrec6 will be used after
this call, and recordsize is the number of halfwords in each re-
cord.
mode = 0 means reading inclusive checking of the checksum.
mode = 1, reading exclusive checking of the checksum. this pa-
rameter
is always used in connecion with inrec6 (recordsize > 0).
mode = 2, writing from the beginning of the file and with check-
sum, if outvar/changevar is used.
mode = 3, writing from the logical end of file and with checksum,
if outvar/changevar is used.
functions:
the parameters are checked. the file is looked up in the catalog, and if
no entry is found and mode is 2, an area creation is attempted.
the catalog entry tail is interpreted. the filehead is cheked or created,
if a new file is wanted. finally the file is positioned, and the zone pre-
pared for recordaccess.
requirements:
zonestate = 4
if mode <> 2, the tail and filehead must agree with the sq-system conventions.
if mode = 2, contents = 20 or 0 is accepted too and the tail is changed
to the sq-conventions.
the sharelength of z must be able to hold any occuring record in the block.
results:
resultsq = 1 ok
= 2 updatemark was found
= 3 file not found in the catalog, but if mode > 1, it is cre-
ated and ready for use.
zonestate = if mode < 2 then 5 else 6.
the updatemark is set, if mode > 1.
;
begin
own integer resultsq;
own boolean logsq;
boolean newfile;
integer i, thisvers, segsinhead, recordsize, mode, blocksize, segsperblock,
lookres, contents, sum, segmno, lastbyte, noofrecs, monres, shortclock;
real fullclock;
integer array field headpart1, headpart2, headpart3, headpart4, rest1, rest2;
integer array zonedescr(1:20), tail(1:10);
long array name(1:2);
long array field docname;
zone help(128, 1, stderror);
integer procedure clock(fncno, fullclock);
value fncno;
integer fncno;
real fullclock;
comment the parameter fncno selects an operation on shortclock;
begin
own integer shortclock;
integer i;
real time;
i:= fncno;
if shortclock = 0 then fncno:= 1;
comment select a function;
again:
case fncno of
begin
begin comment fncno = 1, take shortclock;
shortclock:= systime(7, 0, time);
if i <> fncno then
begin
fncno:= i;
goto again;
end;
end;
comment fncno = 2, print shortclock;
write(out, <:d.:>, <<zddddd.dddd>,
systime(6, shortclock, time) +time/1000000);
end case;
clock:= shortclock;
end proc clock;
procedure checksumsq(sum);
integer sum;
begin
integer array field f;
for f:= 0, 4, 8, 10, z.headpart1(3) step 2 until z.headpart2(1),
z.headpart3(1) do
sum:= sum extract 22 +z.f(1) extract 22;
end checksumsq;
procedure errorsq(fncno, number, text);
value fncno, number;
integer fncno, number;
string text;
comment the parameter fncno selects an action in an errorsituation.;
begin
case fncno of
begin
begin comment alarm, processing stops;
write(out, <:<10>***opensq at :>, name);
system(9, number, text);
end
end case;
end proc errorsq;
procedure logoutput(no);
value no;
integer no;
comment prints the log. the output depends on the parameter no;
begin
write(out, <:<10>log:>, no);
end proc logoutput;
procedure outhead(text);
string text;
begin
write(out, <:<10>:>, text, <:<10>:>);
for i:= 1 step 1 until z.headpart1(1)//2 do
write(out, z.headpart1(i), <:<10>:>);
end outhead;
thisvers:= 1 <*1st distributed version*>;
segsinhead:= 1;
resultsq:= 1;
opensq:= 0;
docname:= 2;
open(help, 0, doc, 0);
getzone6(help, zonedescr);
name(1):= zonedescr.docname(1);
name(2):= zonedescr.docname(2):= if name(1) extract 8 = 0 then extend 0
else zonedescr.docname(2);
setzone6(help, zonedescr);
getzone6(z, zonedescr);
if zonedescr(13) <> 4 then
errorsq(1, zonedescr(13), <:<10>z.state :>);
recordsize:= function shift (-12);
comment maxrecsize is 4095;
mode:= function extract 12;
if mode > 3 or (mode = 0 <*read with check*> and recordsize > 0) then
errorsq(1, mode, <:<10>ill.mode:>);
blocksize:= zonedescr(20)//zonedescr(18)*4;
segsperblock:= blocksize//512;
if blocksize <> segsperblock*512 or recordsize > blocksize then
errorsq(1, blocksize//4, <:<10>s.length:>);
lookres:= monitor(42<*lookup*>, help, 0,tail);
newfile:= false;
if lookres = 0 <*found*> then
begin comment check tail;
contents:= tail(9) shift (-12);
if contents = 21 then
newfile:= mode = 2 or (mode = 3 and tail(10) = 0)
else
begin
if mode <> 2 or
(contents <> 0 and contents <> 20) or
tail(7) <> 0 or tail(10) <> 0 then
errorsq(1, contents, <:<10>contents:>);
newfile:= true;
end contents <> 21;
end <*check tail*>
else
begin
if lookres <> 3 <*i/o or name format error*> then
errorsq(1, lookres, <:<10>lookup :>)
else
begin
comment entry not found;
resultsq:= 3;
if mode < 2 then goto endproc
else newfile:= true;
end;
end;
if newfile then
begin
comment set the tail;
tail(6):= shortclock:= clock(1, fullclock);
tail(7):= tail(8):= tail(10):= 0;
tail(9):= 21 shift 12 add segsperblock;
if lookres = 3 <*not found*> then
begin
tail(1):= segsperblock +segsinhead; <*size*>
tail(2):= 1; <*preferably disc*>
tail(3):= tail(4):= tail(5):= 0;
monres:= monitor(40 <*create*>, help, 0, tail);
if monres <> 0 then errorsq(1, monres, <:<10>create :>);
resultsq:= 3;
end
else
begin
monres:= monitor(44 <*change*>, help, 0, tail);
if monres <> 0 then
errorsq(1, monres, <:<10>change :>);
end;
begin
comment create the filehead;
open(z, 4, name, 0 <*internal open*>);
outrec6(z, 512 <*head is 1 segment p.t.*>);
headpart1:= 0;
for i:= 1 step 1 until 6 do
z.headpart1(i):= case i of (
0, <*length*>
0, <*checksum*>
0, <*field to next*>
real <:sq:> shift (-24) extract 24,
thisvers, <*sq-version*>
segsinhead); <*segm.no for start of userpart*>
headpart2:= z.headpart1(3):= i*2 -2;
headpart2:= headpart2 +2;
tofrom(z.headpart2, tail, 20);
headpart2:= headpart2 -2;
z.headpart2(12):= recordsize;
headpart3:= z.headpart2(1):= headpart2 +2 +20 +2;
for i:= 2 step 1 until 7 do
z.headpart3(i):= case i of (
0, <*dummy*>
0, <*ext no*>
0, <*no of recs*>
z.headpart1(6), <*segm.no. of last block*>
0, <*last byte*>
0, <*update*>
tail(6)); <*short clock*>
headpart4:= z.headpart3(1):= headpart3 +i*2 -2;
z.headpart4(1):= 0;
for rest1:= headpart4 +2 step 2 until 510 do
z.rest1(1):= -8388608;
getzone6(z, zonedescr);
z.headpart1(1):= zonedescr(16):= headpart4 +2;
checksumsq(z.headpart1(4));
setzone6(z, zonedescr);
checkvar(z);
close(z, false);
end create head;
end new file;
comment in all cases a filehead exists, and will be checked;
open(z, 4, name, 0);
getzone6(z, zonedescr);
zonedescr(11):= 1 shift 23;
setzone6(z, zonedescr);
invar(z);
headpart1:= 0;
headpart2:= z.headpart1(3);
headpart3:= z.headpart2(1);
comment* outhead(<:op read:>);
sum:= real <:sq:> shift (-24) extract 24;
checksumsq(sum);
if sum <> z.headpart1(4) then errorsq(1, 0, <:<10>sqsum :>);
if z.headpart1(5) > thisvers then
errorsq(1, z.headpart1(5), <:<10>sqvers :>);
if z.headpart2(10) extract 12 <> segsperblock then
errorsq(1, z.headpart2(10) extract 12, <:<10>spb-head:>);
if z.headpart2(12) <> recordsize then
errorsq(1, z.headpart2(12), <:<10>recsize :>);
noofrecs:= z.headpart3(3);
if noofrecs shift (-22) <> 0 <*2 leftmost bits too many*> then
errorsq(1, noofrecs, <:<10>reccount:>);
if z.headpart3(6) <*updatemark*> <> 0 then
resultsq:= 2;
if mode > 1 and z.headpart3(6) = 0 then
begin
i:= z.headpart1(1);
setposition(z, 0, 0);
swoprec6(z, i);
z.headpart3(6):= 1; <*update*>
checkvar(z);
comment* outhead(<:op mod:>);
end;
comment end of filehead checking;
comment position userpart;
if mode = 3 then
begin
segmno:= z.headpart3(4);
lastbyte:= z.headpart3(5);
setposition(z, 0, segmno);
inrec6(z, lastbyte);
setposition(z, 0, segmno);
outrec6(z, lastbyte);
outrec6(z, 0); <*no zone rec*>
end
else
setposition(z, 0, z.headpart1(6));
comment prepare recordprocessing;
getzone6(z, zonedescr);
zonedescr(10):= giveup;
zonedescr(11):= if recordsize <> 0 then
1 shift 22 add recordsize
else
case mode +1 of
(1 shift 23, 0, 1 shift 23, 1 shift 23 add noofrecs)
;
setzone6(z, zonedescr);
opensq:= noofrecs;
endproc:
end procedure opensq;
end
▶EOF◀