DataMuseum.dk

Presents historical artifacts from the history of:

RC4000/8000/9000

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about RC4000/8000/9000

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦bb561bd1a⟧ Rc489k_TapeFile, TextFile

    Length: 43776 (0xab00)
    Types: Rc489k_TapeFile, TextFile

Derivation

└─⟦aa55fa693⟧ Bits:30007479 SW8110/1 TAS/SOS/PRIMO Rel 2.3
    └─⟦this⟧ 

TextFile

(head 1
 bcheckparam=algol message.no
 if ok.yes
 (c=message checkparam compiled ok
  checkparam=move bcheckparam
  c=lookup checkparam
 )
 if ok.no
  c=message checkparam error in compilation
)

external integer procedure checkparam
  (paramno, keywordno, keywordlist, elements, elementtype, print);
value
   paramno,                                                print ;
real array
                       keywordlist, elements                     ;
integer array
                                              elementtype        ;
integer
   paramno, keywordno                                            ;
boolean                                                    print ;

message: *** checkparam version  1.00 ***;
comment: ***                          ***;
message: *** eli, 78.07.13            ***;

comment:
  this procedure may be used to check the right hand side parameterlist
  of a programcall.

  the procedure assumes, that the parameterlist consists of a number
  of parameter(groups) separated by spaces (<sp> in fp-notation).

  each parameter consists of one or more elements, separated 
  (if more than one) by periods.

  the first (and maybe only) element and is assumed
  to be a keyword. the array <keywordlist> is assumed
  to be declared as

    real array keywordlist(1:no_of_keywords, 1:3)

  the keywords allowed must be described in keywordlist(i, 1) and
  keywordlist(i,2). if keywordlist(i,1)= null they will be assumed
  to match any keyword in the parameter. unused entries in
  keywordlist should have keywordlist(i,1) set to a
  value which can not possible occur (0.0 shift 48 add -1 shift 24
  add -1).

  keywordlist(i,3) must contain a specification of the types
  (text or integer) allowed for the elements in the parameter. each
  specification contains 3 bits as follows:

    000  no element allowed
    001  text element must be present
    010  integer element must be present
    011  text or integer element may be present
    100  not used bitpattern
    101  text element may be present
    110  integer element may be present
    111  text or integer element may be present

  note, that the optional elements should, to make sense,
  appear as the last elements in the parameter.

  the specifications must be packed in keywordlist(i,3) in the
  following way:

    keywordlist(i,3):= 0.0 shift 48
                       add <specs0> shift 3
                       add <specs1> shift 3
                       add <specs2> shift 3
                       ...
                       add <specsn>

  <specs0> is the specification for the keyword.
  <specs1> is the specification for the first element
  following the keyword, <specs2> the specifications of the
  next element etc.

  the arrays elements and elementtype must be declared as

    real array elements(0:max_elements, 1:2)
    integer array elementtype(0:max_elements)

  where <max_elements> is the maximum number (in excess to the
  keyword) of elements that is allowed by the specifications in
  array keywordlist. note, that the packing of the specifications
  limits this number to at most 15.

  the keyword is stored in elements(0,1) and elements(0,2). the elements
  following are stored in elements(i,1) and elements(i,2), i=1, 2, ...
  the type of the keyword and the elements is signalled in elementtype
  in the following way:

    elementtype(i)= 0   no element present
                  = 1   text type element
                  = 2   integer type element

  if checkparam returns with ok-indication, each element is of a
  type allowed in the specifications in keywordlist(i, 3).

  when called, checkparam will check the parameter specified
  by <paramno>. <paramno> must contain the number (as defined
  for the procedure system(4, ...) in the algol-manual)
  of the keyword in the parameter. the separator
  preceeding this element should be a space. if checkparam is
  used to check all the parameters the first call of checkparam
  will have <paramno>= 1 (no left side parameter) or <paramno>= 2
  (left side present).

  upon return, the success of the parametercheck is indicated through
  the value of checkparam:

    checkparam= 0   no more parameters

              > 0   parameter ok. keyword and elements are stored as
                    described above. <keyword_no> contains the value
                    of the first index in keywordlist where the
                    keyword was found. 
                    the value of checkparam indicates the number of
                    elements (including the keyword).

               < 0  error in parameter. the contents of <keyword_no>
                    elements and elementtype are undefined.
                    the absolute value of checkparam indicates the
                    number of elements.

  note, that when checkparam<>0, <paramno> may be adjusted to point
  to the next parameter by the statement:

    j:= checkparam(paramno, ...)
    paramno:= paramno+ abs j
    if j<0 then ...

  when an error is detected, checkparam may print an errormessage
  on current output. the errormessage has the following format:

    ***<progname> param: <parameter>

  where <progname> if the programname found in the fp-parameters and
  <parameter> is the illegal parameter.
  the errormessage will only be printed if <errorprint> is true.

;
\f


begin
  integer    i, j, p, maxelems, maxkeywords;
  real array arr(1:2);
  real       r, null;

  null:= 0.0 shift 48;

  i:= system(3, max_keywords, keywordlist);
  maxkeywords:= (maxkeywords-i+1)//3;


  system(3, i, elementtype);
  for i:= i step (-1) until 1 do elementtype(i):= 0;

  comment: start scan of parameter;
  j:= system(4, paramno, arr);
  if j=0 then
  begin comment: parameterlist empty);
    checkparam:= 0;
    goto return;
  end;

  comment: search for keyword;
  i:= 1;
  while keywordlist(i,1)<>null and
        (keywordlist(i,1)<>arr(1) or
         keywordlist(i,2)<>arr(2)) do
  begin
    i:= i+1;
    if i>maxkeywords then goto paramerror;
  end;

  comment: i holds the keywordnumber;
  keywordno:= i;
  r:= keywordlist(keywordno, 3);

  comment: find maximum number of elements allowed;
  maxelems:= -1;
  while r<>null do
  begin
    maxelems:= maxelems+1;
    r:= r shift (-3);
  end;

  comment: copy elements description into array elementtype;
  r:= keywordlist(keywordno, 3);
  for i:= maxelems step (-1) until 0 do
  begin
    elementtype(i):= r extract 3;
    r:= r shift (-3);
  end;

  comment: now scan the elements in the parameter. check the type
           and store the element and the elementtype;
  i:= 0;
  for j:= system(4,paramno+i,arr) while (i=0) or (j shift (-12)=8) do
  begin
    if j extract 12=10 then
    begin comment: texttype element;
      if elementtype(i) extract 1=0 then goto paramerror;
      elementtype(i):= 1;
    end else
    begin comment: integertype element;
      if elementtype(i) shift (-1) extract 1=0 then goto paramerror;
      elementtype(i):= 2;
    end;
    elements(i,1):= arr(1);
    elements(i,2):= arr(2);
    i:= i+1;
  end;

  comment: if any element-specifications are left unused, they
           should contain the optional-bit;
  checkparam:= i;
  for i:= i step 1 until maxelems do
  begin
    if elementtype(i) shift (-2) extract 1=0 then goto paramerror;
    elementtype(i):= 0;
  end;

  comment: parameter ok;
  goto return;

paramerror:
  if print then
  begin comment: find programname in parameterlist;
    if system(4, 1, arr) shift (-12)<>6 then
       system(4, 0, arr);
    i:= 1;
    write(out, <:***:>, string arr(increase(i)), <: param: :>);
  end;

  comment: find actual number of elements in erroneous parameter
           and print elements if specified;
  p:= 0;
  for j:= system(4, paramno+p, arr) while (p=0) or
                                          (j shift (-12)=8) do
  begin
    if print then
    begin
      if p<>0 then write(out, <:.:>);
      if j extract 12=10 then
      begin
        i:= 1;
        write(out, string arr(increase(i)));
      end else
        write(out, <<d>, arr(1));
    end;
    p:= p+1;
  end;
  if print then write(out, <:<10>:>);

  comment: p contains number of elements;
  checkparam:= -p;

return:
end;
end
\f


(head 1
 bfilexfer=algol connect.no message.no
 if ok.yes
 (c=message filexfer compiled ok
  filexfer=move bfilexfer
  c=lookup filexfer
 )
 if ok.no
  c=message filexfer error in compilation
)

begin message: *** filexfer version: 1.01 ***;
      comment: ***                        ***;
      message: *** eli, 79.04.01          ***;

comment: program constants and generation parameters;


integer             max_queue_specs, no_of_queue_specs, first_tkrit,
                    mes_lgt, ans_lgt, def_transport_code, wait_code,
                    release_code;
integer field       treply, tno, intfi, tsenderror, treceiveerror;
integer array field tkrit;
real array field    tsend, treceiv, tname, tuser, queue, group;
boolean             any_errors, verify, wait, release;
real                progname, null;

comment: program generation parameters;

max_queue_specs:= 1;

comment: program constants;

first_tkrit:= 58;
treply:= intfi:= 2;
tno:= 4;
tname:= 4;
tuser:= 16;
tsend:= 40;
treceiv:= 50;
group:= 2;
queue:= 10;
tkrit:= first_tkrit;
tsenderror:= 16;
treceiveerror:= 20;

progname:= real <:***filexfer :>;
any_errors:= false;
def_transport_code:= 2;
wait_code:= 6;
release_code:= 8;

mes_lgt:= 30+9*max_queue_specs;
ans_lgt:= 26;
null:= 0.0 shift 48;
verify:= false;
wait:= false;
release:= true;

begin comment: declaration of workspace;
  integer array mess(1:mes_lgt), answer(1:ans_lgt);
  integer       i, j;
  real array    resultentry(1:2);

  procedure entry(id);
  value           id ;
  integer         id ;
  begin
    zone z(1,1,stderror);
    integer array tail(1:10);

    i:= 1;
    open(z, 0, string resultentry(increase(i)), 0);
    for i:= 2 step 1 until 10 do tail(i):= 0;
    tail(1):= 1 shift 23;
    tail(7):= id;

    j:= monitor(40, z, i, tail);
    if j<>0 then
    begin comment: entry already exists or other creation error;
      i:= 1;
      write(out, string progname, <:create :>,
                 string resultentry(increase(i)));
      if j=3 then 
        write(out, <: entry already exists:>) else
      if j=4 then
        write(out, <: claims exceeded:>) else
      if j=5 then
        write(out, <: catalog base illegal:>) else
      write(out, <: result: :>, j);
      write(out, <:<10>:>);
      any_errors:= true;
      goto end_program;
    end;

    if id=0 then
       monitor(48, z, i, tail);
  end procedure entry;

  comment: initialization;

  no_of_queue_specs:= 0;
  for i:= 1 step 1 until mes_lgt do mess(i):= -1;
  for i:= 1 step 1 until ans_lgt do answer(i):= -1;

  begin comment: scan and check of parameterlist;
    real array    keywordlist(1:7, 1:3), elements(0:2, 1:2),
                  arr(1:2);
    integer array elementtype(0:2);
    integer       text, int, keywordno, param, i, j, p, iparam, oparam;

    procedure error(paramno, text);
    integer         paramno;
    string                   text;
    begin comment: prints an error mess on current output.
                   if paramno=0 only the text is printed.
                   otherwise the text followed by <:param:> is
                   printed and the parameter specified by paramno
                   is printed until a parameter preceeded by <sp>
                   is met.
                   if paramno=0 the program terminates;
      write(out, string progname, text);
      if paramno=0 then 
      begin
        write(out, <:<10>:>);
        goto end_program;
      end;
      write(out, if real text=real <::> then <:param: :>
                                        else <:: :>);
      p:= paramno;
      for j:= system(4,paramno,arr) while j shift(-12)=8 or
                                            p=paramno do
      begin
        i:= 1;
        if j shift (-12)=8 then write(out, <:.:>);
        if j extract 12=4 then write(out, <<d>, arr(1))
                          else write(out, string arr(increase(i)));
        paramno:= paramno+1;
      end;
      write(out, <:<10>:>);
      any_errors:= true;

      goto scan_params;
    end;


    text:= 1;
    int:= 2;

    keywordlist(1,1):= real <:verif:> add 121;
    keywordlist(1,2):= null;
    keywordlist(1,3):= null add text shift 3 add text;

    keywordlist(2,1):= real <:name:>;
    keywordlist(2,2):= null;
    keywordlist(2,3):= null add text shift 3 add text;

    keywordlist(3,1):= real <:queue:>;
    keywordlist(3,2):= null;
    keywordlist(3,3):= null add text shift 3 add text shift 3 add text;

    keywordlist(4,1):= real <:relea:> add 115;
    keywordlist(4,2):= real <:e:>;
    keywordlist(4,3):= null add text shift 3 add text;

    keywordlist(5,1):= real <:user:>;
    keywordlist(5,2):= null;
    keywordlist(5,3):= null add text shift 3 add text;

    keywordlist(6,1):= real <:wait:>;
    keywordlist(6,2):= null;
    keywordlist(6,3):= null add text shift 3 add text;

    keywordlist(7,1):= keywordlist(7,2):= null;
    keywordlist(7,3):= null add text;

    comment: check left side;
    resultentry(1):= null;
    param:= iparam:= 1;
    oparam:= 2;
    if system(4,1,arr) shift (-12)=6 then
    begin comment: left side present;
      param:= iparam:= 2;
      oparam:= 3;
      system(4,0,resultentry);
    end;


scan_params:
    for j:= checkparam(param, keywordno, keywordlist,
                       elements, elementtype, false) while j<>0 do
    begin comment: keywordno holds the keywordnumber;
      if j<0 then error(param, <::>);

      case keywordno of
      begin
        begin <* 1: verify*>
          if elements(1,1)=real <:yes:> then verify:= true else
          if elements(1,1)=real <:no:>  then verify:= false else
          error(param, <::>);
        end;

        begin <* 2: name*>
          if mess.tname.intfi<>-1 then
             error(param, <:transport name double defined:>);
          mess.tname(1):= elements(1,1);
          mess.tname(2):= elements(1,2);
        end;

        begin <* 3: queue*>
          if no_of_queue_specs=max_queue_specs then
             error(param, <:no room for queue specification:>);
          no_of_queue_specs:= no_of_queue_specs+1;
          mess.tkrit(1):= 0;
          mess.tkrit.group(1):= elements(1,1);
          mess.tkrit.group(2):= elements(1,2);
          mess.tkrit.queue(1):= elements(2,1);
          mess.tkrit.queue(2):= elements(2,2);
          tkrit:= tkrit+18;
        end;

        begin <* 4: release*>
          if elements(1,1)= real <:yes:> then release:= true else
          if elements(1,1)= real <:no:>  then release:= false else
          error(param, <::>);
        end;
        begin <* 5: user*>
          if mess.tuser.intfi<>-1 then
             error(param,<:user name double defined:>);
          mess.tuser(1):= elements(1,1);
          mess.tuser(2):= elements(1,2);
        end;

        begin <* 6: wait*>
          if elements(1,1)= real <:yes:> then wait:= true else
          if elements(1,1)= real <:no:> then wait:= false else
          error(param, <::>);
        end;

        begin <* 7: area- or devicename*>
          if param=iparam then
          begin comment: sendername;
            mess.tsend(1):= elements(0,1);
            mess.tsend(2):= elements(0,2);
          end else
          if param=oparam then
          begin comment: receivername;
            mess.treceiv(1):= elements(0,1);
            mess.treceiv(2):= elements(0,2);
          end else
          error(param, <::>);
        end;
      end case;

      param:= param+j;
    end for while;

    if any_errors then goto end_program;

    comment: end of parameterscan.
             check that at least sender- and receiver name has
             been specified;
    if mess.tsend.intfi=-1 then error(0, <:sender name missing:>);
    if mess.treceiv.intfi=-1 then error(0, <:receiver name missing:>);
    if mess.tname.intfi=-1 then
    begin comment use null-name;
      mess.tname(1):= mess.tname(2):= null;
    end;
    if mess.tuser.intfi=-1 then
    begin comment get process name;
      long array arr(1:2);
      system(6,i,arr);
      tofrom(mess.tuser,arr,8);
    end;

    if resultentry(1)<>null then entry(0);

  end parameter block;

  comment: send transport definition mess to primo;

  i:= transfer(def_transport_code, mess, mes_lgt, answer, ans_lgt);

  comment: check result;

  if i<>0 then
  begin comment: error in communication with primo or in parameters
                 to <transfer>. the latter should not possible
                 could occur;
    any_errors:= true;
    write(out, string progname, <:primo communication error: :>);
    if i>1 and i<7 then
    write(out, case i-1 of (<:rejected:>,
                            <:unintelligible:>,
                            <:malfunction:>,
                            <:primo does not exist:>,
                            <:mess buffer claim exceeded:>),
               <:<10>:>)
    else
    write(out, <:unexpected result: :>, i, <:<10>:>);
  end else
  begin comment: error returned in answer from primo itself;
    i:= answer.treply;
    if i<>0 then 
    begin comment: transport definition error;
      any_errors:= true;
      write(out, string progname, <:primo reply error: :>);
      if i=3 then
      write(out, <:missing resources:>)

      else
      if i=5 or i=6 then
      begin comment: error in sender/receiver device specification;
        if i=5 then
        begin
          write(out, <:sender :>);
          j:= answer.tsenderror;
        end else
        begin
          write(out, <:receiver :>);
          j:= answer.treceiveerror;
        end;
        if j=1 then write(out, <:entry troubles:>)
        else
        if j=2 then write(out, <:device troubles:>)
        else
        write(out, <:errorcode :>, j);
      end else
      write(out, <:unexpected reply code: :>, i);

      write(out, <:<10>:>);
    end else
    begin comment: transport defined. if the verify.yes
                   parameter has been specified, the identi-
                   fication of the transport shall be output;
      if verify then
      write(out, <:transport identification: :>, 
                 answer.tno, <:<10>:>);

      if resultentry(1)<>null then entry(answer.tno);

      if wait then
      begin comment: send wait operation;
        mess.tno:= answer.tno;
        transfer(wait_code,mess,9,answer,ans_lgt);
      end;

      if release then
      begin comment: send release operation;
        mess.tno:= answer.tno;
        transfer(release_code,mess,7,answer,7);
      end;
    end;

end_program:
    if any_errors then errorbits:= 1 shift 0;
    trapmode:= 1 shift 10;
  end;
end
end
\f


(head 1
 bfileenq=algol connect.no fp.yes message.no
 if ok.yes warning.no
 (c=message fileenq compiled ok
  fileenq=move bfileenq
  c=lookup fileenq
 )
 if ok.no
  c=message fileenq error in compilation
)

begin message: *** fileenq  version: 1.01 ***;
      comment: ***                        ***;
      message: *** eli, 79.04.01          ***;

comment: program constants;

integer field       treply, tno, tsubno, tsubstate, tsubcause,
                    tsubstatus, tsenderror, treceiveerror;
real array field    tname, tident;
long field          tsubpos;
real                progname;
integer             mes_lgt, ans_lgt, wait_and_get_state_code,
                    get_state_code, release_code, kill_code;

treply:= 2;
tno:= 4;
tname:= 4;
tident:= 16;
tsubno:= 40;
tsubstate:= 42;
tsubpos:= 46;
tsubcause:= 50;
tsubstatus:= 52;

progname:= real <:***fileenq :>;

release_code:= 8;
kill_code:= 10;
wait_and_get_state_code:= 6;
get_state_code:= 4;

mes_lgt:= 9;
ans_lgt:= 26;
begin comment: declaration of workspace;
  integer array       mess(1:mes_lgt), answer(1:ans_lgt);
  real array          entry_name(1:2);
  integer             i, j, state, code, release, kill;
  boolean             wait, details, any_errors;
  real                null;

  comment: initialization;

  release:= kill:= 0;
  any_errors:= wait:= details:= false;
  for i:= 1 step 1 until mes_lgt do mess(i):= -1;
  for i:= 1 step 1 until ans_lgt do answer(i):= -1;
  entry_name(1):= null:= 0.0 shift 48;

  begin comment: scan and check of parameterlist;
    real array    keywordlist(1:5, 1:3), elements(0:1, 1:2),
                  arr(1:2);
    integer array elementtype(0:1);
    integer       text, int, keywordno, param, i, j, p, iparam, oparam;

    procedure error(paramno, text);
    integer         paramno;
    string                   text;
    begin comment: prints an error mess on current output.
                   if paramno=0 only the text is printed.
                   otherwise the text followed by <:param:> is
                   printed and the parameter specified by paramno
                   is printed until a parameter preceeded by <sp>
                   is met.
                   if paramno=0 the program terminates;
      write(out, string progname, text);
      if paramno=0 then 
      begin
        write(out, <:<10>:>);
        goto end_program;
      end;
      write(out, if real text=real <::> then <:param: :>
                                        else <:: :>);
      p:= paramno;
      for j:= system(4,paramno,arr) while j shift(-12)=8 or
                                            p=paramno do
      begin
        i:= 1;
        if j shift (-12)=8 then write(out, <:.:>);
        if j extract 12=4 then write(out, <<d>, arr(1))
                          else write(out, string arr(increase(i)));
        paramno:= paramno+1;
      end;
      write(out, <:<10>:>);
      any_errors:= true;

      goto scan_params;
    end;


    text:= 1;
    int:= 2;

    keywordlist(1,1):= real <:wait:>;
    keywordlist(1,2):= null;
    keywordlist(1,3):= null add text shift 3 add text;

    keywordlist(2,1):= real <:relea:> add 115;
    keywordlist(2,2):= real <:e:>;
    keywordlist(2,3):= null add text shift 3 add text;

    keywordlist(3,1):= real <:detai:> add 108;
    keywordlist(3,2):= real <:s:>;
    keywordlist(3,3):= null add text shift 3 add text;

    keywordlist(4,1):= real <:kill:>;
    keywordlist(4,2):= null;
    keywordlist(4,3):= null add text shift 3 add text;

    keywordlist(5,1):= keywordlist(5,2):= null;
    keywordlist(5,3):= null add (text add int);

    comment: check left side;
    if system(4,1,arr) shift (-12)=6 then
      error(0, <:call:>);

    param:= 1;
scan_params:
    for j:= checkparam(param, keywordno, keywordlist,
                       elements, elementtype, false) while j<>0 do
    begin comment: keywordno holds the keywordnumber;
      if j<0 then error(param, <::>);

      case keywordno of
      begin
         begin <* 1: wait*>
           if elements(1,1)= real <:yes:> then wait:= true else
           if elements(1,1)= real <:no:>  then wait:= false else
           error(param, <::>);
         end;

         begin <* 2: release*>
           if elements(1,1)= real <:yes:> then release:= +1 else
           if elements(1,1)= real <:no:>  then release:= -1 else
           error(param, <::>);
         end;

         begin <* 3: details*>
           if elements(1,1)= real <:yes:> then details:= true else
           if elements(1,1)= real <:no:>  then details:= false else
           error(param, <::>);
         end;

         begin <* 4: kill*>
           if elements(1,1)=real <:yes:> then kill:= +1 else
           if elements(1,1)=real <:no:>  then kill:= -1 else
           error(param,<::>);
         end;

         begin <* 5: identification*>
           if elementtype(0)=int then
             mess.tno:= elements(0,1)
           else
           begin comment: lookup entry name;
             zone z(1,1,stderror);
             integer array tail(1:10);
             integer i,j;

             entry_name(1):= elements(0,1);
             entry_name(2):= elements(0,2);

             i:= 1;
             open(z,0,string entry_name(increase(i)),0);
             j:= monitor(42,z,i,tail);
             if j<>0 then
             begin
               i:= 1;
               write(out, string progname, <:lookup :>,
                          string entry_name(increase(i)));
               if j=3 then 
                 write(out, <: entry does not exist<10>:>) else
               write(out, <:result: :>, j, <:<10>:>);
               any_errors:= true;
               goto end_program;
             end;
             mess.tno:= tail(7);
           end;
         end;

       end case;


      param:= param+j;
    end for while;



    if any_errors then goto end_program;

    comment: end of parameterscan;

  end parameter block;

  comment: send mess to primo;

  code:= if wait then wait_and_get_state_code else get_state_code;
  i:= transfer(code, mess, mes_lgt, answer, ans_lgt);

  comment: check result;

  if i<>0 then
  begin comment: error in communication with primo or in parameters
                 to <transfer>. the latter should not possible
                 could occur;
    any_errors:= true;
    write(out, string progname, <:primo communication error: :>);
    if i>1 and i<7 then
    write(out, case i-1 of (<:rejected:>,
                            <:unintelligible:>,
                            <:malfunction:>,
                            <:primo does not exist:>,
                            <:mess buffer claim exceeded:>),
               <:<10>:>)
    else
    write(out, <:unexpected result: :>, i, <:<10>:>);
  end else
  begin
    i:= answer.treply;
    if i<>0 then 
    begin comment: reply error;
      any_errors:= true;
      write(out, string progname, <:primo reply error: :>);
      if i=2 then
        write(out, <:transport unknown:>)
      else
      if i=3 then
        write(out, <:missing resources:>)

      else
      if i=5 or i=6 then
      begin comment: error in sender/receiver device specification;
        if i=5 then
        begin
          write(out, <:sender :>);
          j:= answer.tsenderror;
        end else
        begin
          write(out, <:receiver :>);
          j:= answer.treceiveerror;
        end;
        if j=1 then write(out, <:entry troubles:>)
        else
        if j=2 then write(out, <:device troubles:>)
        else
        write(out, <:errorcode :>, j);
      end else
      write(out, <:unexpected reply code: :>, i);

      write(out, <:<10>:>);
    end else
    begin comment: state received;
      if details then
      begin comment: print transport name;
        i:= 1;
        write(out, <:transport name: :>,
                   string answer.tname(increase(i)), <:<10>:>);
      end;

      write(out, <:         state: :>);
      state:= answer.tsubstate;
      if state>1 and state<9 then
        write(out, case state-1 of
                   (<:waiting:>,
                    <:executing:>,
                    <:held:>,
                    <:completed:>,
                    <:aborted :>,
                    <:killed by operator:>,
                    <:killed by application:>))
      else
        write(out, state);

      if state=6 then
      begin comment: output abort-cause;
        i:= answer.tsubcause;
        if i=1 or i=2 or i=3 then
          write(out, <:caused by :>, 
                     if i=1 then <:sender:> else 
                     if i=2 then <:receiver:> else <:opearator:>,
                     <: device:>)
        else
          write(out, <:cause=:>, i);
      end;
      write(out, <:<10>:>);
      if details and (state=6) then
      begin comment: output device status;
        boolean first;

        first:= true;
        write(out, <:        status: :>);
        i:= answer.tsubstatus;
        j:= 23;
        while i<>0 do
        begin
          if i<0 then
          begin
            write(out, false add 32, if first then 0 else 16,
                       case j+1 of
                       (<:hard error:>,
                        <:normal answer:>,
                        <:rejected:>,
                        <:unintelligible:>,
                        <:disconnected:>,
                        <:process does not exist:>,
                        <:position error:>,
                        <:word defect:>,
                        <:stopped:>,
                        <:bit 14:>,
                        <:bit 13:>,
                        <:checksum error:>,
                        <:card reject:>,
                        <:read error:>,
                        <:mode error:>,
                        <:writing enabled:>,
                        <:tapemark or attention:>,
                        <:load point:>,
                        <:end document:>,
                        <:block length error:>,
                        <:data overrun:>,
                        <:timer:>,
                        <:parity error:>,
                        <:intervention:>
                       ),
                       <:<10>:>);
            first:= false;
          end;

          i:= i shift 1;
          j:= j-1;
        end while;
      end;

      if details and answer.tsubpos>=0 then
      begin
        write(out,<: char position::>,answer.tsubpos,<:<10>:>);
      end;

      if release>0 or (release=0 and state=5) then
      begin comment: release transport and remove entry;
        if entry_name(1)<>null then
        begin
          zone z(1,1,stderror);
          integer array tail(1:10);
          integer i;

          i:= 1;
          open(z,0,string entry_name(increase(i)),0);
          monitor(48,z,i,tail);
        end;

        transfer(release_code,mess,7,answer,7);
      end;
      if kill>0 then
      begin
        transfer(kill_code,mess,7,answer,7);
      end;
    end state;


  end;

end_program:
    if any_errors then errorbits:= 1 shift 0;
    trapmode:= 1 shift 10;
  end;
end
\f


(savetrans=algol message.no connect.no
  if ok.yes
  (c=message savetrans translated ok
  )
  if ok.no
  (c=message savetrans not ok
  )
)
begin

   <*********************************************************************
   *                                                                    *
   *                                                                    *
   * Savetrans:                                                         *
   *     A utility program which restarts all unfinished transports     *
   *     sent to primo in case of a system break down.                  *
   *                                                                    *
   *                                                                    *
   * Operating procedure:                                               *
   *     savespool=move primospool ; do this before primo is started    *
   *     ; now start primo using an s command                           *
   *     savetrans savespool ; restart the transports from the old      *
   *     ; primospool area, possible errors will be printed on current  *
   *     ; output                                                       *
   *                                                                    *
   *                                                                    *
   *********************************************************************>

   message 
          ***************************
          ****                   ****
          **** kc  nov. 13. 1980 ****
          ****     savetrans     ****
          ****                   ****
          ***************************;
\f


   <***************************************************************
   *                                                              *
   * format of a transport description in the spoolarea of primo: *
   *                                                              *
   *       +-----------+                                          *
   *   + 0 !           ! transport name                           *
   *   + 2 !           !                                          *
   *   + 4 !           !                                          *
   *   + 6 !           !                                          *
   *   + 8 !           ! user name                                *
   *   +10 !           !                                          *
   *   +12 !           !                                          *
   *   +14 !           !                                          *
   *   +16 !           ! sender name                              *
   *   +18 !           !                                          *
   *   +20 !           !                                          *
   *   +22 !           !                                          *
   *   +24 !           ! receiver name                            *
   *   +26 !           !                                          *
   *   +28 !           !                                          *
   *   +30 !           !                                          *
   *   +32 !           ! bs area name                             *
   *   +34 !           !                                          *
   *   +36 !           !                                          *
   *   +38 !           !                                          *
   *   +40 !           ! mode shift 12+kind of device             *
   *   +42 !           ! lower cat base of sending process        *
   *   +44 !           ! upper cat base of sending process        *
   *   +46 !           ! bs start position halfword (long)        *
   *   +48 !           !                                          *
   *   +50 !           ! queue group name (e.g. paper)            *
   *   +52 !           !                                          *
   *   +54 !           !                                          *
   *   +56 !           !                                          *
   *   +58 !           ! queue name (e.g. a4upright)              *
   *   +60 !           !                                          *
   *   +62 !           !                                          *
   *   +64 !           !                                          *
   *   +66 !           ! coroutine description address            *
   *   +68 !           ! transport state                          *
   *   +70 !           ! cause (if state is aborted or held)      *
   *   +72 !           ! device status                            *
   *   +74 !           ! character position (long)                *
   *   +76 !           !                                          *
   *   +78 !           ! buffer address of wait and get state     *
   *   +80 !           ! removetime (>8388605 meens waiting)      *
   *       +-----------+                                          *
   *                                                              *
   ***************************************************************>
\f


   zone output,transport(128,1,stderror),catbase(1,1,stderror);
   real array inname,outname(1:2);
   integer array ia(1:20),carr(1:39),rarr(1:11),base(1:2),savedbase(1:2);
   integer i;
   boolean list,outp;

<* transfer description *>

   long array field tname,
                    uname,
                    sname,
                    rname,
                    gname,
                    qname;

<* transport description *>

   long array field tr_name,
                    tr_user,
                    tr_sname,
                    tr_rname,
                    tr_bsname;
   boolean field    tr_mode,
                    tr_kind;
   integer field    tr_baselow,
                    tr_baseup,
                    tr_bsstartptr;
   long array field tr_qgroup,
                    tr_qname;
   integer field    tr_couru,
                    tr_state,
                    tr_cause,
                    tr_status,
                    tr_charposition,
                    tr_waitmess,
                    tr_removetime;
\f


   boolean procedure getrec(z,n);
   value n; zone z; integer n;
   begin
      integer i;

      getrec:=true;
      i:=inrec6(z,0);
      if i>=n then
         inrec6(z,n)
      else
      begin
         inrec6(z,i);
         i:=inrec6(z,0);
         if i>=n then
            inrec6(z,n)
         else
            getrec:=false
      end
   end;


   procedure error(s,i,a);
   value i;
   string s; integer i; array a;
   begin
      integer sep,kind;
      write(out,<:***savetrans :>,s);
      if i<>0 then
      begin
         write(out,<:: :>);
         sep:=i shift (-13)-1;
         kind:=i extract 12;
         outchar(out,case sep of (32, 61, 46));
         i:=1;
         if kind=10 then write(out,string a(increase(i)))
                    else write(out,<<d>,entier a(1))
      end;
      write(out,<:<10>:>);
      outp:=false;
      goto stop
   end;
\f


   procedure initfields;
   begin

   <* transfer description *>

      tname:=4;
      uname:=16;
      sname:=40;
      rname:=50;
      gname:=60;
      qname:=68;

   <* transport description *>

      tr_name:=0;
      tr_user:=8;
      tr_sname:=16;
      tr_rname:=24;
      tr_bsname:=32;
      tr_mode:=41;
      tr_kind:=42;
      tr_baselow:=44;
      tr_baseup:=46;
      tr_bsstartptr:=50;
      tr_qgroup:=50;
      tr_qname:=58;
      tr_couru:=68;
      tr_state:=70;
      tr_cause:=72;
      tr_status:=74;
      tr_charposition:=78;
      tr_waitmess:=80;
      tr_removetime:=82

   end;
\f


   procedure connect_output;
   begin
      integer array bases(1:8),ia(1:17);
      integer i;

      open(output,4,outname,0);

      system(11)bases:(0,bases);
      i:=monitor(76)lookup head and tail:(output,0,ia);

      if i=0 then
      begin
         if extend ia(2)<extend bases(7) or
            extend ia(3)>extend bases(8) then i:=1
      end;

      if i<>0 then
      begin
         ia(1):=ia(2):=1;
         for i:=3 step 1 until 10 do ia(i):=0;
         ia(6):=systime(7)short clock:(0,0.0);
         if monitor(40)create entry:(output,0,ia)<>0 then
            error(<:create output area not possible:>,
                  4 shift 12 add 10,outname)
      end
      else
      begin
         monitor(42)lookup entry:(output,0,ia);
         ia(6):=systime(7)short clock:(0,0.0);
         monitor(44)change entry:(output,0,ia)
      end;

      if monitor(52)create area process:(output,0,ia)<>0 then
         error(<:connect output not possible:>,
               4 shift 12 add 10,outname)
   end;
\f


   procedure write_transport(z);
   zone z;
   begin
      long l1,l2;

      l1:=extend 0 add transport.tr_baselow;
      l2:=extend 0 add transport.tr_baseup;

      write(z,<:<10>base abs:>,<<_d>,l1,l2,<: ;:>,
                <<_-d>,l1 extract 24,l2 extract 24);

      write(z,<:<10>filexfer :>,transport.tr_sname,
                <: :>,transport.tr_rname);

      if transport.tr_user(1)<>0 then
         write(z,<: user.:>,transport.tr_user);

      if transport.tr_name(1)<>0 then
         write(z,<: name.:>,transport.tr_name);

      if transport.tr_qgroup(1)<>0 then
         write(z,<: queue.:>,transport.tr_qgroup,
                   <:.:>,transport.tr_qname);

      write(z,<:<10>:>)

   end;
\f


   procedure show_error(z,i);
   value i; zone z; integer i;
   begin
      write(z,<:***savetrans :>,case i of(
            if rarr(1)=3 then <:missing resources in primo:>
            else if rarr(1)=5 then <:sender troubles:>
                              else <:receiver troubles:>,
            <:rejected:>,
            <:unintelligible:>,
            <:primo malfunction:>,
            <:primo does not exist:>,
            <:buffer claim exceeded:>,
            <:illegal action ???:>,
            <:illegal cleng or rleng ???:>,
            <:criterion type illegal:>,
            <:set catalog base, illegal bases:>),
            <:<10>:>);

      if i>=2 and i<=8 then
      begin
         write(z,<:***savetrans fatal error<10>:>);
         goto stop
      end

   end;
\f


   procedure start_transport(z);
   zone z;
   begin

      for i:=7, 8, 13 step 1 until 20, 25, 30, 39 do
         carr(i):=-1;

      for i:=1, 2 do
      begin
         carr.tname(i):=transport.tr_name(i);
         carr.uname(i):=transport.tr_user(i);
         carr.sname(i):=transport.tr_sname(i);
         carr.rname(i):=transport.tr_rname(i);
         carr.gname(i):=transport.tr_qgroup(i);
         carr.qname(i):=transport.tr_qname(i)
      end;

      if transport.tr_qgroup(1)<>0 then
         carr(30):=0;

      base(1):=transport.tr_baselow;
      base(2):=transport.tr_baseup;
      i:=monitor(72)set catalog base:(catbase,0,base);
      if i<>0 then i:=10;
      if i=0 then i:=transfer(2)define transport:(carr,39,rarr,11);
      if i=0 and rarr(1)<>0 then i:=1;

      if i<>0 then
      begin
         if -, list then write_transport(z);
         show_error(z,i)
      end
      else
      begin
         for i:=3 step 1 until 7 do rarr(i):=-1;
         transfer(8)release transport:(rarr,7,carr,16)
      end

   end; <* start transport *>
\f


   procedure read_params;
   begin
      real array param(1:2);
      integer i,j;

      list:=false;
      j:=1;
      i:=system(4,1,param);
      if i shift (-12)=6 then <* left hand side *>
      begin
         j:=2;
         outp:=true;
         system(4,0,param);
         outname(1):=param(1);
         outname(2):=param(2)
      end else
         outp:=false;

      i:=system(4,j,param);
      if i<>4 shift 12 add 10 <* <sp><text> *> then
         error(if i=0 then <:no input file:> else <:param:>,i,param);
      inname(1):=param(1);
      inname(2):=param(2);

      j:=j+1;
      i:=system(4,j,param);
      if i<>0 then
      begin
         if i<>4 shift 12 add 10 <* <sp><text> *> then
            error(<:param:>,i,param);
         if param(1)<>real <:list:> then
            error(<:illegal parameter name:>,i,param);
         i:=system(4,j+1,param);
         if i<>8 shift 12 add 10 <* .<text> *> then
            error(<:param:>,i,param);
         list:=param(1)=real <:yes:>
      end

   end; <* read params *>
\f


   procedure do_it(z);
   zone z;

      while getrec(transport,82) do
         if transport.tr_removetime>8388605 then <* not executed *>
         begin
            if list then write_transport(z);
            start_transport(z)
         end;

   <* begin of main program *>

   init_fields;
   read_params;
   open(catbase,0,<::>,0); <* for set catalog base *>
   close(catbase,true);
   <* save catalog bases of users process *>
   system(11)bases:(0,ia);
   savedbase(1):=ia(1);
   savedbase(2):=ia(2);

   if outp then connect_output;

   open(transport,4,inname,0);
   if monitor(52)create area process:(transport,0,ia)<>0 then
      error(<:connect input not possible:>,4 shift 12 add 10,inname);

   if outp then do_it(output) else do_it(out);

stop:
   if outp then
   begin
      outchar(output,25);
      close(output,false);
      getzone6(output,ia);
      i:=ia(9);
      monitor(42)lookup entry:(output,0,ia);
      ia(1):=i;
      monitor(44)change entry:(output,0,ia)
   end;

   close(transport,true);
   <* restore catalog base of users process *>
   monitor(72)set catalog base:(catbase,0,savedbase);
   trapmode:=-1

end

; end of file

end ; utility end
▶EOF◀