home *** CD-ROM | disk | FTP | other *** search
- #include <stdio.h>
- #include <signal.h>
- #include <curses.h>
-
- #define LINELEN 1000
- #define PRLINELEN 2000
-
- outc(ch)
- char ch;
- {
- putc(ch,stderr);
- }
-
- sigpipe()
- {
- close(0); /* guaranteeing that the next character we read will be an EOF */
- }
-
- main(argc,argv)
- int argc;
- char *argv[];
- {
- char bp[1024];
- char ts[256];
- char fs[256];
- char ce[256];
- char *cptr;
- char errbuf[BUFSIZ];
- char line[LINELEN];
- char linepr[PRLINELEN];
- int ch;
- char *chpr;
- int x;
- int xpr;
- int flagcharmode = 0;
- int co;
-
- signal(SIGPIPE,sigpipe);
- setbuf(stderr,errbuf);
-
- tgetent(bp,getenv("TERM"));
- cptr = ts;
- if (!tgetstr("ts",&cptr))
- ; /*XXX*/
- cptr = fs;
- if (!tgetstr("fs",&cptr))
- ; /*XXX*/
- cptr = ce;
- if (!tgetstr("ce",&cptr))
- ; /*XXX*/
- co = tgetnum("co");
- #define TS tputs(ts,1,outc)
- #define CE tputs(ce,1,outc)
- #define FS tputs(fs,1,outc)
-
- for (;;)
- if (flagcharmode)
- {
- if ((ch = getchar()) == EOF)
- break;
- if (ch == 0001)
- flagcharmode = 0;
- else
- {
- putchar(ch);
- fflush(stdout);
- }
- }
- else
- {
- TS; CE; putc('_',stderr); FS; fflush(stderr);
- x = xpr = 0;
- line[x] = linepr[xpr] = '\0';
- while ((ch = getchar()) != '\n')
- {
- if (ch == 4)
- break;
- if (ch == EOF)
- break;
- if (ch == '\r')
- {
- ch = '\n';
- break;
- }
- if (ch == 1)
- {
- flagcharmode = 1;
- break;
- }
- switch(ch)
- {
- case 21: x = xpr = 0;
- line[x] = linepr[xpr] = '\0';
- break;
- case 23: while (x && (line[x - 1] == ' '))
- {
- x--;
- xpr--;
- }
- while (x && (line[x - 1] != ' '))
- {
- x--;
- chpr = unctrl(line[x]);
- while (*(chpr++))
- xpr--;
- }
- linepr[xpr] = '\0';
- line[x] = '\0';
- break;
- case '\b':
- case 127: if (!x)
- break;
- x--;
- chpr = unctrl(line[x]);
- while (*(chpr++))
- xpr--;
- linepr[xpr] = '\0';
- line[x] = '\0';
- break;
- case 22: ch = getchar();
- default: if ((x == LINELEN - 1) || (xpr == PRLINELEN - 1))
- {
- putchar(7);
- break;
- }
- line[x++] = ch;
- line[x] = '\0';
- chpr = unctrl(ch);
- while(*chpr)
- linepr[xpr++] = *(chpr++);
- linepr[xpr] = '\0';
- }
- TS; if (x > co-4) { fputs("<- ",stderr); fputs(linepr + x-co+7,stderr); }
- else fputs(linepr,stderr); putc('_',stderr); CE; FS; fflush(stderr);
- }
- if ((ch == EOF) || (ch == 4))
- {
- fputs(line,stdout);
- putchar(4);
- fflush(stdout);
- if (ch == EOF)
- break;
- /* On a normal ^D, we won't die until after our output does. */
- }
- else if (ch == 1)
- {
- fputs(line,stdout); fflush(stdout);
- TS; CE; FS; fflush(stderr);
- }
- else
- {
- puts(line); fflush(stdout);
- }
- }
- TS; CE; FS; fflush(stderr);
- exit(0);
- }
-