|
|
1.1 root 1: /*
2: * Copyright (c) 1988 Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms are permitted
6: * provided that this notice is preserved and that due credit is given
7: * to the University of California at Berkeley. The name of the University
8: * may not be used to endorse or promote products derived from this
9: * software without specific prior written permission. This software
10: * is provided ``as is'' without express or implied warranty.
11: */
12:
13: #ifndef lint
14: static char sccsid[] = "@(#)terminal.c 1.11 (Berkeley) 3/8/88";
15: #endif /* not lint */
16:
17: #include <arpa/telnet.h>
18: #include <sys/types.h>
19:
20: #include "ring.h"
21:
22: #include "externs.h"
23: #include "types.h"
24:
25: Ring ttyoring, ttyiring;
26: char ttyobuf[2*BUFSIZ], ttyibuf[BUFSIZ];
27:
28: char
29: termEofChar,
30: termEraseChar,
31: termFlushChar,
32: termIntChar,
33: termKillChar,
34: termLiteralNextChar,
35: termQuitChar;
36:
37: /*
38: * initialize the terminal data structures.
39: */
40:
41: init_terminal()
42: {
43: ring_init(&ttyoring, ttyobuf, sizeof ttyobuf);
44: ring_init(&ttyiring, ttyibuf, sizeof ttyibuf);
45: autoflush = TerminalAutoFlush();
46: }
47:
48:
49: /*
50: * Send as much data as possible to the terminal.
51: *
52: * The return value indicates whether we did any
53: * useful work.
54: */
55:
56:
57: int
58: ttyflush(drop)
59: int drop;
60: {
61: register int n, n0, n1;
62:
63: n0 = ring_full_count(&ttyoring);
64: if ((n1 = n = ring_full_consecutive(&ttyoring)) > 0) {
65: if (drop) {
66: TerminalFlushOutput();
67: /* we leave 'n' alone! */
68: } else {
69: n = TerminalWrite(ttyoring.consume, n);
70: }
71: }
72: if (n > 0) {
73: /*
74: * If we wrote everything, and the full count is
75: * larger than what we wrote, then write the
76: * rest of the buffer.
77: */
78: if (n1 == n && n0 > n) {
79: n1 = n0 - n;
80: if (!drop)
81: n1 = TerminalWrite(ttyoring.bottom, n1);
82: n += n1;
83: }
84: ring_consumed(&ttyoring, n);
85: }
86: return n > 0;
87: }
88:
89:
90: /*
91: * These routines decides on what the mode should be (based on the values
92: * of various global variables).
93: */
94:
95:
96: int
97: getconnmode()
98: {
99: static char newmode[16] =
100: { 4, 5, 3, 3, 2, 2, 1, 1, 6, 6, 6, 6, 6, 6, 6, 6 };
101: int modeindex = 0;
102:
103: if (dontlecho && (clocks.echotoggle > clocks.modenegotiated)) {
104: modeindex += 1;
105: }
106: if (hisopts[TELOPT_ECHO]) {
107: modeindex += 2;
108: }
109: if (hisopts[TELOPT_SGA]) {
110: modeindex += 4;
111: }
112: if (In3270) {
113: modeindex += 8;
114: }
115: return newmode[modeindex];
116: }
117:
118: void
119: setconnmode()
120: {
121: TerminalNewMode(getconnmode());
122: }
123:
124:
125: void
126: setcommandmode()
127: {
128: TerminalNewMode(0);
129: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.