%begin; !LOG
%option "-nocheck-nodiag"

%externalroutinespec readline(%string(*)%name s)
%externalroutinespec login(%string(255)u,p)
%externalroutinespec logout
%externalroutinespec obeycommand(%string(255)s)
%externalroutinespec set terminalmode(%integer x)
%constinteger noecho=1

%string(255)u,p = ""

  %routine fail(%string(255)s)
    printstring(s)
    printstring(" fails: ")
    printstring(event_message)
    newline
  %end

  %routine call logout
    %on 3 %start
      fail("Logout")
      %return
    %finish
    logout
  %end

  %routine call login
    %routine obey(%string(255)s)
      %on 3 %start
        %return
      %finish
      obeycommand(s)
    %end
    %routine alert
      %on 3,9 %start
        closeinput %if event_event=9
        %return
      %finish
      openinput(1,"fmac:alert"); selectinput(1)
      %cycle
        printsymbol(readsymbol)
      %repeat
    %end
    %on 3 %start
      fail("Login")
      %return
    %finish
    login(u,p)
    alert
    obey("@login")
  %end

  %routine disconnect from gandalf
  %option "-low"
  @16_4000c1 %byte s
    %routine wait
    %integer delay=40000
    %integer i
      %for i = 1,1,delay %cycle; %repeat
    %end
    %routine dcd off
      s = 16_55
    %end
    %routine dcd on
      s = 16_95
    %end
    %onevent 0 %start
      fail("Gandalf disconnect")
      %return
    %finish
    wait; dcd off; wait; dcd on
  %end

  %on 9 %start
    cliparam = ""
  %finish

  u = cliparam %unless cliparam -> u.(",").p %or cliparam -> u.(" ").p
  %if u="" %start
    call logout
    disconnect from gandalf
  %else
    set terminalmode(noecho)
    prompt("Pass:") %and readline(p) %if p=""
    call login
  %finish
%end
