lib_insch.c revision 166124
1/**************************************************************************** 2 * Copyright (c) 1998-2004,2005 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 46MODULE_ID("$Id: lib_insch.c,v 1.24 2005/02/26 19:27:28 tom Exp $") 47 48/* 49 * Insert the given character, updating the current location to simplify 50 * inserting a string. 51 */ 52NCURSES_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 if ((code = _nc_insert_ch(win, ChAttrOf(ch) | UChar(*s))) != OK) 99 break; 100 ++s; 101 } 102 } 103#if USE_WIDEC_SUPPORT 104 else { 105 /* 106 * Handle multibyte characters here 107 */ 108 SetChar2(wch, ch); 109 wch = _nc_render(win, wch); 110 if (_nc_build_wch(win, &wch) >= 0) 111 code = wins_wch(win, &wch); 112 } 113#endif 114 break; 115 } 116 return code; 117} 118 119NCURSES_EXPORT(int) 120winsch(WINDOW *win, chtype c) 121{ 122 NCURSES_SIZE_T oy; 123 NCURSES_SIZE_T ox; 124 int code = ERR; 125 126 T((T_CALLED("winsch(%p, %s)"), win, _tracechtype(c))); 127 128 if (win != 0) { 129 oy = win->_cury; 130 ox = win->_curx; 131 132 code = _nc_insert_ch(win, c); 133 134 win->_curx = ox; 135 win->_cury = oy; 136 _nc_synchook(win); 137 } 138 returnCode(code); 139} 140