!***********************************************************************
!*
!*                   Command to examine users' files
!*
!*             R.D. Eager   University of Kent   MCMLXXXIII
!*
!***********************************************************************
!
!
!***********************************************************************
!*
!*          Constants
!*
!***********************************************************************
!
constantinteger  no = 0, yes = 1
constantstring (1) snl = "
"
constantstring (10) todefault = "T#SNOOP"
!
!
!***********************************************************************
!*
!*          Subsystem references
!*
!***********************************************************************
!
systemstringfunctionspec  failuremessage(integer  mess)
systemstringfunctionspec  itos(integer  n)
systemintegerfunctionspec  parmap
externalroutinespec  prompt(string (255) s)
systemroutinespec  setpar(string (255) s)
externalroutinespec  set return code(integer  i)
systemstringfunctionspec  spar(integer  n)
systemroutinespec  uctranslate(integer  ad,len)
externalintegerfunctionspec  uinfi(integer  entry)
!
!
!***********************************************************************
!*
!*          Director references
!*
!***********************************************************************
!
externalintegerfunctionspec  dfstatus(string (6) user,string (11) file,
                                      integer  fsys,act,value)
externalintegerfunctionspec  dtransfer(string (6) user1,user2,
                                       string (11) file,newname,
                                       integer  fsys1,fsys2,type)
!
!
!***********************************************************************
!*
!*          Forward references
!*
!***********************************************************************
!
routinespec  readline(stringname  s)
!
!
!***********************************************************************
!*
!*          Service routines
!*
!***********************************************************************
!
routine  getfile(string (7) pr,stringname  file,integer  paramno,
                 string (31) default,string (255) help)
file = spar(paramno)
while  file = "" cycle 
   if  file = "" then  start 
      prompt(pr)
      readline(file)
   finish 
   if  file = "?" then  start 
      printstring(help.snl)
      file = ""
      continue 
   finish 
   if  file = "" and  default # "" then  file = default
repeat 
end ;   ! of getfile
!
!-----------------------------------------------------------------------
!
routine  readline(stringname  s)
integer  c
!
s = ""
cycle 
   readsymbol(c)
   exit  if  c = nl
   s <- s.tostring(c)
repeat 
while  length(s) > 0 and  charno(s,length(s)) = ' ' cycle 
   length(s) = length(s) - 1
repeat 
uctranslate(addr(s)+1,length(s))
end ;   ! of readline
!
!
!***********************************************************************
!*
!*          S N O O P
!*
!***********************************************************************
!
externalroutine  snoop(string (255) parms)
integer  flag,myfsys,tempfile
string (255) from,to
!
setpar(parms)
if  parmap > 3 then  start 
   flag = 263;                          ! Wrong number of parameters
   -> err
finish 
!
if  parmap = 1 and  spar(1) = "?" then  start 
   printstring("Parameters are:  fromfile,tofile".snl)
   flag = 0
else 
   myfsys = uinfi(1)
   getfile("From: ",from,1,"",
           "Give the name of the file you wish to examine")
   getfile("To: ",to,2,todefault,
           "Give the name of the file where the copy is to be placed".snl.c 
           "The default is ".todefault)
   !
   if  length(to) >= 2 and  substring(to,1,2) = "T#" then  start 
      to <- to.itos(uinfi(13))
      tempfile = yes
   finish  else  tempfile = no
   !
   flag = dtransfer("","",from,to,-1,myfsys,3)
                                        ! Make copy
   if  flag = 0 then  start 
      flag = dfstatus("",to,myfsys,5,0) if  tempfile = yes
                                        ! Make temporary
      flag = dfstatus("",to,myfsys,0,0)
                                        ! Hazard
      printstring("OK".snl)
   finish 
   !
   if  flag # 0 then  start 
      flag = flag + 500;                ! Form Subsystem code
      -> err
   finish 
finish 
!
set return code(0)
return 
!
err:
set return code(flag)
printstring(snl."SNOOP fails -".failuremessage(flag))
stop 
end ;   ! of snoop
endoffile