36 lines
1.5 KiB
Plaintext
36 lines
1.5 KiB
Plaintext
code CrLf=9, Text=12;
|
|
string 0; \use zero-terminated strings
|
|
|
|
func Soundex(S1); \Convert name to Soundex string (e.g: Rubin = R150)
|
|
char S1;
|
|
char S2(80), Tbl;
|
|
int I, J, Char, Dig, Dig0;
|
|
[ \abcdefghijklmnopqrstuvwxyz
|
|
Tbl:= "01230120022455012623010202";
|
|
I:= 0; J:= 0; \convert all letters to digits
|
|
repeat Char:= S1(I); I:= I+1;
|
|
if Char>=^A & Char<=^Z then \convert letter to lowercase
|
|
Char:= Char + $20;
|
|
if Char>=^a & Char<=^z & \eliminate non letters
|
|
Char#^h & Char#^w then \eliminate h and w
|
|
[Dig:= Tbl(Char-^a); \convert letter to digit
|
|
if Dig#^0 & Dig#Dig0 ! J=0 then \filter out zeros and doubles
|
|
[S2(J):= Dig; J:= J+1]; \ but always store first digit
|
|
Dig0:= Dig; \save digit to detect doubles
|
|
];
|
|
until S1(I) = 0;
|
|
while J<4 do [S2(J):= ^0; J:= J+1]; \pad with zeros to get 3 digits
|
|
S2(0):= S1(0) & ~$20; S2(4):= 0; \insert first letter & terminate
|
|
return S2; \BEWARE: very temporary string
|
|
];
|
|
|
|
int I, Name;
|
|
[Name:=["Ashcraft", "Ashcroft", "de la Rosa", "Gauss", "Ghosh", "Heilbronn",
|
|
"Hilbert", "Knuth", "Lee", "Lloyd", "Moses", "O'Hara", "Pfister",
|
|
"R2-D2", "Robert", "Rubin", "Rupert", "Tymczak", "Soundex", "Example"];
|
|
for I:= 0 to 20-1 do
|
|
[Text(0, Soundex(Name(I))); Text(0, " ");
|
|
Text(0, Name(I)); CrLf(0);
|
|
];
|
|
]
|