|
|
1.1 root 1: /*
2: * Copyright (c) 1981 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 the above copyright notice and this paragraph are
7: * duplicated in all such forms and that any documentation,
8: * advertising materials, and other materials related to such
9: * distribution and use acknowledge that the software was developed
10: * by the University of California, Berkeley. The name of the
11: * University may not be used to endorse or promote products derived
12: * from this software without specific prior written permission.
13: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15: * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
16: */
17:
18: #ifndef lint
19: static char sccsid[] = "@(#)cr_tty.c 5.4 (Berkeley) 6/30/88";
20: #endif /* not lint */
21:
22: /*
23: * Terminal initialization routines.
24: *
25: */
26:
27: # include "curses.ext"
28:
29: static bool *sflags[] = {
30: &AM, &BS, &DA, &DB, &EO, &HC, &HZ, &IN, &MI,
31: &MS, &NC, &NS, &OS, &UL, &XB, &XN, &XT, &XS,
32: &XX
33: };
34:
35: static char *_PC,
36: **sstrs[] = {
37: &AL, &BC, &BT, &CD, &CE, &CL, &CM, &CR, &CS,
38: &DC, &DL, &DM, &DO, &ED, &EI, &K0, &K1, &K2,
39: &K3, &K4, &K5, &K6, &K7, &K8, &K9, &HO, &IC,
40: &IM, &IP, &KD, &KE, &KH, &KL, &KR, &KS, &KU,
41: &LL, &MA, &ND, &NL, &_PC, &RC, &SC, &SE, &SF,
42: &SO, &SR, &TA, &TE, &TI, &UC, &UE, &UP, &US,
43: &VB, &VS, &VE, &AL_PARM, &DL_PARM, &UP_PARM,
44: &DOWN_PARM, &LEFT_PARM, &RIGHT_PARM,
45: },
46: *tgoto();
47:
48: char _tspace[2048]; /* Space for capability strings */
49:
50: static char *aoftspace; /* Address of _tspace for relocation */
51:
52: static int destcol, destline;
53:
54: /*
55: * This routine does terminal type initialization routines, and
56: * calculation of flags at entry. It is almost entirely stolen from
57: * Bill Joy's ex version 2.6.
58: */
59: short ospeed = -1;
60:
61: gettmode() {
62:
63: if (gtty(_tty_ch, &_tty) < 0)
64: return;
65: savetty();
66: if (stty(_tty_ch, &_tty) < 0)
67: _tty.sg_flags = _res_flg;
68: ospeed = _tty.sg_ospeed;
69: _res_flg = _tty.sg_flags;
70: UPPERCASE = (_tty.sg_flags & LCASE) != 0;
71: GT = ((_tty.sg_flags & XTABS) == 0);
72: NONL = ((_tty.sg_flags & CRMOD) == 0);
73: _tty.sg_flags &= ~XTABS;
74: stty(_tty_ch, &_tty);
75: # ifdef DEBUG
76: fprintf(outf, "GETTMODE: UPPERCASE = %s\n", UPPERCASE ? "TRUE":"FALSE");
77: fprintf(outf, "GETTMODE: GT = %s\n", GT ? "TRUE" : "FALSE");
78: fprintf(outf, "GETTMODE: NONL = %s\n", NONL ? "TRUE" : "FALSE");
79: fprintf(outf, "GETTMODE: ospeed = %d\n", ospeed);
80: # endif
81: }
82:
83: setterm(type)
84: reg char *type; {
85:
86: reg int unknown;
87: static char genbuf[1024];
88: # ifdef TIOCGWINSZ
89: struct winsize win;
90: # endif
91:
92: # ifdef DEBUG
93: fprintf(outf, "SETTERM(\"%s\")\n", type);
94: fprintf(outf, "SETTERM: LINES = %d, COLS = %d\n", LINES, COLS);
95: # endif
96: if (type[0] == '\0')
97: type = "xx";
98: unknown = FALSE;
99: if (tgetent(genbuf, type) != 1) {
100: unknown++;
101: strcpy(genbuf, "xx|dumb:");
102: }
103: # ifdef DEBUG
104: fprintf(outf, "SETTERM: tty = %s\n", type);
105: # endif
106: # ifdef TIOCGWINSZ
107: if (ioctl(_tty_ch, TIOCGWINSZ, &win) >= 0) {
108: if (LINES == 0)
109: LINES = win.ws_row;
110: if (COLS == 0)
111: COLS = win.ws_col;
112: }
113: # endif
114:
115: if (LINES == 0)
116: LINES = tgetnum("li");
117: if (LINES <= 5)
118: LINES = 24;
119:
120: if (COLS == 0)
121: COLS = tgetnum("co");
122: if (COLS <= 4)
123: COLS = 80;
124:
125: # ifdef DEBUG
126: fprintf(outf, "SETTERM: LINES = %d, COLS = %d\n", LINES, COLS);
127: # endif
128: aoftspace = _tspace;
129: zap(); /* get terminal description */
130:
131: /*
132: * Handle funny termcap capabilities
133: */
134: if (CS && SC && RC) AL=DL="";
135: if (AL_PARM && AL==NULL) AL="";
136: if (DL_PARM && DL==NULL) DL="";
137: if (IC && IM==NULL) IM="";
138: if (IC && EI==NULL) EI="";
139: if (!GT) BT=NULL; /* If we can't tab, we can't backtab either */
140:
141: if (tgoto(CM, destcol, destline)[0] == 'O')
142: CA = FALSE, CM = 0;
143: else
144: CA = TRUE;
145:
146: PC = _PC ? _PC[0] : FALSE;
147: aoftspace = _tspace;
148: strncpy(ttytype, longname(genbuf, type), sizeof(ttytype) - 1);
149: ttytype[sizeof(ttytype) - 1] = '\0';
150: if (unknown)
151: return ERR;
152: return OK;
153: }
154:
155: /*
156: * This routine gets all the terminal flags from the termcap database
157: */
158:
159: zap()
160: {
161: register char *namp;
162: register bool **fp;
163: register char ***sp;
164: #ifdef DEBUG
165: register char *cp;
166: #endif
167: extern char *tgetstr();
168:
169: namp = "ambsdadbeohchzinmimsncnsosulxbxnxtxsxx";
170: fp = sflags;
171: do {
172: *(*fp++) = tgetflag(namp);
173: #ifdef DEBUG
174: fprintf(outf, "%2.2s = %s\n", namp, *fp[-1] ? "TRUE" : "FALSE");
175: #endif
176: namp += 2;
177: } while (*namp);
178: namp = "albcbtcdceclcmcrcsdcdldmdoedeik0k1k2k3k4k5k6k7k8k9hoicimipkdkekhklkrkskullmandnlpcrcscsesfsosrtatetiucueupusvbvsveALDLUPDOLERI";
179: sp = sstrs;
180: do {
181: *(*sp++) = tgetstr(namp, &aoftspace);
182: #ifdef DEBUG
183: fprintf(outf, "%2.2s = %s", namp, *sp[-1] == NULL ? "NULL\n" : "\"");
184: if (*sp[-1] != NULL) {
185: for (cp = *sp[-1]; *cp; cp++)
186: fprintf(outf, "%s", unctrl(*cp));
187: fprintf(outf, "\"\n");
188: }
189: #endif
190: namp += 2;
191: } while (*namp);
192: if (XS)
193: SO = SE = NULL;
194: else {
195: if (tgetnum("sg") > 0)
196: SO = NULL;
197: if (tgetnum("ug") > 0)
198: US = NULL;
199: if (!SO && US) {
200: SO = US;
201: SE = UE;
202: }
203: }
204: }
205:
206: /*
207: * return a capability from termcap
208: */
209: char *
210: getcap(name)
211: char *name;
212: {
213: char *tgetstr();
214:
215: return tgetstr(name, &aoftspace);
216: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.