]> granicus.if.org Git - nethack/commitdiff
get_count() cleanup
authorPatR <rankin@nethack.org>
Wed, 6 Jan 2016 23:37:46 +0000 (15:37 -0800)
committerPatR <rankin@nethack.org>
Wed, 6 Jan 2016 23:37:46 +0000 (15:37 -0800)
Fix several warnings.  Accept ASCII RUBOUT (aka DELETE) in addition
to backspace.  [Should use erase_char (and add support for kill_char)
but that means pushing get_count() into the interface code.]  Guard
against user causing the count to wrap if someone ever adds a call to
get_count() which doesn't specifying a maximum value.

include/extern.h
src/cmd.c

index ea89ad2ba4084bdbd5abbcff96e2ff4bc3439f03..3e58ee565e1447dff3c5aa65eb78508945ff59d8 100644 (file)
@@ -1,4 +1,4 @@
-/* NetHack 3.6 extern.h        $NHDT-Date: 1451955077 2016/01/05 00:51:17 $  $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.530 $ */
+/* NetHack 3.6 extern.h        $NHDT-Date: 1452123455 2016/01/06 23:37:35 $  $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.535 $ */
 /* Copyright (c) Steve Creps, 1988.                              */
 /* NetHack may be freely redistributed.  See license for details. */
 
@@ -204,7 +204,7 @@ E int FDECL(isok, (int, int));
 E int FDECL(get_adjacent_loc,
             (const char *, const char *, XCHAR_P, XCHAR_P, coord *));
 E const char *FDECL(click_to_cmd, (int, int, int));
-E char FDECL(get_count, (char *, char, long, long *));
+E char FDECL(get_count, (char *, CHAR_P, long, long *));
 #ifdef HANGUPHANDLING
 E void FDECL(hangup, (int));
 E void NDECL(end_of_input);
@@ -1501,9 +1501,9 @@ E boolean FDECL(lined_up, (struct monst *));
 E struct obj *FDECL(m_carrying, (struct monst *, int));
 E void FDECL(m_useupall, (struct monst *, struct obj *));
 E void FDECL(m_useup, (struct monst *, struct obj *));
-E void FDECL(m_throw,
-             (struct monst *, int, int, int, int, int, struct obj *));
-E void FDECL(hit_bars, (struct obj **, int, int, int, int, boolean, boolean));
+E void FDECL(m_throw, (struct monst *, int, int, int, int, int, struct obj *));
+E void FDECL(hit_bars, (struct obj **, int, int, int, int,
+                        BOOLEAN_P, BOOLEAN_P));
 E boolean FDECL(hits_bars, (struct obj **, int, int, int, int, int, int));
 
 /* ### muse.c ### */
index 693666050e6a5e77050aca769c13c41256c09433..162234a76a79b8ced6e96bdbb9827f789ddd2323 100644 (file)
--- a/src/cmd.c
+++ b/src/cmd.c
@@ -1,4 +1,4 @@
-/* NetHack 3.6 cmd.c   $NHDT-Date: 1451082253 2015/12/25 22:24:13 $  $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.212 $ */
+/* NetHack 3.6 cmd.c   $NHDT-Date: 1452123457 2016/01/06 23:37:37 $  $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.216 $ */
 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
 /* NetHack may be freely redistributed.  See license for details. */
 
@@ -3865,53 +3865,56 @@ int x, y, mod;
 }
 
 char
-get_count(allowchars, inkey, max, count)
+get_count(allowchars, inkey, maxcount, count)
 char *allowchars;
 char inkey;
-long max;
+long maxcount;
 long *count;
 {
     char qbuf[QBUFSZ];
     int key;
-    long cnt = 0;
+    long cnt = 0L;
     boolean backspaced = FALSE;
-    char *ret;
+    /* this should be done in port code so that we have erase_char
+       and kill_char available; we can at least fake erase_char */
+#define STANDBY_erase_char '\177'
+
     for (;;) {
         if (inkey) {
             key = inkey;
             inkey = '\0';
         } else
             key = readchar();
+
         if (digit(key)) {
-            cnt = 10L * cnt + (long)(key - '0');
-        } else if (key == '\b') {
+            cnt = 10L * cnt + (long) (key - '0');
+            if (cnt < 0)
+                cnt = 0;
+            else if (maxcount > 0 && cnt > maxcount)
+                cnt = maxcount;
+        } else if (key == '\b' || key == STANDBY_erase_char) {
             cnt = cnt / 10;
             backspaced = TRUE;
         } else if (key == '\033') {
-            return '\033';
-        } else if (allowchars) {
-            if (ret = index(allowchars, key)) {
-                *count = cnt;
-                return *ret;
-            }
-        } else {
+            break;
+        } else if (!allowchars || index(allowchars, key)) {
             *count = cnt;
-            return key;
+            break;
         }
-        if (max && (cnt > max))
-            cnt = max;
+
         if (cnt > 9 || backspaced) {
             clear_nhwindow(WIN_MESSAGE);
-            if (backspaced && !cnt)
+            if (backspaced && !cnt) {
                 Sprintf(qbuf, "Count: ");
-            else {
-                Sprintf(qbuf, "Count: %d", cnt);
+            else {
+                Sprintf(qbuf, "Count: %ld", cnt);
                 backspaced = FALSE;
             }
             pline1(qbuf);
             mark_synch();
         }
     }
+    return key;
 }
 
 
@@ -3925,7 +3928,6 @@ parse()
 #endif
     register int foo;
     boolean prezero = FALSE;
-    boolean backspaced = FALSE;
 
     multi = 0;
     context.move = 1;
@@ -3936,6 +3938,7 @@ parse()
 #endif
     if (!Cmd.num_pad || (foo = readchar()) == 'n') {
         long tmpmulti = multi;
+
         foo = get_count(NULL, '\0', LARGEST_INT, &tmpmulti);
         last_multi = multi = tmpmulti;
     }