commit 20058a1b639812ca235fbbd9798fd5f922d37a0b
parent f6dd0ad18ab932e12466417d0d2f703aaa547ae6
Author: Benno Schulenberg <bensberg@justemail.net>
Date: Tue, 2 Aug 2016 22:09:22 +0200
spelling: don't consider digits as word parts, because GNU spell doesn't
This fixes https://savannah.gnu.org/bugs/?48660.
Diffstat:
3 files changed, 26 insertions(+), 6 deletions(-)
diff --git a/src/chars.c b/src/chars.c
@@ -93,6 +93,26 @@ void wctomb_reset(void)
IGNORE_CALL_RESULT(wctomb(NULL, 0));
}
+/* This function is equivalent to isalpha() for multibyte characters. */
+bool is_alpha_mbchar(const char *c)
+{
+ assert(c != NULL);
+
+#ifdef ENABLE_UTF8
+ if (use_utf8) {
+ wchar_t wc;
+
+ if (mbtowc(&wc, c, MB_CUR_MAX) < 0) {
+ mbtowc_reset();
+ return 0;
+ }
+
+ return iswalpha(wc);
+ } else
+#endif
+ return isalpha((unsigned char)*c);
+}
+
/* This function is equivalent to isalnum() for multibyte characters. */
bool is_alnum_mbchar(const char *c)
{
diff --git a/src/proto.h b/src/proto.h
@@ -183,6 +183,7 @@ bool nisblank(int c);
bool niswblank(wchar_t wc);
#endif
bool is_byte(int c);
+bool is_alpha_mbchar(const char *c);
bool is_alnum_mbchar(const char *c);
bool is_blank_mbchar(const char *c);
bool is_ascii_cntrl_char(int c);
diff --git a/src/utils.c b/src/utils.c
@@ -290,12 +290,11 @@ bool is_separate_word(size_t position, size_t length, const char *buf)
parse_mbchar(buf + move_mbleft(buf, position), before, NULL);
parse_mbchar(buf + word_end, after, NULL);
- /* If we're at the beginning of the line or the character before the
- * word isn't a non-punctuation "word" character, and if we're at
- * the end of the line or the character after the word isn't a
- * non-punctuation "word" character, we have a whole word. */
- retval = (position == 0 || !is_alnum_mbchar(before)) &&
- (word_end == strlen(buf) || !is_alnum_mbchar(after));
+ /* If the word starts at the beginning of the line OR the character before
+ * the word isn't a letter, and if the word ends at the end of the line OR
+ * the character after the word isn't a letter, we have a whole word. */
+ retval = (position == 0 || !is_alpha_mbchar(before)) &&
+ (word_end == strlen(buf) || !is_alpha_mbchar(after));
free(before);
free(after);