home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume11 / soundslike / soundslike.c < prev   
C/C++ Source or Header  |  1987-10-18  |  4KB  |  136 lines

  1. #include <stdio.h>
  2. #include <strings.h>
  3.  
  4. /*******************************************************
  5.  *  Soundex (like) filter.  Default database is DEFDB  *
  6.  *     or user specifies with "-filename"              *
  7.  *     syntex: soundex word                            *
  8.  *             soundex -database word                  *
  9.  *             soundex word -database                  *
  10.  ******************************************************/
  11.  
  12. #define DEFDB  "/usr/dict/words"   /* default database  */
  13.  
  14. main(argc,argv)
  15.   int    argc;
  16.   char **argv;
  17. {
  18.    void mkcode(), syntex();
  19.    int i;
  20.    char c;
  21.    char dbname[BUFSIZ], word[BUFSIZ], s[BUFSIZ];
  22.    char dbword[BUFSIZ], dbcode[BUFSIZ];
  23.  
  24.    sprintf(dbname,"%s",DEFDB);
  25.    if(argc == 1) 
  26.       syntex(argv[0]);  /* print syntex help then exit */
  27.    
  28.  
  29.    for(i = 1; argv[i] != NULL; i++) {   /* process argument line */
  30.      if( argv[i][0] == '-')
  31.         sprintf(dbname,"%s",argv[i]);
  32.      else
  33.         sprintf(word,"%s",argv[i]);
  34.    }
  35.  
  36.    if( !strlen(word) )
  37.         syntex(argv[0]);
  38.  
  39.    if ( freopen(dbname,"r",stdin) == NULL ) {
  40.       perror(dbname);
  41.       exit(0);
  42.    }
  43.  
  44.    /*  Sanity checks done.  Now, down to buisness */
  45.  
  46.    c = word[0]; 
  47.    mkcode(word);
  48.  
  49.    while( (gets(dbword) ) != NULL ) {
  50.        if( c < dbword[0] )    /* assumes database is in alphabetical order */
  51.            break;
  52.        else if (c > dbword[0])
  53.            continue;
  54.        else {
  55.           sscanf(dbword,"%s%*s",dbcode); /* isolate only first word     */
  56.           sprintf(dbword,"%s",dbcode);   /* truncate dbword to one word */
  57.           mkcode(dbcode);                /* convert to code             */
  58.            if( !strcmp(dbcode,word) )    /* check for exact code match  */
  59.              printf("%s\n",dbword);
  60.        }
  61.    }
  62. }
  63.  
  64. /*********************************   MKCODE()  ****************************/
  65. void mkcode(codeword)
  66.    char  *codeword;
  67. {
  68.     int i, j = 0;
  69.     int l;
  70.  
  71.     l = strlen(codeword);
  72.     if(l <= 1){           /* this should probably return some snide remark */
  73.         codeword[l] = '\0';
  74.         return;
  75.     }
  76.  
  77.     for(i = 1; codeword[i] != NULL; i++) {
  78.          if(codeword[i] == codeword[i - 1])
  79.              continue;
  80.          switch (codeword[i]) {
  81.              case 'b':
  82.              case 'f':
  83.              case 'p':
  84.              case 'v': codeword[j] = '1';
  85.                        j++;
  86.                        break;
  87.  
  88.              case 'c':
  89.              case 'g':
  90.              case 'j':
  91.              case 'k':
  92.              case 'q':
  93.              case 's':
  94.              case 'x':
  95.              case 'z': codeword[j] = '2';
  96.                        j++;
  97.                        break;
  98.  
  99.              case 'd':
  100.              case 't':  codeword[j] = '3';
  101.                         j++;
  102.                         break;
  103.  
  104.              case 'l':  codeword[j] = '4';
  105.                         j++;
  106.                         break;
  107.  
  108.              case 'm':
  109.              case 'n':  codeword[j] = '5';
  110.                         j++;
  111.                         break;
  112.  
  113.              case 'r':  codeword[j] = '6';
  114.                         j++;
  115.                         break;
  116.  
  117.              default :  break;
  118.         }
  119.      }
  120.      codeword[j] = '\0';
  121.      while( strlen(codeword) < 3 )  /* pad with zeroes til minimum length */
  122.         strcat(codeword,"0");
  123.  
  124.  
  125. }
  126.  
  127. /*******************************   SYNTEX()   **************************/
  128. void syntex(name)
  129.   char *name;
  130. {
  131.      printf("syntex:  %s word\n",name);
  132.      printf("    or   %s -database word\n",name);
  133.      printf("     or  %s word -database\n",name);
  134.      exit(0);
  135. }
  136.