*more* cleanups to chars.c and related code


git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@2669 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
diff --git a/ChangeLog b/ChangeLog
index e293fd5..9ee0537 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -75,8 +75,8 @@
 	  shortcut_init() and do_next_word(). (DLR)
 	- Detect words more accurately by taking punctuation into
 	  account, and convert all word-detecting functions to use the
-	  same wrapper function for ease of maintenance.  Changes to
-	  is_alnum_mbchar() (renamed is_word_mbchar()); changes to
+	  same wrapper function for ease of maintenance.  New functions
+	  is_punct_mbchar() and is_word_mbchar(); changes to
 	  do_next_word(), do_prev_word(), is_whole_word(),
 	  do_statusbar_next_word(), and do_statusbar_prev_word(). (DLR)
 - chars.c:
diff --git a/src/chars.c b/src/chars.c
index 7d1a19f..209e975 100644
--- a/src/chars.c
+++ b/src/chars.c
@@ -62,6 +62,27 @@
     return ((unsigned int)c == (unsigned char)c);
 }
 
+/* This function is equivalent to isalnum() for multibyte characters. */
+bool is_alnum_mbchar(const char *c)
+{
+    assert(c != NULL);
+
+#ifdef NANO_WIDE
+    if (!ISSET(NO_UTF8)) {
+	wchar_t wc;
+	int c_mb_len = mbtowc(&wc, c, MB_CUR_MAX);
+
+	if (c_mb_len <= 0) {
+	    mbtowc(NULL, NULL, 0);
+	    wc = (unsigned char)*c;
+	}
+
+	return iswalnum(wc);
+    } else
+#endif
+	return isalnum((unsigned char)*c);
+}
+
 /* This function is equivalent to isblank() for multibyte characters. */
 bool is_blank_mbchar(const char *c)
 {
@@ -125,10 +146,8 @@
 	return is_cntrl_char((unsigned char)*c);
 }
 
-/* Return TRUE for a multibyte character found in a word (currently only
- * an alphanumeric or punctuation character, and the latter only if
- * allow_punct is TRUE) and FALSE otherwise. */
-bool is_word_mbchar(const char *c, bool allow_punct)
+/* This function is equivalent to ispunct() for multibyte characters. */
+bool is_punct_mbchar(const char *c)
 {
     assert(c != NULL);
 
@@ -142,11 +161,21 @@
 	    wc = (unsigned char)*c;
 	}
 
-	return iswalnum(wc) || (allow_punct ? iswpunct(wc) : FALSE);
+	return iswpunct(wc);
     } else
 #endif
-	return isalnum((unsigned char)*c) || (allow_punct ?
-		ispunct((unsigned char)*c) : FALSE);
+	return ispunct((unsigned char)*c);
+}
+
+/* Return TRUE for a multibyte character found in a word (currently only
+ * an alphanumeric or punctuation character, and the latter only if
+ * allow_punct is TRUE) and FALSE otherwise. */
+bool is_word_mbchar(const char *c, bool allow_punct)
+{
+    assert(c != NULL);
+
+    return is_alnum_mbchar(c) || (allow_punct ? is_punct_mbchar(c) :
+	FALSE);
 }
 
 /* c is a control character.  It displays as ^@, ^?, or ^[ch], where ch
diff --git a/src/proto.h b/src/proto.h
index 527fb1b..59620e0 100644
--- a/src/proto.h
+++ b/src/proto.h
@@ -166,12 +166,14 @@
 int niswblank(wint_t wc);
 #endif
 bool is_byte(int c);
+bool is_alnum_mbchar(const char *c);
 bool is_blank_mbchar(const char *c);
 bool is_cntrl_char(int c);
 #ifdef NANO_WIDE
 bool is_cntrl_wchar(wint_t wc);
 #endif
 bool is_cntrl_mbchar(const char *c);
+bool is_punct_mbchar(const char *c);
 bool is_word_mbchar(const char *c, bool allow_punct);
 char control_rep(char c);
 #ifdef NANO_WIDE