ESPSOUN ;DALISC/CKA - BETTER SOUNDEX ;1/92
 ;;1.0;POLICE & SECURITY;;Mar 31, 1994
 ;extracted from Kernel;;Jul 17, 1992
 ;Extrinsic function, Call with string, Returns converted string.
SOUN(X) ;DFW/MRL - BETTER SOUNDEX ;1/92
1 N D,E,F,I,I1,J,J1,L,S,T,W,X1,Z
2 S (E(1),E)="" F I=1:1:$L(X) S L=$E(X,I) Q:L=","  I L?1A S:$A(L)>95 L=$C($A(L)-32) I L'=E(1) S E(1)=L,E=E_L ;make uppercase---keep only alpha---drop duplicate's
 S E="#"_E D CONV S F=$E(E,1,3) F I=4:2 Q:I>$L(E)  I +$E(E,I-2,I-1)'=+$E(E,I,I+1) S F=F_$E(E,I,I+1)
 Q $E(F_"0000000000000",2,9)
 ;
CONV ;Convert word to numerics (first four sounds)
 S X=$P($T(SH),";;",2),D=0 F I=1:1 S S=$P(X,";",I) Q:S']""!(D)  F J="S","N" S F=S_J,T=31_$S(J="S":24,1:21) D E Q:D
 F F="TIARY","TEARY","TIARE","TEARE" S T=31_$E(F,2,5) D E Q:D
 S X=$P($T(END+1),";;",2) F I=1:1 S J=$P(X,";",I) Q:J']""  S F=$P(J,":",1),T=$P(J,":",2) D E Q:D
 ;F I=1,2 S X(I)=$P($T(VOWEL+I),";;",2)
DOUB ;Double Vowels
 S D=0 F J=1,2 S X=$P($T(VOWEL+J),";;",2) D
 . F I=1:1 S X1=$P(X,";",I) Q:X1']""  I E[$P(X1,":",1) S D=1,F=$P(X1,":",1),T=$P(X1,":",2),E=$P(E,F,1)_T_$P(E,F,2)
 G DOUB:D
 F I="START","CHNG","END1","CHNG1" S W=$E(I) F I1=1:1 S X=$P($T(@I+I1),";;",2) Q:X']""  F J=1:1 S J1=$P(X,";",J) Q:J1']""  S F=$P(J1,":",1),T=$P(J1,":",2) I E[F D @W
 Q
 ;
C ;Change sound to another
 S E=$P(E,F,1)_T_$P(E,F,2,99) G C:E[F Q
 ;
S ;Change 'Starts with' sound to another
 I $E(E,2,$L(F)+1)=F S E=$P(E,F,1)_T_$P(E,F,2)
 Q
E ;Change 'Ends with' sound to another
 S Z=$L(E)-($L(F))+1,Z=$S(Z>1:Z,1:2) I $E(E,Z,$L(E))=F S E=$E(E,1,Z-1)_T,D=1
 Q
 ;
SH ;;TEOU;TIOU;TOU;TIOU;TU;TYOU;SHU;SHI;CHU;CHO;XIOU;XOU;XU;XIU;CIOU;COU;CU;CO;SIOU;CEOU;CE;XEOU;XE;SEOU;SHOU;CHOU;CHE;CHI;SU;TIO
 ;
VOWEL ;
 ;;AE:A;AI:A;AO:O;AU:O;AW:O;AY:A;EA:E;EI:E;EO:O;EU:U;EW:U;EY:I;IA:A;IE:E;IO:I;IU:O;IW:I;IY:I;OA:O;OE:O;OI:O;OU:U;GH:;
 ;;OWE:O;OW:O;OY:O;UA:A;UE:U;UI:I;UO:O;UW:U;UY:I;WA:A;WE:E;WI:I;WO:O;WU:U;WY:I;YA:A;YE:E;YI:I;YO:O:YU:U;AA:A;EE:E;II:I;OO:O;UU:U;YY:I
 ;
END ;
 ;;VOUS:1512;RTIAL:R3118;GUE:16;
 ;
START ;
 ;;MAC:MC;WR:23:GU:16;QU:17;TH:14
 ;
CHNG ;
 ;;PE:22;GU:16;CA:24A;CE:24E;CI:24I;CY:24Y;AL:18;EL:18;IL:18;OL:18;UL:18;WL:18;YL:18;AN:21;EN:21;IN:21;AR:23;AV:15;V:15;BH:13;BT:13;ED:14;ER:23;IM:19;IT:14;IR:23;OR:23;EM:19;YT:14
 ;;OM:19;ON:21;UR:23;US:24;ES:24;UN:21;GN:21;KN:21;LK:14;LM:19;LN:21;CHM:19;TSCH:31;TSH:31;TCH:31;TSCH:31;SCH:31;SH:31;CH:31;DJ:16;MB:19;MN:21;PHN:21;PH:15;PN:21;YR:23;YN:21
 ;;WH:12;YL:18;RH:23
 ;
END1 ;
 ;;CE:24;ZE:24;TE:14;E;;ATES:24;ES:24;IS:24;OS:24;US:24;YS:24;WS:24;EZ:24;Z:24;TI:14;TY:14;CY:2411;CI:2411;TE:14;NTS:N24;21TS:2124;21T24:2124;S:24
CHNG1 ;
 ;;A:11;B:13;C:17;D:14;E:11;F:15;G:16;H:;I:11;J:16;K:17;L:18;M:19;N:21;O:12;P:22;Q:17;R:23;S:24;T:14;U:12;V:15;W:12;X:24;Y:11;Z:24
 
--- Routine Detail   --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HESPSOUN   2776     printed  Sep 23, 2025@20:06:42                                                                                                                                                                                                     Page 2
ESPSOUN   ;DALISC/CKA - BETTER SOUNDEX ;1/92
 +1       ;;1.0;POLICE & SECURITY;;Mar 31, 1994
 +2       ;extracted from Kernel;;Jul 17, 1992
 +3       ;Extrinsic function, Call with string, Returns converted string.
SOUN(X)   ;DFW/MRL - BETTER SOUNDEX ;1/92
1          NEW D,E,F,I,I1,J,J1,L,S,T,W,X1,Z
2         ;make uppercase---keep only alpha---drop duplicate's
           SET (E(1),E)=""
           FOR I=1:1:$LENGTH(X)
               SET L=$EXTRACT(X,I)
               if L=","
                   QUIT 
               IF L?1A
                   if $ASCII(L)>95
                       SET L=$CHAR($ASCII(L)-32)
                   IF L'=E(1)
                       SET E(1)=L
                       SET E=E_L
 +1        SET E="#"_E
           DO CONV
           SET F=$EXTRACT(E,1,3)
           FOR I=4:2
               if I>$LENGTH(E)
                   QUIT 
               IF +$EXTRACT(E,I-2,I-1)'=+$EXTRACT(E,I,I+1)
                   SET F=F_$EXTRACT(E,I,I+1)
 +2        QUIT $EXTRACT(F_"0000000000000",2,9)
 +3       ;
CONV      ;Convert word to numerics (first four sounds)
 +1        SET X=$PIECE($TEXT(SH),";;",2)
           SET D=0
           FOR I=1:1
               SET S=$PIECE(X,";",I)
               if S']""!(D)
                   QUIT 
               FOR J="S","N"
                   SET F=S_J
                   SET T=31_$SELECT(J="S":24,1:21)
                   DO E
                   if D
                       QUIT 
 +2        FOR F="TIARY","TEARY","TIARE","TEARE"
               SET T=31_$EXTRACT(F,2,5)
               DO E
               if D
                   QUIT 
 +3        SET X=$PIECE($TEXT(END+1),";;",2)
           FOR I=1:1
               SET J=$PIECE(X,";",I)
               if J']""
                   QUIT 
               SET F=$PIECE(J,":",1)
               SET T=$PIECE(J,":",2)
               DO E
               if D
                   QUIT 
 +4       ;F I=1,2 S X(I)=$P($T(VOWEL+I),";;",2)
DOUB      ;Double Vowels
 +1        SET D=0
           FOR J=1,2
               SET X=$PIECE($TEXT(VOWEL+J),";;",2)
               Begin DoDot:1
 +2                FOR I=1:1
                       SET X1=$PIECE(X,";",I)
                       if X1']""
                           QUIT 
                       IF E[$PIECE(X1,":",1)
                           SET D=1
                           SET F=$PIECE(X1,":",1)
                           SET T=$PIECE(X1,":",2)
                           SET E=$PIECE(E,F,1)_T_$PIECE(E,F,2)
               End DoDot:1
 +3        if D
               GOTO DOUB
 +4        FOR I="START","CHNG","END1","CHNG1"
               SET W=$EXTRACT(I)
               FOR I1=1:1
                   SET X=$PIECE($TEXT(@I+I1),";;",2)
                   if X']""
                       QUIT 
                   FOR J=1:1
                       SET J1=$PIECE(X,";",J)
                       if J1']""
                           QUIT 
                       SET F=$PIECE(J1,":",1)
                       SET T=$PIECE(J1,":",2)
                       IF E[F
                           DO @W
 +5        QUIT 
 +6       ;
C         ;Change sound to another
 +1        SET E=$PIECE(E,F,1)_T_$PIECE(E,F,2,99)
           if E[F
               GOTO C
           QUIT 
 +2       ;
S         ;Change 'Starts with' sound to another
 +1        IF $EXTRACT(E,2,$LENGTH(F)+1)=F
               SET E=$PIECE(E,F,1)_T_$PIECE(E,F,2)
 +2        QUIT 
E         ;Change 'Ends with' sound to another
 +1        SET Z=$LENGTH(E)-($LENGTH(F))+1
           SET Z=$SELECT(Z>1:Z,1:2)
           IF $EXTRACT(E,Z,$LENGTH(E))=F
               SET E=$EXTRACT(E,1,Z-1)_T
               SET D=1
 +2        QUIT 
 +3       ;
SH        ;;TEOU;TIOU;TOU;TIOU;TU;TYOU;SHU;SHI;CHU;CHO;XIOU;XOU;XU;XIU;CIOU;COU;CU;CO;SIOU;CEOU;CE;XEOU;XE;SEOU;SHOU;CHOU;CHE;CHI;SU;TIO
 +1       ;
VOWEL     ;
 +1       ;;AE:A;AI:A;AO:O;AU:O;AW:O;AY:A;EA:E;EI:E;EO:O;EU:U;EW:U;EY:I;IA:A;IE:E;IO:I;IU:O;IW:I;IY:I;OA:O;OE:O;OI:O;OU:U;GH:;
 +2       ;;OWE:O;OW:O;OY:O;UA:A;UE:U;UI:I;UO:O;UW:U;UY:I;WA:A;WE:E;WI:I;WO:O;WU:U;WY:I;YA:A;YE:E;YI:I;YO:O:YU:U;AA:A;EE:E;II:I;OO:O;UU:U;YY:I
 +3       ;
END       ;
 +1       ;;VOUS:1512;RTIAL:R3118;GUE:16;
 +2       ;
START     ;
 +1       ;;MAC:MC;WR:23:GU:16;QU:17;TH:14
 +2       ;
CHNG      ;
 +1       ;;PE:22;GU:16;CA:24A;CE:24E;CI:24I;CY:24Y;AL:18;EL:18;IL:18;OL:18;UL:18;WL:18;YL:18;AN:21;EN:21;IN:21;AR:23;AV:15;V:15;BH:13;BT:13;ED:14;ER:23;IM:19;IT:14;IR:23;OR:23;EM:19;YT:14
 +2       ;;OM:19;ON:21;UR:23;US:24;ES:24;UN:21;GN:21;KN:21;LK:14;LM:19;LN:21;CHM:19;TSCH:31;TSH:31;TCH:31;TSCH:31;SCH:31;SH:31;CH:31;DJ:16;MB:19;MN:21;PHN:21;PH:15;PN:21;YR:23;YN:21
 +3       ;;WH:12;YL:18;RH:23
 +4       ;
END1      ;
 +1       ;;CE:24;ZE:24;TE:14;E;;ATES:24;ES:24;IS:24;OS:24;US:24;YS:24;WS:24;EZ:24;Z:24;TI:14;TY:14;CY:2411;CI:2411;TE:14;NTS:N24;21TS:2124;21T24:2124;S:24
CHNG1     ;
 +1       ;;A:11;B:13;C:17;D:14;E:11;F:15;G:16;H:;I:11;J:16;K:17;L:18;M:19;N:21;O:12;P:22;Q:17;R:23;S:24;T:14;U:12;V:15;W:12;X:24;Y:11;Z:24