bug-ncurses
[Top][All Lists]
Advanced

[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, ' ' }



reply via email to

[Prev in Thread] Current Thread [Next in Thread]