summaryrefslogtreecommitdiff
path: root/ipl/procs/soundex.icn
diff options
context:
space:
mode:
Diffstat (limited to 'ipl/procs/soundex.icn')
-rw-r--r--ipl/procs/soundex.icn54
1 files changed, 54 insertions, 0 deletions
diff --git a/ipl/procs/soundex.icn b/ipl/procs/soundex.icn
new file mode 100644
index 0000000..012c7ee
--- /dev/null
+++ b/ipl/procs/soundex.icn
@@ -0,0 +1,54 @@
+############################################################################
+#
+# File: soundex.icn
+#
+# Subject: Procedures to produce Soundex code for name
+#
+# Author: Cheyenne Wills
+#
+# Date: July 14, 1989
+#
+############################################################################
+#
+# This file is in the public domain.
+#
+############################################################################
+#
+# This procedure produces a code for a name that tends to bring together
+# variant spellings. See Donald E. Knuth, The Art of Computer Programming,
+# Vol.3; Searching and Sorting, pp. 391-392.
+#
+############################################################################
+
+procedure soundex(name)
+ local first, c, i
+ name := map(name,string(&lcase),string(&ucase)) # Convert to uppercase..
+ first := name[1]
+
+# Retain the first letter of the name, and convert all
+# occurrences of A,E,H,I,O,U,W,Y in other positions to "."
+#
+# Assign the following numbers to the remaining letters
+# after the first:
+#
+# B,F,P,V => 1 L => 4
+# C,G,J,K,Q,S,X,Z => 2 M,N => 5
+# D,T => 3 R => 6
+
+ name := map(name,"ABCDEFGHIJKLMNOPQRSTUVWXYZ",
+ ".123.12..22455.12623.1.2.2")
+
+# If two or more letters with the same code were adjacent
+# in the original name, omit all but the first
+
+ every c := !"123456" do
+ while i := find(c||c,name) do
+ name[i+:2] := c
+ name[1] := first
+
+# Now delete our place holder ('.')
+
+ while i := upto('.',name) do name[i] := ""
+
+ return left(name,4,"0")
+end