1 /**************************************************************************** 2 * Copyright (c) 1998-2005,2008 Free Software Foundation, Inc. * 3 * * 4 * Permission is hereby granted, free of charge, to any person obtaining a * 5 * copy of this software and associated documentation files (the * 6 * "Software"), to deal in the Software without restriction, including * 7 * without limitation the rights to use, copy, modify, merge, publish, * 8 * distribute, distribute with modifications, sublicense, and/or sell * 9 * copies of the Software, and to permit persons to whom the Software is * 10 * furnished to do so, subject to the following conditions: * 11 * * 12 * The above copyright notice and this permission notice shall be included * 13 * in all copies or substantial portions of the Software. * 14 * * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * 16 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * 17 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * 18 * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * 19 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * 20 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * 21 * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * 22 * * 23 * Except as contained in this notice, the name(s) of the above copyright * 24 * holders shall not be used in advertising or otherwise to promote the * 25 * sale, use or other dealings in this Software without prior written * 26 * authorization. * 27 ****************************************************************************/ 28 29 /**************************************************************************** 30 * Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 * 31 * and: Eric S. Raymond <esr@snark.thyrsus.com> * 32 * and: Sven Verdoolaege * 33 * and: Thomas E. Dickey * 34 ****************************************************************************/ 35 36 /* 37 ** lib_insch.c 38 ** 39 ** The routine winsch(). 40 ** 41 */ 42 43 #include <curses.priv.h> 44 #include <ctype.h> 45 46 MODULE_ID("$Id: lib_insch.c,v 1.25 2008/02/03 00:14:37 tom Exp $") 47 48 /* 49 * Insert the given character, updating the current location to simplify 50 * inserting a string. 51 */ 52 NCURSES_EXPORT(int) 53 _nc_insert_ch(WINDOW *win, chtype ch) 54 { 55 int code = OK; 56 NCURSES_CH_T wch; 57 int count; 58 NCURSES_CONST char *s; 59 60 switch (ch) { 61 case '\t': 62 for (count = (TABSIZE - (win->_curx % TABSIZE)); count > 0; count--) { 63 if ((code = _nc_insert_ch(win, ' ')) != OK) 64 break; 65 } 66 break; 67 case '\n': 68 case '\r': 69 case '\b': 70 SetChar2(wch, ch); 71 _nc_waddch_nosync(win, wch); 72 break; 73 default: 74 if ( 75 #if USE_WIDEC_SUPPORT 76 WINDOW_EXT(win, addch_used) == 0 && 77 #endif 78 is8bits(ChCharOf(ch)) && 79 isprint(ChCharOf(ch))) { 80 if (win->_curx <= win->_maxx) { 81 struct ldat *line = &(win->_line[win->_cury]); 82 NCURSES_CH_T *end = &(line->text[win->_curx]); 83 NCURSES_CH_T *temp1 = &(line->text[win->_maxx]); 84 NCURSES_CH_T *temp2 = temp1 - 1; 85 86 SetChar2(wch, ch); 87 88 CHANGED_TO_EOL(line, win->_curx, win->_maxx); 89 while (temp1 > end) 90 *temp1-- = *temp2--; 91 92 *temp1 = _nc_render(win, wch); 93 win->_curx++; 94 } 95 } else if (is8bits(ChCharOf(ch)) && iscntrl(ChCharOf(ch))) { 96 s = unctrl(ChCharOf(ch)); 97 while (*s != '\0') { 98 code = _nc_insert_ch(win, ChAttrOf(ch) | UChar(*s)); 99 if (code != OK) 100 break; 101 ++s; 102 } 103 } 104 #if USE_WIDEC_SUPPORT 105 else { 106 /* 107 * Handle multibyte characters here 108 */ 109 SetChar2(wch, ch); 110 wch = _nc_render(win, wch); 111 count = _nc_build_wch(win, &wch); 112 if (count > 0) { 113 code = wins_wch(win, &wch); 114 } else if (count == -1) { 115 /* handle EILSEQ */ 116 if (is8bits(ch)) { 117 s = unctrl(ChCharOf(ch)); 118 while (*s != '\0') { 119 code = _nc_insert_ch(win, ChAttrOf(ch) | UChar(*s)); 120 if (code != OK) 121 break; 122 ++s; 123 } 124 } else { 125 code = ERR; 126 } 127 } 128 } 129 #endif 130 break; 131 } 132 return code; 133 } 134 135 NCURSES_EXPORT(int) 136 winsch(WINDOW *win, chtype c) 137 { 138 NCURSES_SIZE_T oy; 139 NCURSES_SIZE_T ox; 140 int code = ERR; 141 142 T((T_CALLED("winsch(%p, %s)"), win, _tracechtype(c))); 143 144 if (win != 0) { 145 oy = win->_cury; 146 ox = win->_curx; 147 148 code = _nc_insert_ch(win, c); 149 150 win->_curx = ox; 151 win->_cury = oy; 152 _nc_synchook(win); 153 } 154 returnCode(code); 155 } 156