]> granicus.if.org Git - nethack/commitdiff
*** empty log message ***
authorjwalz <jwalz>
Sat, 5 Jan 2002 21:06:02 +0000 (21:06 +0000)
committerjwalz <jwalz>
Sat, 5 Jan 2002 21:06:02 +0000 (21:06 +0000)
win/tty/getline.c [new file with mode: 0644]

diff --git a/win/tty/getline.c b/win/tty/getline.c
new file mode 100644 (file)
index 0000000..1d9a725
--- /dev/null
@@ -0,0 +1,230 @@
+/*     SCCS Id: @(#)getline.c  3.3     96/01/27        */
+/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
+/* NetHack may be freely redistributed.  See license for details. */
+
+#include "hack.h"
+
+#ifdef TTY_GRAPHICS
+
+#include "wintty.h"
+#include "func_tab.h"
+
+#ifdef OVL1
+char morc = 0; /* tell the outside world what char you chose */
+#endif /* OVL1 */
+STATIC_DCL boolean FDECL(ext_cmd_getlin_hook, (char *));
+
+typedef boolean FDECL((*getlin_hook_proc), (char *));
+
+STATIC_DCL void FDECL(hooked_tty_getlin, (const char*,char*,getlin_hook_proc));
+extern int NDECL(extcmd_via_menu);     /* cmd.c */
+
+extern char erase_char, kill_char;     /* from appropriate tty.c file */
+
+#ifdef OVL1
+
+/*
+ * Read a line closed with '\n' into the array char bufp[BUFSZ].
+ * (The '\n' is not stored. The string is closed with a '\0'.)
+ * Reading can be interrupted by an escape ('\033') - now the
+ * resulting string is "\033".
+ */
+void
+tty_getlin(query, bufp)
+const char *query;
+register char *bufp;
+{
+    hooked_tty_getlin(query, bufp, (getlin_hook_proc) 0);
+}
+
+STATIC_OVL void
+hooked_tty_getlin(query, bufp, hook)
+const char *query;
+register char *bufp;
+getlin_hook_proc hook;
+{
+       register char *obufp = bufp;
+       register int c;
+       struct WinDesc *cw = wins[WIN_MESSAGE];
+       boolean doprev = 0;
+
+       if(ttyDisplay->toplin == 1 && !(cw->flags & WIN_STOP)) more();
+       cw->flags &= ~WIN_STOP;
+       ttyDisplay->toplin = 3; /* special prompt state */
+       ttyDisplay->inread++;
+       pline("%s ", query);
+       *obufp = 0;
+       for(;;) {
+               (void) fflush(stdout);
+               Sprintf(toplines, "%s ", query);
+               Strcat(toplines, obufp);
+               if((c = Getchar()) == EOF) {
+                       *bufp = 0;
+                       break;
+               }
+               if(c == '\033') {
+                       *obufp = c;
+                       obufp[1] = 0;
+                       break;
+               }
+               if (ttyDisplay->intr) {
+                   ttyDisplay->intr--;
+                   *bufp = 0;
+               }
+               if(c == '\020') { /* ctrl-P */
+                   if(!doprev)
+                       (void) tty_doprev_message(); /* need two initially */
+                   (void) tty_doprev_message();
+                   doprev = 1;
+                   continue;
+               } else if(doprev) {
+                   tty_clear_nhwindow(WIN_MESSAGE);
+                   cw->maxcol = cw->maxrow;
+                   doprev = 0;
+                   addtopl(query);
+                   addtopl(" ");
+                   *bufp = 0;
+                   addtopl(obufp);
+               }
+               if(c == erase_char || c == '\b') {
+                       if(bufp != obufp) {
+                               bufp--;
+                               putsyms("\b \b");/* putsym converts \b */
+                       } else  tty_nhbell();
+#if defined(apollo)
+               } else if(c == '\n' || c == '\r') {
+#else
+               } else if(c == '\n') {
+#endif
+                       *bufp = 0;
+                       break;
+               } else if(' ' <= (unsigned char) c && c != '\177' &&
+                           (bufp-obufp < BUFSZ-1 && bufp-obufp < COLNO)) {
+                               /* avoid isprint() - some people don't have it
+                                  ' ' is not always a printing char */
+                       *bufp = c;
+                       bufp[1] = 0;
+                       putsyms(bufp);
+                       bufp++;
+                       if (hook && (*hook)(obufp)) {
+                           putsyms(bufp);
+                           bufp = eos(bufp);
+                       }
+               } else if(c == kill_char || c == '\177') { /* Robert Viduya */
+                               /* this test last - @ might be the kill_char */
+                       while(bufp != obufp) {
+                               bufp--;
+                               putsyms("\b \b");
+                       }
+               } else
+                       tty_nhbell();
+       }
+       ttyDisplay->toplin = 2;         /* nonempty, no --More-- required */
+       ttyDisplay->inread--;
+       clear_nhwindow(WIN_MESSAGE);    /* clean up after ourselves */
+}
+
+void
+xwaitforspace(s)
+register const char *s;        /* chars allowed besides return */
+{
+    register int c, x = ttyDisplay ? (int) ttyDisplay->dismiss_more : '\n';
+
+    morc = 0;
+
+    while((c = tty_nhgetch()) != '\n') {
+       if(iflags.cbreak) {
+           if ((s && index(s,c)) || c == x) {
+               morc = (char) c;
+               break;
+           }
+           tty_nhbell();
+       }
+    }
+
+}
+
+#endif /* OVL1 */
+#ifdef OVL2
+
+/*
+ * Implement extended command completion by using this hook into
+ * tty_getlin.  Check the characters already typed, if they uniquely
+ * identify an extended command, expand the string to the whole
+ * command.
+ *
+ * Return TRUE if we've extended the string at base.  Otherwise return FALSE.
+ * Assumptions:
+ *
+ *     + we don't change the characters that are already in base
+ *     + base has enough room to hold our string
+ */
+STATIC_OVL boolean
+ext_cmd_getlin_hook(base)
+       char *base;
+{
+       int oindex, com_index;
+
+       com_index = -1;
+       for (oindex = 0; extcmdlist[oindex].ef_txt != (char *)0; oindex++) {
+               if (!strncmpi(base, extcmdlist[oindex].ef_txt, strlen(base))) {
+                       if (com_index == -1)    /* no matches yet */
+                           com_index = oindex;
+                       else                    /* more than 1 match */
+                           return FALSE;
+               }
+       }
+       if (com_index >= 0) {
+               Strcpy(base, extcmdlist[com_index].ef_txt);
+               return TRUE;
+       }
+
+       return FALSE;   /* didn't match anything */
+}
+
+/*
+ * Read in an extended command, doing command line completion.  We
+ * stop when we have found enough characters to make a unique command.
+ */
+int
+tty_get_ext_cmd()
+{
+       int i;
+       char buf[BUFSZ];
+
+       if (iflags.extmenu) return extcmd_via_menu();
+       /* maybe a runtime option? */
+       /* hooked_tty_getlin("#", buf, flags.cmd_comp ? ext_cmd_getlin_hook : (getlin_hook_proc) 0); */
+#ifdef REDO
+       hooked_tty_getlin("#", buf, in_doagain ? (getlin_hook_proc)0
+               : ext_cmd_getlin_hook);
+#else
+       hooked_tty_getlin("#", buf, ext_cmd_getlin_hook);
+#endif
+       if (buf[0] == 0 || buf[0] == '\033') return -1;
+
+       for (i = 0; extcmdlist[i].ef_txt != (char *)0; i++)
+               if (!strcmpi(buf, extcmdlist[i].ef_txt)) break;
+
+#ifdef REDO
+       if (!in_doagain) {
+           int j;
+           for (j = 0; buf[j]; j++)
+               savech(buf[j]);
+           savech('\n');
+       }
+#endif
+
+       if (extcmdlist[i].ef_txt == (char *)0) {
+               pline("%s: unknown extended command.", buf);
+               i = -1;
+       }
+
+       return i;
+}
+
+#endif /* OVL2 */
+
+#endif /* TTY_GRAPHICS */
+
+/*getline.c*/