[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

[hunspell] 49/98: Imported Upstream version 1.2.2~b2~20080401



This is an automated email from the git hooks/post-receive script.

rene pushed a commit to branch master
in repository hunspell.

commit 0593209d0c0ed0f846a80f9bfd4e927ac7fb5a98
Author: Rene Engelhard <rene@debian.org>
Date:   Thu Apr 21 14:45:18 2016 +0200

    Imported Upstream version 1.2.2~b2~20080401
---
 BUGS                           |   4 +-
 ChangeLog                      |  55 ++-
 NEWS                           |   6 +-
 configure                      |  20 +-
 configure.ac                   |   4 +-
 man/hu/hunspell.4              | 847 +++++++++++++++++++++++++----------------
 man/hunspell.1                 |  12 +-
 man/hunspell.4                 |  26 +-
 po/hu.gmo                      | Bin 7564 -> 7563 bytes
 po/hu.po                       |   2 +-
 src/hunspell/Makefile.am       |   2 +-
 src/hunspell/Makefile.in       |   2 +-
 src/hunspell/affentry.cxx      | 107 +++---
 src/hunspell/affixmgr.cxx      |  41 +-
 src/hunspell/affixmgr.hxx      |   2 +
 src/hunspell/atypes.hxx        |  14 +-
 src/hunspell/csutil.cxx        |  12 +-
 src/hunspell/csutil.hxx        |  16 +-
 src/hunspell/hashmgr.cxx       |   2 +-
 src/hunspell/htypes.hxx        |   4 -
 src/hunspell/hunspell.cxx      |  12 +-
 src/hunspell/hunspell.h        |  35 +-
 src/hunspell/hunspell.hxx      |   5 +-
 src/hunspell/hunzip.cxx        |  17 +-
 src/hunspell/phonet.cxx        |   2 +-
 src/hunspell/phonet.hxx        |   4 +-
 src/hunspell/suggestmgr.cxx    |   3 +-
 src/hunspell/w_char.hxx        |  19 +
 src/tools/affixcompress        |  13 +-
 src/tools/analyze.cxx          |   2 +-
 src/tools/chmorph.cxx          |  14 +-
 src/tools/hunspell.cxx         | 223 ++++++++---
 src/tools/makealias            |  34 +-
 src/win_api/Hunspell.rc        |  10 +-
 src/win_api/config.h           |   4 +-
 src/win_api/libhunspell.vcproj |  20 +
 tests/circumfix.morph          |   4 +-
 tests/rep.aff                  |   3 +-
 38 files changed, 1038 insertions(+), 564 deletions(-)

diff --git a/BUGS b/BUGS
index 98558e1..cb0ea7f 100644
--- a/BUGS
+++ b/BUGS
@@ -1,7 +1,5 @@
-* Interactive interface has some visualisation problem with UTF-8 characters
+* Interactive interface has some visualization problem with long lines
 
 * -U, -u options doesn't support Unicode.
 
 * Compound handling is not thread safe in Hungarian specific code
-
-* stemming is experimental and incomplete
diff --git a/ChangeLog b/ChangeLog
index 46d1473..3216f5b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,58 @@
-2007-11-16 Németh László <nemeth at OOo>:
+* src/hunspell.h: add DLL macro for  Flemming Frandsen
+
+- add per mille to LANG hu_HU section
+
+új makealias
+ivóvíz tiltási probléma!!!
+- több szótár::
+hu_HU_geo
+hu_HU_politics
+hu_HU_
+NAME magyar geológiai szakszótár
+
+- időkorlát a generáláshoz???
+- valami optimalizálás kell
+
+
+- DEBUG mode: -m
+- m: analyze or flag debug mode
+- s: stems
+
+- hunzip.cxx: explicit binary read for Windows (fopen(,"rb"))
+
+- szinonimaszótár elkészítése,
+
+- javított javaslattevés???
+ötlet: 
+- nagyon eltérőt ne javasoljon!!!
+- gyorsítás, optimalizálás??? (egy betűs eltérés jav.???)
+- 
+
+Hunspell ui: refresh() for better reaction time!!!
+- fix tabulators 
+- fix different encoding of dic and input, and suggestions
+- long lines: problems
+
+timeless warnings Mozilla (Ryan)
+hunspell.cxx-ben config.h???
+        * man/hunspell.4: fix formatting problem (missing header)
+
+2008-01-30 1882105 Mark McClain: OS X fix on PPC platform
+
+
+- manual!!
+- chmorph vissza!!!!
+HENTRY_DATA át, kitöröl a htypes hiv., máshonnan
+két konstruktor
+* phonet.cxx ->HASHs
+csutill a htypes-hoz
+Ryan: MOZILLA_CLIENT a hunzipba
+
+* tests/rep.aff: fix REP count
+
+2008-01-30 Németh László <nemeth at OOo>:
         - ZWSP, REP, tabulator problems: need for the final release?
+         
 
         * Bug 1851246 IDB_Winshell Visual C, hunspell.cxx, csutil.cxx, hunspelldll.c
 
diff --git a/NEWS b/NEWS
index a68e581..c514e10 100644
--- a/NEWS
+++ b/NEWS
@@ -1,6 +1,6 @@
-2008-01-16: Hunspell 1.2.2 release:
+2008-03-03: Hunspell 1.2.2 release:
   - multiple dictionary (dic file) support to use extra (medical,
-    geographical etc.) dictionaries
+    geographical etc.) dictionaries (tools/example)
 
   - optional compressed dictionary format "hzip" for aff and dic files
 
@@ -8,7 +8,7 @@
     other commercial programs
 
   - new affix compression tool "affixcompress"
-  
+
   - bug fixes
 
 2007-11-01: Hunspell 1.2.1 release:
diff --git a/configure b/configure
index f2d6276..48880d9 100755
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.59 for hunspell 1.2.2b.
+# Generated by GNU Autoconf 2.59 for hunspell 1.2.2.
 #
 # Report bugs to <nemeth@openoffice.org>.
 #
@@ -423,8 +423,8 @@ SHELL=${CONFIG_SHELL-/bin/sh}
 # Identity of this package.
 PACKAGE_NAME='hunspell'
 PACKAGE_TARNAME='hunspell'
-PACKAGE_VERSION='1.2.2b'
-PACKAGE_STRING='hunspell 1.2.2b'
+PACKAGE_VERSION='1.2.2'
+PACKAGE_STRING='hunspell 1.2.2'
 PACKAGE_BUGREPORT='nemeth@openoffice.org'
 
 ac_unique_file="config.h.in"
@@ -954,7 +954,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures hunspell 1.2.2b to adapt to many kinds of systems.
+\`configure' configures hunspell 1.2.2 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1021,7 +1021,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of hunspell 1.2.2b:";;
+     short | recursive ) echo "Configuration of hunspell 1.2.2:";;
    esac
   cat <<\_ACEOF
 
@@ -1171,7 +1171,7 @@ fi
 test -n "$ac_init_help" && exit 0
 if $ac_init_version; then
   cat <<\_ACEOF
-hunspell configure 1.2.2b
+hunspell configure 1.2.2
 generated by GNU Autoconf 2.59
 
 Copyright (C) 2003 Free Software Foundation, Inc.
@@ -1185,7 +1185,7 @@ cat >&5 <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by hunspell $as_me 1.2.2b, which was
+It was created by hunspell $as_me 1.2.2, which was
 generated by GNU Autoconf 2.59.  Invocation command line was
 
   $ $0 $@
@@ -1913,7 +1913,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE=hunspell
- VERSION=1.2.2b
+ VERSION=1.2.2
 
 
 cat >>confdefs.h <<_ACEOF
@@ -23881,7 +23881,7 @@ _ASBOX
 } >&5
 cat >&5 <<_CSEOF
 
-This file was extended by hunspell $as_me 1.2.2b, which was
+This file was extended by hunspell $as_me 1.2.2, which was
 generated by GNU Autoconf 2.59.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -23944,7 +23944,7 @@ _ACEOF
 
 cat >>$CONFIG_STATUS <<_ACEOF
 ac_cs_version="\\
-hunspell config.status 1.2.2b
+hunspell config.status 1.2.2
 configured by $0, generated by GNU Autoconf 2.59,
   with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
 
diff --git a/configure.ac b/configure.ac
index 19ec498..0e580d0 100644
--- a/configure.ac
+++ b/configure.ac
@@ -4,12 +4,12 @@
 m4_pattern_allow
 
 AC_PREREQ(2.59)
-AC_INIT([hunspell],[1.2.2b],[nemeth@openoffice.org])
+AC_INIT([hunspell],[1.2.2],[nemeth@openoffice.org])
 
 AC_CANONICAL_SYSTEM
 AC_SUBST(XFAILED)
 
-AM_INIT_AUTOMAKE(hunspell, 1.2.2b)
+AM_INIT_AUTOMAKE(hunspell, 1.2.2)
 HUNSPELL_VERSION_MAJOR=`echo $VERSION | cut -d"." -f1`
 HUNSPELL_VERSION_MINOR=`echo $VERSION | cut -d"." -f2`
 AC_SUBST(HUNSPELL_VERSION_MAJOR)
diff --git a/man/hu/hunspell.4 b/man/hu/hunspell.4
index 904bb0e..8932c4b 100644
--- a/man/hu/hunspell.4
+++ b/man/hu/hunspell.4
@@ -1,28 +1,28 @@
 .hla hu
-.TH hunspell 4 "2005. m�jus 13."
+.TH hunspell 4 "2005. május 13."
 .LO 1
-.SH N�V
-hunspell \- a Hunspell �llom�nyainak form�tuma
-.SH LE�R�S
+.SH NÉV
+hunspell \- a Hunspell állományainak formátuma
+.SH LEÍRÁS
 A
 .IR Hunspell (1)
-k�t �llom�nyt ig�nyel egy adott nyelven t�rt�n� helyes�r�s\-ellen�rz�shez.
-Az els� �llom�ny egy sz�t�r�llom�ny, ami az adott nyelv szavait, �s
-ezek kapcsol�it (attrib�tumait) tartalmazza. A m�sodik �llom�ny
-egy ragoz�si (affixum) �llom�ny, ami meghat�rozza az eml�tett
-kapcsol�k jelent�s�t. A \fIhunspell\fR, ellent�tben az \fIispell\fR\-lel, 
-k�zvetlen�l haszn�lja fel ezeket az �llom�nyokat, teh�t nem
-k�pez bel�l�k bin�ris (.hash kiterjeszt�s�) �llom�nyt (l.
-.IR ispell "(4))."
-.SH SZ�T�R�LLOM�NY
+két állományt igényel egy adott nyelven történő helyesírás\-ellenőrzéshez.
+Az első állomány egy szótárállomány, ami az adott nyelv szavait, és
+ezek kapcsolóit (attribútumait) tartalmazza. A második állomány
+egy ragozási (affixum) állomány, ami meghatározza az említett
+kapcsolók jelentését. 
+
+.SH SZÓTÁRÁLLOMÁNY
 Egy hunspell
-.B sz�t�r�llom�ny
-els� sora a sz�t�r�llom�nyban
-l�v� szavak sz�m�t tartalmazza. A t�bbi sor soronk�nt egy
-sz�t tartalmaz. Minden sz� ut�n nem k�telez�en egy
-perjel, �s egy, vagy t�bb kapcsol� k�vetkezhet. A
-kapcsol�k egybet�sek, �s meghat�rozz�k, hogy milyen
-toldal�kokat kaphat a t�sz�. P�ld�ul a
+.B szótárállomány
+(*.dic) első sora a szótárállományban
+lévő szavak közelítő számát tartalmazza (az optimális méretű
+memóriaterület lefoglalásához). A többi sor soronként egy
+szót tartalmaz. Minden szó után nem kötelezően egy
+perjel, és egy, vagy több kapcsoló következhet. A
+kapcsolók egybetűsek, és meghatározzák, hogy milyen
+toldalékokat kaphat a tőszó, illetve milyen egyéb speciális
+tulajdonságokkal rendelkezik. Például a
 .PP
 .RS
 .nf
@@ -31,47 +31,66 @@ hunspellezik/EeX
 .fi
 .RE
 .PP
-sz�t�r egy sz�t tartalmaz (hunspell), ami a magyar ragoz�si
-�llom�ny alapj�n alanyi �s t�rgyas igeragoz�st is
-vonz (E �s e kapcsol�k), valamint igek�t� prefixumokat is
-kaphat. A p�lda sz�t�r�llom�ny �s a magyar ragoz�si
-�llom�ny alapj�n a \fImeghunspellezt�tek\fR helyes sz�k�nt
-ker�lne felismer�sre.
-.PP
-Morfol�giai le�r�st adhatunk meg a tabul�torjellel
-elv�lasztott m�sodik mez�ben:
+szótár egy szót tartalmaz (hunspell), ami a magyar ragozási
+állomány alapján alanyi és tárgyas igeragozást is
+vonz (E és e kapcsolók), valamint igekötő prefixumokat is
+kaphat. A példa szótárállomány és a magyar ragozási
+állomány alapján a \fImeghunspelleztétek\fR helyes szóként
+kerülne felismerésre.
+
+A szótári szavak perjelet is tartalmazhatnak, ha
+az fordított perjellel van bevezetve: "\/". A kapcsolók
+alapértelmezésként egy karakteresek, de ha több ragozási
+osztályt szeretnénk használni, ez több karakteresre vagy számra is
+módosítható.
+
+A Hunspell szótárállományok sorai kiegészítő adatmezőket is tartalmazhatnak,
+amelyek szóközökkel vagy tabulátorokkal vannak elválasztva (l. kiegészítő
+adatmezők).
+
+A személyes szótárak egyszerű szólisták. Megadhatunk
+perjellel elválasztott példaszavakat is a toldalékolás engedélyezésére:
+
 .PP
 .RS
 .nf
-1
-hunspellezik/EeX	[IGE]
+Obama/Tamara
 .fi
 .RE
 .PP
-.SH RAGOZ�SI �LLOM�NY
+
+A példában a Tamara szó toldalékolását a személyes szótár
+Obama szavára is alkalmazza az ellenőrző, elfogadva az Obamáról,
+Obamáékat stb. alakokat is.
+
+.SH RAGOZÁSI ÁLLOMÁNY
 A
-.B "ragoz�si �llom�ny"
-rendszerint kisebb m�ret�, �s k�l�nf�le defin�ci�k mellett
-a ragoz�si szab�lyokat adja meg.
+.B "ragozási állomány"
+rendszerint kisebb méretű. Különféle definíciókat és
+ragozási szabályokat ad meg meghatározott kulcsszóival. Például a
+.B SET
+a karakterkódolás, a
+.B TRY
+javaslattevésnél módosítot betűk, a
+.B REP
+a javaslattevésnél módosított szórészletek, a
+.B PFX
+és az
+.B SFX
+pedig a szó elejére és végére illesztendő toldalékok megadására szolgál.
+
+A következő példa egy UTF\-8-as kódolású szótár affixumállományának
+definíciója. A TRY felsorolja a magyar betűket gyakorisági sorrendjükben,
+a LANG beállítja a magyar nyelvet, a WORDCHARS megadja azokat a karaktereket,
+amelyeket a parancssori Hunspell a szavak részeként fog kezelni.
+
 .PP
 .RS
 .nf
-SET ISO8859\-2
-TRY ������taeslz�norhgki�dmy�pv�bucfj��xwqTAESLZ�NORHGKI�DMY�PV�BUCFJ��XWQ\-.
+SET UTF\-8
+TRY íóúÍÓÚtaeslzánorhgkiédmyőpvöbucfjüűxwqTAESLZÁNORHGKIÉDMYŐPVÖBUCFJÜŰXWQ\-.
 LANG hu_HU
-COMPOUNDMIN 2
-COMPOUNDFLAG Y
-COMPOUNDWORDMAX 2
-COMPOUNDROOT y
-COMPOUNDSYLLABLE 6 a�e�i�o���u���
-SYLLABLENUM klmc
-COMPOUNDBEGIN v
-COMPOUNDEND x
-FORBIDDENWORD w
-PSEUDOROOT u
-ACCENT ��������� aeiooouuu
-WORDCHARS \-.�%�0123456789
-LEMMA_PRESENT (
+WORDCHARS \-.§%‰°0123456789
 
 REP 2
 REP j ly
@@ -79,303 +98,483 @@ REP ly j
 
 PFX X Y 3
 PFX X   0    meg          .
-PFX X   0    r�           .
-PFX X   0    �ssze        .
+PFX X   0    rá           .
+PFX X   0    össze        .
 
 SFX e Y 6
-SFX e   ik   t�k          e[dz]ik
-SFX e   ik   t�tek        e[dz]ik
-SFX e   ik   t�k          e[dz]ik
-SFX e   0    t�k          e[dzt]
-SFX e   0    t�tek        e[dzt]
-SFX e   0    t�k          e[dzt]
+SFX e   ik   tük          e[dz]ik
+SFX e   ik   tétek        e[dz]ik
+SFX e   ik   ték          e[dz]ik
+SFX e   0    tük          e[dzt]
+SFX e   0    tétek        e[dzt]
+SFX e   0    ték          e[dzt]
 
 SFX f Y 2
-SFX f   ik   het/e        e[dz]ik   [hAt]
-SFX f   ik   tet/e        e[dz]ik   [tAt]
+SFX f   ik   het/e        e[dz]ik
+SFX f   ik   tet/e        e[dz]ik
+.fi
+.RE
+.PP
+
+A REP a j és ly felcserélése esetén ad jó és elöl rangsorolt
+javaslatokat. A PFX-ek pár igekötőt definiálnak, az SFX-ek
+pedig pár igeragot. Ezek nagyobb részénél a szó végi ik is levágásra
+kerül a toldalék illesztése előtt. Itt az illesztés feltétele, hogy az
+igék -edik vagy -ezik karaktersorozatra végződjenek, különben pedig
+az -ed, -ez vagy -et betűkre. Az f jelű toldalékolási osztály
+érdekessége, hogy a -het és -tet illesztése után még folytatódhat
+a toldalékolás az e jelű toldalékolási osztállyal (ezt a het/e
+ls tet/e határozza meg), így kaphat -hettük, -hettétek, -hették,
+-tettük, -tettétek, -tették toldalékokat a szótárban szereplő
+levelezik szó:
+
+.PP
+.RS
+.nf
+1
+levelezik/e
+.fi
+.RE
+.PP
+
+.SH "ÁLTALÁNOS PARAMÉTEREK"
+.IP "SET karakterkód"
+A szótár és affixumállomány karakterkódolásának beállítása.
+A lehetséges értékek: UTF-8, ISO8859\-1-től ISO8859\-10-ig, 
+ISO8859\-13\-ISO8859\-15, KOI8-R, KOI8-U, microsoft-cp1251, ISCII-DEVANAGARI.
+.IP "FLAG érték"
+A kapcsolók 1 karakteres alapbeállításának módosítása.
+(A ragozási osztályokat és egyéb tulajdonságokat jelölik a kapcsolók,
+amelyek alapértelmezés szerint 1 karakteresek, a pékdákban
+legtöbbször nagybetűvel szerepelnek). Az `UTF-8' értékkel
+Unicode karaktereket használhatunk kapcsolóként (UTF-8 kódolással és
+maximum 65 ezres karakterkódig), a `long' értékkel két karakteres
+kapcsolókat (több kapcsoló esetén sincs elválasztójel, a `num'
+értékkel vesszővel elválasztott decimális számokat 1-től
+65 ezerig.
+.IP "COMPLEXPREFIXES"
+Kétszeres prefixumillesztést állít be (de csak egyszeres szuffixumokat
+az alapértelmezett kettő helyett.) Jobbról balra író ragasztó nyelveknél hasznos.
+.IP "LANG nyelvkód"
+Nyelv megadása (nyelvfüggő programrészek bekapcsolásához) az
+ISO nyelv- és régiókóddal (pl. hu_HU).
+.IP "IGNORE karakterek"
+A felsorolt karaktereket törli a szótári szavakból és toldalékokból,
+valamint a bemeneti szavakból. Hasznos az opcionális írásjelek, mint
+az arab vagy a héber mellékjelek kezelésére.
+.IP "AF a_következő_AF_sorok_száma"
+.IP "AF kapcsolók"
+A Hunspell program képes a kapcsolóhalmazokat egy természetes
+számmal helyettesíteni a szótárállományban 
+és a többszörös toldalékásnál az affixumállományban (alias tömörítés),
+felgyorsítva ezzel a szótár betöltődését és csökkentve a program
+memóriaigényét. Egy rövid példa:
+.PP
+.RS
+.nf
+3
+hello
+try/1
+work/2
+.fi
+.RE
+.PP
+És a kapcsolódó AF definíciók az affixumállományban:
+.PP
+.RS
+.nf
+SET UTF-8
+TRY esianrtolcdugmphbyfvkwzESIANRTOLCDUGMPHBYFVKWZ'
+AF 2
+AF A
+AF AB
+...
+.fi
+.RE
+.PP
+
+Ami megfelel a következő szótárállománynak:
+
+.PP
+.RS
+.nf
+3
+hello
+try/A
+work/AB
+.fi
+.RE
+.PP
+Lásd még a tests/alias* példát a forrásban.
+
+Megjegyzés: az AF sorok nem előzhetik meg a FLAG paramétert.
+Alias tömörítésre szolgál a Hunspell makealias segédprogramja.
+
+.IP "AM a_következő_AM_sorok_száma"
+.IP "AM morfológiai_és_egyéb_adatmezők"
+A Hunspell program képes a kiegészítő adatmezőket
+egy természetes számmal helyettesíteni, az AF paraméterhez hasonlóan.
+Lásd még a tests/alias* példát a forrásban.
+
+.SH "JAVÍTÁSI PARAMÉTEREK"
+Az alapértelmezett n-gram, illetve betűcserén és -törlésen
+alapuló javaslatokat kiegészíthetjük a javítási paraméterekkel.
+A REP segít a tipikus hibák és javításuk megadásában.
+A PHONE a kiejtést kevésbé követő írásrendszereknél nyújt segítséget.
+.IP "KEY szomszédos_karakterek_opcionálisan_függőleges_vonallal_elválasztva"
+A nyelv alapértelmezett billentyűzetkiosztását adhatjuk meg a KEY
+paraméterrel, hogy a javaslatoknál a szomszédos betűk elütését
+felismerje a program. A nem szomszédos betűket függőleges vonallal
+választhatjuk el:
+.PP
+.RS
+.nf
+KEY öüó|qwertzuiopőú|asdfghjkléáű|íyxcvbnm
 .fi
 .RE
 .PP
-A kulcsszavak jelent�se:
-.IP "SET karakterk�d"
-A sz�t�r �s affixum�llom�ny karakterk�dol�s�nak be�ll�t�sa.
-A lehets�ges �rt�kek: UTF-8, ISO8859\-1-t�l ISO8859\-10-ig, 
-ISO8859\-14, KOI8-R, KOI8-U, microsoft-cp1251, ISCII-DEVANAGARI.
 .IP "TRY karakterek"
-A javaslattev�sn�l az 1 karakteres pr�b�lkoz�sokn�l az itt felsorolt
-karakterekre cser�l, illetve b�v�t.
-.IP "NOSPLITSUGS"
-Nem javasol sz�felbont�st a Hunspell ezzel a be�ll�t�ssal.
+A javaslattevésnél az 1 karakteres próbálkozásoknál az itt felsorolt
+karakterekre cserél, illetve bővít. A paraméternél a kis- és nagybetűket
+külön kell megadni.
+.IP "NOSUGGEST kapcsoló"
+Az itt definiált kapcsolóval jelölt szavakat a program nem javasolja
+a hibajavításnál. Vulgáris és obszcén szavak esetében hasznos.
 .IP "MAXNGRAMSUGS"
-Az ngram javaslatok maxim�lis sz�m�nak be�ll�t�sa. Alap�rtelmezetten
-3. A 0 �rt�k kikapcsolja az ngram javaslatokat.
+Az n-gram (n hosszú szórészletek megegyezősége alapján súlyozott)
+javaslatok maximális számának beállítása. Alapértelmezetten
+5. A 0 érték kikapcsolja az n-gram javaslatokat.
+.IP "NOSPLITSUGS"
+Nem javasol szófelbontást a Hunspell ezzel a beállítással.
+Hiányzó összetettszó-kezelés esetén hasznos a hibás különírási
+javaslatok tiltására.
 .IP "SUGSWITHDOTS"
-Ha a hib�s sz� pont(ok)ra v�gz�dik, ezeket a javaslatok eset�ben is
-felt�nteti. Az OpenOffice.org sz�t�rak sz�m�ra nem sz�ks�ges ez a
-be�ll�t�s.
-.IP "LANG nyelvk�d"
-Nyelv megad�sa (Morphbase kieg�sz�t�s, ami a nyelvf�gg�
-programr�szek bekapcsol�s�t v�gzi). �j nyelv hozz�ad�sa a langnum.hxx
-�s a csutil.cxx �llom�nyon kereszt�l lehets�ges a forr�sk�dban.
-.IP "COMPLEXPREFIXES"
-K�tszeres prefixum lev�g�s be�ll�t�sa (de ezzel a k�tszeres szuffixum
-lev�g�s lehet�s�ge megsz�nik).
-.IP "COMPOUNDMIN sz�m"
-A legkisebb sz�hossz, ami m�g �sszetett sz�ban szerepelhet.
-Alap�rtelmez�s szerint 3 karakter.
-.IP "COMPOUNDFLAG kapcsol�"
-Itt adhat� meg a sz��sszet�telben val� szerepl�st enged�lyez�
-kapcsol�.
-.IP "COMPOUNDBEGIN kapcsol�"
-A kapcsol� az �sszetett szavak els� tagjak�nt enged�lyezi
-a megjel�lt szavakat.
-.IP "COMPOUNDLAST kapcsol�"
-A kapcsol� az �sszetett szavak utols� tagjak�nt enged�lyezi
-a megjel�lt szavakat. Kombin�lhat� az el�z� kapcsol�val.
-.IP "COMPOUNDMIDDLE kapcsol�"
-A kapcsol� az �sszetett szavak k�zbens� tagjak�nt enged�lyezi
-a megjel�lt szavakat. Kombin�lhat� a k�t el�z� kapcsol�val.
-.IP "ONLYINCOMPOUND kapcsol�"
-Csak az �sszetett szavakban megjelen� ragoz�s jel�l�s�re szolg�l�
-kapcsol� (germ�n nyelvek eset�ben tipikus).
-.IP "CIRCUMFIX kapcsol�"
-Ezzel a kapcsol�val jel�lt szuffixum csak ugyanilyen kapcsol�val
-jel�lt prefixummal jelenhet meg egy t�v�n. (Pl. leg-�des-ebb).
-.IP "COMPOUNDPERMITFLAG kapcsol�"
-Alap�etelmez�s szerint a prefixumok �s szuffixumok nem fordulhatnak
-el� az �sszetett szavak belsej�ben. A COMPOUNDPERMITFLAG
-kapcsol�val rendelkez� affixumok viszont itt is megjelenhetnek.
-.IP "COMPOUNDFORBIDFLAG kapcsol�"
-Toldal�kolt szavak sz��sszet�telben val� szerepl�s�t tilt�
-kapcsol�. A tilt�shoz az adott SFX szab�ly folytat�si
-oszt�lyak�nt (l. k�s�bb) adjuk meg ezt a kapcsol�t.
-.IP "COMPOUNDROOT kapcsol�"
-A sz�t�rba k�zvetlen�l felvett �sszetett szavakat
-jel�l� kapcsol�. A COMPOUNDWORDMAX, �s �gy a magyar eset�ben
-a 6-3-as szab�ly m�k�d�s�t befoly�solja azzal, hogy a COMPOUNDROOT
-kapcsol�val �sszetettnek jel�lt
-szavak k�t sz�nak sz�m�tanak.
-.IP "COMPOUNDWORDMAX sz�m"
-A sz��sszet�telekben szerepl� egyszer� t�vek maxim�lis sz�ma.
-A magyar eset�ben 2 az �rt�k, e f�l�tti sz�sz�mn�l m�r �letbe l�p
-a 6-3-as szab�ly.
-.IP "COMPOUNDSYLLABLE sz�m karakterek"
-K�t param�tert v�r. Az els� megadja az �sszetett szavak t�v�nek
-maxim�lis sz�tagsz�m�t, ami a magyar helyes�r�s 6-3-as szab�lya szerint 6.
-A m�sodik mez� felsorolja a mag�nhangz�kat,
-ami a sz�tagsz�m meg�llap�t�s�hoz sz�ks�ges.
-Ha hi�nyzik ez a defin�ci�, akkor nincsen
-korl�toz�s az �sszetett szavak t�v�nek sz�tagsz�m�ra
-vonatkoz�an.
-.IP "SYLLABLENUM kapcsol�k"
-Egy param�tert v�r. A param�terben megadhat�ak azok a ragoz�si
-oszt�lyok, amelyek ragoz�s eset�n eggyel n�velik az �sszetett
-szavak t�v�n�l kisz�m�tott sz�tagsz�mot. A magyarban ezek
-a mell�kn�vk�pz�k: ker�kp�rjav�t�sainkr�l, de ker�kp�r\-jav�t�si.
+Ha a hibás szó pont(ok)ra végződik, ezeket a javaslatok esetében is
+feltünteti. Az OpenOffice.org szótárak számára nem szükséges ez a
+beállítás.
+.IP "REP szám"
+.IP "REP mit mire"
+A javítási cseretáblázat megadására szolgáló definíciók.
+Az első REP után adjuk meg a többi REP sor számát.
+Ezek a sorok már két paramétert várnak: először
+megadjuk a felismerendő mintát (hibás szórészletet),
+utána pedig azt a karaktersorozatot, amire a felismert
+mintát javítani szeretnénk. A helyesírás\-ellenőrző
+a cseretáblázat révén tud helyes javaslatot tenni
+többkarakteres eltérés (pl. j-ly) esetén.
+
+A szóköz aláhúzásjellel helyettesítendő a javaslatokban:
+
+.PP
+.RS
+.nf
+REP 1
+REP végülis végül_is
+.fi
+.RE
+.PP
+
+A szervíz, szintű és a hasonló hibás összetett szavak
+letiltásában szintén a REP táblázat segít a CHECKCOMPOUNDREP
+megadásával (l. ott).
+
+.IP "MAP a_MAP_definíciók_száma"
+.IP "MAP karakterek"
+Rokon karaktereket adhatunk meg több sorban. A javaslattevésnél
+több rokon karakter cseréje is lehetséges, így például ékezet
+nélküli szavakat is képes ékezetesíteni a Hunspell a következő
+definíció mellett:
+
+.PP
+.RS
+.nf
+MAP 5        
+MAP aá        
+MAP eé        
+MAP ií        
+MAP oóöő        
+MAP uúüű        
+.fi
+.RE
+.PP
+.IP "PHONE a_PHONE_definíciók_száma"
+.IP "PHONE karakterek"
+A PHONE egy táblázattal megadható fonetikus átírási algoritmust
+használ a kiejtési hasonlóság kiszámítására. Különösen
+hasznos azoknál a nyelveknél, ahol az írás nem tükrözi a kiejtést.
+A részletes dokumentáció az Aspell helyesírás-ellenőrző oldalán
+érhető el angol nyelven: http://aspell.net/man-html/Phonetic-Code.html.
+
+Megjegyzés: a szabályokban szereplő kapcsos zárójelek nem
+tartalmazhatnak még több byte-os UTF-8 karaktereket, ahogy
+a kötőjeles kifejezések is byte-ot jelölnek, nem karaktert Unicode
+szótár esetén is.
+.SH "SZÓ-ÖSSZETÉTELEZÉSI PARAMÉTEREK"
+.IP "BREAK a_BREAK_definíciók_száma"
+.IP "BREAK karakter_vagy_karaktersorozat"
+Ha a keresett szó nincs a szótárban, a felsorolt karaktereknél vagy
+karaktersorozatoknál felbontja és részenként ellenőrzi. Hasznos
+például a kis- és nagykötőjeles szavaknál a magyarban.
+.IP "COMPOUNDRULE"
+xxxxxxx
+
+.IP "COMPOUNDMIN szám"
+A legkisebb szóhossz, ami még összetett szóban szerepelhet.
+Alapértelmezés szerint 3 karakter.
+.IP "COMPOUNDFLAG kapcsoló"
+Itt adható meg a szóösszetételben való szereplést engedélyező
+kapcsoló.
+.IP "COMPOUNDBEGIN kapcsoló"
+A kapcsoló az összetett szavak első tagjaként engedélyezi
+a megjelölt szavakat.
+.IP "COMPOUNDLAST kapcsoló"
+A kapcsoló az összetett szavak utolsó tagjaként engedélyezi
+a megjelölt szavakat. Kombinálható az előző kapcsolóval.
+.IP "COMPOUNDMIDDLE kapcsoló"
+A kapcsoló az összetett szavak közbenső tagjaként engedélyezi
+a megjelölt szavakat. Kombinálható a két előző kapcsolóval.
+.IP "ONLYINCOMPOUND kapcsoló"
+Csak az összetett szavakban megjelenő ragozás jelölésére szolgáló
+kapcsoló (germán nyelvek esetében tipikus).
+.IP "CIRCUMFIX kapcsoló"
+Ezzel a kapcsolóval jelölt szuffixum csak ugyanilyen kapcsolóval
+jelölt prefixummal jelenhet meg egy tövön. (Pl. leg-édes-ebb).
+.IP "COMPOUNDPERMITFLAG kapcsoló"
+Alapéetelmezés szerint a prefixumok és szuffixumok nem fordulhatnak
+elő az összetett szavak belsejében. A COMPOUNDPERMITFLAG
+kapcsolóval rendelkező affixumok viszont itt is megjelenhetnek.
+.IP "COMPOUNDFORBIDFLAG kapcsoló"
+Toldalékolt szavak szóösszetételben való szereplését tiltó
+kapcsoló. A tiltáshoz az adott SFX szabály folytatási
+osztályaként (l. később) adjuk meg ezt a kapcsolót.
+.IP "COMPOUNDROOT kapcsoló"
+A szótárba közvetlenül felvett összetett szavakat
+jelölő kapcsoló. A COMPOUNDWORDMAX, és így a magyar esetében
+a 6-3-as szabály működését befolyásolja azzal, hogy a COMPOUNDROOT
+kapcsolóval összetettnek jelölt
+szavak két szónak számítanak.
+.IP "COMPOUNDWORDMAX szám"
+A szóösszetételekben szereplő egyszerű tövek maximális száma.
+A magyar esetében 2 az érték, e fölötti szószámnál már életbe lép
+a 6-3-as szabály.
+.IP "COMPOUNDSYLLABLE szám karakterek"
+Két paramétert vár. Az első megadja az összetett szavak tövének
+maximális szótagszámát, ami a magyar helyesírás 6-3-as szabálya szerint 6.
+A második mező felsorolja a magánhangzókat,
+ami a szótagszám megállapításához szükséges.
+Ha hiányzik ez a definíció, akkor nincsen
+korlátozás az összetett szavak tövének szótagszámára
+vonatkozóan.
+.IP "SYLLABLENUM kapcsolók"
+Egy paramétert vár. A paraméterben megadhatóak azok a ragozási
+osztályok, amelyek ragozás esetén eggyel növelik az összetett
+szavak tövénél kiszámított szótagszámot. A magyarban ezek
+a melléknévképzők: kerékpárjavításainkról, de kerékpár\-javítási.
 A 
-.IP "FORBIDDENWORD kapcsol�"
-A tiltott szavakat jel�l� kapcsol�. A tiltott sz�t�vek
-toldal�kolt alakjai is letilt�sra ker�lnek. A tiltott
-szavak ak�r toldal�kol�si, vagy sz��sszet�teli szinonimak�nt
-sem ker�lnek elfogad�sra.
-.IP "PSEUDOROOT kapcsol�"
-A kapcsol�val jel�lt szavak toldal�kolt alakjai ker�lnek
-csak elfogad�sra. Fikt�v t�vek megad�s�ra szolg�l�
-kapcsol�. A t� lehet m�g helyes sz�, ha
-�rv�nyes szinonimak�nt el��ll vagy szerepel a sz�t�rban.
-.IP "ACCENT �kezetes_bet�k ugyanaz_�kezet_n�lk�l"
-Az �kezetes�t�shez sz�ks�ges bet�ket k�t param�terrel
-adhatjuk meg itt. Az els� param�terben
-az �kezetes karaktereket, a m�sodikban az azoknak
-megfelel� �kezet n�lk�li bet�ket adjuk meg.
+.IP "FORBIDDENWORD kapcsoló"
+A tiltott szavakat jelölő kapcsoló. A tiltott szótövek
+toldalékolt alakjai is letiltásra kerülnek. A tiltott
+szavak akár toldalékolási, vagy szóösszetételi szinonimaként
+sem kerülnek elfogadásra.
+.IP "PSEUDOROOT kapcsoló"
+A kapcsolóval jelölt szavak toldalékolt alakjai kerülnek
+csak elfogadásra. Fiktív tövek megadására szolgáló
+kapcsoló. A tő lehet még helyes szó, ha
+érvényes szinonimaként előáll vagy szerepel a szótárban.
 .IP "WORDCHARS karakterek"
-Param�tere azok a karakterek, amelyek a be�ll�tott k�dol�s (pl.
-a magyar eset�ben az ISO-8859-2) bet�i mellett m�g az adott
-nyelv szavaiban el�fordulhatnak. Ilyen p�ld�ul a magyarban
-a k�t�jel, pont, sz�zal�kjel, fokjel, paragrafusjel �s a
-nagyk�t�jel. Az ut�bbi csak UTF-8, vagy microsoft-cp1250
-karakterk�szlet mellett lesz haszn�lhat� a magyar sz�t�rban.
-.IP "LEMMA_PRESENT kapcsol�"
-A morfol�giai le�r�s elej�n megadhatunk m�s t�veket is a
-t�sz�t�rban az alap�rtelmezett helyett. A LEMMA_PRESENT
-kapcsol�val jel�lt t�vek eset�ben az elemz� nem teszi a
-kimenetbe a lemm�t (mivel az m�r szerepel a morfol�giai
-le�r�sban). �gy adhatunk meg fikt�v vagy nem sz�t�ri
-t�vekhez val�di t�veket.
-.IP "REP sz�m"
-.IP "REP mit mire"
-A jav�t�si cseret�bl�zat megad�s�ra szolg�l� defin�ci�k.
-Az els� REP ut�n adjuk meg a t�bbi REP sor sz�m�t.
-Ezek a sorok m�r k�t param�tert v�rnak: el�sz�r
-megadjuk a felismerend� mint�t (hib�s sz�r�szletet),
-ut�na pedig azt a karaktersorozatot, amire a felismert
-mint�t jav�tani szeretn�nk. A helyes�r�s\-ellen�rz�
-a cseret�bl�zat r�v�n tud helyes javaslatot tenni
-t�bbkarakteres elt�r�s (pl. j/ly) eset�n.
-A Magyar Ispellben megl�v� keresztellen�rz�s miatt
-egy karakteres cser�k (i/�) is szerepelnek
-a REP t�bl�zatban. Ennek k�sz�nhet�, hogy az am�gy
-helyes nem sz�t�ri sz��sszet�telek nem ker�lnek
-elfogad�sra, ha a cseret�bl�zat egyik cser�j�vel
-el��ll�that�k egy sz�t�ri sz�b�l (p�ld�ul:
-a ,,sz�nt�'' sz� hib�s �sszetett sz� lesz, mert az
-i\->� cser�vel el��ll�that� a szint� sz�b�l).
-.IP "PFX kapcsol� keresztkombin�l�d�s sz�m"
-.IP "PFX kapcsol� lev�g�s prefixum felt�tel morfol�gia"
-Prefixum megad�s�ra szolg�l� defin�ci�k.
-A prefixumok egykarakteres n�vvel jel�lt oszt�lyokba
-vannak sorolva. A p�ld�ban az X oszt�ly
-defin�ci�ja l�that�. Az egyes oszt�lyokra
-vonatkoz� PFX fejl�c tartalmazza a k�vetkez�ket:
-
-(1) az oszt�ly bet�jel�t (a p�ld�ban X)
-
-(2) a keresztbe val� kombin�l�s enged�lyez�se, illetve
-tilt�sa (Y/N). Enged�lyez�s eset�n az adott prefixum akkor is
-alkalmazhat�, ha a t�sz� toldal�kolt alakban fordul el�.
-Ehhez az is sz�ks�ges, hogy a toldal�k (affixum) ragoz�si
-oszt�ly�ban is legyen enged�lyezve a kombin�l�s.
-
-(3) az oszt�lyba tartoz� bejegyz�sek sz�m�t
-
-A PFX fejl�cet k�vet� sorokban a PFX param�terek jelent�se
-a k�vetkez�:
-
-(1) az oszt�ly bet�jele
-
-(2) a ragoz�sn�l a sz� elej�r�l lev�lasztand� karaktersorozat.
-Ha nem kell lev�lasztani, akkor 0.
-
-(3) a prefixum (p�ld�ul igek�t�, vagy a leg\-, legesleg\-
-a mell�knevekn�l). Perjellel elv�lasztva kapcsol�kat
-is megadhatunk (l. t�bbsz�r�s toldal�kol�s).
-
-(4) a minta, ami ha illeszkedik, alkalmazhat� a szab�ly.
-P�ld�ul ha itt kutya szerepelne, akkor csak a kutya
-kezdet� szavak el� lehetne tenni az ebben a sorban
-megadott prefixumot. A minta megad�s�n�l a pont (.)
-speci�lis jelent�ssel b�r: minden karakterre illeszkedik.
-Megadhatunk csak bizonyos karakterekre illeszked� mint�t
-is sz�gletes z�r�jelek seg�ts�g�vel. P�ld�ul az [abcd] illeszkedik
+Paramétere azok a karakterek, amelyek a beállított kódolás (pl.
+a magyar esetében az ISO-8859-2) betűi mellett még az adott
+nyelv szavaiban előfordulhatnak. Ilyen például a magyarban
+a kötőjel, pont, százalékjel, fokjel, paragrafusjel és a
+nagykötőjel. Az utóbbi csak UTF-8, vagy microsoft-cp1250
+karakterkészlet mellett lesz használható a magyar szótárban.
+.IP "LEMMA_PRESENT kapcsoló"
+A morfológiai leírás elején megadhatunk más töveket is a
+tőszótárban az alapértelmezett helyett. A LEMMA_PRESENT
+kapcsolóval jelölt tövek esetében az elemző nem teszi a
+kimenetbe a lemmát (mivel az már szerepel a morfológiai
+leírásban). Így adhatunk meg fiktív vagy nem szótári
+tövekhez valódi töveket.
+.IP "PFX kapcsoló keresztkombinálódás szám"
+.IP "PFX kapcsoló levágás prefixum feltétel morfológia"
+Prefixum megadására szolgáló definíciók.
+A prefixumok egykarakteres névvel jelölt osztályokba
+vannak sorolva. A példában az X osztály
+definíciója látható. Az egyes osztályokra
+vonatkozó PFX fejléc tartalmazza a következőket:
+
+(1) az osztály betűjelét (a példában X)
+
+(2) a keresztbe való kombinálás engedélyezése, illetve
+tiltása (Y/N). Engedélyezés esetén az adott prefixum akkor is
+alkalmazható, ha a tőszó toldalékolt alakban fordul elő.
+Ehhez az is szükséges, hogy a toldalék (affixum) ragozási
+osztályában is legyen engedélyezve a kombinálás.
+
+(3) az osztályba tartozó bejegyzések számát
+
+A PFX fejlécet követő sorokban a PFX paraméterek jelentése
+a következő:
+
+(1) az osztály betűjele
+
+(2) a ragozásnál a szó elejéről leválasztandó karaktersorozat.
+Ha nem kell leválasztani, akkor 0.
+
+(3) a prefixum (például igekötő, vagy a leg\-, legesleg\-
+a mellékneveknél). Perjellel elválasztva kapcsolókat
+is megadhatunk (l. többszörös toldalékolás).
+
+(4) a minta, ami ha illeszkedik, alkalmazható a szabály.
+Például ha itt kutya szerepelne, akkor csak a kutya
+kezdetű szavak elé lehetne tenni az ebben a sorban
+megadott prefixumot. A minta megadásánál a pont (.)
+speciális jelentéssel bír: minden karakterre illeszkedik.
+Megadhatunk csak bizonyos karakterekre illeszkedő mintát
+is szögletes zárójelek segítségével. Például az [abcd] illeszkedik
 az a, b, c, illetve d karakterekre is.
-Ellent�tben az Ispell\-lel, a k�t�jel
-szerepe a sz�gletes z�r�jelek k�z�tt nem speci�lis,
-vagyis k�t�jelet jelent, �s nem karaktertartom�nyt.
-Ha a nyit� sz�gletes z�r�jel ut�n kalap (^) karakter
-tal�lhat�, a karaktertartom�ny komplementer�re
-illeszkedik a minta, hasonl�an a regul�ris
-kifejez�sekhez (l.
+Ellentétben az Ispell\-lel, a kötőjel
+szerepe a szögletes zárójelek között nem speciális,
+vagyis kötőjelet jelent, és nem karaktertartományt.
+Ha a nyitó szögletes zárójel után kalap (^) karakter
+található, a karaktertartomány komplementerére
+illeszkedik a minta, hasonlóan a reguláris
+kifejezésekhez (l.
 .IR regex "(7))."
 
-(5) Morfol�giai le�r�s. Sz�k�z�n �s sz�k�z �rt�k�
-karaktereken k�v�l tetsz�leges karakterekb�l �ll� le�r�s.
-A morfol�giai elemz�s sor�n a program �sszef�zi az
-itt tal�lhat� le�r�st, tartalm�val nem foglalkozik.
-Kiv�ve a { �s } k�z� z�rt le�r�sokat, amelyek a
-sor v�gi z�r�jelezett r�sz kiv�tel�vel elt�nnek az elemz�sb�l.
-Ezen a m�don a z�r� morf�m�hoz kapcsol�d� elemz�st adhatjuk
+(5) Morfológiai leírás. Szóközön és szóköz értékű
+karaktereken kívül tetszőleges karakterekből álló leírás.
+A morfológiai elemzés során a program összefűzi az
+itt található leírást, tartalmával nem foglalkozik.
+Kivéve a { és } közé zárt leírásokat, amelyek a
+sor végi zárójelezett rész kivételével eltűnnek az elemzésből.
+Ezen a módon a zéró morfémához kapcsolódó elemzést adhatjuk
 meg.
 
-.IP "SFX kapcsol� keresztkombin�l�d�s sz�m"
-.IP "SFX kapcsol� szuffixum felt�tel mofol�giai_le�r�s"
-A PFX\-szel megegyez� param�tereket kap, csak nem
-a sz� eleji, hanem a sz� v�gi toldal�kok le�r�s�ra
-szolg�l. A p�ld�ban szerepl� defin�ci�k jelent�se:
-az \-edik, vagy \-ezik v�g� szavakra alkalmazhat�
-a h�rom szab�ly. A rag illeszt�s�n�l levessz�k
-a sz� v�gi \-ik karaktersorozatot, �s szab�lyt�l f�gg�en
-illesztj�k a \-t�k, \-t�tek, \-t�k toldal�kokat,
-v�geredm�nyben \-edt�k, \-edt�tek, \-edt�k, illetve
--ezt�k, \-ezt�tek, \-ezt�k v�g� szavakat kapva.
-.IP "T�bbsz�r�s toldal�kol�s"
-A PFX �s az SFX szab�lyokban a toldal�k perjellel elv�lasztva kapcsol�kat is
-kaphat, hasonl�an a sz�t�r�llom�ny t�veihez. A kapcsol�k a
-k�vetkez�ek lehetnek:
-
-(1) SFX szab�lyban az SFX folytat�s jelent�se, hogy a toldal�k m�g tov�bb
-ragoz�dhat a megadott kapcsol�kkal (t�bbsz�r�s affixumlev�laszt�s).
-A Hunspell eset�ben csak a k�tszeres affixumlev�laszt�s lett megval�s�tva,
-teh�t a folytat�si oszt�ly folytat�s�t m�r nem veszi figyelembe a program.
-
-(2) SFX szab�lyban a PFX folytat�s jelent�se, hogy az adott prefixum is
-hozz�j�rulhat a t�h�z, felt�ve, ha az SFX szab�ly is �l.
-
-(3) PFX szab�lyban az SFX szab�ly jelent�se, hogy a megjel�lt SFX
-szab�ly a t�h�z j�rulhat, ha a PFX szab�ly is �l.
-
-(4) ONLYINCOMPOUND kapcsol� megad�s�val az adott PFX vagy SFX toldal�k csak
-sz��sszet�telben jelentkezhet.
-
-(5) CIRCUMFIX kapcsol� megad�s�val az adott SFX csak az ugyanilyen
-toldal�kot kap� PFX-szel egy�tt fordulhat csak el�.
-
-(6) Az �sszet�teli kapcsol�k megad�s�val enged�lyezhetj�k
-vagy letilthatjuk (COMPOUNDFORBIDFLAG) az �sszet�telben val�
-szerepl�st. A �sszetett szavak utols� tagja alap�rtelmez�s szerint
-minden affixumot felvehet. A k�zbens� szavakn�l viszont
-explixit m�don enged�lyezni kell ezt.
+.IP "SFX kapcsoló keresztkombinálódás szám"
+.IP "SFX kapcsoló szuffixum feltétel mofológiai_leírás"
+A PFX\-szel megegyező paramétereket kap, csak nem
+a szó eleji, hanem a szó végi toldalékok leírására
+szolgál. A példában szereplő definíciók jelentése:
+az \-edik, vagy \-ezik végű szavakra alkalmazható
+a három szabály. A rag illesztésénél levesszük
+a szó végi \-ik karaktersorozatot, és szabálytól függően
+illesztjük a \-tük, \-tétek, \-ték toldalékokat,
+végeredményben \-edtük, \-edtétek, \-edték, illetve
+-eztük, \-eztétek, \-ezték végű szavakat kapva.
+.IP "Többszörös toldalékolás"
+A PFX és az SFX szabályokban a toldalék perjellel elválasztva kapcsolókat is
+kaphat, hasonlóan a szótárállomány töveihez. A kapcsolók a
+következőek lehetnek:
+
+(1) SFX szabályban az SFX folytatás jelentése, hogy a toldalék még tovább
+ragozódhat a megadott kapcsolókkal (többszörös affixumleválasztás).
+A Hunspell esetében csak a kétszeres affixumleválasztás lett megvalósítva,
+tehát a folytatási osztály folytatását már nem veszi figyelembe a program.
+
+(2) SFX szabályban a PFX folytatás jelentése, hogy az adott prefixum is
+hozzájárulhat a tőhöz, feltéve, ha az SFX szabály is él.
+
+(3) PFX szabályban az SFX szabály jelentése, hogy a megjelölt SFX
+szabály a tőhöz járulhat, ha a PFX szabály is él.
+
+(4) ONLYINCOMPOUND kapcsoló megadásával az adott PFX vagy SFX toldalék csak
+szóösszetételben jelentkezhet.
+
+(5) CIRCUMFIX kapcsoló megadásával az adott SFX csak az ugyanilyen
+toldalékot kapó PFX-szel együtt fordulhat csak elő.
+
+(6) Az összetételi kapcsolók megadásával engedélyezhetjük
+vagy letilthatjuk (COMPOUNDFORBIDFLAG) az összetételben való
+szereplést. A összetett szavak utolsó tagja alapértelmezés szerint
+minden affixumot felvehet. A közbenső szavaknál viszont
+explixit módon engedélyezni kell ezt.
 
 .PP
-A ragoz�si �llom�ny ezeken k�v�l m�g megjegyz�seket is tartalmazhat, ez�rt az adott
-sz�t�r v�ltozat�t, szerz�j�t, felhaszn�l�si enged�lyeit itt
-keress�k.
-.SH SAJ�T SZ�T�R
-A saj�t sz�t�r form�tuma k�zel megegyezik a sz�t�r�llom�ny
-form�tum�val. A k�l�nbs�gek a k�vetkez�ek:
-
-(1) Nem kell megadni az els� sorban az �llom�nyban l�v� szavak
-m�ret�t. (Ne is adjuk meg!)
-
-(2) A sorban a kapcsol�k helyett megadhatunk k�t
-perjellel elv�lasztva egy mintasz�t is,
-aminek a kapcsol�it �r�kli a k�s�bbiekben a saj�t
-sz�t�rba felvett sz�. P�ld�ul a Patyomkin//�d�m sor
-jelent�se, hogy a Patyomkin sz�t az �d�m�val megegyez�
-ragoz�ssal is el kell fogadni.
-
-(3) Az �llom�ny k�zzel m�dos�that�, �s ezt id�nk�nt
-javasolt is megtenni, ha esetleg hib�san vett�nk fel szavakat.
-.SH L�SD M�G
-.B angol nyelv� hunspell (4),
+A ragozási állomány ezeken kívül még megjegyzéseket is tartalmazhat, ezért az adott
+szótár változatát, szerzőjét, felhasználási engedélyeit itt
+keressük.
+.SH SAJÁT SZÓTÁR
+A saját szótár formátuma közel megegyezik a szótárállomány
+formátumával. A különbségek a következőek:
+
+(1) Nem kell megadni az első sorban az állományban lévő szavak
+méretét. (Ne is adjuk meg!)
+
+(2) A sorban a kapcsolók helyett megadhatunk két
+perjellel elválasztva egy mintaszót is,
+aminek a kapcsolóit örökli a későbbiekben a saját
+szótárba felvett szó. Például a Patyomkin//Ádám sor
+jelentése, hogy a Patyomkin szót az Ádáméval megegyező
+ragozással is el kell fogadni.
+
+(3) Az állomány kézzel módosítható, és ezt időnként
+javasolt is megtenni, ha esetleg hibásan vettünk fel szavakat.
+.SH LÁSD MÉG
+.B angol nyelvű hunspell (4),
 .B hunspell (1),
 .B ispell (1),
 .B ispell (4),
-Magyar Ispell dokument�ci�.
-.SH T�RT�NET
-A MySpell sz�t�r\-, illetve ragoz�si �llom�ny�nak form�tum�t
-Kevin Hendricks k�sz�tette olyan c�llal, hogy lehet�v�
-tegye ezen �llom�nyok gyors, fut�s idej� feldolgoz�s�t.
-
-A COMPOUNDFLAG �s a Hunspell form�tumb�v�t�st, valamint
-a REP t�bbkarakteres cseret�bl�zatot N�meth L�szl�
-k�sz�tette els�sorban a jobb magyar
-nyelv� helyes�r�s\-ellen�rz�s c�lj�b�l. A minim�lis
-�sszetettsz�\-kezel�st lehet�v� tev� COMPOUNDMIN, COMPOUNDFLAG,
-�s a REP t�bbkarakteres cseret�bl�zat r�sze a hivatalos
-MySpell f�ggv�nyk�nyvt�rnak is.
-
-A Hunspell sz�t�r�llom�ny�nak form�tuma megegyezik
-a MySpell f�ggv�nyk�nyvt�r�val, a ragoz�si t�bl�zat pedig
-a fentiekben felsorolt b�v�t�seket tartalmazza.
-A b�v�tett form�tum� affixum �llom�ny gond n�lk�l
-egy�ttm�k�dik az eredeti MySpell f�ggv�nyk�nyvt�rral is,
-de a b�v�t�sek nem fognak m�k�dni. S�t, mivel a
-hivatalos MySpell egy megenged�bb �sszetettsz�\-kezel�st
-val�s�t meg, mint a magyar v�ltozat, az
-�sszetett szavakon bel�li toldal�kolt alakok is elfogad�sra
-ker�lnek (ez k�l�n�sen sok hib�s �sszet�tel
-elfogad�s�t eredm�nyezi a magyar nyelv eset�ben).
-
-Ebb�l fakad, hogy a hivatalos Magyar
+Magyar Ispell dokumentáció.
+.SH TÖRTÉNET
+A MySpell szótár\-, illetve ragozási állományának formátumát
+Kevin Hendricks készítette olyan céllal, hogy lehetővé
+tegye ezen állományok gyors, futás idejű feldolgozását.
+
+A COMPOUNDFLAG és a Hunspell formátumbővítést, valamint
+a REP többkarakteres cseretáblázatot Németh László
+készítette elsősorban a jobb magyar
+nyelvű helyesírás\-ellenőrzés céljából. A minimális
+összetettszó\-kezelést lehetővé tevő COMPOUNDMIN, COMPOUNDFLAG,
+és a REP többkarakteres cseretáblázat része a hivatalos
+MySpell függvénykönyvtárnak is.
+
+A Hunspell szótárállományának formátuma megegyezik
+a MySpell függvénykönyvtáréval, a ragozási táblázat pedig
+a fentiekben felsorolt bővítéseket tartalmazza.
+A bővített formátumú affixum állomány gond nélkül
+együttműködik az eredeti MySpell függvénykönyvtárral is,
+de a bővítések nem fognak működni. Sőt, mivel a
+hivatalos MySpell egy megengedőbb összetettszó\-kezelést
+valósít meg, mint a magyar változat, az
+összetett szavakon belüli toldalékolt alakok is elfogadásra
+kerülnek (ez különösen sok hibás összetétel
+elfogadását eredményezi a magyar nyelv esetében).
+
+Ebből fakad, hogy a hivatalos Magyar
 OpenOffice.org (http://office.fsf.hu) \- mivel a Magyar
-MySpell f�ggv�nyk�nyvt�rat tartalmazza \- jobban t�mogatja
-a magyar nyelvet, mint m�s v�ltozatok. Egyszer�en
-meggy�z�dhet�nk arr�l, hogy melyik v�ltozattal van dolgunk:
-�rjuk be, hogy
-.I helyes�r�sellen�rz�
-az OOo sz�vegszerkeszt�j�be.
-Ha hib�snak jelzi, �s
-.I helyes�r�s\-ellen�rz�t
+MySpell függvénykönyvtárat tartalmazza \- jobban támogatja
+a magyar nyelvet, mint más változatok. Egyszerűen
+meggyőződhetünk arról, hogy melyik változattal van dolgunk:
+írjuk be, hogy
+.I helyesírásellenőrző
+az OOo szövegszerkesztőjébe.
+Ha hibásnak jelzi, és
+.I helyesírás\-ellenőrzőt
 javasol helyette,
 a Hunspell\-lel van dolgunk. Ha helyesnek fogadja
 el, akkor pedig az eredeti MySpell\-lel.
+
+
+
+A Magyar Ispellben meglévő keresztellenőrzés miatt
+egy karakteres cserék (i-í) is szerepelnek
+a REP táblázatban. Ennek köszönhető, hogy az amúgy
+helyes nem szótári szóösszetételek nem kerülnek
+elfogadásra, ha a cseretáblázat egyik cseréjével
+előállíthatók egy szótári szóból (például:
+a ,,színtű'' szó hibás összetett szó lesz, mert az
+i\->í cserével előállítható a szintű szóból).
+
+
+COMPOUNDMIN 2
+COMPOUNDFLAG Y
+COMPOUNDWORDMAX 2
+COMPOUNDROOT y
+COMPOUNDSYLLABLE 6 aáeéiíoóöőuúüű
+SYLLABLENUM klmc
+COMPOUNDBEGIN v
+COMPOUNDEND x
+FORBIDDENWORD w
+PSEUDOROOT u
+ACCENT áéíóöőúüű aeiooouuu
diff --git a/man/hunspell.1 b/man/hunspell.1
index 2f358be..6459ff6 100644
--- a/man/hunspell.1
+++ b/man/hunspell.1
@@ -1,5 +1,5 @@
 .hla hu
-.TH hunspell 1 "2007-06-18"
+.TH hunspell 1 "2008-03-03"
 .LO 1
 .SH NAME
 hunspell \- spell checker, stemmer and morphological analyzer
@@ -276,9 +276,16 @@ Print lines with misspelled words.
 The "list" option
 is used to produce a list of misspelled words from the standard input.
 
+.IP \fB\-m\fR
+Analyze the words of the input text (see also hunspell(4) about
+morphological analysis).
+
 .IP \fB\-n\fR
 The input file is in nroff/troff format.
 
+.IP \fB\-P\ password\fR
+Set password for encrypted dictionaries.
+
 .IP \fB\-p\ dict\fR
 Set path of personal dictionary.
 Default is $HOME/.hunspell_default.
@@ -289,6 +296,9 @@ or  the
 environmental variable, personal dictionary will be
 .BR $HOME/.hunspell_dicname
 
+.IP \fB\-s\fR
+Stem the words of the input text (see also hunspell(4) about
+stemming).
 
 .IP \fB\-t\fR
 The input file is in TeX or LaTeX format.
diff --git a/man/hunspell.4 b/man/hunspell.4
index dc9d883..986ac01 100644
--- a/man/hunspell.4
+++ b/man/hunspell.4
@@ -1,3 +1,4 @@
+.TH hunspell 4 "2008-03-03"
 .LO 1
 .SH NAME
 hunspell \- format of Hunspell dictionaries and affix files
@@ -107,7 +108,7 @@ Set flag type. Default type is the extended ASCII (8-bit) character.
 `UTF-8' parameter sets UTF-8 encoded Unicode character flags.
 The `long' value sets the double extended ASCII character flag type,
 the `num' sets the decimal number flag type. Decimal flags numbered from 1 to
-65535, and in flag fields are separated by comma.
+65000, and in flag fields are separated by comma.
 BUG: UTF-8 flag type doesn't work on ARM platform.
 .IP "COMPLEXPREFIXES"
 Set twofold prefix stripping (but single suffix stripping) for agglutinative
@@ -122,8 +123,8 @@ Useful for optional characters, as Arabic diacritical marks (Harakat).
 .IP "AF number_of_flag_vector_aliases"
 .IP "AF flag_vector"
 Hunspell can substitute affix flag sets with
-ordinal numbers in affix rules (alias compression). First example with
-alias compression:
+ordinal numbers in affix rules (alias compression, see makealias
+tool). First example with alias compression:
 .PP
 .RS
 .nf
@@ -147,7 +148,20 @@ AF AB
 .fi
 .RE
 .PP
-See also tests/alias* examples.
+
+It is equivalent of the following dic file:
+.PP
+.RS
+.nf
+3
+hello
+try/A
+work/AB
+.fi
+.RE
+.PP
+
+See also tests/alias* examples of the source distribution.
 
 Note: If affix file contains the FLAG parameter, define it before the AF
 definitions.
@@ -655,8 +669,8 @@ SFX D   0 ed . is:past_2
 .RE
 .PP
 
-Typical example of terminal suffix is nominative of languages
-with case suffixes.
+Typical example of the terminal suffix is the zero morpheme
+of the nominative case.
 
 .IP "sp:"
 Surface prefix. Temporary solution for adding prefixes to the
diff --git a/po/hu.gmo b/po/hu.gmo
index 10d4fdb..a004fec 100644
Binary files a/po/hu.gmo and b/po/hu.gmo differ
diff --git a/po/hu.po b/po/hu.po
index 037f6a2..f136223 100644
--- a/po/hu.po
+++ b/po/hu.po
@@ -311,7 +311,7 @@ msgstr ""
 #: src/hunspell/hunspell.cxx:1008
 #, c-format
 msgid "         hunspell -l file.txt          # print misspelled words\n"
-msgstr "        hunspell -l f�jl.txt            # ki�rja a hib�s szavakat\n"
+msgstr "         hunspell -l f�jl.txt          # ki�rja a hib�s szavakat\n"
 
 #: src/hunspell/hunspell.cxx:1009
 #, c-format
diff --git a/src/hunspell/Makefile.am b/src/hunspell/Makefile.am
index f83b0a9..bbb720d 100644
--- a/src/hunspell/Makefile.am
+++ b/src/hunspell/Makefile.am
@@ -10,6 +10,6 @@ libhunspell_1_2_la_SOURCES=affentry.cxx affixmgr.cxx csutil.cxx \
 libhunspell_1_2_include_HEADERS=affentry.hxx htypes.hxx affixmgr.hxx \
 	        csutil.hxx hunspell.hxx atypes.hxx dictmgr.hxx hunspell.h \
 		suggestmgr.hxx baseaffix.hxx hashmgr.hxx langnum.hxx \
-		phonet.hxx filemgr.hxx hunzip.hxx
+		phonet.hxx filemgr.hxx hunzip.hxx w_char.hxx
 
 EXTRA_DIST=hunspell.dsp makefile.mk README
diff --git a/src/hunspell/Makefile.in b/src/hunspell/Makefile.in
index 8e6f837..dc19d78 100644
--- a/src/hunspell/Makefile.in
+++ b/src/hunspell/Makefile.in
@@ -227,7 +227,7 @@ libhunspell_1_2_la_SOURCES = affentry.cxx affixmgr.cxx csutil.cxx \
 libhunspell_1_2_include_HEADERS = affentry.hxx htypes.hxx affixmgr.hxx \
 	        csutil.hxx hunspell.hxx atypes.hxx dictmgr.hxx hunspell.h \
 		suggestmgr.hxx baseaffix.hxx hashmgr.hxx langnum.hxx \
-		phonet.hxx filemgr.hxx hunzip.hxx
+		phonet.hxx filemgr.hxx hunzip.hxx w_char.hxx
 
 EXTRA_DIST = hunspell.dsp makefile.mk README
 all: all-am
diff --git a/src/hunspell/affentry.cxx b/src/hunspell/affentry.cxx
index fd737e0..2436fbb 100644
--- a/src/hunspell/affentry.cxx
+++ b/src/hunspell/affentry.cxx
@@ -7,9 +7,9 @@
 #include <cctype>
 #include <cstdio>
 #else
-#include <stdlib.h> 
+#include <stdlib.h>
 #include <string.h>
-#include <stdio.h> 
+#include <stdio.h>
 #include <ctype.h>
 #endif
 
@@ -17,7 +17,7 @@
 #include "csutil.hxx"
 
 #ifndef MOZILLA_CLIENT
-#ifndef W32
+#ifndef WIN32
 using namespace std;
 #endif
 #endif
@@ -29,8 +29,8 @@ PfxEntry::PfxEntry(AffixMgr* pmgr, affentry* dp)
   pmyMgr = pmgr;
 
   // set up its intial values
- 
-  aflag = dp->aflag;         // flag 
+
+  aflag = dp->aflag;         // flag
   strip = dp->strip;         // string to strip
   appnd = dp->appnd;         // string to append
   stripl = dp->stripl;       // length of strip string
@@ -70,7 +70,7 @@ char * PfxEntry::add(const char * word, int len)
     char tword[MAXWORDUTF8LEN + 4];
 
     if ((len > stripl) && (len >= numconds) && test_condition(word) &&
-       (!stripl || (strncmp(word, strip, stripl) == 0)) && 
+       (!stripl || (strncmp(word, strip, stripl) == 0)) &&
        ((MAXWORDUTF8LEN + 4) > (len + appndl - stripl))) {
     /* we have a match so add prefix */
               char * pp = tword;
@@ -81,7 +81,7 @@ char * PfxEntry::add(const char * word, int len)
                strcpy(pp, (word + stripl));
                return mystrdup(tword);
      }
-     return NULL;    
+     return NULL;
 }
 
 inline char * PfxEntry::nextchar(char * p) {
@@ -149,7 +149,7 @@ inline int PfxEntry::test_condition(const char * st)
     }
 }
 
-// check if this prefix entry matches 
+// check if this prefix entry matches
 struct hentry * PfxEntry::checkword(const char * word, int len, char in_compound, const FLAG needflag)
 {
     int                 tmpl;   // length of tmpword
@@ -171,7 +171,7 @@ struct hentry * PfxEntry::checkword(const char * word, int len, char in_compound
 
             if (stripl) strcpy (tmpword, strip);
             strcpy ((tmpword + stripl), (word + appndl));
-    
+
             // now make sure all of the conditions on characters
             // are met.  Please see the appendix at the end of
             // this file for more info on exactly what is being
@@ -194,14 +194,14 @@ struct hentry * PfxEntry::checkword(const char * word, int len, char in_compound
                       he = he->next_homonym; // check homonyms
                    } while (he);
                 }
-                
-                // prefix matched but no root word was found 
-                // if aeXPRODUCT is allowed, try again but now 
+
+                // prefix matched but no root word was found
+                // if aeXPRODUCT is allowed, try again but now
                 // ross checked combined with a suffix
 
                 //if ((opts & aeXPRODUCT) && in_compound) {
                 if ((opts & aeXPRODUCT)) {
-                   he = pmyMgr->suffix_check(tmpword, tmpl, aeXPRODUCT, (AffEntry *)this, NULL, 
+                   he = pmyMgr->suffix_check(tmpword, tmpl, aeXPRODUCT, (AffEntry *)this, NULL,
                         0, NULL, FLAG_NULL, needflag, in_compound);
                    if (he) return he;
                 }
@@ -210,7 +210,7 @@ struct hentry * PfxEntry::checkword(const char * word, int len, char in_compound
     return NULL;
 }
 
-// check if this prefix entry matches 
+// check if this prefix entry matches
 struct hentry * PfxEntry::check_twosfx(const char * word, int len,
     char in_compound, const FLAG needflag)
 {
@@ -245,8 +245,8 @@ struct hentry * PfxEntry::check_twosfx(const char * word, int len,
             if (test_condition(tmpword)) {
                 tmpl += stripl;
 
-                // prefix matched but no root word was found 
-                // if aeXPRODUCT is allowed, try again but now 
+                // prefix matched but no root word was found
+                // if aeXPRODUCT is allowed, try again but now
                 // cross checked combined with a suffix
 
                 if ((opts & aeXPRODUCT) && (in_compound != IN_CPD_BEGIN)) {
@@ -258,7 +258,7 @@ struct hentry * PfxEntry::check_twosfx(const char * word, int len,
     return NULL;
 }
 
-// check if this prefix entry matches 
+// check if this prefix entry matches
 char * PfxEntry::check_twosfx_morph(const char * word, int len,
          char in_compound, const FLAG needflag)
 {
@@ -292,8 +292,8 @@ char * PfxEntry::check_twosfx_morph(const char * word, int len,
             if (test_condition(tmpword)) {
                 tmpl += stripl;
 
-                // prefix matched but no root word was found 
-                // if aeXPRODUCT is allowed, try again but now 
+                // prefix matched but no root word was found
+                // if aeXPRODUCT is allowed, try again but now
                 // ross checked combined with a suffix
 
                 if ((opts & aeXPRODUCT) && (in_compound != IN_CPD_BEGIN)) {
@@ -305,7 +305,7 @@ char * PfxEntry::check_twosfx_morph(const char * word, int len,
     return NULL;
 }
 
-// check if this prefix entry matches 
+// check if this prefix entry matches
 char * PfxEntry::check_morph(const char * word, int len, char in_compound, const FLAG needflag)
 {
     int                 tmpl;   // length of tmpword
@@ -313,7 +313,7 @@ char * PfxEntry::check_morph(const char * word, int len, char in_compound, const
     char                tmpword[MAXWORDUTF8LEN + 4];
     char                result[MAXLNLEN];
     char * st;
-    
+
     *result = '\0';
 
     // on entry prefix is 0 length or already matches the beginning of the word.
@@ -349,7 +349,7 @@ char * PfxEntry::check_morph(const char * word, int len, char in_compound, const
                         ! TESTAFF(contclass, pmyMgr->get_needaffix(), contclasslen) &&
                         // needflag
                         ((!needflag) || TESTAFF(he->astr, needflag, he->alen) ||
-                         (contclass && TESTAFF(contclass, needflag, contclasslen)))) {                            
+                         (contclass && TESTAFF(contclass, needflag, contclasslen)))) {
                             if (morphcode) {
                                 strcat(result, " ");
                                 strcat(result, morphcode);
@@ -364,6 +364,13 @@ char * PfxEntry::check_morph(const char * word, int len, char in_compound, const
                             if (HENTRY_DATA(he)) {
                                 strcat(result, " ");
                                 strcat(result,HENTRY_DATA(he));
+                            } else {
+                                // return with debug information
+                                char * flag = pmyMgr->encode_flag(getFlag());
+                                strcat(result, " ");
+                                strcat(result, MORPH_FLAG);
+                                strcat(result, flag);
+                                free(flag);
                             }
                             strcat(result, "\n");
                       }
@@ -371,12 +378,12 @@ char * PfxEntry::check_morph(const char * word, int len, char in_compound, const
                     } while (he);
                 }
 
-                // prefix matched but no root word was found 
-                // if aeXPRODUCT is allowed, try again but now 
+                // prefix matched but no root word was found
+                // if aeXPRODUCT is allowed, try again but now
                 // ross checked combined with a suffix
 
                 if ((opts & aeXPRODUCT) && (in_compound != IN_CPD_BEGIN)) {
-                   st = pmyMgr->suffix_check_morph(tmpword, tmpl, aeXPRODUCT, (AffEntry *)this, 
+                   st = pmyMgr->suffix_check_morph(tmpword, tmpl, aeXPRODUCT, (AffEntry *)this,
                      FLAG_NULL, needflag);
                    if (st) {
                         strcat(result, st);
@@ -385,7 +392,7 @@ char * PfxEntry::check_morph(const char * word, int len, char in_compound, const
                 }
             }
      }
-     
+    
     if (*result) return mystrdup(result);
     return NULL;
 }
@@ -396,7 +403,7 @@ SfxEntry::SfxEntry(AffixMgr * pmgr, affentry* dp)
   pmyMgr = pmgr;
 
   // set up its intial values
-  aflag = dp->aflag;         // char flag 
+  aflag = dp->aflag;         // char flag
   strip = dp->strip;         // string to strip
   appnd = dp->appnd;         // string to append
   stripl = dp->stripl;       // length of strip string
@@ -425,7 +432,7 @@ SfxEntry::~SfxEntry()
     if (strip) free(strip);
     pmyMgr = NULL;
     appnd = NULL;
-    strip = NULL;    
+    strip = NULL;
     if (opts & aeLONGCOND) free(c.l.conds2);
     if (morphcode && !(opts & aeALIASM)) free(morphcode);
     if (contclass && !(opts & aeALIASF)) free(contclass);
@@ -521,7 +528,7 @@ inline int SfxEntry::test_condition(const char * st, const char * beg)
                         if (p && *p != '\0') p = nextchar(p);
                     } else if (pos) {
                         if (neg) return 0;
-                        else if (i == numconds) return 1;                        
+                        else if (i == numconds) return 1;
                         ingroup = true;
                     }
                     if (!pos) {
@@ -538,12 +545,12 @@ inline int SfxEntry::test_condition(const char * st, const char * beg)
     }
 }
 
-// see if this suffix is present in the word 
+// see if this suffix is present in the word
 struct hentry * SfxEntry::checkword(const char * word, int len, int optflags,
     AffEntry* ppfx, char ** wlst, int maxSug, int * ns, const FLAG cclass, const FLAG needflag,
     const FLAG badflag)
 {
-    int                 tmpl;            // length of tmpword 
+    int                 tmpl;            // length of tmpword
     struct hentry *     he;              // hash entry pointer
     unsigned char *     cp;
     char                tmpword[MAXWORDUTF8LEN + 4];
@@ -563,7 +570,7 @@ struct hentry * SfxEntry::checkword(const char * word, int len, int optflags,
     tmpl = len - appndl;
     // the second condition is not enough for UTF-8 strings
     // it checked in test_condition()
-    
+
     if ((tmpl > 0) && (tmpl + stripl >= numconds)) {
 //    if (tmpl > 0) {
 
@@ -596,21 +603,21 @@ struct hentry * SfxEntry::checkword(const char * word, int len, int optflags,
                     do {
                         // check conditional suffix (enabled by prefix)
                         if ((TESTAFF(he->astr, aflag, he->alen) || (ep && ep->getCont() &&
-                                    TESTAFF(ep->getCont(), aflag, ep->getContLen()))) && 
-                            (((optflags & aeXPRODUCT) == 0) || 
+                                    TESTAFF(ep->getCont(), aflag, ep->getContLen()))) &&
+                            (((optflags & aeXPRODUCT) == 0) ||
                             TESTAFF(he->astr, ep->getFlag(), he->alen) ||
                              // enabled by prefix
                             ((contclass) && TESTAFF(contclass, ep->getFlag(), contclasslen))
                             ) &&
                             // handle cont. class
-                            ((!cclass) || 
+                            ((!cclass) ||
                                 ((contclass) && TESTAFF(contclass, cclass, contclasslen))
                             ) &&
                             // check only in compound homonyms (bad flags)
                             (!badflag || !TESTAFF(he->astr, badflag, he->alen)
-                            ) &&                            
+                            ) &&
                             // handle required flag
-                            ((!needflag) || 
+                            ((!needflag) ||
                               (TESTAFF(he->astr, needflag, he->alen) ||
                               ((contclass) && TESTAFF(contclass, needflag, contclasslen)))
                             )
@@ -618,12 +625,12 @@ struct hentry * SfxEntry::checkword(const char * word, int len, int optflags,
                         he = he->next_homonym; // check homonyms
                     } while (he);
 
-                // obsolote stemming code (used only by the 
+                // obsolote stemming code (used only by the
                 // experimental SuffixMgr:suggest_pos_stems)
                 // store resulting root in wlst
                 } else if (wlst && (*ns < maxSug)) {
                     int cwrd = 1;
-                    for (int k=0; k < *ns; k++) 
+                    for (int k=0; k < *ns; k++)
                         if (strcmp(tmpword, wlst[k]) == 0) cwrd = 0;
                     if (cwrd) {
                         wlst[*ns] = mystrdup(tmpword);
@@ -640,11 +647,11 @@ struct hentry * SfxEntry::checkword(const char * word, int len, int optflags,
     return NULL;
 }
 
-// see if two-level suffix is present in the word 
+// see if two-level suffix is present in the word
 struct hentry * SfxEntry::check_twosfx(const char * word, int len, int optflags,
     AffEntry* ppfx, const FLAG needflag)
 {
-    int                 tmpl;            // length of tmpword 
+    int                 tmpl;            // length of tmpword
     struct hentry *     he;              // hash entry pointer
     unsigned char *     cp;
     char                tmpword[MAXWORDUTF8LEN + 4];
@@ -689,7 +696,7 @@ struct hentry * SfxEntry::check_twosfx(const char * word, int len, int optflags,
             if (test_condition((char *) cp, (char *) tmpword)) {
                 if (ppfx) {
                     // handle conditional suffix
-                    if ((contclass) && TESTAFF(contclass, ep->getFlag(), contclasslen)) 
+                    if ((contclass) && TESTAFF(contclass, ep->getFlag(), contclasslen))
                         he = pmyMgr->suffix_check(tmpword, tmpl, 0, NULL, NULL, 0, NULL, (FLAG) aflag, needflag);
                     else
                         he = pmyMgr->suffix_check(tmpword, tmpl, optflags, ppfx, NULL, 0, NULL, (FLAG) aflag, needflag);
@@ -702,18 +709,18 @@ struct hentry * SfxEntry::check_twosfx(const char * word, int len, int optflags,
     return NULL;
 }
 
-// see if two-level suffix is present in the word 
+// see if two-level suffix is present in the word
 char * SfxEntry::check_twosfx_morph(const char * word, int len, int optflags,
     AffEntry* ppfx, const FLAG needflag)
 {
-    int                 tmpl;            // length of tmpword 
+    int                 tmpl;            // length of tmpword
     unsigned char *     cp;
     char                tmpword[MAXWORDUTF8LEN + 4];
     PfxEntry* ep = (PfxEntry *) ppfx;
     char * st;
 
     char result[MAXLNLEN];
-    
+
     *result = '\0';
 
     // if this suffix is being cross checked with a prefix
@@ -788,7 +795,7 @@ char * SfxEntry::check_twosfx_morph(const char * word, int len, int optflags,
 }
 
 // get next homonym with same affix
-struct hentry * SfxEntry::get_next_homonym(struct hentry * he, int optflags, AffEntry* ppfx, 
+struct hentry * SfxEntry::get_next_homonym(struct hentry * he, int optflags, AffEntry* ppfx,
     const FLAG cclass, const FLAG needflag)
 {
     PfxEntry* ep = (PfxEntry *) ppfx;
@@ -796,18 +803,18 @@ struct hentry * SfxEntry::get_next_homonym(struct hentry * he, int optflags, Aff
 
     while (he->next_homonym) {
         he = he->next_homonym;
-        if ((TESTAFF(he->astr, aflag, he->alen) || (ep && ep->getCont() && TESTAFF(ep->getCont(), aflag, ep->getContLen()))) && 
-                            ((optflags & aeXPRODUCT) == 0 || 
+        if ((TESTAFF(he->astr, aflag, he->alen) || (ep && ep->getCont() && TESTAFF(ep->getCont(), aflag, ep->getContLen()))) &&
+                            ((optflags & aeXPRODUCT) == 0 ||
                             TESTAFF(he->astr, eFlag, he->alen) ||
                              // handle conditional suffix
                             ((contclass) && TESTAFF(contclass, eFlag, contclasslen))
                             ) &&
                             // handle cont. class
-                            ((!cclass) || 
+                            ((!cclass) ||
                                 ((contclass) && TESTAFF(contclass, cclass, contclasslen))
                             ) &&
                             // handle required flag
-                            ((!needflag) || 
+                            ((!needflag) ||
                               (TESTAFF(he->astr, needflag, he->alen) ||
                               ((contclass) && TESTAFF(contclass, needflag, contclasslen)))
                             )
diff --git a/src/hunspell/affixmgr.cxx b/src/hunspell/affixmgr.cxx
index 251d7ae..3fe51b6 100644
--- a/src/hunspell/affixmgr.cxx
+++ b/src/hunspell/affixmgr.cxx
@@ -20,7 +20,7 @@
 #include "csutil.hxx"
 
 #ifndef MOZILLA_CLIENT
-#ifndef W32
+#ifndef WIN32
 using namespace std;
 #endif
 #endif
@@ -946,6 +946,15 @@ int AffixMgr::process_sfx_order()
     return 0;
 }
 
+// add flags to the result for dictionary debugging
+void AffixMgr::debugflag(char * result, unsigned short flag) {
+    char * st = encode_flag(flag);
+    strcat(result, " ");
+    strcat(result, MORPH_FLAG);
+    strcat(result, st);
+    free(st);
+}
+
 // calculate the character length of the condition
 int AffixMgr::condlen(char * st)
 {
@@ -2411,14 +2420,14 @@ char * AffixMgr::suffix_check_twosfx_morph(const char * word, int len,
                     if (((PfxEntry *) ppfx)->getMorph()) {
                         strcat(result, ((PfxEntry *) ppfx)->getMorph());
                         strcat(result, " ");
-                    }
+                    } else debugflag(result, ((PfxEntry *) ppfx)->getFlag());
                 }
                 strcat(result, st);
                 free(st);
                 if (se->getMorph()) {
                     strcat(result, " ");
                     strcat(result, se->getMorph());
-                }
+                } else debugflag(result, se->getFlag());
                 strcat(result, "\n");
             }
         }
@@ -2453,7 +2462,7 @@ char * AffixMgr::suffix_check_twosfx_morph(const char * word, int len,
                 if (sptr->getMorph()) {
                     strcat(result3, " ");
                     strcat(result3, sptr->getMorph());
-                }
+                } else debugflag(result3, sptr->getFlag());
                 strlinecat(result2, result3);
                 strcat(result2, "\n");
                 strcat(result,  result2);
@@ -2513,7 +2522,7 @@ char * AffixMgr::suffix_check_morph(const char * word, int len,
                 if (((PfxEntry *) ppfx)->getMorph()) {
                     strcat(result, ((PfxEntry *) ppfx)->getMorph());
                     strcat(result, " ");
-                }
+                } else debugflag(result, ((PfxEntry *) ppfx)->getFlag());
             }
             if (complexprefixes && HENTRY_DATA(rv)) strcat(result, HENTRY_DATA(rv));
             if (! HENTRY_FIND(rv, MORPH_STEM)) {
@@ -2525,13 +2534,13 @@ char * AffixMgr::suffix_check_morph(const char * word, int len,
 //            sprintf(result + strlen(result), " %s%p", MORPH_HENTRY, rv);
             
             if (!complexprefixes && HENTRY_DATA(rv)) {
-                strcat(result, " ");                                
-                strcat(result, HENTRY_DATA(rv));
+                    strcat(result, " ");                                
+                    strcat(result, HENTRY_DATA(rv));
             }
             if (se->getMorph()) {
                 strcat(result, " ");                                
                 strcat(result, se->getMorph());
-            }
+            } else debugflag(result, se->getFlag());
             strcat(result, "\n");
             rv = se->get_next_homonym(rv, sfxopts, ppfx, cclass, needflag);
          }
@@ -2571,7 +2580,7 @@ char * AffixMgr::suffix_check_morph(const char * word, int len,
                         if (((PfxEntry *) ppfx)->getMorph()) {
                             strcat(result, ((PfxEntry *) ppfx)->getMorph());
                             strcat(result, " ");
-                        }
+                        } else debugflag(result, ((PfxEntry *) ppfx)->getFlag());
                     }    
                     if (complexprefixes && HENTRY_DATA(rv)) strcat(result, HENTRY_DATA(rv));
                     if (! HENTRY_FIND(rv, MORPH_STEM)) {
@@ -2599,7 +2608,7 @@ char * AffixMgr::suffix_check_morph(const char * word, int len,
                 if (sptr->getMorph()) {
                     strcat(result, " ");
                     strcat(result, sptr->getMorph());
-                }
+                } else debugflag(result, sptr->getFlag());
                 strcat(result, "\n");
                 rv = sptr->get_next_homonym(rv, sfxopts, ppfx, cclass, needflag);
             }
@@ -2965,6 +2974,12 @@ int AffixMgr::get_checksharps()
   return checksharps;
 }
 
+char * AffixMgr::encode_flag(unsigned short aflag)
+{
+  return pHMgr->encode_flag(aflag);
+}
+
+
 // return the preferred ignore string for suggestions
 char * AffixMgr::get_ignore()
 {
@@ -3745,7 +3760,7 @@ int  AffixMgr::parse_affix(char * line, const char at, FileMgr * af, char * dupf
    struct affentry * nptr= NULL;
 
    char * tp = line;
-   char * nl;
+   char * nl = NULL;
    char * piece;
    int i = 0;
 
@@ -3773,7 +3788,7 @@ int  AffixMgr::parse_affix(char * line, const char at, FileMgr * af, char * dupf
                         HUNSPELL_WARNING(stderr, "error: duplicate affix flag %s in line %s\n", piece, nl);
                         // return 1; XXX permissive mode for bad dictionaries
                     }
-                    dupflags[aflag] += ((at == 'S') ? dupSFX : dupPFX);
+                    dupflags[aflag] += (char) ((at == 'S') ? dupSFX : dupPFX);
                     break; 
                     }
              // piece 3 - is cross product indicator 
@@ -3835,7 +3850,7 @@ int  AffixMgr::parse_affix(char * line, const char at, FileMgr * af, char * dupf
                 case 0: { 
                           np++;
                           if (nptr != ptr) nptr->opts = ptr->opts &
-                             (aeXPRODUCT + aeUTF8 + aeALIASF + aeALIASM);
+                             (char) (aeXPRODUCT + aeUTF8 + aeALIASF + aeALIASM);
                           break;
                         }
 
diff --git a/src/hunspell/affixmgr.hxx b/src/hunspell/affixmgr.hxx
index 969780d..f045b87 100644
--- a/src/hunspell/affixmgr.hxx
+++ b/src/hunspell/affixmgr.hxx
@@ -193,6 +193,7 @@ public:
   int                 get_sugswithdots(void);
   FLAG                get_keepcase(void);
   int                 get_checksharps(void);
+  char *              encode_flag(unsigned short aflag);
 
 private:
   int  parse_file(const char * affpath, const char * key);
@@ -208,6 +209,7 @@ private:
   int  parse_affix(char * line, const char at, FileMgr * af, char * dupflags);
 
   void reverse_condition(char *);
+  void debugflag(char * result, unsigned short flag);
   int condlen(char *);
   int encodeit(struct affentry * ptr, char * cs);
   int build_pfxtree(AffEntry* pfxptr);
diff --git a/src/hunspell/atypes.hxx b/src/hunspell/atypes.hxx
index 0afb345..0d4db14 100644
--- a/src/hunspell/atypes.hxx
+++ b/src/hunspell/atypes.hxx
@@ -13,8 +13,8 @@ static inline void HUNSPELL_WARNING(FILE *, const char *, ...) {}
 // HUNSTEM def.
 #define HUNSTEM
 
-#include "csutil.hxx"
 #include "hashmgr.hxx"
+#include "w_char.hxx"
 
 #define SETSIZE         256
 #define CONTSIZE        65536
@@ -70,6 +70,12 @@ struct affentry
    char *       morphcode;
 };
 
+struct guessword {
+  char * word;
+  bool allow;
+  char * orig;
+};
+
 struct mapentry {
   char * set;
   w_char * set_utf16;
@@ -81,10 +87,4 @@ struct flagentry {
   int len;
 };
 
-struct guessword {
-  char * word;
-  bool allow;
-  char * orig;
-};
-
 #endif
diff --git a/src/hunspell/csutil.cxx b/src/hunspell/csutil.cxx
index 784ffa9..008e19f 100644
--- a/src/hunspell/csutil.cxx
+++ b/src/hunspell/csutil.cxx
@@ -45,7 +45,7 @@ static NS_DEFINE_CID(kUnicharUtilCID, NS_UNICHARUTIL_CID);
 using namespace std;
 #endif
 #else
-#ifndef W32
+#ifndef WIN32
 using namespace std;
 #endif
 #endif
@@ -350,9 +350,10 @@ char * line_uniq_app(char ** text, char breakchar) {
     }
     
     char ** lines;
+    int i;
     int linenum = line_tok(*text, &lines, breakchar);
     int dup = 0;
-    for (int i = 0; i < linenum; i++) {
+    for (i = 0; i < linenum; i++) {
         for (int j = 0; j < (i - 1); j++) {
             if (strcmp(lines[i], lines[j]) == 0) {
                 *(lines[i]) = '\0';
@@ -375,7 +376,7 @@ char * line_uniq_app(char ** text, char breakchar) {
         return *text;
     }    
     strcpy(*text," ( ");
-    for (int i = 0; i < linenum; i++) if (*(lines[i])) {
+    for (i = 0; i < linenum; i++) if (*(lines[i])) {
         sprintf(*text + strlen(*text), "%s%s", lines[i], " | ");
     }
     (*text)[strlen(*text) - 2] = ')'; // " ) "
@@ -579,8 +580,9 @@ char * mystrrep(char * word, const char * pat, const char * rep) {
  }
 
  int uniqlist(char ** list, int n) {
+   int i;
    if (n < 2) return n;
-   for (int i = 0; i < n; i++) {
+   for (i = 0; i < n; i++) {
      for (int j = 0; j < i; j++) {
         if (list[j] && list[i] && (strcmp(list[j], list[i]) == 0)) {
             free(list[i]);
@@ -590,7 +592,7 @@ char * mystrrep(char * word, const char * pat, const char * rep) {
      }
    } 
    int m = 1;  
-   for (int i = 1; i < n; i++) if (list[i]) {
+   for (i = 1; i < n; i++) if (list[i]) {
         list[m] = list[i];
         m++;
     }
diff --git a/src/hunspell/csutil.hxx b/src/hunspell/csutil.hxx
index 442cac2..fbed083 100644
--- a/src/hunspell/csutil.hxx
+++ b/src/hunspell/csutil.hxx
@@ -3,6 +3,8 @@
 
 // First some base level utility routines
 
+#include "w_char.hxx"
+
 #define NOCAP   0
 #define INITCAP 1
 #define ALLCAP  2
@@ -23,6 +25,7 @@
 #define MORPH_PHON        "ph:"
 #define MORPH_HYPH        "hy:"
 #define MORPH_PART        "pa:"
+#define MORPH_FLAG        "fl:"
 #define MORPH_HENTRY      "_H:"
 #define MORPH_TAG_LEN     strlen(MORPH_STEM)
 
@@ -35,10 +38,9 @@
 #define FORBIDDENWORD  65510
 #define ONLYUPCASEFLAG 65511
 
-typedef struct __attribute__ ((packed)) {
-    unsigned char l;
-    unsigned char h;
-} w_char;
+#define HENTRY_DATA(h) (h->var ? ((h->var & H_OPT_ALIASM) ? \
+    get_stored_pointer(&(h->word) + h->blen + 1) : &(h->word) + h->blen + 1) : NULL)
+#define HENTRY_FIND(h,p) (HENTRY_DATA(h) ? strstr(HENTRY_DATA(h), p) : NULL)
 
 #define w_char_eq(a,b) (((a).l == (b).l) && ((a).h == (b).h))
 
@@ -103,12 +105,6 @@ struct cs_info {
   unsigned char cupper;
 };
 
-// two character arrays
-struct replentry {
-  char * pattern;
-  char * pattern2;
-};
-
 // Unicode character encoding information
 struct unicode_info {
   unsigned short c;
diff --git a/src/hunspell/hashmgr.cxx b/src/hunspell/hashmgr.cxx
index 5f0b169..48cbb25 100644
--- a/src/hunspell/hashmgr.cxx
+++ b/src/hunspell/hashmgr.cxx
@@ -22,7 +22,7 @@
 using namespace std;
 #endif
 #else
-#ifndef W32
+#ifndef WIN32
 using namespace std;
 #endif
 #endif
diff --git a/src/hunspell/htypes.hxx b/src/hunspell/htypes.hxx
index 718a0f8..33fe91b 100644
--- a/src/hunspell/htypes.hxx
+++ b/src/hunspell/htypes.hxx
@@ -12,10 +12,6 @@
 #define H_OPT_PHON   (1 << 2)
 
 #define HENTRY_WORD(h) &(h->word)
-#define HENTRY_DATA(h) (h->var ? ((h->var & H_OPT_ALIASM) ? \
-    get_stored_pointer(&(h->word) + h->blen + 1) : &(h->word) + h->blen + 1) : NULL)
-//    *((char **) (&(h->word) + h->blen + 1)) : &(h->word) + h->blen + 1) : NULL)
-#define HENTRY_FIND(h,p) (HENTRY_DATA(h) ? strstr(HENTRY_DATA(h), p) : NULL)
 
 // approx. number  of user defined words
 #define USERWORD 1000
diff --git a/src/hunspell/hunspell.cxx b/src/hunspell/hunspell.cxx
index f2f7536..0acf7bd 100644
--- a/src/hunspell/hunspell.cxx
+++ b/src/hunspell/hunspell.cxx
@@ -14,9 +14,10 @@
 #include "hunspell.hxx"
 #include "hunspell.h"
 #include "config.h"
+#include "csutil.hxx"
 
 #ifndef MOZILLA_CLIENT
-#ifndef W32
+#ifndef WIN32
 using namespace std;
 #endif
 #endif
@@ -51,7 +52,6 @@ Hunspell::Hunspell(const char * affpath, const char * dpath, const char * key)
     /* and finally set up the suggestion manager */
     pSMgr = new SuggestMgr(try_string, MAXSUGGESTION, pAMgr);
     if (try_string) free(try_string);
-
 }
 
 Hunspell::~Hunspell()
@@ -62,7 +62,6 @@ Hunspell::~Hunspell()
     maxdic = 0;
     pSMgr = NULL;
     pAMgr = NULL;
-    pHMgr[0] = NULL;
 #ifdef MOZILLA_CLIENT
     free(csconv);
 #endif
@@ -369,7 +368,8 @@ int Hunspell::spell(const char * word, int * info, char ** root)
   // LANG_hu section: number(s) + (percent or degree) with suffixes
   if (langnum == LANG_hu) {
     if ((nstate == NNUM) && ((cw[i] == '%') || ((!utf8 && (cw[i] == '\xB0')) ||
-        (utf8 && (strncmp(cw + i, "\xC2\xB0", 2)==0))))
+        (utf8 && (strncmp(cw + i, "\xC2\xB0", 2)==0 ||     // UTF-8 degree 
+                  strncmp(cw + i, "\xE2\x80\xB0", 3)==0)))) // UTF-8 per mille
                && checkword(cw + i, info, root)) return 1;
   }
   // END of LANG_hu section
@@ -1098,7 +1098,9 @@ int Hunspell::stem(char*** slst, char ** desc, int n)
     }
     freelist(&pl, pln);
   }
-  return uniqlist(*slst, line_tok(result2, slst, MSEP_REC));
+  int sln = line_tok(result2, slst, MSEP_REC);
+  return uniqlist(*slst, sln);
+  
 }
 
 int Hunspell::stem(char*** slst, const char * word)
diff --git a/src/hunspell/hunspell.h b/src/hunspell/hunspell.h
index dc8d501..63c0c29 100644
--- a/src/hunspell/hunspell.h
+++ b/src/hunspell/hunspell.h
@@ -7,19 +7,25 @@ extern "C" {
 
 typedef struct Hunhandle Hunhandle;
 
-Hunhandle *Hunspell_create(const char * affpath, const char * dpath);
+#ifdef _MSC_VER
+#define DLL __declspec ( dllexport )
+#else
+#define DLL 
+#endif
+
+DLL Hunhandle *Hunspell_create(const char * affpath, const char * dpath);
 
-Hunhandle *Hunspell_create_key(const char * affpath, const char * dpath,
+DLL Hunhandle *Hunspell_create_key(const char * affpath, const char * dpath,
     const char * key);
 
-void Hunspell_destroy(Hunhandle *pHunspell);
+DLL void Hunspell_destroy(Hunhandle *pHunspell);
 
 /* spell(word) - spellcheck word
  * output: 0 = bad word, not 0 = good word
  */
-int Hunspell_spell(Hunhandle *pHunspell, const char *);
+DLL int Hunspell_spell(Hunhandle *pHunspell, const char *);
 
-char *Hunspell_get_dic_encoding(Hunhandle *pHunspell);
+DLL char *Hunspell_get_dic_encoding(Hunhandle *pHunspell);
 
 /* suggest(suggestions, word) - search suggestions
  * input: pointer to an array of strings pointer and the (bad) word
@@ -28,17 +34,17 @@ char *Hunspell_get_dic_encoding(Hunhandle *pHunspell);
  *   a newly allocated array of strings (*slts will be NULL when number
  *   of suggestion equals 0.)
  */
-int Hunspell_suggest(Hunhandle *pHunspell, char*** slst, const char * word);
+DLL int Hunspell_suggest(Hunhandle *pHunspell, char*** slst, const char * word);
 
  /* morphological functions */
 
  /* analyze(result, word) - morphological analysis of the word */
 
-int Hunspell_analyze(Hunhandle *pHunspell, char*** slst, const char * word);
+DLL int Hunspell_analyze(Hunhandle *pHunspell, char*** slst, const char * word);
 
  /* stem(result, word) - stemmer function */
 
-int Hunspell_stem(Hunhandle *pHunspell, char*** slst, const char * word);
+DLL int Hunspell_stem(Hunhandle *pHunspell, char*** slst, const char * word);
 
  /* stem(result, analysis, n) - get stems from a morph. analysis
   * example:
@@ -47,11 +53,11 @@ int Hunspell_stem(Hunhandle *pHunspell, char*** slst, const char * word);
   * int n2 = Hunspell_stem2(result2, result, n1);   
   */
 
-int Hunspell_stem2(Hunhandle *pHunspell, char*** slst, char** desc, int n);
+DLL int Hunspell_stem2(Hunhandle *pHunspell, char*** slst, char** desc, int n);
 
  /* generate(result, word, word2) - morphological generation by example(s) */
 
-int Hunspell_generate(Hunhandle *pHunspell, char*** slst, const char * word,
+DLL int Hunspell_generate(Hunhandle *pHunspell, char*** slst, const char * word,
     const char * word2);
 
  /* generate(result, word, desc, n) - generation by morph. description(s)
@@ -62,27 +68,26 @@ int Hunspell_generate(Hunhandle *pHunspell, char*** slst, const char * word,
   * for (int i = 0; i < n; i++) printf("%s\n", result[i]);
   */
 
-int Hunspell_generate2(Hunhandle *pHunspell, char*** slst, const char * word,
+DLL int Hunspell_generate2(Hunhandle *pHunspell, char*** slst, const char * word,
     char** desc, int n);
 
   /* functions for run-time modification of the dictionary */
 
   /* add word to the run-time dictionary */
   
-int Hunspell_add(Hunhandle *pHunspell, const char * word);
+DLL int Hunspell_add(Hunhandle *pHunspell, const char * word);
 
   /* add word to the run-time dictionary with affix flags of
    * the example (a dictionary word): Hunspell will recognize
    * affixed forms of the new word, too.
    */
   
-int Hunspell_add_with_affix(Hunhandle *pHunspell, const char * word, const char * example);
+DLL int Hunspell_add_with_affix(Hunhandle *pHunspell, const char * word, const char * example);
 
   /* remove word from the run-time dictionary */
   /* NOTE: not implemented yet */
 
-int Hunspell_remove(Hunhandle *pHunspell, const char * word);
-
+DLL int Hunspell_remove(Hunhandle *pHunspell, const char * word);
 
 #ifdef __cplusplus
 }
diff --git a/src/hunspell/hunspell.hxx b/src/hunspell/hunspell.hxx
index 8461b54..c083f20 100644
--- a/src/hunspell/hunspell.hxx
+++ b/src/hunspell/hunspell.hxx
@@ -1,7 +1,6 @@
 #include "hashmgr.hxx"
 #include "affixmgr.hxx"
 #include "suggestmgr.hxx"
-#include "csutil.hxx"
 #include "langnum.hxx"
 
 #define  SPELL_COMPOUND  (1 << 0)
@@ -27,7 +26,7 @@
 	#endif
 #endif
 
-#ifdef W32
+#ifdef WIN32
 class DLLEXPORT Hunspell
 #else
 class Hunspell
@@ -51,7 +50,7 @@ public:
   /* Hunspell(aff, dic) - constructor of Hunspell class
    * input: path of affix file and dictionary file
    */
-  
+
   Hunspell(const char * affpath, const char * dpath, const char * key = NULL);
   ~Hunspell();
 
diff --git a/src/hunspell/hunzip.cxx b/src/hunspell/hunzip.cxx
index 93912df..f9091b8 100644
--- a/src/hunspell/hunzip.cxx
+++ b/src/hunspell/hunzip.cxx
@@ -1,6 +1,12 @@
-#include <stdio.h>
-#include <stdlib.h>
+#ifndef MOZILLA_CLIENT
+#include <cstdlib>
+#include <cstring>
+#include <cstdio>
+#else
+#include <stdlib.h> 
 #include <string.h>
+#include <stdio.h> 
+#endif
 
 #include "hunzip.hxx"
 
@@ -31,11 +37,11 @@ Hunzip::Hunzip(const char * file, const char * key) {
 
 int Hunzip::getcode(const char * key) {
     unsigned char c[2];
-    int i, j, n, o, p;
+    int i, j, n, p;
     int allocatedbit = BASEBITREC;
     const char * enc = key;
 
-    fin = fopen(filename, "r");
+    fin = fopen(filename, "rb");
     if (!fin) return -1;
 
     // read magic number
@@ -85,7 +91,7 @@ int Hunzip::getcode(const char * key) {
             if (*(++enc) == '\0') enc = key;
             l ^= *enc;
         }
-        if (fread(in, 1, l/8+1, fin) < l/8+1) return fail(MSG_FORMAT, filename);
+        if (fread(in, 1, l/8+1, fin) < (size_t) l/8+1) return fail(MSG_FORMAT, filename);
         if (key) for (j = 0; j <= l/8; j++) {
             if (*(++enc) == '\0') enc = key;
             in[j] ^= *enc;
@@ -151,7 +157,6 @@ int Hunzip::getbuf() {
 const char * Hunzip::getline() {
     char linebuf[BUFSIZE];
     int l = 0, eol = 0, left = 0, right = 0;
-    char end;
     if (bufsiz == -1) return NULL;
     while (l < bufsiz && !eol) {
         linebuf[l++] = out[outc];
diff --git a/src/hunspell/phonet.cxx b/src/hunspell/phonet.cxx
index e4ad5a0..91dc419 100644
--- a/src/hunspell/phonet.cxx
+++ b/src/hunspell/phonet.cxx
@@ -46,7 +46,7 @@ void init_phonet_hash(phonetable & parms)
   {
     int i, k;
 
-    for (i = 0; i < parms.hash_size; i++) {
+    for (i = 0; i < HASHSIZE; i++) {
       parms.hash[i] = -1;
     }
 
diff --git a/src/hunspell/phonet.hxx b/src/hunspell/phonet.hxx
index 471ff84..d1cf995 100644
--- a/src/hunspell/phonet.hxx
+++ b/src/hunspell/phonet.hxx
@@ -30,6 +30,7 @@
 #ifndef __PHONETHXX__
 #define __PHONETHXX__
 
+#define HASHSIZE          256
 #define MAXPHONETLEN      256
 #define MAXPHONETUTF8LEN  (MAXPHONETLEN * 4)
 
@@ -38,8 +39,7 @@ struct phonetable {
   cs_info * lang;
   int num;
   char * * rules;
-  static const int hash_size = 256;
-  int hash[hash_size];
+  int hash[HASHSIZE];
 };
 
 void init_phonet_hash(phonetable & parms);
diff --git a/src/hunspell/suggestmgr.cxx b/src/hunspell/suggestmgr.cxx
index ce54f57..c19ba08 100644
--- a/src/hunspell/suggestmgr.cxx
+++ b/src/hunspell/suggestmgr.cxx
@@ -15,9 +15,10 @@
 
 #include "suggestmgr.hxx"
 #include "htypes.hxx"
+#include "csutil.hxx"
 
 #ifndef MOZILLA_CLIENT
-#ifndef W32
+#ifndef WIN32
 using namespace std;
 #endif
 #endif
diff --git a/src/hunspell/w_char.hxx b/src/hunspell/w_char.hxx
new file mode 100644
index 0000000..a3d11c3
--- /dev/null
+++ b/src/hunspell/w_char.hxx
@@ -0,0 +1,19 @@
+#ifndef __WCHARHXX__
+#define __WCHARHXX__
+
+#ifdef WIN32
+typedef struct {
+#else
+typedef struct __attribute__ ((packed)) {
+#endif
+    unsigned char l;
+    unsigned char h;
+} w_char;
+
+// two character arrays
+struct replentry {
+  char * pattern;
+  char * pattern2;
+};
+
+#endif
diff --git a/src/tools/affixcompress b/src/tools/affixcompress
index a2b9508..c2e174b 100755
--- a/src/tools/affixcompress
+++ b/src/tools/affixcompress
@@ -1,21 +1,22 @@
 #!/bin/sh
 # affix compressor utility for Hunspell
-# 2007 (c) László Németh, version 0.2
-# usage: affixcompress sorted_word_list_file
+# 2008 (c) László Németh, version 0.3
+# usage: affixcompress sorted_word_list_file [max_affix_rules]
 case $# in 
 0) echo \
 "affixcompress - compress a huge sorted word list to Hunspell aff and dic file
-Usage: affixcompress sorted_word_list_file
+Usage: affixcompress sorted_word_list_file [max_affix_rules]
 Note: output may need manually added affix parameters (SET character_encoding,
 TRY suggestion_characters etc., see man(4) hunspell)"
    exit 0;;
 esac
 
+MAXAFFIX=${2:-5000}
+
 # profiling
 #AWK="pgawk --profile"
 AWK="gawk"
 
-export LC_ALL=C
 rm -f $1.aff $1.dic
 cat $1 | $AWK '
 {
@@ -33,6 +34,7 @@ cat $1 | $AWK '
                 delete A
                 delete B
                 print "Deleted roots: ", prev > "/dev/stderr"
+                A[$1] = 1
             }
             prev = r
         }
@@ -50,7 +52,8 @@ END {
     for (i in sfy) print i, sfy[i]
 }
 ' | tr '\034' ' ' >affixcompress0.tmp
-sort -rnk 3 affixcompress0.tmp | $AWK '$3 > 20{print $0}' | head -20000 >affixcompress1.tmp
+sort -rnk 3 affixcompress0.tmp | $AWK '$3 >= 1{print $0}' |
+head -$MAXAFFIX >affixcompress1.tmp
 cat affixcompress1.tmp |
 $AWK '
 function potential_roots() {
diff --git a/src/tools/analyze.cxx b/src/tools/analyze.cxx
index 9b2fa91..e6ac5c2 100644
--- a/src/tools/analyze.cxx
+++ b/src/tools/analyze.cxx
@@ -5,7 +5,7 @@
 
 #include "hunspell.hxx"
 
-#ifndef W32
+#ifndef WIN32
 using namespace std;
 #endif
 
diff --git a/src/tools/chmorph.cxx b/src/tools/chmorph.cxx
index c2f372e..c2bd113 100644
--- a/src/tools/chmorph.cxx
+++ b/src/tools/chmorph.cxx
@@ -5,12 +5,20 @@
 #include "hunspell.hxx"
 #include "textparser.hxx"
 
-#ifndef W32
+#ifndef WIN32
 using namespace std;
 #endif
 
-int 
-main(int argc, char** argv)
+void freelist(char *** list, int n) {
+   if (list && (n > 0)) {
+      for (int i = 0; i < n; i++) if ((*list)[i]) free((*list)[i]);
+      free(*list);
+      *list = NULL;
+   }
+}
+ 
+
+int main(int argc, char** argv)
 {
     FILE * f;
     
diff --git a/src/tools/hunspell.cxx b/src/tools/hunspell.cxx
index 96d17fd..c699c2c 100644
--- a/src/tools/hunspell.cxx
+++ b/src/tools/hunspell.cxx
@@ -7,9 +7,9 @@
 
 #include <cstdlib>
 #include <cstdio>
-
 #include "config.h"
 #include "hunspell.hxx"
+#include "csutil.hxx"
 
 #ifndef HUNSPELL_EXTRA
 #define suggest_auto suggest
@@ -26,12 +26,14 @@
 
 #define DEFAULTDICNAME "default"
 
-#ifdef W32
+#ifdef WIN32
 
 #define gettext
 #define LIBDIR "C:\\Hunspell\\"
 #define USEROOODIR "Application Data\\OpenOffice.org 2\\user\\wordbook"
-#define OOODIR "C:\\Program files\\OpenOffice.org 2.3\\share\\dict\\ooo\\;" \
+#define OOODIR \
+    "C:\\Program files\\OpenOffice.org 2.4\\share\\dict\\ooo\\;" \
+    "C:\\Program files\\OpenOffice.org 2.3\\share\\dict\\ooo\\;" \
     "C:\\Program files\\OpenOffice.org 2.2\\share\\dict\\ooo\\;" \
     "C:\\Program files\\OpenOffice.org 2.1\\share\\dict\\ooo\\;" \
     "C:\\Program files\\OpenOffice.org 2.0\\share\\dict\\ooo\\"
@@ -51,7 +53,8 @@
 #else
 
 // Not Windows
-
+#include <sys/types.h>
+#include <dirent.h>
 #include <unistd.h>
 #include "textparser.hxx"
 #include "htmlparser.hxx"
@@ -59,9 +62,16 @@
 #include "manparser.hxx"
 #include "firstparser.hxx"
 
-#define LIBDIR "/usr/share/hunspell:/usr/share/myspell"
-#define USEROOODIR ".openoffice.org2/user/wordbook"
-#define OOODIR "/opt/openoffice.org2.3/share/dict/ooo:" \
+#define LIBDIR \
+    "/usr/share/hunspell:" \
+    "/usr/share/myspell"
+#define USEROOODIR \
+    ".openoffice.org2/user/wordbook:" \
+    ".openoffice.org2.0/user/wordbook"
+#define OOODIR \
+    "/opt/openoffice.org2.4/share/dict/ooo:" \
+    "/usr/lib/openoffice.org2.4/share/dict/ooo:" \
+    "/opt/openoffice.org2.3/share/dict/ooo:" \
     "/usr/lib/openoffice.org2.3/share/dict/ooo:" \
     "/opt/openoffice.org2.2/share/dict/ooo:" \
     "/usr/lib/openoffice.org2.2/share/dict/ooo:" \
@@ -143,6 +153,8 @@ enum { NORMAL,
        BADWORD,    // print only bad words
        WORDFILTER, // print only bad words from 1 word/line input
        BADLINE,    // print only lines with bad words
+       STEM,       // stem input words
+       ANALYZE,    // analyze input words
        PIPE,       // print only stars for LyX compatibility
        AUTO0,      // search typical error (based on SuggestMgr::suggest_auto())
        AUTO,       // automatic spelling to standard output
@@ -516,7 +528,7 @@ nextline: while(fgets(buf, MAXLNLEN, fileid)) {
 	    fprintf(stderr, gettext("error - missing HOME variable"));
 	    continue;
 	}
-#ifndef W32
+#ifndef WIN32
 	strcat(buf,"/");
 #endif
 	buf2 = buf+strlen(buf);
@@ -608,6 +620,46 @@ if (pos >= 0) {
 			continue;			
 		}
 
+		case STEM: {
+                char ** result;
+                int n = pMS->stem(&result, token);
+                for (int i = 0; i < n; i++) {
+                	fprintf(stdout, "%s %s\n", token, result[i]);
+                	free(result[i]);
+                }
+                if (n == 0 && token[strlen(token) - 1] == '.') {
+                	token[strlen(token) - 1] = '\0';
+                        n = pMS->stem(&result, token);
+                        for (int i = 0; i < n; i++) {
+                	        fprintf(stdout, "%s %s\n", token, result[i]);
+                	        free(result[i]);
+                	}
+                }
+                if (n == 0) fprintf(stdout, "%s\n", token); else free(result);
+		free(token);
+		continue;
+		}
+
+		case ANALYZE: {
+                char ** result;
+                int n = pMS->analyze(&result, token);
+                for (int i = 0; i < n; i++) {
+                	fprintf(stdout, "%s %s\n", token, result[i]);
+                	free(result[i]);
+                }
+                if (n == 0 && token[strlen(token) - 1] == '.') {
+                	token[strlen(token) - 1] = '\0';
+                        n = pMS->analyze(&result, token);
+                        for (int i = 0; i < n; i++) {
+                	        fprintf(stdout, "%s %s\n", token, result[i]);
+                	        free(result[i]);
+                	}
+                }
+                if (n == 0) fprintf(stdout, "%s\n", token); else free(result);
+		free(token);
+		continue;
+		}
+
 		case PIPE: {
 		int info;
                 char * root = NULL;
@@ -703,7 +755,7 @@ if (parser) delete(parser);
 
 } // pipe_interface
 
-#ifndef W32
+#ifndef WIN32
 
 #ifdef HAVE_CURSES_H
 #ifdef HAVE_READLINE
@@ -730,32 +782,50 @@ static int rl_escape (int count, int key)
 }
 #endif
 
-void expand_tab(char * dest, char * src, int limit) {
+int expand_tab(char * dest, char * src, int limit) {
 	int i = 0;
+        int u8 = strcmp(ui_enc, "UTF-8") == 0 ? 1 : 0;
+        int chpos = 0;
 	for(int j = 0; (i < limit) && (src[j] != '\0') && (src[j] != '\r'); j++) {
 		dest[i] = src[j];
 		if (src[j] == '\t') {
-			int end = 8 - (i % 8);
+			int end = 8 - (chpos % 8);
 			for(int k = 0; k < end; k++) {
 				dest[i] = ' ';
 				i++;
+				chpos++;
 			}
-		} else i++;
+		} else {
+		    i++;
+		    if (!u8 || (src[j] & 0xc0) != 0x80) chpos++;
+		}
 	}
 	dest[i] = '\0';
+	return chpos;
 }
 
-int pos_tab(char * s, int pos) {
-	int expand = 0;
-	for(int i = 0; i < pos; i++) {
-		expand += (s[i] == '\t') ? 8 - (expand % 8) : 1;
-	}
-	return expand;
+// UTF-8 version of strncpy (but output is always null terminated)
+char * strncpyu8(char * dest, const char * src, int begin, size_t n) {
+        int u8 = strcmp(ui_enc, "UTF-8") == 0 ? 1 : 0;
+        for (int i = 0; i <= begin + n;) {
+            if (!u8 || (*src & 0xc0) != 0x80) i++;
+            if (i >= begin && i <= begin + n) {
+                if (*src) {
+                    *dest = *src;
+                    src++;
+                } else *dest = '\0';
+                dest++;
+            }
+        }
+        if (n) *(dest - 1) = '\0'; else *dest = '\0';
+        return dest;
 }
 
 void dialogscreen(TextParser * parser, char * token,
 		char * filename, int forbidden, char ** wlst, int ns) {
 	int x, y;
+	char line[MAXLNLEN];
+	char line2[MAXLNLEN];
 	getmaxyx(stdscr,y,x);
 	clear();
 
@@ -767,55 +837,49 @@ void dialogscreen(TextParser * parser, char * token,
 	char lines[MAXPREVLINE][MAXLNLEN];
 	
 	for (int i = 0; i < MAXPREVLINE; i++) {
-		expand_tab(lines[i], parser->get_prevline(i), MAXLNLEN);		
+		expand_tab(lines[i], chenc(parser->get_prevline(i), io_enc, ui_enc), MAXLNLEN);
 	}
 
 	int prevline = 0;
-	int rowindex = pos_tab(parser->get_prevline(0), parser->get_tokenpos() + strlen(token)) / x;
-	int beginrow = rowindex - pos_tab(parser->get_prevline(0), parser->get_tokenpos()) / x;
+
+	strncpy(line, parser->get_prevline(0), parser->get_tokenpos());
+        line[parser->get_tokenpos()] = '\0';
+	int tokenbeg = expand_tab(line2, chenc(line, io_enc, ui_enc), MAXLNLEN);
+
+	strncpy(line, parser->get_prevline(0), parser->get_tokenpos() + strlen(token));
+        line[parser->get_tokenpos() + strlen(token)] = '\0';	
+	int tokenend = expand_tab(line2, chenc(line, io_enc, ui_enc), MAXLNLEN);
+
+	int rowindex = tokenend / x;
+	int beginrow = rowindex - tokenbeg / x;
 	if (beginrow >= MAXPREVLINE) beginrow = MAXPREVLINE - 1;
 
-/*
 	for (int i = 0; i < MAXPREVLINE; i++) {
-		char * line = (char *) calloc(1, x + 1);
-		strncpy(line, lines[prevline] + x * rowindex, x);
-		mvprintw(MAXPREVLINE + 1 - i, 0, "%s", chenc(line, io_enc, ui_enc));
+	        strncpyu8(line, lines[prevline], x * rowindex, x);
+		mvprintw(MAXPREVLINE + 1 - i, 0, "%s", line);
 		rowindex--;
 		if (rowindex == -1) {
 			prevline++;
 			rowindex = strlen(lines[prevline]) / x;
 		}
-		free(line);
 	}
-*/
-	char * line = (char *) calloc(1, x + 1);
-	int poslen;
-	strncpy(line, lines[0] + x * rowindex, parser->get_tokenpos() % x);
-//	fprintf(stderr, "%s\n", line);
-//	exit(1);
-	chenc(line, io_enc, ui_enc);
-	if (strcmp(ui_enc, "UTF-8")==0) {
-	    char * p;
-	    w_char dest_utf[BUFSIZ];
-            poslen = u8_u16(dest_utf, BUFSIZ, line);
-//            for (p = line; *p; p++) if (*p == '\t') exit(1);
-	} else poslen = strlen(line);
-//	mvprintw(MAXPREVLINE + 1 - beginrow, 0, "%s", chenc(line, io_enc, ui_enc));
+
+	strncpyu8(line, lines[0], x * rowindex, (tokenbeg + 1) % x);
+	fprintf(stderr, "LIBA: |%s| (%s) %d %d\n", line, token, tokenbeg, tokenend);
+	mvprintw(MAXPREVLINE + 1 - beginrow, 0, "%s", line);
 	attron(A_REVERSE);    
-//	mvprintw(MAXPREVLINE + 1 - beginrow, 0, "%s", chenc(line, io_enc, ui_enc));
-	mvprintw(MAXPREVLINE + 1 - beginrow, poslen, "%s", chenc(token, io_enc, ui_enc));
+	printw("%s", chenc(token, io_enc, ui_enc));
 	attroff(A_REVERSE);
-        free(line);
-    
-//	mvprintw(MAXPREVLINE + 2, 0, "\n");
-/*	for (int i = 0; i < ns; i++) {
+
+	mvprintw(MAXPREVLINE + 2, 0, "\n");
+	for (int i = 0; i < ns; i++) {
 		if ((ns > 10) && (i < 10)) {
-			printw(" 0%d: %s\n", i, chenc(wlst[i], dic_enc, ui_enc));
+			printw(" 0%d: %s\n", i, chenc(wlst[i], io_enc, ui_enc));
 		} else {
-			printw(" %d: %s\n", i, chenc(wlst[i], dic_enc, ui_enc));
+			printw(" %d: %s\n", i, chenc(wlst[i], io_enc, ui_enc));
 		}
 	}
-*/
+
 	mvprintw(y-3, 0, "%s\n", 
 		gettext("\n[SP] <number> R)epl A)ccept I)nsert L)ookup U)ncap Q)uit e(X)it or ? for help\n"));
 }
@@ -940,7 +1004,7 @@ printw(gettext("\n-- Type space to continue -- \n"));
 		    fprintf(stderr, gettext("error - missing HOME variable"));
 		    break;
 		}
-#ifndef W32
+#ifndef WIN32
 		strcat(buf,"/");
 #endif
 		buf2 = buf+strlen(buf);
@@ -1070,7 +1134,7 @@ printw(gettext("\n-- Type space to continue -- \n"));
 			fprintf(stderr, gettext("error - missing HOME variable"));
 			continue;
 		    }
-#ifndef W32
+#ifndef WIN32
 		    strcat(buf,"/");
 #endif
 		    buf2 = buf + strlen(buf);
@@ -1123,11 +1187,18 @@ int interactive_line(TextParser * parser, Hunspell * pMS, char * filename, FILE
 	while ((token=parser->next_token())) {
 		if (! pMS->spell(chenc(token, io_enc, dic_enc), &info, NULL)) {
 			dialogscreen(parser, token, filename, (info & SPELL_FORBIDDEN), NULL, 0); // preview
+			refresh();
 			char ** wlst = NULL;
 			int ns = pMS->suggest(&wlst, chenc(token, io_enc, dic_enc));
 			if (ns==0) {
 				dialogexit = dialog(parser, pMS, token, filename, wlst, ns, (info & SPELL_FORBIDDEN));
 			} else {	    
+				for (int j = 0; j < ns; j++) {
+					char d2io[MAXLNLEN];
+					strcpy(d2io, chenc(wlst[j], dic_enc, io_enc));
+					wlst[j] = (char *) realloc(wlst[j], strlen(d2io) + 1);
+					strcpy(wlst[j], d2io);
+				}
 				dialogexit = dialog(parser, pMS, token, filename, wlst, ns, (info & SPELL_FORBIDDEN));
 			}
 			for (int j = 0; j < ns; j++) {
@@ -1233,12 +1304,43 @@ char * exist2(char * dir, int len, char * name, char * ext) {
 	return NULL;
 }
 
+#ifndef WIN32
+int listdicpath(char * dir, int len) {
+	char buf[MAXLNLEN];
+	const char * sep = (len == 0) ? "": DIRSEP;
+	strncpy(buf, dir, len);
+	strcpy(buf + len, sep);
+	DIR *d = opendir(buf);
+	if (!d) return 0;
+	struct dirent * de;
+	while ((de = readdir(d))) {
+		int len = strlen(de->d_name);
+		if ((len > 4 && strcmp(de->d_name + len - 4, ".aff") == 0) ||
+		   (len > 7 && strcmp(de->d_name + len - 7, ".aff.hz") == 0)) {
+		    char * s = mystrdup(de->d_name);
+		    s[len - ((s[len - 1] == 'z') ? 7 : 4)] = '\0';
+		    fprintf(stderr, "%s%s\n", buf, s);
+		    free(s);
+		}
+	}
+	closedir(d);	
+	return 1;
+}
+#endif
+
 // search existing path for file "name + ext"
 char * search(char * begin, char * name, char * ext) {
 	char * end = begin;
 	while (1) {
 	    while (!((*end == *PATHSEP) || (*end == '\0'))) end++;
-	    char * res = exist2(begin, end - begin, name, ext);
+	    char * res = NULL;
+	    if (name) {
+	    	res = exist2(begin, end - begin, name, ext);
+	    } else {
+#ifndef WIN32
+		listdicpath(begin, end - begin);
+#endif
+	    }
 	    if ((*end == '\0') || res) return res;
 	    end++;
 	    begin = end;
@@ -1313,9 +1415,11 @@ int main(int argc, char** argv)
 			fprintf(stderr,gettext("  -i enc\tinput encoding\n"));
 			fprintf(stderr,gettext("  -l\t\tprint mispelled words\n"));
 			fprintf(stderr,gettext("  -L\t\tprint lines with mispelled words\n"));
+			fprintf(stderr,gettext("  -m \t\tanalyze the words of the input text\n"));
 			fprintf(stderr,gettext("  -n\t\tnroff/troff input file format\n"));
 			fprintf(stderr,gettext("  -p dict\tset dict custom dictionary\n"));
 			fprintf(stderr,gettext("  -P password\tset password for encrypted dictionaries\n"));
+			fprintf(stderr,gettext("  -s \t\tstem the words of the input text\n"));
 			fprintf(stderr,gettext("  -t\t\tTeX/LaTeX input file format\n"));
 // experimental functions: missing Unicode support
 //			fprintf(stderr,gettext("  -u\t\tshow typical misspellings\n"));
@@ -1348,6 +1452,10 @@ int main(int argc, char** argv)
 			exit(0);
 		} else if ((strcmp(argv[i],"-a")==0)) {
 			filter_mode = PIPE;
+		} else if ((strcmp(argv[i],"-m")==0)) {
+			filter_mode = ANALYZE;
+		} else if ((strcmp(argv[i],"-s")==0)) {
+			filter_mode = STEM;
 		} else if ((strcmp(argv[i],"-t")==0)) {
 			format = FMT_LATEX;
 		} else if ((strcmp(argv[i],"-n")==0)) {
@@ -1415,7 +1523,12 @@ int main(int argc, char** argv)
 	char * aff = search(path, dicname, ".aff");
 	char * dic = search(path, dicname, ".dic");
 	if (aff && dic) {
-		if (showpath) fprintf(stderr, "%s\n%s\n", aff, dic);
+		if (showpath) {
+			fprintf(stderr, gettext("SEARCH PATH:\n%s\n"), path);
+			fprintf(stderr, gettext("AVAILABLE DICTIONARIES (full path is not mandatory for -d):\n"), path);
+			search(path, NULL, NULL);
+			fprintf(stderr, gettext("LOADED DICTIONARY:\n%s\n%s\n"), aff, dic);
+		}
 		pMS = new Hunspell(aff, dic, key);
 	} else {
 		fprintf(stderr,gettext("Can't open affix or dictionary files.\n"));
@@ -1425,7 +1538,7 @@ int main(int argc, char** argv)
 	/* open the private dictionaries */
 	if (HOME) {
 	    strcpy(buf,HOME);
-#ifndef W32
+#ifndef WIN32
             strcat(buf,"/");
 #endif
 	    if (!privdicname) {
@@ -1446,7 +1559,7 @@ int main(int argc, char** argv)
 	if (arg_files==-1) {
 		pipe_interface(pMS, format, stdin);
 	} else {
-#ifndef W32
+#ifndef WIN32
 #ifdef HAVE_CURSES_H
 		if (filter_mode == NORMAL) {
 		    initscr();
diff --git a/src/tools/makealias b/src/tools/makealias
index 7b0f4ab..60d93b6 100755
--- a/src/tools/makealias
+++ b/src/tools/makealias
@@ -57,7 +57,7 @@ FILENAME ~ /.dic$/ && NF > 1 {
     next
 }
 FILENAME ~ /.dic$/ { print cutslash($1) }
-FILENAME ~ /.aff$/ && /^[PS]FX/ && ($4 ~ /\/[^	 ]/) && NF > 5 {
+FILENAME ~ /.aff$/ && /^[PS]FX/ && ($4 ~ /\/[^	 ]/) && NF > 4 {
     split($4,t,"/")
     if(!a[t[2]]){
         a[t[2]]=n
@@ -65,32 +65,38 @@ FILENAME ~ /.aff$/ && /^[PS]FX/ && ($4 ~ /\/[^	 ]/) && NF > 5 {
         n++
     }
     begin = $1 " " $2 " " $3 " " (t[1]"/"a[t[2]]) " " $5
+    if ($6!="") ok = 1; else ok = 0;
     $1 = ""
     $2 = ""
     $3 = ""
     $4 = ""
     $5 = ""
-    if($0 && !a2[$0]){
-        a2[$0]=m
-        c[m]=$0
-        m++
-    }
-    print begin " " a2[$0] >>"/dev/stderr"
+    if(ok){
+        if(!a2[$0]){
+            a2[$0]=m
+            c[m]=$0
+            m++
+        }
+        print begin " " a2[$0] >>"/dev/stderr"
+    } else print begin >>"/dev/stderr"
     next
 }
-FILENAME ~ /.aff$/ && /^[PS]FX/ && NF > 5 {
+FILENAME ~ /.aff$/ && /^[PS]FX/ && NF > 4 {
     begin = $1 " " $2 " " $3 " " cutslash($4) " " $5
+    if ($6!="") ok = 1; else ok = 0;
     $1 = ""
     $2 = ""
     $3 = ""
     $4 = ""
     $5 = ""
-    if($0 && !a2[$0]){
-        a2[$0]=m
-        c[m]=$0
-        m++
-    }
-    print begin " " a2[$0] >>"/dev/stderr"
+    if(ok) {
+        if (!a2[$0]){
+            a2[$0]=m
+            c[m]=$0
+            m++
+        }
+        print begin " " a2[$0] >>"/dev/stderr"
+    } else print begin >>"/dev/stderr"
     next
 }
 FILENAME ~ /.aff$/ { print $0 >>"/dev/stderr" }
diff --git a/src/win_api/Hunspell.rc b/src/win_api/Hunspell.rc
index 57b8387..d855de8 100644
--- a/src/win_api/Hunspell.rc
+++ b/src/win_api/Hunspell.rc
@@ -2,8 +2,8 @@
 #include <windows.h>
 
 VS_VERSION_INFO VERSIONINFO
-FILEVERSION 1,2,1,0
-PRODUCTVERSION 1,2,1,0
+FILEVERSION 1,2,2,0
+PRODUCTVERSION 1,2,2,0
 FILEFLAGSMASK 0x17L
 FILEFLAGS 0
 FILEOS VOS_NT_WINDOWS32
@@ -21,12 +21,12 @@ BEGIN
             VALUE "Comments", "Hunspell (http://hunspell.sourceforge.net/) by L�szl� N�meth"
             VALUE "CompanyName", "http://hunspell.sourceforge.net/";
             VALUE "FileDescription", "libhunspell"
-            VALUE "FileVersion", "1.2.1"
+            VALUE "FileVersion", "1.2.2"
             VALUE "InternalName", "libhunspell"
-            VALUE "LegalCopyright", "Copyright (c) 2007"
+            VALUE "LegalCopyright", "Copyright (c) 2007-2008"
             VALUE "OriginalFilename", "libhunspell.dll"
             VALUE "ProductName", "Hunspell Dynamic Link Library"
-            VALUE "ProductVersion", "1.2.1"
+            VALUE "ProductVersion", "1.2.2"
 		END
 	END
 END
diff --git a/src/win_api/config.h b/src/win_api/config.h
index 59d57f7..25a31e1 100644
--- a/src/win_api/config.h
+++ b/src/win_api/config.h
@@ -211,5 +211,5 @@
 #define PACKAGE_TARNAME
 
 /* Define to the version of this package. */
-#define PACKAGE_VERSION "1.1.11"
-#define VERSION "1.1.11"
+#define PACKAGE_VERSION "1.2.2"
+#define VERSION "1.2.2"
diff --git a/src/win_api/libhunspell.vcproj b/src/win_api/libhunspell.vcproj
index 0fb9934..a594474 100644
--- a/src/win_api/libhunspell.vcproj
+++ b/src/win_api/libhunspell.vcproj
@@ -416,6 +416,14 @@
 				>
 			</File>
 			<File
+				RelativePath="..\hunspell\filemgr.cxx"
+				>
+			</File>
+			<File
+				RelativePath="..\hunspell\filemgr.hxx"
+				>
+			</File>
+			<File
 				RelativePath="..\hunspell\hashmgr.cxx"
 				>
 			</File>
@@ -440,6 +448,14 @@
 				>
 			</File>
 			<File
+				RelativePath="..\hunspell\hunzip.cxx"
+				>
+			</File>
+			<File
+				RelativePath="..\hunspell\hunzip.hxx"
+				>
+			</File>
+			<File
 				RelativePath="..\hunspell\langnum.hxx"
 				>
 			</File>
@@ -463,6 +479,10 @@
 				RelativePath="..\hunspell\utf_info.cxx"
 				>
 			</File>
+			<File
+				RelativePath="..\hunspell\w_char.hxx"
+				>
+			</File>
 		</Filter>
 	</Files>
 	<Globals>
diff --git a/tests/circumfix.morph b/tests/circumfix.morph
index 250ed11..62e6c53 100644
--- a/tests/circumfix.morph
+++ b/tests/circumfix.morph
@@ -5,8 +5,8 @@ stem(nagy) = nagy
 analyze(nagyobb) =  st:nagy po:adj is:COMPARATIVE
 stem(nagyobb) = nagy
 > legnagyobb
-analyze(legnagyobb) =  st:nagy po:adj is:SUPERLATIVE
+analyze(legnagyobb) =  fl:A st:nagy po:adj is:SUPERLATIVE
 stem(legnagyobb) = nagy
 > legeslegnagyobb
-analyze(legeslegnagyobb) =  st:nagy po:adj is:SUPERSUPERLATIVE
+analyze(legeslegnagyobb) =  fl:B st:nagy po:adj is:SUPERSUPERLATIVE
 stem(legeslegnagyobb) = nagy
diff --git a/tests/rep.aff b/tests/rep.aff
index 0e0cbc0..66365e5 100644
--- a/tests/rep.aff
+++ b/tests/rep.aff
@@ -3,9 +3,10 @@
 # switch off ngram suggestion for testing
 MAXNGRAMSUGS 0
 
-REP 5
+REP 6
 REP f ph
 REP ph f
+REP ph f
 REP shun tion
 REP alot a_lot  # add the highest priority for "a lot" suggestion to "alot"
 REP ' _    # "un'alunno" -> "un alunno"

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-openoffice/hunspell.git


Reply to: