#include #include #include #include #include "pline.h" #include "structs.h" #include "signals.h" #include "display.h" #include "disputil.h" PRSTAT prompt_and_read(const char *prompt, char *buf, int buflen, unsigned int flags, CHOK (*approval)(char)) { CHOK (*app)(char); int len; int c; CHOK ok; JMP j; static CHOK defapp(char ch) { switch (ch) { case '\33': return(CHOK_ABORT); break; case '\r': case '\n': return(CHOK_TERMNS); break; case '\177': case '\b': return(CHOK_DEL); break; case '\030': case '\025': return(CHOK_CLEAR); break; } return((*approval)(ch)); } if (setjmp(j.b)) { pop_sigint_throw(); move(LINES-1,0); clrtoeol(); return(PR_ABORTED); } app = (flags & PRF_NOSTD) ? approval : &defapp; len = 0; while (1) { mvaddstr(LINES-1,0,prompt); addbytes(buf,len); clrtoeol(); push_sigint_throw(&j); c = getch(); pop_sigint_throw(); ok = (*app)(c); switch (ok) { case CHOK_OK: if (len >= buflen-1) { beep(); break; } buf[len++] = c; break; case CHOK_BAD: beep(); break; case CHOK_TERM: if (len >= buflen-1) { beep(); break; } buf[len++] = c; /* fall through */ case CHOK_TERMNS: buf[len] = '\0'; move(LINES-1,0); clrtoeol(); return(PR_OK); break; case CHOK_ABORT: move(LINES-1,0); clrtoeol(); return(PR_ABORTED); break; case CHOK_DEL: if (len > 0) len --; break; case CHOK_CLEAR: len = 0; break; default: panic("bad return %d from approval function in prompt_and_read",(int)ok); break; } } } int choose_one(const char *prompt, ...) { int n; va_list ap; const char *s; int val; int i; int abortval; int maxl; int l; JMP j; va_start(ap,prompt); n = 0; maxl = 0; while (1) { s = va_arg(ap,const char *); val = va_arg(ap,int); if (! s) break; l = strlen(s); if (l > maxl) maxl = l; n ++; } abortval = val; va_end(ap); if (n < 1) return(abortval); if (n >= LINES) panic("choose_one: too many choices"); if (n >= 26) panic("choose_one: too many choices"); if (maxl > 70) panic("choose_one: choice too long"); if (setjmp(j.b)) { pop_sigint_throw(); move(LINES-1,0); clrtoeol(); return(abortval); } { const char *strings[n]; int vals[n]; char chars[n]; va_start(ap,prompt); for (i=0;i= n)) { beep(); continue; } clear(); showdisp(); val = vals[i]; break; } } return(val); } int confirm(const char *prompt) { int c; JMP j; if (setjmp(j.b)) { pop_sigint_throw(); move(LINES-1,0); clrtoeol(); return(0); } while (1) { mvprintw(LINES-1,0,"%s ",prompt); clrtoeol(); push_sigint_throw(&j); c = getch(); pop_sigint_throw(); move(LINES-1,0); clrtoeol(); switch (c) { case 'y': case 'Y': return(1); break; case 'n': case 'N': case '\33': return(0); break; } beep(); } }