diff options
Diffstat (limited to 'src/nvim/spell.c')
-rw-r--r-- | src/nvim/spell.c | 131 |
1 files changed, 77 insertions, 54 deletions
diff --git a/src/nvim/spell.c b/src/nvim/spell.c index 0db1578e8d..0714eb3137 100644 --- a/src/nvim/spell.c +++ b/src/nvim/spell.c @@ -395,7 +395,7 @@ size_t spell_check( mi.mi_fend = ptr; if (spell_iswordp(mi.mi_fend, wp)) { do { - mb_ptr_adv(mi.mi_fend); + MB_PTR_ADV(mi.mi_fend); } while (*mi.mi_fend != NUL && spell_iswordp(mi.mi_fend, wp)); if (capcol != NULL && *capcol == 0 && wp->w_s->b_cap_prog != NULL) { @@ -422,7 +422,7 @@ size_t spell_check( // case-fold the word with one non-word character, so that we can check // for the word end. if (*mi.mi_fend != NUL) { - mb_ptr_adv(mi.mi_fend); + MB_PTR_ADV(mi.mi_fend); } (void)spell_casefold(ptr, (int)(mi.mi_fend - ptr), mi.mi_fword, MAXWLEN + 1); @@ -499,7 +499,7 @@ size_t spell_check( } else if (mi.mi_end == ptr) { // Always include at least one character. Required for when there // is a mixup in "midword". - mb_ptr_adv(mi.mi_end); + MB_PTR_ADV(mi.mi_end); } else if (mi.mi_result == SP_BAD && LANGP_ENTRY(wp->w_s->b_langp, 0)->lp_slang->sl_nobreak) { char_u *p, *fp; @@ -512,8 +512,8 @@ size_t spell_check( p = mi.mi_word; fp = mi.mi_fword; for (;;) { - mb_ptr_adv(p); - mb_ptr_adv(fp); + MB_PTR_ADV(p); + MB_PTR_ADV(fp); if (p >= mi.mi_end) { break; } @@ -706,8 +706,9 @@ static void find_word(matchinf_T *mip, int mode) // case-folded word is equal to the keep-case word. p = mip->mi_word; if (STRNCMP(ptr, p, wlen) != 0) { - for (char_u *s = ptr; s < ptr + wlen; mb_ptr_adv(s)) - mb_ptr_adv(p); + for (char_u *s = ptr; s < ptr + wlen; MB_PTR_ADV(s)) { + MB_PTR_ADV(p); + } wlen = (int)(p - mip->mi_word); } } @@ -814,10 +815,12 @@ static void find_word(matchinf_T *mip, int mode) mip->mi_compoff) != 0) { // case folding may have changed the length p = mip->mi_word; - for (char_u *s = ptr; s < ptr + mip->mi_compoff; mb_ptr_adv(s)) - mb_ptr_adv(p); - } else + for (char_u *s = ptr; s < ptr + mip->mi_compoff; MB_PTR_ADV(s)) { + MB_PTR_ADV(p); + } + } else { p = mip->mi_word + mip->mi_compoff; + } capflags = captype(p, mip->mi_word + wlen); if (capflags == WF_KEEPCAP || (capflags == WF_ALLCAP && (flags & WF_FIXCAP) != 0)) @@ -828,12 +831,13 @@ static void find_word(matchinf_T *mip, int mode) // character we do not accept a Onecap word. We do // accept a no-caps word, even when the dictionary // word specifies ONECAP. - mb_ptr_back(mip->mi_word, p); + MB_PTR_BACK(mip->mi_word, p); if (spell_iswordp_nmw(p, mip->mi_win) ? capflags == WF_ONECAP : (flags & WF_ONECAP) != 0 - && capflags != WF_ONECAP) + && capflags != WF_ONECAP) { continue; + } } } @@ -888,8 +892,9 @@ static void find_word(matchinf_T *mip, int mode) // the case-folded word is equal to the keep-case word. p = mip->mi_fword; if (STRNCMP(ptr, p, wlen) != 0) { - for (char_u *s = ptr; s < ptr + wlen; mb_ptr_adv(s)) - mb_ptr_adv(p); + for (char_u *s = ptr; s < ptr + wlen; MB_PTR_ADV(s)) { + MB_PTR_ADV(p); + } mip->mi_compoff = (int)(p - mip->mi_fword); } } @@ -1288,12 +1293,13 @@ static int fold_more(matchinf_T *mip) p = mip->mi_fend; do { - mb_ptr_adv(mip->mi_fend); + MB_PTR_ADV(mip->mi_fend); } while (*mip->mi_fend != NUL && spell_iswordp(mip->mi_fend, mip->mi_win)); // Include the non-word character so that we can check for the word end. - if (*mip->mi_fend != NUL) - mb_ptr_adv(mip->mi_fend); + if (*mip->mi_fend != NUL) { + MB_PTR_ADV(mip->mi_fend); + } (void)spell_casefold(p, (int)(mip->mi_fend - p), mip->mi_fword + mip->mi_fwordlen, @@ -2312,9 +2318,11 @@ int captype(char_u *word, char_u *end) bool past_second = false; // past second word char // find first letter - for (p = word; !spell_iswordp_nmw(p, curwin); mb_ptr_adv(p)) - if (end == NULL ? *p == NUL : p >= end) + for (p = word; !spell_iswordp_nmw(p, curwin); MB_PTR_ADV(p)) { + if (end == NULL ? *p == NUL : p >= end) { return 0; // only non-word characters, illegal word + } + } if (has_mbyte) { c = mb_ptr2char_adv((const char_u **)&p); } else { @@ -2324,19 +2332,22 @@ int captype(char_u *word, char_u *end) // Need to check all letters to find a word with mixed upper/lower. // But a word with an upper char only at start is a ONECAP. - for (; end == NULL ? *p != NUL : p < end; mb_ptr_adv(p)) + for (; end == NULL ? *p != NUL : p < end; MB_PTR_ADV(p)) { if (spell_iswordp_nmw(p, curwin)) { c = PTR2CHAR(p); if (!SPELL_ISUPPER(c)) { // UUl -> KEEPCAP - if (past_second && allcap) + if (past_second && allcap) { return WF_KEEPCAP; + } allcap = false; - } else if (!allcap) + } else if (!allcap) { // UlU -> KEEPCAP return WF_KEEPCAP; + } past_second = true; } + } if (allcap) return WF_ALLCAP; @@ -2360,7 +2371,7 @@ static int badword_captype(char_u *word, char_u *end) // Count the number of UPPER and lower case letters. l = u = 0; first = false; - for (p = word; p < end; mb_ptr_adv(p)) { + for (p = word; p < end; MB_PTR_ADV(p)) { c = PTR2CHAR(p); if (SPELL_ISUPPER(c)) { ++u; @@ -2764,11 +2775,12 @@ void spell_suggest(int count) return; } badlen = (int)curwin->w_cursor.col - (int)VIsual.col; - if (badlen < 0) + if (badlen < 0) { badlen = -badlen; - else + } else { curwin->w_cursor.col = VIsual.col; - ++badlen; + } + badlen++; end_visual_mode(); } else // Find the start of the badly spelled word. @@ -2780,11 +2792,13 @@ void spell_suggest(int count) line = get_cursor_line_ptr(); p = line + curwin->w_cursor.col; // Backup to before start of word. - while (p > line && spell_iswordp_nmw(p, curwin)) - mb_ptr_back(line, p); + while (p > line && spell_iswordp_nmw(p, curwin)) { + MB_PTR_BACK(line, p); + } // Forward to start of word. - while (*p != NUL && !spell_iswordp_nmw(p, curwin)) - mb_ptr_adv(p); + while (*p != NUL && !spell_iswordp_nmw(p, curwin)) { + MB_PTR_ADV(p); + } if (!spell_iswordp_nmw(p, curwin)) { // No word found. beep_flush(); @@ -2973,8 +2987,9 @@ static bool check_need_cap(linenr_T lnum, colnr_T col) endcol = (colnr_T)STRLEN(line); } } - } else + } else { endcol = col; + } if (endcol > 0) { // Check if sentence ends before the bad word. @@ -2982,9 +2997,10 @@ static bool check_need_cap(linenr_T lnum, colnr_T col) regmatch.rm_ic = FALSE; p = line + endcol; for (;; ) { - mb_ptr_back(line, p); - if (p == line || spell_iswordp_nmw(p, curwin)) + MB_PTR_BACK(line, p); + if (p == line || spell_iswordp_nmw(p, curwin)) { break; + } if (vim_regexec(®match, p, 0) && regmatch.endp[0] == line + endcol) { need_cap = true; @@ -3861,7 +3877,7 @@ static void suggest_trie_walk(suginfo_T *su, langp_T *lp, char_u *fword, bool so // Get pointer to last char of previous word. p = preword + sp->ts_prewordlen; - mb_ptr_back(preword, p); + MB_PTR_BACK(preword, p); } } @@ -3947,12 +3963,13 @@ static void suggest_trie_walk(suginfo_T *su, langp_T *lp, char_u *fword, bool so // Give a penalty when changing non-word char to word // char, e.g., "thes," -> "these". p = fword + sp->ts_fidx; - mb_ptr_back(fword, p); + MB_PTR_BACK(fword, p); if (!spell_iswordp(p, curwin)) { p = preword + STRLEN(preword); - mb_ptr_back(preword, p); - if (spell_iswordp(p, curwin)) + MB_PTR_BACK(preword, p); + if (spell_iswordp(p, curwin)) { newscore += SCORE_NONWORD; + } } // Give a bonus to words seen before. @@ -4301,10 +4318,10 @@ static void suggest_trie_walk(suginfo_T *su, langp_T *lp, char_u *fword, bool so // to the score. Also for the soundfold // tree (might seem illogical but does // give better scores). - mb_ptr_back(tword, p); - if (c == mb_ptr2char(p)) - sp->ts_score -= SCORE_INS - - SCORE_INSDUP; + MB_PTR_BACK(tword, p); + if (c == mb_ptr2char(p)) { + sp->ts_score -= SCORE_INS - SCORE_INSDUP; + } } } @@ -4894,10 +4911,12 @@ static int nofold_len(char_u *fword, int flen, char_u *word) char_u *p; int i = 0; - for (p = fword; p < fword + flen; mb_ptr_adv(p)) - ++i; - for (p = word; i > 0; mb_ptr_adv(p)) - --i; + for (p = fword; p < fword + flen; MB_PTR_ADV(p)) { + i++; + } + for (p = word; i > 0; MB_PTR_ADV(p)) { + i--; + } return (int)(p - word); } @@ -5630,8 +5649,8 @@ add_suggestion ( badlen = (int)(pbad - su->su_badptr); if (goodlen <= 0 || badlen <= 0) break; - mb_ptr_back(goodword, pgood); - mb_ptr_back(su->su_badptr, pbad); + MB_PTR_BACK(goodword, pgood); + MB_PTR_BACK(su->su_badptr, pbad); if (has_mbyte) { if (mb_ptr2char(pgood) != mb_ptr2char(pbad)) break; @@ -7517,8 +7536,9 @@ char_u *spell_to_word_end(char_u *start, win_T *win) { char_u *p = start; - while (*p != NUL && spell_iswordp(p, win)) - mb_ptr_adv(p); + while (*p != NUL && spell_iswordp(p, win)) { + MB_PTR_ADV(p); + } return p; } @@ -7533,23 +7553,26 @@ int spell_word_start(int startcol) char_u *p; int col = 0; - if (no_spell_checking(curwin)) + if (no_spell_checking(curwin)) { return startcol; + } // Find a word character before "startcol". line = get_cursor_line_ptr(); for (p = line + startcol; p > line; ) { - mb_ptr_back(line, p); - if (spell_iswordp_nmw(p, curwin)) + MB_PTR_BACK(line, p); + if (spell_iswordp_nmw(p, curwin)) { break; + } } // Go back to start of the word. while (p > line) { col = (int)(p - line); - mb_ptr_back(line, p); - if (!spell_iswordp(p, curwin)) + MB_PTR_BACK(line, p); + if (!spell_iswordp(p, curwin)) { break; + } col = 0; } |