xref: /csrg-svn/usr.bin/telnet/terminal.c (revision 33286)
132148Sminshall #include <arpa/telnet.h>
232381Sminshall #include <sys/types.h>
332148Sminshall 
432381Sminshall #include "ring.h"
532381Sminshall 
632148Sminshall #include "externs.h"
732148Sminshall #include "types.h"
832148Sminshall 
932531Sminshall Ring	ttyoring, ttyiring;
1032531Sminshall char	ttyobuf[2*BUFSIZ], ttyibuf[BUFSIZ];
1132148Sminshall 
1232148Sminshall char
1332148Sminshall     termEofChar,
1432148Sminshall     termEraseChar,
1532148Sminshall     termFlushChar,
1632148Sminshall     termIntChar,
1732148Sminshall     termKillChar,
1832148Sminshall     termLiteralNextChar,
1932148Sminshall     termQuitChar;
2032148Sminshall 
2132148Sminshall /*
2232148Sminshall  * initialize the terminal data structures.
2332148Sminshall  */
2432148Sminshall 
2532148Sminshall init_terminal()
2632148Sminshall {
2732381Sminshall     ring_init(&ttyoring, ttyobuf, sizeof ttyobuf);
2832531Sminshall     ring_init(&ttyiring, ttyibuf, sizeof ttyibuf);
2932148Sminshall     autoflush = TerminalAutoFlush();
3032148Sminshall }
3132148Sminshall 
3232148Sminshall 
3332148Sminshall /*
3432148Sminshall  *		Send as much data as possible to the terminal.
3532148Sminshall  *
3632148Sminshall  *		The return value indicates whether we did any
3732148Sminshall  *	useful work.
3832148Sminshall  */
3932148Sminshall 
4032148Sminshall 
4132148Sminshall int
4232257Sminshall ttyflush(drop)
4332257Sminshall int drop;
4432148Sminshall {
4532667Sminshall     register int n, n0, n1;
4632148Sminshall 
4732667Sminshall     n0 = ring_full_count(&ttyoring);
4832667Sminshall     if ((n1 = n = ring_full_consecutive(&ttyoring)) > 0) {
4932257Sminshall 	if (drop) {
5032148Sminshall 	    TerminalFlushOutput();
5132148Sminshall 	    /* we leave 'n' alone! */
5232257Sminshall 	} else {
53*33286Sminshall 	    n = TerminalWrite(ttyoring.consume, n);
5432148Sminshall 	}
5532148Sminshall     }
5632667Sminshall     if (n > 0) {
5732667Sminshall 	/*
5832667Sminshall 	 * If we wrote everything, and the full count is
5932667Sminshall 	 * larger than what we wrote, then write the
6032667Sminshall 	 * rest of the buffer.
6132667Sminshall 	 */
6232667Sminshall 	if (n1 == n && n0 > n) {
6332667Sminshall 		n1 = n0 - n;
6432667Sminshall 		if (!drop)
65*33286Sminshall 			n1 = TerminalWrite(ttyoring.bottom, n1);
6632667Sminshall 		n += n1;
6732667Sminshall 	}
6832528Sminshall 	ring_consumed(&ttyoring, n);
6932148Sminshall     }
7032148Sminshall     return n > 0;
7132148Sminshall }
7232148Sminshall 
7332148Sminshall 
7432148Sminshall /*
7532148Sminshall  * These routines decides on what the mode should be (based on the values
7632148Sminshall  * of various global variables).
7732148Sminshall  */
7832148Sminshall 
7932148Sminshall 
8032148Sminshall int
8132148Sminshall getconnmode()
8232148Sminshall {
8332148Sminshall     static char newmode[16] =
8432148Sminshall 			{ 4, 5, 3, 3, 2, 2, 1, 1, 6, 6, 6, 6, 6, 6, 6, 6 };
8532148Sminshall     int modeindex = 0;
8632148Sminshall 
8732148Sminshall     if (dontlecho && (clocks.echotoggle > clocks.modenegotiated)) {
8832148Sminshall 	modeindex += 1;
8932148Sminshall     }
9032148Sminshall     if (hisopts[TELOPT_ECHO]) {
9132148Sminshall 	modeindex += 2;
9232148Sminshall     }
9332148Sminshall     if (hisopts[TELOPT_SGA]) {
9432148Sminshall 	modeindex += 4;
9532148Sminshall     }
9632148Sminshall     if (In3270) {
9732148Sminshall 	modeindex += 8;
9832148Sminshall     }
9932148Sminshall     return newmode[modeindex];
10032148Sminshall }
10132148Sminshall 
10232148Sminshall void
10332148Sminshall setconnmode()
10432148Sminshall {
105*33286Sminshall     TerminalNewMode(getconnmode());
10632148Sminshall }
10732148Sminshall 
10832148Sminshall 
10932148Sminshall void
11032148Sminshall setcommandmode()
11132148Sminshall {
112*33286Sminshall     TerminalNewMode(0);
11332148Sminshall }
114