!%include "inc:fs.imp"

! A couple of useful utilities for dealing with files. MATCHES & WILDNESS.
! also CURRENT USER, CURRENT DIRECTORY and SET DIRECTORY, HDX to I
! JHB added CURRENT FS 19/1/87

! These may ultimately be installed.  JHB 22/10/84

integerfn  wildness(string (*)name  s)
integer  k,i,w=0
  for  i=1,1,length(s) cycle 
    k = charno(s,i); w = w+1 if  k='*' or  k='%'
  repeat 
  result  = w
end 

predicate  Matches(string  (*) name  s, p)
! S=Subject, P=Pattern. Pattern is the one with the stars in it.
   integer  slen = 0, plen = 0

   predicate  m (integer  spos,ppos)
      integer  psym = 0,ssym = 0

      cycle 
         if  ppos=plen start 
            true  if  spos=slen
            false 
         finish 
         ppos = ppos+1; psym = charno(p,ppos)
         exitif  psym='*'
         falseif  spos=slen
         spos = spos+1; ssym = charno(s,spos)
         psym = ssym if  ssym!32=psym!32 and  'a'<=psym!32<='z'
         unless  ssym=psym start 
            falseunless  psym='%'
         finish 
      repeat 

      cycle 
         trueif  m(spos,ppos)
         exitif  spos=slen
         spos = spos+1; ssym = charno(s,spos)
      repeat 
      false 
   end 

   slen = length(s)
   plen = length(p)
   true  if  m(0,0)
   false 
end 

string  (7) fn  Current Directory
   string  (255) Me
   integer  I = 1

   on  3,9 start ; result  = ""; finish 

   Length (Me) = Fcommr ('F'<<8, "", Charno (Me, 1), 255)
   I = I + 1 while  Charno (Me, I) # ' '
   Length (Me) = I - 1
   result  = Me
end 

routine  set directory(string (63)d)
integer  x
  x = fcomm('J'<<8,d)
end 

string  (7) fn  current fs(integer  how)
  !Returns short or long name of the current filestore or just a hex number
  conststring  (1) array  hex(0:15) = c 
  "0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"
  string  (7) s
  s = hex(rdte>>4).hex(rdte&15)
  if  how = 0 start 
     s = "A" if  rdte = 16_14
     s = "B" if  rdte = 16_15
     s = "C" if  rdte = 16_1B
     s = "D" if  rdte = 16_35
     s = "M" if  rdte = 16_44
     s = "V" if  rdte = 16_72
  elseif  how=1
     s = "Alpha"   if  rdte = 16_14
     s = "Bravo"   if  rdte = 16_15
     s = "Charlie" if  rdte = 16_1B
     s = "Delta"   if  rdte = 16_35
     s = "Met"     if  rdte = 16_44
     s = "Vax"     if  rdte = 16_72
  finish 
  result =s
end 

string  (7) fn  Current User
   string  (255) This Dir, This User
   integer  I

   on  3,9 start ; result  = ""; finish 

   This Dir  = Current Directory
   result  = "" if  this dir = "" or  this dir = "ANON"
   set directory("")
   This User = Current Directory
   set directory(this dir)
   if  this user -> (":").this user start ; finish 
   result  = This User
end 

integerfn  hdx to i(string  (*) name  s, integername  p)
   !Return the value of the "high-density hex" number if any, starting at
   ! charno(p, s), advancing p past any digits actually processed
    integer  n, k
    result  = -1 if  s = "" or  s = "????"
    n = 0
    cycle 
      result  = n if  p > length(s); p = p + 1
      k = charno(s, p-1) - '0'
      result  = n if  k < 0; n = n<<4 + k
    repeat 
end 

endoffile