! SSI

include  "inc:util.imp"
include  "inc:fs.imp"

externalroutine  openstreams(string (255)which,defaults)
string (255)array  d(2:7)
integer  i
  onevent  3,4,9 start 
    selectoutput(0); printstring(event_message); newline
    stop 
  finish 
  d(i) = "" for  i = 2,1,7
  for  i = 1,1,2 cycle 
    defineparam("in1",d(2),0)
    defineparam("in2",d(4),0)
    defineparam("in3",d(6),0)
    defineparam("out1",d(3),pamnewgroup)
    defineparam("out2",d(5),0)
    defineparam("out3",d(7),0)
    processparameters(defaults) if  i=1
    processparameters(which)    if  i=2
  repeat 
  openinput(i,d(2*i)) for  i = 1,1,3
  selectinput(1)
  openoutput(i,d(2*i+1)) for  i = 1,1,3
  selectoutput(1)
end 

externalroutine  delete(string (255)file)
integer  x
  x = fcomm('D'<<8,file)
end 

externalroutine  rename(string (255)old,new)
string (63)s
integer  x
  s = old.",".new
  x = fcomm('B'<<8,s)
end 

externalroutine  copy(string (255)from,to)
string (63)s
integer  x
  s = from.",".to
  x = fcomm('O'<<8,s)
end 

externalroutine  permit(string (255)file,perms)
string (63)s
integer  x
  s = file.",".perms
  x = fcomm('E'<<8,s)
end 

externalroutine  quote(string  (255) pass)   ;!Added by JHB
   string  (63) s
   integer  x
   s = pass
   x = fcomm('Q'<<8,s)
end 

externalstring (255)fn  finfo(string (255)directory,integer  number)
ownstring (255)s
  s = directory.","
  number = number&1023
  s = s.tostring(number>>4+'0')
  s = s.tostring(number&15+'0')
  length(s) = fcommr('F'<<8,s,charno(s,1),255)
  result  = s
end 

externalstring (255)fn  ninfo(string (255)file)
string (255)s
  length(s) = fcommr('N'<<8,file,charno(s,1),255)
  result  = s
end 

recordformat  finfof(string (23)name,string (5)perms,string (9)date,time,
                     integer  blocks,extents)

externalroutine  unpack finfo(string (255)s,record (finfof)name  r)
integer  pos=1
  routine  scan
    pos = pos+1 while  pos<=length(s) and  charno(s,pos)=' '
  end 
  integerfn  d
  integer  n=0,k
    scan
    cycle 
      result  = n if  pos>length(s); pos = pos+1; k = charno(s,pos-1)-'0'
      result  = n if  k<0 or  k>9; n = n*10+k
    repeat 
  end 
  routine  w(string (*)name  t,integer  max)
  integer  k
    scan; t = ""
    cycle 
      returnif  pos>length(s) or  max<=0
      k = charno(s,pos); pos = pos+1; max = max-1
      returnif  k=' '
      t = t.tostring(k)
    repeat 
  end 
  r = 0
  w(r_name,23); w(r_perms,5); w(r_date,9); w(r_time,9)
  r_blocks = d; r_extents = d
end 

externalroutine  getdir(string (255)dir,bytename  a)
bytearray  b(0:1535)
integer  n,p,x
  dir = dir.":" unless  dir=""
  dir = dir."directory"
  x=fcomm('S'<<8,dir)
  p = 1
  cycle 
    n = fcommr('X0'+x,"",b(p),1536-p)
    p = p+n
    while  p>2 and  b(p-2)=' ' cycle 
      p = p-1; b(p-1) = nl
    repeat 
  repeatuntil  n#512
  n = fcomm('K0'+x,"")
  b(0) = nl; b(p) = 0
  while  p#1 cycle 
    n = 0
    cycle 
      p = p-1; n = n+1; b(p) = b(p-1)
    repeatuntil  b(p)=nl
    b(p) = n-1
  repeat 
  n = addr(a); p = 0
  cycle 
    p = p+1; byteinteger(n) = b(p); n = n+1
  repeatuntil  b(p)=0
end 

endoffile