external  routine  soundex command alias  "C#SOUNDEX"
   external  routine  spec  emas3string(string  name  vec, val)
   string  (255) s

   integer  function  start of(string  (255) whole string, first part,
      string  (*) name  rest)
      result  = 0 unless  c 
         0 < length(first part) <= length(whole string) and  c 
         first part = substring(whole string, 1, length(first part))
      whole string -> (first part).rest
      result  = 1
   end ; ! of start of

   string  function  soundex(string  (31) name)
      constant  string  (1) array  stable('A':'Z')= c 
      "",  "1", "2", "3", "",  "1",
      "2", "",  "",  "2", "2", "4",
      "5", "5", "",  "1", "2", "6",
      "2", "3", "",  "1", "",  "2",
      "",  "2"
      string  (31) work, s
      integer  ptr, last, this
      length(name) = length(name) - 1 while  c 
         length(name) > 0 and  (charno(name, length(name)) = '.' or  c 
         charno(name, length(name)) = ' ')
      result  = "" if  name = ""
      cycle 
         if  name -> s.(".").name then  continue 
         if  name -> s.(" ").name then  continue 
         exit 
      repeat 
      if  start of(name, "MAC", name) = 1 or  c 
         start of(name, "MC", name) = 1 start 
         work = "@"
         last = '@'
         ptr = 1
      finish  else  start 
         last = charno(name, 1)
         work = tostring(last)
         ptr = 2
      finish 
      while  ptr <= length(name) cycle 
         this = charno(name, ptr)
         if  'A' <= this <= 'Z' and  this # last start 
            last = this
            work = work.stable(this)
         finish 
         ptr = ptr + 1
      repeat 
      work <- work."0000"
      length(work) = 4
      result  = work
   end ; ! of soundex

   cycle 
      emas3string("String;any,ornull;();". c 
         "The name for which you want to calculate a soundex value", s)
      exit  if  s = ""
      length(s) = 31 if  length(s) > 31
      printstring(soundex(s))
      newline
   repeat 
end ; ! of coundex command

end  of  file