Back to index

php5  5.3.10
Functions
soundex.c File Reference
#include "php.h"
#include <stdlib.h>
#include <errno.h>
#include <ctype.h>
#include "php_string.h"

Go to the source code of this file.

Functions

 PHP_FUNCTION (soundex)

Function Documentation

PHP_FUNCTION ( soundex  )

Definition at line 29 of file soundex.c.

{
       char   *str;
       int    i, _small, str_len, code, last;
       char   soundex[4 + 1];

       static char soundex_table[26] =
       {0,                                              /* A */
        '1',                                     /* B */
        '2',                                     /* C */
        '3',                                     /* D */
        0,                                              /* E */
        '1',                                     /* F */
        '2',                                     /* G */
        0,                                              /* H */
        0,                                              /* I */
        '2',                                     /* J */
        '2',                                     /* K */
        '4',                                     /* L */
        '5',                                     /* M */
        '5',                                     /* N */
        0,                                              /* O */
        '1',                                     /* P */
        '2',                                     /* Q */
        '6',                                     /* R */
        '2',                                     /* S */
        '3',                                     /* T */
        0,                                              /* U */
        '1',                                     /* V */
        0,                                              /* W */
        '2',                                     /* X */
        0,                                              /* Y */
        '2'};                                    /* Z */

       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &str, &str_len) == FAILURE) {
              return;
       }
       if (str_len == 0) {
              RETURN_FALSE;
       }

       /* build soundex string */
       last = -1;
       for (i = 0, _small = 0; i < str_len && _small < 4; i++) {
              /* convert chars to upper case and strip non-letter chars */
              /* BUG: should also map here accented letters used in non */
              /* English words or names (also found in English text!): */
              /* esstsett, thorn, n-tilde, c-cedilla, s-caron, ... */
              code = toupper((int)(unsigned char)str[i]);
              if (code >= 'A' && code <= 'Z') {
                     if (_small == 0) {
                            /* remember first valid char */
                            soundex[_small++] = code;
                            last = soundex_table[code - 'A'];
                     }
                     else {
                            /* ignore sequences of consonants with same soundex */
                            /* code in trail, and vowels unless they separate */
                            /* consonant letters */
                            code = soundex_table[code - 'A'];
                            if (code != last) {
                                   if (code != 0) {
                                          soundex[_small++] = code;
                                   }
                                   last = code;
                            }
                     }
              }
       }
       /* pad with '0' and terminate with 0 ;-) */
       while (_small < 4) {
              soundex[_small++] = '0';
       }
       soundex[_small] = '\0';

       RETURN_STRINGL(soundex, _small, 1);
}

Here is the call graph for this function: