[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH] use reentrant conversion functions
From: |
Sven Verdoolaege |
Subject: |
[PATCH] use reentrant conversion functions |
Date: |
Fri, 8 Jun 2001 13:56:40 +0200 |
User-agent: |
Mutt/1.3.17i |
Current ncurses doesn't work with mutt on glibc.
With this patch, it does (if CODESET is non-stateful (eg. UTF-8)).
The changes to lib_addstr won't fix the case of stateful CODESETs.
A patch for that will follow later.
skimo
diff -ruN --exclude=tags --exclude=configure
orig/ncurses-5.2/ncurses/base/lib_addstr.c ncurses/ncurses/base/lib_addstr.c
--- orig/ncurses-5.2/ncurses/base/lib_addstr.c Sun Jun 3 22:08:25 2001
+++ ncurses/ncurses/base/lib_addstr.c Fri Jun 8 13:37:09 2001
@@ -43,12 +43,14 @@
MODULE_ID("$Id: lib_addstr.c,v 1.19 2000/12/10 01:24:50 tom Exp $")
#if USE_WIDEC_SUPPORT
+#define CONV_DATA mbstate_t state
+#define CONV_INIT memset (&state, '\0', sizeof (state));
#define NEXT_CHAR(s,ch, n) \
{ \
int len, i; \
memset(&ch, 0, sizeof(cchar_t)); \
for (i = 0; i < CCHARW_MAX && n > 0; ++i) { \
- if ((len = mbtowc(&ch.chars[i], s, n)) < 0) { \
+ if ((len = mbrtowc(&ch.chars[i], s, n, &state)) < 0) { \
code = ERR; \
break; \
} \
@@ -64,6 +66,8 @@
break; \
}
#else
+#define CONV_DATA
+#define CONV_INIT
#define NEXT_CHAR(s,ch, n) \
ch = *s++; \
++n
@@ -75,6 +79,7 @@
{
unsigned const char *str = (unsigned const char *) astr;
int code = ERR;
+ CONV_DATA;
T((T_CALLED("waddnstr(%p,%s,%d)"), win, _nc_visbuf(astr), n));
@@ -85,6 +90,7 @@
if (n < 0)
n = (int) strlen(astr);
+ CONV_INIT;
while ((n > 0) && (*str != '\0')) {
NCURSES_CH_T ch;
TR(TRACE_VIRTPUT, ("*str = %#x", *str));
diff -ruN --exclude=tags --exclude=configure
orig/ncurses-5.2/ncurses/curses.priv.h ncurses/ncurses/curses.priv.h
--- orig/ncurses-5.2/ncurses/curses.priv.h Sun Jun 3 22:16:24 2001
+++ ncurses/ncurses/curses.priv.h Fri Jun 8 13:09:39 2001
@@ -235,6 +235,7 @@
#if USE_WIDEC_SUPPORT
#define _XOPEN_SOURCE_EXTENDED
+#include <wchar.h> /* we want mbstate_t */
#else
#define _bkgrnd _bkgd
#define wgetbkgrnd(win, wch) *wch = win->_bkgd
@@ -523,11 +524,21 @@
#define CHDEREF(wch) (*wch)
#define ARG_CH_T NCURSES_CH_T *
#define CARG_CH_T const NCURSES_CH_T *
-#define PUTC_DATA int PUTC_i
+#define PUTC_DATA char PUTC_buf[MB_LEN_MAX]; int PUTC_i, PUTC_n; \
+ mbstate_t PUT_st; wchar_t PUTC_ch
#define PUTC(ch,b) do { if(!isnac(ch))
\
- for (PUTC_i = 0; PUTC_i < CCHARW_MAX &&
(ch).chars[PUTC_i];\
- ++PUTC_i) {
\
- putwc((ch).chars[PUTC_i],b); } \
+ memset (&PUT_st, '\0', sizeof (PUT_st));
\
+ PUTC_i = 0;
\
+ do {
\
+ PUTC_ch = PUTC_i < CCHARW_MAX ?
\
+ (ch).chars[PUTC_i] : L'\0';
\
+ PUTC_n = wcrtomb(PUTC_buf,
\
+ (ch).chars[PUTC_i], &PUT_st);
\
+ if (PUTC_n < 0)
\
+ break;
\
+ fwrite(PUTC_buf, PUTC_n, 1, b);
\
+ ++PUTC_i;
\
+ } while (PUTC_ch != L'\0');
\
} while (0)
#define BLANK { WA_NORMAL, ' ' }
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [PATCH] use reentrant conversion functions,
Sven Verdoolaege <=