|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - downloadIndex: ┃ T c ┃
Length: 2455 (0x997) Types: TextFile Names: »calcsoundex.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki └─ ⟦this⟧ »EUUGD11/euug-87hel/sec1/sp/calcsoundex.c«
/* vi: set tabstop=4 : */ /* * calcsoundex - calculate soundex codes * * Permission is given to copy or distribute this program provided you * do not remove this header or make money off of the program. * * Please send comments and suggestions to: * Barry Brachman * Dept. of Computer Science * Univ. of British Columbia * Vancouver, B.C. V6T 1W5 * * .. {ihnp4!alberta, uw-beaver}!ubc-vision!ubc-cs!brachman * brachman@cs.ubc.cdn * brachman%ubc.csnet@csnet-relay.arpa * brachman@ubc.csnet */ #include <stdio.h> #include <ctype.h> #include "sp.h" char word[MAXWORDLEN + 2]; char soundex_code_map[26] = { /*** A B C D E F G H I J K L M N O P ***/ 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0, 1, /*** Q R S T U V W X Y Z ***/ 2, 6, 2, 3, 0, 1, 0, 2, 0, 2 }; main(argc, argv) int argc; char **argv; { register int c, i, soundex_length, digit_part, previous_code; int ch, len, vflag; short soundex; char *gets(); vflag = 0; if (argc > 2 || (argc == 2 && strcmp(argv[1], "-v"))) { fprintf(stderr, "Usage: calcsoundex [-v]\n"); exit(1); } if (argc > 1) vflag = 1; while (fgets(word, sizeof(word), stdin) != (char *) NULL) { len = strlen(word); if (word[len - 1] != '\n') { fprintf(stderr, "calcsoundex: Word too long: %s", word); while ((ch = getchar()) != '\n') /* flush rest of line */ putc(ch, stderr); putc('\n', stderr); continue; } word[--len] = '\0'; if (len > MAXWORDLEN) { fprintf(stderr, "calcsoundex: Word too long: %s\n", word); continue; } for (i = 0; word[i] != '\0'; i++) { if (isupper(word[i])) word[i] = tolower(word[i]); } if (!isalpha(word[0])) continue; digit_part = 0; soundex_length = 0; previous_code = soundex_code_map[word[0] - 'a']; for (i = 1; word[i] != '\0' && soundex_length < 3; i++) { if (!isalpha(word[i])) continue; c = soundex_code_map[word[i] - 'a']; if (c == 0 || previous_code == c) { previous_code = c; continue; } digit_part = digit_part * 10 + c; previous_code = c; soundex_length++; } while (soundex_length++ < 3) digit_part *= 10; soundex = digit_part << 5 + word[0] - 'a'; printf("%c", word[0]); if (digit_part < 100) putchar('0'); if (digit_part < 10) putchar('0'); if (digit_part == 0) putchar('0'); else printf("%d", digit_part); if (vflag) printf(" %s", word); putchar('\n'); } putchar('\n'); exit(0); }