/* 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*/