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

[hunspell] 38/98: Imported Upstream version 1.1.8



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

rene pushed a commit to branch master
in repository hunspell.

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

    Imported Upstream version 1.1.8
---
 ChangeLog                            | 62 ++++++++++++++++++++++++++++++++++--
 NEWS                                 |  8 +++++
 README                               |  2 ++
 THANKS                               |  2 ++
 configure                            | 20 ++++++------
 configure.ac                         |  4 +--
 src/hunspell/affentry.cxx            |  5 +--
 src/hunspell/affixmgr.cxx            |  2 +-
 src/hunspell/atypes.hxx              |  2 +-
 src/hunspell/csutil.cxx              | 28 +++++++++-------
 src/hunspell/dictmgr.cxx             | 18 +++++++----
 src/hunspell/hashmgr.cxx             | 48 +++++++++++++++++++++-------
 src/hunspell/hunspell.cxx            | 28 ++++++++--------
 src/hunspell/hunspell.hxx            | 16 +++++++---
 src/hunspell/suggestmgr.cxx          | 15 +++++++--
 src/tools/hunspell.cxx               | 26 +++++++++------
 src/win_api/hunspelldll.c            |  8 +++--
 src/win_api/hunspelldll.h            | 10 +++++-
 tests/Makefile.am                    |  7 ++++
 tests/Makefile.in                    |  7 ++++
 tests/base.aff                       |  2 +-
 tests/base.dic                       |  3 +-
 tests/base.good                      |  7 +++-
 tests/base.sug                       |  1 +
 tests/base.wrong                     |  2 +-
 tests/{base.aff => base_utf.aff}     |  5 +--
 tests/{base.dic => base_utf.dic}     |  3 +-
 tests/{base.good => base_utf.good}   |  7 +++-
 tests/{base.sug => base_utf.sug}     |  1 +
 tests/base_utf.test                  |  4 +++
 tests/{base.wrong => base_utf.wrong} |  2 +-
 tests/test.sh                        |  4 +--
 32 files changed, 264 insertions(+), 95 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index b4058ba..ef72bb7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,60 @@
+2007-07-16 Németh László <nemeth at OOo>:	
+	* hunspell.cxx: fix dot removing from UTF-8 encoded words in cleanword2()
+	  (Capitalised words with dots, as "Something." were not recognised
+	  using Unicode encoded dictionaries.)
+	* tests/{base.*,base_utf.*}: extended and new test files for
+	  dot removing and Unicode support.
+	
+	* tools/hunspell.cxx: fix Cygwin, OS X compatibility using platform
+	  specifics iconv() header by ICONV_CONST macro of Autoconf.
+	  Sf.net Bug ID 1746030, reported by Mike Tian-Jian Jiang.
+	  Sf.net Bug ID 1753939, reported by Jean-Christophe Helary.
+
+	* tools/hunspell.cxx: fix missing global path setting with -d option.
+
+	* tests/test.sh: fix broken Valgrind checking (missing warnings
+	  with VALGRIND=memcheck make check).
+
+	* csutil.cxx: fix condition in u8_u16() to avoid invalid read
+	  of not null-terminated character arrays (detected by Valgrind
+	  in Hunspell executable: associated with 8-bit character table
+	  conversion in tools/hunspell.cxx).
+
+	* csutil.cxx: free_utf_tbl(): use utf_tbl_count-- instead of utf_tbl--.
+	  Memory leak in Hunspell executable detected by Valgrind.
+	  
+	* hashmgr.cxx: add missing free_utf_tbl(), memory leak in Hunspell
+	  executable detected by Valgrind.
+
+	* hashmgr.cxx: load_tables(): fix memory error in spec. capitalization.
+	  Use sizeof(unsigned short) instead of bad sizeof(unsigned short*).
+	  Invalid memory read detected by Valgrind.
+
+	* hashmgr.cxx: add_word(): fix memory error in spec. capitalization.
+	  Update also affix array length of capitalized homonyms. Invalid
+	  memory read detected by Valgrind.
+
+	* hunspell.cxx: suggest(): fix invalid memory write and leak.
+	  Bad realloc() and missing free() detected by Valgrind associated
+          with suggestions for "something.The" type spelling errors.
+
+	* {dictmgr,csutil,hashmgr,suggestmgr}.cxx: check memory allocation.
+	  Sf.net Bug ID 1747507, based on the patch by Jose da Silva.
+
+2007-07-13 Ingo H. De Boer <idb_winshell at SF.net>: 
+	* atypes.cxx: fix Visual C compatibility: Using
+	"HUNSPELL_WARNING(a,b,...} {}" macro instead of empty "X(a,b...)".
+	
+	* hunspell.cxx: changes for Windows API.	
+	* win_api/Hunspell.*: new resource files
+	* win_api/hunspelldll.*: set optional Hunspell and Borland spec. codes
+	Sf.net Bug ID 1753802, patch by Ingo H. de Boer.
+	See also Sf.net Bug ID 1751406, patch by Mike Tian-Jian Jiang.
+
+2007-07-09 Caolan McNamara <cmc at OO.o>: 
+	* {hunspell,hashmgr,affentry}.cxx: fix warnings of Coverity program
+	  analyzer. Sf.net Bug ID, 1750219.
+
 2007-07-06 Németh László <nemeth at OOo>:
 	* atypes.cxx: warning-free swallowing of conditional warning messages
 	  and their parameters using empty HUNSPELL_WARNING(a,b...) macro.
@@ -95,9 +152,8 @@ fixes:
 	  Sf.net Bug ID 1693875, reported by Ingo H. de Boer.
 
 	* affixmgr.cxx, suggestmgr.cxx, license.hunspell: convert to ASCII.
-	- locale dependent compiling problems reported by Thomas Lange
-	  in OOo Issue 78018.
-	  Sf.net Bug ID 694379, reported by user B6s on Sourceforge.net.
+	  Locale dependent compiling problems. Sf.net Bug ID 1694379, reported
+	  by Mike Tian-Jian Jiang. OOo Issue 78018 reported by Thomas Lange.
 
 	* tests/test.sh: compatibility issues
 	- fix Valgrind support (check shared library instead of shell wrapper)
diff --git a/NEWS b/NEWS
index 9898c54..b5e12d0 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,11 @@
+2007-07-16: Hunspell 1.1.8 release:
+  - better Mac OS X/Cygwin and Windows compatibility
+
+  - fix Hunspell's Valgrind environment and memory handling errors
+    detected by Valgrind
+
+  - other bug fixes (see ChangeLog)
+
 2007-07-06: Hunspell 1.1.7 release:
   - fix warning messages of OpenOffice.org build
 
diff --git a/README b/README
index 5d397cc..a718501 100644
--- a/README
+++ b/README
@@ -67,10 +67,12 @@ make check
 
 or with Valgrind debugger:
 
+make check
 VALGRIND=[Valgrind_tool] make check
 
 For example:
 
+make check
 VALGRIND=memcheck make check
 
 Documentation
diff --git a/THANKS b/THANKS
index 360a1bd..02bb5e3 100644
--- a/THANKS
+++ b/THANKS
@@ -18,8 +18,10 @@ Chris Halls
 Khaled Hosny
 Izsók András
 Björn Jacke
+Mike Tian-Jian Jiang
 Dafydd Jones
 Ryan Jones
+Jean-Christophe Helary
 Kevin Hendricks
 Martin Hollmichel
 Kéménczy Kálmán
diff --git a/configure b/configure
index b747a19..0b3be98 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.1.7.
+# Generated by GNU Autoconf 2.59 for hunspell 1.1.8.
 #
 # 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.1.7'
-PACKAGE_STRING='hunspell 1.1.7'
+PACKAGE_VERSION='1.1.8'
+PACKAGE_STRING='hunspell 1.1.8'
 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.1.7 to adapt to many kinds of systems.
+\`configure' configures hunspell 1.1.8 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.1.7:";;
+     short | recursive ) echo "Configuration of hunspell 1.1.8:";;
    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.1.7
+hunspell configure 1.1.8
 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.1.7, which was
+It was created by hunspell $as_me 1.1.8, which was
 generated by GNU Autoconf 2.59.  Invocation command line was
 
   $ $0 $@
@@ -1916,7 +1916,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE=hunspell
- VERSION=1.1.7
+ VERSION=1.1.8
 
 
 cat >>confdefs.h <<_ACEOF
@@ -23886,7 +23886,7 @@ _ASBOX
 } >&5
 cat >&5 <<_CSEOF
 
-This file was extended by hunspell $as_me 1.1.7, which was
+This file was extended by hunspell $as_me 1.1.8, which was
 generated by GNU Autoconf 2.59.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -23949,7 +23949,7 @@ _ACEOF
 
 cat >>$CONFIG_STATUS <<_ACEOF
 ac_cs_version="\\
-hunspell config.status 1.1.7
+hunspell config.status 1.1.8
 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 19afbcd..4e2e38c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -5,7 +5,7 @@ m4_pattern_allow
 
 
 AC_PREREQ(2.59)
-AC_INIT([hunspell],[1.1.7],[nemeth@openoffice.org])
+AC_INIT([hunspell],[1.1.8],[nemeth@openoffice.org])
 
 AC_CANONICAL_SYSTEM
 case "$host" in
@@ -13,7 +13,7 @@ arm*) XFAILED="flagutf8.test maputf.test";;
 esac
 AC_SUBST(XFAILED)
 
-AM_INIT_AUTOMAKE(hunspell, 1.1.7)
+AM_INIT_AUTOMAKE(hunspell, 1.1.8)
 HUNSPELL_VERSION_MAJOR=`echo $VERSION | cut -d"." -f1`
 HUNSPELL_VERSION_MINOR=`echo $VERSION | cut -d"." -f2`
 AC_SUBST(HUNSPELL_VERSION_MAJOR)
diff --git a/src/hunspell/affentry.cxx b/src/hunspell/affentry.cxx
index 308aeb5..6c98112 100644
--- a/src/hunspell/affentry.cxx
+++ b/src/hunspell/affentry.cxx
@@ -722,14 +722,15 @@ struct hentry * SfxEntry::get_next_homonym(struct hentry * he, int optflags, Aff
     const FLAG cclass, const FLAG needflag)
 {
     PfxEntry* ep = (PfxEntry *) ppfx;
+    FLAG eFlag = ep ? ep->getFlag() : FLAG_NULL;
 
     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 || 
-                            TESTAFF(he->astr, ep->getFlag(), he->alen) ||
+                            TESTAFF(he->astr, eFlag, he->alen) ||
                              // handle conditional suffix
-                            ((contclass) && TESTAFF(contclass, ep->getFlag(), contclasslen))
+                            ((contclass) && TESTAFF(contclass, eFlag, contclasslen))
                             ) &&
                             // handle cont. class
                             ((!cclass) || 
diff --git a/src/hunspell/affixmgr.cxx b/src/hunspell/affixmgr.cxx
index e18788f..033c6e7 100644
--- a/src/hunspell/affixmgr.cxx
+++ b/src/hunspell/affixmgr.cxx
@@ -2940,7 +2940,7 @@ int AffixMgr::get_checksharps()
 char * AffixMgr::get_ignore()
 {
   if (!ignorechars) return NULL;
-  return mystrdup(ignorechars);
+  return ignorechars;
 }
 
 // return the preferred ignore string for suggestions
diff --git a/src/hunspell/atypes.hxx b/src/hunspell/atypes.hxx
index c636b85..35d64bf 100644
--- a/src/hunspell/atypes.hxx
+++ b/src/hunspell/atypes.hxx
@@ -6,7 +6,7 @@
 #define HUNSPELL_WARNING fprintf
 #define WARNVAR warnvar
 #else
-#define HUNSPELL_WARNING(a,b...)
+#define HUNSPELL_WARNING(a,b,...) {}
 #define WARNVAR
 #endif
 #endif
diff --git a/src/hunspell/csutil.cxx b/src/hunspell/csutil.cxx
index 673f2d1..1afdd93 100644
--- a/src/hunspell/csutil.cxx
+++ b/src/hunspell/csutil.cxx
@@ -48,8 +48,8 @@ using namespace std;
 #endif
 #endif
 
-struct unicode_info2 * utf_tbl = NULL;
-int utf_tbl_count = 0; // utf_tbl can be used by multiple Hunspell instances
+static struct unicode_info2 * utf_tbl = NULL;
+static int utf_tbl_count = 0; // utf_tbl can be used by multiple Hunspell instances
 
 /* only UTF-16 (BMP) implementation */
 char * u16_u8(char * dest, int size, const w_char * src, int srclen) {
@@ -105,7 +105,7 @@ int u8_u16(w_char * dest, int size, const char * src) {
     w_char * u2 = dest;
     w_char * u2_max = u2 + size;
     
-    while (*u8 && (u2 < u2_max)) {
+    while ((u2 < u2_max) && *u8) {
     switch ((*u8) & 0xf0) {
         case 0x00:
         case 0x10:
@@ -236,15 +236,19 @@ int flag_bsearch(unsigned short flags[], unsigned short flag, int length) {
          *stringp = dp+1;
          int nc = (int)((unsigned long)dp - (unsigned long)mp);
          rv = (char *) malloc(nc+1);
-         memcpy(rv,mp,nc);
-         *(rv+nc) = '\0';
-         return rv;
+	 if (rv) {
+            memcpy(rv,mp,nc);
+            *(rv+nc) = '\0';
+            return rv;
+	 }
       } else {
-        rv = (char *) malloc(n+1);
-        memcpy(rv, mp, n);
-        *(rv+n) = '\0';
-        *stringp = mp + n;
-        return rv;
+         rv = (char *) malloc(n+1);
+         if (rv) {
+    	    memcpy(rv, mp, n);
+            *(rv+n) = '\0';
+            *stringp = mp + n;
+            return rv;
+         }
       }
    }
    return NULL;
@@ -5133,7 +5137,7 @@ int initialize_utf_tbl() {
 #endif
 
 void free_utf_tbl() {
-  if (utf_tbl_count > 0) utf_tbl--;
+  if (utf_tbl_count > 0) utf_tbl_count--;
   if (utf_tbl && (utf_tbl_count == 0)) {
     free(utf_tbl);
     utf_tbl = NULL;
diff --git a/src/hunspell/dictmgr.cxx b/src/hunspell/dictmgr.cxx
index 34736a6..5594582 100644
--- a/src/hunspell/dictmgr.cxx
+++ b/src/hunspell/dictmgr.cxx
@@ -135,15 +135,19 @@ char * DictMgr::mystrsep(char ** stringp, const char delim)
         *stringp = dp+1;
         int nc = (int)((unsigned long)dp - (unsigned long)mp); 
         rv = (char *) malloc(nc+1);
-        memcpy(rv,mp,nc);
-        *(rv+nc) = '\0';
-        return rv;
+        if (rv) {
+           memcpy(rv,mp,nc);
+           *(rv+nc) = '\0';
+           return rv;
+        }
      } else {
        rv = (char *) malloc(n+1);
-       memcpy(rv, mp, n);
-       *(rv+n) = '\0';
-       *stringp = mp + n;
-       return rv;
+       if (rv) {
+          memcpy(rv, mp, n);
+          *(rv+n) = '\0';
+          *stringp = mp + n;
+          return rv;
+       }
      }
   }
   return NULL;
diff --git a/src/hunspell/hashmgr.cxx b/src/hunspell/hashmgr.cxx
index 5cdb543..90bb5f7 100644
--- a/src/hunspell/hashmgr.cxx
+++ b/src/hunspell/hashmgr.cxx
@@ -107,6 +107,12 @@ HashMgr::~HashMgr()
     aliasm = NULL;
   }  
 
+#ifndef OPENOFFICEORG
+#ifndef MOZILLA_CLIENT
+  if (utf8) free_utf_tbl();
+#endif
+#endif
+
   if (enc) free(enc);
   if (lang) free(lang);
   
@@ -173,7 +179,11 @@ desc
 #endif
     } else {
        struct hentry* hp = (struct hentry *) malloc (sizeof(struct hentry));
-       if (!hp) return 1;
+       if (!hp)
+       {
+           if (st) free(st);
+           return 1;
+       }
        hp->wlen = (short) wl;
        hp->alen = (short) al;
        hp->word = st;
@@ -185,7 +195,13 @@ desc
             hp->description = (desc) ? get_aliasm(atoi(desc)) : mystrdup(desc);
        } else {
             hp->description = mystrdup(desc);
-            if (desc && !hp->description) return 1;
+            if (desc && !hp->description)
+            {
+                free(hp->word);
+                free(hp->astr);
+                free(hp);
+                return 1;
+            }
             if (dp->description && complexprefixes) {
                 if (utf8) reverseword_utf(hp->description); else reverseword(hp->description);
             }
@@ -198,6 +214,7 @@ desc
 		if ((dp->astr) && TESTAFF(dp->astr, ONLYUPCASEFLAG, dp->alen)) {
 		    free(dp->astr);
 		    dp->astr = hp->astr;
+		    dp->alen = hp->alen;
 		    free(hp->word);
 		    free(hp);
 		    return 0;
@@ -216,6 +233,7 @@ desc
 		if ((dp->astr) && TESTAFF(dp->astr, ONLYUPCASEFLAG, dp->alen)) {
 		    free(dp->astr);
 		    dp->astr = hp->astr;
+		    dp->alen = hp->alen;
 		    free(hp->word);
 		    free(hp);
 		    return 0;
@@ -259,9 +277,12 @@ int HashMgr::put_word_pattern(const char * word, int wl, const char * pattern)
     struct hentry * dp = lookup(pattern);
     if (!dp || !dp->astr) return 1;
     flags = (unsigned short *) malloc (dp->alen * sizeof(short));
-    memcpy((void *) flags, (void *) dp->astr, dp->alen * sizeof(short));
-    add_word(word, wl, flags, dp->alen, NULL, false);
-    return 0;
+    if (flags) {
+	memcpy((void *) flags, (void *) dp->astr, dp->alen * sizeof(short));
+	add_word(word, wl, flags, dp->alen, NULL, false);
+        return 0;
+    }
+    return 1;
 }
 
 // walk the hash table entry by entry - null at end
@@ -391,15 +412,16 @@ int HashMgr::load_tables(const char * tpath)
 	return 5;
     }
 
-    // add decapizatalized forms to handle following cases
-    // OpenOffice.org -> OPENOFFICE.ORG
-    // CIA's -> CIA'S
+    // add inner capitalized forms to handle the following allcap forms:
+    // Mixed caps: OpenOffice.org -> OPENOFFICE.ORG
+    // Allcaps with suffixes: CIA's -> CIA'S
     captype = utf8 ? get_captype_utf8(ts, wl, langnum) : get_captype(ts, wl, csconv);
     if (((captype == HUHCAP) || (captype == HUHINITCAP) ||
       ((captype == ALLCAP) && (flags != NULL))) &&
       !((flags != NULL) && TESTAFF(flags, forbiddenword, al))) {
-          unsigned short * flags2 = (unsigned short *) malloc (sizeof(unsigned short *)* (al + 1));
-          memcpy(flags2, flags, al * sizeof(unsigned short *));
+          unsigned short * flags2 = (unsigned short *) malloc (sizeof(unsigned short) * (al+1));
+	  if (!flags2) return 6;
+          if (al) memcpy(flags2, flags, al * sizeof(unsigned short));
           flags2[al] = ONLYUPCASEFLAG;
           if (utf8) {
               char st[MAXDELEN];
@@ -449,8 +471,9 @@ int HashMgr::decode_flags(unsigned short ** result, char * flags) {
       case FLAG_LONG: { // two-character flags (1x2yZz -> 1x 2y Zz)
         len = strlen(flags);
         if (len%2 == 1) HUNSPELL_WARNING(stderr, "error: length of FLAG_LONG flagvector is odd: %s\n", flags);
-        len = len/2;
+        len /= 2;
         *result = (unsigned short *) malloc(len * sizeof(short));
+        if (!*result) return -1;
         for (int i = 0; i < len; i++) {
             (*result)[i] = (((unsigned short) flags[i * 2]) << 8) + (unsigned short) flags[i * 2 + 1]; 
         }
@@ -465,6 +488,7 @@ int HashMgr::decode_flags(unsigned short ** result, char * flags) {
           if (*p == ',') len++;
         }
         *result = (unsigned short *) malloc(len * sizeof(short));
+        if (!*result) return -1;
         dest = *result;
         for (p = flags; *p; p++) {
           if (*p == ',') {
@@ -482,6 +506,7 @@ int HashMgr::decode_flags(unsigned short ** result, char * flags) {
         w_char w[MAXDELEN/2];
         len = u8_u16(w, MAXDELEN/2, flags);
         *result = (unsigned short *) malloc(len * sizeof(short));
+        if (!*result) return -1;
         memcpy(*result, w, len * sizeof(short));
         break;
       }
@@ -489,6 +514,7 @@ int HashMgr::decode_flags(unsigned short ** result, char * flags) {
         unsigned short * dest;
         len = strlen(flags);
         *result = (unsigned short *) malloc(len * sizeof(short));
+        if (!*result) return -1;
         dest = *result;
         for (unsigned char * p = (unsigned char *) flags; *p; p++) {
           *dest = (unsigned short) *p;
diff --git a/src/hunspell/hunspell.cxx b/src/hunspell/hunspell.cxx
index 800473e..fb48517 100644
--- a/src/hunspell/hunspell.cxx
+++ b/src/hunspell/hunspell.cxx
@@ -102,7 +102,7 @@ int Hunspell::cleanword2(char * dest, const char * src,
    *(dest + nl) = '\0';
    nl = strlen(dest);
    if (utf8) {
-      *nc = u8_u16(dest_utf, MAXWORDLEN, (const char *) q);
+      *nc = u8_u16(dest_utf, MAXWORDLEN, dest);
       // don't check too long words
       if (*nc >= MAXWORDLEN) return 0;
       if (*nc == -1) { // big Unicode character (non BMP area)
@@ -382,7 +382,8 @@ int Hunspell::spell(const char * word, int * info, char ** root)
                 rv = checkword(wspace, info, root);
                 if (rv) break;
             }
-            // spec. prefix handling for Italian, etc. (SANT'ELIA -> Sant'+Elia)
+            // Spec. prefix handling for Catalan, French, Italian:
+	    // prefixes separated by apostrophe (SANT'ELIA -> Sant'+Elia).
             if (pAMgr && strchr(cw, '\'')) {
                 wl = mkallsmall2(cw, unicw, nc);
         	char * apostrophe = strchr(cw, '\'');
@@ -444,8 +445,10 @@ int Hunspell::spell(const char * word, int * info, char ** root)
              }             
              if (rv && is_keepcase(rv) && (captype == ALLCAP)) rv = NULL;
              if (rv) break;
+
              rv = checkword(wspace, info, root);
              if (abbv && !rv) {
+
                  *(wspace+wl) = '.';
                  *(wspace+wl+1) = '\0';
                  rv = checkword(wspace, info, root);
@@ -471,11 +474,6 @@ int Hunspell::spell(const char * word, int * info, char ** root)
            }               
   }
   
-  // check ONLYUPCASE and return
-//  if (rv && !((captype==INITCAP) && (rv->astr) && (pAMgr) &&
-//	TESTAFF(rv->astr, ONLYUPCASEFLAG, rv->alen))) {
-//    return 1;
-//  }
   if (rv) return 1;
 
   // recursive breaking at break points (not good for morphological analysis)
@@ -485,7 +483,8 @@ int Hunspell::spell(const char * word, int * info, char ** root)
     int corr = 0;
     // German words beginning with "-" are not accepted
     if (langnum == LANG_de) corr = 1;
-    for (int j = 0; j < pAMgr->get_numbreak(); j++) {
+    int numbreak = pAMgr ? pAMgr->get_numbreak() : 0;
+    for (int j = 0; j < numbreak; j++) {
       s=(char *) strstr(cw + corr, wordbreak[j]);
       if (s) {
         r = *s;
@@ -711,10 +710,13 @@ int Hunspell::suggest(char*** slst, const char * word)
 		        	get_captype(dot+1, strlen(dot+1), csconv);
 		    	    if (captype_ == INITCAP) {
                         	char * st = mystrdup(cw);
-                        	st = (char *) realloc(st, wl + 1);
-                        	st[(dot - cw) + 1] = ' ';
-                        	strcpy(st + (dot - cw) + 2, dot + 1);
-                    		ns = insert_sug(slst, st, ns);
+                        	st = (char *) realloc(st, wl + 2);
+				if (st) {
+                        		st[(dot - cw) + 1] = ' ';
+                        		strcpy(st + (dot - cw) + 2, dot + 1);
+                    			ns = insert_sug(slst, st, ns);
+					free(st);
+				}
 		    	    }
 		        }
                         if (captype == HUHINITCAP) {
@@ -861,7 +863,7 @@ int Hunspell::suggest(char*** slst, const char * word)
   }
 
   // remove bad capitalized and forbidden forms
-  if (pAMgr->get_keepcase() || pAMgr->get_forbiddenword()) {
+  if (pAMgr && (pAMgr->get_keepcase() || pAMgr->get_forbiddenword())) {
   switch (captype) {
     case INITCAP:
     case ALLCAP: {
diff --git a/src/hunspell/hunspell.hxx b/src/hunspell/hunspell.hxx
index 9edddd0..6d3f092 100644
--- a/src/hunspell/hunspell.hxx
+++ b/src/hunspell/hunspell.hxx
@@ -13,15 +13,21 @@
 #define MAXSUGGESTION 15
 #define MAXSHARPS 5
 
-#ifdef W32
-#define DLLTEST2_API __declspec(dllexport)
-#endif
-
 #ifndef _MYSPELLMGR_HXX_
 #define _MYSPELLMGR_HXX_
 
+#ifdef HUNSPELL_STATIC
+	#define DLLEXPORT
+#else
+	#ifdef HUNSPELL_EXPORTS
+		#define DLLEXPORT  __declspec( dllexport )
+	#else
+		#define DLLEXPORT  __declspec( dllimport )
+	#endif
+#endif
+
 #ifdef W32
-class DLLTEST2_API Hunspell
+class DLLEXPORT Hunspell
 #else
 class Hunspell
 #endif
diff --git a/src/hunspell/suggestmgr.cxx b/src/hunspell/suggestmgr.cxx
index d972d79..bc908d7 100644
--- a/src/hunspell/suggestmgr.cxx
+++ b/src/hunspell/suggestmgr.cxx
@@ -56,7 +56,7 @@ SuggestMgr::SuggestMgr(const char * tryme, int maxn,
         w_char t[MAXSWL];    
         ctryl = u8_u16(t, MAXSWL, tryme);
         ctry_utf = (w_char *) malloc(ctryl * sizeof(w_char));
-        memcpy(ctry_utf, t, ctryl * sizeof(w_char));
+        if (ctry_utf) memcpy(ctry_utf, t, ctryl * sizeof(w_char));
     } else {
         ctry = mystrdup(tryme);
         ctryl = strlen(ctry);
@@ -766,6 +766,7 @@ int SuggestMgr::longswapchar_utf(char ** wlst, const w_char * word, int wl, int
          tmpc = *p;
          *p = *q;
          *q = tmpc;
+         u16_u8(candidate, MAXSWUTF8L, candidate_utf, wl);
          ns = testsug(wlst, candidate, strlen(candidate), ns, cpdsuggest, NULL, NULL);
          if (ns == -1) return -1;
          *q = *p;
@@ -1413,6 +1414,7 @@ char * SuggestMgr::suggest_morph_for_spelling_error(const char * word)
 {
     char * p = NULL;
     char ** wlst = (char **) calloc(maxSug, sizeof(char *));
+    if (!**wlst) return NULL;
     // we will use only the first suggestion
     for (int i = 0; i < maxSug - 1; i++) wlst[i] = "";
     int ns = suggest(&wlst, word, maxSug - 1);
@@ -1421,7 +1423,7 @@ char * SuggestMgr::suggest_morph_for_spelling_error(const char * word)
         free(wlst[maxSug - 1]);
     }
     if (wlst) free(wlst);
-    return p;    
+    return p;
 }
 #endif // END OF HUNSPELL_EXPERIMENTAL CODE
 
@@ -1614,6 +1616,12 @@ void SuggestMgr::lcs(const char * s, const char * s2, int * l1, int * l2, char *
   }
   c = (char *) malloc((m + 1) * (n + 1));
   b = (char *) malloc((m + 1) * (n + 1));
+  if (!c || !b) {
+    if (c) free(c);
+    if (b) free(b);
+    *result = NULL;
+    return;
+  }
   for (i = 1; i <= m; i++) c[i*(n+1)] = 0;
   for (j = 0; j <= n; j++) c[j] = 0;
   for (i = 1; i <= m; i++) {
@@ -1645,6 +1653,7 @@ int SuggestMgr::lcslen(const char * s, const char* s2) {
   char * result;
   int len = 0;
   lcs(s, s2, &m, &n, &result);
+  if (!result) return 0;
   i = m;
   j = n;
   while ((i != 0) && (j != 0)) {
@@ -1656,6 +1665,6 @@ int SuggestMgr::lcslen(const char * s, const char* s2) {
       i--;
     } else j--;
   }
-  if (result) free(result);
+  free(result);
   return len;
 }
diff --git a/src/tools/hunspell.cxx b/src/tools/hunspell.cxx
index d8917e1..be1f3f9 100644
--- a/src/tools/hunspell.cxx
+++ b/src/tools/hunspell.cxx
@@ -168,7 +168,7 @@ char * chenc(char * st, const char * enc1, const char * enc2) {
 	char * source = st;
 	char * dest = text_conv;
 	iconv_t conv = iconv_open(enc2, enc1);
-	size_t res = iconv(conv, &source, &c1, &dest, &c2);
+	size_t res = iconv(conv, (ICONV_CONST char **) &source, &c1, &dest, &c2);
 	iconv_close(conv);
 	if (res != (size_t) -1) out = text_conv;
     }
@@ -180,8 +180,8 @@ TextParser * get_parser(int format, char * extension, Hunspell * pMS) {
     TextParser * p = NULL;
     int io_utf8 = 0;
     dic_enc = pMS->get_dic_encoding();
-    initialize_utf_tbl(); // also need for 8-bit tokenization
 #ifdef HAVE_ICONV
+    initialize_utf_tbl(); // also need for 8-bit tokenization
     if (io_enc) {
 	if ((strcmp(io_enc, "UTF-8") == 0) ||
 	    (strcmp(io_enc, "utf-8") == 0) ||
@@ -207,7 +207,7 @@ TextParser * get_parser(int format, char * extension, Hunspell * pMS) {
 	    size_t c2 = MAXLNLEN;
 	    char * dest = text_conv;
 	    iconv_t conv = iconv_open("UTF-8", dic_enc);
-	    iconv(conv, &wchars, &c1, &dest, &c2);
+	    iconv(conv, (ICONV_CONST char **) &wchars, &c1, &dest, &c2);
 	    iconv_close(conv);
 	    wordchars_utf16 = (unsigned short *) malloc(sizeof(unsigned short) * wlen);
 	    int n = u8_u16((w_char *) wordchars_utf16, wlen, text_conv);
@@ -220,19 +220,22 @@ TextParser * get_parser(int format, char * extension, Hunspell * pMS) {
 	char letters[MAXLNLEN];
 	char * pletters = letters;
 	char ch[2];
-	ch[1] = '\0';
 	char u8[10];
 	iconv_t conv = iconv_open("UTF-8", io_enc);
 	for (int i = 32; i < 256; i++) {
 	    size_t c1 = 1;
 	    size_t c2 = 10;
 	    char * dest = u8;
+	    u8[0] = '\0';
 	    char * ch8bit = ch;	
 	    ch[0] = (char) i;	    
-	    size_t res = iconv(conv, &ch8bit, &c1, &dest, &c2);
+	    ch[1] = '\0';
+	    size_t res = iconv(conv, (ICONV_CONST char **) &ch8bit, &c1, &dest, &c2);
 	    if (res != (size_t) -1) {
 		unsigned short idx;
 		w_char w;
+		w.l = 0;
+		w.h = 0;
 		u8_u16(&w, 1, u8);
 		idx = (w.h << 8) + w.l;
 		if (unicodeisalpha(idx)) {
@@ -257,7 +260,7 @@ TextParser * get_parser(int format, char * extension, Hunspell * pMS) {
 	    size_t c1 = len + 1;
 	    size_t c2 = len + 1;
 	    iconv_t conv = iconv_open(io_enc, dic_enc);
-	    iconv(conv, &wchars, &c1, &dest, &c2);
+	    iconv(conv, (ICONV_CONST char **) &wchars, &c1, &dest, &c2);
 	    iconv_close(conv);		
 	}
 	
@@ -1183,9 +1186,10 @@ char * add(char * dest, char * st) {
 
 char * exist2(char * dir, int len, char * name, char * ext) {
 	char buf[MAXLNLEN];
+	const char * sep = (len == 0) ? "": DIRSEP;
 	strncpy(buf, dir, len);
-	strcpy(buf + len, DIRSEP);
-	strcpy(buf + len + 1, name);
+	strcpy(buf + len, sep);
+	strcat(buf, name);
 	strcat(buf, ext);
 	if (exist(buf)) return mystrdup(buf);
 	return NULL;
@@ -1352,8 +1356,8 @@ int main(int argc, char** argv)
 		    dicname = mystrdup(dicname);
 		}
 	}
-
 	path = add(mystrdup("."), PATHSEP); // <- check path in local directory
+	path = add(path, PATHSEP);          // <- check path in root directory
 	if (getenv("DICPATH")) path = add(add(path, getenv("DICPATH")), PATHSEP);
 	path = add(add(path, LIBDIR), PATHSEP);
 	path = add(add(add(add(path, HOME), DIRSEP), USEROOODIR), PATHSEP);
@@ -1441,7 +1445,9 @@ int main(int argc, char** argv)
         if (aff) free(aff);
         if (dic) free(dic);
 	if (wordchars) free(wordchars);
-	delete pMS; // not need, because time-consuming
+#ifdef HAVE_ICONV
 	free_utf_tbl();
+#endif
+	delete pMS; // not need, because time-consuming
 	return 0;
 }
diff --git a/src/win_api/hunspelldll.c b/src/win_api/hunspelldll.c
index f3e275e..583d96e 100644
--- a/src/win_api/hunspelldll.c
+++ b/src/win_api/hunspelldll.c
@@ -33,14 +33,14 @@
  * ***** END LICENSE BLOCK ***** **/
 #include "hunspelldll.h"
 #include <windows.h>
+
+#ifdef BORLAND
 #include <stdio.h>
 #include <stdlib.h>
-
 #include <cstring>
 #include <cstdlib>
 #include <cstdio>
-
-#include "hunspell.hxx"
+#endif
 
 DLLEXPORT void * hunspell_initialize(char *aff_file, char *dict_file)
 {
@@ -63,10 +63,12 @@ DLLEXPORT int hunspell_suggest(Hunspell *pMS, char *word, char ***slst)
     return pMS->suggest(slst, word);
 }
 
+#ifdef HUNSPELL_EXPERIMENTAL
 DLLEXPORT int hunspell_suggest_auto(Hunspell *pMS, char *word, char ***slst)
 {
     return pMS->suggest_auto(slst, word);
 }
+#endif
 
 DLLEXPORT void hunspell_suggest_free(Hunspell *pMS, char **slst, int len)
 {
diff --git a/src/win_api/hunspelldll.h b/src/win_api/hunspelldll.h
index c5962f0..f67ea4f 100644
--- a/src/win_api/hunspelldll.h
+++ b/src/win_api/hunspelldll.h
@@ -36,7 +36,15 @@
 #ifndef _DLL_H_
 #define _DLL_H_
 
-# define DLLEXPORT __declspec (dllexport)
+#ifdef HUNSPELL_STATIC
+	#define DLLEXPORT
+#else
+	#ifdef HUNSPELL_EXPORTS
+		#define DLLEXPORT  __declspec( dllexport )
+	#else
+		#define DLLEXPORT  __declspec( dllimport )
+	#endif
+#endif
 
 #ifdef __cplusplus
 extern "C" {
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 9d4aaec..8e9e524 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -5,6 +5,7 @@ XFAIL_TESTS = @XFAILED@
 TESTS =	\
 affixes.test \
 base.test \
+base_utf.test \
 allcaps.test \
 allcaps_utf.test \
 allcaps2.test \
@@ -95,6 +96,12 @@ base.good \
 base.sug \
 base.test \
 base.wrong \
+base_utf.aff \
+base_utf.dic \
+base_utf.good \
+base_utf.sug \
+base_utf.test \
+base_utf.wrong \
 allcaps.aff \
 allcaps.dic \
 allcaps.good \
diff --git a/tests/Makefile.in b/tests/Makefile.in
index c270017..955712a 100644
--- a/tests/Makefile.in
+++ b/tests/Makefile.in
@@ -187,6 +187,7 @@ XFAIL_TESTS = @XFAILED@
 TESTS = \
 affixes.test \
 base.test \
+base_utf.test \
 allcaps.test \
 allcaps_utf.test \
 allcaps2.test \
@@ -273,6 +274,12 @@ base.good \
 base.sug \
 base.test \
 base.wrong \
+base_utf.aff \
+base_utf.dic \
+base_utf.good \
+base_utf.sug \
+base_utf.test \
+base_utf.wrong \
 allcaps.aff \
 allcaps.dic \
 allcaps.good \
diff --git a/tests/base.aff b/tests/base.aff
index f0c4dd0..70e292d 100644
--- a/tests/base.aff
+++ b/tests/base.aff
@@ -3,7 +3,7 @@
 SET ISO8859-1
 TRY esianrtolcdugmphbyfvkwzESIANRTOLCDUGMPHBYFVKWZ'
 
-WORDCHARS '
+WORDCHARS .'
 
 PFX A Y 1
 PFX A   0     re         .
diff --git a/tests/base.dic b/tests/base.dic
index 9d78959..5d9b8a2 100644
--- a/tests/base.dic
+++ b/tests/base.dic
@@ -1,4 +1,4 @@
-27
+28
 created/U
 create/XKVNGADS
 imply/GNSDX
@@ -26,3 +26,4 @@ horrifying
 speech
 suggest
 uncreate/V
+Hunspell
diff --git a/tests/base.good b/tests/base.good
index cf2d6cf..8e7f88e 100644
--- a/tests/base.good
+++ b/tests/base.good
@@ -19,4 +19,9 @@ etc.
 etc
 HELLO
 lip.
-text.
\ No newline at end of file
+text.
+NASA.
+Text.
+TEXT.
+Hunspell.
+HUNSPELL.
diff --git a/tests/base.sug b/tests/base.sug
index a4a8186..4ba0b1a 100644
--- a/tests/base.sug
+++ b/tests/base.sug
@@ -4,6 +4,7 @@ hello
 said
 rotten day
 tomorrow
+seven
 NASA
 horrifying
 speech
diff --git a/tests/base.wrong b/tests/base.wrong
index 667a895..88a6e25 100644
--- a/tests/base.wrong
+++ b/tests/base.wrong
@@ -4,7 +4,7 @@ hlelo
 seid
 rottenday
 tomorow
-sezzven
+seeeven
 Nasa
 horrorfying
 peech
diff --git a/tests/base.aff b/tests/base_utf.aff
similarity index 98%
copy from tests/base.aff
copy to tests/base_utf.aff
index f0c4dd0..93f90c2 100644
--- a/tests/base.aff
+++ b/tests/base_utf.aff
@@ -1,9 +1,10 @@
 # OpenOffice.org's en_US.aff file
 
-SET ISO8859-1
+SET UTF-8
 TRY esianrtolcdugmphbyfvkwzESIANRTOLCDUGMPHBYFVKWZ'
 
-WORDCHARS '
+MAXNGRAMSUGS 1
+WORDCHARS .'
 
 PFX A Y 1
 PFX A   0     re         .
diff --git a/tests/base.dic b/tests/base_utf.dic
similarity index 94%
copy from tests/base.dic
copy to tests/base_utf.dic
index 9d78959..5d9b8a2 100644
--- a/tests/base.dic
+++ b/tests/base_utf.dic
@@ -1,4 +1,4 @@
-27
+28
 created/U
 create/XKVNGADS
 imply/GNSDX
@@ -26,3 +26,4 @@ horrifying
 speech
 suggest
 uncreate/V
+Hunspell
diff --git a/tests/base.good b/tests/base_utf.good
similarity index 76%
copy from tests/base.good
copy to tests/base_utf.good
index cf2d6cf..8e7f88e 100644
--- a/tests/base.good
+++ b/tests/base_utf.good
@@ -19,4 +19,9 @@ etc.
 etc
 HELLO
 lip.
-text.
\ No newline at end of file
+text.
+NASA.
+Text.
+TEXT.
+Hunspell.
+HUNSPELL.
diff --git a/tests/base.sug b/tests/base_utf.sug
similarity index 92%
copy from tests/base.sug
copy to tests/base_utf.sug
index a4a8186..4ba0b1a 100644
--- a/tests/base.sug
+++ b/tests/base_utf.sug
@@ -4,6 +4,7 @@ hello
 said
 rotten day
 tomorrow
+seven
 NASA
 horrifying
 speech
diff --git a/tests/base_utf.test b/tests/base_utf.test
new file mode 100755
index 0000000..7f44369
--- /dev/null
+++ b/tests/base_utf.test
@@ -0,0 +1,4 @@
+#!/bin/sh
+DIR="`dirname $0`"
+NAME="`basename $0 .test`"
+$DIR/test.sh $NAME
diff --git a/tests/base.wrong b/tests/base_utf.wrong
similarity index 90%
copy from tests/base.wrong
copy to tests/base_utf.wrong
index 667a895..88a6e25 100644
--- a/tests/base.wrong
+++ b/tests/base_utf.wrong
@@ -4,7 +4,7 @@ hlelo
 seid
 rottenday
 tomorow
-sezzven
+seeeven
 Nasa
 horrorfying
 peech
diff --git a/tests/test.sh b/tests/test.sh
index 62873e9..90080f6 100755
--- a/tests/test.sh
+++ b/tests/test.sh
@@ -41,8 +41,8 @@ if [ "$VALGRIND" != "" ]; then
   if [ ! -d $TEMPDIR/badlogs ]; then
     mkdir $TEMPDIR/badlogs
   fi
-  alias hunspell='valgrind --tool=$VALGRIND --leak-check=yes --show-reachable=yes --log-file=$TEMPDIR/test ../src/tools/.libs/lt-hunspell'
-  alias hunmorph='valgrind --tool=$VALGRIND --leak-check=yes --show-reachable=yes --log-file=$TEMPDIR/test ../src/tools/.libs/lt-hunmorph'
+  alias hunspell='valgrind --tool=$VALGRIND --leak-check=yes --show-reachable=yes --log-file=$TEMPDIR/test.pid ../src/tools/.libs/lt-hunspell'
+  alias hunmorph='valgrind --tool=$VALGRIND --leak-check=yes --show-reachable=yes --log-file=$TEMPDIR/test.pid ../src/tools/.libs/lt-hunmorph'
 fi
 
 # Tests good words

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


Reply to: