Soundex: Difference between revisions

→‎{{header|C}}: Alternative implementation.
(→‎{{header|Common Lisp}}: Only need three 0 chars.)
(→‎{{header|C}}: Alternative implementation.)
Line 107:
return 0;
}</lang>
 
Non-obfuscated, sanely-written alternative:
 
<lang c>#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <errno.h>
 
int get_code(int ch)
{
if (strchr("BFPV", ch))
return '1';
if (strchr("CGJKQSXZ", ch))
return '2';
if (strchr("DT", ch))
return '3';
if (strchr("L", ch))
return '4';
if (strchr("MN", ch))
return '5';
if (strchr("R", ch))
return '6';
return 0;
}
 
int soundex(const char *s, char *buf, size_t size)
{
int ch, chprev = 0, count;
 
buf[0] = 0;
 
if (!*s)
return 0;
 
if (size < 5)
return -1;
 
*buf++ = toupper(*s++);
strcpy(buf, "000");
 
for (count = 0; ch = get_code(toupper(*s)), *s++ && count++ < 4; ) {
if (ch && ch != chprev)
*buf++ = ch;
chprev = ch;
}
 
return 0;
}
 
int main(int argc, char **argv)
{
char sbuf[8];
 
if (argc < 2) {
if (argv[0] != 0)
fprintf(stderr, "usage: %s <name>\n", argv[0]);
return EXIT_FAILURE;
}
 
if (soundex(argv[1], sbuf, sizeof sbuf)) {
fprintf(stderr, "soundex buffer too small\n");
return EXIT_FAILURE;
}
 
puts(sbuf);
return 0;
}</lang>
 
Anonymous user