!***********************************************************************
!*
!*                Program to read and clear HELP logfile
!*
!*             R.D. Eager   University of Kent   MCMLXXXII
!*
!***********************************************************************
!
!
!***********************************************************************
!*
!*          Constants
!*
!***********************************************************************
!
constantinteger  monsize = 16*1024;     ! Size of log file
constantinteger  sscharfiletype = 3;    ! Subsystem file type
constantinteger  ssdatafiletype = 4;    ! Subsystem file type
constantinteger  outchan = 80;          ! Channel number for temporary output
constantstring (1) snl = "
"
constantstring (10) templog = "T#HELPLOG"
constantstring (18) monfile = "SUBSYS.HELPMON"
constantstring (11) cumlog = "ALLHELPLOGS"
                                        ! Cumulative log
!
!
!***********************************************************************
!*
!*          Record formats
!*
!***********************************************************************
!
recordformat  fdf(integer  link,dsnum,byteinteger  status,accessroute,
                  valid action,cur state,byteinteger  mode of use,
                  mode,file org,dev code,byteinteger  rec type,flags,
                  lm,rm,integer  asvar,arec,recsize,minrec,maxrec,
                  maxsize,lastrec,conad,currec,cur,end,transfers,
                  darecnum,cursize,datastart,string (31) iden)
recordformat  hf(integer  dataend,datastart,filesize,filetype,
                 sum,datetime,format,records,count,info)
recordformat  mf(integer  pdt,references,string (6) user,
                 string (20) call)
recordformat  rf(integer  conad,filetype,datastart,dataend)
!
!
!***********************************************************************
!*
!*          Subsystem references
!*
!***********************************************************************
!
systemroutinespec  connect(string (31) file,integer  mode,hole,
                           prot,record (rf)name  r,integername  flag)
systemroutinespec  define(integer  chan,string (31) iden,
                          integername  afd,flag)
systemroutinespec  destroy(string (31) file,integername  flag)
systemroutinespec  disconnect(string (31) file,integername  flag)
systemstringfunctionspec  failuremessage(integer  mess)
externalintegerfunctionspec  instream
systemintegerfunctionspec  iocp(integer  ep,parm)
systemintegermapspec  mapssfd(integer  dsnum)
systemroutinespec  outfile(string (31) file,integer  size,hole,
                           prot,integername  conad,flag)
externalintegerfunctionspec  outstream
systemroutinespec  permit(string (31) file,string (6) user,
                          integer  mode,integername  flag)
externalroutinespec  prompt(string (255) s)
systemroutinespec  setfname(string (63) s)
externalroutinespec  set return code(integer  i)
systemintegerfunctionspec  sizeof(name  x)
systemroutinespec  uctranslate(integer  ad,len)
systemstring (8)functionspec  unpackdate(integer  p)
systemstring (8)functionspec  unpacktime(integer  p)
!
systemroutinespec  zcopy2(string (255) parms,integer  silent,
                          integername  flag)
!
!
!***********************************************************************
!*
!*          Service routines
!*
!***********************************************************************
!
routine  clearstream(integer  chan)
! Clears  out  a  channel  definition, but does not give an error if the
! channel was not defined.
record (fdf)name  f
!
if  mapssfd(chan) # 0 then  start 
   f == record(mapssfd(chan))
   if  f_status = 0 then  start 
      mapssfd(chan) = 0
      f_dsnum = 0;                      ! Mark descriptor as free
   finish 
finish 
end ;   ! of clearstream
!
!
routine  closestream(integer  chan)
! Private version of 'closestream'.  Does  not  give  an  error  if  the
! operation fails.
integer  flag
!
return  unless  instream # chan # outstream
flag = iocp(16,chan)
end ;   ! of closestream
!
!
routine  readline(stringname  s)
integer  c
!
s = ""
cycle 
   readsymbol(c)
   exit  if  c = nl
   s <- s.tostring(c)
repeat 
uctranslate(addr(s)+1,length(s))
end ;   ! of readline
!
!
!***********************************************************************
!*
!*          H E L P L O G
!*
!***********************************************************************
!
externalroutine  helplog(string (255) s)
integer  act,conad,flag,afd,i,ad
record (rf) rr
record (hf)name  r
record (mf)name  m
!
set return code(1000)
printstring("Actions are Create,Gather,Quit".snl)
prompt("Action: ")
-> instant if  s # ""
!
cycle 
   readline(s)
   !
instant:
   continue  unless  length(s) # 0
   act = charno(s,1)
   if  act = 'Q' then  exit  else  c 
   if  act = 'C' then  start 
      outfile(cumlog,4096,0,0,conad,flag)
      -> err if  flag # 0
      r == record(conad)
      r_filetype = sscharfiletype
      disconnect(cumlog,flag)
      -> err if  flag # 0
      outfile(monfile,monsize,0,0,conad,flag)
      -> err if  flag # 0
      r == record(conad)
      r_dataend = r_filesize
      r_filetype = ssdatafiletype
      r_format = 3;                     ! Un-structured
      r_count = 0;                      ! Count of records
      disconnect(monfile,flag)
      -> err if  flag # 0
      permit(monfile,"",3,flag)
      -> err if  flag # 0
   finish  else  c 
   if  act = 'G' then  start 
      connect(monfile,3,0,0,rr,flag)
      -> err if  flag # 0
      r == record(rr_conad)
      if  r_filetype # ssdatafiletype or  r_format # 3 then  start 
         setfname(monfile)
         flag = 267;                    ! Invalid filetype
         -> err
      finish 
      define(outchan,templog,afd,flag)
      -> err if  flag # 0
      selectoutput(outchan)
      ad = addr(r_info)
      for  i = 1,1,r_count cycle 
         m == record(ad+(i-1)*sizeof(m))
         printstring("DT: ".unpackdate(m_pdt)." ".unpacktime(m_pdt))
         printstring(" ".m_user)
         write(m_references,3)
         printstring(" :  ".m_call.snl)
      repeat 
      selectoutput(0)
      closestream(outchan)
      clearstream(outchan)
      r_count = 0
      disconnect(monfile,flag)
      -> err if  flag # 0
      zcopy2(templog.",".cumlog."-MOD",1,flag)
      -> err if  flag # 0
      destroy(templog,flag)
   finish  else  c 
   printstring("?".snl)
   continue 
   !
err:
   printstring("Error -".failuremessage(flag))
repeat 
!
set return code(0)
end ;   ! of helplog
endoffile