#include #include #include #include #include #include "ul.h" static int ofd; static FILE *of; static char *line; static int len; static int cursor; static unsigned int initflags; static const char *disp[256]; static int displen[256]; static int wantbeep; static struct sigvec contsv; static struct sigvec oldcont; static void ul_cont(int sig __attribute__((__unused__))) { char *s; int olen; int curs; if ( (oldcont.sv_handler != SIG_IGN) && (oldcont.sv_handler != SIG_DFL) ) { sigvec(SIGCONT,&oldcont,0); kill(getpid(),SIGCONT); sigpause(sigblock(0)&~sigmask(SIGCONT)); sigvec(SIGCONT,&contsv,&oldcont); } write(ofd,"\r\n",2); s = line; line = malloc(1); olen = len; curs = cursor; len = 0; cursor = 0; ul_update(s,olen,curs); } void ul_init(int fd, unsigned int flags) { int i; static char db[400]; int j; ofd = dup(fd); of = fdopen(ofd,"w"); initflags = flags; line = 0; len = 0; cursor = 0; wantbeep = 0; j = 0; #define SET() do { disp[i] = &db[j]; } while (0) #define CHAR(c) (db[j++]=(c)) #define TERM() (displen[i] = &db[j] - disp[i]) for (i=0;i<32;i++) { SET(); CHAR('^'); CHAR(i^64); TERM(); } for (;i<127;i++) { SET(); CHAR(i); TERM(); } SET(); CHAR('^'); CHAR('?'); TERM(); i ++; for (;i<0xa0;i++) { SET(); CHAR('\\'); CHAR('0'+(i>>6)); CHAR('0'+((i>>3)&7)); CHAR('0'+(i&7)); TERM(); } for (;i<256;i++) { SET(); CHAR(i); TERM(); } if (j > sizeof(db)) abort(); #undef SET #undef CHAR #undef TERM if (! (initflags & UL_NO_CONT)) { contsv.sv_handler = ul_cont; contsv.sv_mask = 0; contsv.sv_flags = 0; sigvec(SIGCONT,&contsv,&oldcont); } } extern void ul_new(void) { write(ofd,"\r\n",2); len = 0; cursor = 0; } extern void ul_beep(void) { wantbeep = 1; } static void cursorto(int x) { for (;cursor>x;cursor--) putc('\b',of); for (;cursor