X-Git-Url: http://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=ncurses%2Fbase%2Flib_insch.c;h=32eaed7394430e80f211fc6804ac6bfe5a838647;hp=9166ea5240e7f3adf62c9631bca98ffd50847dfa;hb=ef2d99350e0d3e4606171b5b1466ab92ec440205;hpb=b779f5fb4516b3e6d1bc8880ea68923efb761e1d diff --git a/ncurses/base/lib_insch.c b/ncurses/base/lib_insch.c index 9166ea52..32eaed73 100644 --- a/ncurses/base/lib_insch.c +++ b/ncurses/base/lib_insch.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 1998-2005,2008 Free Software Foundation, Inc. * + * Copyright (c) 1998-2012,2013 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * @@ -43,24 +43,32 @@ #include #include -MODULE_ID("$Id: lib_insch.c,v 1.25 2008/02/03 00:14:37 tom Exp $") +MODULE_ID("$Id: lib_insch.c,v 1.35 2013/05/18 21:58:56 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; + int ch8 = (int) ChCharOf(ch); NCURSES_CH_T wch; int count; NCURSES_CONST char *s; + int tabsize = ( +#if USE_REENTRANT + sp->_TABSIZE +#else + TABSIZE +#endif + ); switch (ch) { case '\t': - for (count = (TABSIZE - (win->_curx % TABSIZE)); count > 0; count--) { - if ((code = _nc_insert_ch(win, ' ')) != OK) + for (count = (tabsize - (win->_curx % tabsize)); count > 0; count--) { + if ((code = _nc_insert_ch(sp, win, ' ')) != OK) break; } break; @@ -75,8 +83,9 @@ _nc_insert_ch(WINDOW *win, chtype ch) #if USE_WIDEC_SUPPORT WINDOW_EXT(win, addch_used) == 0 && #endif - is8bits(ChCharOf(ch)) && - isprint(ChCharOf(ch))) { + (isprint(ch8) || + (ChAttrOf(ch) & A_ALTCHARSET) || + (sp != 0 && sp->_legacy_coding && !iscntrl(ch8)))) { if (win->_curx <= win->_maxx) { struct ldat *line = &(win->_line[win->_cury]); NCURSES_CH_T *end = &(line->text[win->_curx]); @@ -92,10 +101,10 @@ _nc_insert_ch(WINDOW *win, chtype ch) *temp1 = _nc_render(win, wch); win->_curx++; } - } else if (is8bits(ChCharOf(ch)) && iscntrl(ChCharOf(ch))) { - s = unctrl(ChCharOf(ch)); + } else if (iscntrl(ch8)) { + s = NCURSES_SP_NAME(unctrl) (NCURSES_SP_ARGx (chtype) ch8); 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; @@ -110,13 +119,14 @@ _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 = unctrl(ChCharOf(ch)); + s = NCURSES_SP_NAME(unctrl) (NCURSES_SP_ARGx (chtype) ch8); + if (strlen(s) > 1) { 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; @@ -139,13 +149,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;