home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume4 / nspell < prev    next >
Internet Message Format  |  1989-02-03  |  6KB

  1. Path: xanth!nic.MR.NET!hal!ncoast!allbery
  2. From: argv@maui.UUCP (Dan Heller)
  3. Newsgroups: comp.sources.misc
  4. Subject: v04i129: yet another spelling checker
  5. Message-ID: <8810160134.AA08817@maui.island.uucp>
  6. Date: 22 Oct 88 01:20:28 GMT
  7. Sender: allbery@ncoast.UUCP
  8. Reply-To: argv@maui.UUCP (Dan Heller)
  9. Lines: 212
  10. Approved: allbery@ncoast.UUCP
  11.  
  12. Posting-number: Volume 4, Issue 129
  13. Submitted-by: "Dan Heller" <argv@maui.UUCP>
  14. Archive-name: nspell
  15.  
  16. [Wants csh and "look" (a BSD-only program); also hardcoded paths galore.  ++bsa]
  17.  
  18. Here's yet another spelling checker given the wave of spelling
  19. checkers being posted.  However, this is more of an exercize in
  20. csh shell script writing.
  21.  
  22. The program uses many unix commands that should be available
  23. on all unix systems, but if they aren't or options aren't supported,
  24. let me know.  It assumes that programs are located in specific
  25. directories (like /usr/bin/spell and /usr/lib/spell)
  26.  
  27. There is a variable called BSD which can be set on or off,
  28. but I don't know what'll happen to sys-v boxes if it's off.
  29. Please send comments, bug fixes and other humorous material
  30. to island!argv@sun.com
  31. --------------------
  32. #!/bin/csh -f
  33. # This file is csh code to do an interactive spelling checker/correcter.
  34. # This shell script was written by Dan Heller one late night in 1985.
  35.  
  36. set BSD = 1        # set to 0 if you're NOT on a BSD system.
  37. onintr Quit
  38. set dict = "dict"
  39. set noglob
  40. set err_msg = "usage: $0 [-p privdict] file"
  41. @ argc = 1
  42. if (! $?PAGER) setenv PAGER more
  43.  
  44. if ( $#argv < 1 ) then
  45.     echo $err_msg
  46.     goto Quit
  47. endif
  48. if ( $argv[1] == '-p' ) then
  49.     @ argc = 3
  50.     set dict = $argv[2]
  51. endif
  52. if ( $argc > $#argv ) echo $err_msg
  53. while ( $argc <= $#argv )
  54.     set file = $argv[$argc]
  55.     @ argc++
  56.     /bin/cp /dev/null $$words
  57.     /bin/echo -n Looking for misspelled words in the file \"$file\" ...
  58.     /usr/bin/spell $file >! $$temp
  59.     set total = ( `wc -l $$temp` ) #get the size of the misspelled words file
  60.     echo Found $total[1] words.
  61.     if (-e $dict) then
  62.     /bin/echo -n Checking against words in \"$dict\"...
  63.     foreach w ( `cat $$temp` )
  64.         grep -s \\\<$w\\\> $dict    # for those who don't have -w with grep
  65.         if ($status == 1) echo $w >> $$words  # use if not in dict
  66.     end
  67.     /bin/rm $$temp
  68.     else
  69.     /bin/echo -n No private dictionary to check.
  70.     /bin/mv $$temp $$words
  71.     endif
  72.     if (-z $$words) then
  73.     echo no misspelled words
  74.     continue
  75.     endif
  76.     echo " "
  77.     set total = ( `wc -l $$words` ) #get the size of the misspelled words file
  78.     @ total = $total[1]            #set count to be an int variable
  79.     @ count = 1
  80.     /bin/echo Found $total misspelled words in \"$file\"
  81.     @ backup = 0
  82.     echo Type ? for help.
  83. mark:
  84.     while ($count <= $total)
  85.     set word = `sed -n ${count}p $$words`
  86.     if ($backup > 0) echo -n "> "
  87.     echo -n "$count) $word? "
  88.     if ( $BSD ) then
  89.         set newword = $<   # prompt for respelling of word.
  90.     else
  91.         set newword = `gets`
  92.     endif
  93.     if ( "$newword" == '' ) then
  94.         if ($backup == 0) then
  95.         echo $word >> $dict
  96.         else @ backup--
  97.         endif
  98.         @ count++
  99.         continue
  100.     endif
  101.     if ( "$newword" == '?' ) then
  102.         echo $err_msg
  103.         cat <<END
  104. "dictfile" is a list of your own words that you know
  105. are not misspelled or from a previous nspell session.
  106. Words found to be misspelled that you say are correct are 
  107. appended to the private dictionary.
  108.  
  109. > 3) thanx?
  110.  
  111. Possible responses:
  112.   RETURN    -- word is right, add it to the dictionary.
  113.   b         -- go back to the previous word.
  114.   l pattern -- look for pattern in dictionary.
  115.   s         -- search for 'thanx' in your file. (via grep)
  116.   d         -- don't save word, but it's correct.
  117.   D         -- Delete all occurances of this word.
  118.   ?         -- prints this list.
  119.   Q         -- Quit: don't correct words.
  120.   q         -- quit, correct words so far.
  121.   thanks    -- Attempted correct spelling.
  122.  
  123. If there is a > before the word, this means that you've
  124. already visited this word (you had backed up over it).
  125. RETURN will use the previous spelling if you had corrected it.
  126.  
  127. END
  128.         continue
  129.     endif
  130.     if ("$newword" == 'b') then
  131.         if ($count == 1) echo You\'re at the first word already.
  132.         if ($count > 1) then
  133.         @ count--
  134.         @ backup++
  135.         endif
  136.         continue
  137.     endif
  138.     if ("$newword" == 's') then
  139.         echo " "
  140.         echo in file \"$file\":
  141.         grep -n \\\<$word\\\> $file   # some systems don't have -w with grep
  142.         echo " "
  143.         continue
  144.     endif
  145.     set Newword = ( $newword )
  146.     if ($Newword[1] == 'l' || $Newword[1] == 'look') then
  147.         echo " "
  148.         /usr/bin/look $Newword[2] | $PAGER    # look bur*c doesn't work
  149.         echo " "
  150.         continue
  151.     endif
  152.     if ("$newword" == 'D') then
  153.         set newword = ""
  154.         goto force_feed
  155.     endif
  156.     if ("$newword" == 'd') then
  157.         @ count++
  158.         continue
  159.     endif
  160.     if ("$newword" == 'Q') then
  161.         echo " "
  162.         echo " Exiting: no changes made."
  163.         goto Quit 
  164.     endif
  165.     if ("$newword" == 'q') goto break
  166.     echo $newword | /usr/lib/spell /usr/dict/hlista $$misp > /dev/null
  167.     if ( -z $$misp ) then
  168.         if (-e $dict) then
  169.         grep -s "\\\<$newword\\\>" $dict
  170.         else goto cont
  171.         endif
  172.         if ($status == 0) then
  173. cont:
  174.         echo \"$newword\" seems to be misspelled also.
  175.         /bin/echo -n "Is it correct? [n] "
  176.         if ( $BSD ) then
  177.             set answer = ( $< )
  178.         else
  179.             set answer = ( `gets` )
  180.         endif
  181.         if ( $answer == 'y' ) then
  182.             echo $newword >> $dict
  183.         else 
  184.             continue
  185.         endif
  186.         endif
  187.     endif
  188. force_feed:
  189.     if ($backup > 0) then
  190.         (echo "g/\<$word\>/d";echo "w") | ex - $$newfile > /dev/null
  191.         if (-e dict) then
  192.         (echo "g/\<$word\>/d";echo "w") | ex - $dict >/dev/null
  193.         endif
  194.         @ backup--
  195.     endif
  196.     /bin/echo "%s/\<$word\>/$newword/g" >> $$newfile
  197.     @ count++
  198.     end
  199.     echo -n "Done. Hit return to continue, or 'b' to back..."
  200.     if ( $BSD ) then
  201.     set answer = ( $< )
  202.     else
  203.     set answer = ( `gets` )
  204.     endif
  205.     if ( $answer == 'b' ) then
  206.     @ count--
  207.     @ backup = 1
  208.     goto mark
  209.     endif
  210.     break:
  211.     if ( -z $$newfile || ! -e $$newfile ) then
  212.     echo No misspelled words
  213.     continue
  214.     endif
  215.     echo "w" >> $$newfile
  216.     echo -n Correcting misspelled words in file \"$file\"...
  217.     # cp $$newfile fixes  # for debugging
  218.     ex - $file < $$newfile
  219.     echo " done."
  220. end # main loop
  221. Quit:
  222. unset noglob
  223. /bin/rm -f $$*
  224.