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