/*
  [Header: soundexmodule.c,v 1.2 95/05/02 15:40:45 dwwillia Exp ]
  
  Perform soundex comparisons on strings.

  Soundex is an algorithm that hashes English strings into numerical value.
  Strings that sound the same are hashed to the same value.  This allows 
  for non-literal string matching.

  From: David Wayne Williams <dwwillia@iucf.indiana.edu>
*/

#include <string.h>
#include <ctype.h>
#include "Python.h"

void soundex_hash(char *str, char *result)
{
    char *sptr = str;           /* pointer into str */
    char *rptr = result;        /* pointer into result */
    
    if(*str == NULL)
    {
        strcpy(result,"000000");
        return;
    }
            
    /*  Preserve the first character of the input string.
     */
    *(rptr++) = toupper(*(sptr++));
    
    /* Translate the rest of the input string into result.  The following
       transformations are used:

       1) All vowles, W, and H, are skipped.

       2) BFPV = 1
          CGJKQSXZ = 2
          DT = 3
          L = 4
          MN = 5

       3) Only translate the first of adjacent equal translations.  I.E.
          remove duplicate digits.
    */

    for(;(rptr - result) < 6 &&  *sptr != NULL;sptr++)
    {
        switch (toupper(*sptr))
        {
        case 'W':
        case 'H':
        case 'A':
        case 'I':
        case 'O':
        case 'U':
        case 'Y':
            break;
        case 'B':
        case 'F':
        case 'P':
        case 'V':
            if(*(rptr - 1) != '1')
                *(rptr++) = '1';
            break;
        case 'C':
        case 'G':
        case 'J':
        case 'K':
        case 'Q':
        case 'S':
        case 'X':
        case 'Z':
            if(*(rptr - 1) != '2')
                *(rptr++) = '2';
            break;
        case 'D':
        case 'T':
            if(*(rptr - 1) != '3')
                *(rptr++) = '3';
            break;
        case 'L':
            if(*(rptr - 1) != '4')
                *(rptr++) = '4';
            break;
        case 'M':
        case 'N':
            if(*(rptr - 1) != '5')
                *(rptr++) = '5';
            break;
        default:
            break;
        }
    }

    /* Pad 0's on right side of string out to 6 characters.
     */
    for(; rptr < result + 6; rptr++)
        *rptr = '0';

    /* Terminate the result string.
     */
    *(result + 6) = NULL;
}


static PyObject *
sound_similar(PyObject *self, PyObject *args)
{
    char *str1, *str2;
    int return_value;
    char res1[7], res2[7];
    
    if(!PyArg_ParseTuple(args, "ss", &str1, &str2))
        return NULL;

    soundex_hash(str1, res1);
    soundex_hash(str2, res2);

    if(!strcmp(res1,res2))
        return Py_BuildValue("i",1);
    else
        return Py_BuildValue("i",0);
}

/* Python Method Table.
 */
static PyMethodDef SoundexMethods[] =
{
    {"sound_similar", sound_similar, 1},
    {NULL, NULL }               /* sentinel */
};


/* Register the method table.
 */
void
initsoundex()
{
    (void) Py_InitModule("soundex",SoundexMethods);
}
