X-Git-Url: https://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=ncurses%2Fbase%2Flib_insch.c;h=e21ec02bc84f30d5b2821d453a66ed9f47c305a1;hp=d813740e43c5f92bbb578d35a41fe6c10760973d;hb=c04d54322f7835ed42e597967d8fa5471025fcac;hpb=7a6bbc8cf41c5186d46accc3d08622dc86526b34 diff --git a/ncurses/base/lib_insch.c b/ncurses/base/lib_insch.c index d813740e..e21ec02b 100644 --- a/ncurses/base/lib_insch.c +++ b/ncurses/base/lib_insch.c @@ -43,33 +43,31 @@ #include #include -MODULE_ID("$Id: lib_insch.c,v 1.27 2009/04/18 23:53:33 tom Exp $") +MODULE_ID("$Id: lib_insch.c,v 1.32 2009/10/24 22:04:35 tom Exp $") /* * Insert the given character, updating the current location to simplify * inserting a string. */ NCURSES_EXPORT(int) -_nc_insert_ch(WINDOW *win, chtype ch) +_nc_insert_ch(SCREEN *sp, WINDOW *win, chtype ch) { int code = OK; NCURSES_CH_T wch; int count; NCURSES_CONST char *s; -#if NCURSES_SP_FUNCS || USE_REENTRANT - SCREEN *sp = _nc_screen_of(win); -#endif - int tabsize = + int tabsize = ( #if USE_REENTRANT - sp->_TABSIZE + sp->_TABSIZE #else - TABSIZE + TABSIZE #endif - ; + ); + switch (ch) { case '\t': for (count = (tabsize - (win->_curx % tabsize)); count > 0; count--) { - if ((code = _nc_insert_ch(win, ' ')) != OK) + if ((code = _nc_insert_ch(sp, win, ' ')) != OK) break; } break; @@ -85,7 +83,9 @@ _nc_insert_ch(WINDOW *win, chtype ch) WINDOW_EXT(win, addch_used) == 0 && #endif is8bits(ChCharOf(ch)) && - isprint(ChCharOf(ch))) { + (isprint(ChCharOf(ch)) || + (ChAttrOf(ch) & A_ALTCHARSET) || + (sp != 0 && sp->_legacy_coding && !iscntrl(ChCharOf(ch))))) { if (win->_curx <= win->_maxx) { struct ldat *line = &(win->_line[win->_cury]); NCURSES_CH_T *end = &(line->text[win->_curx]); @@ -104,7 +104,7 @@ _nc_insert_ch(WINDOW *win, chtype ch) } else if (is8bits(ChCharOf(ch)) && iscntrl(ChCharOf(ch))) { s = NCURSES_SP_NAME(unctrl) (NCURSES_SP_ARGx ChCharOf(ch)); while (*s != '\0') { - code = _nc_insert_ch(win, ChAttrOf(ch) | UChar(*s)); + code = _nc_insert_ch(sp, win, ChAttrOf(ch) | UChar(*s)); if (code != OK) break; ++s; @@ -119,16 +119,21 @@ _nc_insert_ch(WINDOW *win, chtype ch) wch = _nc_render(win, wch); count = _nc_build_wch(win, &wch); if (count > 0) { - code = wins_wch(win, &wch); + code = _nc_insert_wch(win, &wch); } else if (count == -1) { /* handle EILSEQ */ if (is8bits(ch)) { s = NCURSES_SP_NAME(unctrl) (NCURSES_SP_ARGx ChCharOf(ch)); - while (*s != '\0') { - code = _nc_insert_ch(win, ChAttrOf(ch) | UChar(*s)); - if (code != OK) - break; - ++s; + if (strlen(s) > 1) { + while (*s != '\0') { + code = _nc_insert_ch(sp, win, + ChAttrOf(ch) | UChar(*s)); + if (code != OK) + break; + ++s; + } + } else { + code = ERR; } } else { code = ERR; @@ -148,13 +153,13 @@ winsch(WINDOW *win, chtype c) NCURSES_SIZE_T ox; int code = ERR; - T((T_CALLED("winsch(%p, %s)"), win, _tracechtype(c))); + T((T_CALLED("winsch(%p, %s)"), (void *) win, _tracechtype(c))); if (win != 0) { oy = win->_cury; ox = win->_curx; - code = _nc_insert_ch(win, c); + code = _nc_insert_ch(_nc_screen_of(win), win, c); win->_curx = ox; win->_cury = oy;