X-Git-Url: https://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=ncurses%2Fwidechar%2Flib_ins_wch.c;h=6417eea2ed7362af816cea7b124e364e59ae5a74;hp=0821ee590bf810fa2997eccabcd141d015d41da8;hb=refs%2Ftags%2Fv5.4;hpb=46722468f47c2b77b3987729b4bcf2321cccfd01 diff --git a/ncurses/widechar/lib_ins_wch.c b/ncurses/widechar/lib_ins_wch.c index 0821ee59..6417eea2 100644 --- a/ncurses/widechar/lib_ins_wch.c +++ b/ncurses/widechar/lib_ins_wch.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 2002 Free Software Foundation, Inc. * + * Copyright (c) 2002,2003 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 * @@ -39,16 +39,16 @@ #include -MODULE_ID("$Id: lib_ins_wch.c,v 1.1 2002/03/10 22:25:06 tom Exp $") +MODULE_ID("$Id: lib_ins_wch.c,v 1.3 2003/03/29 21:52:29 tom Exp $") -NCURSES_EXPORT(int) -wins_wch(WINDOW *win, const cchar_t * wch) +/* + * Insert the given character, updating the current location to simplify + * inserting a string. + */ +static void +_nc_insert_wch(WINDOW *win, const cchar_t * wch) { - int code = ERR; - - T((T_CALLED("wins_wch(%p, %s)"), win, _tracecchar_t(wch))); - - if (win) { + 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]); @@ -59,6 +59,71 @@ wins_wch(WINDOW *win, const cchar_t * wch) *temp1-- = *temp2--; *temp1 = _nc_render(win, *wch); + + win->_curx++; + } +} + +NCURSES_EXPORT(int) +wins_wch(WINDOW *win, const cchar_t * wch) +{ + NCURSES_SIZE_T oy; + NCURSES_SIZE_T ox; + int code = ERR; + + T((T_CALLED("wins_wch(%p, %s)"), win, _tracecchar_t(wch))); + + if (win != 0) { + oy = win->_cury; + ox = win->_curx; + + _nc_insert_wch(win, wch); + + win->_curx = ox; + win->_cury = oy; + _nc_synchook(win); + code = OK; + } + returnCode(code); +} + +NCURSES_EXPORT(int) +wins_nwstr(WINDOW *win, const wchar_t * wstr, int n) +{ + int code = ERR; + NCURSES_SIZE_T oy; + NCURSES_SIZE_T ox; + const wchar_t *cp; + + T((T_CALLED("wins_nwstr(%p,%s,%d)"), win, _nc_viswbufn(wstr, n), n)); + + if (win != 0 + && wstr != 0) { + if (n < 1) + n = wcslen(wstr); + if (n > 0) { + oy = win->_cury; + ox = win->_curx; + for (cp = wstr; *cp && ((cp - wstr) < n); cp++) { + if (wcwidth(*cp) > 1) { + cchar_t tmp_cchar; + wchar_t tmp_wchar = *cp; + memset(&tmp_cchar, 0, sizeof(tmp_cchar)); + (void) setcchar(&tmp_cchar, + &tmp_wchar, + WA_NORMAL, + 0, + (void *) 0); + _nc_insert_wch(win, &tmp_cchar); + } else { + _nc_insert_ch(win, *cp); /* tabs, other ASCII stuff */ + } + } + + win->_curx = ox; + win->_cury = oy; + _nc_synchook(win); + } code = OK; } returnCode(code);