Files
Arquivotheca.Solaris-2.5/lib/libcurses/screen/wgetwstr.c
seta75D 7c4988eac0 Init
2021-10-11 19:38:01 -03:00

155 lines
3.1 KiB
C
Executable File

/* Copyright (c) 1988 AT&T */
/* All Rights Reserved */
/* THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T */
/* The copyright notice above does not evidence any */
/* actual or intended publication of such source code. */
#ident "@(#)wgetwstr.c 1.1 93/05/10 SMI"
#include "curses_inc.h"
#define LENGTH 256
/* This routine gets a string starting at (_cury, _curx) */
wgetwstr(win, str)
WINDOW *win;
wchar_t *str;
{
return ((wgetnwstr(win, str, LENGTH) == ERR) ? ERR : OK);
}
wgetnwstr(win, str, n)
register WINDOW *win;
wchar_t *str;
register int n;
{
register int cpos = 0, ch;
register wchar_t *cp = str;
int i, total = 0;
char myerase, mykill;
char rownum[LENGTH], colnum[LENGTH], length[LENGTH];
int doecho = SP->fl_echoit;
int savecb = cur_term->_fl_rawmode;
int savsync, savimmed, savleave;
int eucw, scrw;
#ifdef DEBUG
if (outf)
fprintf(outf, "doecho %d, savecb %d\n", doecho, savecb);
#endif /* DEBUG */
myerase = erasechar();
mykill = killchar();
if (!savecb)
cbreak();
if (doecho)
{
SP->fl_echoit = FALSE;
savsync = win->_sync;
savimmed = win->_immed;
savleave = win->_leave;
win->_immed = win->_sync = win->_leave = FALSE;
(void) wrefresh(win);
if (n > LENGTH)
n = LENGTH;
}
n--;
while (cpos < n)
{
if (doecho)
{
rownum[cpos] = win->_cury;
colnum[cpos] = win->_curx;
}
ch = wgetwch(win);
if ((ch == ERR) || (ch == '\n') || (ch == '\r') || (ch == KEY_ENTER))
break;
if ((ch == myerase) || (ch == KEY_LEFT) || (ch == KEY_BACKSPACE) ||
(ch == mykill))
{
if (cpos > 0)
{
if (ch == mykill)
{
i = total;
total = cpos = 0;
cp = str;
}
else
{
cp--;
cpos--;
if (doecho)
total -= (i = length[cpos]);
}
if (doecho)
{
(void) wmove(win, rownum[cpos], colnum[cpos]);
/* Add the correct amount of blanks. */
for ( ; i > 0; i--)
(void) waddch (win, ' ');
/* Move back after the blanks are put in. */
(void) wmove(win, rownum[cpos], colnum[cpos]);
/* Update total. */
(void) wrefresh(win);
}
}
else
if (doecho)
beep();
}
else
if ((KEY_MIN <= ch) && (ch <= KEY_MAX))
beep();
else
{
*cp++ = ch;
if (doecho)
{
/* Add the length of the */
/* character to total. */
if ((ch & EUCMASK) != P00)
length[cpos] = wcscrw(ch);
else if (ch >= ' ')
length[cpos] = 1;
else
if (ch == '\t')
length[cpos] = TABSIZE - (colnum[cpos] % TABSIZE);
else
length[cpos] = 2;
total += length[cpos];
(void) wechowchar(win, (chtype) ch);
}
cpos++;
}
}
*cp = '\0';
if (!savecb)
nocbreak();
/*
* The following code is equivalent to waddch(win, '\n')
* except that it does not do a wclrtoeol.
*/
if (doecho)
{
SP->fl_echoit = TRUE;
win->_curx = 0;
if (win->_cury + 1 > win->_bmarg)
(void) wscrl(win, 1);
else
win->_cury++;
win->_sync = savsync;
win->_immed = savimmed;
win->_leave = savleave;
(void) wrefresh(win);
}
return (ch);
}