74static const char _codes[26] =
76 1, 16, 4, 16, 9, 2, 4, 16, 9, 2, 0, 2, 2, 2, 1, 4, 0, 2, 4, 4, 1, 0, 0, 0, 8, 0
85 return _codes[(c -
'A')];
91#define isvowel(c) (encode(c) & 1)
94#define NOCHANGE(c) (encode(c) & 2)
97#define AFFECTH(c) (encode(c) & 4)
100#define MAKESOFT(c) (encode(c) & 8)
103#define NOGHTOF(c) (encode(c) & 16)
112#define Convert_Raw(c) toupper(c)
114#define Read_Raw_Next_Letter (word[w_idx+1])
115#define Read_Next_Letter (Convert_Raw(Read_Raw_Next_Letter))
117#define Read_Raw_Curr_Letter (word[w_idx])
118#define Read_Curr_Letter (Convert_Raw(Read_Raw_Curr_Letter))
120#define Look_Back_Letter(n) (w_idx >= n ? Convert_Raw(word[w_idx-n]) : '\0')
122#define Read_Prev_Letter (Look_Back_Letter(1))
124#define Read_After_Next_Letter (Read_Raw_Next_Letter != '\0' ? Convert_Raw(word[w_idx+2]) \
126#define Look_Ahead_Letter(n) (toupper(Lookahead((char *) word+w_idx, n)))
131static char Lookahead(
char *word,
int how_far)
134 for (idx = 0; word[idx] !=
'\0' && idx < how_far; idx++);
147#define Phonize(c) { \
148 if (p_idx >= max_buffer_len) { \
149 *phoned_word = zend_string_extend(*phoned_word, 2 * sizeof(char) + max_buffer_len, 0); \
150 max_buffer_len += 2; \
152 ZSTR_VAL(*phoned_word)[p_idx++] = c; \
153 ZSTR_LEN(*phoned_word) = p_idx; \
156#define End_Phoned_Word() { \
157 if (p_idx == max_buffer_len) { \
158 *phoned_word = zend_string_extend(*phoned_word, 1 * sizeof(char) + max_buffer_len, 0); \
159 max_buffer_len += 1; \
161 ZSTR_VAL(*phoned_word)[p_idx] = '\0'; \
162 ZSTR_LEN(*phoned_word) = p_idx; \
165#define Phone_Len (p_idx)
168#define Isbreak(c) (!isalpha(c))
175 size_t max_buffer_len = 0;
181 if (max_phonemes == 0) {
182 max_buffer_len = word_len;
183 *phoned_word = zend_string_alloc(
sizeof(
char) * word_len + 1, 0);
185 max_buffer_len = max_phonemes;
186 *phoned_word = zend_string_alloc(
sizeof(
char) * max_phonemes + 1, 0);
194 if (curr_letter ==
'\0') {
202 switch (curr_letter) {
229 if (next_letter ==
'R') {
232 }
else if (next_letter ==
'H' ||
isvowel(next_letter)) {
265 (max_phonemes == 0 ||
Phone_Len < (size_t)max_phonemes);
269 unsigned short int skip_letter = 0;
280 if (!isalpha(curr_letter))
289 if (curr_letter == prev_letter &&
293 switch (curr_letter) {
296 if (prev_letter !=
'M')
312 else if (prev_letter ==
'S') {
317 }
else if (next_letter ==
'H') {
348 if (next_letter ==
'H') {
356 }
else if (next_letter ==
'N') {
358 if (
Isbreak(after_next_letter) ||
359 (after_next_letter ==
'E' &&
365 prev_letter !=
'G') {
382 if (prev_letter !=
'C')
405 char after_next_letter;
406 if (next_letter ==
'I' &&
408 after_next_letter ==
'A')) {
410 }
else if (next_letter ==
'H') {
427 char after_next_letter;
428 if (next_letter ==
'I' &&
430 after_next_letter ==
'A')) {
432 }
else if (next_letter ==
'H') {
477 w_idx += skip_letter;
metaphone(string $string, int $max_phonemes=0)
ZEND_API ZEND_COLD void zend_argument_value_error(uint32_t arg_num, const char *format,...)
#define ZEND_PARSE_PARAMETERS_END()
#define Z_PARAM_STR(dest)
#define ZEND_PARSE_PARAMETERS_START(min_num_args, max_num_args)
#define Z_PARAM_LONG(dest)
struct _zend_string zend_string
#define zend_always_inline