static char code[128] = { 0 };
void add_code(const char *s, int c)
{
	while (*s) {
		code[(int)*s] = code[0x20 ^ (int)*s] = c;
		s++;
	}
}

void init()
{
	static const char *cls[] =
		{ , , , , , , , , 0};
	int i;
	for (i = 0; cls[i]; i++)
		add_code(cls[i], i - 1);
}


const char* soundex(const char *s)
{
	static char out[5];
	int c, prev, i;

	out[0] = out[4] = 0;
	if (!s || !*s) return out;

	out[0] = *s++;

	
	prev = code[(int)out[0]];
	for (i = 1; *s && i < 4; s++) {
		if ((c = code[(int)*s]) == prev) continue;

		if (c == -1) prev = 0;	
		else if (c > 0) {
			out[i++] = c + '0';
			prev = c;
		}
	}
	while (i < 4) out[i++] = '0';
	return out;
}

int main()
{
	int i;
	const char *sdx, *names[][2] = {
		{,	},
		{,	},
		{,	},
		{,	},
		{,	},
		{,	},
		{,	},
		{,	},
		{,	},
		{,	},
		{,	},
		{,	},
		{,	},
		{,	},
		{,	},
		{,	},
		{,	},
		{,	},
		{,	},
		{,	},
		{,	},
		{,		},
		{,	},
		{,	},
		{,	},
		{,	},
		{,	},
		{,	},
		{0, 0}
	};

	init();

	puts();
	for (i = 0; names[i][0]; i++) {
		sdx = soundex(names[i][0]);
		printf(, names[i][0], names[i][1], sdx);
		printf(, strcmp(sdx, names[i][1]) ?  : );
	}

	return 0;
}