|
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: 16128 (0x3f00) Types: TextFile Names: »insexttext «
└─⟦01e83a425⟧ Bits:30008166 Bånd med SW8010 og SW8500 source code └─⟦75ff9bef3⟧ └─⟦this⟧ »insexttext «
mode list.yes insextlists=algol connect.no survey.yes begin <* dh 86.09.29, inspectinggexternal lists, page ...00... *> comment short description (better than no manual at all). ----------------- abstracts: searches parts of the catalog for external procedures and ---------- inspects their external lists according to a list of procedure specifications to fins the ones which may have been changed by the faulty release of updextlists. call: ----- ( )1 ( )1( )* (<output file> =) insextlists (scope.<scope spec.>) (<proc. spec.>) ( )0 ( )0( )1 <output file> ::= <name> <scope spec.> ::= project ! user ! login ! temp ! own ! perm <proc. spec.> ::= <name> function: the main catalog will be scanned for external procedures --------- according to the scope specifications (see below). each of the procedures thus found will be inspected. If such a procedure calls one or more of the external procedures mentioned in the procedure specification part of the call, an update will be made in the inspected procedure. the update will be according to a lookup at the catbase on which the program started. the inspecting of an inspected procedure will only cover the so called external list, and not the code. this means that not all changes of kinds and specifications in the procedures of the procedure specification list will be acceptable. however, this is not tested by the present program. \f <* dh 87.09.08, inspecting external lists, page ...01... *> the scope specification determines which part of the catalog should be scanned for candidates for inspection. - if the scope specification part is omitted, only procedures at the standard base will be inspected. - if it states scope.project, only procedures at the max base, and with catalog key 3 will be inspected. - if it states scope.user, only procedures at the user base, and with catalog key 3 will be inspected. - if it states scope.login, only procedures at the standard base, and with catalog key 2 will be inspected. - if it states scope.temp, only procedures at the standard base, and with catalog key <= 1 will be inspected. - if it states scope.own, all procedures which could possibly be changed will be inspected. - if it states scope.perm, all procedures at or within the standard base will be inspected, provided they have catalog key 3. error messages: and a description of the output as well as a --------------- detailed description, will be found in a future manual of this program! ; integer entrycount, extcount, firstparam, i, keylow, keyup, j, content, oldcount, changecount, ne, nex, ng, nb, nc, nzc; long maxlow, minlow, maxup, minup, firstparameter; integer field baselow, baseup, contry, key, size, if2, iff, kindspec1; integer array bases(1:8), ia(1:20), time (1:2); zone catind, catud, extlist(128, 1, stderror), me(1, 1, stderror); long array name, parameter, stackchain(1:2), alarmgot(1:4); long array field laf, entryname; integer array field iaf; long field lf, lf1; real r; boolean changes, fortran, found; \f <* dh 87.09.08, inspecting external lists, page ...02... *> integer procedure nextinlist(psn); integer psn ; begin while inrec6(extlist, 2) = 8 do begin psn := extlist.if2 extract 12; inrec6(extlist, 8); inrec6(extlist, psn); end; psn := psn + 2; nextinlist := extlist.if2; end; procedure passandcount; begin outrec6(catud, 34); tofrom(catud, catind, 34); entrycount := entrycount + 1; end; boolean procedure goodscope(entry); real array entry ; begin long b1, b2; integer keyval; keyval := entry.key extract 3; b1 := entry.baselow; b2 := entry.baseup; goodscope := if keyval<keylow or keyval>keyup then false else if minlow>minup then (b1=maxlow and b2=maxup) else if b1<=minlow and b2>=minup then (b1>=maxlow and b2<=maxup) else (b1>=minlow and b2<=minup); end; alarmgot(3) := alarmgot(4) := stackchain(1) := stackchain(2) := parameter(1) := parameter(2) := 0; open(me, 0, <::>, 0); system(11)bases:(0, bases); key := if2 := 2; baselow := 4; baseup := entryname := 6; size := 16; contry := 32; kindspec1 := 28; time (1) := systime (5, 0, r); time (2) := r ; <*prepare time (1:2)*> trap(slutaf); \f <* dh 86.09.29, inspecting external lists, page ...03... *> i := system(4)fpparam:(1, parameter); if i = 6 shift 12 + 10 <* eq name *> then begin comment stack and connect out; firstparam := 3; name(1) := parameter(1); name(2) := parameter(2); system(4)fpparam:(0, parameter); fpproc(29)stack_zone:(0, out, stackchain); i := 10 shift 1 + 1; <*10 segments, preferably on disc *>; fpproc(28)connect:(i, out, parameter); if i <> 0 then system(9, i, <:<10>l.h.side:>); <* after connect out, create the area process and fetch n.t.a. *> monitor(52)create_area_process:(out, 0, ia); getshare6(out, ia, 1); ia(4) := ia(4) extract 12; <* sense, keep the mode *> setshare6(out, ia, 1); monitor(16)send_message:(out, 1, ia); monitor(18)wait_answer:(out, 1, ia); monitor(8)reserve:(out, 0, ia); <* note, nothing is checked, we shall wait until actual output *> write(out, "*", 1, name); i := system(4)fpparam:(2, parameter); end else firstparam := 2; keylow := 0; keyup := 3; minlow := maxup := bases(4); <* note that this trick ensures that *> minup := maxlow := bases(3); <* exactly std base will be scanned *> if i <> 4 shift 12 + 10 <* sp name *> then fejl1: system(9, firstparam-1, <:<10>param:>); \f <* dh 86.10.08, inspecting external lists, page ...04... *> if parameter(1) = long <:scope:> then begin if system(4)fpparam:(firstparam, parameter) <> 8 shift 12 + 10 then fejl2: system(9, firstparam, <:<10>scope?:>); firstparam := firstparam + 1; firstparameter := parameter(1); if firstparameter = long<:proje:>+'c' then begin keylow := 3; minlow := maxup := bases(8); <* project base, otherwise *> minup := maxlow := bases(7); <* same trick as above *> end else if firstparameter = long<:user:> then begin keylow := 3; minlow := maxup := bases(6); <* user base, otherwise *> minup := maxlow := bases(5); <* same trick as above *> end else if firstparameter = long<:login:> then keylow := keyup := 2 else if firstparameter = long<:temp:> then keyup := 1 else if firstparameter = long<:own:> then begin maxlow := bases(7); minlow := bases(3); maxup := bases(8); minup := bases(4); end else if firstparameter = long<:perm:> then begin keylow := 3; minlow := maxlow; minup := maxup; <* i.e. within, or at std base *> end else goto fejl2; if system(4)fpparam:(firstparam, parameter) <> 4 shift 12 + 10 then system(9, firstparam,<:<10>param:>); firstparam := firstparam + 1; end determining scope; \f <* dh 86.10.08, inspecting external lists, page ...05... *> open(catind, 4, <:catalog:>, 0); open(catud, 4, <::>, 0); name(1) := name(2) := 0; i := 10 shift 1 + 1; <* 10 segm, preferably on disc *> fpproc(28)connect_out:(i, catud, name); if i <> 0 then system(9, i, <:<10>claims:>); entrycount := 0; for i := inrec6(catind, 0) while i >= 34 do begin inrec6(catind, if i > 36 then 34 else 36); if catind.key <> -1 then begin content := catind.contry shift(-12); j := catind.size; if content = 4 and j > 0 then begin if goodscope(catind) then passandcount; end else if content >= 32 then begin if j < 0 and goodscope(catind) then passandcount; end; end; end; extcount := 1; for i := system(4)fpparam:(firstparam, parameter) while i <> 0 do begin firstparam := firstparam + 1; extcount := extcount + 1; if i <> 4 shift 12 + 10 then goto fejl1; end; firstparam := firstparam - extcount; close(catind, true); getzone6(catud, ia); laf := 2; open(catind, 4, ia.laf, 0); <*n.t.a. will be set below*> \f <* dh 87.08.08, inspecting external lists, page ...06... *> if entrycount > 0 then begin integer array externals(1:extcount, 1:6); comment the entries in the file connected to catud may be sorted alphabetically here. this might ease proof reading of the output. some kind of base sort is performed below. note, that catud has not been positioned yet ; for i := 1 step 1 until extcount do begin iaf := i * 12; system(4)fpparam:(firstparam, name); firstparam := firstparam + 1; open(extlist, 4, name, 0); if monitor(42)lookup_entry:(extlist, i, ia) <> 0 then begin write(out, <:<10>***:>, name, <: does not:>); system(9, 0, <:<32>exist:>); end; close(extlist, false); tofrom(externals.iaf, name, 8); externals.iaf(5) := ia(7); externals.iaf(6) := ia(8); end fetching all externals to correct; while entrycount > 0 do begin oldcount := entrycount; entrycount := 0; setposition(catind, 0, 0); setposition(catud, 0, 0); inrec6(catind, 34); iaf := 0; ia(1) := catind.iaf(2); ia(2) := catind.iaf(3); lf := 4; maxlow := ia.lf; <*base pair *> changerec6(catind, 0); monitor(72)set_catbase:(me, 0, ia); write(out, <:<10>on base::>, <<-ddddddd>, ia(1), ia(2), "nl", 1); \f <* dh 87.09.07, inspecting external lists, page ...07... *> for oldcount := oldcount step -1 until 1 do begin inrec6(catind, 34); lf := 6; if catind.lf <> maxlow <*i.e. basepair *> then passandcount else begin content := catind.contry shift(-12); fortran := catind.kindspec1 < 0; if content = 4 then begin laf := 6; content := 0; end else begin laf := 16; content := content - 32; end; open(extlist, 4, catind.laf, 0); setposition(extlist, 0, content); monitor(52)create_area:(extlist, 0, ia); if monitor(8)reserve:(extlist, 0, ia) = 0 then begin i := catind.contry extract 12; inrec6(extlist, i); ne := nex := nextinlist(i) extract 12; ng := extlist.if2 shift (-12); nb := nextinlist (i); write(out, <:<10> :>, true, 12, catind.entryname, <:inspected:>); found := false; if ne >0 then begin for j := 2 * ng + (if fortran then 0 else nb) step -2 until 2 do nextinlist(i); <* i.e. skip globals and bytes to copy *> \f <* dh 87.09.08, inspecting external lists, page ...08... *> changecount := 0; for ne := ne step -1 until 1 do begin for iff := 2 step 2 until 8 do name.iff := nextinlist(i); j := extcount * 12 + 4; for lf := 16 step 12 until j do if name(1)=externals.lf then begin lf1 := lf + 4; if name(2) = externals.lf1 then goto fundet; end; if true then begin nextinlist(i); nextinlist(i) end else fundet: begin iaf := lf1; found := true; nextinlist (i); changes := extlist.if2 <> externals.iaf (1); extlist.if2 := externals.iaf (1); nextinlist (i); changes := changes or extlist.if2 <> externals.iaf (2); extlist.if2 := externals.iaf (2); comment a test of the consistency of the change in the external list may be performed above. - if you can invent a good one! ; changecount := changecount + 1; if changecount = 1 then write (out, "," , 1, "sp", 1) else write (out, "nl", 1, "sp", 27); write (out, true, 12, name, if changes then <: changes:> else <:no changes:>); end; end going through externals; if fortran then begin <*skip commons and zone commons*> nc := nb shift (-12); nzc := nb extract 12 ; for nc := nc step -1 until 1 do for j := 1 step 1 until 6 do nextinlist (i); for nzc := nzc step -1 until 1 do for j := 1 step 1 until 9 do nextinlist (i); end <*skip commons and zone commons*>; end any externals at all; if nex <= 0 and ng + nb <> 0 then write (out, <:, list maybe damaged:>) else begin if found then write (out, "nl", 1, "sp", 25); write (out, <:, date maybe changed:>); end; write (out, <: (:>, true, 12, catind.laf, <:):>, <: : :>, <<dddddd>, nextinlist (i), <: , :>, nextinlist (i)); end else write(out, <:<10>****:>, true, 12, catind.entryname, <:not inspected, **** reserver trouble, :>, true, 12, catind.laf, <:****:>); close(extlist, true); end entry at the correct bases; end searching for entries; end entry count > 0; write(out, <:<10>:>); end else write(out, <:*, nothing to correct!<10>:>); \f <* dh 86.09.29, inspecting external lists, page ...09... *> <* the trap routines do not work unless the zones are single buffered *> if false then slutaf: begin if alarmcause extract 24 = -11 then begin i := getalarm(alarmgot); getzone6(catud, ia); laf := 2; if ia.laf(1) = alarmgot(3) and ia.laf(2) = alarmgot(4) then begin ia.laf(1) := 0; ia(13) := 4; setzone6(catud, ia); <* a pseudo version of close, *> <* and we do not want the troubled area to be removed *> end else if stackchain(1) <> 0 then begin getzone6(out, ia); if ia.laf(1) = alarmgot(3) and ia.laf(2) = alarmgot(4) then fpproc(30)simply unstack:(0, out, stackchain); end end else i := 3 <* warning.yes ok.no *> end else i := 0; trap(shutup); <* only device status around closing relevant *> monitor(72)set_catbase:(me, 0, bases); close(catud, true); monitor(48)remove:(catud, 0, ia); if stackchain(1) <> 0 then begin write(out, <:<10><25><25><25>:>); close(out, true); if false then shutup: i := getalarm(alarmgot); trap(0); <* in case of break 10 just giveup *> fpproc(30)unstack:(0, out, stackchain); end; laf := 8; close(me, false); open(me, 0, alarmgot.laf, 0); <* if any, then insert the troubled name here *> fpproc(7)end_program:(0, me, i); end* ▶EOF◀