#include #include #include "ring.h" #include "externs.h" #include "types.h" Ring ttyoring, ttyiring; char ttyobuf[2*BUFSIZ], ttyibuf[BUFSIZ]; char termEofChar, termEraseChar, termFlushChar, termIntChar, termKillChar, termLiteralNextChar, termQuitChar; /* * initialize the terminal data structures. */ init_terminal() { ring_init(&ttyoring, ttyobuf, sizeof ttyobuf); ring_init(&ttyiring, ttyibuf, sizeof ttyibuf); autoflush = TerminalAutoFlush(); } /* * Send as much data as possible to the terminal. * * The return value indicates whether we did any * useful work. */ int ttyflush(drop) int drop; { register int n, n0, n1; n0 = ring_full_count(&ttyoring); if ((n1 = n = ring_full_consecutive(&ttyoring)) > 0) { if (drop) { TerminalFlushOutput(); /* we leave 'n' alone! */ } else { n = TerminalWrite(tout, ttyoring.consume, n); } } if (n > 0) { /* * If we wrote everything, and the full count is * larger than what we wrote, then write the * rest of the buffer. */ if (n1 == n && n0 > n) { n1 = n0 - n; if (!drop) n1 = TerminalWrite(tout, ttyoring.bottom, n1); n += n1; } ring_consumed(&ttyoring, n); } return n > 0; } /* * These routines decides on what the mode should be (based on the values * of various global variables). */ int getconnmode() { static char newmode[16] = { 4, 5, 3, 3, 2, 2, 1, 1, 6, 6, 6, 6, 6, 6, 6, 6 }; int modeindex = 0; if (dontlecho && (clocks.echotoggle > clocks.modenegotiated)) { modeindex += 1; } if (hisopts[TELOPT_ECHO]) { modeindex += 2; } if (hisopts[TELOPT_SGA]) { modeindex += 4; } if (In3270) { modeindex += 8; } return newmode[modeindex]; } void setconnmode() { TerminalNewMode(tin, tout, getconnmode()); } void setcommandmode() { TerminalNewMode(tin, tout, 0); }