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