annotate src/spell.c @ 223:5175af353b81

updated for version 7.0062
author vimboss
date Mon, 21 Mar 2005 08:23:33 +0000
parents
children 4e7dca477fee
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
223
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
1 /* vi:set ts=8 sts=4 sw=4:
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
2 *
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
3 * VIM - Vi IMproved by Bram Moolenaar
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
4 *
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
5 * Do ":help uganda" in Vim to read copying and usage conditions.
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
6 * Do ":help credits" in Vim to see a list of people who contributed.
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
7 * See README.txt for an overview of the Vim source code.
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
8 */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
9
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
10 /*
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
11 * spell.c: code for spell checking
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
12 */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
13
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
14 #if defined(MSDOS) || defined(WIN16) || defined(WIN32) || defined(_WIN64)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
15 # include <io.h> /* for lseek(), must be before vim.h */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
16 #endif
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
17
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
18 #include "vim.h"
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
19
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
20 #if defined(FEAT_SYN_HL) || defined(PROTO)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
21
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
22 #ifdef HAVE_FCNTL_H
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
23 # include <fcntl.h>
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
24 #endif
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
25
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
26 /*
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
27 * Structure that is used to store the text from the language file. This
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
28 * avoids the need to allocate each individual word and copying it. It's
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
29 * allocated in big chunks for speed.
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
30 */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
31 #define SBLOCKSIZE 4096 /* default size of sb_data */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
32 typedef struct sblock_S sblock_T;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
33 struct sblock_S
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
34 {
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
35 sblock_T *sb_next; /* next block in list */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
36 char_u sb_data[1]; /* data, actually longer */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
37 };
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
38
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
39 /*
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
40 * Structure used to store words and other info for one language.
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
41 */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
42 typedef struct slang_S slang_T;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
43
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
44 struct slang_S
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
45 {
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
46 slang_T *sl_next; /* next language */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
47 char_u sl_name[2]; /* language name "en", "nl", etc. */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
48 hashtab_T sl_ht; /* hashtable with all words */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
49 garray_T sl_match; /* table with pointers to matches */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
50 garray_T sl_add; /* table with pointers to additions */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
51 char_u sl_regions[13]; /* table with up to 6 region names */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
52 sblock_T *sl_block; /* list with allocated memory blocks */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
53 };
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
54
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
55 static slang_T *first_lang = NULL;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
56
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
57 /*
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
58 * Structure used in "b_langp", filled from 'spelllang'.
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
59 */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
60 typedef struct langp_S
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
61 {
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
62 slang_T *lp_slang; /* info for this language (NULL for last one) */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
63 int lp_region; /* bitmask for region or REGION_ALL */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
64 } langp_T;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
65
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
66 #define LANGP_ENTRY(ga, i) (((langp_T *)(ga).ga_data) + (i))
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
67 #define MATCH_ENTRY(gap, i) *(((char_u **)(gap)->ga_data) + i)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
68
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
69 /*
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
70 * The byte before a word in the hashtable indicates the type of word.
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
71 * Also used for the byte just before a match.
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
72 * The top two bits are used to indicate rare and case-sensitive words.
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
73 * The lower bits are used to indicate the region in which the word is valid.
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
74 * Words valid in all regions use REGION_ALL.
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
75 */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
76 #define REGION_MASK 0x3f
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
77 #define REGION_ALL 0x3f
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
78 #define CASE_MASK 0x40
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
79 #define RARE_MASK 0x80
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
80
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
81 #define SP_OK 0
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
82 #define SP_BAD 1
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
83 #define SP_RARE 2
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
84 #define SP_LOCAL 3
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
85
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
86 static slang_T *spell_load_lang __ARGS((char_u *lang));
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
87 static void spell_load_file __ARGS((char_u *fname));
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
88 static int find_region __ARGS((char_u *rp, char_u *region));
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
89
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
90 /*
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
91 * Main spell-checking function.
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
92 * "ptr" points to the start of a word.
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
93 * "*attrp" is set to the attributes for a badly spelled word. For a non-word
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
94 * or when it's OK it remains unchanged.
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
95 * This must only be called when 'spelllang' is not empty.
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
96 * Returns the length of the word in bytes, also when it's OK, so that the
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
97 * caller can skip over the word.
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
98 */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
99 int
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
100 spell_check(wp, ptr, attrp)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
101 win_T *wp; /* current window */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
102 char_u *ptr;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
103 int *attrp;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
104 {
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
105 char_u *e;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
106 langp_T *lp;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
107 int result;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
108 int len = 0;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
109 hash_T hash;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
110 hashitem_T *hi;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
111 int c;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
112 #define MAXWLEN 80 /* assume max. word len is 80 */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
113 char_u word[MAXWLEN + 1];
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
114 garray_T *gap;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
115 int l, h, t;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
116 char_u *p;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
117 int n;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
118
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
119 /* Find the end of the word. We already know that *ptr is a word char. */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
120 e = ptr;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
121 do
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
122 {
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
123 mb_ptr_adv(e);
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
124 ++len;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
125 } while (*e != NUL && vim_iswordc_buf(e, wp->w_buffer));
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
126
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
127 /* The word is bad unless we find it in the dictionary. */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
128 result = SP_BAD;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
129
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
130 /* Words are always stored with folded case. */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
131 (void)str_foldcase(ptr, e - ptr, word, MAXWLEN + 1);
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
132 hash = hash_hash(word);
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
133
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
134 /*
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
135 * Loop over the languages specified in 'spelllang'.
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
136 * We check them all, because a match may find a longer word.
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
137 */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
138 for (lp = LANGP_ENTRY(wp->w_buffer->b_langp, 0); lp->lp_slang != NULL;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
139 ++lp)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
140 {
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
141 /* Check words when it wasn't recognized as a good word yet. */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
142 if (result != SP_OK)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
143 {
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
144 /* Word lookup. Using a hash table is fast. */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
145 hi = hash_lookup(&lp->lp_slang->sl_ht, word, hash);
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
146 if (!HASHITEM_EMPTY(hi))
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
147 {
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
148 /* The character before the key indicates the type of word. */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
149 c = hi->hi_key[-1];
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
150 if ((c & CASE_MASK) != 0)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
151 {
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
152 /* Need to check first letter is uppercase. If it is,
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
153 * check region. If it isn't it may be a rare word. */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
154 if (
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
155 #ifdef FEAT_MBYTE
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
156 MB_ISUPPER(mb_ptr2char(ptr))
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
157 #else
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
158 MB_ISUPPER(*ptr)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
159 #endif
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
160 )
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
161 {
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
162 if ((c & lp->lp_region) == 0)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
163 result = SP_LOCAL;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
164 else
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
165 result = SP_OK;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
166 }
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
167 else if (c & RARE_MASK)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
168 result = SP_RARE;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
169 }
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
170 else
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
171 {
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
172 if ((c & lp->lp_region) == 0)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
173 result = SP_LOCAL;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
174 else if (c & RARE_MASK)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
175 result = SP_RARE;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
176 else
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
177 result = SP_OK;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
178 }
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
179 }
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
180 }
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
181
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
182 /* Match lookup. Uses a binary search. If there is a match adjust
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
183 * "e" to the end. This is also done when a word matched, because
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
184 * "you've" is longer than "you". */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
185 gap = &lp->lp_slang->sl_match;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
186 l = 0; /* low index */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
187 h = gap->ga_len - 1; /* high index */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
188 /* keep searching, the match must be between "l" and "h" (inclusive) */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
189 while (h >= l)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
190 {
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
191 t = (h + l) / 2;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
192 p = MATCH_ENTRY(gap, t) + 1;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
193 for (n = 0; p[n] != 0 && p[n] == ptr[n]; ++n)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
194 ;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
195 if (p[n] == 0)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
196 {
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
197 if ((ptr[n] == 0 || !vim_iswordc_buf(ptr + n, wp->w_buffer)))
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
198 {
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
199 /* match! */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
200 e = ptr + n;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
201 if (result != SP_OK)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
202 {
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
203 if ((lp->lp_region & p[-1]) == 0)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
204 result = SP_LOCAL;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
205 else
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
206 result = SP_OK;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
207 }
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
208 break;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
209 }
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
210 /* match is too short, next item is new low index */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
211 l = t + 1;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
212 }
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
213 else if (p[n] < ptr[n])
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
214 /* match is before word, next item is new low index */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
215 l = t + 1;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
216 else
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
217 /* match is after word, previous item is new high index */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
218 h = t - 1;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
219 }
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
220
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
221 /* Addition lookup. Uses a linear search, there should be very few.
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
222 * If there is a match adjust "e" to the end. This doesn't change
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
223 * whether a word was good or bad, only the length. */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
224 gap = &lp->lp_slang->sl_add;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
225 for (t = 0; t < gap->ga_len; ++t)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
226 {
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
227 p = MATCH_ENTRY(gap, t) + 1;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
228 for (n = 0; p[n] != 0 && p[n] == e[n]; ++n)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
229 ;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
230 if (p[n] == 0
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
231 && (e[n] == 0 || !vim_iswordc_buf(e + n, wp->w_buffer)))
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
232 {
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
233 /* match */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
234 e += n;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
235 break;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
236 }
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
237 }
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
238 }
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
239
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
240 if (result != SP_OK)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
241 {
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
242 if (result == SP_BAD)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
243 *attrp = highlight_attr[HLF_SPB];
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
244 else if (result == SP_RARE)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
245 *attrp = highlight_attr[HLF_SPR];
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
246 else
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
247 *attrp = highlight_attr[HLF_SPL];
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
248 }
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
249
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
250 return (int)(e - ptr);
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
251 }
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
252
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
253 static slang_T *load_lp; /* passed from spell_load_lang() to
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
254 spell_load_file() */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
255
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
256 /*
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
257 * Load language "lang[2]".
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
258 */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
259 static slang_T *
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
260 spell_load_lang(lang)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
261 char_u *lang;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
262 {
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
263 slang_T *lp;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
264 char_u fname_enc[80];
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
265 char_u fname_ascii[20];
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
266 char_u *p;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
267
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
268 lp = (slang_T *)alloc(sizeof(slang_T));
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
269 if (lp != NULL)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
270 {
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
271 lp->sl_name[0] = lang[0];
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
272 lp->sl_name[1] = lang[1];
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
273 hash_init(&lp->sl_ht);
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
274 ga_init2(&lp->sl_match, sizeof(char_u *), 20);
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
275 ga_init2(&lp->sl_add, sizeof(char_u *), 4);
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
276 lp->sl_regions[0] = NUL;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
277 lp->sl_block = NULL;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
278
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
279 /* Find all spell files for "lang" in 'runtimepath' and load them.
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
280 * Use 'encoding', except that we use "latin1" for "latin9". */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
281 #ifdef FEAT_MBYTE
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
282 if (STRLEN(p_enc) < 60 && STRCMP(p_enc, "iso-8859-15") != 0)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
283 p = p_enc;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
284 else
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
285 #endif
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
286 p = (char_u *)"latin1";
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
287 load_lp = lp;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
288 sprintf((char *)fname_enc, "spell/%c%c.%s.spl", lang[0], lang[1], p);
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
289 if (do_in_runtimepath(fname_enc, TRUE, spell_load_file) == FAIL)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
290 {
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
291 /* Try again to find an ASCII spell file. */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
292 sprintf((char *)fname_ascii, "spell/%c%c.spl", lang[0], lang[1]);
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
293 if (do_in_runtimepath(fname_ascii, TRUE, spell_load_file) == FAIL)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
294 {
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
295 vim_free(lp);
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
296 lp = NULL;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
297 smsg((char_u *)_("Warning: Cannot find dictionary \"%s\""),
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
298 fname_enc + 6);
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
299 }
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
300 }
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
301 else
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
302 {
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
303 lp->sl_next = first_lang;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
304 first_lang = lp;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
305 }
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
306 }
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
307
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
308 return lp;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
309 }
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
310
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
311 /*
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
312 * Load one spell file into "load_lp".
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
313 * Invoked through do_in_runtimepath().
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
314 */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
315 static void
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
316 spell_load_file(fname)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
317 char_u *fname;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
318 {
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
319 int fd;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
320 size_t len;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
321 size_t l;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
322 size_t rest = 0;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
323 char_u *p = NULL, *np;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
324 sblock_T *bl;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
325 hash_T hash;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
326 hashitem_T *hi;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
327 int c;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
328 int region = REGION_ALL;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
329 char_u word[MAXWLEN + 1];
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
330 int n;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
331
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
332 fd = mch_open((char *)fname, O_RDONLY | O_EXTRA, 0);
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
333 if (fd < 0)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
334 {
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
335 EMSG2(_(e_notopen), fname);
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
336 return;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
337 }
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
338
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
339 /* Get the length of the whole file. */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
340 len = lseek(fd, (off_t)0, SEEK_END);
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
341 lseek(fd, (off_t)0, SEEK_SET);
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
342
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
343 /* Loop, reading the file one block at a time.
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
344 * "rest" is the length of an incomplete line at the previous block.
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
345 * "p" points to the remainder. */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
346 while (len > 0)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
347 {
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
348 /* Allocate a block of memory to store the info in. This is not freed
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
349 * until spell_reload() is called. */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
350 if (len > SBLOCKSIZE)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
351 l = SBLOCKSIZE;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
352 else
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
353 l = len;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
354 len -= l;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
355 bl = (sblock_T *)alloc((unsigned)(sizeof(sblock_T) - 1 + l + rest));
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
356 if (bl == NULL)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
357 break;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
358 bl->sb_next = load_lp->sl_block;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
359 load_lp->sl_block = bl;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
360
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
361 /* Read a block from the file. Prepend the remainder of the previous
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
362 * block. */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
363 if (rest > 0)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
364 mch_memmove(bl->sb_data, p, rest);
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
365 if (read(fd, bl->sb_data + rest, l) != l)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
366 {
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
367 EMSG2(_(e_notread), fname);
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
368 break;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
369 }
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
370 l += rest;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
371 rest = 0;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
372
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
373 /* Deal with each line that was read until we finish the block. */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
374 for (p = bl->sb_data; l > 0; p = np)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
375 {
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
376 /* "np" points to the char after the line (CR or NL). */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
377 for (np = p; l > 0 && *np >= ' '; ++np)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
378 --l;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
379 if (l == 0)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
380 {
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
381 /* Incomplete line (or end of file). */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
382 rest = np - p;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
383 if (len == 0)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
384 EMSG2(_("E751: Truncated spell file: %s"), fname);
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
385 break;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
386 }
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
387 *np = NUL; /* terminate the line with a NUL */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
388
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
389 /* Skip comment and empty lines. */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
390 c = *p;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
391 if (c != '#' && np > p)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
392 {
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
393 if (c == '=' || c == '+')
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
394 {
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
395 garray_T *gap;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
396
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
397 /* Match or Add item. */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
398 if (c == '=')
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
399 gap = &load_lp->sl_match;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
400 else
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
401 gap = &load_lp->sl_add;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
402
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
403 if (ga_grow(gap, 1) == OK)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
404 {
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
405 for (n = 0; n < gap->ga_len; ++n)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
406 if ((c = STRCMP(p + 1,
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
407 MATCH_ENTRY(gap, n) + 1)) < 0)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
408 break;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
409 if (c == 0)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
410 {
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
411 if (p_verbose > 0)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
412 smsg((char_u *)_("Warning: duplicate match \"%s\" in %s"),
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
413 p + 1, fname);
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
414 }
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
415 else
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
416 {
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
417 mch_memmove((char_u **)gap->ga_data + n + 1,
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
418 (char_u **)gap->ga_data + n,
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
419 (gap->ga_len - n) * sizeof(char_u *));
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
420 *(((char_u **)gap->ga_data) + n) = p;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
421 *p = region;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
422 ++gap->ga_len;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
423 }
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
424 }
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
425 }
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
426 else if (c == '-')
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
427 {
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
428 /* region item */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
429 ++p;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
430 if (*p == '-')
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
431 /* end of a region */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
432 region = REGION_ALL;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
433 else
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
434 {
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
435 char_u *rp = load_lp->sl_regions;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
436 int r;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
437
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
438 /* The region may be repeated: "-ca-uk". Fill
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
439 * "region" with the bit mask for the ones we find. */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
440 region = 0;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
441 for (;;)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
442 {
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
443 /* start of a region */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
444 r = find_region(rp, p);
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
445 if (r == REGION_ALL)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
446 {
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
447 /* new region, add it */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
448 r = STRLEN(rp);
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
449 if (r >= 12)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
450 {
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
451 EMSG2(_("E752: Too many regions in %s"),
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
452 fname);
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
453 r = REGION_ALL;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
454 }
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
455 else
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
456 {
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
457 rp[r] = p[0];
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
458 rp[r + 1] = p[1];
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
459 rp[r + 2] = NUL;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
460 r = 1 << (r / 2);
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
461 }
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
462 }
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
463 else
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
464 r = 1 << r;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
465
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
466 region |= r;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
467 if (p[2] != '-')
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
468 {
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
469 if (p[2] != NUL)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
470 EMSG2(_("E753: Invalid character in \"%s\""),
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
471 p - 1);
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
472 break;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
473 }
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
474 p += 3;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
475 }
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
476 }
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
477 }
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
478 else
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
479 {
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
480 /* add the word */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
481 if (c == '>')
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
482 c = region | RARE_MASK;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
483 else
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
484 {
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
485 if (c != ' ')
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
486 EMSG2(_("E753: Invalid character in \"%s\""), p);
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
487 c = region;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
488 }
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
489 #ifdef FEAT_MBYTE
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
490 if (MB_ISUPPER(mb_ptr2char(p + 1)))
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
491 #else
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
492 if (MB_ISUPPER(p[1]))
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
493 #endif
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
494 c |= CASE_MASK;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
495 *p++ = c;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
496 (void)str_foldcase(p, np - p, word, MAXWLEN + 1);
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
497 n = STRLEN(word);
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
498 if (n > np - p)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
499 {
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
500 sblock_T *s;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
501
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
502 /* Folding case made word longer! We need to allocate
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
503 * memory for it. */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
504 s = (sblock_T *)alloc((unsigned)sizeof(sblock_T)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
505 + n + 1);
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
506 if (s != NULL)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
507 {
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
508 s->sb_next = load_lp->sl_block;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
509 load_lp->sl_block = s;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
510 s->sb_data[0] = p[-1];
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
511 p = s->sb_data + 1;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
512 }
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
513 }
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
514 mch_memmove(p, word, n + 1);
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
515
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
516 hash = hash_hash(p);
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
517 hi = hash_lookup(&load_lp->sl_ht, p, hash);
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
518 if (!HASHITEM_EMPTY(hi))
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
519 {
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
520 c = hi->hi_key[-1];
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
521 if ((c & (CASE_MASK | RARE_MASK))
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
522 == (p[-1] & (CASE_MASK | RARE_MASK)))
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
523 {
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
524 if (p_verbose > 0)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
525 smsg((char_u *)_("Warning: duplicate word \"%s\" in %s"),
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
526 p, fname);
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
527 }
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
528 else
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
529 hi->hi_key[-1] |= (p[-1] & (CASE_MASK | RARE_MASK));
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
530 }
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
531 else
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
532 hash_add_item(&load_lp->sl_ht, hi, p, hash);
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
533 }
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
534 }
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
535
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
536 while (l > 0 && *np < ' ')
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
537 {
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
538 ++np;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
539 --l;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
540 }
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
541 }
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
542 }
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
543
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
544 close(fd);
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
545 }
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
546
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
547 /*
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
548 * Parse 'spelllang' and set buf->b_langp accordingly.
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
549 * Returns an error message or NULL.
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
550 */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
551 char_u *
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
552 did_set_spelllang(buf)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
553 buf_T *buf;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
554 {
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
555 garray_T ga;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
556 char_u *lang;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
557 char_u *e;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
558 char_u *region;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
559 int region_mask;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
560 slang_T *lp;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
561 int c;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
562
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
563 ga_init2(&ga, sizeof(langp_T), 2);
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
564
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
565 /* loop over comma separated languages. */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
566 for (lang = buf->b_p_spl; *lang != NUL; lang = e)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
567 {
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
568 e = vim_strchr(lang, ',');
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
569 if (e == NULL)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
570 e = lang + STRLEN(lang);
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
571 if (e > lang + 2)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
572 {
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
573 if (lang[2] != '_' || e - lang != 5)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
574 {
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
575 ga_clear(&ga);
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
576 return e_invarg;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
577 }
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
578 region = lang + 3;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
579 }
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
580 else
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
581 region = NULL;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
582
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
583 for (lp = first_lang; lp != NULL; lp = lp->sl_next)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
584 if (STRNICMP(lp->sl_name, lang, 2) == 0)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
585 break;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
586
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
587 if (lp == NULL)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
588 /* Not found, load the language. */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
589 lp = spell_load_lang(lang);
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
590
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
591 if (lp != NULL)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
592 {
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
593 if (region == NULL)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
594 region_mask = REGION_ALL;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
595 else
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
596 {
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
597 /* find region in sl_regions */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
598 c = find_region(lp->sl_regions, region);
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
599 if (c == REGION_ALL)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
600 {
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
601 c = lang[5];
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
602 lang[5] = NUL;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
603 smsg((char_u *)_("Warning: region %s not supported"), lang);
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
604 lang[5] = c;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
605 region_mask = REGION_ALL;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
606 }
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
607 else
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
608 region_mask = 1 << c;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
609 }
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
610
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
611 if (ga_grow(&ga, 1) == FAIL)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
612 {
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
613 ga_clear(&ga);
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
614 return e_outofmem;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
615 }
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
616 LANGP_ENTRY(ga, ga.ga_len)->lp_slang = lp;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
617 LANGP_ENTRY(ga, ga.ga_len)->lp_region = region_mask;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
618 ++ga.ga_len;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
619 }
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
620
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
621 if (*e == ',')
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
622 ++e;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
623 }
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
624
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
625 /* Add a NULL entry to mark the end of the list. */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
626 if (ga_grow(&ga, 1) == FAIL)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
627 {
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
628 ga_clear(&ga);
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
629 return e_outofmem;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
630 }
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
631 LANGP_ENTRY(ga, ga.ga_len)->lp_slang = NULL;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
632 ++ga.ga_len;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
633
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
634 /* Everything is fine, store the new b_langp value. */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
635 ga_clear(&buf->b_langp);
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
636 buf->b_langp = ga;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
637
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
638 return NULL;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
639 }
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
640
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
641 /*
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
642 * Find the region "region[2]" in "rp" (points to "sl_regions").
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
643 * Each region is simply stored as the two characters of it's name.
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
644 * Returns the index if found, REGION_ALL if not found.
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
645 */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
646 static int
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
647 find_region(rp, region)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
648 char_u *rp;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
649 char_u *region;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
650 {
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
651 int i;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
652
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
653 for (i = 0; ; i += 2)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
654 {
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
655 if (rp[i] == NUL)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
656 return REGION_ALL;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
657 if (rp[i] == region[0] && rp[i + 1] == region[1])
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
658 break;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
659 }
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
660 return i / 2;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
661 }
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
662
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
663 # if defined(FEAT_MBYTE) || defined(PROTO)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
664 /*
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
665 * Clear all spelling tables and reload them.
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
666 * Used after 'encoding' is set.
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
667 */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
668 void
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
669 spell_reload()
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
670 {
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
671 buf_T *buf;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
672 slang_T *lp;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
673 sblock_T *sp;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
674
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
675 /* Unload all allocated memory. */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
676 while (first_lang != NULL)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
677 {
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
678 lp = first_lang;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
679 first_lang = lp->sl_next;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
680
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
681 hash_clear(&lp->sl_ht);
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
682 ga_clear(&lp->sl_match);
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
683 ga_clear(&lp->sl_add);
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
684 while (lp->sl_block != NULL)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
685 {
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
686 sp = lp->sl_block;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
687 lp->sl_block = sp->sb_next;
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
688 vim_free(sp);
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
689 }
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
690 }
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
691
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
692 /* Go through all buffers and handle 'spelllang'. */
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
693 for (buf = firstbuf; buf != NULL; buf = buf->b_next)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
694 {
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
695 ga_clear(&buf->b_langp);
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
696 if (*buf->b_p_spl != NUL)
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
697 did_set_spelllang(buf);
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
698 }
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
699 }
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
700 # endif
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
701
5175af353b81 updated for version 7.0062
vimboss
parents:
diff changeset
702 #endif /* FEAT_SYN_HL */