150276Speter/**************************************************************************** 2176187Srafan * Copyright (c) 1998-2005,2008 Free Software Foundation, Inc. * 350276Speter * * 450276Speter * Permission is hereby granted, free of charge, to any person obtaining a * 550276Speter * copy of this software and associated documentation files (the * 650276Speter * "Software"), to deal in the Software without restriction, including * 750276Speter * without limitation the rights to use, copy, modify, merge, publish, * 850276Speter * distribute, distribute with modifications, sublicense, and/or sell * 950276Speter * copies of the Software, and to permit persons to whom the Software is * 1050276Speter * furnished to do so, subject to the following conditions: * 1150276Speter * * 1250276Speter * The above copyright notice and this permission notice shall be included * 1350276Speter * in all copies or substantial portions of the Software. * 1450276Speter * * 1550276Speter * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * 1650276Speter * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * 1750276Speter * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * 1850276Speter * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * 1950276Speter * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * 2050276Speter * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * 2150276Speter * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * 2250276Speter * * 2350276Speter * Except as contained in this notice, the name(s) of the above copyright * 2450276Speter * holders shall not be used in advertising or otherwise to promote the * 2550276Speter * sale, use or other dealings in this Software without prior written * 2650276Speter * authorization. * 2750276Speter ****************************************************************************/ 2850276Speter 2950276Speter/**************************************************************************** 3050276Speter * Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 * 3150276Speter * and: Eric S. Raymond <esr@snark.thyrsus.com> * 32166124Srafan * and: Sven Verdoolaege * 33166124Srafan * and: Thomas E. Dickey * 3450276Speter ****************************************************************************/ 3550276Speter 3650276Speter/* 3750276Speter** lib_insch.c 3850276Speter** 3950276Speter** The routine winsch(). 4050276Speter** 4150276Speter*/ 4250276Speter 4350276Speter#include <curses.priv.h> 44166124Srafan#include <ctype.h> 4550276Speter 46176187SrafanMODULE_ID("$Id: lib_insch.c,v 1.25 2008/02/03 00:14:37 tom Exp $") 4750276Speter 48166124Srafan/* 49166124Srafan * Insert the given character, updating the current location to simplify 50166124Srafan * inserting a string. 51166124Srafan */ 5276726SpeterNCURSES_EXPORT(int) 53166124Srafan_nc_insert_ch(WINDOW *win, chtype ch) 54166124Srafan{ 55166124Srafan int code = OK; 56166124Srafan NCURSES_CH_T wch; 57166124Srafan int count; 58166124Srafan NCURSES_CONST char *s; 59166124Srafan 60166124Srafan switch (ch) { 61166124Srafan case '\t': 62166124Srafan for (count = (TABSIZE - (win->_curx % TABSIZE)); count > 0; count--) { 63166124Srafan if ((code = _nc_insert_ch(win, ' ')) != OK) 64166124Srafan break; 65166124Srafan } 66166124Srafan break; 67166124Srafan case '\n': 68166124Srafan case '\r': 69166124Srafan case '\b': 70166124Srafan SetChar2(wch, ch); 71166124Srafan _nc_waddch_nosync(win, wch); 72166124Srafan break; 73166124Srafan default: 74166124Srafan if ( 75166124Srafan#if USE_WIDEC_SUPPORT 76166124Srafan WINDOW_EXT(win, addch_used) == 0 && 77166124Srafan#endif 78166124Srafan is8bits(ChCharOf(ch)) && 79166124Srafan isprint(ChCharOf(ch))) { 80166124Srafan if (win->_curx <= win->_maxx) { 81166124Srafan struct ldat *line = &(win->_line[win->_cury]); 82166124Srafan NCURSES_CH_T *end = &(line->text[win->_curx]); 83166124Srafan NCURSES_CH_T *temp1 = &(line->text[win->_maxx]); 84166124Srafan NCURSES_CH_T *temp2 = temp1 - 1; 85166124Srafan 86166124Srafan SetChar2(wch, ch); 87166124Srafan 88166124Srafan CHANGED_TO_EOL(line, win->_curx, win->_maxx); 89166124Srafan while (temp1 > end) 90166124Srafan *temp1-- = *temp2--; 91166124Srafan 92166124Srafan *temp1 = _nc_render(win, wch); 93166124Srafan win->_curx++; 94166124Srafan } 95166124Srafan } else if (is8bits(ChCharOf(ch)) && iscntrl(ChCharOf(ch))) { 96166124Srafan s = unctrl(ChCharOf(ch)); 97166124Srafan while (*s != '\0') { 98176187Srafan code = _nc_insert_ch(win, ChAttrOf(ch) | UChar(*s)); 99176187Srafan if (code != OK) 100166124Srafan break; 101166124Srafan ++s; 102166124Srafan } 103166124Srafan } 104166124Srafan#if USE_WIDEC_SUPPORT 105166124Srafan else { 106166124Srafan /* 107166124Srafan * Handle multibyte characters here 108166124Srafan */ 109166124Srafan SetChar2(wch, ch); 110166124Srafan wch = _nc_render(win, wch); 111176187Srafan count = _nc_build_wch(win, &wch); 112176187Srafan if (count > 0) { 113166124Srafan code = wins_wch(win, &wch); 114176187Srafan } else if (count == -1) { 115176187Srafan /* handle EILSEQ */ 116176187Srafan if (is8bits(ch)) { 117176187Srafan s = unctrl(ChCharOf(ch)); 118176187Srafan while (*s != '\0') { 119176187Srafan code = _nc_insert_ch(win, ChAttrOf(ch) | UChar(*s)); 120176187Srafan if (code != OK) 121176187Srafan break; 122176187Srafan ++s; 123176187Srafan } 124176187Srafan } else { 125176187Srafan code = ERR; 126176187Srafan } 127176187Srafan } 128166124Srafan } 129166124Srafan#endif 130166124Srafan break; 131166124Srafan } 132166124Srafan return code; 133166124Srafan} 134166124Srafan 135166124SrafanNCURSES_EXPORT(int) 13676726Speterwinsch(WINDOW *win, chtype c) 13750276Speter{ 138166124Srafan NCURSES_SIZE_T oy; 139166124Srafan NCURSES_SIZE_T ox; 14076726Speter int code = ERR; 14150276Speter 14276726Speter T((T_CALLED("winsch(%p, %s)"), win, _tracechtype(c))); 14350276Speter 144166124Srafan if (win != 0) { 145166124Srafan oy = win->_cury; 146166124Srafan ox = win->_curx; 14750276Speter 148166124Srafan code = _nc_insert_ch(win, c); 14950276Speter 150166124Srafan win->_curx = ox; 151166124Srafan win->_cury = oy; 152166124Srafan _nc_synchook(win); 15376726Speter } 15476726Speter returnCode(code); 15550276Speter} 156