Own version of getnstr() that always recognizes ^H and ^?; now always noecho(); mygetnstr() echoes if necessary.

git-svn-id: svn://katsu.triplehelix.org/dgamelaunch/trunk@128 db0b04b0-f4d1-0310-9a6d-de3e77497b0e
This commit is contained in:
Jilles Tjoelker 2004-01-19 11:58:31 +00:00
parent e61edfe9ee
commit 2e89c7c3be
4 changed files with 103 additions and 15 deletions

View File

@ -13,7 +13,7 @@ LDFLAGS =
CFLAGS = -g3 $(optimize) -Wall -Wno-unused $(DEFS)
INSTALL = install -c
DEFS = -DVERSION=\"$(VERSION)\"
SRCS = virus.c ttyrec.c dgamelaunch.c io.c ttyplay.c stripgfx.c strlcpy.c strlcat.c y.tab.c lex.yy.c
SRCS = virus.c ttyrec.c dgamelaunch.c io.c ttyplay.c mygetnstr.c stripgfx.c strlcpy.c strlcat.c y.tab.c lex.yy.c
OBJS = $(SRCS:.c=.o)
LIBS = -lncurses -lcrypt -lutil -ll

View File

@ -586,9 +586,7 @@ changepw ()
refresh ();
noecho ();
getnstr (buf, 20);
echo (); /* Putting echo back on just for safety and because it can't hurt. */
mygetnstr (buf, 20, 0);
if (buf && *buf == '\0')
return 0;
@ -599,9 +597,7 @@ changepw ()
mvaddstr (12, 1, "And again:");
mvaddstr (13, 1, "=> ");
noecho ();
getnstr (repeatbuf, 20);
echo (); /* Here is the important echo(); if the former is removed. */
mygetnstr (repeatbuf, 20, 0);
if (!strcmp (buf, repeatbuf))
error = 0;
@ -646,7 +642,7 @@ domailuser (char *username)
"Enter your message here. It is to be one line only and 80 characters or less.");
mvaddstr (7, 1, "=> ");
getnstr (message, 80);
mygetnstr (message, 80, 1);
for (i = 0; i < strlen (message); i++)
{
@ -775,7 +771,7 @@ initncurses ()
{
initscr ();
cbreak ();
echo ();
noecho ();
nonl ();
intrflush (stdscr, FALSE);
keypad (stdscr, TRUE);
@ -823,7 +819,7 @@ loginprompt ()
refresh ();
getnstr (user_buf, 20);
mygetnstr (user_buf, 20, 1);
if (user_buf && *user_buf == '\0')
return;
@ -846,9 +842,7 @@ loginprompt ()
refresh ();
noecho ();
getnstr (pw_buf, 20);
echo ();
mygetnstr (pw_buf, 20, 0);
if (passwordgood (pw_buf))
{
@ -893,7 +887,7 @@ newuser ()
refresh ();
getnstr (buf, 20);
mygetnstr (buf, 20, 1);
if (userexist (buf) == -1)
error = 0;
else
@ -944,7 +938,7 @@ newuser ()
mvaddstr (10, 1, "=> ");
refresh ();
getnstr (buf, 80);
mygetnstr (buf, 80, 1);
if (strchr (buf, ':') != NULL)
graceful_exit (113);

View File

@ -83,4 +83,7 @@ extern void graceful_exit (int status);
extern size_t strlcpy (char *dst, const char *src, size_t siz);
extern size_t strlcat (char *dst, const char *src, size_t siz);
/* mygetnstr.c */
extern int mygetnstr(char *buf, int maxlen, int doecho);
#endif

91
mygetnstr.c Normal file
View File

@ -0,0 +1,91 @@
/*
* Copyright (c) 2004, Jilles Tjoelker
* All rights reserved.
*
* Redistribution and use in source and binary forms, with
* or without modification, are permitted provided that the
* following conditions are met:
*
* 1. Redistributions of source code must retain the above
* copyright notice, this list of conditions and the
* following disclaimer.
* 2. Redistributions in binary form must reproduce the
* above copyright notice, this list of conditions and
* the following disclaimer in the documentation and/or
* other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
* OF SUCH DAMAGE.
*/
#include <ncurses.h>
/* Assumes noecho(). */
/* As with getnstr(), maxlen does not include the '\0' character. */
int
mygetnstr(char *buf, int maxlen, int doecho)
{
int c, i;
i = 0;
for (;;)
{
c = getch();
if (c == 8 || c == 127 || c == KEY_BACKSPACE || c == KEY_DC ||
c == KEY_LEFT)
{
if (i > 0)
{
i--;
if (doecho)
addstr("\010 \010");
}
else
beep();
}
else if (c == 21 || c == 24 || c == KEY_DL)
{
while (i > 0)
{
i--;
if (doecho)
addstr("\010 \010");
}
}
else if ((c >= ' ' && c <= '~') || (c >= 0xA0 && c <= 0xFF))
{
if (i < maxlen)
{
buf[i] = c;
i++;
if (doecho)
addch(c);
}
else
beep();
}
else if (c == 10 || c == 13 || c == KEY_ENTER)
break;
else
beep();
}
buf[i] = 0;
return OK;
}
/* vim:ts=8:cin:sw=4
*/