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 - metrics - download

⟦476423c4e⟧ TextFile

    Length: 29184 (0x7200)
    Types: TextFile
    Names: »deletlinktx «

Derivation

└─⟦01e83a425⟧ Bits:30008166 Bånd med SW8010 og SW8500 source code
    └─⟦75ff9bef3⟧ 
        └─⟦this⟧ »deletlinktx « 

TextFile

begin

<* LAN device delete link   declarations first level      page ...  1... *>



  boolean             repeat_param                  ,
                      test                          ;

  integer             item_count                    ,
                      action                        ,
                      sub_action                    ,
                      point_int                     ,
                      point_txt                     ,
                      space_int                     ,
                      space_txt                     ,
                      seplength                     ,
                      old_length                    ,
                      users                         ,
                      modekind                      ,
                      devno                         ,
                      devtype                       ,
                      status                        ,
                      result                        ,
                      links_removed                 ,
                      i                             ,
                      j                             ,
                      k                             ;

  long                reason                        ;

  real    array       outfile                       ,
                      progname                      ,
                      chainname                     ,
                      item                          ,
                      old_item                      ,
                      main                          ,
                      old_main                      ,
                      devname                       ,
                      csp                      (1:2);

  zone                z_ld        (1  , 1, stderror);


\f


<* LAN device delete link   parameter scanning            page ...  2... *>



  procedure display_param_synt (z);
  zone                          z ;
  
  <***********************************************************>
  <*                                                         *>
  <* The procedure displays on the zone z a parameter syn-   *>
  <* tax survey.                                             *>
  <*                                                         *>
  <***********************************************************>

<*write (z,
  <:



                                 (                                      )* 
(             )1                 ( (             )1  ( <s><devname> )*  )  
( <outfile> = )    deletelink    ( ( main.<main> )   (              )   )  
(             )0                 ( (             )0  ( <s><devno>   )1  )  
                                 (                                      )1 


<s>       ::= ('sp'/.)
<main>    ::= name          of     main process,    default : lanmain1
<devname> ::= name          of external process           
<devno>   ::= device number of external process           

    :>, "nl", 2);
*>

  write (z,
  <:



                                 (                                    )* 
(             )1                 ( (           )1  ( <s><devname> )*  )  
( <outfile> = )    deletelink    ( ( l.<lanno> )   (              )   )  
(             )0                 ( (           )0  ( <s><devno>   )1  )  
                                 (                                    )1 


<s>       ::= ('sp'/.)
<lanno>   ::= number        of lan      controller, default : 1
<devname> ::= name          of external process           
<devno>   ::= device number of external process           

    :>, "nl", 2);






\f


<* LAN device delete link   parameter scanning            page ...  3... *>



  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.                       *>
  <* 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.                                             *>
  <*                                                         *>
  <* 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 :                                              *>
  <*           item_no is assigned to the global item_count  *>
  <* and the global boolean repeat_param is set false.       *>
  <*                                                         *>
  <***********************************************************>

  begin

    item_count := item_no;
    repeat_param := false;

  end prepare_param_scan;

\f



<* LAN device delete link   parameter scanning            page ...  4... *>



  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        from fp command stack               *>
  <*                                                         *>
  <* 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, ...).       *>
  <*                                                         *>
  <***********************************************************>

  begin
    own integer old_seplength;
    own real    old_param1, old_param2;

    if repeat_param then 
    begin <*the item id repeated*>
      scan_param    := old_seplength;
      item   (1)    := old_param1   ;
      item   (2)    := old_param2   ;
      repeat_param  := false;
    end else
    begin <*take next item*>
      old_seplength := system (4, increase (item_count), item); 
      old_param1    := item   (1)                             ;
      old_param2    := item   (2)                             ;
      scan_param    := old_seplength                          ;
    end;

  end scan_param;

\f



<* LAN device delete link   parameter scanning            page ... 5... *>



  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           *>
  <*                                                         *>
  <* 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);
    write       (z, "nl", 1);

    errorbits := 2 + errorbits extract 1 ; <*add warning.yes*>

  end param_warning;

\f



<* LAN device delete link   parameter scanning            page ... 6... *>



  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;

    write       (z, "nl", 2);
    write_alarm :=
    write       (z, <:*** :>, prog_name.laf, <:  :>, text, <: : :>);

  end write_alarm;

\f



<* LAN device delete link   parameter scanning            page ... 7... *>



  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;

\f



<* LAN device delete link   parameter scanning            page ... 8... *>


    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, or 10+n*8*>

    write_param :=
    if seplength = 0 then
      write (z, <:<end parameter list>:>)
    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
        write (z, <:":>, item.laf));

  end write_param;

\f



<* LAN device delete link   parameter scanning            page ...  9..*>



  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



<* LAN device delete link   parameter scanning            page ... 10... *>



  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 is enough*>

    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



<* LAN device delete link   parameter scanning            page ... 11... *>



  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 terminated 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



<* LAN device delete link   parameter interpretation      page ... 12... *>



  integer                                                     
  procedure unlink__param (seplength, item);                  
  value                    seplength       ;                  
  integer                  seplength       ;                  
  array                               item ;                  
                                                              
  <*********************************************************>  
  <*                                                       *>  
  <* The procedure returns the kind of the item given,     *>  
  <*    using one look ahead.                              *>  
  <*                                                       *>  
  <* Call :   unlink__param (seplength, item);             *>  
  <*                                                       *>  
  <* unlink__param   (return value, integer). The kind of  *>  
  <*                 the item :                            *>  
  <*                 0  end parameter list                 *>  
  <*                 1  <s>l.<integer>                     *>  
  <*                 2  <s><name>                          *>  
  <*                 3  <s><integer>                       *>  
  <*                 4  <s><unknown> or .<unknown>         *>
  <* 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



<*make link       parameter interpretation      page ... 13... *>




  begin                                                    
    integer             i, j, 
                        space_txt, point_txt, space_int, point_int,
                        next_seplength;

    real    array       next_item (1:2);

    space_txt := 4 shift 12 + 10;                          
    point_txt := 8 shift 12 + 10;                          
    space_int := 4 shift 12 +  4;
    point_int := 8 shift 12 +  4;
             
    next_seplength := scan_param (next_item);
    repeat_param := true;

    if      sep_length            = space_txt        and   
            item (1)              = real <:l:>       and
       next_sep_length            = point_int       then
      j := 1                                               
    else                                                   
    if     (seplength            >= space_txt        and   
            seplength            <  point_int)
    or      seplength            >= point_txt       then
      j := 2                                               
    else                                                   
    if      seplength             = space_int              
    or      seplength             = point_int       then
      j := 3
    else
    if      seplength shift (-12) > 2               then
      j := 4
    else
      j := 0;                                              
                                                           
                                                           
    unlink__param := j;                                    
                                                           
    if test then
      write (out,
      "nl", 1, "*", 3, <: unlink_param = :>, case (j + 1) of (
      <:<end param list>:>, <:<s>l.<integer>:>, <:<s><name>:>, 
      <:<s><integer>:>, <:< >unknown:>),
      "nl", 1);

end unlink_param;                                          


\f



<* LAN device delete link    program head                   page ... 14... *>



  outfile (1) := chain_name (1) := real <::>; <*no outfile, no 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



<* LAN device delete link    program head                   page ... 15... *>


  point_int := 8 shift 12 + 4; point_txt := 8 shift 12 + 10;
  space_int := 4 shift 12 + 4; space_txt := 4 shift 12 + 10;

  trapmode := 1 shift 10; <*no end <segs>*>

  replacechar (8, 0); <*changes last character in write to array to null*>

  links_removed := devtype := 0;

  movestring (old_main, 1, <::>        );
  movestring (    main, 1, <:lanmain1:>); <*default*>

  open       (zld, 0, main, 0);

  test := false;
  seplength := scan_param  (item);

  if seplength = space_txt and
     item  (1) = real <:test:> then
  begin
    test := true;
    seplength := scan_param (item);
  end;

\f



<* LAN device delete link    program                        page ... 16... *>


  for action := unlink_param (seplength, item) while action > 0 do
  begin <*l.<lanno>, <s>name, or <s>integer*>

    case action of
    begin

      begin <*lanno*>
        devtype    := 0; <*a new device expected*>

        seplength  := scan_param (item);

        if seplength <> point_int then
          param_warning (out, <: l.<lanno>:>)
        else
        begin
          write (main, <:lanmain:>, <<d>, round item (1));
          main  (2) := main (2) shift (-8) shift 8;
          close  (zld , true);
          open   (zld , 0, main, 0);
        end;

        seplength  := scan_param (item);
      end <*l.<lanno>*>;

      begin <*<s>name*>
        devtype     := 1; <*device read*>
        tofrom        (devname, item, 8);
        devname (2) := devname (2) shift (-8) shift 8; <*at most 11 chars*>
        devno       := 0;

        seplength := scanparam (item);
      end <*<s><name>*>;

      begin <*<s><integer>*>
        devtype     := 2; <*device read*>
        devno       := item (1) ;
        devname (1) := devname (2) := real <::>;

        seplength   := scanparam (item);
      end <*<s><integer>*>;

      begin <*unknown parameter*>
        devtype      := 0; <*device not read*>

        param_warning (out, <: unknown parameter :>);

        seplength := scanparam (item);
      end;

    end <*case action*>;

\f



<* LAN device delete link    program                        page ... 17... *>


    <*lan device unlink*>

    if devtype > 0 then  
    begin <*device accepted*>

      if old_main (1) <> main (1) 
      or old_main (2) <> main (2) then
        write (out,                   
        "nl", 2, <:main : :>, main, <:  : :>,
        "nl", 1);                                     
                                                      
      tofrom (old_main, main, 8);                     
                                                      
      if ld_unlink (zld, devno, devname, reason) then 
      begin <*unlinked*>                              
        links_removed := links_removed + 1;           
                                                      
        write (out, <<ddd>,                           
          "nl", 1, <:link     removed : :>,           
          true, 12, devname, <: dev. no : :>, devno);  
                                                      
      end <*unlinked*>                                
\f



<* LAN device delete link    program                        page ... 18... *>


      else                                                            
      begin <*not unlinked*>                                            
        errorbits := errorbits shift  (-1) shift 1 + 1; <*add alarm*>
        result    := reason    shift (-24) extract 12 ;                                 
                                                                      
        write (out,                                                
          "nl", 1, <:link not removed : :>,                        
          true, 12, devname, <: dev. no : :>);                      
                                                                   
        if devno <= 0 then                                             
          write (out, <: - :>)                                        
        else                                                          
          write (out, <<ddd>, devno);                                 
                                                                      
        write (out, <<ddd>, "sp", 3, "*", 1);

        write (out, case result of (                            
        <: result 1:>,
        <: could not be reserved:>,                                   
        <: does not identify a link:>,                                
        <: malfunction:>,                                             
        <: does not exist:>));                                        
                                                                   
      end <*not unlinked*>;                                             
    end <*device accepted*>;                                       
                                                                   
  end <*case action*>;                                                 

\f



<* LAN device delete link    program                        page ... 19... *>


  if item_count <= 
    (if chain_name (1) = real <::> then 
       (if not test then 3 else 4)
     else 
       (if not test then 4 else 5))                         then
    display_param_synt (out)
  else
    write (out,
    "nl", 2, <:links    removed : :>, links_removed,
    "nl", 1);

  close (zld, true);

  if chain_name (1) <> real <::> then
    unstack_current_output;

end;
▶EOF◀