!***********************************************************************
!* IMP80 March 1982
!*
!* REROUTE (version 4) - reroute output from a batch job
!* P. W. Riley. (C) U.K.C 1980
!*
!***********************************************************************
!*
recordformat rf(integer conad,filetype,datastart,dataend)
recordformat fdf(integer link,dsnum,byteinteger status,accessroute,c
valid action,cur state,byteinteger mode of use,c
mode,file org,dev code,byteinteger rec type,flags,c
lm,rm,integer asvar,arec,recsize,minrec,maxrec,c
maxsize,lastrec,conad,currec,cur,end,transfers,c
darecnum,cursize,datastart,string (31) iden)
recordformat frf(integer conad, filetype, datastart, dataend, c
size, rup, eep, mode, users, arch, string (6) tran, c
string (8) date, time, integer count, spare1, spare2)
!*
systemroutinespec disconnect(string (31) file,integername flag)
systemroutinespec rename(string (31) file,newfile,integername flag)
systemroutinespec newgen(string (31) file,newfile,integername flag)
systemroutinespec connect(string (31) file,integer mode,hole,c
prot,record (rf)name r,integername flag)
systemroutinespec setuse(string (31) file,integer mode,value)
systemroutinespec finfo(string (31) file, integer mode, c
record (frf)name fr, integername flag)
systemintegerfnspec fdmap(integer chan)
systemintegerfnspec devcode(string (16) device)
systemstringfnspec failuremessage(integer mess)
systemroutinespec setfname(string (40) name)
externalroutinespec set return code(integer i)
externalintegerfnspec uinfi(integer entry)
externalstringfnspec uinfs(integer entry)
externalintegerfnspec dmessage2(string (6) user, integername len, c
integer act, invoc, fsys, adr)
externalroutinespec dstop(integer reason)
externalintegerfnspec dfstatus(string (6) user,string (11) file, c
integer fsys, act, val )
!*
routine abort(string (255) m)
integer s,l
m = "Batch job reroute fails:
".m
s = addr(m)+1
l = length(m)
s = dmessage2(uinfs(1),l,1,0,uinfi(1),s)
dstop(100)
end
routine fail(string (255) s)
printstring("REROUTE fails - ")
printstring(s);newline
setreturncode( 213 )
stop
end
routine change name(record (fdf)name fd, string (31) newname)
integer flag, mode
record (rf) rr
record (frf) fr
!*
finfo(newname, 0, fr, flag)
if flag = 0 start
if fr_arch # 0 start ; ! file is cherished or archive pending
flag = 219; setfname( newname )
finish
finish
if 0 # flag # 218 then fail(failuremessage(flag))
mode = flag
rr_conad = fd_conad
setuse(fd_iden,0,0); ! clear use count
disconnect(fd_iden,flag)
if flag # 0 then abort("DISCONNECT: ".failuremessage(flag))
if mode = 218 start
rename(fd_iden,newname,flag)
if flag # 0 then abort("RENAME: ".failuremessage(flag))
finish else start
newgen(fd_iden,newname,flag)
if flag # 0 then abort("NEWGEN: ".failuremessage(flag))
finish
connect(newname, 3, fd_maxsize, x'40', rr, flag)
if flag # 0 then abort("CONNECT: ".failuremessage(flag))
fd_iden = newname
fd_devcode = 0
setuse(newname,0,1); ! mark as used
end
externalroutine reroute(string (255) s)
integer flag,devno
record (fdf)name fd
record (fdf)name nfd
!*
if uinfi(2) # 2 then fail("Not running in batch")
fd == record(fdmap(91)); ! get primary output stream
if fd_accessroute = 10 start ; ! was to .NULL
flag = dfstatus(uinfs(1),fd_iden,uinfi(1),5,1); ! make permanent
fd_accessroute = 8; ! a file/device
finish
if length(s) > 0 and charno(s,1) = '.' start ; ! reroute to a device
if s = ".NULL" start ; ! set accessroute = 10, make temporary
flag = dfstatus(uinfs(1),fd_iden,uinfi(1),5,0)
fd_accessroute = 10
fd_devcode = 0
finish else if s = ".LP" start
! nasty - cant just set as with other printers
nfd == record(fdmap(90))
s = nfd_iden
s = "JO#".substring(s,8,length(s))
change name(fd,s)
finish else start
devno = devcode( s ); ! convert to a device code number
if devno <= 0 then fail("Invalid device code: ".s)
fd_devcode = devno
finish
finish else start
!* must be reroute to a file, "" means "JB#nnnnnn"
if s = "" start
nfd == record(fdmap(90))
s = nfd_iden
s = "JB#".substring(s,8,length(s))
finish
change name(fd,s)
finish
end
endoffile