home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume39 / phonewrd / patch01 next >
Text File  |  1993-08-21  |  20KB  |  695 lines

  1. Newsgroups: comp.sources.misc
  2. From: erich@eye.com (Eric Haines)
  3. Subject: v39i043:  phonewrd - phone number phrase generator, Patch01
  4. Message-ID: <1993Aug22.015648.147@sparky.sterling.com>
  5. X-Md4-Signature: fa7f8bf6fdb98a94c29747340b0d14e9
  6. Sender: kent@sparky.sterling.com (Kent Landfield)
  7. Organization: Sterling Software
  8. Date: Sun, 22 Aug 1993 01:56:48 GMT
  9. Approved: kent@sparky.sterling.com
  10.  
  11. Submitted-by: erich@eye.com (Eric Haines)
  12. Posting-number: Volume 39, Issue 43
  13. Archive-name: phonewrd/patch01
  14. Environment: UNIX, DOS
  15. Patch-To: phonewrd: Volume 38, Issue 56
  16.  
  17. This is the first patch to phonewrd, my phone number phrase generator.
  18.  
  19. It turns out "tolower()" works idiotically on some non ANSI C
  20. compilers, merrily changing lowercase values to garbage - this patch
  21. compensates for that and so makes the code more portable, plus some other
  22. minor fixes and casts.  
  23.  
  24. Eric Haines
  25. -----------
  26. diff -c ../old/README ./README
  27. *** ../old/README    Fri Jul 30 09:50:02 1993
  28. --- ./README    Fri Jul 30 09:49:01 1993
  29. ***************
  30. *** 6,16 ****
  31.   searching or, better yet, you can get GNU's free ispell dictionaries (see the
  32.   man page for details) and use these.
  33.   
  34. ! This beastie should work under UNIX and DOS (and whatever else) under all the
  35.   flavors of C.  Now that I've said that I've doomed myself to some weird
  36. ! portability problem.  You'll want to define USE_STRINGS_H in the makefile if
  37. ! you use <strings.h> on your system.  Also, you'll almost definitely want to
  38. ! change DICT_PATH in the code to wherever your dictionary resides.
  39.   
  40.   Files included in this distribution:
  41.       README - what the heck could be in here?
  42. --- 6,18 ----
  43.   searching or, better yet, you can get GNU's free ispell dictionaries (see the
  44.   man page for details) and use these.
  45.   
  46. ! You'll almost surely want to change DICT_PATH in the code to wherever your
  47. ! dictionary resides.  You'll want to define USE_STRINGS_H in the makefile if
  48. ! you use <strings.h> on your system.  Finally, for speed, you might want to use
  49. ! the commented out sftolower() macro (see the code) if you're using ANSI C.
  50. ! This code should work under UNIX and DOS (and whatever else) under all the
  51.   flavors of C.  Now that I've said that I've doomed myself to some weird
  52. ! portability problem.
  53.   
  54.   Files included in this distribution:
  55.       README - what the heck could be in here?
  56. diff -c ../old/README ./README../old/patchlevel.h ./patchlevel.h
  57. *** ../old/patchlevel.h    Fri Jul 30 09:50:02 1993
  58. --- ./patchlevel.h    Fri Jul 30 09:49:13 1993
  59. ***************
  60. *** 1,2 ****
  61. ! #define VERSION        "version 2.0"
  62. ! #define PATCHLEVEL    0
  63. --- 1,2 ----
  64. ! #define VERSION        "version 2.1"
  65. ! #define PATCHLEVEL    1
  66. diff -c ../old/patchlevel.h ./patchlevel.h../old/phonewrd.c ./phonewrd.c
  67. *** ../old/phonewrd.c    Fri Jul 30 09:50:02 1993
  68. --- ./phonewrd.c    Fri Jul 30 10:15:12 1993
  69. ***************
  70. *** 3,9 ****
  71.       which fit it.  See the man page for details, type "phonewrd -?" for
  72.       options.
  73.   
  74. !    version 2.0 - 6/23/93
  75.   
  76.      (c) copyright 1993, Eric Haines, all rights reserved (erich@eye.com)
  77.   
  78. --- 3,9 ----
  79.       which fit it.  See the man page for details, type "phonewrd -?" for
  80.       options.
  81.   
  82. !    version 2.1 - 7/16/93
  83.   
  84.      (c) copyright 1993, Eric Haines, all rights reserved (erich@eye.com)
  85.   
  86. ***************
  87. *** 11,21 ****
  88.      History:
  89.   
  90.      2.0 - release for comp.sources.misc
  91.    */
  92.   
  93. ! #include <stdlib.h>    /* if you don't have stdlib, use malloc.h instead */
  94.   #include <stdio.h>
  95.   
  96.   /* define USE_STRINGS_H if you use <strings.h> instead of <string.h> */
  97.   #ifdef USE_STRINGS_H
  98.       /* BSD string routines. */
  99. --- 11,41 ----
  100.      History:
  101.   
  102.      2.0 - release for comp.sources.misc
  103. +    2.1 - added sftolower for non-ANSI machines, added ctype.h include,
  104. +      fixed error msg for GNU dictionary, added function prototypes,
  105. +      made some casts explicit.
  106.    */
  107.   
  108. ! #include <stdlib.h>    /* if you don't have stdlib, use malloc.h instead,
  109. !              * though you might be able to get by without either */
  110.   #include <stdio.h>
  111. + #include <ctype.h>    /* for tolower() */
  112.   
  113. + /* safe tolower() macro - on some non-ANSI compliant machines, tolower()
  114. +  * only works correctly for uppercase values, i.e. it simply subtracts an
  115. +  * offset from the value passed in.  So, we need to test if the character is
  116. +  * uppercase before using tolower().  For the following macro, note that no
  117. +  * incrementing of the character should occur (e.g. sftolower(*str++) will
  118. +  * work incorrectly).  If your compiler has a tolower() function that works
  119. +  * correctly for all input (most compilers do) and you want the code to run
  120. +  * faster, just redefine sftolower as calling tolower, i.e.:
  121. +  * #define    sftolower(c)    tolower((int)(c))
  122. +  */
  123. + #define    sftolower(c)                    \
  124. +     (((c) >= 'A' && (c) <= 'Z' ) ? tolower((int)(c)) : (c))
  125.   /* define USE_STRINGS_H if you use <strings.h> instead of <string.h> */
  126.   #ifdef USE_STRINGS_H
  127.       /* BSD string routines. */
  128. ***************
  129. *** 37,45 ****
  130.   /* path to dictionary */
  131.   #define    DICT_PATH    "/usr/dict/words"
  132.   
  133. - /* number of digits in phone number */
  134. - #define    NUM_DIGITS    7
  135.   /* how many numerals are allowed in our phrase? */
  136.   #define    NUMERALS_ALLOWED    0
  137.   
  138. --- 57,62 ----
  139. ***************
  140. *** 71,77 ****
  141.        { 2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,Q,7,7,8,8,8,9,9,9,Z } ;
  142.   
  143.   /* true if a character is a vowel */
  144. ! #define    Vowel(c)    strchr( "aeiou", (c) )
  145.   
  146.   /*============= storage space related ===================================== */
  147.   
  148. --- 88,94 ----
  149.        { 2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,Q,7,7,8,8,8,9,9,9,Z } ;
  150.   
  151.   /* true if a character is a vowel */
  152. ! #define    Vowel(c)    strchr( "aeiou", (int)(c) )
  153.   
  154.   /*============= storage space related ===================================== */
  155.   
  156. ***************
  157. *** 137,157 ****
  158.   
  159.   /*============= procedure declarations ==================================== */
  160.   
  161. ! int phone_check() ;
  162. ! void roll_own() ;
  163. ! void concat_it() ;
  164. ! void concat_letter_out() ;
  165. ! void concat_letter_breaks_out() ;
  166. ! void init_wl() ;
  167. ! int fit_word() ;
  168. ! int permute_word() ;
  169. ! void search_for_match() ;
  170. ! void hold_word() ;
  171. ! int store_word() ;
  172. ! void free_wl() ;
  173. ! int scan_options() ;
  174. ! char *str_duplicate() ;
  175.   
  176.   /*============= procedures ================================================ */
  177.   
  178.   main(argc,argv)
  179. --- 154,185 ----
  180.   
  181.   /*============= procedure declarations ==================================== */
  182.   
  183. ! #if __STDC__ || defined(__cplusplus)
  184. ! #define P_(s) s
  185. ! #else
  186. ! #define P_(s) ()
  187. ! #endif
  188.   
  189. + /* phonewrd.c */
  190. + int main P_((int argc, char *argv[]));
  191. + void usage P_((void));
  192. + int phone_check P_((char *numeral_string));
  193. + void roll_own P_((void));
  194. + void concat_it P_((void));
  195. + void concat_letter_out P_((int digit, char *full_string));
  196. + void concat_letter_breaks_out P_((int digit, char *full_string));
  197. + void init_wl P_((void));
  198. + int fit_word P_((char *dict_word, int min_length));
  199. + int permute_word P_((char *dict_word, char *new_word));
  200. + void hold_word P_((char *word));
  201. + int store_word P_((char *word, int digit, int length));
  202. + void search_for_match P_((int digit, char *full_string, char *suffix_loc, int numeral_count));
  203. + void free_wl P_((void));
  204. + int scan_options P_((int argc, char *argv[], int *nargc, char *nargv[]));
  205. + char *str_duplicate P_((char *s));
  206. + #undef P_
  207.   /*============= procedures ================================================ */
  208.   
  209.   main(argc,argv)
  210. ***************
  211. *** 224,230 ****
  212.       return( 0 ) ;
  213.   }
  214.   
  215. ! usage()
  216.   {
  217.       fprintf(stderr, "usage: %s [options] phone#[*...]\n", ProgName);
  218.       fprintf(stderr, " [*...] - extra *'s at the end mean optional wildcard letters\n");
  219. --- 252,258 ----
  220.       return( 0 ) ;
  221.   }
  222.   
  223. ! void usage()
  224.   {
  225.       fprintf(stderr, "usage: %s [options] phone#[*...]\n", ProgName);
  226.       fprintf(stderr, " [*...] - extra *'s at the end mean optional wildcard letters\n");
  227. ***************
  228. *** 278,284 ****
  229.       } else if ( ( (tchr >= 'A') && (tchr <= 'Z') ) ||
  230.               ( (tchr >= 'a') && (tchr <= 'z') ) ) {
  231.           PhoneNum[NumDigits] = FIXED_LETTER ;
  232. !         PhoneStr[NumDigits++] = tolower( tchr ) ;
  233.       }
  234.       tchr = *tstr++ ;
  235.       }
  236. --- 306,312 ----
  237.       } else if ( ( (tchr >= 'A') && (tchr <= 'Z') ) ||
  238.               ( (tchr >= 'a') && (tchr <= 'z') ) ) {
  239.           PhoneNum[NumDigits] = FIXED_LETTER ;
  240. !         PhoneStr[NumDigits++] = sftolower( tchr ) ;
  241.       }
  242.       tchr = *tstr++ ;
  243.       }
  244. ***************
  245. *** 635,641 ****
  246.           ; i++, wc++ ) {
  247.   
  248.           /* remove apostrophes, hyphens, etc for matching */
  249. !         tchr = tolower(*wc) ;
  250.           if ( ( tchr >= 'a' ) && ( tchr <= 'z' ) ) {
  251.           *wv++ = Letter2Numeral[(*lc++ = tchr) -'a'] ;
  252.           compare_length++ ;
  253. --- 663,669 ----
  254.           ; i++, wc++ ) {
  255.   
  256.           /* remove apostrophes, hyphens, etc for matching */
  257. !         tchr = sftolower(*wc) ;
  258.           if ( ( tchr >= 'a' ) && ( tchr <= 'z' ) ) {
  259.           *wv++ = Letter2Numeral[(*lc++ = tchr) -'a'] ;
  260.           compare_length++ ;
  261. ***************
  262. *** 648,654 ****
  263.       true_length = compare_length ;
  264.   
  265.       while ( *wc ) {
  266. !         tchr = tolower( *wc++ ) ;
  267.           /* get true length of word in valid characters */
  268.           if ( ( tchr >= 'a' ) && ( tchr <= 'z' ) ) {
  269.           true_length++ ;
  270. --- 676,683 ----
  271.       true_length = compare_length ;
  272.   
  273.       while ( *wc ) {
  274. !         tchr = *wc++ ;
  275. !         tchr = sftolower( tchr ) ;
  276.           /* get true length of word in valid characters */
  277.           if ( ( tchr >= 'a' ) && ( tchr <= 'z' ) ) {
  278.           true_length++ ;
  279. ***************
  280. *** 783,789 ****
  281.               return( 0 ) ;
  282.           }
  283.           perm_cur_suf_count = perm_suf_count ;
  284. !         switch( perm_pre_cmd[--perm_cur_pre_count] ) {
  285.               case 'A':    /* enter -> reenter */
  286.               strcpy( perm_pre_word, "re" ) ;
  287.               strcat( perm_pre_word, perm_word ) ;
  288. --- 812,818 ----
  289.               return( 0 ) ;
  290.           }
  291.           perm_cur_suf_count = perm_suf_count ;
  292. !         switch( tchr = perm_pre_cmd[--perm_cur_pre_count] ) {
  293.               case 'A':    /* enter -> reenter */
  294.               strcpy( perm_pre_word, "re" ) ;
  295.               strcat( perm_pre_word, perm_word ) ;
  296. ***************
  297. *** 809,819 ****
  298.           strcpy( new_word, perm_pre_word ) ;
  299.           } else {
  300.           strcpy( new_word, perm_pre_word ) ;
  301. !         switch( perm_suf_cmd[--perm_cur_suf_count] ) {
  302.               case 'V':    /* create -> creative */
  303.               /* use only when there is no prefix */
  304.               if ( perm_cur_pre_count == perm_pre_count ) {
  305. !                 tchr = tolower(new_word[pre_length-1]) ;
  306.                   if ( tchr == 'e' ) {
  307.                   new_word[pre_length-1] = '\0' ;
  308.                   }
  309. --- 838,848 ----
  310.           strcpy( new_word, perm_pre_word ) ;
  311.           } else {
  312.           strcpy( new_word, perm_pre_word ) ;
  313. !         switch( tchr = perm_suf_cmd[--perm_cur_suf_count] ) {
  314.               case 'V':    /* create -> creative */
  315.               /* use only when there is no prefix */
  316.               if ( perm_cur_pre_count == perm_pre_count ) {
  317. !                 tchr = sftolower(new_word[pre_length-1]) ;
  318.                   if ( tchr == 'e' ) {
  319.                   new_word[pre_length-1] = '\0' ;
  320.                   }
  321. ***************
  322. *** 824,830 ****
  323.               }
  324.               break ;
  325.               case 'N':    /* create -> creation */
  326. !             tchr = tolower(new_word[pre_length-1]) ;
  327.               if ( tchr == 'e' ) {
  328.                   new_word[pre_length-1] = '\0' ;
  329.                   strcat( new_word, "ion" ) ;
  330. --- 853,859 ----
  331.               }
  332.               break ;
  333.               case 'N':    /* create -> creation */
  334. !             tchr = sftolower(new_word[pre_length-1]) ;
  335.               if ( tchr == 'e' ) {
  336.                   new_word[pre_length-1] = '\0' ;
  337.                   strcat( new_word, "ion" ) ;
  338. ***************
  339. *** 836,842 ****
  340.               }
  341.               break ;
  342.               case 'X':    /* create -> creations */
  343. !             tchr = tolower(new_word[pre_length-1]) ;
  344.               if ( tchr == 'e' ) {
  345.                   new_word[pre_length-1] = '\0' ;
  346.                   strcat( new_word, "ions" ) ;
  347. --- 865,871 ----
  348.               }
  349.               break ;
  350.               case 'X':    /* create -> creations */
  351. !             tchr = sftolower(new_word[pre_length-1]) ;
  352.               if ( tchr == 'e' ) {
  353.                   new_word[pre_length-1] = '\0' ;
  354.                   strcat( new_word, "ions" ) ;
  355. ***************
  356. *** 850,856 ****
  357.               case 'H':    /* twenty -> twentieth */
  358.               /* use only when there is no prefix */
  359.               if ( perm_cur_pre_count == perm_pre_count ) {
  360. !                 tchr = tolower(new_word[pre_length-1]) ;
  361.                   if ( tchr == 'y' ) {
  362.                   new_word[pre_length-1] = '\0' ;
  363.                   strcat( new_word, "ieth" ) ;
  364. --- 879,885 ----
  365.               case 'H':    /* twenty -> twentieth */
  366.               /* use only when there is no prefix */
  367.               if ( perm_cur_pre_count == perm_pre_count ) {
  368. !                 tchr = sftolower(new_word[pre_length-1]) ;
  369.                   if ( tchr == 'y' ) {
  370.                   new_word[pre_length-1] = '\0' ;
  371.                   strcat( new_word, "ieth" ) ;
  372. ***************
  373. *** 866,872 ****
  374.               strcat( new_word, "ly" ) ;
  375.               break ;
  376.               case 'G':    /* file -> filing */
  377. !             tchr = tolower(new_word[pre_length-1]) ;
  378.               if ( tchr == 'e' ) {
  379.                   new_word[pre_length-1] = '\0' ;
  380.               }
  381. --- 895,901 ----
  382.               strcat( new_word, "ly" ) ;
  383.               break ;
  384.               case 'G':    /* file -> filing */
  385. !             tchr = sftolower(new_word[pre_length-1]) ;
  386.               if ( tchr == 'e' ) {
  387.                   new_word[pre_length-1] = '\0' ;
  388.               }
  389. ***************
  390. *** 873,879 ****
  391.               strcat( new_word, "ing" ) ;
  392.               break ;
  393.               case 'J':    /* file -> filings */
  394. !             tchr = tolower(new_word[pre_length-1]) ;
  395.               if ( tchr == 'e' ) {
  396.                   new_word[pre_length-1] = '\0' ;
  397.               }
  398. --- 902,908 ----
  399.               strcat( new_word, "ing" ) ;
  400.               break ;
  401.               case 'J':    /* file -> filings */
  402. !             tchr = sftolower(new_word[pre_length-1]) ;
  403.               if ( tchr == 'e' ) {
  404.                   new_word[pre_length-1] = '\0' ;
  405.               }
  406. ***************
  407. *** 880,890 ****
  408.               strcat( new_word, "ings" ) ;
  409.               break ;
  410.               case 'D':    /* create -> created */
  411. !             tchr = tolower(new_word[pre_length-1]) ;
  412.               if ( tchr == 'e' ) {
  413.                   strcat( new_word, "d" ) ;
  414.               } else if ( tchr == 'y' ) {
  415. !                 ttchr = tolower(new_word[pre_length-2]) ;
  416.                   if ( Vowel(ttchr) ) {
  417.                   strcat( new_word, "ed" ) ;
  418.                   } else {
  419. --- 909,919 ----
  420.               strcat( new_word, "ings" ) ;
  421.               break ;
  422.               case 'D':    /* create -> created */
  423. !             tchr = sftolower(new_word[pre_length-1]) ;
  424.               if ( tchr == 'e' ) {
  425.                   strcat( new_word, "d" ) ;
  426.               } else if ( tchr == 'y' ) {
  427. !                 ttchr = sftolower(new_word[pre_length-2]) ;
  428.                   if ( Vowel(ttchr) ) {
  429.                   strcat( new_word, "ed" ) ;
  430.                   } else {
  431. ***************
  432. *** 898,908 ****
  433.               case 'T':    /* late -> latest */
  434.               /* use only when there is no prefix */
  435.               if ( perm_cur_pre_count == perm_pre_count ) {
  436. !                 tchr = tolower(new_word[pre_length-1]) ;
  437.                   if ( tchr == 'e' ) {
  438.                   strcat( new_word, "st" ) ;
  439.                   } else if ( tchr == 'y' ) {
  440. !                 ttchr = tolower(new_word[pre_length-2]) ;
  441.                   if ( Vowel(ttchr) ) {
  442.                       strcat( new_word, "est" ) ;
  443.                   } else {
  444. --- 927,937 ----
  445.               case 'T':    /* late -> latest */
  446.               /* use only when there is no prefix */
  447.               if ( perm_cur_pre_count == perm_pre_count ) {
  448. !                 tchr = sftolower(new_word[pre_length-1]) ;
  449.                   if ( tchr == 'e' ) {
  450.                   strcat( new_word, "st" ) ;
  451.                   } else if ( tchr == 'y' ) {
  452. !                 ttchr = sftolower(new_word[pre_length-2]) ;
  453.                   if ( Vowel(ttchr) ) {
  454.                       strcat( new_word, "est" ) ;
  455.                   } else {
  456. ***************
  457. *** 918,928 ****
  458.               }
  459.               break ;
  460.               case 'R':    /* late -> later */
  461. !             tchr = tolower(new_word[pre_length-1]) ;
  462.               if ( tchr == 'e' ) {
  463.                   strcat( new_word, "r" ) ;
  464.               } else if ( tchr == 'y' ) {
  465. !                 ttchr = tolower(new_word[pre_length-2]) ;
  466.                   if ( Vowel(ttchr) ) {
  467.                   strcat( new_word, "er" ) ;
  468.                   } else {
  469. --- 947,957 ----
  470.               }
  471.               break ;
  472.               case 'R':    /* late -> later */
  473. !             tchr = sftolower(new_word[pre_length-1]) ;
  474.               if ( tchr == 'e' ) {
  475.                   strcat( new_word, "r" ) ;
  476.               } else if ( tchr == 'y' ) {
  477. !                 ttchr = sftolower(new_word[pre_length-2]) ;
  478.                   if ( Vowel(ttchr) ) {
  479.                   strcat( new_word, "er" ) ;
  480.                   } else {
  481. ***************
  482. *** 934,944 ****
  483.               }
  484.               break ;
  485.               case 'Z':    /* skate ->skaters */
  486. !             tchr = tolower(new_word[pre_length-1]) ;
  487.               if ( tchr == 'e' ) {
  488.                   strcat( new_word, "rs" ) ;
  489.               } else if ( tchr == 'y' ) {
  490. !                 ttchr = tolower(new_word[pre_length-2]) ;
  491.                   if ( Vowel(ttchr) ) {
  492.                   strcat( new_word, "ers" ) ;
  493.                   } else {
  494. --- 963,973 ----
  495.               }
  496.               break ;
  497.               case 'Z':    /* skate ->skaters */
  498. !             tchr = sftolower(new_word[pre_length-1]) ;
  499.               if ( tchr == 'e' ) {
  500.                   strcat( new_word, "rs" ) ;
  501.               } else if ( tchr == 'y' ) {
  502. !                 ttchr = sftolower(new_word[pre_length-2]) ;
  503.                   if ( Vowel(ttchr) ) {
  504.                   strcat( new_word, "ers" ) ;
  505.                   } else {
  506. ***************
  507. *** 950,958 ****
  508.               }
  509.               break ;
  510.               case 'S':    /* imply -> implies */
  511. !             tchr = tolower(new_word[pre_length-1]) ;
  512.               if ( tchr == 'y' ) {
  513. !                 ttchr = tolower(new_word[pre_length-2]) ;
  514.                   if ( Vowel(ttchr) ) {
  515.                   strcat( new_word, "s" ) ;
  516.                   } else {
  517. --- 979,987 ----
  518.               }
  519.               break ;
  520.               case 'S':    /* imply -> implies */
  521. !             tchr = sftolower(new_word[pre_length-1]) ;
  522.               if ( tchr == 'y' ) {
  523. !                 ttchr = sftolower(new_word[pre_length-2]) ;
  524.                   if ( Vowel(ttchr) ) {
  525.                   strcat( new_word, "s" ) ;
  526.                   } else {
  527. ***************
  528. *** 960,966 ****
  529.                   strcat( new_word, "ies" ) ;
  530.                   }
  531.               } else {
  532. !                 if ( strchr( "sxzh", tchr ) ) {
  533.                   strcat( new_word, "es" ) ;
  534.                   } else {
  535.                   strcat( new_word, "s" ) ;
  536. --- 989,995 ----
  537.                   strcat( new_word, "ies" ) ;
  538.                   }
  539.               } else {
  540. !                 if ( strchr( "sxzh", (int)tchr ) ) {
  541.                   strcat( new_word, "es" ) ;
  542.                   } else {
  543.                   strcat( new_word, "s" ) ;
  544. ***************
  545. *** 968,976 ****
  546.               }
  547.               break ;
  548.               case 'P':    /* cloudy -> cloudiness */
  549. !             tchr = tolower(new_word[pre_length-1]) ;
  550.               if ( tchr == 'y' ) {
  551. !                 ttchr = tolower(new_word[pre_length-2]) ;
  552.                   if ( Vowel(ttchr) ) {
  553.                   strcat( new_word, "ness" ) ;
  554.                   } else {
  555. --- 997,1005 ----
  556.               }
  557.               break ;
  558.               case 'P':    /* cloudy -> cloudiness */
  559. !             tchr = sftolower(new_word[pre_length-1]) ;
  560.               if ( tchr == 'y' ) {
  561. !                 ttchr = sftolower(new_word[pre_length-2]) ;
  562.                   if ( Vowel(ttchr) ) {
  563.                   strcat( new_word, "ness" ) ;
  564.                   } else {
  565. ***************
  566. *** 994,1000 ****
  567.       } while ( search_word ) ;
  568.       } else {
  569.       /* first call, so check if we need to permute */
  570. !     if ( wc = strchr( dict_word, '/' ) ) {
  571.           /* GNU ispell format detected, so save word and permutations */
  572.           strncpy( perm_word, dict_word, wc-dict_word ) ;
  573.           perm_word[wc-dict_word] = '\0' ;
  574. --- 1023,1029 ----
  575.       } while ( search_word ) ;
  576.       } else {
  577.       /* first call, so check if we need to permute */
  578. !     if ( wc = strchr( dict_word, (int)'/' ) ) {
  579.           /* GNU ispell format detected, so save word and permutations */
  580.           strncpy( perm_word, dict_word, wc-dict_word ) ;
  581.           perm_word[wc-dict_word] = '\0' ;
  582. ***************
  583. *** 1357,1363 ****
  584.   {
  585.   char *ps ;
  586.   
  587. !     if ( ps = malloc( strlen( s ) + 1 ) ) {
  588.       strcpy( ps, s ) ;
  589.       }
  590.       return( ps ) ;
  591. --- 1386,1392 ----
  592.   {
  593.   char *ps ;
  594.   
  595. !     if ( ps = (char *)malloc( strlen( s ) + 1 ) ) {
  596.       strcpy( ps, s ) ;
  597.       }
  598.       return( ps ) ;
  599. diff -c ../old/phonewrd.c ./phonewrd.c../old/phonewrd.txt ./phonewrd.txt
  600. *** ../old/phonewrd.txt    Fri Jul 30 09:50:03 1993
  601. --- ./phonewrd.txt    Fri Jul 30 09:50:17 1993
  602. ***************
  603. *** 60,66 ****
  604.   
  605.   
  606.   
  607. !                     - 1 -       Formatted:  June 23, 1993
  608.   
  609.   
  610.   
  611. --- 60,66 ----
  612.   
  613.   
  614.   
  615. !                     - 1 -       Formatted:  July 16, 1993
  616.   
  617.   
  618.   
  619. ***************
  620. *** 126,132 ****
  621.   
  622.   
  623.   
  624. !                     - 2 -       Formatted:  June 23, 1993
  625.   
  626.   
  627.   
  628. --- 126,132 ----
  629.   
  630.   
  631.   
  632. !                     - 2 -       Formatted:  July 16, 1993
  633.   
  634.   
  635.   
  636. ***************
  637. *** 192,198 ****
  638.   
  639.   
  640.   
  641. !                     - 3 -       Formatted:  June 23, 1993
  642.   
  643.   
  644.   
  645. --- 192,198 ----
  646.   
  647.   
  648.   
  649. !                     - 3 -       Formatted:  July 16, 1993
  650.   
  651.   
  652.   
  653. ***************
  654. *** 258,264 ****
  655.   
  656.   
  657.   
  658. !                     - 4 -       Formatted:  June 23, 1993
  659.   
  660.   
  661.   
  662. --- 258,264 ----
  663.   
  664.   
  665.   
  666. !                     - 4 -       Formatted:  July 16, 1993
  667.   
  668.   
  669.   
  670. ***************
  671. *** 324,330 ****
  672.   
  673.   
  674.   
  675. !                     - 5 -       Formatted:  June 23, 1993
  676.   
  677.   
  678.   
  679. --- 324,330 ----
  680.   
  681.   
  682.   
  683. !                     - 5 -       Formatted:  July 16, 1993
  684.   
  685.   
  686.   
  687.  
  688. exit 0 # Just in case...
  689.