From c0591ef34ea123aa8c709bda122308256d2c84cd Mon Sep 17 00:00:00 2001 From: Oliver Kiddle Date: Wed, 18 Jan 2006 17:07:28 +0000 Subject: [PATCH] add autoconf magic to support old systems that don't support multibyte charsets --- ChangeLog | 3 +++ configure.in | 15 +++++++++++---- sbr/fmt_scan.c | 18 +++++++++++++++++- 3 files changed, 31 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index f634ba2..56fb2f5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,8 @@ 2006-01-18 Oliver Kiddle + * configure.in, sbr/fmt_scan.c: add autoconf magic to support + old systems that don't support multibyte character sets + * sbr/fmt_scan.c: fix bug with insertion of newline being wrong if the num function was used at the end of the format buffer diff --git a/configure.in b/configure.in index e52c5e6..525ba8c 100644 --- a/configure.in +++ b/configure.in @@ -448,9 +448,9 @@ AC_HEADER_SYS_WAIT AC_HEADER_STAT AC_CHECK_HEADERS(string.h memory.h stdlib.h unistd.h errno.h fcntl.h \ limits.h crypt.h termcap.h termio.h termios.h locale.h \ - langinfo.h netdb.h sys/param.h sys/time.h sys/utsname.h \ - iconv.h sys/stream.h arpa/inet.h arpa/ftp.h) - + langinfo.h wchar.h wctype.h iconv.h netdb.h \ + sys/param.h sys/time.h sys/utsname.h sys/stream.h \ + arpa/inet.h arpa/ftp.h) AC_CACHE_CHECK(POSIX termios, nmh_cv_sys_posix_termios, [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include @@ -505,7 +505,7 @@ AC_FUNC_VFORK AC_CHECK_LIB(mkstemp,mkstemp) AC_CHECK_FUNCS(waitpid wait3 sigaction sigprocmask sigblock sigsetmask \ sighold sigrelse writev lstat uname tzset killpg mkstemp \ - sethostent getutent nl_langinfo) + sethostent getutent nl_langinfo mbtowc wcwidth) dnl solaris screws this up AC_CHECK_FUNC(gethostbyname, [AC_DEFINE(HAVE_GETHOSTBYNAME)], @@ -539,6 +539,13 @@ dnl preprocessor to preprocess stdio.h and make sure that there's actually a dnl prototype. AC_EGREP_HEADER(snprintf, stdio.h, AC_DEFINE(HAVE_SNPRINTF_PROTOTYPE)) +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 dnl ------------------- diff --git a/sbr/fmt_scan.c b/sbr/fmt_scan.c index b27f7c6..8475d50 100644 --- a/sbr/fmt_scan.c +++ b/sbr/fmt_scan.c @@ -25,7 +25,10 @@ # include # endif #endif -#include +#ifdef MULTIBYTE_SUPPORT +# include +# include +#endif #define NFMTS MAXARGS @@ -127,8 +130,10 @@ cptrimmed(char **dest, char *str, unsigned int wid, char fill, size_t n) { int remaining; /* remaining output width available */ int c, ljust, w; int end; /* number of input bytes remaining in str */ +#ifdef MULTIBYTE_SUPPORT int char_len; /* bytes in current character */ 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 */ @@ -144,6 +149,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; @@ -152,6 +158,11 @@ 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--; + if (iscntrl(*sp) || isspace(*sp)) { + sp++; +#endif if (!prevCtrl) { *cp++ = ' '; remaining--; @@ -162,6 +173,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); @@ -169,6 +181,10 @@ cptrimmed(char **dest, char *str, unsigned int wid, char fill, size_t n) { remaining -= w; } sp += char_len; +#else + *cp++ = *sp++; + remaining--; +#endif } } -- 1.7.10.4