'===========================================================================
' Subject: SOUNDEX REPRESENTATION FOR PBCC    Date: 12-25-99 (19:12)       
'  Author: Don Schullian                      Code: PBCC                   
'  Origin: d83@DASoftVSS.com                Packet: PBCC.ABC
'===========================================================================
#IF 0
    ----------------------------                      PowerBASIC/cc v2.0
 ---|          DASoft          |------------------------------------------
    ----------------------------         code           DATE: 1999-12-25
    | FILE NAME   SoundEX .bas |          by
    | DIRECTORY                |  Don Schullian, Jr.
    ----------------------------

             This code released into the public domain.

 -------------------------------------------------------------------------
  PURPOSE: CREATE a SoundEX representation of a given string
   PARMAS: TheWord$ - the string to be processed
  RETURNS: a LONG INTEGER in the range of 0 -> 656565656
 -------------------------------------------------------------------------
#ENDIF

DECLARE FUNCTION fSoundex (BYVAL TheWord AS STRING) AS LONG

FUNCTION fSoundex ( BYVAL TheWord AS STRING ) EXPORT AS LONG

  DIM Char  AS LOCAL LONG                         ' character being processed
  DIM Last  AS LOCAL LONG                         ' last character processed
  DIM Temp  AS LOCAL ASCIIZ * 10                  ' buffer for outgoing value
  DIM T_ptr AS LOCAL BYTE PTR                     ' pointer to temp buffer
  DIM Tidx  AS LOCAL LONG                         ' index to temp pointer
  DIM W_ptr AS LOCAL BYTE PTR                     ' pointer to incoming data
  DIM Widx  AS LOCAL LONG                         ' index to incoming data pointer
                                                  '
  TheWord = UCASE$(TheWord)                       ' upper case for consistancy
  W_ptr   = STRPTR(TheWord)                       ' set ptr to incoming string
  T_ptr   = VARPTR(Temp)                          ' set ptr to temp buffer
                                                  '
  FOR Widx = 0 TO LEN(TheWord) -1                 ' process each char in incoming string
    SELECT CASE @W_ptr[Widx]                      '  by character value
      CASE 66, 70, 80, 86             : Char = 49 '
      CASE 67, 71, 74, 81, 83, 88, 90 : Char = 50 '
      CASE 68, 84                     : Char = 51 '
      CASE 76                         : Char = 52 '
      CASE 77, 78                     : Char = 53 '
      CASE 82                         : Char = 54 '
      CASE ELSE                       : ITERATE   '  skip everything else
    END SELECT                                    '
    IF Char = Last THEN ITERATE                   ' no doubles allowed
    @T_ptr[Tidx] = Char                           ' set new char in temp buffer
    IF Tidx = 8 THEN EXIT FOR                     ' if buffer is full then we're done
    INCR Tidx                                     ' next character position
    Last = Char                                   ' save this char's value for test
  NEXT                                            '
                                                  '
  FUNCTION = VAL(Temp)                            'RETURN LONG INTEGER VALUE

END FUNCTION
