1#!/bin/ksh -
2#
3# $OpenBSD: spell.ksh,v 1.12 2019/01/25 00:19:26 millert Exp $
4#
5# Copyright (c) 2001, 2003 Todd C. Miller <millert@openbsd.org>
6#
7# Permission to use, copy, modify, and distribute this software for any
8# purpose with or without fee is hereby granted, provided that the above
9# copyright notice and this permission notice appear in all copies.
10#
11# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18#
19# Sponsored in part by the Defense Advanced Research Projects
20# Agency (DARPA) and Air Force Research Laboratory, Air Force
21# Materiel Command, USAF, under agreement number F39502-99-1-0512.
22#
23SPELLPROG=/usr/libexec/spellprog
24DICT=/usr/share/dict/words
25LOCAL_DICT=/usr/local/share/dict/words
26STOP=/usr/share/dict/stop
27LOCAL_STOP=/usr/local/share/dict/stop
28AMERICAN=/usr/share/dict/american
29BRITISH=/usr/share/dict/british
30LANG=$AMERICAN
31STOP_LANG=$BRITISH
32EXTRA=
33FLAGS=
34DEROFF="deroff -w"
35HISTFILE=
36TMP=`mktemp /tmp/spell.XXXXXXXX` || exit 1
37VTMP=
38USAGE="usage: spell [-biltvx] [-d list] [-h spellhist] [-m a | e | l | m | s]\n\t[-s list] [+extra_list] [file ...]"
39
40set -o posix		# set POSIX mode to prevent +foo in getopts
41OPTIND=1		# force getopts to reset itself
42
43trap "rm -f $TMP $VTMP; exit 0" 0 1 2 15
44
45# Use local word/stop lists if they exist
46if [ -f $LOCAL_DICT ]; then
47	DICT="$DICT $LOCAL_DICT"
48fi
49if [ -f $LOCAL_STOP ]; then
50	STOP="$STOP $LOCAL_STOP"
51fi
52
53while getopts "biltvxd:h:m:s:" c; do
54	case $c in
55	b)	LANG=$BRITISH
56		STOP_LANG=$AMERICAN
57		FLAGS[${#FLAGS[@]}]="-b"
58		;;
59	i)	DEROFF="$DEROFF -i"
60		;;
61	l)	DEROFF="delatex"
62		;;
63	m)	DEROFF="$DEROFF -m $OPTARG"
64		;;
65	t)	DEROFF="detex -w"
66		;;
67	v)	VTMP=`mktemp /tmp/spell.XXXXXXXX` || {
68			rm -f ${TMP}
69			exit 1
70		}
71		FLAGS[${#FLAGS[@]}]="-v"
72		FLAGS[${#FLAGS[@]}]="-o"
73		FLAGS[${#FLAGS[@]}]="$VTMP"
74		;;
75	x)	FLAGS[${#FLAGS[@]}]="-x"
76		;;
77	d)	DICT="$OPTARG"
78		LANG=
79		;;
80	s)	STOP="$OPTARG"
81		STOP_LANG=
82		LOCAL_STOP=
83		;;
84	h)	HISTFILE="$OPTARG"
85		;;
86	*)	echo "$USAGE" 1>&2
87		exit 1
88		;;
89	esac
90done
91shift $(( $OPTIND - 1 ))
92
93while test $# -ne 0; do
94	case "$1" in
95		+*)	EXTRA="$EXTRA ${1#+}"
96			shift
97			;;
98		*)	break
99			;;
100	esac
101done
102
103# Any parameters left are files to be checked, pass them to deroff
104DEROFF="$DEROFF $@"
105
106if [ -n "$HISTFILE" ]; then
107	$DEROFF | sort -u | $SPELLPROG -o $TMP $STOP $STOP_LANG | \
108	    $SPELLPROG ${FLAGS[*]} $DICT $LANG $EXTRA | sort -u -k1f - $TMP | \
109	    tee -a $HISTFILE
110	who -m >> $HISTFILE
111else
112	$DEROFF | sort -u | $SPELLPROG -o $TMP $STOP $STOP_LANG | \
113	    $SPELLPROG ${FLAGS[*]} $DICT $LANG $EXTRA | sort -u -k1f - $TMP
114fi
115
116if [ -n "$VTMP" ]; then
117	sort -u -k2f -k1 $VTMP
118fi
119
120exit 0
121