aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/spell.c
diff options
context:
space:
mode:
authorJustin M. Keyes <justinkz@gmail.com>2020-01-18 16:12:16 -0800
committerGitHub <noreply@github.com>2020-01-18 16:12:16 -0800
commitfb8b0503baf95ccd9ab4a30220dd08ca8b16736b (patch)
tree8106670804b58724a15c64da4473b78393528601 /src/nvim/spell.c
parentfd89ad7bfb1534c42c99b36ca025ea42ccbee7e1 (diff)
parentad35cbca76222deb33357b63a61a29945ef084f7 (diff)
downloadrneovim-fb8b0503baf95ccd9ab4a30220dd08ca8b16736b.tar.gz
rneovim-fb8b0503baf95ccd9ab4a30220dd08ca8b16736b.tar.bz2
rneovim-fb8b0503baf95ccd9ab4a30220dd08ca8b16736b.zip
Merge #11707 from janlazo/vim-8.1.1434
vim-patch:8.1.{716,1139},8.2.{112,120,123}
Diffstat (limited to 'src/nvim/spell.c')
-rw-r--r--src/nvim/spell.c246
1 files changed, 3 insertions, 243 deletions
diff --git a/src/nvim/spell.c b/src/nvim/spell.c
index 5feb7efda9..c75a53a777 100644
--- a/src/nvim/spell.c
+++ b/src/nvim/spell.c
@@ -5835,10 +5835,7 @@ void spell_soundfold(slang_T *slang, char_u *inword, bool folded, char_u *res)
word = fword;
}
- if (has_mbyte)
- spell_soundfold_wsal(slang, word, res);
- else
- spell_soundfold_sal(slang, word, res);
+ spell_soundfold_wsal(slang, word, res);
}
}
@@ -5903,250 +5900,13 @@ static void spell_soundfold_sofo(slang_T *slang, char_u *inword, char_u *res)
res[ri] = NUL;
}
-static void spell_soundfold_sal(slang_T *slang, char_u *inword, char_u *res)
-{
- salitem_T *smp;
- char_u word[MAXWLEN];
- char_u *s = inword;
- char_u *t;
- char_u *pf;
- int i, j, z;
- int reslen;
- int n, k = 0;
- int z0;
- int k0;
- int n0;
- int c;
- int pri;
- int p0 = -333;
- int c0;
-
- // Remove accents, if wanted. We actually remove all non-word characters.
- // But keep white space. We need a copy, the word may be changed here.
- if (slang->sl_rem_accents) {
- t = word;
- while (*s != NUL) {
- if (ascii_iswhite(*s)) {
- *t++ = ' ';
- s = skipwhite(s);
- } else {
- if (spell_iswordp_nmw(s, curwin))
- *t++ = *s;
- ++s;
- }
- }
- *t = NUL;
- } else
- STRLCPY(word, s, MAXWLEN);
-
- smp = (salitem_T *)slang->sl_sal.ga_data;
-
- // This comes from Aspell phonet.cpp. Converted from C++ to C.
- // Changed to keep spaces.
- i = reslen = z = 0;
- while ((c = word[i]) != NUL) {
- // Start with the first rule that has the character in the word.
- n = slang->sl_sal_first[c];
- z0 = 0;
-
- if (n >= 0) {
- // check all rules for the same letter
- for (; (s = smp[n].sm_lead)[0] == c; ++n) {
- // Quickly skip entries that don't match the word. Most
- // entries are less then three chars, optimize for that.
- k = smp[n].sm_leadlen;
- if (k > 1) {
- if (word[i + 1] != s[1])
- continue;
- if (k > 2) {
- for (j = 2; j < k; ++j)
- if (word[i + j] != s[j])
- break;
- if (j < k)
- continue;
- }
- }
-
- if ((pf = smp[n].sm_oneof) != NULL) {
- // Check for match with one of the chars in "sm_oneof".
- while (*pf != NUL && *pf != word[i + k])
- ++pf;
- if (*pf == NUL)
- continue;
- ++k;
- }
- s = smp[n].sm_rules;
- pri = 5; // default priority
-
- p0 = *s;
- k0 = k;
- while (*s == '-' && k > 1) {
- k--;
- s++;
- }
- if (*s == '<')
- s++;
- if (ascii_isdigit(*s)) {
- // determine priority
- pri = *s - '0';
- s++;
- }
- if (*s == '^' && *(s + 1) == '^')
- s++;
-
- if (*s == NUL
- || (*s == '^'
- && (i == 0 || !(word[i - 1] == ' '
- || spell_iswordp(word + i - 1, curwin)))
- && (*(s + 1) != '$'
- || (!spell_iswordp(word + i + k0, curwin))))
- || (*s == '$' && i > 0
- && spell_iswordp(word + i - 1, curwin)
- && (!spell_iswordp(word + i + k0, curwin)))) {
- // search for followup rules, if:
- // followup and k > 1 and NO '-' in searchstring
- c0 = word[i + k - 1];
- n0 = slang->sl_sal_first[c0];
-
- if (slang->sl_followup && k > 1 && n0 >= 0
- && p0 != '-' && word[i + k] != NUL) {
- // test follow-up rule for "word[i + k]"
- for (; (s = smp[n0].sm_lead)[0] == c0; ++n0) {
- // Quickly skip entries that don't match the word.
- k0 = smp[n0].sm_leadlen;
- if (k0 > 1) {
- if (word[i + k] != s[1])
- continue;
- if (k0 > 2) {
- pf = word + i + k + 1;
- for (j = 2; j < k0; ++j)
- if (*pf++ != s[j])
- break;
- if (j < k0)
- continue;
- }
- }
- k0 += k - 1;
-
- if ((pf = smp[n0].sm_oneof) != NULL) {
- // Check for match with one of the chars in
- // "sm_oneof".
- while (*pf != NUL && *pf != word[i + k0])
- ++pf;
- if (*pf == NUL)
- continue;
- ++k0;
- }
-
- p0 = 5;
- s = smp[n0].sm_rules;
- while (*s == '-') {
- // "k0" gets NOT reduced because
- // "if (k0 == k)"
- s++;
- }
- if (*s == '<')
- s++;
- if (ascii_isdigit(*s)) {
- p0 = *s - '0';
- s++;
- }
-
- if (*s == NUL
- // *s == '^' cuts
- || (*s == '$'
- && !spell_iswordp(word + i + k0,
- curwin))) {
- if (k0 == k)
- // this is just a piece of the string
- continue;
-
- if (p0 < pri)
- // priority too low
- continue;
- // rule fits; stop search
- break;
- }
- }
-
- if (p0 >= pri && smp[n0].sm_lead[0] == c0)
- continue;
- }
-
- // replace string
- s = smp[n].sm_to;
- if (s == NULL)
- s = (char_u *)"";
- pf = smp[n].sm_rules;
- p0 = (vim_strchr(pf, '<') != NULL) ? 1 : 0;
- if (p0 == 1 && z == 0) {
- // rule with '<' is used
- if (reslen > 0 && *s != NUL && (res[reslen - 1] == c
- || res[reslen - 1] == *s))
- reslen--;
- z0 = 1;
- z = 1;
- k0 = 0;
- while (*s != NUL && word[i + k0] != NUL) {
- word[i + k0] = *s;
- k0++;
- s++;
- }
- if (k > k0)
- STRMOVE(word + i + k0, word + i + k);
-
- // new "actual letter"
- c = word[i];
- } else {
- // no '<' rule used
- i += k - 1;
- z = 0;
- while (*s != NUL && s[1] != NUL && reslen < MAXWLEN) {
- if (reslen == 0 || res[reslen - 1] != *s)
- res[reslen++] = *s;
- s++;
- }
- // new "actual letter"
- c = *s;
- if (strstr((char *)pf, "^^") != NULL) {
- if (c != NUL)
- res[reslen++] = c;
- STRMOVE(word, word + i + 1);
- i = 0;
- z0 = 1;
- }
- }
- break;
- }
- }
- } else if (ascii_iswhite(c)) {
- c = ' ';
- k = 1;
- }
-
- if (z0 == 0) {
- if (k && !p0 && reslen < MAXWLEN && c != NUL
- && (!slang->sl_collapse || reslen == 0
- || res[reslen - 1] != c))
- // condense only double letters
- res[reslen++] = c;
-
- i++;
- z = 0;
- k = 0;
- }
- }
-
- res[reslen] = NUL;
-}
-
// Turn "inword" into its sound-a-like equivalent in "res[MAXWLEN]".
// Multi-byte version of spell_soundfold().
static void spell_soundfold_wsal(slang_T *slang, char_u *inword, char_u *res)
{
salitem_T *smp = (salitem_T *)slang->sl_sal.ga_data;
- int word[MAXWLEN];
- int wres[MAXWLEN];
+ int word[MAXWLEN] = { 0 };
+ int wres[MAXWLEN] = { 0 };
int l;
int *ws;
int *pf;