|
|
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.