From 2e89c7c3beed198fc1c375dfcde99652798086a6 Mon Sep 17 00:00:00 2001 From: Jilles Tjoelker Date: Mon, 19 Jan 2004 11:58:31 +0000 Subject: [PATCH] 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 --- Makefile | 2 +- dgamelaunch.c | 22 +++++-------- dgamelaunch.h | 3 ++ mygetnstr.c | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 103 insertions(+), 15 deletions(-) create mode 100644 mygetnstr.c diff --git a/Makefile b/Makefile index 6ebdeef..7299eda 100644 --- a/Makefile +++ b/Makefile @@ -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 diff --git a/dgamelaunch.c b/dgamelaunch.c index 36ce7c4..f65f90e 100644 --- a/dgamelaunch.c +++ b/dgamelaunch.c @@ -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); diff --git a/dgamelaunch.h b/dgamelaunch.h index 73eb676..672dfa3 100644 --- a/dgamelaunch.h +++ b/dgamelaunch.h @@ -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 diff --git a/mygetnstr.c b/mygetnstr.c new file mode 100644 index 0000000..3450f74 --- /dev/null +++ b/mygetnstr.c @@ -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 + +/* 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 + */ -- 2.47.3