Revert previous change to get rid of MULTIBYTE_SUPPORT ifdef. It turns out
authorKen Hornstein <kenh@pobox.com>
Wed, 21 Mar 2012 16:22:16 +0000 (12:22 -0400)
committerKen Hornstein <kenh@pobox.com>
Wed, 21 Mar 2012 16:22:16 +0000 (12:22 -0400)
this breaks the Plan 9 build.  But include a check for the multibyte functions
so we get MULTIBYTE_SUPPORT on systems that have it.

This reverts commit bd4fca3a8a15b35a04bdc333503c901d677c12eb.

configure.ac
sbr/fmt_scan.c
uip/scansbr.c

index 7957fdd..0b512b3 100644 (file)
@@ -413,7 +413,14 @@ AC_CHECK_HEADER([sys/ptem.h], AC_DEFINE(WINSIZE_IN_PTEM,1,
 dnl ---------------
 dnl CHECK FUNCTIONS
 dnl ---------------
-AC_CHECK_FUNCS([writev lstat nl_langinfo])
+AC_CHECK_FUNCS([wcwidth mbtowc writev lstat nl_langinfo])
+
+dnl Check for multibyte character set support
+if test "x$ac_cv_header_wchar_h" = "xyes" -a "x$ac_cv_header_wctype_h" = "xyes" \
+    -a "x$ac_cv_func_wcwidth" = "xyes" -a "x$ac_cv_func_mbtowc" = "xyes"; then
+  AC_DEFINE(MULTIBYTE_SUPPORT, 1,
+    [Define to enable support for multibyte character sets.])
+fi
 
 dnl -------------------
 dnl CHECK FOR LIBRARIES
index 0f5aeb0..29b87d0 100644 (file)
 # include <sys/time.h>
 #endif
 #include <time.h>
-#include <wctype.h>
-#include <wchar.h>
+#ifdef MULTIBYTE_SUPPORT
+#  include <wctype.h>
+#  include <wchar.h>
+#endif
 
 #ifdef LBL
 struct msgs *fmt_current_folder; /* current folder (set by main program) */
@@ -120,9 +122,11 @@ cptrimmed(char **dest, char *str, unsigned int wid, char fill, size_t n) {
     int remaining;     /* remaining output width available */
     int c, ljust;
     int end;           /* number of input bytes remaining in str */
+#ifdef MULTIBYTE_SUPPORT
     int char_len;      /* bytes in current character */
     int w;
     wchar_t wide_char;
+#endif
     char *sp;          /* current position in source string */
     char *cp = *dest;  /* current position in destination string */
     char *ep = cp + n; /* end of destination buffer */
@@ -138,6 +142,7 @@ cptrimmed(char **dest, char *str, unsigned int wid, char fill, size_t n) {
        mbtowc(NULL, NULL, 0); /* reset shift state */
        end = strlen(str);
        while (*sp && remaining > 0 && end > 0) {
+#ifdef MULTIBYTE_SUPPORT
            char_len = mbtowc(&wide_char, sp, end);
            if (char_len <= 0 || (cp + char_len > ep))
                break;
@@ -146,6 +151,14 @@ cptrimmed(char **dest, char *str, unsigned int wid, char fill, size_t n) {
 
            if (iswcntrl(wide_char) || iswspace(wide_char)) {
                sp += char_len;
+#else
+           end--;
+            /* isnctrl(), etc., take an int argument.  Cygwin's ctype.h
+               intentionally warns if they are passed a char. */
+            int c = *sp;
+           if (iscntrl(c) || isspace(c)) {
+               sp++;
+#endif
                if (!prevCtrl) {
                    *cp++ = ' ';
                    remaining--;
@@ -156,6 +169,7 @@ cptrimmed(char **dest, char *str, unsigned int wid, char fill, size_t n) {
            }
            prevCtrl = 0;
 
+#ifdef MULTIBYTE_SUPPORT
            w = wcwidth(wide_char);
            if (w >= 0 && remaining >= w) {
                strncpy(cp, sp, char_len);
@@ -163,6 +177,10 @@ cptrimmed(char **dest, char *str, unsigned int wid, char fill, size_t n) {
                remaining -= w;
            }
            sp += char_len;
+#else
+           *cp++ = *sp++;
+           remaining--;
+#endif
        }
     }
 
index 7eef85f..1f2785a 100644 (file)
@@ -58,7 +58,11 @@ char *scanl = 0;                     /* text of most recent scanline    */
  */
 static int mh_fputs(char *, FILE *);
 
+#ifdef MULTIBYTE_SUPPORT
 #define SCAN_CHARWIDTH MB_CUR_MAX
+#else
+#define SCAN_CHARWIDTH 1
+#endif
 
 int
 scan (FILE *inb, int innum, int outnum, char *nfs, int width, int curflg,