#
# $Id: english.aff,v 1.1 2003/04/27 00:36:40 khendricks Exp $
#
# Copyright 1992, 1993, Geoff Kuenning, Granada Hills, CA
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# 1. Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in the
#    documentation and/or other materials provided with the distribution.
# 3. All modifications to the source code must be clearly marked as
#    such.  Binary redistributions based on modified source code
#    must be clearly marked as modified versions in the documentation
#    and/or other materials provided with the distribution.
# 4. All advertising materials mentioning features or use of this software
#    must display the following acknowledgment:
#      This product includes software developed by Geoff Kuenning and
#      other unpaid contributors.
# 5. The name of Geoff Kuenning may not be used to endorse or promote
#    products derived from this software without specific prior
#    written permission.
#
# THIS SOFTWARE IS PROVIDED BY GEOFF KUENNING AND CONTRIBUTORS ``AS IS'' AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED.  IN NO EVENT SHALL GEOFF KUENNING OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
#
#	Affix table for English
#
# $Log: english.aff,v $
# Revision 1.1  2003/04/27 00:36:40  khendricks
# trying to move all of the pieces from
# whiteboard/www/lingucomponent to
# lingucomponent/www/
#
# Revision 1.1  2001/10/12 19:32:33  khendricks
# adding the remainder of the lingucomponent website
#
# Kevin
#
# Revision 1.16  1995/01/08  23:23:59  geoff
# Add a NeXT to the defstringtype statement so that nextispell can
# select it.
#
# Revision 1.15  1994/01/25  07:12:40  geoff
# Get rid of all old RCS log lines in preparation for the 3.1 release.
#
#

nroffchars	().\\*
texchars	()\[]{}<\>\\$*.%

# First we declare the character set.  Since it's English, it's easy.
# The only special character is the apostrophe, so that possessives can
# be handled.  We declare it as a boundary character, so that quoting with
# single quotes doesn't confuse things.  The apostrophe is the only
# character that gets such treatment.
#
# We declare the apostrophe first so that "Jon's" collates before "Jonas".
# (This is the way ASCII does it).
#

defstringtype "nroff" "nroff" ".mm" ".ms" ".me" ".man" ".NeXT"

boundarychars '
wordchars [a-z] [A-Z]

altstringtype "tex" "tex" ".tex" ".bib"

# Here's a record of flags used, in case you want to add new ones.
# Right now, we fit within the minimal MASKBITS definition.
#
#            ABCDEFGHIJKLMNOPQRSTUVWXYZ
# Used:      *  *  ****  ** * ***** ***
#            A  D  GHIJ  MN P RSTUV XYZ
# Available:  -- --    --  - -     -
#             BC EF    KL  O Q     W

# Now the prefix table.  There are only three prefixes that are truly
# frequent in English, and none of them seem to need conditional variations.
#
prefixes

flag *A:
    .		>	RE		# As in enter > reenter

flag *I:
    .		>	IN		# As in disposed > indisposed

flag *U:
    .		>	UN		# As in natural > unnatural

# Finally, the suffixes.  These are exactly the suffixes that came out
# with the original "ispell";  I haven't tried to improve them.  The only
# thing I did besides translate them was to add selected cross-product flags.
#
suffixes

flag V:
    E		>	-E,IVE		# As in create > creative
    [^E]	>	IVE		# As in prevent > preventive

flag *N:
    E		>	-E,ION		# As in create > creation
    Y		>	-Y,ICATION	# As in multiply > multiplication
    [^EY]	>	EN		# As in fall > fallen

flag *X:
    E		>	-E,IONS		# As in create > creations
    Y		>	-Y,ICATIONS	# As in multiply > multiplications
    [^EY]	>	ENS		# As in weak > weakens

flag H:
    Y		>	-Y,IETH		# As in twenty > twentieth
    [^Y]	>	TH		# As in hundred > hundredth

flag *Y:
    .		>	LY		# As in quick > quickly

flag *G:
    E		>	-E,ING		# As in file > filing
    [^E]	>	ING		# As in cross > crossing

flag *J:
    E		>	-E,INGS		# As in file > filings
    [^E]	>	INGS		# As in cross > crossings

flag *D:
    E		>	D		# As in create > created
    [^AEIOU]Y	>	-Y,IED		# As in imply > implied
    [^EY]	>	ED		# As in cross > crossed
    [AEIOU]Y	>	ED		# As in convey > conveyed

flag T:
    E		>	ST		# As in late > latest
    [^AEIOU]Y	>	-Y,IEST		# As in dirty > dirtiest
    [AEIOU]Y	>	EST		# As in gray > grayest
    [^EY]	>	EST		# As in small > smallest

flag *R:
    E		>	R		# As in skate > skater
    [^AEIOU]Y	>	-Y,IER		# As in multiply > multiplier
    [AEIOU]Y	>	ER		# As in convey > conveyer
    [^EY]	>	ER		# As in build > builder

flag *Z:
    E		>	RS		# As in skate > skaters
    [^AEIOU]Y	>	-Y,IERS		# As in multiply > multipliers
    [AEIOU]Y	>	ERS		# As in convey > conveyers
    [^EY]	>	ERS		# As in build > builders

flag *S:
    [^AEIOU]Y	>	-Y,IES		# As in imply > implies
    [AEIOU]Y	>	S		# As in convey > conveys
    [SXZH]	>	ES		# As in fix > fixes
    [^SXZHY]	>	S		# As in bat > bats

flag *P:
    [^AEIOU]Y	>	-Y,INESS	# As in cloudy > cloudiness
    [AEIOU]Y	>	NESS		# As in gray > grayness
    [^Y]	>	NESS		# As in late > lateness

flag *M:
    .		>	'S		# As in dog > dog's
