X-Git-Url: https://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=ncurses%2Fbase%2Flib_insch.c;h=894605ccfa98cfc14944fa85d3158dac5543a6ec;hp=419c9a8b145ec98cf59534798abcd15c73b0c0b1;hb=fae162795e065e5901068152e91f2962b6b247f3;hpb=a8987e73ec254703634802b4f7ee30d3a485524d diff --git a/ncurses/base/lib_insch.c b/ncurses/base/lib_insch.c index 419c9a8b..894605cc 100644 --- a/ncurses/base/lib_insch.c +++ b/ncurses/base/lib_insch.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2001,2002 Free Software Foundation, Inc. * + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2013,2016 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,22 +44,33 @@ #include #include -MODULE_ID("$Id: lib_insch.c,v 1.18 2002/11/23 21:41:05 tom Exp $") +MODULE_ID("$Id: lib_insch.c,v 1.37 2020/02/02 23:34:34 tom Exp $") /* * Insert the given character, updating the current location to simplify * inserting a string. */ -void -_nc_insert_ch(WINDOW *win, chtype ch) +NCURSES_EXPORT(int) +_nc_insert_ch(SCREEN *sp, WINDOW *win, chtype ch) { + int code = OK; + int ch8 = (int) ChCharOf(ch); NCURSES_CH_T wch; int count; + int tabsize = ( +#if USE_REENTRANT + sp->_TABSIZE +#else + TABSIZE +#endif + ); switch (ch) { case '\t': - for (count = (TABSIZE - (win->_curx % TABSIZE)); count > 0; count--) - _nc_insert_ch(win, ' '); + for (count = (tabsize - (win->_curx % tabsize)); count > 0; count--) { + if ((code = _nc_insert_ch(sp, win, ' ')) != OK) + break; + } break; case '\n': case '\r': @@ -67,73 +79,87 @@ _nc_insert_ch(WINDOW *win, chtype ch) _nc_waddch_nosync(win, wch); break; default: - if (is7bits(ch) && iscntrl(ch)) { - _nc_insert_ch(win, '^'); - _nc_insert_ch(win, '@' + (ch)); - } else if (win->_curx <= win->_maxx) { - struct ldat *line = &(win->_line[win->_cury]); - NCURSES_CH_T *end = &(line->text[win->_curx]); - NCURSES_CH_T *temp1 = &(line->text[win->_maxx]); - NCURSES_CH_T *temp2 = temp1 - 1; - + if ( +#if USE_WIDEC_SUPPORT + WINDOW_EXT(win, addch_used) == 0 && +#endif + (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]); + NCURSES_CH_T *temp1 = &(line->text[win->_maxx]); + NCURSES_CH_T *temp2 = temp1 - 1; + + SetChar2(wch, ch); + + CHANGED_TO_EOL(line, win->_curx, win->_maxx); + while (temp1 > end) + *temp1-- = *temp2--; + + *temp1 = _nc_render(win, wch); + win->_curx++; + } + } else if (iscntrl(ch8)) { + NCURSES_CONST char *s; + s = NCURSES_SP_NAME(unctrl) (NCURSES_SP_ARGx (chtype) ch8); + while (*s != '\0') { + code = _nc_insert_ch(sp, win, ChAttrOf(ch) | UChar(*s)); + if (code != OK) + break; + ++s; + } + } +#if USE_WIDEC_SUPPORT + else { + /* + * Handle multibyte characters here + */ SetChar2(wch, ch); - - CHANGED_TO_EOL(line, win->_curx, win->_maxx); - while (temp1 > end) - *temp1-- = *temp2--; - - *temp1 = _nc_render(win, wch); - - win->_curx++; + wch = _nc_render(win, wch); + count = _nc_build_wch(win, &wch); + if (count > 0) { + code = _nc_insert_wch(win, &wch); + } else if (count == -1) { + NCURSES_CONST char *s; + /* handle EILSEQ */ + s = NCURSES_SP_NAME(unctrl) (NCURSES_SP_ARGx (chtype) ch8); + 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; + } + } } +#endif break; } + return code; } NCURSES_EXPORT(int) winsch(WINDOW *win, chtype c) { - NCURSES_SIZE_T oy; - 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; - - _nc_insert_ch(win, c); - - win->_curx = ox; - win->_cury = oy; - _nc_synchook(win); - code = OK; - } - returnCode(code); -} + NCURSES_SIZE_T oy = win->_cury; + NCURSES_SIZE_T ox = win->_curx; -NCURSES_EXPORT(int) -winsnstr(WINDOW *win, const char *s, int n) -{ - int code = ERR; - NCURSES_SIZE_T oy; - NCURSES_SIZE_T ox; - const unsigned char *str = (const unsigned char *) s; - const unsigned char *cp; + code = _nc_insert_ch(_nc_screen_of(win), win, c); - T((T_CALLED("winsnstr(%p,%s,%d)"), win, _nc_visbufn(s, n), n)); - - if (win != 0 && str != 0) { - oy = win->_cury; - ox = win->_curx; - for (cp = str; *cp && (n <= 0 || (cp - str) < n); cp++) { - _nc_insert_ch(win, (chtype) UChar(*cp)); - } win->_curx = ox; win->_cury = oy; _nc_synchook(win); - code = OK; } returnCode(code); }