|
Here's some code that I downloaded, probably from midrange computing....
SDX001RG
*===============================================================
* To compile:
*
* CRTBNDRPG PGM(XXX/SDX001RG) SRCFILE(XXX/QRPGLESRC)
*
*===============================================================
* SDX001RG: Convert a given string to a Soundex code.
* Input: Accepts a 50 character string. (In_String)
* Output: Returns a 4 character soundex code. (Soundex)
* Indicator Usage:
* 90 - General Work Indicator
* Variable Declarations:
*. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8
DInput_Data S 1A Dim(50)
DWork_Data S 1A Dim(50)
DIn_String S 50A
DSoundex S 4A
DSave_Last S 1A INZ(*HIVAL)
DFirst_Two S 2A
DI1 S 2S 0 INZ(0)
DI2 S 2S 0 INZ(0)
DUpper C CONST('ABCDEFGHIJKLMNOPQRSTUVWXYZ')
DLower C CONST('abcdefghijklmnopqrstuvwxyz')
DCodes C CONST('01230120022455012623010202')
*********************
* Mainline Program: *
*********************
* Strip Non-Alphabet Characters from the input data
C EXSR Strip_It
* Convert input text to soundex coding
C EXSR Convert_it
* Strip out Repeat Sound Codes and Build Soundex Variable:
C EXSR Build_it
* End the program
C EVAL *inLR = *ON
* Subroutine Section:
***********************
* Strip It Subroutine *
***********************
C Strip_it BEGSR
* Strip all non-alpabetic characters from the input data:
*. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8
*. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8
C DOW I1 < %ELEM(Input_Data)
C EVAL I1 = I1 + 1
* Check for non-alpha characters
C Upper CHECK Input_Data(I1) 90
* Continue processing this value only if it was alphabetic
C IF *in90<>*ON
* Check for repeat letters and fill work file
C IF Save_Last <> Input_Data(I1)
C EVAL I2 = I2 + 1
C EVAL Work_Data(I2) = Input_Data(I1)
C EVAL Save_Last = Input_Data(I1)
C ENDIF
C ENDIF
C ENDDO
* Move the Work Array Information back to the Input Data Array
* and clear the work array.
C EVAL Input_Data = Work_Data
C CLEAR Work_Data
C ENDSR
*************************
* Convert it Subroutine *
*************************
C Convert_It BEGSR
* Convert input data to Soundex Coding
* First element is moved without translation:
C EVAL Work_Data(1) = Input_Data(1)
C EVAL I1 = 1
C DOW I1 < %ELEM(Input_Data)
C EVAL I1 = I1 + 1
C Upper:Codes XLATE Input_Data(I1)Work_Data(I1)
C ENDDO
* Move the Work Array Information back to the Input Data Array
* and clear the work array.
C EVAL Input_Data = Work_Data
C CLEAR Work_Data
*. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8
*. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8
C ENDSR
***********************
* Build It Subroutine *
***********************
C Build_it BEGSR
* Build the Soundex Variable
* First Character comes over with no further processing:
C EVAL %SUBST(Soundex:1:1) = Input_Data(1)
* Set up variables for processing loop:
C EVAL Save_Last = *HIVAL
C EVAL I1 = 1
C EVAL I2 = 1
* Do while index is less than number of input elements
* and current element is not blank
* and last Soundex element is not filled.
C DOW I1 < %ELEM(Input_Data)
C AND Input_Data(I1) > ' '
C AND I2 < 4
C EVAL I1 = I1 + 1
C IF Input_Data(I1) > ' '
* If code is not a dupe of the previous code, move it to Sound_X:
C IF Save_Last <> Input_Data(I1) AND
C Input_Data(I1) <> '0'
C EVAL Save_Last = Input_Data(I1)
C EVAL I2 = I2 +1
C EVAL %SUBST(Soundex:I2:1) = Input_Data(I1)
C ENDIF
C ENDIF
C ENDDO
* Convert any remaining blank values to zeros:
C ' ':'0' XLATE Soundex Soundex
C ENDSR
******************************
* Alter Odd Starting Letters *
******************************
*. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8
*. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8
C Odd_Start BEGSR
* Try to raise accuracy by substituting common weird two letter
* word starting combinations.
* Move the first two letters of our word to be converted:
C EVAL First_Two = %SUBST(In_String:1:2)
C SELECT
C WHEN First_Two = 'PH'
C EVAL %SUBST(In_String:1:2) = ' F'
C WHEN First_Two = 'NM'
C EVAL %SUBST(In_String:1:1) = ' '
C WHEN First_Two = 'PT'
C EVAL %SUBST(In_String:1:1) = ' '
C WHEN First_Two = 'KN'
C EVAL %SUBST(In_String:1:1) = ' '
C ENDSL
C ENDSR
******************************
* Initialization Subroutine: *
******************************
C *Inzsr BEGSR
* Parameters Expected by this Program:
C *Entry PLIST
C PARM In_String
C PARM Soundex
* Translate all alphabetic characters to upper case:
C Lower:Upper XLATE In_String In_String
* Alter Odd Starting Letter combinations:
C EXSR Odd_Start
* Strip Leading Blanks
C EVAL In_String = %triml(In_String)
* Place our Input Data into an array for further processing:
C MOVEA In_String Input_Data
* Make certain that the Soundex code variable is empty:
C CLEAR Soundex
C ENDSR
SDX002DF
*. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8
A DSPSIZ(24 80 *DS3)
A CSRINPONLY
A* Main Input Screen:
A R SCREEN1
A WINDOW(5 10 9 52 *NOMSGLIN)
A CF03
A CF12
A PRINT
A WDWBORDER((*COLOR WHT) (*DSPATR HI))
A WDWTITLE((*TEXT 'Soundex Test') (*C-
A OLOR WHT))
A 2 1'Input String:'
A IN_STRING 50A I 3 2CHECK(LC)
A 5 2'Results of Last Run:'
A OUT_STRING 50A O 6 2COLOR(WHT)
A 7 2'Soundex code --------->'
A SOUNDEX 4A O 7 26COLOR(WHT)
A 8 1'F3=Exit'
A COLOR(BLU)
* Dummy Record:
A R DUMMY
A ASSUME
A 1 5' '
A*. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7
SDX002RG
*===============================================================
* SDX002RG: Demonstrate The Soundex Routine
*. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8
FSDX002DF CF E WORKSTN
F INFDS(INFDS)
* Information Data Structure To Get The Function Key pressed:
D INFDS DS
D FunctionKy 369 369
* Named Hex Constants For Function Keys
D F03 C CONST(X'33')
D F12 C CONST(X'3C')
D ENTER C CONST(X'F1')
****************
* Main Program *
****************
C DOW FunctionKy <> F03
C AND FunctionKy <> F12
* Output Entry Screen:
C EXFMT Screen1
* Process Screen Based on Key used:
C SELECT
C WHEN FunctionKy = ENTER
C EXSR Process
* Verify Input
C OTHER
* Do Nothing
C ENDSL
C ENDDO
* Terminate the Program:
C EVAL *inLR = *ON
*****************************************
* Subroutine Section *
*****************************************
* Call the Soundex Routine:
C Process BEGSR
C CALL 'SDX001RG'
C PARM In_String
C PARM Soundex
C EVAL Out_String = In_String
C CLEAR In_String
C ENDSR
_________________
Art Tostaine, Jr.
CCA, Inc.
Jackson, NJ 08527
As an Amazon Associate we earn from qualifying purchases.
This mailing list archive is Copyright 1997-2025 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].
Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.