/* * 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 getlin(char *bufp) { char *obufp = bufp; int c; flags.toplin = 2; /* nonempty, no --More-- required */ for(;;) { (void) fflush(stdout); if((c = getchar()) == EOF) { *bufp = 0; return; } if(c == '\033') { *obufp = c; obufp[1] = 0; return; } if(c == erase_char || c == '\b') { if(bufp != obufp) { bufp--; putstr("\b \b"); /* putsym converts \b */ } else hackbell(); } else if(c == '\n') { *bufp = 0; return; } else if(' ' <= c && c < '\177') { /* avoid isprint() - some people don't have it ' ' is not always a printing char */ *bufp = c; bufp[1] = 0; putstr(bufp); if(bufp-obufp < BUFSZ-1 && bufp-obufp < COLNO) bufp++; } else if(c == kill_char || c == '\177') { /* Robert Viduya */ /* this test last - @ might be the kill_char */ while(bufp != obufp) { bufp--; putstr("\b \b"); } } else hackbell(); } }
int dohelp() { char c; pline ("Long or short help? "); while (((c = readchar ()) != 'l') && (c != 's') && !strchr(quitchars,c)) hackbell (); if (!strchr(quitchars, c)) (void) page_file((c == 'l') ? HELP : SHELP, FALSE); return(0); }
/* s: chars allowed besides space or return */ void xwaitforspace(char *s) { int c; morc = 0; while((c = readchar()) != '\n') { if(flags.cbreak) { if(c == ' ') break; if(s && strchr(s,c)) { morc = c; break; } hackbell(); } } }
void rhack(char *cmd) { struct func_tab *tlist = cmdlist; boolean firsttime = FALSE; int res; if(!cmd) { firsttime = TRUE; flags.nopick = 0; cmd = parse(); } if(!*cmd || (*cmd & 0377) == 0377 || (flags.no_rest_on_space && *cmd == ' ')){ hackbell(); flags.move = 0; return; /* probably we just had an interrupt */ } if(movecmd(*cmd)) { walk: if(multi) flags.mv = 1; domove(); return; } if(movecmd(tolower((unsigned char)*cmd))) { flags.run = 1; rush: if(firsttime){ if(!multi) multi = COLNO; u.last_str_turn = 0; } flags.mv = 1; #ifdef QUEST if(flags.run >= 4) finddir(); if(firsttime){ u.ux0 = u.ux + u.dx; u.uy0 = u.uy + u.dy; } #endif /* QUEST */ domove(); return; } if((*cmd == 'f' && movecmd(cmd[1])) || movecmd(unctrl(*cmd))) { flags.run = 2; goto rush; } if(*cmd == 'F' && movecmd(tolower((unsigned char)cmd[1]))) { flags.run = 3; goto rush; } if(*cmd == 'm' && movecmd(cmd[1])) { flags.run = 0; flags.nopick = 1; goto walk; } if(*cmd == 'M' && movecmd(tolower((unsigned char)cmd[1]))) { flags.run = 1; flags.nopick = 1; goto rush; } #ifdef QUEST if(*cmd == cmd[1] && (*cmd == 'f' || *cmd == 'F')) { flags.run = 4; if(*cmd == 'F') flags.run += 2; if(cmd[2] == '-') flags.run += 1; goto rush; } #endif /* QUEST */ while(tlist->f_char) { if(*cmd == tlist->f_char){ res = (*(tlist->f_funct))(); if(!res) { flags.move = 0; multi = 0; } return; } tlist++; } { char expcmd[10]; char *cp = expcmd; while(*cmd && cp-expcmd < sizeof(expcmd)-2) { if(*cmd >= 040 && *cmd < 0177) *cp++ = *cmd++; else { *cp++ = '^'; *cp++ = *cmd++ ^ 0100; } } *cp++ = 0; pline("Unknown command '%s'.", expcmd); } multi = flags.move = 0; }