summaryrefslogtreecommitdiff
path: root/usr/src/lib/libcurses/screen/wgetstr.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/lib/libcurses/screen/wgetstr.c')
-rw-r--r--usr/src/lib/libcurses/screen/wgetstr.c209
1 files changed, 209 insertions, 0 deletions
diff --git a/usr/src/lib/libcurses/screen/wgetstr.c b/usr/src/lib/libcurses/screen/wgetstr.c
new file mode 100644
index 0000000000..76ec80b707
--- /dev/null
+++ b/usr/src/lib/libcurses/screen/wgetstr.c
@@ -0,0 +1,209 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 1997 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/* Copyright (c) 1988 AT&T */
+/* All Rights Reserved */
+
+/*
+ * University Copyright- Copyright (c) 1982, 1986, 1988
+ * The Regents of the University of California
+ * All Rights Reserved
+ *
+ * University Acknowledgment- Portions of this document are derived from
+ * software developed by the University of California, Berkeley, and its
+ * contributors.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+/*LINTLIBRARY*/
+
+#include <sys/types.h>
+#include "curses_inc.h"
+
+#define LENGTH 256
+
+/* This routine gets a string starting at (_cury, _curx) */
+
+int
+wgetstr(WINDOW *win, char *str)
+{
+ return ((wgetnstr(win, str, LENGTH) == ERR) ? ERR : OK);
+}
+
+int
+wgetnstr(WINDOW *win, char *str, int n)
+{
+ int cpos = 0, ch;
+ int nbyte = 0;
+ int tbyte = 0;
+ int byte[LENGTH];
+ int eucw, scrw;
+ int docont = 0;
+ char *cp = str;
+ int i = 0;
+ int total = 0;
+ char myerase, mykill;
+ char rownum[LENGTH], colnum[LENGTH], length[LENGTH];
+ int doecho = SP->fl_echoit;
+ int savecb = cur_term->_fl_rawmode;
+ bool savsync, savimmed, savleave;
+
+#ifdef DEBUG
+ if (outf)
+ fprintf(outf, "doecho %d, savecb %d\n", doecho, savecb);
+#endif /* DEBUG */
+
+ myerase = erasechar();
+ mykill = killchar();
+ if (!savecb)
+ (void) 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 (nbyte < n) {
+ if (doecho && !docont) {
+ rownum[cpos] = win->_cury;
+ colnum[cpos] = win->_curx;
+ }
+
+ ch = wgetch(win);
+ if (docont)
+ goto cont;
+
+ 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;
+ nbyte = 0;
+ cp = str;
+ } else {
+ cpos--;
+ cp -= byte[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)
+ (void) beep();
+ } else if ((KEY_MIN <= ch) && (ch <= KEY_MAX))
+ (void) beep();
+ else {
+cont:
+ /* LINTED */
+ *cp++ = (char)ch;
+ if (docont) {
+ tbyte++;
+ } else if (ISMBIT(ch)) {
+ docont = 1;
+ tbyte = 1;
+ scrw = mbscrw(ch);
+ eucw = mbeucw(ch);
+ }
+
+ if (docont && (tbyte >= eucw)) {
+ docont = 0;
+ tbyte = 0;
+ if (doecho) {
+ byte[cpos] = eucw;
+ /* LINTED */
+ length[cpos] = (char)scrw;
+ (void) wechochar(win,
+ (chtype) ch);
+ }
+ } else if (doecho) {
+ /* Add the length of the */
+ /* character to total. */
+ byte[cpos] = 1;
+ if (ch >= ' ')
+ length[cpos] = 1;
+ else
+ if (ch == '\t')
+ length[cpos] = TABSIZE-
+ (colnum[cpos] %
+ TABSIZE);
+ else
+ length[cpos] = 2;
+ total += length[cpos];
+ (void) wechochar(win, (chtype) ch);
+ }
+ if (!docont)
+ cpos++;
+ nbyte++;
+ }
+ }
+
+ *cp = '\0';
+
+ if (!savecb)
+ (void) 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);
+}