system/multiuser/1.7.5/src/canal

Raw file
Back to index

(* ------------------- VERSION 6     20.05.86 ------------------- *)
PACKET canal DEFINES                           (* Autor: J.Liedtke *)
 
    analyze supervisor command :
 
 

LET command list =
 
"begin:1.12end:3.0break:4.0continue:5.01halt:7.0
taskinfo:8.0storageinfo:9.0help:10.0 ",

    supervisor command text =

""6""20""1"ESC ?  -->     help
"6""21""1"ESC b  -->     begin ("""")
"6""22""1"ESC c  -->     continue ("""")
"6""23""1"ESC q  -->     break
"6""21""50"ESC h  -->     halt
"6""22""50"ESC s  -->     storage info
"6""23""50"ESC t  -->     task info
"6""8""6"gib supervisor kommando :" ,

     text type = 4 ,
     ack                 = 0 ,
     error nak           = 2 ,
     begin code          = 4 ,
     end code            = 5 ,
     break code          = 6 ,
     halt code           = 8 ,
     password code       = 9 ,
     continue code       = 100 ,

     home      = ""1"" ;

 
TASK VAR sv ;

DATASPACE VAR ds ;

BOUND STRUCT (TEXT tname, tpass, TASK task, PROCA start proc) VAR sv msg ;
BOUND TEXT VAR error msg ;

INT VAR command index , number of params , reply ;
TEXT VAR param 1, param 2 , task password ;
 

  lernsequenz auf taste legen ("b", ""1""8""1""12"begin ("""")"8""8""11"") ;
  lernsequenz auf taste legen ("c", ""1""8""1""12"continue ("""")"8""8""11"") ;
  lernsequenz auf taste legen ("q", ""1""8""1""12"break"13"") ;
  lernsequenz auf taste legen ("h", ""1""8""1""12"halt"13"") ;
  lernsequenz auf taste legen ("s", ""1""8""1""12"storage info"13"") ;
  lernsequenz auf taste legen ("t", ""1""8""1""12"task info"13"") ;
  lernsequenz auf taste legen ("?", ""1""8""1""12"help"13"") ;

PROC analyze supervisor command :
 
  disable stop ;
  sv := supervisor ;
  ds := nilspace ;
  REP
    command dialogue (TRUE) ;
    command pre ;
    cry if not enough storage ;
    get command (supervisor command text) ;
    analyze command (command list, text type,
                     command index, number of params,
                     param1, param2) ;
    execute command ;
  PER .

command pre :
  IF NOT is error
    THEN wait for terminal; eumel must advertise
    ELSE forget (ds) ; ds := nilspace
  FI .

wait for terminal :
  out (home) .

cry if not enough storage :
  INT VAR size, used ;
  storage (size, used) ;
  IF used > size
    THEN out (""7"Speicher Engpass!"13""10"") ;
  FI .

ENDPROC analyze supervisor command ;

PROC execute command :

  enable stop ;
  SELECT command index OF
    CASE  1 : begin ("PUBLIC")
    CASE  2 : begin (param2)
    CASE  3 : end via canal
    CASE  4 : break
    CASE  5 : quiet
    CASE  6 : continue (param1)
    CASE  7 : halt
    CASE  8 : task info (0); eumel must advertise; quiet
    CASE  9 : storage info; quiet
    CASE 10 : help; eumel must advertise; quiet
    OTHERWISE analyze command error
  ENDSELECT ;
  IF reply = error nak
    THEN error msg := ds ;
         errorstop (CONCR (error msg))
  FI .
 
end via canal :
  IF yes ("Task """ + name (task (channel (myself))) + """ loeschen")
    THEN eumel must advertise ;
         call (sv, end code, ds, reply)
  FI .

break :
  eumel must advertise ;
  call (sv, break code, ds, reply) .

halt :
  call (sv, halt code, ds, reply) .

quiet :
  call (sv, ack, ds, reply) .

analyze command error :
  command error ;
  IF command index = 0
    THEN errorstop ("kein supervisor kommando")
  ELIF number of params = 0
    THEN errorstop ("Taskname fehlt")
    ELSE errorstop ("Parameter ueberfluessig")
  FI .

ENDPROC  execute command ;
 
PROC begin (TEXT CONST father name) :

  IF param1 = "-"
    THEN errorstop ("Name ungueltig")
  FI ;
  sv msg := ds ;
  CONCR (sv msg).tname := param1 ;
  CONCR (sv msg).tpass := "" ;
  call (task (father name), begin code, ds, reply) ;
  IF reply = password code
    THEN get password ;
         sv msg := ds ;
         CONCR (sv msg).tpass := task password ;
         call (task (father name), begin code, ds, reply) 
  FI ;
  IF reply = ack
    THEN continue (param1)
  FI .

get password :
  put ("      Passwort:") ;
  get secret line (task password) .
 
ENDPROC begin ;

PROC continue (TEXT CONST task name) :

  sv msg := ds ;
  CONCR (sv msg).tname := task name ;
  CONCR (sv msg).tpass := "" ;
  call (sv, continue code + channel, ds, reply) ;
  IF reply = password code
    THEN get password ;
         sv msg := ds ;
         CONCR (sv msg).tpass := task password ;
         call (sv, continue code + channel, ds, reply)
  FI .

get password :
  put ("      Passwort:") ;
  get secret line (task password) .

ENDPROC continue ;

PROC help: 

  LET page       = ""1""4"" 
     ,bell       = ""7"" 
     ,cr         = ""13""
     ,end mark   = ""14""
     ,begin mark = ""15""
     ,esc        = ""27"" 
     ;

  REP
    out (page) ;
    show page ;
  UNTIL is quit command PER .

  show page : 
    putline(begin mark + (31 * ".") + " supervisor help " + (31 * ".") + end mark) ;
    putline("Hier finden Sie einige Kommandos, die Ihnen den Einstieg ins System er -") ;
    putline("leichtern sollen:") ;
    out(""6""05""07"1. Informations-Kommandos") ;
    out(""6""07""11"storage info        physisch belegten Hintergrundplatz melden") ;
    out(""6""08""11"task info           Taskbaum zeigen") ;
    out(""6""14""07"2. Verbindung zum Supervisor") ;
    out(""6""16""11"break               Task vom Terminal abkoppeln") ;
    out(""6""17""11"begin(""task"")       neue Task `task` einrichten") ;
    out(""6""18""11"continue(""task"")    Task `task` an ein Terminal ankoppeln") ;
    out(""6""21""01"Näheres:     Benutzerhandbuch, Teil 2, Kap. 2") ;
    out(""6""23""05"Wenn Sie den Hilfe-Modus beenden wollen, tippen Sie die Taste `q`.   ") ;
    out(cr) .

  is quit command :
    TEXT VAR char ;
    get char (char) ;
    IF char = esc 
      THEN get char (char)
    FI;
    IF char = "q" COR char = "Q"
      THEN true 
      ELSE out (bell); 
           FALSE
    FI.

END PROC help ;

ENDPACKET canal ;