|
|
1.1 root 1: /*********************************************************************
2: * COPYRIGHT NOTICE *
3: **********************************************************************
4: * This software is copyright (C) 1982 by Pavel Curtis *
5: * *
6: * Permission is granted to reproduce and distribute *
7: * this file by any means so long as no fee is charged *
8: * above a nominal handling fee and so long as this *
9: * notice is always included in the copies. *
10: * *
11: * Other rights are reserved except as explicitly granted *
12: * by written permission of the author. *
13: * Pavel Curtis *
14: * Computer Science Dept. *
15: * 405 Upson Hall *
16: * Cornell University *
17: * Ithaca, NY 14853 *
18: * *
19: * Ph- (607) 256-4934 *
20: * *
21: * Pavel.Cornell@Udel-Relay (ARPAnet) *
22: * decvax!cornell!pavel (UUCPnet) *
23: *********************************************************************/
24:
25: /*
26: * setupterm(termname, filedes, errret)
27: *
28: * Find and read the appropriate object file for the terminal
29: * Make cur_term point to the structure.
30: * Turn off the XTABS bit in the tty structure if it was on
31: * If XTABS was on, remove the tab and backtab capabilities.
32: *
33: * $Log: lib_setup.c,v $
34: * Revision 1.11 93/04/12 14:14:08 bin
35: * Udo: third color update
36: *
37: * Revision 2.4 92/11/29 15:40:02 munk
38: * Conditional usage of termio
39: *
40: * Revision 2.3 92/10/27 22:23:15 munk
41: * Initialize alternate character set map
42: *
43: * Revision 1.5 92/06/02 12:05:36 bin
44: * *** empty log message ***
45: *
46: * Revision 1.2 92/04/13 14:38:31 bin
47: * update by vlad
48: *
49: * Revision 2.2 91/04/20 21:45:19 munk
50: * Usage of register variables
51: * Made the large arrays static
52: *
53: * Revision 2.1 82/10/25 14:49:09 pavel
54: * Added Copyright Notice
55: *
56: * Revision 2.0 82/10/24 15:17:46 pavel
57: * Beta-one Test Release
58: *
59: * Revision 1.5 82/08/23 22:30:35 pavel
60: * The REAL Alpha-one Release Version
61: *
62: * Revision 1.4 82/08/20 15:12:24 pavel
63: * Fixed use of un-initialised cur_term.
64: *
65: * Revision 1.3 82/08/19 19:22:09 pavel
66: * Alpha Test Release One
67: *
68: * Revision 1.2 82/08/19 19:11:28 pavel
69: * Alpha Test Release One
70: *
71: * Revision 1.1 82/08/12 18:45:07 pavel
72: * Initial revision
73: *
74: *
75: */
76:
77: #ifdef RCSHDR
78: static char RCSid[] =
79: "$Header: /src386/usr/lib/ncurses/RCS/lib_setup.c,v 1.11 93/04/12 14:14:08 bin Exp Locker: bin $";
80: #endif
81:
82: #include <stdio.h>
83: #include "curses.h"
84: #include "curses.priv.h"
85: #include "term.h"
86:
87: /*
88: * The original sources have Unix brain damage in that they assumed that a
89: * non-initialized data declaration in the headers was OK and would define
90: * the space for all to see. Sorry, but we do C, not Fortran.
91: */
92:
93: struct term * __cur_term;
94:
95: #define ret_error(code, fmt, arg) if (errret)\
96: {\
97: *errret = code;\
98: return(code);\
99: }\
100: else\
101: {\
102: fprintf(stderr, fmt, arg);\
103: exit(1);\
104: }
105:
106:
107: chtype acs_map[128];
108: char ttytype[NAMESIZE];
109: struct term _first_term;
110:
111: int _tracing;
112: struct screen *SP = 0;
113:
114:
115: setupterm(termname, filedes, errret)
116: char *termname;
117: int filedes;
118: int *errret;
119: {
120: char filename[1024];
121: char *malloc(), *getenv(), *strncpy();
122: char *terminfo;
123: struct term *term_ptr;
124: int got_code;
125:
126: #ifdef TRACE
127: _init_trace();
128: if (_tracing)
129: _tracef("setupterm(%s,%d,%o) called", termname, filedes, errret);
130: #endif
131:
132: if (termname == NULL)
133: {
134: termname = getenv("TERM");
135: if (termname == NULL)
136: ret_error(-1, "TERM environment variable not set.\n", "");
137: }
138:
139: if (cur_term == 0)
140: term_ptr = &_first_term;
141: else
142: {
143: term_ptr = (struct term *) malloc(sizeof(struct term));
144:
145: if (term_ptr == NULL)
146: ret_error(-1, "Not enough memory to create terminal structure.\n", "");
147: }
148:
149: got_code = -1;
150: if ((terminfo = getenv("TERMINFO")) != NULL) {
151: sprintf(filename, "%s/%c/%s", terminfo, termname[0], termname);
152: got_code = read_entry(filename, term_ptr);
153: }
154: if (got_code < 0) {
155: sprintf(filename, "%s/%c/%s", SRCDIR, termname[0], termname);
156: if (read_entry(filename, term_ptr) < 0)
157: ret_error(0, "'%s': Unknown terminal type.\n", termname);
158: }
159:
160: if (command_character && getenv("CC"))
161: do_prototype();
162:
163: cur_term = term_ptr;
164: strncpy(ttytype, cur_term->term_names, NAMESIZE - 1);
165: ttytype[NAMESIZE - 1] = '\0';
166: cur_term->Filedes = filedes;
167: #ifdef USE_TERMIO
168: ioctl(filedes, TCGETA, &cur_term->Otermio);
169: if ((cur_term->Otermio.c_oflag & TABDLY) == TAB3)
170: tab = back_tab = NULL;
171:
172: cur_term->Ntermio = cur_term->Otermio;
173: cur_term->Ntermio.c_oflag &= ~TAB3;
174: #else
175: gtty(filedes, &cur_term->Ottyb);
176: if (cur_term->Ottyb.sg_flags & XTABS)
177: tab = back_tab = NULL;
178:
179: cur_term->Nttyb = cur_term->Ottyb;
180: cur_term->Nttyb.sg_flags &= ~XTABS;
181: #endif
182:
183: setup_acs();
184: fixterm();
185:
186: if (errret)
187: *errret = 1;
188:
189: return(1);
190: }
191:
192:
193: /*
194: ** do_prototype()
195: **
196: ** Take the real command character out of the CC environment variable
197: ** and substitute it in for the prototype given in 'command_character'.
198: **
199: */
200:
201: static
202: do_prototype()
203: {
204: register int i, j;
205: char CC;
206: char proto;
207:
208: CC = *getenv("CC");
209: proto = *command_character;
210:
211: for (i=0; i < STRCOUNT; i++)
212: {
213: j = 0;
214: while (cur_term->Strings[i][j])
215: {
216: if (cur_term->Strings[i][j] == proto)
217: cur_term->Strings[i][j] = CC;
218: j++;
219: }
220: }
221: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.