|
|
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: 328704 (0x50400)
Types: TextFile
Names: »load52tx «
└─⟦01e83a425⟧ Bits:30008166 Bånd med SW8010 og SW8500 source code
└─⟦75ff9bef3⟧
└─⟦this⟧ »load52tx «
begin
\f
<* sw8010/2, load pageheads page ... 1...
1985.02.21 *>
\f
<* sw8010/2, load declarations first level page ... 3...
1984.04.30 *>
message decl first level page 1;
boolean repeat_param ;
integer item_count ,
zone_level ,
max_no_of_vol ,
no_of_discs ;
integer array discs (1:4),
fp_table (0:127);
real array outfile ,
progname ,
chainname (1:2);
\f
<* sw8010/2, load parameter scanning page ... 4...
1981.11.13 *>
message prepare_paramscan page 1;
procedure prepare_param_scan (item_no);
value item_no ;
integer item_no ;
<***********************************************************>
<* *>
<* The procedure prepares a sequential scan of the fp pa- *>
<* rameters in the fp command stack and command files re- *>
<* ferenced in the parameter list by a parameter : *>
<* in.<name> *>
<* The scan is supposed to be carried out by the procedu- *>
<* re scan_param. *>
<* The scan is prepared to start in the fp item number *>
<* item_no. *>
<* The scan is implemented by means of the global variab- *>
<* les : *>
<* zone_level, item_count and repeat_param *>
<* where zone_level is the zone stack level and item_count *>
<* is the number of the item in the fp command stack to be *>
<* taken next. *>
<* A stack zone level of zero means no current input zone *>
<* has been stacked, i. e. the next item should be taken *>
<* in the fp commend stack, a zone stack level of n means *>
<* that current input zone has been stacked n times as a *>
<* result of a in.<name> parameter. *>
<* If level > 0, item_count is the item in the fp command *>
<* stack following the in.<name> parameter causing the *>
<* first zone stack level. *>
<* *>
<* Call: prepare_param_scan (item_no); *>
<* *>
<* item_no (call value, integer). The item number in the *>
<* fp command stack where the parameter scan car- *>
<* ried out by scan_param or repeat_param will be *>
<* started. *>
<* *>
<* Function : *>
<* Current input zone is unsatacked until zone_level eq- *>
<* uals one, item_no is assigned to the global item_count *>
<* and the global boolean repeat_param is set false. *>
<* *>
<***********************************************************>
begin
while zone_level > 0 do
unstack_current_input (zone_level);
item_count := item_no;
repeat_param := false;
end prepare_param_scan;
\f
<* sw8010/2, load parameter scanning page ... 5...
1981.11.13 *>
message scan param page 1;
integer
procedure scan_param ( item );
real array item ;
<***********************************************************>
<* *>
<* The procedure either returns the parameter which was la-*>
<* test returned or it returns the next parameter governed *>
<* by the global boolean repeat_param. *>
<* The parameter is coded as an item as for system (4,..) *>
<* and is taken either from fp command stack or from cur- *>
<* rent input zone. *>
<* *>
<* Call: scan_param ( item ); *>
<* *>
<* scan_param (return value, integer). Separator < 12 + *>
<* length as for system (4, ...). *>
<* item (return value, array). An item is returned *>
<* in item (1:2) as for system (4, ...). *>
<* *>
<* Function : *>
<* If repeat_param is false, the procedure calls next_item *>
<* and at the same time it stores the item in own variab- *>
<* les. *>
<* If repeat_param is true, the procedure returns the item *>
<* stored in the own variables and switches repeat_param *>
<* back to false. *>
<* *>
<***********************************************************>
begin
own
integer old_seplength;
own
real old_param1, old_param2;
if repeat_param then
begin <*the item is repeated*>
scan_param := old_seplength;
item (1) := old_param1 ;
item (2) := old_param2 ;
repeat_param := false;
end else
begin <*take next item*>
old_seplength := next_item (item);
old_param1 := item (1) ;
old_param2 := item (2) ;
scan_param := old_seplength ;
end;
end scan_param;
\f
<* sw8010/2, load parameter scanning page ... 6...
1982.12.21 *>
message next item page 1;
integer
procedure next_item (item);
real array item ;
<***********************************************************>
<* *>
<* The procedure returns the next item, either from the fp *>
<* command stack or from current input zone. The item is *>
<* coded as for system (4, ...). *>
<* *>
<* Call : next_item (item); *>
<* *>
<* next_item (return value, integer). Separator shift 12 *>
<* + length as for system (4, ...). *>
<* item (return value, array). An item is returned *>
<* in item (1:2) as for system (4, ...). *>
<* in item (1:2) as for system (4, ...). *>
<* *>
<* Function : *>
<* If the item taken, either from fp command stack by sys- *>
<* tem (4, ...) or from current input zone by system_four, *>
<* is <s>in.<name>, the current input zone is stacked and *>
<* curr input zone is connected to the file named <name>. *>
<* The level count in zone_level is increased by one and *>
<* the next item is taken from current input zone. *>
<* If the item taken is not <s>in, it is returned and if *>
<* it came from fp command stack, the item counter in the *>
<* global item_count is increased by one. *>
<* If the item is <s>in, but the name is neither 'scope' *>
<* nor 'docname', the parameter <s>in is returned and the *>
<* next parameter is saved in owns for later delivery. *>
<* *>
<***********************************************************>
\f
<* sw8010/2, load parameter scanning page ... 7...
1981.11.13 *>
message next item page 2;
begin
own
integer own_seplength;
own
real own_item_1, own_item_2;
own
boolean own_repeat;
integer seplength, old_seplength,
space_txt, point_txt, result;
real array old_item (1:2);
space_txt := 4 shift 12 + 10;
point_txt := 8 shift 12 + 10;
if own_repeat then
begin <*deliver owns*>
next_item := own_seplength;
item (1) := own_item_1 ;
item (2) := own_item_2 ;
own_repeat:= false ;
end <*deliver owns*> else
begin <*read new*>
seplength := if zone_level = 0 then
system (4, increase (item_count), item) else
systemfour ( item) ;
if item (1) <> real <:in:>
or seplength <> space_txt then
next_item := sep_length <*item ready*>
else
begin <* <s>in *>
old_seplength := seplength;
old_item (1) := item (1) ;
old_item (2) := item (2) ;
seplength := if zone_level = 0 then
system (4, increase (item_count), item) else
system_four ( item) ;
if seplength = seplength and
( item (1) = real <:scope:>
or item (1) = real <:docna:> add 'm' and
item (2) = real <:e:> )
or seplength <> point_txt then
begin <* <s>in not followed by .<filename>, store new, del. old*>
own_seplength := seplength ;
own_item_1 := item (1) ;
own_item_2 := item (2) ;
next_item := old_seplength;
item (1) := old_item (1) ;
item (2) := old_item (2) ;
own_repeat := true ;
<*end*> <* <s>in not followed by .<filename> *> <*else*>
\f
<* sw8010/2, load parameter scanning page ... 8...
1982.12.21 *>
message next item page 3;
end <* <s>in not followed by .<filename> *> else
begin <* <s>in followed by .<filename>, connect and read new *>
result := stack_current_input (zonelevel, item);
if result <> 0 then
begin <*connect not ok*>
write_alarm (out, <:warning infile param connect impossible:>);
write (out, <: in:>);
write_param (out, seplength, item);
write (out, <: :>, case result of (
<:no resources:>, <:malfunction:>, <:not user, non exist:>,
<:convention error:>, <:not allowed:>, <:name format error:>));
errorbits := 2; <*warning.yes, ok.yes*>
end <*connect not ok*>;
next_item := next_item (item);
end <* <s>in followed by .<filename> *>;
end <* <s>in *>;
end <*read new*>;
end next_item;
\f
<* sw8010/2, load parameter scanning page ... 9...
1982.12.21 *>
message param alarm page 1;
procedure param_alarm (z, text);
zone z ;
string text ;
<***********************************************************>
<* *>
<* The procedure writes on the zone z the text : *>
<* <10>***_<prog name>__:> *>
<* followed by a text and the entire parameter list, star- *>
<* ting with current parameter and emptying the parameter *>
<* list, ending up in fp command stack with current input *>
<* zone completely unstacked. *>
<* After emptying the parameter list, the fp mode bits are *>
<* set : warning.yes ok.no. *>
<* *>
<* Call : param_error (z, text); *>
<* *>
<* z (call and return value, zone). The name of the *>
<* document. Determines further the document, the *>
<* buffering and the position of the document. *>
<* text (call value, string). The text to be written. *>
<* *>
<***********************************************************>
begin
integer start_pos;
start_pos :=
write_alarm (z, text);
write_param_list (z, start_pos, 80);
errorbits := 3; <*warning.yes, alarm.yes*>
end param_alarm;
\f
<* sw8010/2, load parameter scanning page ... 10...
1981.11.13*>
message param warning page 1;
procedure param_warning (z, text);
zone z ;
string text ;
<***********************************************************>
<* *>
<* The procedure writes on the zone z the text : *>
<* <:<10>*** <prog name> :> *>
<* followed by the text given in text and the current pa- *>
<* rameter. *>
<* At return, the fp mode bits are : warning.yes, ok.yes *>
<* *>
<* Call : param_warning (z, text); *>
<* *>
<* z (call and return value, zone).The name of the *>
<* document. Determines further the document, the *>
<* buffering and the position of the document. *>
<* text (call value, string). The text to be written. *>
<* *>
<***********************************************************>
begin
integer seplength;
real array item (1:2);
repeat_param := true; <*repeat current parameter*>
seplength := scan_param (item);
write_alarm (z, text);
write_param (z, seplength, item);
errorbits := 2; <*warning.yes, alarm.no*>
end param_warning;
\f
<* sw8010/2, load parameter scanning page ... 11...
1982.12.28 *>
message write alarm page 1;
integer
procedure write_alarm (z, text);
zone z ;
string text ;
<***********************************************************>
<* *>
<* The procedure writes on the zone z the text : *>
<* <:<10>_<program name>__<text>__ *>
<* and returns the number of characters written. *>
<* *>
<* call : write_alarm (z, text); *>
<* *>
<* write_alarm (return value, integer). The number of *>
<* characters written. *>
<* z (call and return value, zone). The name *>
<* of the document. Determines further the *>
<* document, the buffering and the position *>
<* of the document. *>
<* text (call value, string). The text to be *>
<* written after the program name. *>
<* *>
<**********************************************************>
begin
long array field laf;
laf := 0;
outchar (out, 'nl');
write_alarm :=
write (z, <:*** :>, prog_name.laf, <: :>, text, <: :>);
end write_alarm;
\f
<* sw8010/2, load parameter scanning page ... 12...
1982.12.21 *>
message write param list page 1;
procedure write_param_list (z, start_pos, positions);
value start_pos, positions ;
zone z ;
integer start_pos, positions ;
<***********************************************************>
<* *>
<* The procedure writes on the zone z the entire parameter *>
<* list, starting with the parameter last obtained by a *>
<* call of scan_param and emptying the parameter list, en- *>
<* ding up in fp command stack with current input zone *>
<* completely unstacked. *>
<* *>
<* Call : write_param_list (z, start_pos, positions); *>
<* *>
<* z (call and return value, zone). The name of *>
<* the document. Determines further the docu- *>
<* ment, the buffering and the position of the *>
<* document. *>
<* start_pos (call value, integer). The procedure supposes *>
<* that start_pos characters have been written *>
<* on the zone z since the last 'nl' character. *>
<* If an item extends over the positions charac- *>
<* ters, the next item of the form <s>name will *>
<* be preceeded by a comma, a new line and *>
<* start_pos spaces. *>
<* positions (call value, integer). See above. *>
<* *>
<***********************************************************>
begin
integer seplength, spaceint, spacetxt, chars;
real array item (1:2);
space_int := 4 shift 12 + 4;
space_txt := 4 shift 12 + 10;
chars := start_pos ;
repeat_param := true; <*repeat current parameter*>
for seplength := scan_param (item) while seplength <> 0 do
chars :=
(if chars > positions then
write (z, ",", 1, "nl", 1,"sp", start_pos)
else
chars) +
write_param (z, seplength, item);
write (z, <:<10>:>);
end write_param_list;
\f
<* sw8011/1, save parameter scanning page ... 14...
1984.04.25 *>
message skip param list page 1;
procedure skip_param_list;
<***********************************************************>
<* *>
<* The procedure skips the entire parameter *>
<* list, starting with the parameter last obtained by a *>
<* call of scan_param and emptying the parameter list, en- *>
<* ding up in fp command stack with current input zone *>
<* completely unstacked. *>
<* *>
<* Call : skip_param_list; *>
<* *>
<* *>
<***********************************************************>
begin
integer seplength;
real array item (1:2);
for seplength := scan_param (item) while seplength <> 0 do;
end skip_param_list;
\f
<* sw8011/1, save parameter scanning page ... 14...
1981.11.13 *>
message write param page 1;
integer
procedure write_param (z, seplength, item);
value seplength ;
zone z ;
integer seplength ;
real array item ;
<***********************************************************>
<* *>
<* The procedure writes on the zone z the parameter coded *>
<* as an item as for system (4, ...), and returns the num- *>
<* ber of characters written. *>
<* *>
<* Call : write_param (z, seplength, item); *>
<* *>
<* write_param (return parameter, integer). The number *>
<* of characters written. *>
<* z (call and return value, zone). The name *>
<* of the document. Determines further the *>
<* document, the buffering and the position *>
<* of the document. *>
<* seplength (call value, integer). Separator < 12 + *>
<* length as for system (4, ...). *>
<* item (call value, array). An item in item(1:2) *>
<* as for system (4, ...). *>
<* *>
<***********************************************************>
begin
integer separator, length, chars;
long array field laf;
laf := 0; <*fields array to long array*>
separator := seplength shift (-12) extract 12; <*2, 4, 6, or 8*>
length := seplength extract 12; <*4 or 10 *>
write_param :=
if seplength = 0 then
write (z, "nl", 1)
else
write (z, case (separator//2+1) of ("(", "nul", "sp", "=", "."), 1) +
(if length = 4 then
write (z, <<d>, round (item(1)))
else
if length = 10 then
write (z, item.laf)
else
0);
end write_param;
\f
<* sw8010/2, load parameter scanning page ... 14..
1981.11.13 *>
message write char page 1;
integer
procedure write_char (z, char);
value char ;
zone z ;
integer char ;
<***********************************************************>
<* *>
<* The procedure writes on the zone z the character with *>
<* the iso-value char as a graphical and returns the num- *>
<* ber of characters written. *>
<* *>
<* Call : write_char (z, char); *>
<* *>
<* write_char (return value, integer). The number of *>
<* characters written. *>
<* z (call and return value, zone). The name *>
<* of the document. Determines further the *>
<* document, the buffering and the position *>
<* of the document. *>
<* char (call value, integer).The character with *>
<* iso-value char is written as a graphical. *>
<* *>
<***********************************************************>
begin
write_char := if char <= 'sp' then
write (z, <<d>, "<", 1, char, ">", 1) else
write (z, false add char, 1 ) ;
end write_char;
\f
<* sw8010/2, load parameter scanning page ... 15...
1981.11.13*>
message system four page 1;
integer
procedure system_four (item);
array item ;
<***********************************************************>
<* *>
<* The procedure reads from current input zone an item in *>
<* the sense defined by system (4, ...) and returns it. *>
<* *>
<* Call : system_four (item); *>
<* *>
<* system_four (return value, integer). Separator <12 + *>
<* length as for system (4, ...). *>
<* item return value, array). An item is retur- *>
<* ned in item (1:2) as for system (4, ..). *>
<* *>
<* Function : *>
<* The procedure reads, character by character, from cur- *>
<* rent input zone using the special fp input table defi- *>
<* ned by : *>
<* - small letters , class = 6, in name *>
<* - digits , -"- = 2, in number *>
<* - = (equal) , -"- 7, separator *>
<* - sp (space) , -"- 5, -"- *>
<* - . (point) , -"- 4, -"- *>
<* - , (comma) , -"- 3, -"- *>
<* - ; (semicolon) , -"- 3, -"- *>
<* - * (asterisk) , -"- 3, -"- *>
<* - nl (new line) , -"- 5, -"- *>
<* - ff (form feed) , -"- 5, -"- *>
<* - em (end medium), -"- 8, terminator *>
<* - bs (back space), -"- 9, illegal *>
<* - cr (carret) , -"- 9, -"- *>
<* - other graphics , -"- 9, -"- *>
<* - capitals , -"- 9, -"- *>
<* - all others , -"- 0, blind *>
<* This alphabet differs from the specila fp input alpha- *>
<* bet for characters ';', '*', 'nl' and 'ff', the effect *>
<* being that 'nl' is equivalent to 'sp'. *>
<* *>
<* From the character read, an item is build up using the *>
<* following state/action table : *>
\f
<* sw8010/2, load parameter scanning page ... 16...
1981.11.13 *>
message system four page 2;
<* State/action table : *>
<* *>
<* ________________________________________________ *>
<* character : !il-! ! ; ! ! nl! ! ! ! *>
<* !le-!di-! , ! . ! ff!let! = !em ! *>
<* !gal!git! * ! ! sp!ter! ! ! *>
<* ! ! ! ! ! ! ! ! ! *>
<* ! ! ! ! ! ! ! ! ! *>
<* states : ! 9 ! 2 ! 3 ! 4 ! 5 ! 6 ! 7 ! 8 ! *>
<* _______________!___!___!___!___!___!___!___!___! *>
<* ! ! ! ! ! ! ! ! ! *>
<* 1 not used ! ! ! ! ! ! ! ! ! *>
<* 2 after equal !7/l!6/i!2/g!7/l!2/f!5/h!7/l!7/l! *>
<* 3 after space !7/l!6/i!3/g!4/c!3/f!5/h!2/a!3/e! *>
<* 4 after point !7/l!6/i!4/g!7/l!4/f!5/h!7/l!7/l! *>
<* 5 in text !7/l!5/h!8/j!8/j!8/j!5/h!8/j!8/j! *>
<* 6 in number !7/l!6/i!8/k!8/k!8/k!7/l!8/k!8/k! *>
<* 7 after illegal!7/l!7/l!3/m!7/l!3/m!7/l!3/m!3/m! *>
<* 8 after item ! ! ! ! ! ! ! ! ! *>
<* ________________________________________________ *>
<* *>
<* Actions : *>
<* *>
<* a : separator := equal; *>
<* b : -"- := space; *>
<* c : -"- := point; *>
<* e : unstack current input; *>
<* f : empty; *>
<* g : skip until nl or em *>
<* h : pack char; *>
<* i : pack digit; *>
<* j : finish name; repeatchar; *>
<* k : finish number; repeatchar; *>
<* l : syntax error; *>
<* m : finish syntax error (empty curr input stack chain)*>
\f
<* sw8010/2, load parameter scanning page ... 17...
1982.12.21 *>
message system four page 3;
<* The possible separators to be met in current input zone *>
<* are : *>
<* *>
<* 4 : space *>
<* 6 : equal *>
<* 8 : point *>
<* *>
<* and the possible lengths are : *>
<* *>
<* 4 : integer *>
<* 10 : name *>
<* *>
<* When one of class 3 is met, the characters up to *>
<* but not including nl or em are skipped . *>
<* When one of class 8 is met, the procedure per- *>
<* forms an unstack current input zone and reads again. If *>
<* however, the current input zone is unstacked to level 0 *>
<* the item is taken from fp command stack by a call of *>
<* system (4, ...), in which case any item returned by *>
<* system (4, ...) may be returned by system_four. *>
<* If class 9 character is met, the character and the *>
<* following characters up to a following space, comma, = *>
<* any any terminator, are listed on current output zone *>
<* as syntax errors. *>
<* The same goes for a character creating a syntax error : *>
<* ==, .=, .., =., =<terminator>, .<terminator> and letter *>
<* in number. *>
<* When the last character has been listed, current input *>
<* stack chain is emptied and listed on current output and *>
<* the next item is taken from fp command stack. *>
<* *>
<***********************************************************>
begin
integer class , char , separator , length,
fp_item , space , equal ,
point , int , txt , number,
digits , chars , after_equal, after_space,
after_point, in_txt , in_number , after_illegal,
after_item , state ;
integer array digit (1:8), zdescr (1:20);
long array name (1:2) ;
own
boolean fp_table_initialized;
\f
<* sw8010/2, load parameter scanning page ... 18...
1981.11.13 *>
message system four page 4;
procedure pack_char (state, name, chars, char);
value char ;
long array name ;
integer state, chars, char ;
<*********************************************************>
<* *>
<* The procedure packs a given character into the tail *>
<* of a given long array where a given number of charac- *>
<* ters allready are packed, and returns the increased *>
<* number of characters. *>
<* If allready eleven characters are packed, the proce- *>
<* dure gives a syntax alarm, listing the characters *>
<* packed and returns the state 'after illegal'. *>
<* *>
<* Call : pack_char (state, name, chars, char); *>
<* *>
<* state (call and return value, integer). If all- *>
<* ready eleven characters are packed, the *>
<* state 'after illegal' is returned, else un- *>
<* changed. *>
<* name (call and return value, long array). The *>
<* character with the iso-value char is packed *>
<* in the tail of the long array name (1:2), *>
<* where allready chars characters are packed. *>
<* If allready eleven characters are packed, a *>
<* null character is packed after the last one.*>
<* chars (call and return value, integer). Num- *>
<* ber of characters allready packed, at re- *>
<* turn increased by one, unless allready ele- *>
<* ven characters are packed, in which case *>
<* chars = 11 is returned. *>
<* char (call value, integer). The character with *>
<* the iso-value char is packed after the last *>
<* one packed in the tail of name (1) or *>
<* name (2), depending on the number of charac-*>
<* ters allready packed. *>
<* *>
<*********************************************************>
\f
<* sw8010/2, load parameter scanning page ... 19...
1981.11.13 *>
message system four page 5;
begin
integer i, index, char_no, pos;
if chars = 0 then name (2) := 0; <*zerofill second element*>
chars := chars + 1;
index := (chars - 1)//6 + 1;
name (index) := name (index) shift 8 add char;
if chars = 12 then
begin <*name overflow*>
for i := 1 step 1 until 12 do
begin
index := (i-1) // 6 + 1;
char_no := (i-1) mod 6 + 1;
pos := (char_no-6) * 8;
syntax (state, name (index) shift pos extract 8);
state := after_illegal;
end;
end;
end pack_char;
\f
<* sw8010/2, load parameter scanning page ... 20...
1981.11.13 *>
message system four page 6;
procedure finish_name (name, chars);
value chars ;
long array name ;
integer chars ;
<*********************************************************>
<* *>
<* The procedure finishes the name in name (1:2) where *>
<* chars caracters are packed by pack_char. *>
<* *>
<* Call : finish_name (name, chars); *>
<* *>
<* name (call and return value, long array). A num- *>
<* ber of characters are packed in name (1) and *>
<* maybe name (2). The element in which the *>
<* last character is packed is shifted the pro- *>
<* per number of positions to the left. *>
<* chars (call value, integer). The number of charac- *>
<* ters packed in name. *>
<* *>
<*********************************************************>
begin
integer index, char_no, pos;
index := (chars-1) // 6 + 1;
char_no := (chars-1) mod 6 + 1;
pos := (6-char_no) * 8 ;
name (index) := name (index) shift pos;
end finish_name;
\f
<* sw8010/2, load parameter scanning page ... 21...
1981.11.13 *>
message system four page 7;
procedure pack_digit (state, number, digits, char);
value char ;
integer array number ;
integer state, digits, char ;
<*********************************************************>
<* *>
<* The procedure packs a digit given as an iso-character *>
<* into a given integer arrayu where a given number of *>
<* digits allready are packed, and returns the increased *>
<* number of digits. *>
<* If allready six digits are packed or the number com- *>
<* posed of the digits allready packed and the given di- *>
<* git will exceed the positive integer range, the pro- *>
<* cedure gives a syntax alarm, listing the characters *>
<* packed and returns the state 'after illegal'. *>
<* *>
<* Call : pack_digit (state, number, digits, char); *>
<* *>
<* state (call and return value, integer). If an il- *>
<* legal number will be the result, the state *>
<* 'after illegal' is returned, else unchanged. *>
<* number (call and return value, integer arry). The *>
<* character will be packed as a digit in num- *>
<* ber (chars + 1). *>
<* digits (call and return value, integer). The number *>
<* of digits allready packed, at return invrea- *>
<* sed by one. *>
<* char (call value, integer). The character with *>
<* the iso value char is packed as a digit. *>
<* *>
<*********************************************************>
\f
<* sw8010/2, load parameter scanning page ... 22...
1981.11.13 *>
message system four page 8;
begin
integer i, n, digit;
n := 0;
digit := char - 48;
for i := 1 step 1 until digits do n := n * 10 + number (i);
if digits = 7
or (digit > 7 and n >= 638860 ) then
begin <* overflow in number or integer exception at finish*>
for i := 1 step 1 until digits do
begin
syntax (state, 48 + number (i) );
state := after_illegal;
end;
syntax (state, char);
end else
begin <* ok *>
digits := digits + 1;
number (digits) := digit;
end;
end pack_digit;
\f
<* sw8010/2, load parameter scanning page ... 23...
1981.11.13 *>
message system four page 9;
integer
procedure finish_number (digit, digits);
value digits ;
integer array digit ;
integer digits ;
<*********************************************************>
<* *>
<* The procedure finishes the number packed as digits in *>
<* digit (1:digits) by pack_digit, and returns the re- *>
<* sulting integer. *>
<* *>
<* Call : finish_number (digit, digits); *>
<* *>
<* finish_number (return value, integer). The number *>
<* packed as digits in digit (1:digits). *>
<* digit (call value, integer array). See abo- *>
<* ve. *>
<* digits (call value, integer). See above. *>
<* *>
<*********************************************************>
begin
integer n, i;
n := 0;
for i := 1 step 1 until digits do n := n * 10 + digit (i);
finish_number := n;
end finish_number;
\f
<* sw8010/2, load parameter scanning page ... 24...
1981.11.13 *>
message system four page 10;
procedure syntax ( state, char);
value state, char ;
integer state, char ;
<*********************************************************>
<* *>
<* The procedure writes on current output zone an alarm *>
<* by means of the procedure write_alarm, provided the *>
<* value of state <> 7 (after illegal). In any case, the *>
<* character with the iso-value char is written by means *>
<* of the procedure write_char. *>
<* *>
<* Call : syntax (state, char); *>
<* *>
<* state (call value, integer). If state<> 7 (after *>
<* illegal) a syntax alarm is written first. *>
<* char (call value, integer). In any case the cha- *>
<* racter with the iso-value char is written by *>
<* means of the procedure write_char. *>
<* *>
<*********************************************************>
begin
if state <> 7 <*after illegal*> then
write_alarm (out, <:syntax:>);
write_char (out, char);
end procedure syntax;
\f
<* sw8010/2, load parameter scanning page ... 25...
1981.11.13 *>
message system four page 11;
procedure finish_syntax;
<*********************************************************>
<* *>
<* The procedure finishes the syntax alarm given by the *>
<* procedure syntax by writing the current input stack *>
<* zone chain on current output while unstacking until *>
<* zone level zero. *>
<* Before return the fp mode bits are set : *>
<* warning.yes, ok.no *>
<* *>
<*********************************************************>
begin
integer field kind;
long array parent_name (1:2);
long array field name;
kind := name := 2; <*fields the process name and mode kind*>
system (8, 0, parent_name);
getzone6 (in, zdescr );
write (out, <:<10> *read from :>);
if zdescr.kind extract 12 = 8 <*tw*>
or zdescr.kind extract 12 = 0 <*ip*> and
zdescr.name (1) = parent_name (1) and
zdescr.name (2) = parent_name (2) then
write (out, <:primary input:>)
else
write (out, zdescr.name );
while zone_level > 0 do
begin <*empty current input zone stack chain*>
unstack_current_input (zone_level);
getzone6 (in, zdescr);
write (out, <:<10> *selected from :>);
if zdescr.kind extract 12 = 8 <*tw*>
or zdescr.kind extract 12 = 0 <*ip*> and
zdescr.name (1) = parent_name (1) and
zdescr.name (2) = parent_name (2) then
write (out, <:primary input:>)
else
write (out, zdescr.name );
end <*empty current input zone stack chain*>;
write_alarm (out, <:reinitialized:>); <*warning.yes, ok.yes*>
end finish_syntax;
\f
<* sw8010/2, load parameter scanning page ... 26...
1981.11.13 *>
message system four page 12;
<*******************************************************>
<* *>
<* sepa- length: state: variable: val:*>
<* rator: *>
chars :=
digits := 0;
after_equal := 2;
after_space := state := 3;
space := int := after_point := separator := 4;
in_txt := 5;
equal := in_number := 6;
after_illegal := 7;
point := after_item := 8;
txt := fp_item := 10;
<* *>
<*******************************************************>
if -,fp_table_initialized then
fp_table_initialized := init_fp_table (fp_table);
intable (fp_table); <*special fp input table*>
repeat <*until state = after_item*>
class := if zone_level > 0 then
readchar (in, char)
else
fp_item;
case class of
begin
; <*class = 1, shift characters, not used*>
\f
<* sw8010/2, load parameter scanning page ... 27...
1981.11.13 *>
message system four page 13;
begin <*class = 2, digit*>
case state of
begin
; <*not used*>
begin <*after equal*>
pack_digit (state, digit, digits, char);
state := in_number;
end;
begin <*after space*>
pack_digit (state, digit, digits, char);
state := in_number;
end;
begin <*after point*>
pack_digit (state, digit, digits, char);
state := in_number;
end;
pack_char (state, name , chars , char); <*in text*>
pack_digit (state, digit, digits, char); <*in number*>
syntax (state, char); <*after illegal*>
end case state;
end <*class = 2*>;
begin <*class = 3, ,;: skip until 'nl' or 'em' equals 'sp'*>
case state of
begin
; <*not used*>
skip_until_nl; <*after equal*>
skip_until_nl; <*after space*>
skip_until_nl; <*after point*>
begin <*in text*>
repeatchar (in);
finish_name (name, chars);
length := txt;
state := after_item;
end;
begin <*in number*>
repeatchar (in); <*repeat 'nl'*>
number := finish_number (digit, digits);
length := int;
state := after_item;
end;
begin <*after illegal*>
state := after_space;
finish_syntax; <*empty current stack chain*>
end;
end case state;
end <*class = 3*>;
\f
<* sw8010/2, load parameter scanning page ... 28...
1981.11.13 *>
message system four page 14;
begin <*class = 4, '.'*>
case state of
begin
; <*not used*>
begin <*after equal*>
syntax (state, char);
state := after_illegal;
end;
begin <*after space*>
separator := point;
state := after_point;
end;
begin <*after point*>
syntax (state, char);
state := after_illegal;
end;
begin <*in text*>
repeatchar (in);
finish_name (name, chars);
length := txt;
state := after_item;
end;
begin <*in number*>
repeatchar (in);
number := finish_number (digit, digits);
length := int;
state := after_item;
end;
syntax (state, char); <*after illegal*>
end case state;
end <*class = 4*>;
\f
<* sw8010/2, load parameter scanning page ... 29...
1981.11.13 *>
message system four page 15;
begin <*class = 5, 'nl' and 'ff'*>
case state of
begin
; <*not used*>
; <*after equal*>
; <*after space*>
; <*after point*>
begin <*in text*>
repeatchar (in);
finish_name (name, chars);
length := txt;
state := after_item;
end;
begin <*in number*>
repeatchar (in);
number := finish_number (digit, digits);
length := int;
state := after_item;
end;
begin <*after illegal*>
state := after_space;
finish_syntax; <*empty current input stack chain*>
end;
end case state;
end <*class = 5*>;
begin <*class = 6, letter*>
case state of
begin
; <*not used*>
begin <*after equal*>
state := in_txt;
pack_char (state, name, chars, char);
end;
begin <*after space*>
state := in_txt;
pack_char (state, name, chars, char);
end;
begin <*after point*>
state := in_txt;
pack_char (state, name, chars, char);
end;
begin <*in text*>
state := in_txt;
pack_char (state, name, chars, char);
end;
begin <*in number*>
syntax (state, char);
state := after_illegal;
end;
begin <*after illegal*>
syntax (state, char);
state := after_illegal;
end;
end case state;
end <*class = 6*>;
\f
<* sw8010/2, load parameter scanning page ... 30...
1981.11.13 *>
message system four page 16;
begin <*class = 7, '='*>
case state of
begin
; <*not used*>
syntax (state, char); <*after equal*>
begin <*after space*>
separator := equal;
state := after_equal;
end;
syntax (state, char); <*after point*>
begin <*in text*>
repeatchar (in);
finish_name (name, chars);
length := txt;
state := after_item;
end;
begin <*in number*>
repeatchar (in);
number := finish_number (digit, digits);
length := int;
state := after_item;
end;
begin <*after illegal*>
state := after_space;
finish_syntax; <*empty current input stack zone chain*>
end;
end case state;
end <*class = 7*>;
begin <*class = 8, 'em'*>
case state of
begin
; <*not used*>
syntax (state, char) ; <*after equal*>
unstack_current_input (zone_level); <*after space*>
syntax (state, char) ; <*after point*>
begin <*in text*>
repeatchar (in);
finish_name (name, chars);
length := txt;
state := after_item;
end;
begin <*in number*>
repeatchar (in);
number := finish_number (digit, digits);
length := int;
state := after_item;
end;
begin <*after illegal*>
state := after_space;
finish_syntax; <*empty current input stack zone chain*>
end;
end case state;
end <*class = 8*>;
\f
<* sw8010/2, load parameter scanning page ... 31...
1981.11.13 *>
message system four page 17;
begin <*class = 9, illegal*>
syntax (state, char);
state := after_illegal;
end;
<*class = 10, current input zone has been unstacked to level 0*>
state := after_item;
end case class;
until state = after_item;
if class = fp_item then
<*item comes from fp command stack*>
system_four :=
system (4, increase (item_count), item)
else
begin <*the item came from current input*>
system_four := separator shift 12 + length;
if length = int then
item (1) := number <*number*>
else
begin
item (1) := real name (1);
item (2) := real name (2);
end;
end <*the item came from current input*>;
intable (0); <*return to normal input table*>
end system_four;
\f
<* sw8010/2, load parameter scanning page ... 32...
1982.12.21 *>
message init fp table page 1;
boolean
procedure init_fp_table (table);
integer array table ;
<***********************************************************>
<* *>
<* Initialization of special fp input table used by the *>
<* procedure system_four. *>
<* *>
<* Call : init_fp_table (table); *>
<* *>
<* init_fp_table (return value, boolean). True. *>
<* table (call value, integer array). The special *>
<* fp alphabet is assigned to table (0:127).*>
<* *>
<***********************************************************>
begin
integer i;
isotable (table);
<*class = 0, blind*>
for i := 0 step 1 until 7,
9, 11,
14 step 1 until 24,
26 step 1 until 31,
95, 127 do
table (i) := 0 shift 12 + i;
<*class = 2, digits*>
<*unchanged*>
<*class = 3, ','*>
for i := ',', ';', '*' do
table (i) := 3 shift 12 + i;
<*class = 4, '.' '/'*>
table ('.') := table ('/') := 4 shift 12 + '.';
<*class = 5, 'nl', 'ff' and 'sp'*>
for i := 'nl', 'ff', 'sp' do
table (i) := 5 shift 12 + i;
<*class = 6, letters*>
<*unchanged*>
<*class = 7, '='*>
table ('=') := 7 shift 12 + '=';
<*class = 8, 'em'*>
for i := 'em' do
table (i) := 8 shift 12 + i;
<*class = 9, illegal*>
for i := 8, 13,
33 step 1 until 39,
40, 41, 43, 45, 58, 60, 62, 63,
64 step 1 until 94,
96,126 do
table (i) := 9 shift 12 + i;
init_fp_table := true;
end init_fp_table;
\f
<* sw8010/2, load parameter scanning page ... 33...
1981.11.13 *>
message skip until nl page 1;
procedure skip_until_nl;
<*********************************************************>
<* *>
<* The procedure reads from current input zone and skips *>
<* all characters up to and including the next 'nl' or *>
<* 'em' character. *>
<* *>
<*********************************************************>
begin
integer char;
repeat
readchar (in, char);
until char = 'nl' or char = 'em' ;
end skip_until_nl;
\f
<* sw8010/2, load parameter scanning page ... 34...
1981.11.13*>
message stack current in put page 1;
integer
procedure stack_current_input (zone_level, file_name);
integer zone_level ;
real array file_name ;
<***********************************************************>
<* *>
<* The procedure stacks the current input zone and con- *>
<* nexts the zone to the file named file_name, increasing *>
<* the zone level counter zone_level by one, and returns *>
<* zero. *>
<* If the zone cannot be connected to the file, the zone *>
<* is unstaked again and the procedure returns value > 1 *>
<* with zone_level unchanged. *>
<* *>
<* Call : stack_current_input (zone_level, file_name); *>
<* *>
<* stack_current_input (return value, integer). The re- *>
<* sult of the connection. *>
<* zone_level (call and return value, integer). *>
<* At call the actual zone_level, at *>
<* return increased by one if connec- *>
<* tion was ok, unchanged if not. *>
<* file_name (call value, array). After stack *>
<* current input zone, the zone is *>
<* connected to the file whose name *>
<* is given in file_name (1:2). *>
<* *>
<***********************************************************>
begin
integer result;
integer array zdescr (1:20), sdescr (1:12);
fp_proc (29, 0, in, 0); <*stack c i*>
fp_proc (27, result, in, file_name); <*connect *>
if result <> 0 then
fp_proc (30, 0, in, 0) <*unstack *>
else
begin <*connect ok*>
get__zone6 (in, zdescr);
get_share6 (in, sdescr, zdescr (17)); <*used share*>
zdescr (13) := 0; <*positioned after open *>
zdescr (14) := sdescr (5) - 1; <*record base := first addr - 1*>
zdescr (15) := sdescr (6) ; <*last half := last addr *>
setzone6 (in, zdescr);
zone_level := zone_level + 1;
end <*connect ok*>;
stack_current_input := result;
end stack_current_input;
\f
<* sw8010/2, load parameter scanning page ... 35...
1981.11.13*>
message unstack current input page 1;
procedure unstack_current_input (zone_level);
integer zone_level ;
<*********************************************************>
<* *>
<* The procedure terminates the current input zone by a *>
<* call of h79 : terminate_zone and unstacks current in- *>
<* put zone. At return the parameter zone_level is de- *>
<* creased by one. *>
<* *>
<* Call : unstack_current_input (zone_level); *>
<* *>
<* zone_level (call and return value, integer). At *>
<* call the current zone stack level, at *>
<* return decreased by one. *>
<* *>
<*********************************************************>
begin
fp_proc (79, 0 <*w0*>, in <*w1*>, 0 <*w2*>); <*terminate zone*>
fp_proc (30, 0 <*w0*>, in <*w1*>, 0 <*w2*>); <*unstack zone*>
zone_level := zone_level - 1;
end unstack_current_input;
\f
<* sw8010/2, load parameter scanning page ... 36...
1988.09.08 *>
message stack current output page 1;
integer
procedure stack_current_output (file_name);
array file_name ;
<***********************************************************>
<* *>
<* The procedure stacks the current output zone, establi- *>
<* shing a stack zone chain in the global long array *>
<* chain_name, connects the zone to the file file_name and *>
<* returns zero. *>
<* If the zone cannot be connected to the file, the proce- *>
<* dure returns a value > 0 with the zone unstacked again. *>
<* *>
<* Call : stack_current_output (file_name); *>
<* *>
<* stack_current_output (return value, integer). The re- *>
<* sult of the connection. *>
<* file_name (call value, real array). After *>
<* stacking the zone is connected to *>
<* the file whose name is in *>
<* file_name (1:2). *>
<* *>
<***********************************************************>
begin
integer result;
result := 1 shift 2; <*1<2 <=> 1 segment, temporary*>
fp_proc (29, 0, out, chain_name); <*stack c o*>
fp_proc (28, result, out, file__name); <*connect *>
if result <> 0 then
fp_proc (30, 0, out, chain_name); <*unstack *>
stack_current_output := result;
end stack_current_output;
\f
<* sw8010/2, load parameter scanning page ... 37...
1981.12.07 *>
message unstack current output page 1;
procedure unstack_current_output;
<***********************************************************>
<* *>
<* The procedure unstacks the current output file from the *>
<* stack zone chain given in the global long array chain_ *>
<* name after having closed it up with an 'em' character *>
<* or a 'nl' character and termonated it. *>
<* *>
<***********************************************************>
begin
integer char;
integer array zdescr (1:20);
getzone6 (out, zdescr);
char :=
if zdescr (1) extract 12 = 4 <*bs*>
or zdescr (1) extract 12 = 18 <*mt*> then 'em' else 'nl';
fp_proc (34, 0, out, char); <*close up *>
fp_proc (79, 0, out, 0); <*terminate*>
fp_proc (30, 0, out, chain_name); <*unstack *>
end unstack_current_output;
\f
<* sw8010/2, load parameter scanning page ... 38...
1988.09.08 *>
message connect output page 1;
integer
procedure connect__output (z, kind, name, size, giveup);
value size, giveup ;
zone z ;
long array name ;
integer kind, size, giveup ;
<***********************************************************>
<* *>
<* The procedure connects the zone z to a file with a name *>
<* given after having initialized the zone with kind and a *>
<* giveup mask given. *>
<* The connection takes place by the fp procedure connect *>
<* output, i. e. a backing storage area of one slice is *>
<* created if necessary. *>
<* *>
<* Call : connect_output (z, kind, name, giveup); *>
<* *>
<* connect_output (return value, integer). The result of *>
<* fp connect output. *>
<* z (call value, zone). Determines the zone *>
<* to be connected. *>
<* kind (call value, integer). As for the proce- *>
<* dure close. *>
<* name (call and return value, long array). The *>
<* name of the file is in name (1:2). If *>
<* name (1) = long <::> a generated name is *>
<* used and returned in name (1:2). *>
<* giveup (call value, integer). As for close. *>
<* *>
<***********************************************************>
begin
integer i, result;
integer array dummyia (1:1), zdescr (1:20);
long array field laf;
open (z, kind, name, giveup);
if name (1) = long <::> then
begin
monitor (68) generate name :(z, 1, dummyia);
getzone6 (z, zdescr);
laf := 2;
for i := 1, 2 do
name (i) := zdescr.laf (i);
end;
result := size shift 2; <*at least one slice, temporary*>
fpproc (28, result, z, name);
connect_output := result;
end connect_output;
\f
<* sw8010/2, load parameter scanning page ... 39...
1984.04.25 *>
message connect_alarm page 1;
procedure connect_alarm (z, name, result);
value result ;
zone z ;
long array name ;
integer result ;
<***********************************************************>
<* *>
<* The procedure writes a connect alarm on the zone z and *>
<* skips the parameter list provided the result code is *>
<* positive and less then 7. *>
<* *>
<* Call : connect_alarm (z, name, result); *>
<* *>
<* z (call value, zone). Determines the document, *>
<* position of the document, ... where to write *>
<* alarm. *>
<* name (call value, long array). The name of the docu- *>
<* ment used in the connection. *>
<* result (call value, integer). The result code of the *>
<* connection (fp connect output). *>
<* *>
<***********************************************************>
begin
integer start_pos;
if result> 0 and result < 7 then
begin
startpos :=
write_alarm (z, <:connect:>);
write (z, name,
"nl", 1, "sp", startpos, case result of (
<:no resources:>, <:malfunction:>, <:not user, not exist:>,
<:convention error:>, <:not allowed:>, <:name format error:>));
skip_param_list;
end;
end connect_alarm;
\f
<* sw8010/2, load parameter scanning page ... 40...
1984.05.01 *>
message disconnect output page 1;
integer
procedure disconnect_output (z, release);
zone z ;
boolean release ;
<***********************************************************>
<* *>
<* The procedure stops all transfers in the zone z and dis-*>
<* connects the zone from the document in the sense that *>
<* the zone is closed and the document is cut down to last *>
<* block output if it is a backing storage area. *>
<* *>
<* Call : disconnect_output (z, release); *>
<* *>
<* disconnect_ *>
<* output (return value, integer). If the document is bs *>
<* the size is returned else zero is returned. *>
<* z (call value, zone). Determines the zone and *>
<* the document to be disconnected. *>
<* If the zone kind is bs, the document is cut to *>
<* contain the last block output. *>
<* release (call value, boolean). Release code as for *>
<* close with the same meaning. *>
<* *>
<***********************************************************>
begin
integer array zdescr (1:20), tail (1:10);
close (z, false); <*dont remove process*>
getzone6 (z, zdescr);
if zdescr (1) extract 12 = 4 then
begin <*bs*>
monitor (42) lookup entry tail :(z, 1, tail);
tail (1) := zdescr (9); <*segment count*>
monitor (44) change entry tail :(z, 1, tail); <*ignore results*>
disconnect_output := tail (1);
end else
disconnect_output := 0;
close (z, release);
end disconnect output;
\f
<* sw8010/2, load parameter scanning page ... 41...
1984.05.21 *>
message maybe device status page 1;
procedure maybe_device_status (z);
zone z ;
<***********************************************************>
<* *>
<* The procedure writes on the zone z a device status mes- *>
<* sage with document name and status bit names the same *>
<* way fp does if the program was to terminate with a give *>
<* up alarm instead of having trapped one. *>
<* *>
<***********************************************************>
begin
integer status, cause, param, bit;
long array text (1:4);
long array field docname;
own boolean called_before;
docname := 8; <*fields possible docname in text*>
status := getalarm (text);
cause := alarmcause extract 24 ;
param := alarmcause shift (-24);
if cause = -11 and -, called_before then
begin <*give up*>
called_before := true;
write (z, "nl", 1,
<:***device status :>, text.docname);
for bit := 0 step 1 until 21 do
if status shift bit < 0 then
write (z, "nl", 1, case (bit + 1) of (
<:intervention:>,
<:parity error:>,
<:timer:>,
<:data overrun:>,
<:block length error:>,
<:end of document:>,
<:load point:>,
<:tape mark or attention:>,
<:writing enabled:>,
<:mode error:>,
<:read error:>,
<:card rejected or disk error:>,
<:checksum error:>,
<:bit 13:>,
<:bit 14:>,
<:stopped:>,
<:word defect:>,
<:position error:>,
<:process does not exist:>,
<:disconnected:>,
<:unintelligible:>,
<:rejected:>,
<:normal:>,
<:hard error:>));
write (z, "nl", 1);
end;
end rs_alarm;
\f
<* sw8010/2, load decl. for parameters/discs page ... 38...
1988.11.17 *>
message decl. second level page 1;
<*init of disc_name table*>
system (5 )move core:( 92, discs);
<*discs (1) = first drum in nametable *>
<*discs (2) = first disc in nametable *>
<*disc2 (3) = first unused in nametable *>
<*discs (4) = chain addr of maincat disc*>
no_of_discs := (discs(3) - discs (1)) // 2;
max_no_of_vol := 32; <*max number of volumes in tapeparam*>
begin
<*block for parameter and disc variables and procedures*>
<*for parameter identification, interpretation and ca- *>
<*talog scanning *>
boolean list_entries , <*special param *>
list_only_name , <*special param *>
load ,
survey ,
check_tape ,
connect ,
reserve , <*not used*>
test ,
savecatfile_connected ,
reading_savecat ,
inc_dump ,
tape_param_ok ;
boolean array end_of_doc ,
parity ,
expell_zone (1:3),
release , <*mount param *>
mount_param_spec (1:2); <*mount param *>
\f
<* sw8010/2, load decl. for parameters/discs page ... 39...
1985.02.08 *>
message decl. second level page 2;
real r ;
integer action , <*param action *>
point_int ,
point_txt ,
space_int ,
space_txt ,
seplength ,
old_length ,
start_volume ,
copy_count ,
no_of_copies ,
no_of_shares ,
entry_spec_count ,
buflength ,
load_state ,
before_load_spec ,
after_modifier ,
after_disc_spec ,
after_entry_spec ,
after_error ,
no_of_entry_specs ,
any_scope ,
all ,
perm ,
sistem ,
owen ,
project ,
user ,
login ,
temp ,
result ,
no_of_unknown_discs ,
maincat_disc ,
progbase_lower ,
progbase_upper ,
buf__claim ,
area_claim ,
bufs_needed ,
areas_needed ,
segm ,
segments ,
savecat_size ,
savecat_reclength ,
savecat_recstart ,
baselevel ,
basetime ,
dumplevel ,
dumptime ,
entries_in_partcat ,
entries_in_savecat ,
entries_stored ,
entries_loaded ,
segs_loaded ,
total_entry_count ,
total_segm__count ,
version_id ,
release_id ,
sync_blocklength ,
aux_synclength ,
speedlimit ,
monrelease ,
dummy ,
i ,
j ,
k ;
\f
<* sw8010/2, load decl. for parameters/discs page ... 39...
1984.12.04 *>
message decl. second level page 2;
integer array dummyia ,
claim (1:1),
savecat_base ,
device_no ,
mode_kind ,
vol_count ,
no_of_vol (1:2),
file__no ,
block_no (1: 3),
dumpbases (1: 8),
zdescr (1:20),
slice_length ,
entry_count ,
slice_count ,
name_table (1:no_of_discs);
long array cat__base ,
std__base ,
user_base ,
max__base ,
sys__base ,
partcat_name ,
savecat_name ,
loadcat_name ,
disc_spec_name (1:2),
dump_label ,
from_to_discname (1:2 ,
1:2),
para_name ,
tape_name (1:2 ,
1:2 * max_no_of_vol),
incl_auxcat_name ,
incl_disc_name (1:no_of_discs ,
1:2 );
long array field current_tape ,
label_name ,
disc ,
laf ;
real array item ,
old_item ,
proc_name (1:2);
real array field raf1 ,
raf2 ;
zone z_partcat ,
z_loadcat ,
z_savecat (128, 1, stderror);
\f
<* sw8010/2, load entry procedures page ... xx...
1984.07.10*>
message connect savecat file page 1;
boolean
procedure connect_savecatfile (z, name, base, size, shortclock);
value size, shortclock ;
zone z ;
long array name ;
integer array base ;
integer size, shortclock ;
<***********************************************************>
<* *>
<* The procedure connects to a backing storage area of *>
<* given name, base, size and shortclock. *>
<* *>
<* Call : connect_savecatfile (z, name, base, size, short);*>
<* *>
<* connect_savecatfile *>
<* ( return value, boolean). True if the *>
<* proper entry is looked up, an area pro- *>
<* cess is created and connected, false o- *>
<* therwise. *>
<* z (call and return value, zone). The zone *>
<* to be connected. At call the zone state *>
<* must be 4, after declaration. At return *>
<* it is 0, after open. *>
<* name (call value, long array). The given na- *>
<* me in name (1:2). *>
<* base (call value, integer array). The entry *>
<* base of the given name is contained in *>
<* base (1:2). *>
<* size (call value, integer). The size of the *>
<* file given. *>
<* shortclock (call value, integer). The given short- *>
<* clock. *>
<* *>
<***********************************************************>
begin
integer result;
boolean connected;
integer array entry (1:17), dummy (1:1);
\f
<* sw8010/2, load entry procedures page ... xx...
1984.11.07 *>
message connect savecat file page 2;
connected := false; <*default*>
set_catbase (base);
open (z, 4, name, 0);
result := monitor (76) lookup head and tail :(z, 1, entry);
reset_catbase;
if result = 0 and
entry ( 1) extract 3 = 3 and
entry ( 2) = base (1) and
entry ( 3) = base (2) and
entry ( 8) = size and
entry (13) = shortclock then
begin <*entry exists*>
set_catbase (base);
if monitor (52) create area process :(z, 1, dummy) = 0 then
begin <*process created*>
inrec6 (z, 0); <*est. name table address*>
setposition (z, 0, 0);
connected := true;
end <*process created*>;
reset_catbase;
end <*entry exists*>;
if -, connected then
close (z, true);
connect_savecatfile := connected;
if test then
write (out,
"nl", 2, <:connect savecatfile ::>,
"nl", 1, <:connected = :>, if connected then <: yes:> else <: no:>,
"nl", 1, <:entry (1) = :>, entry (1) extract 3,
"nl", 1, <:entry (2) = :>, entry (2), <: base (1) = :>, base (1),
"nl", 1, <:entry (3) = :>, entry (3), <: base (2) = :>, base (2),
"nl", 1, <:entry (8) = :>, entry (8), <: size = :>, size,
"nl", 1, <:entry (13)= :>, entry (13), <: shortcl = :>, shortclock);
end connect_savecatfile;
\f
<* sw8010/2, load entry procedures page ... xx...
1984.09.17 *>
message connect wrk or exist page 1;
integer
procedure connect_wrk_or_existing (z, entry, discname, existing);
zone z ;
integer array entry ;
long array discname ;
boolean existing ;
<*********************************************************>
<* *>
<* If the parameter existing is true, the procedure tri- *>
<* es to look up the entry given (name and base). If it *>
<* exists, the procedure tries to change its tail to the *>
<* one specified, except for the document name of an a- *>
<* rea entry (disc name) which remains unchanged. If the *>
<* entry is an area entry, the procedure connects the *>
<* zone z to it. *>
<* If any of the steps above fail or the parameter exis- *>
<* ting is false, the procedure tries to create an entry *>
<* with a wrk name but with bases, permanent key, tail *>
<* and discname as specified. *>
<* If any of these steps fail, the procedure removes the *>
<* possibly created entry again and writes a proper a- *>
<* larm message on current output zone. *>
<* *>
<* Call : connect_wrk_or_existing (z, entry, discname, *>
<* existing); *>
<* *>
<* connect_wrk_ (return value, integer). Either zero or *>
<* the result from the monitor procedure *>
<* which failed. *>
<* z ( call and return value, zone). The zo- *>
<* no to be connected. *>
<* entry (call value, integer array). An area *>
<* entry head and tail in entry (1:17). *>
<* Entry (1) shift (-12) = 0 means no area *>
<* after all. *>
<* discname ( call value, long array). If the proce-*>
<* dure should create an wrk area entry, *>
<* name of the disc where to place it is *>
<* contained in discname (1:2). The first *>
<* word of discname (1) may be zero or one *>
<* with the usual meaning. *>
<* existing (call value, boolean). If existing is *>
<* true, the procedure first tries to con- *>
<* nect to a possibly existing area entry *>
<* with the same name and bases as given *>
<* in entry. *>
<* *>
<*********************************************************>
begin
integer result, key, no;
integer array headtail (1:17), entry_tail (1:10), entry_base (1:2),
diskname (1:8), zdescr (1:20), dummyia (1: 1);
long array wrk_name (1:2);
integer field size;
integer array field iaf, base, tail;
long array field name, z_name, docname;
\f
<* sw8010/2, load entry procedures page ... xx...
1988.11.25 *>
message connect wrk or exist page 2;
z_name := 2; <*fields docname in zone descr*>
iaf := 0;
base := 2;
name := 6;
tail := 14;
size := 16;
docname := 2; <*fields docname in an entry tail*>
tofrom (entry_tail, entry.tail, 20); <*move entry tail into int array*>
tofrom (entry_base, entry.base, 4); <* - - base - - - *>
tofrom (diskname , discname , 8); <* - discname - - - *>
result := 1;
if existing then
begin <*if the entry exists, change its tail and connect if area*>
open (z, 4, entry.name, 0);
set_catbase (entry.base);
result := monitor (76) head and tail :(z, 1, headtail);
if result = 0 then
result :=
if headtail .base (1) = entry .base (1) and
headtail .base (2) = entry .base (2) and <*bases*>
headtail (1) extract 3 = entry (1) extract 3 and <*permkey*>
(headtail .size >= 0 and <*areas*>
entry .size >= 0
or headtail .size < 0 and <*descr*>
entry .size < 0) then
0
else
1;
if result = 0 then
begin <*existing discname wins*>
if entry.size >= 0 then
tofrom (entry_tail.docname, head_tail.tail.docname, 8);
result := monitor (44) change entry :(z, 1, entry_tail);
tofrom (entry , head_tail, 14); <*head returned in entry*>
tofrom (entry.tail, entrytail, 20); <*tail returned in entry*>
end;
reset_catbase;
end <*if the area entry exists connect to it*>;
\f
<* sw8010.1, save entry procedures page ... xx...
1984.11.08 *>
message connect wrk or exist page 3;
if result > 0 then
begin <*could not or should not connect to existing, create wrk and conn*>
close (z, true); <*remove process*>
wrk_name (1) := long <::>;
open (z, 4, wrk_name, 0);
result := monitor (40) create entry :(z, 1, entry_tail);
getzone6 (z, zdescr);
tofrom (wrk_name, zdescr.z_name, 8);
if test then
begin
write (out,
"nl", 2, <:connect wrk or existing ::>,
"nl", 1, <:entry name = :>, wrkname,
"nl", 1, <:entry tail = :>,
entrytail (1) shift (-12), <:.:>, entrytail (1) extract 12,
"sp", 1, true, 12, entrytail.docname,
"sp", 1, true, 8, entry (6), entry (7), entry (8), entry (9), entry (10));
end;
if result > 0 then
monitor_alarm (out, 40, wrk_name, result)
else
begin <*permanent*>
key := entry (1) extract 3;
no :=
if entry.size >= 0
or discname (1) shift (-24) = 0
or discname (1) shift (-24) = 1 then
50 <*permanent entry, area or no specific disc*>
else
90; <*permanent in aux cat, non area entry and specific disc*>
result := monitor (no) permanent :(z, key, diskname);
\f
<* sw8010/2, load entry procedures page ... xx...
1984.11.09 *>
message connect wrk or exist page 4;
monitor (76) head and tail :(z, 1, head_tail); <*actual head tail*>
entry (1) := head_tail (1); <*first slice, namekey, permkey returned*>
tofrom (entry.tail, headtail.tail, 20); <*tail returned*>
if test then
begin integer array zdescr (1:20); long array field zname;
zname := 2;
getzone6 (z, zdescr);
write (out,
"nl", 2, <:connect wrk or existing ::>,
"nl", 1, <:permanent entry, no = :>, no,
"nl", 1, <: name = :>, zdescr.zname,
"nl", 1, <: key = :>, key,
"nl", 1, <: disc = :>, discname,
"nl", 1, <: result = :>, result);
listentry (out, false, entry, 0, 0, 0, 0);
end;
if result > 0 then
monitor_alarm (out, no, discname, result)
else
begin <*set entry base*>
result := monitor (74) set entry base :(z, 1, entry_base);
if result > 0 then
monitor_alarm (out, 74, wrk_name, result);
end <*set entry base*>;
end <*permanent*>;
if result > 0 then
begin
monitor (48) remove entry :(z, 1, dummyia);
result := 9; <*ignored in skip entry*>
end;
end <*could or should not connect to existing, create wrk and connect*>;
if result = 0 and entry.size > 0 then
begin <*create area process*>
set_catbase (entry_base);
result :=monitor (52) create area process :(z, 1, dummyia);
if result = 0 then
result := monitor (8) reserve process :(z, 1, dummyia) shift 12;
if result = 0 then
begin <*connect*>
inrec6 (z, 0); <*est. name table address*>
setposition (z, 0, 0);
end <*connect*>;
if result = 0 then
begin <*check bases*>
system (5) move core :(monitor (4, z, 1, dummyia) - 4, entry_base);
if entry_base (1) <> entry.base (1)
or entry_base (2) <> entry.base (2) then
result := 8; <*covered by a better entry*>
end <*check bases*>;
reset_catbase;
end <*create area process*>;
connect_wrk_or_existing := result;
end connect_wrk_or_existing;
\f
<* sw8010/2, load entry procedures page ... xx...
1988.02.04*>
message rename wrk page 1;
integer
procedure rename_wrk (z, entry, discno);
zone z ;
integer array entry ;
integer discno ;
<*********************************************************>
<* *>
<* The procedure tries to rename the entry given. If it *>
<* cannot be renamed because of name overlap, it tries *>
<* to remove the entry in the way and rename again. If *>
<* the procedure fails to rename the entry, it is re- *>
<* moved instead, and a proper message is displayed on *>
<* current out. *>
<* If the procedure succeeds, the number of the disc a- *>
<* mong included discs which holds the new entry is re- *>
<* turned. *>
<* *>
<* Call : rename_wrk (z, entry); *>
<* *>
<* z (call value, zone). The zone is supposed to *>
<* contain the old entry name. *>
<* entry (call value, integer array). The entry is sup- *>
<* posed to be contained in entry (1:17). *>
<* discno (return value, integer). If the procedure re- *>
<* turns ok (= 0), the number of the disc holding *>
<* the new entry is returned in discno, else the *>
<* value is returned unchanged. *>
<* *>
<*********************************************************>
begin
integer result, key, first_slice, permkey, min_auxcat_permkey,
twice_chain_no, i, j;
integer array headtail (1:17), first_bs, chain_addr, dummyia (1:1),
entry_name (1:4);
long array bs_name (1:2);
integer field size;
integer array field base, tail;
long array field name, doc, disc;
zone zhelp (1, 1, stderror);
base := 2; <*fields entry base*>
name := 6; <* - - name*>
tail := 14; <* - - tail*>
size := 16; <* - - size*>
doc := 16; <* - - docname*>
min_auxcat_permkey := 2;
tofrom (entry_name, entry.name, 8); <*move entry name into int array*>
\f
<* sw8010/2, load entry procedures page ... xx...
1988.02.04 *>
message rename wrk page 2;
set_catbase (entry.base);
result := monitor (46) rename entry :(z, 1, entry_name);
if test then
begin integer array zdescr (1:20);
long array field zname;
zname := 2;
getzone6 (z, zdescr);
write (out,
"nl", 1, <:rename wrk ::>,
"nl", 1, <:old name = :>, zdescr.zname,
"nl", 1, <:new name = :>, entry.name ,
"nl", 1, <:ent base = :>, entry.base (1), entry.base (2),
"nl", 1, <:result = :>, result);
end;
if result = 0 then
begin <*reopen zone z*>
close (z, true);
open (z, 0, entry_name, 0);
end;
if (result = 0 <*renamed *>
or result = 3) and <*name overlap*>
entry.size >= 0 then
begin <*check whether or not to cut area*>
integer result1;
result1 := monitor (76) head and tail :(z, 1, headtail);
if test then
begin
integer array zdescr (1:20);
integer array field zname;
zname := 2;
getzone6 (z, zdescr);
write (out,
"nl", 1, <:lookup head and tail : :>, zdescr.zname,
"nl", 1, <:result : :>, result1 );
end;
if result1 = 0 and
entry.size <> headtail.size then
begin <*cut area*>
result1 := monitor (44) change entry :(z, 1, entry.tail);
if test then
begin
integer array zdescr (1:20);
integer array field zname;
zname := 2;
getzone6 (z, zdescr);
write (out,
"nl", 1, <:change entry : :>, zdescr.zname,
"nl", 1, <:entry.size : :>, entry.size ,
"nl", 1, <:result : :>, result1);
end;
if result1 > 0 then
begin <*could not be changed*>
reset_catbase;
monitor_alarm (out, 44, entry.name, result1);
end;
end <*cut area*>;
end <*check whether ...*>;
\f
<* sw8010/2, load entry procedures page ... xx...
1988.02.04*>
message rename wrk page 1a;
if result > 0 and result <> 3 then
begin <*could not be renamed, remove entry and alarm*>
monitor (48) remove entry :(z, 1, dummyia);
reset_catbase;
monitor_alarm (out, 46, entry.name, result);
end else
begin <*renamed or not found.name overlap*>
if result = 3 then
begin <*not found.name overlap*>
if monitor (76) head and tail :(z, 1, headtail) > 0
or headtail.base (1) <> entry.base (1)
or headtail.base (2) <> entry.base (2) then
monitor_alarm (out, 46, entry.name, result) <*not found*>
else
if entry.size <> headtail.size then
write (out,
"nl", 1, "*", 3, "sp", 1, true, 12, headtail.name, <:not renamed:>)
else
begin <*name equivalence*>
open (zhelp, 0, entry_name, 0);
close (zhelp, true );
result := monitor (48) remove entry :(zhelp, 1, dummyia);
if test then
begin integer array zdescr (1:20); long array field zname;
zname := 2;
getzone6 (zhelp, zdescr);
write (out,
"nl", 1, <:remove entry ::>,
"nl", 1, <:name = :>, zdescr.zname,
"nl", 1, <:result = :>, result);
end;
if result > 0 then
begin <*old entry could not be removed*>
monitor (48) remove entry :(z, 1, dummyia);
reset_catbase;
monitor_alarm (out, 48, entry.name, result);
end else
begin <*old entry is removed*>
result := monitor (46) rename entry :(z, 1, entry_name);
if result > 0 then
begin <*could not be renamed, remove wrk and alarm*>
monitor (48) remove entry :(z, 1, dummyia);
reset_catbase;
monitor_alarm (out, 46, entry.name, result);
end;
end <*old entry removed*>;
end <*name equivalence*>;
end <*not found.name overlap*>;
\f
<* sw8010/2, load entry procedures page ... xx...
1984.08.28 ▶1c◀*>
message rename wrk page 3;
if result = 0 then
begin <*renamed, find the name of the disc holding the entry*>
if entry.size >= 0 then <*area entry, docname = discname*>
begin <*area entry, discname = docname*>
for i := 1, 2 do
bs_name (i) := entry.doc (i);
end else
begin <*non-area entry, find disc*>
first_slice := entry (1) shift (-12) extract 12;
perm__key := entry (1) extract 3;
if perm_key < min_auxcat_permkey then
system (5 )move core:( 98, chain_addr) <*disc with maincat*>
else
begin <*permanented into auxcat*>
twice_chain_no := first_slice extract 10;
system (5 )move core:( 92, first_bs); <*first drum/disc*>
system (5 )move core:( first_bs (1) + twice_chain_no,
chain_addr);
end;
system (5 )move core:( chain_addr (1) - 18, bs_name);
end <*non-area*>;
j := 0;
for i := 1 step 1 until no_of_discs do
begin <*search the name of the disc in discname table*>
disc := 8 * i; <*fields name of discno i in discname*>
if incl_discname.disc (1) = bs_name (1) and
incl_discname.disc (2) = bs_name (2) then
begin j := i; i := no_of_discs; end;
end <*search*>;
discno := j; <*0 means disc not found or not specified*>
if test then
write (out,
"nl", 2, <:rename wrk ::>,
"nl", 1, <:disc name found = :>, bsname,
"nl", 1, <:disc no returned = :>, discno);
end <*find disc holding the entry*>;
end <*renamed or ...*>;
reset_catbase;
close (z, true); <*remove process*>
rename_wrk := result;
end rename_wrk;
\f
<* sw8010/2, load entry procedures page ... xx...
1984.11.09 *>
message monitor alarm page 1;
procedure monitor_alarm (z, entry, name, result);
value result ;
zone z ;
long array name ;
integer entry, result ;
<***********************************************************>
<* *>
<* The procedure writes a monitor alarm on the zone z *>
<* provided the result code is *>
<* positive and less than 8, else the call is blind. *>
<* *>
<* Call : monitor alarm (z, entry, name, result); *>
<* *>
<* z (call value, zone). Determines the document, *>
<* position of the document, ... where to write *>
<* alarm. *>
<* entry (call value, integer). Number of a monitor en- *>
<* try. (40, 50 or 90 , 74, 44, 46, 48) *>
<* name (call value, long array). The name of the en- *>
<* try used in the monitor call. *>
<* result (call value, integer). The result code of the *>
<* monitor call. *>
<* *>
<***********************************************************>
begin
integer start_pos;
if result> 0 and result < 8 then
begin
entry :=
if entry = 40 then 1 else
if entry = 50 then 2 else
if entry = 90 then 3 else
if entry = 74 then 4 else
if entry = 44 then 5 else
if entry = 46 then 6 else 7;
\f
<* sw8010/2, load entry procedures page ... xx...
1988.02.04 *>
message monitor alarm page 2;
startpos :=
write_alarm (z, case entry of (
<:create entry:> ,
<:permanent entry:>,
<:permanent entry in auxcat:>,
<:set entry base:> ,
<:change entry:> ,
<:rename entry:> ,
<:remove entry:> ));
write (z, name, "sp", 1, case (result + 1) of (
<:result 0:>,
<:result 1:>,
<:catalog i/o error/document not ready:>,
<:name conflict/not found:>,
case entry of (<:claims exceeded:>,
<:entry protected/key illegal:>,
<:entry protected/key illegal:>,
<:entry protected/base illegal:>,
<:entry protected:>,
<:entry protected:>,
<:entry protected:>),
case entry of (<:catbase outside std base:>,
<:reserved by another:>,
<:used by another/already in another aux catalog:>,
<:used by another:>,
<:used by another:>,
<:used by another:>,
<:used by another:>),
case entry of (<:name format illegal:>,
<:claims exceeded:>,
<:claims exceeded:>,
<:name format illegal:>,
<:new size illegal/claims exceeded:>,
<:name format illegal:>,
<:name format illegal:>),
<:maincat not present:>));
errorbits := 2; <*warning.yes, ok.yes*>
end;
end monitor alarm;
\f
<* sw8010/2, load entry procedures page ... xx...
1984.07.10*>
message terminate alarm page 1;
procedure terminate_alarm (z, text, name, val, text1, val1);
value val, val1 ;
zone z ;
string text, text1 ;
long array name ;
integer val, val1 ;
<***********************************************************>
<* *>
<* The procedure terminates with an invisible runtime alarm*>
<* after having written an alarm message on the zone z. *>
<* *>
<* Call: terminate_alarm (z, text, name, val, text1, val1);*>
<* *>
<* z (call and return value, zone). The document, the *>
<* buffering and the position of the document where *>
<* to write the alarm message. *>
<* text (call value, string). *>
<* text1 *>
<* name (call value, long array). *>
<* val (call value, integer). All values which are writ- *>
<* val1 ten on the zone z. *>
<* *>
<***********************************************************>
begin
write_alarm (z, text);
write (z, "nl", 1, "sp", 4,
true, 12, name, <: :>, val, text1, val1);
trapmode := 1 shift 13; <*ignore output of trap alarm*>
trap (1); <*alarm*>
end terminate_alarm;
\f
<* sw8010/2, load entry procedures page ... xx...
1988.01.28*>
message continue warning page 1;
procedure continue_warning (z, text, name, val, text1, val1);
value val, val1 ;
zone z ;
string text, text1 ;
long array name ;
integer val, val1 ;
<***********************************************************>
<* *>
<* The procedure continues after having written an warning *>
<* message on the zone z. The fp mode bits are set *>
<* warning.yes ok.yes *>
<* *>
<* Call: continuewarning (z, text, name, val, text1, val1);*>
<* *>
<* z (call and return value, zone). The document, the *>
<* buffering and the position of the document where *>
<* to write the alarm message. *>
<* text (call value, string). *>
<* text1 *>
<* name (call value, long array). *>
<* val (call value, integer). All values which are writ- *>
<* val1 ten on the zone z. *>
<* *>
<***********************************************************>
begin
write_alarm (z, text);
write (z, "nl", 1, "sp", 4,
true, 12, name, <: :>, val, text1, val1);
errorbits := 2; <*warning.yes, ok.yes*>
end continue_warning;
\f
<* sw8010/2, load parameter interpretation page ... 40...
1988.08.21*>
message mount param page 1;
integer
procedure mount_param (seplength, item);
value seplength ;
integer seplength ;
real array item ;
<***************************************************************>
<* *>
<* The procedure returns the kind of the item given. *>
<* *>
<* Call : mount_param (seplength, item); *>
<* *>
<* mount_param (return value, integer). The kind of the *>
<* item : *>
<* 0 seplength<> <s> or ., item not below *>
<* 1 seplength = <s> or ., item = mountspec *>
<* 2 -"- , -"- release *>
<* 3 -"- , -"- mt62, mtlh, mto *>
<* 4 -"- , -"- mte *>
<* 5 -"- , -"- mt16, mtll, nrz *>
<* 6 -"- , -"- nrze *>
<* 7 -"- , -"- mt32 *>
<* 8 -"- , -"- mt08 *>
<* 9 -"- , -"- mthh *>
<* 10 -"- , -"- mthl *>
<* seplength (call value, integer). Separator < 12 + *>
<* length as for system (4, ...). *>
<* item (call value, array). An item in *>
<* item (1:2) as for system (4, ...). *>
<* *>
<***************************************************************>
\f
<* sw8010/2, load parameter interpretation page ... 41...
1988.08.21 *>
message mount param page 2;
begin
integer i, j, space_txt, point_txt;
space_txt := 4 shift 12 + 10;
point_txt := 8 shift 12 + 10;
j := 0;
for i := 1 step 1 until
(if seplength <> space_txt and
seplength <> point_txt then 0 else 10) do
if item (1) = real ( case i of (
<:mount:> add 's',
<:relea:> add 's',
<:mt62:> ,
<::> ,
<:mt16:> ,
<::> ,
<:mt32:> ,
<:mt08:> ,
<::> ,
<::> ) ) and
item (2) = real ( case i of (
<:pec:> ,
<:e:> ,
<::> ,
<::> ,
<::> ,
<::> ,
<::> ,
<::> ,
<::> ,
<::> ) )
or item (1) = real ( case i of (
<::> ,
<::> ,
<:mtlh:> ,
<::> ,
<:mtll:> ,
<::> ,
<::> ,
<::> ,
<:mthh:> ,
<:mthl:> ) ) and
item (2) = real ( case i of (
<::> ,
<::> ,
<::> ,
<::> ,
<::> ,
<::> ,
<::> ,
<::> ,
<::> ,
<::> ) )
or item (1) = real ( case i of (
<::> ,
<::> ,
<:mto:> ,
<:mte:> ,
<:nrz:> ,
<:nrze:> ,
<::> ,
<::> ,
<::> ,
<::> ) ) and
item (2) = real ( case i of (
<::> ,
<::> ,
<::> ,
<::> ,
<::> ,
<::> ,
<::> ,
<::> ,
<::> ,
<::> ) ) then
begin j := i; i := 10; end;
mount_param := j;
end mount_param;
\f
<* sw8010/2, load parameter interpretation page ... 41...
1984.07.10 *>
message special param page 1;
integer
procedure special_param (seplength, item);
value seplength ;
integer seplength ;
array item ;
<*********************************************************>
<* *>
<* The procedure returns the kind of the item given, may-*>
<* be using one look ahead. *>
<* *>
<* Call : special_param (seplength, item); *>
<* *>
<* special_param (return value, integer). The kind of *>
<* the item : *>
<* 0 not <s><name>, <s><name> unknown *>
<* or <s><name> one or below but the *>
<* next item is an entry specifier. *>
<* 1 <s><name> and name = copy *>
<* 2 <s><name> and name = level *>
<* 3 <s><name> and name = list *>
<* 4 <s><name> and name = test *>
<* 5 <s><mame> and name = load *>
<* 6 <s><name> and name = survey *>
<* 7 <s><name> and name = check *>
<* 8 <s><name> and name = connect *>
<* seplength (call value, integer). Separator < 12 *>
<* + length as for system (4, ...). *>
<* item (call value, array). An item in *>
<* item (1:2) as for system (4, ...). *>
<* *>
<* The procedure may read the next item which however *>
<* will be re-read by the next call of scan param. *>
<* *>
<*********************************************************>
\f
<*sw8010/2, load parameter interpretation page ... 42...
1985.02.06 *>
message special param page 2;
begin
integer i, j, space_txt, point_int,
next_seplength, entry_spec_val;
real array next_item (1:2);
space_txt := 4 shift 12 + 10;
point_int := 8 shift 12 + 4;
j := 0;
for i := 1 step 1 until (if seplength <> space_txt then 0 else 11) do
if item (1) = real ( case i of (
<:vol:> ,
<:copy:> ,
<:segm:> ,
<:level:>,
<:list:> ,
<:test:> ,
<:load:> ,
<:surve:> add 'y',
<:check:>,
<:conne:> add 'c',
<:reser:> add 'v' )) and
item (2) = real ( case i of (
<::>,
<::>,
<::>,
<::>,
<::>,
<::>,
<::>,
<::>,
<::>,
<:t:>,
<:e:> )) then
begin j := i; i := 11; end;
if j > 0 then
begin <*<s><name> known, look ahead*>
next_seplength := scan_param (next_item);
repeat_param := true;
entry_spec_val :=
entry_specifier (next_seplength, next_item, false <*no further look ahead*>);
if j <= 4 <*integer*> and next_seplength <> point_int <*not .<int>*>
or j > 4 <*name *> and entry_spec_val < 3 <*not .<name> or entry*> then
j := 0; <*entry name*>
end <*<s><name> known, look ahead*>;
special_param := j;
end special_param;
\f
<*sw8010/2, load parameter interpretation page ... 43...
1981.12.09 *>
message file no tape name page 1;
integer
procedure file_no_tape_name (name, tape_name, modekind);
real array name ;
long array tape_name ;
integer modekind ;
<*********************************************************>
<* *>
<* The procedure looks up a name in the catalog to see *>
<* whether it is a file descriptor describing a magnetic *>
<* tape. *>
<* If it is not, the name is returned as tapename and *>
<* file number zero is returned as procedure value. *>
<* if it is, the document name of the entry is returned *>
<* as tapename, the modekind in modekind and the file *>
<* number as procedure value. *>
<* *>
<* Call : file_no_tape_name (name, tapename, modekind);*>
<* *>
<* file_no_tape_name (return value, integer). If the *>
<* name is found in the catalog and *>
<* kind is mt (18), the file number *>
<* of the entry, else zero. *>
<* name (call value, real array). The name *>
<* to be looked up in the catalog in *>
<* name (1:2). *>
<* tape_name (return value, long aray). If the *>
<* name is found in the catalog and *>
<* kind is mt (18), tapename (1:2) *>
<* will contain the document bame of *>
<* the entry, else it contains the *>
<* name given. *>
<* modekind (return value, integer). If the *>
<* name is found in the catalog and *>
<* kind is mt, the modekind of the *>
<* entry is returned here, else un- *>
<* changed. *>
<* *>
<*********************************************************>
begin
integer i;
integer array entry (1:10);
integer field kind, file;
long array field docname;
zone z (1, 1, stderror);
kind := docname := 2; <*fields modekind and docname in an entry*>
file := 14; <*fields file number in an entry*>
entry.kind := 0; <*default*>
open (z, 0, name, 0); <*name in zone*>
close (z, true );
if monitor (42) lookup entry :(z, 1, entry) <> 0
or entry.kind extract 12 <> 18 then
begin <*not in catalog or not describing a magnetic tape*>
for i := 1, 2 do tape_name (i) := long name (i);
file_no_tape_name := 0 ;
<*modekind unchanged*>
end else
begin <*magtape file descriptor*>
for i := 1, 2 do tape_name (i) := entry.docname (i);
file_no_tape_name := entry.file ;
modekind := entry.kind ;
end;
end file_no_tape_name;
\f
<* sw8010/2, load parameter interpretation page ... 44...
1981.12.09 *>
message entry specifier page 1;
integer
procedure entry_specifier (seplength, item, look_ahead);
value seplength ;
integer seplength ;
array item ;
boolean look_ahead ;
<*********************************************************>
<* *>
<* The procedure returns the kind of the item given, de- *>
<* cided with one look ahead if so specified. *>
<* *>
<* Call : entry_specifier (seplength, item, look_ahead); *>
<* *>
<* entry_ *>
<* specifier (return value, integer). The kind of the *>
<* item given : *>
<* 0 not .<name> *>
<* 1 .<name> and name = scope *>
<* 2 .<name> and name = docname *>
<* 3 .<name> and name none of above de- *>
<* cided witn no look ahead, *>
<* or one look ahead reveals *>
<* the next item to be one of *>
<* above. *>
<* seplength (call value, integer). Separator < 12 + *>
<* length as for system (4, ...). *>
<* item (call value, array). An item as for sys- *>
<* tem (4, ...). *>
<* look_ahead (call value, boolean). If true, the kind *>
<* of the item is decided with one look a- *>
<* head, else without. *>
<* *>
<* In case of one look ahead, the procedure reads the *>
<* next item, which will be re-read at next call of *>
<* scan_param. *>
<* *>
<*********************************************************>
\f
<* sw8010/2, load parameter interpretation page ... 45...
1982.03.23 *>
message entry specifier page 2;
begin
integer i, j, point_txt, next_seplength;
real array next_item (1:2);
point_txt := 8 shift 12 + 10;
j := 0;
for i := 1 step 1 until (if seplength <> point_txt then 0 else 2) do
if item (1) = real (case i of (
<:scope:>, <:docna:> add 'm' )) and
item (2) = real (case i of (
<::> , <:e:> )) then
begin j := i; i := 3; end;
if seplength = point_txt and j = 0 then
j := 3 <*.<name>, unknown, no look ahead*>
else
if seplength = point_txt and look_ahead then
begin <*known, look ahead*>
next_seplength := scan_param (next_item);
repeat_param := true;
if entry_specifier (next_seplength, next_item, -,look_ahead) < 3 then
j := 3; <*entry name*>
end <*known, look ahead*>;
entry_specifier := j;
end entry_specifier;
\f
<* sw8010/2, load parameter interpretation page ... 46...
1981.12.09 *>
message load specifier page 1;
integer
procedure load_specifier (seplength, item);
value seplength ;
integer seplength ;
array item ;
<*********************************************************>
<* *>
<* The procedure returns the kind of the item given, de- *>
<* cided with one look ahead. *>
<* *>
<* Call : load_specifier (seplength, item); *>
<* *>
<* load_specifier (return value, integer). The kind : *>
<* 0 not <s><name> *>
<* 1 <s><name>, name = changedisc (kit) *>
<* 2 <s><name>, name = newscope *>
<* 3 <s><name>, name = disc (or kit) *>
<* 4 <s><name>, name not above or next *>
<* is .scope, .docname or *>
<* not .<name> *>
<* seplength (call value, integer). Separator < 12 *>
<* + length as for system (4, ...). *>
<* item (call value, array). An item as for *>
<* system (4, ...). *>
<* The procedure reads next param, which will be re-read *>
<* at next call of scan_param. *>
<* *>
<*********************************************************>
\f
<* sw8010/2, load parameter interpretation page ... 47...
1982.03.24 *>
message load specifier page 2;
begin
integer i, j, space_txt, next_seplength;
real array next_item (1:2);
space_txt := 4 shift 12 + 10;
j := 0;
for i := 1 step 1 until (if seplength <> space_txt then 0 else 3) do
if item (1) = real ( case i of (
<:chang:> add 'e', <:newsc:> add 'o', <:disc:> )) and
item (2) = real ( case i of (
<:disc:> , <:pe:> , <::> ))
or item (1) = real ( case i of (
<:chang:> add 'e', <:newsc:> add 'o', <:kit:> )) and
item (2) = real ( case i of (
<:kit:> , <:pe:> , <::> )) then
begin j := i; i := 3; end;
if seplength = space_txt and j = 0 then
j := 4 <*<s><name>, unknown, no look ahead*>
else
if seplength = space_txt then
begin <*name known, look ahead*>
next_seplength := scan_param (next_item);
repeat_param := true;
if entry_specifier (next_seplength, next_item, false <*no look ahead*>) < 3 then
j := 4; <*entry name*>
end <*look ahead*>;
<*curr param is <s><name> but no load spec keyword or *>
<*next param is .scope, .docname or anything but .<name>*>
load_specifier := j;
end load_specifier;
\f
<* sw8010/2, load parameter interpretation page ... 48...
1982.12.28 *>
message list specifiers page 1;
procedure list_specifiers (z, pos, n, no, spec, discname, name, scope, doc);
value pos, n, no ;
zone z ;
integer pos, n, no ;
boolean array spec ;
integer array scope ;
long array discname, name, doc ;
<*********************************************************>
<* *>
<* The procedure lists on the document connected to z *>
<* the values of the specifiers given. *>
<* *>
<* Call : list_specifiers (z, pos, n, no, spec, discname,*>
<* name, scope, doc_name);*>
<* *>
<* z (call and return value). The name, buffe- *>
<* ring and position of the document. *>
<* pos (call value, integer). The number of posi- *>
<* tions defining the left margin. *>
<* n (call value, integer). The number of load *>
<* specifiers in the call. *>
<* no (call value, integer). The max number of *>
<* different discs specified in call. *>
<* spec (call value, integer). The value of spec (i)*>
<* is true if disc number i is specified. *>
<* discname (call value, long array). Element (i,1) and *>
<* (i, 2) contain the name of disc number i. *>
<* name (call value, long array). A name is packed *>
<* in name (1:2) or name (1) = 0. *>
<* scope (call value, integer array). The scope of en-*>
<* try specifier no i in call is found in scope *>
<* (i) coded as for the procedure scan_cat. *>
<* doc (call value, long array). A docname is pack- *>
<* in doc (1:2) or doc (1) = 0. *>
<* *>
<*********************************************************>
\f
<* sw8010/2, load parameter interpretation page ... 49...
1982.12.28 *>
message list specifiers page 2;
begin
integer disc_no, curr_pos, entry_spec;
long array field disc, name_f;
write (z, <:according to following specifier:>,
if n > 1 then <:s ::> else <: ::>, "nl", 1);
for entry_spec := 1 step 1 until n do
begin <*for each entry spec*>
curr_pos :=
write (out, "nl", 1, "sp", pos, <:discs : disc:>);
for discno := 1 step 1 until no do
begin <*for each disc specified*>
disc := 8 * (entry_spec * no + discno);
if spec (entry_spec, discno) then
begin <*write discname*>
if curr_pos >= 71 then
curr_pos := write (out, ",", 1, "nl", 1, "sp", pos + 12) - 2;
curr_pos := curr_pos +
(if discname.disc (1) <> long <::> then
write (z, <:.:>, discname.disc)
else
write (z, <:.any:>));
end <*write discname*>;
end <*for each disc specified*>;
write (z, "nl", 1, "sp", pos, <:entry ::>);
name_f := 8 * entry_spec;
if name (entry_spec, 1) <> 0 then
write (z, "sp", 1, name.name_f);
if scope (entry_spec) <> 0 then
write (z, if name.name_f (1) <> 0 then <:.:> else <: :>,
<:scope.:>, case scope (entry_spec) of (
<:all:>, <:perm:>, <:system:>,<:own:>,
<:project:>, <:user:>, <:login:>, <:temp:> ));
if doc.name_f (1) <> 0 then
write (z,
if name.name_f (1) <> 0 or scope (entry_spec) <> 0 then <:.:> else <: :>,
<:docname.:>, doc.name_f );
end <*for each entry spec*>;
end list_specifiers;
\f
<* sw8010/2, load catalog scanning page ... 52...
1985.02.06 *>
message scan cat page 1;
boolean
procedure scan_cat (z , length ,
name , scope , newscope, docname ,
no_of_specs , disc_specified, discname, newdiscname,
actual_scope, spec , disc_no );
value length ,
no_of_specs ;
zone z ;
integer length ,
no_of_specs ,
actual_scope, spec , discno ;
long array name , docname ,
discname, newdiscname;
integer array scope , newscope ;
boolean array disc_specified ;
<*********************************************************>
<* *>
<* The procedure scans the save catalog for the next en- *>
<* try with name, scope, docname and discname speci- *>
<* fied in an entry specifier and returns true if such *>
<* an entry is found before the terminating empty entry. *>
<* If an entry is found, its actual scope is returned *>
<* with the entry record and the discno in the *>
<* disc name table where the name of the disc is found *>
<* is returned too, along with the index in the entry *>
<* specifier tables. *>
<* *>
<* Call : scancat (z , length , *>
<* name , scope , *>
<* newscope , docname , *>
<* no_of_specs , disc_specified, *>
<* disc_name , actual_scope , *>
<* spec , discno ); *>
<* *>
<* scan_cat (return value, boolean). True if a qualifi-*>
<* ed entry is found, false if not, which *>
<* means end of scan. *>
<* z (call and return value, zone). The name of *>
<* the save catalog. Determines further the *>
<* document, the buffering and the position *>
<* of the document. *>
<* If the procedure returns true, the zone re-*>
<* cord contains an entry record, length hwds *>
<* long. *>
<* length (call value, integer). The length of the re-*>
<* cords in the save catalog. *>
<* name (call value, long array). A name is packed *>
<* in name (i, 1:2) or name (i, 1) = 0, mea- *>
<* ning any name, i = 1, 2, 3, ..., noofspecs.*>
<* *>
<*********************************************************>
\f
<* sw8010/2, load catalog scanning page ... 53...
1985.02.06 *>
message scan cat page 2;
<*********************************************************>
<* *>
<* scope (call value, integer array). *>
<* *>
<* scope (i), i = 1, ... means : *>
<* 0 any scope visible (base <= std *>
<* or *>
<* base >= std) *>
<* and *>
<* (base <= max *>
<* or *>
<* base >= max), any key*>
<* 1 all base <= std , -"- *>
<* 2 perm base <= std , key = 3*>
<* 3 system base = sys , -"- *>
<* 4 own any of below *>
<* 5 project base = max , key = 3*>
<* 6 user base = user, key = 3*>
<* 7 login base = std , key = 2*>
<* 8 temp base = std , key = 0*>
<* newscope (call value, integer array). cf. scope. *>
<* docname (call value, long array). A document name *>
<* packed in docname (i, 1:2) or *>
<* docname (i, 1) = 0 meaning any docname. *>
<* noofspecs (call value, integer). The number of entry *>
<* specifiers to search. *>
<* disc_specified *>
<* (call value, boolean array). cf. the pro- *>
<* cedure check_docname_discno. *>
<* disc_name (call value, long array). cf. the procedu- *>
<* new_ re check_docname_discno. *>
<* disc_name *>
<*********************************************************>
\f
<* sw8010/2, load catalog scanning page ... 53...
1984.04.25 *>
message scan cat page 3;
<*********************************************************>
<* *>
<* actual_ *>
<* scope (return value, integer). If scan_cat re- *>
<* turns true, actual_scope is the scope of *>
<* the entry found, according to below table: *>
<* 0 visible, none of below *>
<* 3 system *>
<* 5 project *>
<* 6 user *>
<* 7 login *>
<* 8 temp *>
<* If scan_cat returns false, actual_scope is *>
<* undefined. *>
<* spec (return value, integer). If the procedure *>
<* returns true, the entry specifier meeting *>
<* the demands of the entry is indexed by spec*>
<* If it returns false, spec is undefined. *>
<* discno (call and return value, integer). *>
<* If discno < 0 at call the disc where the *>
<* entry is found will not be searched or che-*>
<* cked and discno returns unchecked. *>
<* If discno >= 0 at call and the procedure *>
<* returns true, the name of the disc where *>
<* the entry belongs is found in discname *>
<* (spec, discno, 1:2) and disc_specifi- *>
<* ed (spec, discno) is true. *>
<* If discno >= 0 at call and the procedure *>
<* returns false, discno > 0 means that the *>
<* name of the disc where the entry belongs *>
<* is found in discname (spec, discno, 1:2) *>
<* and disc_specified (spec, discno) is true, *>
<* but the *>
<* docname didnt fit, while discno = 0 means *>
<* that the disc is not found or it is not *>
<* specified. *>
<* *>
<*********************************************************>
\f
<* sw8010/2, load catalog scanning page ... 53...
1984.08.27 *>
message scan cat page 4;
begin
boolean found, endcat;
integer dummy;
integer field ifld, n_scope, a_scope;
integer array field entry;
long array field laf, new_diskname;
\f
<* sw8010/2, load catalog scanning page ... 54...
1985.02.06 *>
message scan cat page 5;
entry := 0; <*fields the zone record into an integer array*>
a_scope := 38;
n_scope := 40;
new_diskname := 42;
<*find the next entry record in the save catalog which meets*>
<*the specifications of one of the specifiers recorded *>
found := false;
repeat <*until found or endcat*>
endcat := -, next_entry (z, length);
if -, endcat then
begin <*check the next entry*>
if test then
begin
write (out,
"nl", 2, <:scan cat ::>,
"nl", 1, <:entry = :>);
listentry (out, false, z.entry, z.ascope, z.ascope, z.nscope, 0);
end;
change_entry (z.entry, z.a_scope, z.n_scope, z.new_diskname, true <*dump*>);
<*change the entry according to dump specifiers*>
for i := 1 step 1 until no_of_specs do
begin <*search entry specifier*>
laf := 8 * i;
ifld := 2 * i;
found := checkname (z.entry, name.laf);
<*found <=> name fits*>
if test then
write (out, "nl", 1, <:entry spec = :>, i,
<:name :>, if found then <:found :> else <:failed :>);
if found then
found :=
check_scope (z.entry, scope.ifld, actual_scope, newscope.ifld);
<*found <=> name and scope fits*>
if test then
write (out,
<:scope :>, if found then <:found :> else <:failed :>);
if found then
found :=check_docname_discno (z.entry, docname.laf, i, discno,
discspecified, discname, new_discname);
<*found <=> name, scope, docname and discname fits*>
if test then
write (out,
<:docname :>, if found then <:found:> else <:failed:>);
if found then
begin
spec := i ;
i := no_of_specs;
end;
end <*search for entry specifier*>;
end <*-, endcat*>;
until found or endcat;
scan_cat := found;
end scan_cat;
\f
<* sw8010/2, load catalog scanning page ... 55...
1984.08.28 *>
message next entry page 1;
boolean
procedure next_entry (z, length);
value length ;
zone z ;
integer length ;
<**********************************************************>
<* *>
<* The procedure transfers the next entry from the save *>
<* catalog and returns true. If, however, the end of the *>
<* catalog is met (zeroed entry) the procedure returns *>
<* false. *>
<* *>
<* Call : next_entry (z, length); *>
<* *>
<* next_entry (return value, boolean). False if end of *>
<* catalog is met, true otherwise. *>
<* z (call and return value, zone). The name of *>
<* catalog. Determines further the document, *>
<* the buffering and the position of the docu-*>
<* ment. *>
<* length (call value, integer). The length of the *>
<* entry record wanted. *>
<* *>
<**********************************************************>
begin
\f
<* sw8010/2, load catalog scanning page ... 56...
1984.08.28 *>
message next entry page 2;
boolean end_of_cat;
integer hw;
long array field laf;
laf := 0;
hw := inrec6 (z, 0);
if hw >= length then
begin <*next entry record available in zone, maybe empty*>
inrec6 (z, length);
end_of_cat := z.laf (1) = long <::>
end else
if hw = 512 mod length then
begin <*end of segment*>
inrec6 (z, hw);
end_of_cat := -, next_entry (z, length)
end else
system (9) rs alarm :(hw, <:<10>save cat:>); <*catalog io error*>
next_entry := -, end_of_cat;
end next_entry;
\f
<* sw8010/2, load catalog scanning page ... 56...
1981.12.09 *>
message check name page 1;
boolean
procedure check_name (entry, name);
integer array entry ;
long array name ;
<**********************************************************>
<* *>
<* The procedure returns true if the name of the entry *>
<* given equals the name given and is neither c nor v nor *>
<* primout with associated permkeys (0 and 2 resp.). *>
<* *>
<* Call : check_name (entry, name); *>
<* *>
<* check_name (return value, boolean). True if the en- *>
<* try name in entry (4:7) equals the name *>
<* packed in name (1:2) or name (1) = 0, mea-*>
<* ning any name, and the name is neither c *>
<* nor v with permkey 0, nor is it primout *>
<* with permkey 2. *>
<* entry (call value, integer array). An entry *>
<* head and tail is packed in entry (1:17). *>
<* name (call value, long array). A name is pack- *>
<* ed in name (1:2) or name (1) = 0, meaning *>
<* any name. *>
<* *>
<**********************************************************>
begin
integer permkey;
long array field name_f;
permkey := entry (1) extract 3;
name_f := 6; <*fields entry name in entry*>
check_name :=
(name (1) = 0
or name (1) = entry.name_f (1) and
name (2) = entry.name_f (2)) and
<*not c, v or primout*>
((entry.name_f (1) <> long <:c:> and
entry.name_f (1) <> long <:v:> or permkey <> 0) and
(entry.name_f (1) <> long <:primo:> add 'u' or
entry.name_f (2) <> long <:t:> or permkey <> 2));
end check_name;
\f
<* sw8010/2, load catalog scanning page ... 57...
1984.07.10 *>
message check scope page 1;
boolean
procedure check_scope (entry, scope, actual_scope, newscope);
value scope, newscope ;
integer array entry ;
integer scope, actual_scope, newscope ;
<**********************************************************>
<* *>
<* The procedure checks whether the scope of a given en- *>
<* try fits the scope given and returns true if it does, *>
<* in any case with the actual scope of the entry. *>
<* *>
<* Call : check_scope (entry, scope, actual_scope); *>
<* *>
<* check_scope (return value, boolean). True if scope *>
<* fits, false otherwise. *>
<* entry (call value, integer array). The entry *>
<* to be checked is contained in entry *>
<* (1:17). *>
<* scope (call value, integer). The scope given *>
<* as for the procedure scan_cat. *>
<* actual_scope (return value, integer). The actual sco- *>
<* pe as for the procedure scan_cat. *>
<* newscope (call value, integer). If actualscope = *>
<* newcope = 0 and scope <>1 and scope <> 2 *>
<* the procedure must return false even if *>
<* the scope fits as the program load wont *>
<* to find an entry with zero scopekey. *>
<* *>
<**********************************************************>
begin
integer permkey, dummy, i;
integer field scope_key, n_scope_key, a_scope_key;
integer array field base;
base := 2; <*fields entry base in entry record*>
__scope_key := 36; <* - - scope - - - *>
a_scope_key := 38; <* - - actual scope - *>
n_scope_key := 40; <* - - new scope - *>
\f
<* sw8010/2, load catalog scanning page ... 58...
1984.11.01 *>
message check scope page 2;
permkey := entry (1) extract 3;
if entry.scopekey = 1
or entry.scopekey = 2 then
begin <*dumped by scope all or scope perm*>
actual_scope := 0; <*none of below*>
for i := 3, 5, 6, 7, 8 do
if entry.base (1) = ( case i of (
dummy, dummy ,
sys__base (1),
dummy ,
max__base (1),
user_base (1),
std__base (1),
std__base (1) ) ) and
entry.base (2) = ( case i of (
dummy, dummy ,
sys__base (2),
dummy ,
max__base (2),
user_base (2),
std__base (2),
std__base (2) ) ) and
perm_key = ( case i of (
dummy, dummy ,
3 ,
dummy,
3 ,
3 ,
2 ,
0 ) ) then
actual_scope := i;
<*notice : if case i true and case j true and i < j then*>
<*actual_scope := j, which means that if two scopes are *>
<*identical, actual_scope becomes the lower one *>
end else
<*scope key*>
actual_scope :=
if entry.n_scope_key = 0 then
entry.a_scope_key
else
entry.n_scope_key;
\f
<* sw8010/2, load catalog scanning page ... 59...
1984.11.20 *>
message check scope page 3;
check_scope :=
(case (scope + 1) of (
if entry.scopekey = 1 <*saved by scope.all *>
or entry.scopekey = 2 <*saved by scope.perm*> then
(entry.base (1) >= std_base (1) and
entry.base (2) <= std_base (2) <*in std*>
or
entry.base (1) <= std_base (1) and
entry.base (2) >= std_base (2)) <*out std*>
and
entry.base (1) >= max_base (1) and
entry.base (2) <= max_base (2) <*in max*>
else
actual_scope > 0 <*scope > 0*> , <*any act*>
entry.base (1) >= std_base (1) and
entry.base (2) <= std_base (2) , <*all *>
entry.base (1) >= std_base (1) and
entry.base (2) <= std_base (2) and perm_key = 3, <*perm *>
actual_scope = scope <*scope = 3*> , <*system *>
actual_scope > scope <*scope = 4*> , <*own *>
actual_scope = scope <*scope = 5*> , <*project*>
actual__scope = scope <*scope = 6*> , <*user *>
actual_scope = scope <*scope = 7*> , <*login *>
actual_scope = scope <*scope = 8*> ));<*temp *>
end check_scope;
\f
<* sw8010/2, load catalog scanning page ... 60...
1985.02.06 *>
message check docname discno page 1;
boolean
procedure check_docname_discno (entry, docname, entry_spec , discno ,
discspecified, discname ,
new_discname );
integer array entry ;
long array docname,
discname ,
new_discname ;
integer entry_spec , discno ;
boolean array discspecified ;
<**********************************************************>
<* *>
<* The procedure returns true if the document name and *>
<* the disc name of the entry given both equal the docu- *>
<* ment name and the disc name given in discname (entry_ *>
<* spec, 1:no_of_discs+no_of_unknown_discs, 1:2) of a *>
<* disc specified in discspecified (entry_spec, no_of_ *>
<* discs+no_of_unknown_discs). *>
<* *>
<* Call: check_docname_discno (entry, docname, discno) *>
<* *>
<* check_docname_discno (return value, boolean). True *>
<* if : *>
<* - the document bame of the en- *>
<* try packed in entry (9:12) e- *>
<* quals the document name pack- *>
<* ed in docname (1:2) or doc- *>
<* name (1) = 0 *>
<* and *>
<* - the name of the disc packed in*>
<* new discname field of the en- *>
<* try eqals a name *>
<* packed in discname (1:no_ *>
<* of_discs + no_of_unknowndiscs,*>
<* 1:2) and the disc *>
<* is specified in discspecified *>
<* (1:noofdiscs+noofunknowndiscs)*>
<* entry (call value, integer array). *>
<* See above. *>
<* docname (call value, long array). *>
<* See above. *>
<* entry_spec (call value, integer). The no *>
<* of the entry specifier checked*>
<* and the index in discname (1: *>
<* no_of_entry_specs, 1:no_of_ *>
<* discs+no_of_unknown_discs,1:2)*>
<* to check. *>
<* *>
<**********************************************************>
\f
<* sw8010/2, load catalog scanning page ... 61...
1985.02.06 *>
message check docname discno page 2;
<**********************************************************>
<* *>
<* discno (call and return value, int). *>
<* If discno < 0 at call, the *>
<* disc where the entry belongs *>
<* is not searched or checked and*>
<* discno returns unchanged. *>
<* If discno >= 0 at call and *>
<* the procedure returns true, *>
<* discno > 0 and the name of the*>
<* disc where entry belongs is *>
<* found in discname (entry_spec,*>
<* discno, 1:2) *>
<* and disc_specified (entryspec,*>
<* discno) is *>
<* true. *>
<* If discno >= 0 at call and *>
<* the procedure returns false *>
<* discno > 0 means that the name*>
<* of the disc where the entry *>
<* belongs is found in discname *>
<* (entry_spec, discno, 1:2) and *>
<* disc_specified (entry_spec, *>
<* discno) is true, but the *>
<* docname <> 0 and is not the *>
<* docname of the entry. If disc-*>
<* no = 0, the disc is either not*>
<* specified or it is not found *>
<* in disc name table. *>
<* disc_specified (call value, boolean array). *>
<* cf. above. *>
<* disc_name (call value, long array). *>
<* new_ cf. above. *>
<* disc_name *>
<**********************************************************>
\f
<* sw8010/2, load catalog scanning page ... 61...
1985.02.06 *>
message check docname discno page 3;
begin
integer i, j;
integer field size;
long array field doc, disc, new_diskname;
size := doc := 16; <*field size and document name in entry*>
new_diskname := 42; <* - new disc name field - - *>
if discno >= 0 then
begin <*check the name of the disc holding the entry*>
j := 0;
for i := 1 step 1 until no_of_discs + no_of_unknown_discs do
begin <*search the name of the disc in discname table*>
disc := 8 * (entry_spec * (no_of_discs + no_of_unknown_discs) + i);
if discspecified (entry_spec, i) and
(discname.disc (1) = entry.new_diskname (1) and
discname.disc (2) = entry.new_diskname (2)
or discname.disc (1) = long <::> ) then
begin
j := i;
if discname.disc (1) = long <::> and
new_discname.disc (1) = long <::> then
<*any disc ok*>
for i := 1, 2 do
new_discname.disc (i) := entry.new_diskname (i);
i := no_of_discs + no_of_unknown_discs;
end;
end <*search*>;
discno := j; <* 0 means not found or not specified*>
end <*find disc holding the entry*>;
check_docname_discno :=
(docname (1) = 0
or docname (1) = entry.doc (1) and
docname (2) = entry.doc (2)) and
(discno <> 0 ) ;
end check_docname_discname;
\f
<* sw8010/2, load base handling page ... 62...
1982.02.04 *>
message set_catbase page 1;
procedure set_catbase (base);
integer array base ;
<***********************************************************>
<* *>
<* The procedure changes the catalog base of own process *>
<* to the base given. *>
<* If the result becomes 4 : new base illegal, it is sup- *>
<* posed that the new base is outside the max base of the *>
<* process and the procedure will set cat base to max base.*>
<* *>
<* Call : set_catbase (entry); *>
<* *>
<* base (call value, integer array). The new base *>
<* in base (1:2). *>
<* *>
<***********************************************************>
begin
own
boolean called_before;
integer i;
integer array own_bases (1:8);
integer result;
integer array field max;
zone z (1, 1, stderror);
if -,called_before then
begin
called_before := true;
reset_catbase; <*init reset catbase*>
end;
open (z, 0, <::>, 0); <*own process*>
close (z, true);
for i := 1, 2 do own_bases (i) := base (i);
<*to avoid fielding in call of system*>
result := monitor (72, z, 0, own_bases);
if result = 4 then
begin <*outside max*>
max := 12; <*fields max base in own_bases (7:8)*>
system (11 )bases:( 0, own_bases);
set_catbase (own_bases.max);
end <*outside max*> else
if result <> 0 then
system (9, result, <:<10>cat base:>);
end set_catbase;
\f
<* sw8010/2, load base handling page ... 63...
1982.02.04 *>
message reset catbase page 1;
procedure reset_catbase;
<***********************************************************>
<* *>
<* The procedure resets the catbase of own process *>
<* to the original catbase before the first change *>
<* of catbase by a call of set_catbase. *>
<* *>
<***********************************************************>
begin
own
boolean called_before;
own
integer catbase_lower, catbase_upper;
if -,called_before then
begin <*save catbase and init branch*>
called_before := true;
catbase_lower := catbase (1);
catbase_upper := catbase (2);
reset_catbase;
end else
begin <*set catbase*>
integer array catbase (1:2);
catbase (1) := catbase_lower;
catbase (2) := catbase_upper;
set_catbase (catbase);
end <*set catbase*>;
end reset_catbase;
\f
<* sw8010/2, load base handling page ... 64...
1981.12.09 *>
message bases page 1;
procedure bases (cat_base, std_base, user_base, max_base, sys_base);
long array cat_base, std_base, user_base, max_base, sys_base ;
<**********************************************************>
<* *>
<* The procedure gets the cat-, std-, user- and max_bases *>
<* of the process together with the system_base and re- *>
<* turns them in the parameters. *>
<* *>
<* Call : bases (cat_base, std_base, user_base, max_base, *>
<* sys_base);*>
<* *>
<* cat_base, std_base, user_base, max_base, sys_base : *>
<* (call values, long arrays). Will at return contain *>
<* the respective bases in the first two words. *>
<* Since the type is long, base comparison will not give *>
<* integer exception. *>
<* *>
<**********************************************************>
begin
integer array ia (1:8);
system (11, 1, ia);
cat__base (1) := ia (1); cat__base (2) := ia (2);
std_base (1) := ia (3); std__base (2) := ia (4);
user_base (1) := ia (5); user_base (2) := ia (6);
max__base (1) := ia (7); max__base (2) := ia (8);
sys__base (1) := -8388607;
sys__base (2) := 8388605;
end bases;
\f
<* sw8010/2, load save catalog head page ... xx...
1984.07.10*>
message in savecat head page 1;
integer
procedure in_savecat_head (z);
zone z ;
<***********************************************************>
<* *>
<* The procedure inputs a number of segments containing a *>
<* save catalog head from the document connected to the *>
<* zone z. *>
<* *>
<* Call : in_savecat_head (z); *>
<* *>
<* in_savecathead (return value, integer). The number of *>
<* blocks input (= segments). *>
<* z (cal and return value, zone). Determi- *>
<* nes the document, the buffering and *>
<* the position of the document. *>
<* The block length must be one segment *>
<* and the zone opened to a magnetic tape.*>
<* At return the zone is positioned to *>
<* the next block after the catalog *>
<* head. *>
<* *>
<* A number of global values are input from their fields *>
<* of the catalog head and *>
<* the next block number returned as no of blocks input. *>
<* *>
<***********************************************************>
begin
integer discno, copy, volume, file, block;
<*local dummies*>
integer local_no_of_discs, local_max_no_of_vol,
local_copy_count , local_vol_count ;
long array local_tapename (1:2);
integer field ifld;
long array field disc, current_tape;
\f
<* sw8010/2, load save catalog head page ... xx...
1987.04.29 *>
message in savecat head page 2;
local_vol__count := vol__count (copy_count); <*save global vol__count*>
local_copy_count := copy_count ; <*- - copy_count*>
current_tape := name_field (copy_count , vol_count);
for i := 1, 2 do
local_tapename (i) := tapename.current_tape (i); <*save gl tapename*>
inrec6 (z, 28); <*first 28 halfs of head*>
tofrom (dumpbases, z, 16); <*move dumpbases from zone record*>
ifld := 16 + 2; local_no_ofdiscs := z.ifld;
ifld := ifld + 2; local_maxnoofvol := z.ifld;
ifld := ifld + 2; no_of_copies := z.ifld;
ifld := ifld + 2; no_of_vol (1) := z.ifld;
ifld := ifld + 2; no_of_vol (2) := z.ifld;
ifld := ifld + 2; segm := z.ifld;
if local_maxnoofvol <> max_noofvol then
terminate_alarm (out,
<:max no of volumes in save catalog incompatible with load program:>,
local_tapename, max_noofvol, <: in save catalog : :>, local_maxnoofvol);
for discno := 1 step 1 until local_no_of_discs do
begin <*discnames*>
<*disc := 8 * discno;*>
in_rec6 (z, 8);
<*tofrom (z, discname.disc, 8);*>
end;
for copycount := 1 step 1 until 2 do
for volume := 1 step 1 until max_no_of_vol do
begin <*tapenames*>
vol_count (copy_count) := volume;
current_tape := namefield (copy_count, vol_count);
in_rec6 (z, 8);
tofrom (tapename.current_tape, z, 8);
end;
stopzone (z, false );
getposition (z, file, block);
setposition (z, file, block);
for copy := 1 step 1 until no_of_copies do
for volume := 1 step 1 until no_of_vol (copy) do
begin <*find saved tapename among new tapenames*>
copy_count := copy ;
vol__count (copy_count) := volume;
current_tape := name_field (copy_count, vol_count);
if tapename.current_tape (1) = local_tapename (1) and
tapename.current_tape (2) = local_tapename (2) then
begin <*found, stop search*>
copy := no_of_copies;
volume := no_of_vol (copy);
end;
file__no (copy_count) := file__no (local_copycount);
block_no (copy_count) := block_no (local_copycount);
end <*find saved tapename*>;
in__savecathead := block;
end in_savecat_head;
\f
<* sw8010/2, load store entries page ... xx...
1984.07.10 *>
message store entries page 1;
integer
procedure store_entries (zto , zfrom , length ,
name , scope , newscope, docname ,
noofspecs, disc_specified, discname, new_discname);
value length ,
noofspecs ;
zone zto , zfrom ;
integer length ,
noofspecs ;
integer array scope , newscope ;
boolean array disc_specified ;
long array name , docname ,
discname, new_discname ;
<*********************************************************>
<* *>
<* The procedure scans the catalog connected to the zone *>
<* zfrom to find entry records with entries belonging to *>
<* the discs specified which have the proper name, scope *>
<* and document name, all according to one entry speci- *>
<* fier. *>
<* For each entry found, a record with the entry together*>
<* with an extension with room for scope, actual scope, *>
<* new scope, new disc name and one or two sets of volu- *>
<* me number, file number and block number are stored *>
<* in the catalog connected to the zone zto. *>
<* *>
<* call : *>
<* store_entries (zfrom, zto , copies, *>
<* name , scope , newscope, docname, *>
<* no_of_recs); *>
<* *>
<* storeentries (return value, integer). The number of *>
<* entries found in the save catalog be- *>
<* longing to a disc specified and satis- *>
<* fying the name, scope, document name *>
<* specifiers of one of the entry speci- *>
<* fiers in the call. *>
<* zto, zfrom (call and return value, zone). The name *>
<* of the document, the buffering and the *>
<* position of the document where to store *>
<* or get the entries. *>
<* The zone state is supposed to be ready *>
<* for outrec and is left the same. *>
<* *>
<*********************************************************>
\f
<* sw8010/2, load store entries page ... xx...
1984.08.10 *>
message store entries page 2;
<*********************************************************>
<* *>
<* length (call value, integer). The length of the*>
<* record to store away. *>
<* name (call value, long array). Either a name *>
<* is given in name (i, 1:2) or name (i, 1)*>
<* = 0, meaning any name. *>
<* scope (cal value, integer array). *>
<* Either scope (i) contains a scope value*>
<* or scope (i) = 0 meaning any scope. *>
<* newscope (call value, integer array). *>
<* Either newscope (i) contains the new *>
<* scope given or newscope (i) = 0, meaning*>
<* no change of scope. *>
<* doc_name (call value, long array). Either doc- *>
<* name (i, 1:2) contains a document name *>
<* or doc_name (i, 1) = 0 meaning any docu-*>
<* ment name. *>
<* no_of_specs (call value, integer). The number of en-*>
<* try specifications to search. *>
<* discspecified (call value, boolean array). cf. the *>
<* cedure check_docname_discno. *>
<* discname *>
<* new_ *>
<* discname (call value, long array). cf. the pro- *>
<* cedure check_docname_discno. *>
<* *>
<*********************************************************>
\f
<* sw8010/2, load store entries page ... xx...
1984.07.10 *>
message store entries page 3;
begin
integer discno, actual_scope, entries_stored, spec;
integer field scop, act_scop, new_scop, disk_no;
long array field disc, new_diskname;
scop := 36; <*fields scope in entry record*>
act_scop := scop + 2; <*- sctual scope - - *>
new_scop := act_scop + 2; <*- new scope - - *>
disk_no := new_scop + 2; <*- discno - - - *>
new_diskname := disk_no ; <*- new discname - - *>
\f
<* sw8010/2, load store entries page ... xx...
1985.02.06 *>
message store entries page 4;
entries_stored := 0; <*local total entry count*>
disc_no := 0; <*disc holding candidate entries are checked*>
while
scan_cat (zfrom , length ,
name , scope , newscope, docname,
no_of_specs, disc_specified, discname, newdiscname,
actualscope, spec , disc_no )
do
begin <*the next entry is found in zfrom and is specified by spec*>
outrec6 (zto, length);
to_from (zto, zfrom, length); <*move entry record*>
zto.act_scop := actual_scope ;
zto.new_scop := new____scope (spec);
zto.disk_no := disc_no ;
disc := 8 * (spec * (no_of_discs + no_of_unknown_discs) + discno);
to_from (zto.new_diskname, new_discname.disc, 8); <*move new disc name*>
entries_stored := entries_stored + 1;
if test then
begin
integer array field entry;
entry := 0;
write (out,
"nl", 2, <:store entries : :>,
"nl", 1, <:entry : :>);
listentry (out, false, zto.entry, zto.scop, zto.actscop, zto.newscop, 0);
end;
end <*the next entry record is found in zfrom specified by spec*>;
store_entries := entries_stored;
end store_entries;
\f
<* sw8010/2, load load entries page ... 65...
1984.07.10 *>
message load entries page 1;
integer
procedure load_entries ( za , copy_count, copies , vol_count ,
zcat , cat_name , entries_cat, reclength ,
zpart, partname , entriespart, loadsegs );
value copies ,
entries_cat, reclength ,
entriespart ;
zone array za ;
integer copy_count, copies ,
entries_cat, reclength ,
entriespart, loadsegs ;
integer array vol_count ;
zone zcat ,
zpart ;
long array cat_name ,
partname ;
<*********************************************************>
<* *>
<* *>
<*********************************************************>
\f
<* sw8010/2, load load entries page ... 66...
1984.09.12 *>
message load entries page 2;
begin
integer entries_input, result, entries_ready, entries_loaded,
segs_loaded, segments, j, partcat_volume, partcat_block,
partcat_size, discno;
integer field size, scop, act_scop, new_scop, disk_no, changed,
vol, file, block;
integer array field entry, base;
long array field name, new_diskname;
boolean skipped_area_entry, entry_found;
zone zhelp (1, 1, stderror);
\f
<* sw8010/2, load load entries page ... 67...
1984.07.10 *>
message load entries page 3;
entry := 0; <*fields entry head in zcat record*>
base := 2; <*fields entry base in zcat record*>
name := 6; <*fields entry name in zcat record*>
size := 16; <*fields entry size in zcat record*>
scop := 36;
act_scop := scop + 2;
new_scop := act_scop + 2;
disk_no := new_scop + 2;
new_diskname := disk_no;
changed := new_diskname + 10;
trap (remove_wrk_entry);
vol := case copy_count of (54, 60);
file := vol + 2 ;
block := file + 2 ;
entries_loaded :=
segs____loaded := 0; <*local total counters*>
partcat_size := (entries_part + 14) // 15;
open (zcat, 4, catname, 0);
setposition (zcat, 0, 0);
partname (1) := long <::>;
result := connect_output (zpart, 4, partname, partcat_size, 0);
if result > 0 then
connect_alarm (out, partname, result)
else
begin <*area and process created, zpart connected*>
<*remove fp area process*>
open (zhelp, 4,<:fp:>, 0);
close (zhelp, true);
<*prepare partial catalog*>
setposition (zpart, 0, partcat_size);
disconnect_output (zpart, false); <*cut down, dont remove process*>
\f
<* sw8010.1, save load entries page ... xx...
1984.09.12 *>
message load entries page 4;
open (zpart, 4, partname, 0); <*reopen*>
setposition (zpart, 0, 0);
partcat_volume := vol_count (copy_count);
partcat_block := 0 ;
entries_ready := entries_part ; <*ensures xfer part*>
entries_input := 0;
while entries_input < entries_cat do
begin <*next entry record from load cat*>
inrec6 (zcat, reclength);
entries_input := entries_input + 1;
<* zcat.vol = 0 : already positioned *>
<* zcat.vol <> 0 and *>
<* (zcat.vol <> partcat_volume *>
<*or zcat.block <> partcat_block) : position to new *>
if zcat.vol <> 0 and
(zcat.vol <> partcat_volume
or zcat.block <> partcat_block) and
-, survey then
begin <*position to new partial catalog*>
if zcat.vol <> partcat_volume then
begin <*proper volume*>
if zcat.vol = vol_count (copy_count) then
partcat_volume := zcat.vol <*no change of volume*>
else
begin <*change of volume*>
partcat_volume :=
vol_count (copy_count) := zcat.vol;
fileno (copy_count) := zcat.file;
blockno (copy_count) := 0;
next_volume (za (1), copy_count, vol_count, fileno, blockno);
end <*change of volume*>;
end <*proper volume*>;
fileno (copy_count) := zcat.file ;
partcat_block :=
blockno (copy_count) := zcat.block;
setposition (za (1), zcat.file, zcat.block);
entries_ready := entries_part; <*prepare transfer of partcat*>
end <*position to new partial catalog*>;
\f
<* sw8010/2, load load entries page ... xx...
1978.04.29 *>
message load entries page 5;
repeat <*until entry found*>
if entries_ready = entries_part and
-, survey then
begin <*positioned at next part cat, transfer it*>
open (za (2), 4, partname, 0);
setposition (za (1), fileno (copycount), blockno (copycount));
if test then
write (out,
"nl", 1, <:file, block = :>,
<< ddd>, fileno (copycount), blockno (copycount));
if version_id = 2 and
release_id > 1 shift 12 then
begin <*skip until sync block*>
check (za (1)); <*check position operation*>
open__inout (za, 1);
expellinout (za, 2);
repeat
j :=
inoutrec (za, 0);
inoutrec (za, j);
if test then
write (out,
"nl", 1, <:blocklength = :>, j);
until j = sync_blocklength;
stopzone (za (1), false);
getposition (za (1), fileno (copy_count), blockno (copy_count));
closeinout (za);
setposition (za (1), fileno (copy_count), blockno (copy_count));
setposition (za (2), 0 , 0 );
if test then
write (out,
"nl", 1, <:file, block = :>,
<< ddd>, fileno (copycount), blockno (copycount));
end <*skip until sync block*>;
segments :=
transfer (za, copy_count, copies, fileno, blockno,
partcat_size, end_of_doc, false <*expell*>);
if segments <> partcatsize then
continue_warning (out,
<:incomplete partial catalog transferred from tape:>,
partcatname, partcatsize, <: transferred : :>, abs (segments));
setposition (zpart, 0, 0); <*reposition zpart*>
entries_ready := 0;
end <*positioned at next part cat, transfer it*>;
if survey then
begin <*dummy record*>
setposition (zpart, 0, 0);
inrec6 (zpart, 34);
tofrom (zpart, zcat, 34);
end else
inrec6 (zpart, 34);
entries_ready := entries_ready + 1;
skipped_area_entry := zpart.size > 0 and
zpart.entry (1) shift (-12) = 0;
entry_found := zpart.base (1) = zcat.base (1) and
zpart.base (2) = zcat.base (2) and
zpart.name (1) = zcat.name (1) and
zpart.name (2) = zcat.name (2) ;
<*survey => entry_found*>
if test then
begin
write (out,
"nl", 2, <:entries input, ready, cat, part = :>,
entriesinput, entriesready, entriescat, entriespart,
"nl", 1, <:zcat.vol, block, partvol, block = :>,
zcat.vol, zcat.block, partcatvolume, partcatblock,
"nl", 1, <:skipped area entry = :>,
if skippedareaentry then <:true:> else <:false:>,
"nl", 1, <:entry found = :>,
if entryfound then <:true:> else <:false:>,
"nl", 1, <:entry : :>);
listentry (out, false, zpart.entry, zcat.actscop, zcat.actscop,
zcat.newscop, 0);
end;
if entry_found then
change_entry (zpart.entry, zcat.act_scop , zcat.new_scop ,
zcat.new_diskname, false <*not dump*>);
\f
<* sw8010/2, load load entries page ... xx...
1984.11.08 *>
message load entries page 6;
if entry_found and
load then
begin <*entry found and to be loaded (survey => -,load)*>
if skipped_area_entry then
begin
open (za (2), 4, zpart.name, 0);
result := 7;
end else
result :=
connect_wrk_or_existing (za (2), zpart.entry,
z_cat.new_diskname, connect);
end <*entry found*> else
begin <*not entry found (maybe empty) or it should not be loaded*>
open (za (2), 4, zpart.name, 0);
result :=
if skipped_area_entry then
7
else
0;
end <*not entry found*>;
if entry_found and
list_entries then
begin
if result > 0 then
skip_entry (out, list_only_name, zpart.entry,
zcat.scop, zcat.actscop, zcat.newscop,
zcat.changed, result )
else
list_entry (out, list_only_name, zpart.entry,
zcat.scop, zcat.actscop, zcat.newscop,
zcat.changed);
end;
\f
<* sw8010/2, load load entries page ... 70...
1987.04.29 *>
message load entries page 6;
if zpart.size > 0 then
begin <*transfer possibly empty area with or without output*>
if survey then
segments := if skipped_area_entry then 0 else zpart.size
else
begin <*not survey*>
if aux_synclength > 0 and -, skipped_area_entry then
blockno (copycount) := blockno (copycount) + 1;
setposition (za (1), fileno (copycount), blockno (copycount));
segments :=
transfer (za, copy_count, copies, fileno, blockno,
if skipped_area_entry then 0 else zpart.size,
end_of_doc,
-,entry_found or -,load or result > 0 <*expell*>);
end <*not survey*>;
end else
segments := 0; <*not area entry*>
if zpart.size > 0 and
-, skipped_area_entry and
result = 0 and
zpart.size <> abs (segments) then
begin <*warning and correct zpart.size*>
continue_warning (out,
if zpart.size > abs (segments) then
<:warning : not all segments of area transferred from tape:>
else
<:warning : too many segments of area transferred from tape:>,
zpart.name, zpart.size, <: transferred : :>, abs (segments));
zpart.size := abs (segments);
end <*warning and correct ...*>;
if entry_found and
load and
result = 0 and
(segments >= 0
or connect ) then
result := rename_wrk (za (2), zpart.entry, discno);
close (za (2), false); <*possible area process removed by transfer*>
<*area process was removed by transfer*>
if entry_found then
begin <*update counters for entries and segments read*>
total_entry_count := total_entry_count + 1;
total_segm__count := total__segm_count + abs (segments);
if load and
result = 0 and
(segments >= 0
or connect ) then
begin <*update counters for entries and segments loaded*>
segments := abs (segments);
slice_count (discno) :=
slice_count (discno) +
(segments +
slicelength (discno) - 1)//
slicelength (discno) ;
segs____loaded := segs____loaded + segments;
entries_loaded := entries_loaded + 1;
entry_count (discno) := entry_count (discno) + 1;
end <*update counters for entries and segments loaded*>;
end <*update counters for entries and segmentst read*>;
until entry_found;
end <*while entries_input < entries_cat*>;
end <*partial catalog connected*>;
close (zpart, true); <*remove part catalog area process*>
close (zcat , true); <*remove save catalog area process*>
load_segs := segs____loaded;
load_entries := entries_loaded;
if false then
remove_wrk_entry:
begin
<*fjern entry hvis docname i za(2) er forskellig fra
name i zpart.entry d.v.s. docname i zone er et wrk-navn *>
integer array zd (1 : 20);
long array field docname;
maybe_device_status (out);
docname := 2;
getzone (zpart, zd);
if zd (13) = 5 <*after inrec*> then
begin
getzone_6 (za (2), zd);
for j := 1 step 1 until 2 do
if zpart.entry.name (j) <> zd.docname (j) then
begin
set_catbase (zpart.entry.base);
monitor (48)remove_entry:(za (2), 1, zd);
j := 2;
reset_catbase;
end;
end;
trap (1);
end; <*remove_wrk_entry*>
end load_entries;
\f
<* sw8010/2, load entry handling page ... 72...
1984.07.10 *>
message change entry page 1;
procedure change_entry (entry, actual_scope, new_scope, new_discname, dump);
value actual_scope, new_scope ;
integer array entry ;
integer actual_scope, new_scope ;
long array new_discname ;
boolean dump ;
<*********************************************************>
<* *>
<* The procedure changes parts of the entry head and *>
<* tail specified according to the parameters. *>
<* *>
<* Call : change_entry (entry, actual_scope, new_scope, *>
<* new_discname, dump ); *>
<* *>
<* entry (call value, integer array). An entry *>
<* head and tail is stored in entry (1:17). *>
<* actual_scope (call value, integer). The actual scope *>
<* of the entry : *>
<* 0 : visible, none of below *>
<* 3 : system *>
<* 5 : project *>
<* 6 : user *>
<* 7 : login *>
<* 8 : temp *>
<* new_scope (call value, integer). The new scope wan-*>
<* ted, coded as for actual_scope, zero mea-*>
<* ning no change of scope. *>
<* If new_scope <> 0 and new_scope <> actu- *>
<* al_scope the permkey and entry base of *>
<* the entry is changed accordingly. *>
<* new_discname (call value, long array). *>
<* If the entry is an area entry, the docu- *>
<* ment name in the tail of the entry is *>
<* changed (maybe no change) to the name gi-*>
<* ven in the long array new_discname (1:2).*>
<* dump (call value, boolean). If true, the bases*>
<* recorded in the global integer array *>
<* dumpbases are used, else the process ba- *>
<* ses. *>
<* *>
<*********************************************************>
\f
<* sw8010/2, load entry handling page ... 73...
1984.11.20 *>
message change entry page 2;
begin
integer i, act_key, dummy, target_scope;
long array cat_base, std_base, user_base, max_base, sys_base,
act_base (1:2);
integer field permkey, size;
integer array field base;
long array field docname;
permkey := 2; <*fields permkey in head*>
base := 2; <* -"- base (1:2) -"- *>
size := 16; <* -"- size in tail*>
doc_name := 16; <* -"- docname -"- *>
target_scope :=
if new_scope <> 0 and new_scope <> actual_scope then
new____scope
else
actual_scope;
if target_scope > 0 then
begin <*change permkey and base in head*>
bases (cat_base, std_base, user_base, max_base, sys_base); <*proc bases*>
if dump then
begin <*dumpbases*>
for i := 1, 2 do
begin
cat__base (i) := dumpbases (i );
std__base (i) := dumpbases (2 + i);
user_base (i) := dumpbases (4 + i);
max__base (i) := dumpbases (6 + i);
end;
end <*dumpbases*>;
act_key := case target_scope of (
<*dummy *> dummy, <*dummy *> dummy, <*system *> 3,
<*dummy *> dummy, <*project*> 3, <*user *> 3,
<*login *> 2, <*temp *> 0 );
for i := 1, 2 do
act_base (i) := case target_scope of (
dummy , dummy , sys__base (i),
dummy , max_base (i), user_base (i),
std_base (i ), std_base (i) );
entry.permkey :=
entry.permkey shift (-3) shift 3 add act_key;
for i := 1, 2 do
entry.base (i) := act_base (i);
end <*change permkey and base in head*>;
<*change tail*>
if entry.size >= 0 then
for i := 1, 2 do
entry.docname (i) := new_discname (i);
end change_entry;
\f
<* sw8010/2, load entry handling page ... 74...
1984.06.07 *>
message list entry page 1;
procedure list_entry (z, nameonly, entry, scope, act_scope, newscope ,
changed );
value scope, act_scope, newscope ,
changed ;
zone z ;
boolean nameonly ;
integer array entry ;
integer scope, act_scope, newscope ,
changed ;
<*********************************************************>
<* *>
<* The procedure lists on the zone z the entry given on *>
<* the form : *>
<* (name) (size/modekind) (permkey/scopekey).(docname) *>
<* (entry base) (shortclock) *>
<* *>
<* Call : list_entry (z, nameonly, entry, scope, *>
<* act_scope, newscope) *>
<* *>
<* z (call and return value, zone). The name of *>
<* the document. Determines further the docu- *>
<* ment, the buffering and the position of *>
<* the document. *>
<* nameonly (call value, boolean). If nameonly is true *>
<* the procedure returns after having listed *>
<* the name of the entry. *>
<* entry (call value, integer array). Contains an *>
<* entry head and tail in entry (1:17). *>
<* If it is not an algol/fortran procedure *>
<* the shortclocl in the tail is listed. *>
<* scope (call value, integer). If scope equals one *>
<* or two (scope.perm or scope.all) the perm- *>
<* key is listed instead of the scopekey and *>
<* the entry base is listed too. *>
<* act_scope (call value, integer). The actual scope of *>
<* the entry, cf. scan_cat, which is listed, *>
<* i.e. if newscope = 0 (no change of scope). *>
<* newscope (call value, integer). If newscope <> 0 *>
<* (change of scope), newscope is listed as *>
<* scopekey, else act_scope is. *>
<* changed (call value, integer). Listed as short- *>
<* clock for latest changed. *>
<* *>
<*********************************************************>
\f
<* sw8010/2, load entry handling page ... 75...
1988.08.11 *>
message list entry page 2;
begin
integer modekind, scopekey;
real hhmmss;
integer field shortclock, contents, size, permkey;
integer array field base;
long array field name, docname;
permkey := 2; <*fields permkey in head*>
base := 2; <* -"- base (1:2) -"- *>
name := 6; <* -"- name -"- *>
size := 16; <* -"- size in tail*>
docname := 16; <* -"- docname -"- *>
shortclock := 26; <* -"- shortclock -"- *>
contents := 32; <* -"- contents -"- *>
write (z, "nl", 1, true, 12, entry.name);
if -,name_only then
begin <*list more*>
<*modekind*>
modekind := modekind_case (entry.size); <*no of modekind in table*>
if entry.size >= 0 then
write (z, <<__ddddd>, true, 10, entry.size)
else
if modekind = 0 then
write (z, <<dddd>, entry.size shift (-12),
<:.:>, <<dd>, true, 5, entry.size extract 12)
else
if monrelease < 80 shift 12 + 0 then
write (z, "sp", 3, true, 7, case modekind of (
<: ip:>, <: bs:>, <: tw:>, <: tro:>, <: tre:>, <: trn:>,
<: trf:>, <: trz:>, <: tpo:>, <: tpe:>, <: tpn:>, <: tpf:>,
<: tpt:>, <: lp:>, <: crb:>, <: crd:>, <: crc:>, <:mtlh:>,
<: mte:>, <:mtll:>, <:nrze:>, <:mt32:>, <:mt08:>, <:mthh:>,
<:mthl:>, <: pl:> ))
else
write (z, "sp", 3, true, 7, case modekind of (
<: ip:>, <: bs:>, <: tw:>, <: tro:>, <: tre:>, <: trn:>,
<: trf:>, <: trz:>, <: tpo:>, <: tpe:>, <: tpn:>, <: tpf:>,
<: tpt:>, <: lp:>, <: crb:>, <: crd:>, <: crc:>, <:mt62:>,
<: mte:>, <:mt16:>, <:nrze:>, <:mt32:>, <:mt08:>, <:mthh:>,
<:mthl:>, <: pl:> ));
<*permkey/scopekey . docname*>
scopekey := if newscope <> 0 then newscope else act_scope;
if scope = 1 or scope = 2 then
write (z, <<______d>, entry.permkey extract 3)
else
write (z, case (scopekey + 1) of (
<: ***:>, <::>, <::>,
<: system:>, <::>,
<:project:>,
<: user:>,
<: login:>,
<: temp:> ) );
write (z, ".", 1, true, 12, entry.docname);
\f
<* sw8010/2, load entry handling page ... 76...
1984.06.07 *>
message list entry page 3;
<*entry base*>
if scope = 1 or scope = 2 then
write (z, <<_-ddddddd>, entry.base (1), entry.base (2));
<*shortclock*>
if entry.shortclock <> 0 and
entry.contents shift (-12) <> 4 and
entry.contents shift (-12) < 32 then
write (z, <: d.:>, <<zddddd>,
systime (6) shortclock to decimal :(
entry.shortclock, hhmmss),
<:.:>, <<zddd>, entier (hhmmss/100))
else
write (z, "sp", 14);
<*latest changed*>
if changed <> 0 then write (z, <: d.:>, <<zddddd>,
systime (6) shortclock to decimal :(
changed, hhmmss),
<:.:>, <<zddd>, entier (hhmmss/100));
end <*list more*>;
end list_entry;
\f
<* sw8010/2, load entry handling page ... 77...
1984.11.08 *>
message skip entry page 1;
procedure skip_entry (z, only_name, entry, scope, actscop, newscop ,
clock , result );
value scope, actscop, newscop ,
clock , result ;
zone z ;
boolean only_name ;
integer array entry ;
integer scope, actscop, newscop ,
clock , result ;
<*********************************************************>
<* *>
<* The procedure lists an entry on the zone z the same *>
<* way list_entry does with the addition of the text : *>
<* skipped <cause> *>
<* where cause is a text explaining the result value of *>
<* create area process or reserve area process. *>
<* *>
<* Call : skip_entry (z, only_name, entry, scope, *>
<* actualscope, result);*>
<* *>
<* z (call and return value). See list_entry. *>
<* only_name (call value, boolean). -do- *>
<* entry (call value, integer array). -do- *>
<* scope (call value, integer). -do- *>
<* actscop (call value, integer). -do- *>
<* newscop (call value, integer -do- *>
<* clock (call value, integer). -do- *>
<* result (call value, integer). If result 7, the *>
<* entry was never saved and a proper mes- *>
<* sage is written, if result = 8, it is *>
<* covered by a better entry, if result is 9 *>
<* it is the result from create, permanent *>
<* or set entry base and is ignored, if right*>
<* half of result > 0 but neither of above, *>
<* it is the result of create area process, *>
<* if left half > 0 it is the result of re- *>
<* serve process. *>
<* *>
<*********************************************************>
begin
long array field name;
name := 6;
list_entry (z, only_name, entry, scope, actscop, newscop, clock);
write (z, "nl", 1, <:*** :>, true, 12, entry.name, <: skipped : :>,
if result = 7 then <:area was inaccessible at save:> else
if result = 8 then <:covered by a better entry :> else
if result = 9 then <::> else
if result extract 12 > 0 then <:create area process, :> else
if result shift (-12) > 0 then <:reserve process , :> else
<::>);
if result extract 12 > 0 then
write (out, case result of (
<:area claims exceeded:>,
<:cat i/o error, state of document does not permit:>,
<:entry not found:>,
<:not area entry:>,
<::>,
<:name format illegal:>,
<::>,
<::>,
<::> ))
else
if result > 0 then
write (out, case (result shift (-12)) of (
<:reserved by another process:>,
<:not user, cannot be reserved:>,
<:does not exist:> ));
write (out, "nl", 1);
errorbits := 2; <*warning.yes ok.yes*>
end skip_entry;
\f
<* sw8010/2, load entry handling page ... 78...
1988.08.11 *>
message modekind case page 1;
integer
procedure modekind_case (modekind);
value modekind ;
integer modekind ;
<*********************************************************>
<* *>
<* The procedure finds the number of the given modekind *>
<* in the modekind table commonly used, zero meaning un- *>
<* known. *>
<* *>
<* Call : modekind_case (modekind) *>
<* *>
<* modekind:case (return value, integer). The number of *>
<* the modekind given as found in the *>
<* table. If not found, a zero is retur- *>
<* ned. *>
<* modekind (call value, integer). The modekind *>
<* given. *>
<* *>
<*********************************************************>
begin
integer i, j;
j := 0;
for i := 1 step 1 until 26 do
if modekind = ( case i of (
1 shift 23 + 0 shift 12 + 0, <* ip*>
1 shift 23 + 0 shift 12 + 4, <* bs*>
1 shift 23 + 0 shift 12 + 8, <* tw*>
1 shift 23 + 0 shift 12 + 10, <* tro*>
1 shift 23 + 2 shift 12 + 10, <* tre*>
1 shift 23 + 4 shift 12 + 10, <* trn*>
1 shift 23 + 6 shift 12 + 10, <* trf*>
1 shift 23 + 8 shift 12 + 10, <* trz*>
1 shift 23 + 0 shift 12 + 12, <* tpo*>
1 shift 23 + 2 shift 12 + 12, <* tpe*>
1 shift 23 + 4 shift 12 + 12, <* tpn*>
1 shift 23 + 6 shift 12 + 12, <* tpf*>
1 shift 23 + 8 shift 12 + 12, <* tpt*>
1 shift 23 + 0 shift 12 + 14, <* lp*>
1 shift 23 + 0 shift 12 + 16, <* crb*>
1 shift 23 + 8 shift 12 + 16, <* crd*>
1 shift 23 + 10 shift 12 + 16, <* crc*>
1 shift 23 + 0 shift 12 + 18, <* mt62, mto, mtlh*>
1 shift 23 + 2 shift 12 + 18, <* mte*>
1 shift 23 + 4 shift 12 + 18, <* mt16, nrz, mtll*>
1 shift 23 + 6 shift 12 + 18, <* nrze*>
1 shift 23 + 8 shift 12 + 18, <* mt32*>
1 shift 23 + 12 shift 12 + 18, <* mt08*>
1 shift 23 +128 shift 12 + 18, <* mthh*>
1 shift 23 +132 shift 12 + 18, <* mthl*>
1 shift 23 + 0 shift 12 + 20))<* pl*> then
begin j := i; i := 26 end;
modekind_case := j;
end modekind_case;
\f
<* sw8010/2, load entry handling page ... 79...
1984.09.10 *>
message list counters page 1;
procedure list_counters (z, entry_count, slice_count);
zone z ;
integer array entry_count, slice_count ;
<*********************************************************>
<* *>
<* The procedure list on the document z the values of *>
<* counters given for each disc together with its name *>
<* and possible new name. *>
<* *>
<* Call : list_counters (z, entry_count, slice_count); *>
<* *>
<* z (call and return value, zone). The name *>
<* of the document. Determines further the *>
<* document, the buffering and the position *>
<* of the document. *>
<* entry_count (call values, integer array). For disc *>
<* slice_count number i, entry_count (i) and *>
<* slice_count (i) are the entries and sli- *>
<* ces saved belonging to the disc. *>
<* *>
<*********************************************************>
begin
integer disc_no, segments, entry_spec;
long sum_s, sum_e;
long array field disc ;
sum_s := sum_e := 0; <*sum segments and sum entriies*>
write (z, "nl", 1, "ff", 1, "nl", 3,
<:entries and slices/segments loaded ::>, "nl", 2,
true, 12, <:disc name ::>,
true, 11, <:entries ::>,
true, 10, <:slices ::>,
true, 14, <:slicelength ::>,
true, 11, <:segments ::>,
"nl", 1);
for discno := 1 step 1 until no_of_discs do
if (entry_count (disc_no) > 0
or slice_count (disc_no) > 0 ) then
begin
disc := disc_no * 8; <*fields disc name*>
segments := slice_count (discno) * slice_length (discno);
sum_s := sum_s + segments;
sum_e := sum_e + entry_count (discno);
write (z, << ddddddd>, "nl", 1,
true, 12, incl_discname.disc,
true, 11, entry_count (disc_no),
true, 10, slice_count (disc_no), << ddd>,
true, 14, slicelength (disc_no), << ddddddd>,
true, 11, segments);
end;
write (z, << ddddddd>, "nl", 2,
true, 12, <:total:>,
true, 11, sum_e,
true, 24, <: :>,
true, 11, sum_s, "nl", 1);
end list_counters;
\f
<* sw8010/2, load entry handling page ... 80...
1984.09.12 *>
message list total counters page 1;
procedure list_total_counters (z, entries_l, segments_l ,
entries_r, segments_r);
value entries_l, segments_l ,
entries_r, segments_r ;
zone z ;
integer entries_l, segments_l ,
entries_r, segments_r ;
<*********************************************************>
<* *>
<* The procedure lists on the document z the values of *>
<* the counters given. *>
<* *>
<* Call : list_total_counters (z, entries, segments); *>
<* *>
<* z (call and return value, zone). The name of *>
<* the document. Determines further the docu- *>
<* ment, the buffering and the position of *>
<* the document. *>
<* entries_l (call values, integers). The values to be *>
<* segments_l listed. *>
<* entries_r *>
<* segments_r *>
<* *>
<*********************************************************>
write (z, << ddddddd>, "nl", 2,
<:entries and segments loaded ::>, "nl", 2,
true, 12, <:total:>,
true, 11, <:entries ::>,
true, 24, <: :>,
true, 11, <:segments ::>, "nl", 2,
true, 12, <: :>,
true, 11, entries_l,
true, 24, <: :>,
true, 11, segments_l, "nl", 3,
<:entries and segments read ::>, "nl", 2,
true, 12, <:total:>,
true, 11, <:entries ::>,
true, 24, <: :>,
true, 11, <:segments ::>, "nl", 2,
true, 12, <: :>,
true, 11, entries_r,
true, 24, <: :>,
true, 11, segments_r, "nl", 3);
<*end list_total_counters;*>
\f
<* sw8010/2, load tape handling procedures page ... 84...
1988.02.11 *>
message open tape page 1;
procedure open_tape (z, devno, modekind, docname);
value devno, modekind ;
zone z ;
integer devno, modekind ;
long array docname ;
<*********************************************************>
<* *>
<* The procedure opens the zone specified with modekind, *>
<* docname as specified and a give up mask with end of *>
<* document (1<18). *>
<* If the device number specified is not zero, a mount- *>
<* special message is sent to the parent with deviceno *>
<* and docname as specified. *>
<* *>
<* Call : open_tape (z, devno, modekind, docname) *>
<* *>
<* z (call and return value, zone). The name of *>
<* the document, further the document, the buf-*>
<* fering and the position of the document. *>
<* devno (call value, integer). If devno <> 0 a *>
<* mount special mesage is sent to the parent *>
<* with devno and docname as specified. *>
<* modekind (call value, integer). Used in call of open.*>
<* docname (call value, long array). A document name *>
<* packed in docname (1:2) is used in open and *>
<* maybe mount special message. *>
<* *>
<*********************************************************>
begin
integer i, dummy, proc_descr_addr;
integer array mess (1:8) ;
real array field raf;
if devno <> 0 then
begin <*mount special*>
mess (1) := 32 shift 12 + 16 shift 5 + 0; <*mount spec, no wait*>;
raf := 2; <*fields mess (2:...)*>
movestring (mess.raf, 1, <:mount :>);
mess (4) := devno ;
raf := 8; <*fields mess (5:...)*>
to_from (mess.raf, docname, 8); <*document name*>
system (10 )parent mess:( dummy, mess);
end <*mount special*>;
open (z,
logand (modekind, -(1 shift 19 + 1)) extract 23, <*clear speed bit*>
docname, 1 shift 14 + 1 shift 18 + 1 shift 21);
end open_tape;
\f
<* sw8010/2, load tape handling procedures page ... 85...
1984.07.13 *>
message get file no page 1;
procedure getfileno (z, i, copies, volcount, no_of_vol, tapename ,
devno , modekind, fileno , blockno );
value i, copies ;
zone z ;
integer i, copies ;
long array tapename ;
integer array volcount, no_of_vol,
devno , modekind, fileno , blockno ;
<*********************************************************>
<* *>
<* The procedure returns the volume, file and block num- *>
<* ber given if the file no is non negative. *>
<* If it is negative, the volume and file numbers are *>
<* searched as the first file on the first volume on the*>
<* tapes in copy no i, which is neither version nor con- *>
<* tinue dump label, and the volume, file and block num- *>
<* bers are returned. *>
<* The search extends over as many volumes as are needed, *>
<* as long as they are specified by volume counter below *>
<* no_of_volumes for the proper copy and on the tape *>
<* found in the proper sequence in tape name array. *>
<* If the tape sequence runs out during the search, the *>
<* procedure gives up (end of document). *>
<* *>
<* Call : getfileno (za, i, copies, volcount, no_of_vol, *>
<* tapename , devno , modekind , *>
<* fileno , blockno ) *>
<* *>
<* z (call and returnvalue, zone). *>
<* The name, buffering and position of the *>
<* document. At call the zone state must *>
<* be after declaration. *>
<* i (call value, integer). The index in the*>
<* below magnetic tape file descriptions. *>
<* copies (call value, integer). The top index in *>
<* below magnetic tape file descriptors. *>
\f
<* sw8010/2, load tape handling procedures page ... 85...
1984.07.13 *>
message get file no page 2;
<* tapename (call name, long array). Volume no. j *>
<* in copy no. i is supposed to be speci- *>
<* fied in long array tapename (1:no_of_co-*>
<* pies) as tapename (i, 2*j-1) and tape- *>
<* name (i, 2*j). *>
<* no_of_vol (call value, integer array). The number *>
<* of volmes specified in each copy is spe-*>
<* cified in no_of_vol (1:no_of_copies). *>
<* vol_count (call and return value, integer array). *>
<* At call, vol_count (i) is the volume *>
<* counter corresponding to the file num- *>
<* ber given in fileno (i), at return it *>
<* corresponds to the returned filenumber .*>
<* devno (call value, integer array). The device *>
<* numbers used in possible mount special *>
<* parent message sent before search. *>
<* modekind (call value, integer array). The mode- *>
<* kind used during the search on copy num-*>
<* ber i is modekind (i). *>
<* fileno (call and return value, integer array). *>
<* At call, fileno (i) is the file number *>
<* on the tape specified by vol_count (i) *>
<* and copy number i where to start the *>
<* search for a non-version dump file. *>
<* If the file number is non-negative, it *>
<* is considered found and returned again, *>
<* else it is searched. *>
<* blockno (return value, integer array). At re- *>
<* turn blockno (i) is the blockno of the *>
<* found position. *>
<* *>
<*********************************************************>
\f
<* sw8010/2, load tape handling procedures page ... 86...
1985.02.06 *>
message get file no page 3;
begin
integer hwds, volume, file, block;
integer array zdescr (1:20);
boolean file_no_found, label_found;
long array field curr_tape, label_type;
label_type := 18; <*fields labeltype in labelrecord*>
<*if fileno missing then init search*>
fileno_found := fileno (i) >= 0; <*<tape>.last => fileno < 0*>
if -,fileno_found then
begin <*init search*>
volume := vol_count (i) ;
file := fileno (i) := 1; <*start in fileno 1*>
block := blockno (i) := 0;
currtape := name_field (i, volcount);
open_tape (z, devno (i), modekind (i), tapename.curr_tape);
end <*init search*>;
\f
<* sw8010/2, load tape handling procedures page ... 87...
1985.02.06 *>
message get file no page 4;
while -, fileno_found do
begin <*read tape to find position*>
setposition (z, fileno (i), blockno (i));
<*get a record from first block of file*>
getzone6 (z, zdescr);
zdescr (12) := 1; <*partial word := index*>
setzone6 (z, zdescr);
label_found := get_labelrec (z, segm, entries_in_partcat,
entries_in_savecat ,
savecat_name,
savecat_base,
savecat_size,
dump_time ,
version_id ,
release_id ,
aux_synclength,
sync_blocklength );
while end_of_doc (1) do
begin <*next volume*>
vol_count (i) := vol_count (i) + 1;
file__no (i) := 1;
block_no (i) := 0;
next_volume (z, i, vol_count, fileno, blockno);
end_of_doc (1) := false; <*ready for eot again*>
getzone6 (z, zdescr);
zdescr (12) := 1; <*partial word := index*>
setzone6 (z, zdescr);
file__no (i) := 1;
block_no (i) := 0;
setposition (z, fileno (i), blockno (i));
label_found := get_labelrec (z, segm, entries_in_partcat,
entries_in_savecat,
savecat_name,
savecat_base,
savecat_size,
dump_time ,
version_id ,
release_id ,
aux_synclength,
sync_blocklength );
end <*next volume*>;
file_no_found := label_found extract 12 = 2;
\f
<* sw8010/2, load tape handling procedures page ... 85...
1984.09.10 *>
message get file no page 5;
if fileno_found then
begin <*the first empty labelled or non labelled file found*>
if vol_count (i) <> volume then
begin
vol_count (i) := volume;
file__no (i) := file ;
block_no (i) := block ;
next_volume (z, i, vol_count, fileno, blockno);
end;
file__no (i) := file ;
block_no (i) := block;
setposition (z, fileno (i), blockno (i));
close (z, false); <*terminate search, no release*>
end else
begin <*version or continue dump label, record the position and continue*>
if label_found then
begin
volume := vol_count (i);
file := file_no (i);
block := block_no (i);
end;
increase (fileno (i));
end;
end <*while -, fileno_found*> ;
end get_file_no;
\f
<* sw8010/2, load tape handling procedures page ... 88...
1984.07.13 *>
message name field page 1;
integer
procedure name_field (copy_count, vol_count);
value copy_count ;
integer copy_count ;
integer array vol_count ;
<*********************************************************>
<* *>
<* The procedure returns the value proper to field the *>
<* tape name of the tape corresponding to copy_count *>
<* and vol_count (copy_count) in the long array tapename *>
<* (1:no_of_copies : 1:2 * max_no_of_vol). *>
<* *>
<* Call : name_field (copy_count, vol_count); *>
<* *>
<* name_field (return value, integer). See above. *>
<* copy_count (call value, integer). See above. *>
<* vol__count (call value, integer array). See above. *>
<* *>
<*********************************************************>
name_field := copy_count * 8 * max_no_of_vol +
(vol_count (copy_count) - 1) * 8 ;
\f
<* sw8010/2, load tape handling procedures page ... 89...
1985.03.25 *>
message get labelrec page 1;
boolean
procedure get_labelrec (z, segm, part_entries, save_entries ,
savecat_name, savecat_base, savecat_size ,
dump____time ,
version ,
release ,
aux_sync ,
sync_blength);
zone z ;
integer segm, part_entries, save_entries ,
savecat_size ,
dump____time ,
version ,
release ,
aux_sync ,
sync_blength ;
long array savecat_name ;
integer array savecat_base ;
<*******************************************************>
<* *>
<* The procedure makes a zone record of 100 halfwords *>
<* available in the zone buffer of z and fills it *>
<* with characters constituting a save dump label from *>
<* the tape connected to z. *>
<* The values of the fields in the record are display- *>
<* ed on current output. *>
<* *>
<* Call : get_labelrec (z, segm , part_entries, *>
<* save_entries, *>
<* savecat_name, *>
<* savecat_base, *>
<* savecat_size, *>
<* dump____time) *>
<* *>
<* get_labelrec *>
<* (return value, boolean). Returns true if *>
<* a proper dump or continue label record *>
<* is found in the current block. *>
<* z (call and return value, zone). The name *>
<* of the document. Determines further the *>
<* document, the buffering and the position *>
<* of the document. *>
<* To make sense, the zone must be in the *>
<* state open and positioned at call. *>
<* *>
<*******************************************************>
\f
<* sw8010/2, load tape handling procedures page ... 89...
1984.10.31 *>
message get labelrec page 2;
<*******************************************************>
<* *>
<* segm *>
<* part_entries *>
<* save_entries *>
<* (return values, integers). *>
<* savecat_name *>
<* (return value, long array) *>
<* savecat_base *>
<* (return value, integer array). *>
<* savecat_size *>
<* (return value, integer). *>
<* (return value, long array). *>
<* dump_time (return value, integer). *>
<* All return values from their respective *>
<* fields of the dump label record. *>
<* Only defined if the procedure returns *>
<* true. *>
<* *>
<*******************************************************>
begin
integer hwds;
long array field laf;
integer field ifld;
\f
<* sw8010/2, load tape handling procedures page ... 89...
1985.02.08 *>
message get labelrec page 3;
laf := 0; <*fields ztape into a long array*>
hwds := inrec6 (z, 0);
if hwds <> 100 then
begin
if hwds = 2 then get_labelrec := false add 2
else get_labelrec := false;
end
else
begin <*record of 100 hwds ready*>
laf := 0;
inrec6 (z, 100);
if z.laf (1) <> long <:save :> add 'sp' and
z.laf (1) <> long <:incsa:> add 'v' then
get_labelrec := false
else
begin <*save vers 2*>
laf := 18;
if z.laf (1) <> long <:vers.:> add 'sp' and
z.laf (1) <> long <:cont.:> add 'sp' then
get_labelrec := false
else
begin <*version or continue dump label*>
get_labelrec := true;
ifld := 60 ; segm := z.ifld;
ifld := ifld + 2; part_entries := z.ifld;
ifld := ifld + 2; save_entries := z.ifld;
laf := ifld ; tofrom (savecat_name, z.laf, 8);
ifld := ifld + 10; savecat_base (1) := z.ifld;
ifld := ifld + 2; savecat_base (2) := z.ifld;
ifld := ifld + 2; savecat_size := z.ifld;
ifld := ifld + 2; dump____time := z.ifld;
ifld := ifld + 2; version := z.ifld;
ifld := ifld + 2; release := z.ifld;
ifld := ifld + 2; sync_blength := z.ifld;
ifld := ifld + 2; aux_sync := z.ifld;
if release < 3 shift 12 then aux_sync := 0;
if test then
write (out,
"nl", 2, <:get labelrec ::>,
"nl", 1, <:segm = :>, segm,
"nl", 1, <:entries in partcat = :>, partentries,
"nl", 1, <:entries in savecat = :>, saveentries,
"nl", 1, <:savecat name = :>, savecatname,
"nl", 1, <:savecat base = :>, savecatbase (1),
"nl", 1, <: :>, savecatbase (2),
"nl", 1, <:savecat size = :>, savecatsize,
"nl", 1, <:dumptime = :>, dumptime,
"nl", 1, <:version = :>, version ,
"nl", 1, <:release = :>, release,
"nl", 1, <:sync blocklength = :>, sync_blength);
end <*version or continue dump label*>;
end <*save vers 2*>;
laf := 0;
write (out, "nl", 2, <:read from volume tape ::>,
"nl", 2, z.laf); <*display on current out*>
laf := 0;
if z.laf (1) = long <:dump :> add 'sp' then
write (out, "nl", 1,
<:*the label was created by save version 1 and should be read by load13:>,
"nl", 1);
end <*record of 100 hwds*>;
stopzone (z, false); <*stop the zone*>
end get_labelrec;
\f
<* sw8010/2, load tape handling procedures page ... 92...
1984.07.06 *>
message out continue mess page 1;
procedure out_continue_mess (zout, z, entries, segments, name);
value entries, segments ;
zone zout, z ;
integer entries, segments ;
long array name ;
<*********************************************************>
<* *>
<* The procedure displays on the zone zout the values of *>
<* file and block count in the zone z and the values of *>
<* the parameters entries, segments and name. *>
<* *>
<* Call : out_continue_mess (zout, z, entries, segments, *>
<* name );*>
<* *>
<* zout (call and return value, zone). The name, buf-*>
<* fering and position of the document where to *>
<* write the message. *>
<* z (call and return value, zone). The name, buf-*>
<* fering and position of the document to be re-*>
<* ported. *>
<* entries (call value, integer). The values of entry *>
<* segments (call value, integer). and segment counters *>
<* to be reported. *>
<* name (call value, long array). The name of the *>
<* continue tape in name (1:2) to be reported. *>
<* *>
<*********************************************************>
\f
<* sw8010/2, load tape handling procedures page ... 93...
1984.07.06 *>
message out continue mess page 2;
begin
integer file, block;
integer array zdescr (1:20);
long array field procname;
procname := 2; <*fields procname in zdescr*>
getzone6 (z, zdescr );
getposition (z, file, block);
write (out, "nl", 2,
true, 12, zdescr.procname, <:left:>, "nl", 2,
<<ddddddd>,
true, 12, <:file count:>, file , "nl", 1,
true, 12, <:block count:>, block , "nl", 1,
true, 12, <:entry count:>, entries, "nl", 1,
true, 12, <:segm count:>, segments,"nl", 2,
true, 12, name, <:continues:>, "ff", 1);
end out_continue_mess;
\f
<* sw8010/2, load tape handling procedures page ... 92...
1984.07.06 *>
message out end mess page 1;
procedure out_end_mess (zout, z, entries, segments);
value entries, segments ;
zone zout, z ;
integer entries, segments ;
<*********************************************************>
<* *>
<* The procedure displays on the zone zout the values of *>
<* file and block count in the zone z and the values of *>
<* the parameters entries, segments. *>
<* *>
<* Call : out_end_mess (zout, z, entries, segments); *>
<* *>
<* zout (call and return value, zone). The name, buf-*>
<* fering and position of the document where to *>
<* write the message. *>
<* z (call and return value, zone). The name, buf-*>
<* fering and position of the document to be re-*>
<* ported. *>
<* entries (call value, integer). The values of entry *>
<* segments (call value, integer). and segment counters *>
<* to be reported. *>
<* *>
<*********************************************************>
\f
<* sw8010/2, load tape handling procedures page ... 93...
1984.07.06 *>
message out end mess page 2;
begin
integer file, block;
integer array zdescr (1:20);
long array field procname;
procname := 2; <*fields procname in zdescr*>
getzone6 (z, zdescr );
getposition (z, file, block);
write (out, "nl", 2,
true, 12, zdescr.procname, <:left:>, "nl", 2,
<<ddddddd>,
true, 12, <:file count:>, file , "nl", 1,
true, 12, <:block count:>, block , "nl", 1,
true, 12, <:entry count:>, entries, "nl", 1,
true, 12, <:segm count:>, segments,"nl", 2);
end out_end_mess;
\f
<* sw8010/2, load tape handling procedures page ... xx...
1984.07.13 *>
message transfer page 1;
integer
procedure transfer (za, i, copies, file, block, segments, endtape, expell);
value i, copies, segments ;
zone array za ;
integer i, copies, segments ;
integer array file, block ;
boolean array endtape ;
boolean expell ;
<******************************************************************>
<* *>
<* The procedure transfers a number of segments from a magnetic *>
<* tape file to a backing storage area, starting in the position *>
<* given in the file and block counts of the zones in the zone *>
<* array connected to the files. *>
<* A possible end of tape condition will be signalled in the boo- *>
<* lean array end_tape (1:1) by the block procedure in the *>
<* first zone of the array. *>
<* Any zone for which expell (i) is true will be expelled from *>
<* the set of output procedures, i.e. no output will take place *>
<* in the zone. *>
<* *>
<* Call : *>
<* *>
<* transfer (za, i, copies, file, block, segments, endtape,expell)*>
<* *>
<* transfer (return value, integer). The number of segments *>
<* transferred. *>
<* za (call and return, zone array). The buffering, posi- *>
<* tion and name of the source and target documents. *>
<* The zone array is supposed to be declared za (1:2, *>
<* buflength_io (2, 2, segm * 512), 2, end_of_document)*>
<* i. e. with a blocklength of segm * 512 hwds. *>
<* The output is performed in za (1) while the *>
<* input is performed in za (2). *>
<* The input zone as well as the output zones are in *>
<* the states after open and position. *>
<* *>
<******************************************************************>
\f
<* sw8010/2, load tape handling procedures page ... xx...
1984.07.13 *>
message transfer page 2;
<******************************************************************>
<* *>
<* The zones in the array are opened for inoutrec af- *>
<* ter a check of used share to check possible move o- *>
<* perations pending. *>
<* All the zones are positioned according to the posi- *>
<* tions given in the zones. *>
<* The transfer takes place until all segments given *>
<* are transferred with error handling according *>
<* to the user bits in the giveup mask and the block *>
<* procedure. *>
<* The zone za (1) is left in the state after *>
<* open and position, while the zone za (2) *>
<* is left in the state after declaration, i. e. the *>
<* area process has been removed. *>
<* *>
<* i (call value, integer). The index in the magnetic *>
<* tape file descriptions below to be used. *>
<* copies (call value, integer). See below. *>
<* file, (call and return values, integer arrays). The star- *>
<* block ting position of the tapes are found in file and *>
<* block count of the zones, at return the new positi- *>
<* on is returned in the arrays file, block. *>
<* segments (call value, integer). The number of segments to be *>
<* transferred. *>
<* endtape (call value, boolean array). The name of the array *>
<* where the procedure will suppose the blockprocedure *>
<* of the tape zone to signal end of document condi- *>
<* tion. *>
<* If end of document condition is found in the *>
<* input zone , a change of volume tape will be per- *>
<* formed in that zone. *>
<* expell (call value, boolean). If expell is true, the out- *>
<* put zone will be expelled *>
<* from the set of output zones just after openinout, *>
<* i. e. no output will take place in the zone. *>
<* *>
<******************************************************************>
\f
<* sw8010/2, load tape handling procedures page ... xx...
1990.03.13 *>
message transfer page 3;
begin
integer hwds, area, block_area, tape, j, name_table_addr,
segs, sumsegs;
boolean tapemark, rem_parity;
integer array zdescr (1:20), dummyia (1:1), user (1:16);
long array proc_name (1:2);
long array field area_name, curr_tape;
tapemark := false ;
rem_parity:= false ;
sumsegs := 0 ;
area_name := 2 ; <*fields process name in zone descriptor*>
area := copies + 1; <*index in file, block arrays for area zone*>
<*check position operation in zone and get position*>
check (za (1));
getposition (za (1), file (i ), block (i ));
getposition (za (2), file (area), block (area));
if modekind (i) shift 4 < 0 then
begin <*high speed bit specified*>
getzone6 (za (1), zdescr);
zdescr (1) :=
if segments <
speedlimit / (if modekind (i) shift 9 < 0 then 4 else 1) then
logand (modekind (i), -(1 shift 19 + 1)) extract 23 <*clear*>
else
logor (modekind (i), 1 shift 19 ) extract 23;<*set *>
if test then
write (out,
"nl", 1, <:speed bit = :>, zdescr (1) shift (-19) extract 1);
setzone6 (za (1), zdescr);
end;
getzone6 (za (2), zdescr );
tofrom (proc_name, zdescr.area_name, 8 );
name_table_addr := zdescr (6 );
openinout (za, 1); <*allocate shares for inoutrec, tape is input*>
if test then
write (out,
"nl", 2, <: transfer ::>,
"sp", 2, <: file (:>, i, <:) = :>, file (i),
"sp", 2, <:block (:>, i, <:) = :>, block (i),
"sp", 2, <:area name = :>, procname,
"sp", 2, <:pos in area :>, file (area), block (area),
"sp", 2, <:n.t. addr = :>, name_table_addr);
if expell then
expellinout (za, 2);
while sumsegs < segments and
-, tapemark do
begin <*still not all segments xferred and not tapemark before e o t*>
hwds := inoutrec (za, 0);
segs := (hwds + 511) // 512;
if parity (1) then
begin <*parity error input tape zone*>
parity (1) := false;
rem_parity := true ;
if sumsegs < segments - segments mod segm then
segs := segm
else
begin
segs := segments mod segm; <*last block*>
if segs * 512 < hwds then
hwds := segs * 512;
end;
write (out,
"nl", 1, "sp", 4, <:loading to:>,
"nl", 1, "sp", 4, true, 12, procname,
<: last :>, segs * 512 - hwds, <: halfwords of segments :>,
sumsegs, <: - :>, sumsegs + segs - 1,
if expell then <: would be:> else <: are:>, <: zeroed:>,
"nl", 1);
if test then
begin
write (out,
"nl", 1, <:parity, block length error or word defect ::>,
"nl", 1, <:hwds = :>, hwds,
"nl", 1, <:segs = :>, segs,
"nl", 1, <:segm = :>, segm,
"nl", 1, <:segments = :>, segments,
"nl", 1, <:sumsegs = :>, sumsegs,
"nl", 1, <:segments mod segm = :>, segments mod segm,
"nl", 1, <:aux sync length = :>, aux_sync_length,
"nl", 2);
end;
end;
if hwds > 2 then
begin <*not end of document or file mark in tape zone*>
if sumsegs + segs < segments then
begin <*transfer not terminated check correct blocksize*>
if segs <> segm
or hwds = aux_sync_length then
begin <*data blocks expired too early*>
if hwds = aux_sync_length then
begin <*sync block read as last data block*>
segs := 0; <*regret record*>
hwds := 0; <*makes the coming changerecio regret record*>
changerecio (za, hwds); <*regret record*>
getposition (za (1), file (i ), block (i )); <*log pos before sync*>
setposition (za (1), file (i ), block (i )); <*phys pos = logical*>
getposition (za (2), file (area), block (area));
setposition (za (2), file (area), block (area));
end;
segments := sumsegs + segs; <*to terminate loop*>
end <*data blocks expired too early*>;
end;
if hwds > 0 then
changerecio (za, segs * 512); <*assures blockchange next inoutrec*>
sumsegs := sumsegs + segs;
end else
if endtape (1) then
begin <*hwds = 2 and endtape (1), end of document in tape zone*>
\f
<* sw8010/2, load tape handling procedures page ... xx...
1990.03.12 *>
message transfer page 4;
<*begin hwds = 2 and andtape (1), end of document in tape zone*>
endtape (1) := false; <*ignore end of document*>
<*stop all zones, position before tape mark*>
stop_zone (za (1), false ); <*no tape mark*>
getposition (za (1), file (i), block (i));
getposition (za (2), 0 , block_area); <*remember position*>
closeinout (za); <*check position operation and reallocate*>
<*change to next volume in this zone*>
vol_count (i) := vol_count (i) + 1;
file (i) := 1; <*position of label record on next volume*>
block (i) := 0;
next_volume (za (1), i, vol_count, file, block);
curr_tape := namefield (copycount, vol_count );
close (za (2), false);
open (za (2), 4, save_cat_name, 0);
setposition (za (1), file (i), block (i));
reading_savecat := true;
j :=
transfer (za, i, copies, file, block, savecat_size,
endtape, true <*expell out*>);
reading_savecat := false;
if abs (j) <> savecatsize then
terminate_alarm (out,
<:incomplete save catalog bypassed on tape:>,
tapename.curr_tape, savecatsize, <: transferred : :>, abs (j));
open (za (2), 4, proc_name , 0);
setposition (za (2), 0 , block_area); <*reposition*>
getzone6 (za (2), zdescr );
zdescr (6) := name_table_addr ;
setzone6 (za (2), zdescr );
if modekind (i) shift 4 < 0 then
begin <*high speed bit specified*>
getzone6 (za (1), zdescr);
zdescr (1) :=
if segments - sumsegs <
speedlimit / (if modekind (i) shift 9 < 0 then 4 else 1) then
logand (modekind (i), -(1 shift 19 + 1)) extract 23 <*clear*>
else
logor (modekind (i), 1 shift 19 ) extract 23;<*set *>
if test then
write (out,
"nl", 1, <:speed bit = :>, zdescr (1) shift (-19) extract 1);
setzone6 (za (1), zdescr);
end;
setposition (za (1), file (i), block (i) );
check (za (1) ); <*check pos operation*>
openinout (za, 1); <*reallocate for inoutrec*>
if expell then
expellinout (za, 2); <*reexpell zone*>
end <*hwds = 2 and endtape (1), end of document in tape zone*>
else <*hwds = 2 and -, endtape (1), tapemark in tape zone*>
tapemark := true;
end <*while loop : still not all segments transferred*>;
\f
<* sw8010/2, load tape handling procedures page ... xx...
1988.11.17 *>
message transfer page 5;
<*end while loop: still not all segments transferred*>
getzone6 (za (1), zdescr);
if aux_sync_length > 0 and
zdescr (16) > 0 and
not reading_savecat then <*record length*>
begin
<*sync blocks present and present record not one, *>
<*check that next share has input a sync block and*>
<*- if not : read on until sync block *>
<*- if : leave *>
integer array sdescr1, sdescr2, sdescr3 (1:12);
integer used_share, next_share, reclength;
getzone6 (za (1), zdescr);
used_share := zdescr (17); <*save used share*>
next_share := used_share + 1; <*save next share*>
if next_share > zdescr (18) then
next_share := 1;
zdescr (17) := next_share;
getshare6 (za (1), sdescr1, used_share);
getshare6 (za (1), sdescr2, next_share);
<* if test then
begin
write (out, "nl", 1, <:zone and shares before check next share ::>,
"nl", 1, <:used share = :>, used_share,
"sp", 1, <:next share = :>, next_share);
writezone (za (1), 1);
writeshare (za (1), used_share);
writeshare (za (1), next_share);
end;
*>
setzone6 (za (1), zdescr); <*used share updated*>
check (za (1) ); <*check it*>
getshare6 (za (1), sdescr3, next_share); <*get checked share*>
sdescr2 (1) := sdescr3 (1) := 1; <*share.state := ready*>
setshare6 (za (1), sdescr3, next_share); <*reset the share*>
<* if test then
begin
write (out, "nl", 1, <:zone and shares after check next share ::>);
writezone (za (1), 1);
writeshare (za (1), used_share);
writeshare (za (1), next_share);
end;
*>
reclength :=
sdescr3 (12) - sdescr3 (5) ;
<*sh.top xferred - sh.first addr*>
zdescr (17) := used_share;
setzone6 (za (1), zdescr); <*reset zone*>
setshare6 (za (1), sdescr1, used_share); <*and shares*>
<* if test then
begin
integer i;
write (out,
"nl", 1, <:zone and shares before set share next share ::>,
"nl", 1, <:reclength = :>, reclength,
"nl", 1, <:zdescr(16)= :>, zdescr(16));
writezone (za (1), 1);
writeshare (za (1), used_share);
writeshare (za (1), next_share);
write (out, "nl", 1, <:sdescr2 = :>);
for i := 1 step 1 until 12 do
write (out, "nl", 1, "sp", 10, << dddddd>, sdescr2 (i));
end;
*>
setshare6 (za (1), sdescr2, next_share);
if reclength > aux_sync_length then
begin <*too many data blocks, read on until sync block*>
getposition (za (1), file (i ), block (i )); <*log pos before last block*>
getposition (za (2), file (area), block (area));
closeinout (za); <*terminate zones, reinit zone array*>
block (i) := block (i) + 1; <*log pos after last block*>
setposition (za (1), file (i ), block (i )); <*phys = log pos*>
setposition (za (2), file (area), block (area));
<* if test then
write (out,
"nl", 1, <:position before transfer : :>,
file (i), block (i),
"nl", 1, <:- in area : :>,
file (area), block (area));
*>
segs :=
transfer (za, i, copies, file, block, 8388607, endtape, expell);
<*transfer until sync block, but expell disc zone*>
sumsegs := sumsegs + segs;
setposition (za (1), file (i), block (i)); <*save pos in zone*>
<* if test then
write (out,
"nl", 1, <:position after transfer : :>,
file (i), block (i),
"nl", 1, <:- in area : :>,
file (area), block (area));
*>
end <*too many full length blocks*>;
end <*aux_sync_length > 0*>;
\f
<* sw8010/2, load tape handling procedures page ... xx...
1988.02.02*>
message transfer page 6;
<*stop zones, maybe tapemark, position after last block or mark*>
stop_zone (za (1), false ); <*not tape mark*>
getposition (za (1), file (i), block (i));
getzone6 (za (2), zdescr);
name_table_addr := zdescr (6);
if zdescr (13) >= 32 then <*z.state < 32 == closeinout was here before*>
closeinout (za); <*reallocate buffer area*>
if test then
begin
write (out,
"nl", 2, <:end transfer ::>,
"nl", 1, <:expell = :>, if expell then <:yes:> else <:no:>,
"sp", 2, <:area name = :>, zdescr.area_name,
"sp", 2, <:segments = :>, segments,
"sp", 1, <:xferred = :>, sumsegs,
"nl", 1, "sp", 14,
"sp", 2, <: file (:>, i, <:) = :>, file (i),
"sp", 2, <:block (:>, i, <:) = :>, block (i),
"sp", 2, <:n.t. addr = :>, name_table_addr);
end;
if name_table_addr > 0 then
begin <*prepare remove process*>
system (5) move core :(name_table_addr, user); <*name table address*>
system (5) move core :(user (1) - 4 , user); <*process bases *>
if test then
write (out,
"nl", 2, <:prepare remove process :>,
"nl", 1, <:name table address = :>, name_table_addr,
"nl", 1, <:proc bases = :>, user (1), "sp", 2, user (2),
"nl", 1, <:segments = :>, user (12));
set_catbase (user);
end <*prepare remove process*>;
close (za (2), name_table_addr > 0); <*remove area process*>
reset_catbase;
transfer :=
if rem_parity then
- sumsegs
else
sumsegs; <*segments transferred = segments if no tapemark*>
end <*transfer*>;
\f
<* sw8010/2, load tape handling procedures page ... xx...
1984.09.07 *>
message next volume page 1;
procedure next_volume (z, index, vol_count, file, block);
value index ;
zone z ;
integer index ;
integer array vol_count, file, block ;
begin
<***************************************************>
<* *>
<* The procedure performs a change of tape to the *>
<* volume given and reads and checks the block in *>
<* the position given for a version or continue *>
<* dump label record. *>
<* If no such record is found or the key values of *>
<* it does not equal the contents of the current *>
<* key values, the procedure terminates with a pro-*>
<* per alarm. *>
<* *>
<* - close the zone with release message to parent *>
<* - open the zone with a new document name and a *>
<* possible mount ring message to the parent *>
<* - position to the position given *>
<* *>
<* Call : *>
<* *>
<* next_volume (z, index, vol_count, file, block); *>
<* *>
<* z (call and return value, zone ). *>
<* The zone z specifies the *>
<* buffering, position and name of the *>
<* document to be left, at return the *>
<* new document. At call the state must *>
<* be zero (positioned), at return it *>
<* is zero again. *>
<* *>
<***************************************************>
\f
<* sw8010/2, load tape handling procedures page ... xx...
1984.09.07 *>
message next volume page 2;
<***************************************************>
<* *>
<* index (call value, integer). Specifies a *>
<* possible device number (cf. the pro- *>
<* cedure open tape), a modekind and a *>
<* document name. *>
<* vol_count (call value, integer array). The vo- *>
<* lume to be mounted is recorded in *>
<* vol_count (index). *>
<* file (call and return value, integer ar- *>
<* block ray). At call the position where to *>
<* find the label record, at return the *>
<* position after the label record. *>
<* recorded in file, block (index). *>
<* *>
<* Function : *>
<* *>
<* If the next volume name is not specified, the *>
<* procedure gives up with a runtime alarm. *>
<* During the in put operations performed in *>
<* the procedure, the end of document status in *>
<* the answer is ignored. *>
<* *>
<***************************************************>
\f
<* sw8010/2, load tape handling procedures page ... xx...
1987.04.29 *>
message next volume page 3;
integer n_segm, n_saveentries, n_partentries,
n_savecatsize, n_dumptime, n_versionid,
n_releaseid, n_auxsynclength, n_syncblocklength;
integer array n_savecatbase (1:2);
long array n_savecatname (1:2);
long array field curr_tape;
if vol_count (index) > no_of_vol (index) then
begin
out_end_mess (out, z, total_entrycount, total_segmcount);
give_up ( z, 1 shift 18, 0); <*end of document*>
end;
curr_tape := name_field (index, vol_count);
out_continue_mess (out,
z, total_entrycount, total_segmcount, tapename.curr_tape);
fpproc (33) outend :(0, out, 'nul');
<*outend on current out before release message to parent*>
<*if parent is s the output would be mixed with message *>
close (z, false add 1); <*release*>
open_tape (z, deviceno (index), modekind (index),
tapename.curr_tape);
<*zone.partial word := index := 1*>
setposition (z, file (index), block (index)); <*pos in call*>
if -,get_labelrec (z, n_segm, n_partentries, n_saveentries,
n_savecatname, n_savecatbase, n_savecatsize,
n_dump___time, n_version_id , n_release_id,
n_auxsynclength , n_sync_blocklength) then
terminate_alarm (out,
<:no proper dumplabel on volume tape, file number ::>,
tapename.curr_tape, file (index), <: block number : :>, block (index));
if segm <> n_segm
or entriesinpartcat <> n_partentries
or entries_in_savecat <> n_saveentries
or savecatsize <> n_savecatsize
or dumptime <> n_dumptime then
begin
if test then
write (out,
"nl", 2, <:next volume ::>,
"nl", 1, <:segm , nsegm = :>, segm, nsegm,
"nl", 1, <:partentries , npartentries = :>, entriesinpartcat, npartentries,
"nl", 1, <:saveentries , nsaveentries = :>, entriesinsavecat, nsaveentries,
"nl", 1, <:savecatname , nsavecatname = :>, true, 12, savecatname, nsavecatname,
"nl", 1, <:savecatbase, nsavecatbase = :>, savecatbase (1),
nsavecatbase (1),
"nl", 1, <: :>, savecatbase (2),
nsavecatbase (2),
"nl", 1, <:savecatsize, nsavecatsize = :>, savecatsize, nsavecatsize,
"nl", 1, <:dumptime , ndumptime = :>, dumptime, ndumptime,
"nl", 1, <:version , nversion = :>, versionid, nversionid,
"nl", 1, <:release , nrelease = :>, releaseid, nreleaseid,
"nl", 1, <:aux sync , nauxsyncleng = :>, aux_synclength,
naux_synclength,
"nl", 1, <:syncblocklength, nsyncbl = :>, syncblocklength,
nsyncblocklength);
terminate_alarm (out,
<:dumplabel incompatible on volume tape, file number ::>,
tapename.curr_tape, file (index), <: block number : :>, block (index));
end;
getposition (z, file (index), block (index)); <*pos at return*>
end <*next volume*>;
\f
<* sw8010/2, load area handling procedures page ...102...
1983.10.31 *>
message give up page 1;
procedure give_up (z, status, hwds);
zone z ;
integer status, hwds ;
<**********************************************************>
<* *>
<* The procedure resets the catalog base and calls the *>
<* standard give up procedure stderror. *>
<* *>
<**********************************************************>
begin
reset_catbase;
stderror (z, status, hwds);
end give up;
\f
<* sw8010/2, load block procedures page ... xx...
1984.09.26 *>
message end of document page 1;
procedure end_of_document (ztape, status, hwds);
value status ;
zone ztape ;
integer status, hwds ;
begin
<**********************************************************>
<* *>
<* The procedure acts as a block procedure in the zone ar-*>
<* ray za (1:2) and supposes that there are *>
<* no other user bits in the status than 1<18, e. o. d., *>
<* and 1 shift 14, mode error. *>
<* The purpose of the procedure is to : *>
<* *>
<* If give up bit is raised : *>
<* - give up and call stderror. *>
<* *>
<* If end of document status : *>
<* - signal end of document status in the global boolean *>
<* array end_of_doc indexed with the index found in the *>
<* partial word of the zone ztape (set there by openin- *>
<* out or explicitly by the program in case of normal *>
<* record io). *>
<* - ignore the status if the operation was output *>
<* - simulate a block of 2 halfs if the operation was in- *>
<* put and nothing was transferred *>
<* *>
<* If mode error status : *>
<* - try the next mode in the reportoire and give up if *>
<* all have been tried *>
<* - close the zone, open it again with new mode, setpo- *>
<* sition, check position operation (with possible call *>
<* of block procedure) and return with bytes transfer- *>
<* red = 0. *>
<* *>
<**********************************************************>
integer array zdescr (1:20), sdescr (1:12);
integer index, operation, i, j, nextmode;
long array field docname;
own
integer startmode;
\f
<* sw8010/2, load block procedure page ... xx...
1990.03.13 *>
message end of document page 2;
docname := 2; <*fields docname in zone*>
if status extract 1 = 1 and
(status shift (-22) extract 1 = 0 and <*not parity*>
status shift (-20) extract 1 = 0 and <*not dataov*>
status shift (-19) extract 1 = 0 and <*not blockl*>
status shift (- 7) extract 1 = 0 <*not wd.def*>
or status shift (-13) extract 1 = 1) then <*read error*>
give_up (ztape, status, hwds); <*hard error, not parity or read error*>
getzone__6 (ztape, zdescr );
getshare_6 (ztape, sdescr, zdescr (17)); <*used share*>
index := zdescr (12);
operation := sdescr ( 4) shift (-12);
if status shift (-21) extract 1 = 1 then
begin <*timer*>
if operation = 3 and
hwds = 0 <*nothing transferred*> then
hwds := 2 <*end of recorded media - on adp streamer tape*>
else giveup (ztape, status, hwds);
end <*timer*> else
if status shift (-22) extract 1 = 1
or status shift (-20) extract 1 = 1
or status shift (-19) extract 1 = 1
or status shift (- 7) extract 1 = 1 then
begin <*parity error, data overrun, blocklength error or word defect*>
if operation <> 3 then
give_up (ztape, status, hwds); <*not input*>
getposition (ztape, i, j);
write_alarm (out,
<:persistent parity error, data overrunn, block length error or word defect on tape:>);
errorbits := 2; <*warning.yes, ok.yes*>
write (out,
"nl", 1, "sp", 4, true, 12, zdescr.docname,
<: file, block no :>, i, <:, :>, j);
parity (index) := true;
if hwds < 4 then
hwds := 4; <*not filemark*>
end <*parity error*> else
if status shift (-18) extract 1 = 1 then
begin <*end of document*>
end_of_doc (index) := true;
if operation = 3 <* input*> and
hwds = 0 <*nothing xferred*> then
hwds := 2;
end <*end of document*> else
begin <*mode error*>
if startmode = 0 then
startmode := 1 shift 11 add (zdescr (1) shift (-12) extract 11);
for i := 1 step 1 until 8 do
if zdescr (1) shift (-12) extract 11 = ( case i of (
0, 2, 4, 6, 8, 12, 128, 132 ) ) then
begin j := i; i := 8; end;
j := if j = 8 then 1 else j + 1;
nextmode := 1 shift 11 add ( case j of (
0, 2, 4, 6, 8, 12, 128, 132 ) );
if test then
write (out,
"nl", 2, <:block procedure tape zone :>,
"nl", 1, <:index = :>, index,
"nl", 1, <:operation = :>, operation,
"nl", 1, <: , mode = :>, sdescr (4) extract 12,
"nl", 1, <:status = :>, status,
"nl", 1, <:hwds xferred = :>, hwds,
"nl", 1, <:startmode = :>, startmode extract 11,
"nl", 1, <:next mode = :>, next_mode extract 11);
getstate (ztape, i);
if nextmode = startmode <*all modes h been tried*>
or i shift (-5) extract 1 = 1 <*after inoutrec/chrecio*> then
give_up (ztape, status, hwds);
mode_kind (copycount) := nextmode shift 12 + 18;
close (ztape, false );
open_tape (ztape, 0 , modekind (copycount),
zdescr.docname );
setposition (ztape, fileno (index), blockno (index ));
getzone6 (ztape, zdescr );
zdescr (12) := index; <*partial word := index*>
setzone6 (ztape, zdescr );
write (out,
"nl", 2, <:*mode error on :>, true, 12, zdescr.docname,
"sp", 1, <:, trying :> , case j of (
<:mt62/mtlh:>, <:mte :>, <:mt16/mtll:>, <:nrze:>,
<:mt32:>, <:mt08:>, <:mthh:>, <:mthl:>));
status := hwds := 0; <*position checked ok, in case of inrec repeat*>
end <*mode error*>;
end <*end of document*>;
\f
<* sw8010/2, load program head page ...103...
1981.12.14 *>
message program head page 1;
outfile (1) := chain_name (1) := real <::>; <*no outfile, no zone stack*>
zone_level := 0; <*no input zone stack*>
prepare_param_scan (0);
scan_param (outfile);
if scan_param (progname) shift (-12) extract 12 <> 6 <*equal*> then
begin <*no outfile, progname is next param after program name*>
for i := 1, 2 do
begin
progname (i) := outfile (i);
outfile (i) := real <::>;
repeat_param := true ; <*progname must be repeated*>
end;
end <*no outfile*>;
if outfile (1) <> real <::> then
begin <*stack current out and connect*>
result := stack_current_output (outfile);
if result <> 0 then
begin <*connect not ok*>
param_warning (out, <:warning outfile param connect impossible:>);
write (out, <: :>, case result of (
<:no resources:>, <:malfunction:>, <:not user, non exist:>,
<:convention error:>, <:not allowed:>, <:name format error:>));
end <*connect not ok*>;
end <*stack current out and connect*>;
\f
<* sw8010/2, load program page ...104...
1983.07.13 *>
message program page 1;
<*initialize disc name table for active discs and find maincat disc*>
system (5, discs (1), name_table); <*name_table (1:no_of_discs)*>
k := 0; <*pointer to next active disc*>
for i := 1 step 1 until no_of_discs do
begin
long array la (1:2); integer array ia (1:1);
system (5, name_table (i) - 18, la); <*disc name*>
if la (1) shift (-24) extract 24 <> 0 then
begin <*chaintable ok*>
k := k + 1; <*next active disc*>
disc := 8 * k; <*fields disc name in discname table*>
for j := 1, 2 do
incl_discname.disc (j) := la (j); <*move disc name*>
if name_table (i) = discs (4) <*main catalog disc*> then
main_cat_disc := k; <*pointer to active disc*>
<*initialize auxcat nametable active discs*>
system (5) move core :(nametable (i) - 28, la);
for j := 1, 2 do
incl_auxcat_name.disc (j) := la (j);
<*initialize slicelength table active discs*>
system (5, name_table (i) - 8, ia); <*slicelength*>
slicelength (k) := ia (1);
end <*chaintable ok*>;
end;
no_of_discs := k; <*no of non idle discs*>
\f
<* sw8010/2, load program page ...105...
1988.08.11 *>
message program page 2;
trap (slutlabel); <*to maybe remove savecat entry and unstack cur out*>
trapmode := 1 shift 13; <*ignore trap alarm messages*>
inc_dump := progname (1) shift (-24) shift 24 = real <:inc:>;
<*init own bases*>
bases (cat_base, std_base, user_base, max_base, sys_base);
<*remove fp area process*>
open (zsavecat, 4, <:fp:>, 0); <*zsavecat borrowed*>
close (zsavecat, true); <*remove area proc *>
open (zsavecat, 0, <::>, 0); close (zsavecat, false); <*clear names*>
open (zloadcat, 0, <::>, 0); close (zloadcat, false); <*to prevent *>
open (zpartcat, 0, <::>, 0); close (zpartcat, false); <*troubles *>
<*get monitor release*>
system (5) move core :(64, dummyia);
monrelease := dummyia (1); <*rel shift 12 + subrel*>
<*obtain area and buffer claim*>
system (5) move core :(
system (6, dummy, procname) + 26, claim); <*buf, area*>
buf__claim := claim (1) shift (-12);
area_claim := claim (1) extract 12 ;
<*area for program has been taken*>
areas_needed := 4 + 2; <*program, savecat, outfile, infile, partcat, entry*>
if area_claim + 1 < areas_needed then
begin
write_alarm (out, <:area claim, needed ::>);
write (out, << ddd>, areas_needed, <:, claim ::>, area_claim + 1, "nl", 1);
trap (-1);
end;
<*initialize entry and segment counters*>
entries_stored :=
total_entry_count :=
total_segm__count := 0;
for i := 1 step 1 until no_of_discs do
entry_count (i) :=
slice_count (i) := 0;
\f
<* sw8010/2, load program page ... 106...
1987.04.24 *>
message program page 3;
<*prepare parameter reading and interpretation*>
point_int := 8 shift 12 + 4; point_txt := 8 shift 12 + 10;
space_int := 4 shift 12 + 4; space_txt := 4 shift 12 + 10;
startvolume := no_of_copies := 1; <*default in case of tape param missing*>
for i := 1, 2 do
begin
device_no (i) := 0; <*default : no spec device*>
release (i) := true; <*default : release.yes *>
parity (i) :=
end_of_doc (i) := false;
mode_kind (i) := 1 shift 23 + 18; <*default : modekind = mto*>
for j := 1 step 1 until 2 * max_no_of_vol do
tape_name (i, j) := para_name (i, j) := 0; <*all tapenames zero*>
mount_param_spec (i) := false ; <*no mountspec*>
file_no (i) := 0; <*file no zero*>
block_no (i) := 0; <*blockno zero*>
no_of_vol (i) := 0; <*volume count*>
for j := 1, 2 do
dump_label (i, j) := long <::>; <*dumplabel*>
end;
tape_param_ok := true;
<*write (out, "nl", 1, <:speed limit : :>, "<", 1);
*>
<*stopzone (out, false);*>
<*read (in, speedlimit);
write (out, "nl", 1, <:speed limit : :>, speedlimit, "nl", 1);
*>
<*stopzone (out, false);*>
speedlimit := 100;
\f
<* sw8010/2, load program page ...105...
1988.08.21 *>
message program page 4;
<*maybe mount parameters, tape parameters*>
copy_count := 1; <*counts no of copies*>
seplength := scan_param (item);
repeat
for action := mount_param (seplength, item) while action > 0 do
begin <*item is a name and a mount param*>
mount_param_spec (copy_count) := true; <*=> tape param obligatory*>
case action of
begin
begin <*mount special*>
if scan_param (item) <> point_int then
begin
param_alarm (out, <:alarm mountspec param syntax:>);
tape_param_ok := false; <*to prevent default save*>
end else
device_no (copy_count) := round item (1);
end <*mount special*>;
begin <*release*>
if scan_param (item) <> point_txt
or item (1) <> real <:yes:> and
item (1) <> real <:no:> then
param_warning (out, <:warning release param syntax:>)
else
release (copy_count) := item (1) = real <:yes:>;
end <*release*>;
modekind (copycount) := 1 shift 23 + 18; <*mt62, mtlh, mto*>
modekind (copycount) := 1 shift 23 + 2 shift 12 + 18; <*mte*>
modekind (copycount) := 1 shift 23 + 4 shift 12 + 18; <*mt16, mtll, nrz*>
modekind (copycount) := 1 shift 23 + 6 shift 12 + 18; <*nrze*>
modekind (copycount) := 1 shift 23+ 8 shift 12 + 18; <*mt32*>
modekind (copycount) := 1 shift 23+ 12 shift 12 + 18; <*mt08*>
modekind (copycount) := 1 shift 23+128 shift 12 + 18; <*mthh*>
modekind (copycount) := 1 shift 23+132 shift 12 + 18; <*mthl*>
end case action ;
seplength := scan_param (item);
end <*while action > 0*> ;
\f
<* sw8010/2, load program page ...106...
1985.02.11 *>
message program page 5;
<*tape parameter*>
old_length := seplength;
for i := 1, 2 do
old_item (i) := item (i) ;
seplength := scan_param (item);
if (old_length = point_txt
or old_length = space_txt ) and (old_item (1) <> real <:segm:> and
old_item (1) <> real <:level:> and
old_item (1) <> real <:copy:> and
old_item (1) <> real <:vol:> ) and
(sep_length = point_int
or sep_length = point_txt and item (1) = real <:last:>) then
begin <* <s><tapename>.<fileno> or <s><tapename>.last *>
no_of_vol (copy_count) := 1; <*first volume*>
current_tape := name_field (copy_count, no_of_vol);
tofrom (para_name.current_tape, old_item, 8); <*remember parameter*>
file_no (copy_count) :=
file_no_tape_name (olditem, tapename.current_tape, modekind (copy_count)) +
(if seplength = point_txt and item (1) = real <:last:> then
-8388607
else
round item (1)
);
for seplength := scan_param (item)
while
seplength = point_txt and
item (1) <> real <:label:> and
no_of_vol (copy_count) < max_no_of_vol
do
begin <* .<name next volume> *>
increase (no_of_vol (copy_count)); <*next volume*>
current_tape := name_field (copy_count, no_of_vol);
tofrom (para_name.current_tape, item, 8); <*remember parameter*>
file_no_tape_name (item, tapename.current_tape, modekind (copy_count));
<*a possible file descriptor is looked up and docname returned*>
end <* .<name next volume> *>;
\f
<* sw8010/2, load program page ...104...
1983.07.13 *>
message program page 6;
<*seplength <> point_txt or item(1) = <:label:> or volcount = max*>
if seplength = point_txt and item (1) <> real <:label:> then
begin
param_alarm (out, <:alarm tape param too many volumes:>);
seplength := scan_param (item); <*zero param to stop tape param*>
tape_param_ok := false; <*to prevent default save*>
end else
if seplength = point_txt and item (1) = real <:label:> then
begin <* .label *>
seplength := scan_param (item );
if seplength <> point_txt then
begin
param_alarm (out, <:alarm label param syntax:>);
seplength := scan_param (item); <*zero param to stop tape par*>
tape_param_ok := false; <*to prevent default save*>
end else
begin <* .label.<name> *>
for i := 1, 2 do
dump_label (copy_count, i) := long item (i);
seplength := scan_param (item); <*next param*>
end <* .label.<name> *>;
end <* .label *>;
no_of_copies := copy_count ;
copy_count := copy_count + 1 ;
<* end <s><tapename>.<fileno> or <s><tapename>.last else*>
\f
<* sw8010/2, load program page ...107...
1984.12.04 *>
message program page 7;
end <* <s><tapename>.<fileno> or <s><tapename>.last *> else
<* old_length <> space_txt or old_item (1) = real <:segm:> or*>
<* old_item (1) = real <:level:>or*>
<*(sep_length <> point_int and *>
<*(sep_length <> point_txt or item (1) <> real <:last:> ))*>
<* <=> not <s><tapename>.<fileno> and not <s><tapename>.last *>
if copy_count = 1 or mount_param_spec (copy_count) then
begin
param_alarm (out, <:alarm tape param missing:>);
seplength := scan_param (item); <*zero param to stop tape param*>
tape_param_ok := false; <*to prevent default save*>
end else
begin <*not tape parameter, not required*>
seplength := oldlength ; <*take old parameter into current *>
for i := 1, 2 do
item (i) := olditem (i);
repeat_param := true ; <*repeat the one formerly in current*>
copy_count := 3; <*to stop tape param*>
end <*not tape parameter, not required*>;
until copy_count > 2
or -,tape_param_ok;
\f
<* sw8010/2, load program page ...108...
1984.07.13 *>
message program page 8;
<*maybe special parameter*>
<*initialize special param variables*>
copy_count := 1; <*default copy no*>
basetime :=
baselevel :=
dumplevel := 0; <*default dumplevel*>
load :=
list_entries := true;
test :=
survey :=
check_tape :=
list_only_name := false;
begin <*special block to access program entry*>
zone zprog (1, 1, stderror);
integer array entry (1:17);
open (zprog, 0, progname, 0);
close (zprog, false ); <*wont remove area process*>
monitor (76 )lookup head and tail :( zprog, 0, entry);
progbase_lower := entry (2);
progbase_upper := entry (3);
connect := entry (14) extract 1 = 1;
end <*special block*>;
\f
<* sw8010/2, load program page ...109...
1985.02.06 *>
message program page 9;
<*seplength = space_txt*>
for action := special_param (seplength, item) while action > 0 do
begin <*space_txt and special param*>
seplength := scan_param (item);
case action of
begin
<*vol*>
start_volume := round item (1);
<*copy*>
begin
copy_count := round item (1);
if copy_count > 2 then
copy_count := 1; <*back to default*>
end;
<*segm*>
;
<*level*>
dumplevel :=
if inc_dump then
round item (1)
else
0; <*if not incload ignore level*>
<*list*>
if item (1) <> real <:names:> and
item (1) <> real <:yes:> and
item (1) <> real <:no:> then
param_warning (out, <:warning list param unknown:>)
else
if item (1) = real <:names:> then
list_entries := list_only_name := true
else
begin
list_entries := item (1) = real <:yes:>;
list_only_name := false ;
end;
\f
<* sw8010/2, load program page ...110...
1984.07.06 *>
message program page 10;
<*test*>
if item (1) <> real <:yes:> and
item (1) <> real <:no:> then
param_warning (out, <:warning test param unknown:>)
else
test := item (1) = real <:yes:>;
<*load*>
if item (1) <> real <:yes:> and
item (1) <> real <:no:> then
param_warning (out, <:warning load param unknown:>)
else
begin
load := item (1) = real <:yes:>;
survey := -, load and survey;
end;
<*survey*>
if item (1) <> real <:yes:> and
item (1) <> real <:no:> then
param_warning (out, <:warning survey param unknown:>)
else
begin
survey := item (1) = real <:yes:>;
load := -, survey and load;
end;
<*check*>
; <*ignore check param*>
<*connect*>
if item (1) <> real <:yes:> and
item (1) <> real <:no:> then
param_warning (out, <:warning connect param unknown:>)
else
connect := item (1) = real <:yes:>;
<*reserve*>
; <*ignore reserve param*>
end case action;
seplength := scan_param (item);
end <* space_txt and special param*> ;
\f
<* sw8010/2, load program page ...111...
1984.07.13 *>
message program page 11;
<*load states*>
load_state := before_load_spec := 1;
after_modifier := 2;
after_disc_spec := 3;
after_entry_spec := 4;
after_error := 5;
<*scan the parameter list to count the number of entry specifiers*>
no_of_unknown_discs := 0;
entry_spec_count := 1;
for action := load_specifier (seplength, item) while action > 0 do
begin <*modifier, disc specifier or entry specifier*>
case action of
begin
begin <*changedisc or changekit*>
for seplength := scan_param (item) while seplength = point_txt do
begin <*the first of a pair*>
seplength := scan_param (item); <*the next of a pair*>
end <*the first of a pair*>;
load_state := after_modifier;
end <*changedisc or changekit*>;
begin <*newscope*>
seplength := scan_param (item);
seplength := scan_param (item); <*get next item*>
loadstate := after_modifier ;
end <*newscope*>;
\f
<* sw8010/2, load program page ...114...
1984.07.13 *>
message program page 12;
<*case action of*>
begin <*disc or kit specifier*>
for seplength := scan_param (item) while seplength = point_txt do
begin <*parameter accepted*>
for i := 1, 2 do
disc_spec_name (i) := long item (i);
if disc_spec_name (1) = long <:mainc:> add 'a' and
disc_spec_name (2) = long <:tdisc:> then
begin <*disc.maincatdisc*>
for i := 1, 2 do
disc_spec_name (i) := incl_discname (maincatdisc, i);
end;
j := 0;
for i := 1 step 1 until no_of_discs do
if disc_spec_name (1) = incl_discname (i, 1) and
disc_spec_name (2) = incl_discname (i, 2)
or disc_spec_name (1) = long <:main:>
or disc_spec_name (1) = long <:all:> then
<*disc found in disc name table or disc.all*>
j := i;
if j = 0 then
increase (no_of_unknown_discs);
end <*parameter accepted*>;
load_state := after_disc_spec;
end <*disc or kit specifier*>;
\f
<* sw8010/2, load program page ...115...
1984.07.13 *>
message program page 13;
<*case action of*>
begin <*entry specifier*>
<* <s><name>, neither a modifier nor a disc specifier*>
for action :=
entry_specifier (point_txt, item, true <*look ahead*>),
entry_specifier (seplength, item, true <*look ahead*>) while action > 0 do
begin <* .scope, .docname or .<name> *>
case action of
begin <*qualifier or entry name*>
<* .scope *>
seplength := scan_param (item);
<* .docname *>
seplength := scan_param (item);
<* .<entry name> *>
;
end <*case action qualifier or entry name*>;
seplength := scan_param (item);
end while action > 0;
\f
<* sw8010/2, load program page ...117...
1985.02.06 *>
message program page 14;
if load_state <> after_error then
load_state := after_entry_spec;
if load_state = after_entry_spec then
increase (entry_spec_count);
end <*entry specifier*>;
end <*case action*>;
end while action > 0;
if load_state = after_entry_spec then
entry_spec_count := entry_spec_count - 1;
no_of_entry_specs := entry_spec_count;
if no_of_unknown_discs = 0 then
no_of_unknown_discs := 1; <*at least one unknown for any disc*>
message listfile 1;
if test then
begin
integer i;
boolean b;
write (out,
"nl", 2, <:special parameters read first time around ::>,
"nl", 1, <:vol, copy, segm, level, list, test, load, survey, connect:>,
"nl", 1, << ddddddd>, startvolume, copycount, segm, dumplevel);
for i := 1 step 1 until 5 do
begin
b := case i of (listentries, test, load, survey, connect);
write (out, if b then <: yes:> else <: no:>);
end;
write (out,
"nl", 2, <:specifiers read first time around ::>,
"nl", 2, <:no of entry specs = :>, noofentryspecs,
"nl", 1, <:no of discs = :>, noofdiscs,
"nl", 1, <:no of unkn discs = :>, noofunknowndiscs,
"nl", 1, <:load state = :>, case loadstate of (
<:before load spec:>, <:after modifier:>, <:after disc spec:>,
<:after entry spec:>, <:after error:>) );
end <*test*>;
\f
<* sw8010/2, load declarations third block page ...111...
1984.07.13 *>
message decl. third block page 1;
if tapeparam_ok then
begin <*block for declarations of discname, new_discname*>
long array discname,
new_discname (1:no_of_entry_specs ,
1:no_of_discs + no_of_unknown_discs,
1:2 );
boolean array disc_specified (1:no_of_entry_specs ,
1:no_of_discs + no_of_unknown_discs);
long array name,
docname (1:no_of_entry_specs ,
1:2 );
integer array scope,
new_scope (1:no_of_entry_specs);
\f
<* sw8010/2, load program page ...105...
1984.12.04 *>
message program page 15;
<*scan parameters again until load specifier without recording*>
prepare_param_scan (0); <*start all over again*>
<*maybe mount parameters, tape parameters*>
for j := 1 step 1 until no_of_copies do
begin <*for each copy*>
vol_count (j) := 1; <*first volume in the copy set*>
current_tape := name_field (j, vol_count);
if test then
write (out,
"nl", 2, <:skip mount params copy no :>, j);
repeat
seplength := scan_param (item);
if test then
write_param (out, seplength, item);
until
item (1) = real para_name.current_tape (1) and
item (2) = real para_name.current_tape (2) ;
if test then
write (out,
"nl", 1, <:skip tape params copy no :>, j);
for i := 1 step 1 until no_of_vol (j) do
begin
seplength := scan_param (item); <*from volume no 2 until file number*>
if test then
write_param (out, seplength, item);
end;
if dumplabel (j, 1) <> long <::> then
for i := 1, 2 do
seplength := scan_param (item); <*.label.<label>*>
end <*for each copy*>;
seplength := scan_param (item); <*first param after tape param*>
if test then
begin
write (out,
"nl", 2, <:after skip of mount and tape parameters :>);
write_param (out, seplength, item);
end;
\f
<* sw8010/2, load program page ...108...
1984.10.02 *>
message program page 16;
<*maybe special parameter*>
<*seplength = space_txt*>
for action := special_param (seplength, item) while action > 0 do
begin <*space_txt and special param*>
seplength := scan_param (item);
case action of
begin
<*vol*>
;
<*copy*>
;
<*segm*>
;
<*level*>
;
<*list*>
if item (1) <> real <:names:> and
item (1) <> real <:yes:> and
item (1) <> real <:no:> then
; <*dummy*>
<*warning list param unknown*>
<*else ok, skip*>
\f
<* sw8010/2, load program page ...110...
1984.08.14 *>
message program page 17;
<*test*>
if item (1) <> real <:yes:> and
item (1) <> real <:no:> then
; <*dummy*>
<*warning test param unknown*>
<*else ok, skip*>
<*load*>
if item (1) <> real <:yes:> and
item (1) <> real <:no:> then
; <*dummy*>
<*warning load param unknown*>
<*else ok, skip*>
<*survey*>
if item (1) <> real <:yes:> and
item (1) <> real <:no:> then
; <*dummy*>
<*warning survey param unknown*>
<*else ok, skip*>
<*check*>
; <*ignore check param*>
<*connect*>
if item (1) <> real <:yes:> and
item (1) <> real <:no:> then
; <*dummy*>
<*warning connect param unknown*>
<*else ok, skip*>
end case action;
seplength := scan_param (item);
end <* space_txt and special param*> ;
if test then
begin
write (out,
"nl", 2, <:after skip special parameters ::>);
write_param (out, seplength, item);
end;
\f
<* sw8010/2, load program page ...111...
1985.02.06 *>
message program page 18;
<*load state*>
load_state := before_load_spec;
<*load specifier*>
<*initialize load specifier variables*>
anyscope := 0; all := 1; perm := 2;
sistem := 3; owen := 4; project := 5;
user := 6; login := 7; temp := 8;
for entry_spec_count := 1 step 1 until no_of_entry_specs do
begin <*for each entry specifier*>
for i := 1, 2 do
name (entry_spec_count, i) :=
doc_name (entry_spec_count, i) := long <::>; <*default no name/docname*>
____scope (entry_spec_count) := any_scope; <*default : any *>
new_scope (entry_spec_count) := any_scope; <*default : no change of scope*>
for i := 1 step 1 until no_of_discs + no_of_unknown_discs do
begin
disc_specified (entry_spec_count, i) := i <= no_of_discs + 1;
<*default : all known + any unknown*>
for j := 1, 2 do
new_discname (entry_spec_count, i, j) :=
____discname (entry_spec_count, i, j) :=
if i <= no_of_discs then
incl_disc_name (i, j)
else
long <::>;
<*default : all discs included are specified, no change disc*>
end;
end <*for each entry specifier*>;
\f
<* sw8010/2, load program page ...112...
1985.02.12 *>
message program page 19;
<*interpret load specifiers*>
entry_spec_count := 1;
for action := load_specifier (seplength, item) while action > 0 do
begin <*modifier, disc specifier or entry specifier*>
case action of
begin
begin <*changedisc or changekit*>
for seplength := scan_param (item) while seplength = point_txt do
begin <*the first of a pair*>
for i := 1, 2 do
from_to_discname (1, i) := long item (i);
seplength := scan_param (item); <*the next of a pair*>
if seplength <> point_txt and
(seplength <> point_int
or round item (1) >= 2) then
begin <*give it up*>
param_warning (out, <:warning changedisc param syntax:>);
from_to_discname (2, 1) := long <:no:>; <*no change*>
end <*give it up*> else
if seplength = point_int then
begin <*discname = 0 or 1*>
from_to_discname (2, 1) := extend (round item (1)) shift 24 add 1;
from_to_discname (2, 2) := long <::> ;
end else
for i := 1, 2 do
from_to_discname (2, i) := long item (i);
for i := 1, 2 do
if from_to_discname (i, 1) = long <:mainc:> add 'a' and
from_to_discname (i, 2) = long <:tdisc:>
or i=2 and
from_to_discname (i, 1) = long <:main:> then
begin <*from- or to-disc = maincatdisc or to-disc = main*>
for j := 1, 2 do
from_to_discname (i, j) := incl_disc_name (maincatdisc, j);
end;
\f
<* sw8010/2, load program page ...111...
1985.02.06 *>
message program page 20;
for i := 1 step 1 until no_of_discs + no_of_unknown_discs do
begin
if (from_to_discname (1, 1) = long <:all:>
or from_to_discname (1, 1) = long <:main:>) and i <= no_of_discs
or from_to_discname (1, 1) = long <:any:> and i > no_of_discs
or from_to_discname (1, 1) = disc_name (entry_spec_count, i, 1) and
from_to_discname (1, 2) = disc_name (entry_spec_count, i, 2) then
begin <*either from-disc = all, main or any or from-disc found*>
<*record modifier in modifier table of each succeeding spec*>
for k := entry_spec_count step 1 until no_of_entry_specs do
for j := 1, 2 do
new_discname (k, i, j) :=
if from_to_discname (2, 1) = long <:no:> then
discname (entry_spec_count, i, j)
else
from_to_discname (2, j);
end <*either*>;
end for i := 1;
end <*the first of a pair*>;
load_state := after_modifier;
end <*changedisc or changekit*>;
\f
<* sw8010/2, load program page ...113...
1984.07.13 *>
message program page 21;
<*case action of*>
begin <*newscope*>
seplength := scan_param (item);
if seplength <> point_txt then
param_warning (out, <:warning newscope param syntax:>)
else
begin <*parameter accepted*>
j := -1;
for i := temp step (-1) until project, any_scope do <*87650*>
if item (1) = real ( case (9-i) of (
<:temp:> , <:login:>, <:user:> , <:proje:> add 'c',
<::> , <::> , <::> , <::> ,
<:no:> )) and
item (2) = real ( case (9-i) of (
<::> , <::> , <::> , <:t:> ,
<::> , <::> , <::> , <::> ,
<::> )) then
begin j := i; i := any_scope; end;
if j = -1 then
param_warning (out, <:warning newscope param unknown:>)
else
for k := entry_spec_count step 1 until no_of_entry_specs do
new_scope (k) := j;
end <*parameter accepted*>;
seplength := scan_param (item); <*get next item*>
load_state := after_modifier ;
end <*newscope*>;
\f
<* sw8010/2, load program page ...114...
1984.08.15 *>
message program page 22;
<*case action of*>
begin <*disc or kit specifier*>
if scan_param (item) = point_txt then
begin <*first disc specifier param will be accepted*>
for k := entry_spec_count step 1 until no_of_entry_specs do
for i := 1 step 1 until no_of_discs + no_of_unknown_discs do
begin
disc_specified (k, i) := false; <*disc specifiers erased*>
if i > no_of_discs then
for j := 1, 2 do
___discname (k, i, j) :=
newdiscname (k, i, j) := long <::>;
end;
end <*first disc specifier will be accepted*>;
repeat_param := true;
for seplength := scan_param (item) while seplength = point_txt do
begin <*parameter accepted*>
for i := 1, 2 do
disc_spec_name (i) := long item (i);
if disc_spec_name (1) = long <:mainc:> add 'a' and
disc_spec_name (2) = long <:tdisc:> then
begin <*disc.maincatdisc*>
for i := 1, 2 do
disc_spec_name (i) := incl_discname (maincatdisc, i);
end;
\f
<* sw8010/2, load program page ...111...
1985.02.06 *>
message program page 23;
<*find disc specified in disc name table for entry spec*>
j := 0;
for i := 1 step 1 until no_of_discs + no_of_unknown_discs do
if disc_spec_name (1) = discname (entry_spec_count, i, 1) and
disc_spec_name (2) = discname (entry_spec_count, i, 2)
or (disc_spec_name (1) = long <:main:>
or disc_spec_name (1) = long <:all:> and i <= no_of_discs) then
begin <*disc found in disc name table or disc.all*>
for k := entry_spec_count step 1 until no_of_entry_specs do
begin
disc_specified (k, i) := true;
for j := 1, 2 do
___discname (k, i, j) :=
newdiscname (k, i, j) := discname (entry_spec_count, i, j);
j := i;
end;
end;
i := no_of_discs;
if j = 0 then
begin <*disc specified unknown, insert in next idle*>
repeat
i := i + 1;
until discname (entry_spec_count, i, 1) = long <::>;
for k := entry_spec_count step 1 until no_of_entry_specs do
begin
for j := 1, 2 do
____discname (k, i, j) :=
new_discname (k, i, j) :=
if disc_specname (1) = long <:any:> then
long <::>
else
disc_specname (j);
disc_specified (k, i ) := true;
end;
end <*disc specified unknown*>;
end <*parameter accepted*>;
load_state := after_disc_spec;
end <*disc or kit specifier*>;
\f
<* sw8010/2, load program page ...115...
1984.07.13 *>
message program page 24;
<*case action of*>
begin <*entry specifier*>
<* <s><name>, neither a modifier nor a disc specifier*>
scope (entry_spec_count) := any_scope; <*back to default*>
for action :=
entry_specifier (point_txt, item, true <*look ahead*>),
entry_specifier (seplength, item, true <*look ahead*>) while action > 0 do
begin <* .scope, .docname or .<name> *>
case action of
begin <*qualifier or entry name*>
begin <* .scope *>
seplength := scan_param (item);
if seplength <> point_txt then
begin
param_warning (out, <:warning scope param syntax:>);
load_state := after_error;
end else
begin <* .scope.<name> *>
j := 0;
for i := all step 1 until temp do
if item (1) = real ( case i of (
<:all:> , <:perm:> , <:syste:> add 'm',
<:own:> , <:proje:> add 'c', <:user:> ,
<:login:> , <:temp:> )) and
item (2) = real ( case i of (
<::> , <::> , <::> ,
<::> , <:t:> , <::> ,
<::> , <::> )) then
begin j := i; i := temp; end;
if j = 0 then
begin
param_warning (out, <:warning scope param unknown:>);
load_state := after_error;
end;
scope (entry_spec_count) := j;
end <* .scope.<name> *>;
end <* .scope *>;
\f
<* sw8010/2, load program page ...116...
1984.07.13 *>
message program page 25;
<*case action of *>
<*begin qualifier or entry name*>
begin <* .docname *>
seplength := scan_param (item);
if seplength <> point_txt then
begin
param_warning (out, <:warning docname param syntax:>);
load_state := after_error;
end else
for i := 1, 2 do
docname (entry_spec_count, i) := long item (i);
end <* .docname *>;
begin <* .<entry name> *>
if item (1) = real <:c:>
or item (1) = real <:v:>
or item (1) = real <:primo:> add 'u' and
item (2) = real <:t:> then
begin
param_warning (out, <:warning name illegal:>);
load_state := after_error;
end else
if name (entry_spec_count, 1) <> 0 then
begin <*name already assigned*>
param_warning (out, <:warning name double defined:>);
<*load state unchanged => entry specifier maybe recorded*>
end else
for i := 1, 2 do
name (entry_spec_count, i) := long item (i);
end <* .<entry name> *>;
end <*case action qualifier or entry name*>;
seplength := scan_param (item);
end while action > 0;
\f
<* sw8010/2, load program page ...117...
1984.08.15 *>
message program page 26;
if load_state <> after_error then
load_state := after_entry_spec;
if load_state = after_entry_spec then
increase (entry_spec_count);
for i := entry_spec_count step 1 until no_of_entry_specs do
begin <*next and following entry specifiers back to default*>
for j := 1, 2 do
___name (i, j) :=
docname (i, j) := long <::>;
scope (i) := any_scope;
end <*next and following*>;
end <*entry specifier*>;
end <*case action*>;
end while action > 0;
<*action = 0 : not <s><name>, maybe zero*>
while seplength <> 0 do
begin <*skip until end of parameter list with warning for each*>
param_warning (out, <:warning load spec param unknown:>);
seplength := scan_param (item);
end;
if load_state = after_entry_spec then
entry_spec_count := entry_spec_count - 1;
if entry_spec_count <> no_of_entry_specs then
param_alarm (out, <:alarm entry specifiers not properly recorded:>);
message listfile 2;
if test then
begin <*1*>
long array name1, name2 (1:2);
integer i;
boolean b;
write (out,
"nl", 1, <:special parameters::>,
"nl", 1, <:copy, vol, segm, level, list, test, load, survey, connect:>,
"nl", 1, << ddddddd>,copycount, startvolume, segm, dumplevel);
for i := 1 step 1 until 5 do
begin
b := case i of (listentries, test, load, survey, connect);
write (out, if b then <: yes:> else <: no:>);
end;
write (out,
"nl", 2, <:specifiers : :>,
"nl", 2, <:no of entry specifiers = :>, noofentryspecs,
"nl", 1, <:no of discs = :>, noofdiscs,
"nl", 1, <:no of unknown discs = :>, noofunknowndiscs);
for entryspeccount := 1 step 1 until noofentryspecs do
begin <*2*>
write (out,
"nl", 2, <:next specifier ::>);
for i := 1 step 1 until noofdiscs + noofunknowndiscs do
begin <*3*>
for j := 1, 2 do
begin <*4*>
name1 (j) := ___discname (entryspeccount, i, j);
name2 (j) := newdiscname (entryspeccount, i, j);
end <*4*>;
write (out,
"nl", 1, <:disc = :>, true, 12, name1,
<:new disc = :>, true, 12, name2,
"sp", 3, <:spec = :>,
if discspecified (entryspeccount, i) then <:yes:> else <:no:>);
end <*3*>;
for j := 1, 2 do
begin <*3*>
name1 (j) := ____name (entryspeccount, j);
name2 (j) := doc_name (entryspeccount, j);
end <*3*>;
write (out,
"nl", 1, <:name = :>, name1,
"nl", 1, <:scope = :>, case (___scope (entryspeccount) + 1) of (
<:any:> , <:all:> , <:perm:> , <:system:>, <:own:>,
<:project:>, <:user:>, <:login:>, <:temp:> ),
"nl", 1, <:new scope = :>, case (newscope (entryspeccount) + 1) of (
<:any:> , <:all:> , <:perm:> , <:system:>, <:own:>,
<:project:>, <:user:>, <:login:>, <:temp:>),
"nl", 1, <:docname = :>, name2);
end <*2*>;
end <*1*>;
\f
<* sw8010/2, load prepare tape zones page ...110...
1987.04.29 *>
message prepare tapes page 1;
<*prepare tape*>
vol_count (copy_count) :=
if start_volume < 1 then
1
else
if start_volume > no_of_vol (copy_count) then
no_of_vol (copy_count)
else
startvolume;
begin <*prepare tape, maybe search the volume, file and block*>
integer array zdescr (1:20);
zone array ztape (1, 128, 1, end_of_document);
get_fileno (ztape (1), copy_count, no_of_copies, vol_count, no_of_vol,
tapename , device_no , modekind ,
file_no , block__no );
current_tape := name_field (copy_count, vol_count); <*tape name*>
open_tape (ztape (1), deviceno (copy_count),
modekind (copy_count), tapename.current_tape);
<*zone.partial word := index := 1*>
setposition (ztape (1), fileno (copy_count), blockno (copy_count));
<*get version dump or continue label*>
current_tape := name_field (copy_count, vol_count); <*tape name*>
label_name := copy_count * 8; <*fields labelname in dumplabel*>
if get_labelrec (ztape (1), segm, entries_in_partcat, entries_in_savecat,
savecat_name, savecat_base, savecat_size, dumptime,
version_id , release_id, aux_synclength , sync_blocklength) then
<*record the position of the tape*>
getposition (ztape (1), fileno (copy_count), blockno (copycount))
else
terminate_alarm (out,
<:no dump label found on volume tape, file no:>,
tapename.current_tape, fileno (copycount), <: block no :>, blockno (copy_count));
if test then
begin real hms;
write (out,
"nl", 2, <:segm = :>, segm,
"nl", 1, <:entries in partcat = :>, entriesinpartcat,
"nl", 1, <:entries in savecat = :>, entriesinsavecat,
"nl", 1, <:savecat name = :>, savecatname,
"nl", 1, <:savecat base = :>, savecatbase (1),
"nl", 1, <: :>, savecatbase (2),
"nl", 1, <:savecat size = :>, savecatsize,
"nl", 1, <:dumptime = :>, <<zddddd>,
systime (6, dumptime, hms), <:.:>, <<zddd>, entier (hms/100),
"nl", 1, <:version = :>, <<zddddd>, versionid,
"nl", 1, <:release = :>, releaseid,
"nl", 1, <:aux synclength = :>, aux_synclength,
"nl", 1, <:sync blocklength = :>, syncblocklength);
end;
end <*prepare tape*>;
\f
<* sw8010/2, load declarations fourth block page ... xx...
1985.01.16 *>
message declare zones page 1;
no_of_shares := 2; <*basta*>
bufs_needed := 2 * (no_of_shares - 1); <*2 zones*>
<*buffers for iorec*>
bufs_needed := bufs_needed + 1;
if buf_claim < bufs_needed then
begin
write_alarm (out, <:buffer claim, needed ::>);
write (out, << ddd>, bufs_needed + 1, <:, claim ::>, buf_claim + 1,
"nl", 1);
trap (-1); <*to slutlabel to unstack current out*>
end;
buf_length := buflengthio (2, no_of_shares, segm * 512);
<*minimum for openio/inoutrec with blocklength segm * 512*>
begin <*declarations of disc and tape zones, fourth block level*>
zone array ztape (
2 ,
buflength ,
no_of_shares ,
end_of_document);
\f
<* sw8010/2, load prepare savecat and loadcat page ... xx...
1984.08.28 *>
message prepare save-loadcat page 1;
if false then
traplabel:
begin <*traproutine to release and remove processes*>
maybe_device_status (out);
getstate (ztape (1), i);
if i = 32 <*after openinout *>
or i = 40 <*after openinout on mt*>
or i = 41 <*after inoutrec *> then
closeinout (ztape); <*stop zones and reallocate*>
fpproc (33) out end :(0, out, 'nul');
close (ztape (1),
if release (copy_count) then false add 1 else false);
close (ztape (2), true); <*release and remove*>
trapmode := 1 shift 13; <*ignore trap message*>
trap (1); <*next trap label*>
end <*trap routine*>;
\f
<* sw8010/2, load prepare savecat and loadcat page ... xx...
1988.11.17 *>
message prepare save-loadcat page 2;
trap (traplabel); <*to release and remove processes*>
<*maybe create save catalog file, connect zsavecat and get head*>
<*check savecat file*>
savecatfile_connected :=
connect_savecatfile (zsavecat, savecatname, savecatbase,
savecatsize, dumptime );
if inc_dump and savecatfile_connected then
open (ztape (2), 4, savecat_name, 0 ) <*no output*>
else
begin <*create file and transfer save catalog*>
savecat_name (1) := long <::>;
connect_alarm (out , savecat_name,
connect_output (ztape (2), 4, savecat_name, savecatsize, 0)); <*output*>
close (zsavecat , false );
open (zsavecat , 4, savecat_name, 0 ); <*input*>
end;
current_tape := name_field (copy_count, vol_count);
open_tape (ztape (1), deviceno (copy_count), modekind (copycount),
tapename.current_tape);
setposition (ztape (1), fileno (copycount), blockno (copycount));
reading_savecat := true;
segments :=
transfer (ztape, copycount , no_of_copies, fileno, blockno,
savecatsize, end_of_doc ,
inc_dump and savecat_file_connected <*expell*>);
reading_savecat := false;
if segments <> savecatsize then
terminate_alarm (out,
<:incomplete save catalog transferred from tape:>,
tapename.current_tape, savecatsize, <: transferred : :>, abs (segments));
savecat_recstart := in_savecat_head (zsavecat);
<*no_of_copies and no_of_vol (1:2) overwritten*>
if test then
begin integer copy, v; integer array vol (1:2); long array field name;
write (out,
"nl", 2, <:incdump = :>, if incdump then <:yes:> else <:no:>,
"nl", 2, <:savecat file conn. = :>, if savecatfileconnected then <:yes:> else <:no:>,
"nl", 1, <:savecat name = :>, savecatname,
"nl", 1, <:savecat recstart = :>, savecatrecstart,
"nl", 1, <:no of copies, vol = :>, noofcopies, noofvol (1), noofvol (2),
"nl", 1, <:segm = :>, segm);
for copy := 1 step 1 until noofcopies do
for v := 1 step 1 until noofvol (copy) do
begin
vol (copy) := v;
name := namefield (copy, vol);
write (out,
"nl", 1, <:tape name = :>, tapename.name);
end;
write (out,
"nl", 1, <:copy count = :>, copycount,
"nl", 1, <:vol count = :>, volcount (copycount));
end;
savecat_reclength := if no_of_copies = 1 then 58 else 64;
<*connect zsavecat to area, create area process*>
loadcat_name (1) := long <::>;
connect_alarm (out , loadcat_name,
connect_output (zloadcat, 4 , loadcat_name, savecatsize, 0));
\f
<* sw8010/2, load load entries page ... xx...
1985.02.07 *>
message store entries in cat page 1;
<*store into load catalog entries from save catalog qualifying specs*>
entries_stored :=
store_entries (zloadcat , zsavecat , savecat_reclength ,
name , scope , newscope, docname ,
no_of_entry_specs, disc_specified, discname, new_discname);
close (zsavecat, false); <*finish*>
disconnect_output (zloadcat, false); <*cut *>
<*load entries recorded in load catalog*>
entries_loaded :=
if entries_stored > 0 then
load_entries (
ztape , copy_count , no_of_copies , vol_count ,
zloadcat, loadcatname, entries_stored , savecat_reclength,
zpartcat, partcatname, entries_in_partcat , segs_loaded )
else
0;
if entries_loaded = 0
or entries_stored = 0 then
begin <*no entries found or no entries loaded*>
if entries_stored = 0
or load then
begin <*warning*>
list_specifiers (out,
write_alarm (out,
if entries_stored = 0 then
<:no entries found:>
else
<:no entries loaded:>),
no_of_entry_specs, no_of_discs + no_of_unknown_discs, disc_specified,
discname , name , scope , docname );
error_bits := 2; <*warning.yes, ok.yes*>
end <*warning*> else
<*message*>
write (out,
"nl", 2, <:nothing loaded because of :>,
if survey then <:survey.yes:> else <:load.no:>);
end <*no entries found or no entries loaded*>;
\f
<* sw8010/2, load end third and fourth block page ...118...
1984.08.28 *>
message end fourth block page 1;
<*finish tape*>
out_endmess (out, ztape (1), total_entrycount, total_segmcount);
fpproc (33 )out end:( 0, out, 'nul');
<*outend on current out before possible release message*>
<*if parent is s output would be mixed with message *>
close (ztape (1),
if release (copy_count) then false add 1 else false); <*maybe rel*>
end <*declarations of disc and tape zones, fourth block level*>;
end <*declarations of specifier arrays, third block level*>;
\f
<* sw8010/2, load program page ...119...
1984.11.20 *>
message program page 27;
getzone_6 (out, zdescr);
if tapeparam_ok and zdescr (1) extract 12 = 4 then
begin <*write load statistics*>
list_______counters (out, entry_count, slice_count);
list_total_counters (out, entries_loaded , segs_loaded ,
total_entry_count, total_segm_count);
end <*write load statistics*>;
\f
<* sw8010/2, load program tail page ...120...
1984.10.31 *>
message program tail page 1;
if false then
slutlabel:
begin <*after rs alarm*>
maybe_device_status (out);
errorbits := 3; <*warning, alarm*>
end;
<*maybe remove save catalog, remove partial catalog*>
close (zsavecat, true); <*remove process in not already removed*>
close (zloadcat, true); <*remove ...*>
close (zpartcat, true); <*remove ...*>
if -, savecatfile_connected then
monitor (48) remove entry :(zsavecat, 1, dummyia);
__monitor (48) remove entry :(zloadcat, 1, dummyia);
__monitor (48) remove entry :(zpartcat, 1, dummyia);
if chain_name (1) <> real <::> then
unstack_current_output;
end <*second level*>;
end;
▶EOF◀