1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
|
diff -ru hunspell/src/hunspell/csutil.cxx build/hunspell/src/hunspell/csutil.cxx
--- hunspell/src/hunspell/csutil.cxx 2011-02-02 11:35:43.000000000 +0100
+++ build/hunspell/src/hunspell/csutil.cxx 2014-04-24 19:42:01.373285409 +0200
@@ -17,6 +17,10 @@
unsigned short clower;
};
+#ifdef _WIN32
+#include <wchar.h>
+#endif
+
#ifdef OPENOFFICEORG
# include <unicode/uchar.h>
#else
@@ -46,6 +50,21 @@
static struct unicode_info2 * utf_tbl = NULL;
static int utf_tbl_count = 0; // utf_tbl can be used by multiple Hunspell instances
+FILE * myfopen(const char * path, const char * mode) {
+#ifdef _WIN32
+#define WIN32_LONG_PATH_PREFIX "\\\\?\\"
+ if (strncmp(path, WIN32_LONG_PATH_PREFIX, 4) == 0) {
+ int len = MultiByteToWideChar(CP_UTF8, 0, path, -1, NULL, 0);
+ wchar_t *buff = (wchar_t *) malloc(len * sizeof(wchar_t));
+ MultiByteToWideChar(CP_UTF8, 0, path, -1, buff, len);
+ FILE * f = _wfopen(buff, (strcmp(mode, "r") == 0) ? L"r" : L"rb");
+ free(buff);
+ return f;
+ }
+#endif
+ return fopen(path, mode);
+}
+
/* only UTF-16 (BMP) implementation */
char * u16_u8(char * dest, int size, const w_char * src, int srclen) {
signed char * u8 = (signed char *)dest;
diff -ru hunspell/src/hunspell/csutil.hxx build/hunspell/src/hunspell/csutil.hxx
--- hunspell/src/hunspell/csutil.hxx 2010-09-06 09:58:53.000000000 +0200
+++ build/hunspell/src/hunspell/csutil.hxx 2014-04-24 19:42:01.373285409 +0200
@@ -52,6 +52,9 @@
#define FORBIDDENWORD 65510
#define ONLYUPCASEFLAG 65511
+// fopen or optional _wfopen to fix long pathname problem of WIN32
+LIBHUNSPELL_DLL_EXPORTED FILE * myfopen(const char * path, const char * mode);
+
// convert UTF-16 characters to UTF-8
LIBHUNSPELL_DLL_EXPORTED char * u16_u8(char * dest, int size, const w_char * src, int srclen);
diff -ru hunspell/src/hunspell/dictmgr.cxx build/hunspell/src/hunspell/dictmgr.cxx
--- hunspell/src/hunspell/dictmgr.cxx 2010-06-02 21:33:59.000000000 +0200
+++ build/hunspell/src/hunspell/dictmgr.cxx 2014-04-24 19:42:01.381285408 +0200
@@ -5,6 +5,7 @@
#include <stdio.h>
#include "dictmgr.hxx"
+#include "csutil.hxx"
DictMgr::DictMgr(const char * dictpath, const char * etype) : numdict(0)
{
@@ -57,7 +58,7 @@
// open the dictionary list file
FILE * dictlst;
- dictlst = fopen(dictpath,"r");
+ dictlst = myfopen(dictpath,"r");
if (!dictlst) {
return 1;
}
diff -ru hunspell/src/hunspell/filemgr.cxx build/hunspell/src/hunspell/filemgr.cxx
--- hunspell/src/hunspell/filemgr.cxx 2010-04-14 11:42:03.000000000 +0200
+++ build/hunspell/src/hunspell/filemgr.cxx 2014-04-25 00:44:05.049789586 +0200
@@ -6,6 +6,7 @@
#include <stdio.h>
#include "filemgr.hxx"
+#include "csutil.hxx"
int FileMgr::fail(const char * err, const char * par) {
fprintf(stderr, err, par);
@@ -15,7 +16,7 @@
FileMgr::FileMgr(const char * file, const char * key) {
linenum = 0;
hin = NULL;
- fin = fopen(file, "r");
+ fin = myfopen(file, "r");
if (!fin) {
// check hzipped file
char * st = (char *) malloc(strlen(file) + strlen(HZIP_EXTENSION) + 1);
diff -ru hunspell/src/hunspell/hunzip.cxx build/hunspell/src/hunspell/hunzip.cxx
--- hunspell/src/hunspell/hunzip.cxx 2010-04-27 16:07:14.000000000 +0200
+++ build/hunspell/src/hunspell/hunzip.cxx 2014-04-24 19:42:01.381285408 +0200
@@ -3,6 +3,7 @@
#include <stdio.h>
#include "hunzip.hxx"
+#include "csutil.hxx"
#define CODELEN 65536
#define BASEBITREC 5000
@@ -38,7 +38,7 @@
if (!filename) return -1;
- fin = fopen(filename, "rb");
+ fin = myfopen(filename, "rb");
if (!fin) return -1;
// read magic number
|