home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume8 / sp / part01 / calcsoundex.c next >
Encoding:
C/C++ Source or Header  |  1987-02-19  |  2.4 KB  |  110 lines

  1. /* vi: set tabstop=4 : */
  2.  
  3. /*
  4.  * calcsoundex - calculate soundex codes
  5.  *
  6.  * Permission is given to copy or distribute this program provided you
  7.  * do not remove this header or make money off of the program.
  8.  *
  9.  * Please send comments and suggestions to:
  10.  * Barry Brachman
  11.  * Dept. of Computer Science
  12.  * Univ. of British Columbia
  13.  * Vancouver, B.C. V6T 1W5
  14.  *
  15.  * .. {ihnp4!alberta, uw-beaver}!ubc-vision!ubc-cs!brachman
  16.  * brachman@cs.ubc.cdn
  17.  * brachman%ubc.csnet@csnet-relay.arpa
  18.  * brachman@ubc.csnet
  19.  */
  20.  
  21. #include <stdio.h>
  22. #include <ctype.h>
  23.  
  24. #include "sp.h"
  25.  
  26. char word[MAXWORDLEN + 2];
  27.  
  28. char soundex_code_map[26] = {
  29. /***     A  B  C  D  E  F  G  H  I  J  K  L  M  N  O  P    ***/ 
  30.          0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0, 1,
  31.  
  32. /***     Q  R  S  T  U  V  W  X  Y  Z            ***/
  33.          2, 6, 2, 3, 0, 1, 0, 2, 0, 2
  34. };
  35.  
  36. main(argc, argv)
  37. int argc;
  38. char **argv;
  39. {
  40.     register int c, i, soundex_length, digit_part, previous_code;
  41.     int ch, len, vflag;
  42.     short soundex;
  43.     char *gets();
  44.  
  45.     vflag = 0;
  46.     if (argc > 2 || (argc == 2 && strcmp(argv[1], "-v"))) {
  47.         fprintf(stderr, "Usage: calcsoundex [-v]\n");
  48.         exit(1);
  49.     }
  50.     if (argc > 1)
  51.         vflag = 1;
  52.  
  53.     while (fgets(word, sizeof(word), stdin) != (char *) NULL) {
  54.         len = strlen(word);
  55.         if (word[len - 1] != '\n') {
  56.             fprintf(stderr, "calcsoundex: Word too long: %s", word);
  57.             while ((ch = getchar()) != '\n')    /* flush rest of line */
  58.                 putc(ch, stderr);
  59.             putc('\n', stderr);
  60.             continue;
  61.         }
  62.         word[--len] = '\0';
  63.         if (len > MAXWORDLEN) {
  64.             fprintf(stderr, "calcsoundex: Word too long: %s\n", word);
  65.             continue;
  66.         }
  67.  
  68.         for (i = 0; word[i] != '\0'; i++) {
  69.             if (isupper(word[i]))
  70.                 word[i] = tolower(word[i]);
  71.         }
  72.         if (!isalpha(word[0]))
  73.             continue;
  74.  
  75.         digit_part = 0;
  76.         soundex_length = 0;
  77.         previous_code = soundex_code_map[word[0] - 'a'];
  78.         for (i = 1; word[i] != '\0' && soundex_length < 3; i++) {
  79.             if (!isalpha(word[i]))
  80.                 continue;
  81.             c = soundex_code_map[word[i] - 'a'];
  82.             if (c == 0 || previous_code == c) {
  83.                 previous_code = c;
  84.                 continue;
  85.             }
  86.             digit_part = digit_part * 10 + c;
  87.             previous_code = c;
  88.             soundex_length++;
  89.         }
  90.         while (soundex_length++ < 3)
  91.             digit_part *= 10;
  92.         soundex = digit_part << 5 + word[0] - 'a';
  93.         printf("%c", word[0]);
  94.         if (digit_part < 100)
  95.             putchar('0');
  96.         if (digit_part < 10)
  97.             putchar('0');
  98.         if (digit_part == 0)
  99.             putchar('0');
  100.         else
  101.             printf("%d", digit_part);
  102.         if (vflag)
  103.             printf(" %s", word);
  104.         putchar('\n');
  105.     }
  106.     putchar('\n');
  107.     exit(0);
  108. }
  109.  
  110.