%begin;                            !Autochop
%include "managr:clients.inc"
%include "inc:util.IMP"
%include "inc:fs.IMP"

@16_3fa8 %byteinteger ls,lp,rs,rp

%recordformat f(%integer fs,fp,cs,cp,time)
%constinteger min=1,max=31
%integer pos=min
%record(f)%array slot(min:max)
%record(f)ourselves
%string(127)dummy

%integerfn r time
%integer d,m,y,h,min
  %routine verify(%integer k)
    %signal 3 %unless nextsymbol=k; skipsymbol
  %end
  read(d); verify('/')
  read(m); verify('/')
  read(y); verify(' ')
  read(h); verify('.')
  read(min)
  %result = ((((y-76)*12+m-1)*31+d-1)*24+h)*60+min
%end

%routine p time(%integer time)
%integer d,m,y,h,min
  %integerfn strip(%integer dividend)
  %integer r
    r = rem(time,dividend); time = time//dividend
    %result = r
  %end
  %routine p(%integer n)
    printsymbol('0') %if n<10; write(n,0)
  %end
  min = strip(60)
  h = strip(24)
  d = strip(31)+1
  m = strip(12)+1
  y = time+76
  p(d); printsymbol('/')
  p(m); printsymbol('/')
  p(y); spaces(2)
  p(h); printsymbol('.')
  p(min)
%end

%routine read record(%record(f)%name r)
  r = 0
  r_fs = rs; read(r_fp)
  rhex(r_cs); read(r_cp)
  r_time = rtime; r_time = rtime
%end

%routine write record(%record(f)%name r)
  space; phex2(r_fs); space; write(r_fp, 2); spaces(2)
  phex2(r_cs); space; write(r_cp, 1); space
  ptime(r_time); spaces(2)
  %if r_cs = 16_72 %start
    printstring("On VAX")
  %else %if r_cs > client max
    printstring("Somewhere unknown")
  %else
    printstring(whereabouts(r_cs))
  %finish
  spaces(2)
%end

%routine chop
%byte four=12
  etherwrite(fsport,four,1)
  %cycle
  %repeatuntil ack&1<<fsport#0
%end

%routine alias(%record(f)%name r)
  ethc = 15; twait
  ethc = 7; twait
  ethd = r_cs; twait
  fsport = r_cp
  etheropen(fsport,r_fs<<8+r_fp)
%end

%routine swop(%integer i,j)
%record(f)%name a,b
%record(f)c
  a == slot(i); b == slot(j)
  %returnif a_time<=b_time
  c = a; a = b; b = c
%end

%routine sort(%integer lo,hi)
%integer i,j
  %for i = lo,1,hi-1 %cycle
    swop(i,j) %for j = i+1,1,hi
  %repeat
%end

%routine do pass
%integer sym,i
  %on 9 %start
    closeinput; selectinput(0)
    sort(min,pos-1)
    %for i = min,1,pos-1 %cycle
      write record(slot(i))
      %cycle
        readsymbol(sym)
        sym = sym!32
        printsymbol(sym); newline
        %if sym='e' %or sym = ':' %start                 { ':' = ^Z ! 32 }
          %stop
        %finish
      %repeatuntil sym='y' %or sym='n' %or sym = '*'     { '*' = nl ! 32 }
      %if sym='y' %start
        alias(slot(i)); chop
        alias(ourselves)
      %finish
    %repeat
    %return
  %finish
  %cycle
    %signal 9 %if pos>max
    read record(slot(pos)); pos = pos+1
  %repeat
%end

%on 9 %start
  %stop
%finish

ourselves = 0
ourselves_fs = rs; ourselves_fp = rp
ourselves_cs = ls; ourselves_cp = lp

dummy = cliparam
printstring("'Y' to chop, 'N' or nothing not to, 'E' or ^Z to exit"); newline
printstring("     It is now "); printstring(date."  ".time); newline

set terminal mode(single)
openinput(1,"$:ports"); selectinput(1)
do pass

%endofprogram
