|
|
1.1 ! root 1: #include "curses.ext" ! 2: /* @(#) nttychktrm.c: 1.1 10/15/83 1/5/83 */ ! 3: ! 4: char *_c_why_not = NULL; ! 5: static char * ! 6: _stupid = "Sorry, I don't know how to deal with your '%s' terminal.\r\n"; ! 7: static char * ! 8: _unknown = "Sorry, I need to know a more specific terminal type than '%s'.\r\n"; ! 9: ! 10: struct screen * ! 11: _new_tty(type, fd) ! 12: char *type; ! 13: FILE *fd; ! 14: { ! 15: int retcode; ! 16: struct map *_init_keypad(); ! 17: char *calloc(); ! 18: ! 19: #ifdef DEBUG ! 20: if(outf) fprintf(outf, "__new_tty: type %s, fd %x\n", type, fd); ! 21: #endif ! 22: /* ! 23: * Allocate an SP structure if there is none, or if SP is ! 24: * still pointing to an old structure from a previous call ! 25: * to this routine. But don't allocate one if we are being ! 26: * called from a higher level curses routine. Since it's our ! 27: * job to initialize the phys_scr field and higher level routines ! 28: * aren't supposed to, we check that field to figure which to do. ! 29: */ ! 30: if (SP == NULL || SP->cur_body!=0) ! 31: SP = (struct screen *) calloc(1, sizeof (struct screen)); ! 32: SP->term_file = fd; ! 33: if (type == 0) ! 34: type = "unknown"; ! 35: _setbuffered(fd); ! 36: setupterm(type, fileno(fd), &retcode); ! 37: if (retcode < 0) { ! 38: /* ! 39: * This happens if /usr/lib/terminfo doesn't exist, there is ! 40: * no such terminal type, or the file is corrupted. ! 41: * This would be a good place to print an error message. ! 42: */ ! 43: return NULL; ! 44: } ! 45: savetty(); /* as a "useful default" - hanging up is nasty. */ ! 46: if (chk_trm() == ERR) ! 47: return NULL; ! 48: SP->tcap = cur_term; ! 49: SP->doclear = 1; ! 50: SP->cur_body = (struct line **) calloc(lines+2, sizeof (struct line *)); ! 51: SP->std_body = (struct line **) calloc(lines+2, sizeof (struct line *)); ! 52: #ifdef KEYPAD ! 53: SP->kp = _init_keypad(); ! 54: #endif ! 55: SP->input_queue = (short *) calloc(20, sizeof (short)); ! 56: SP->input_queue[0] = -1; ! 57: ! 58: SP->virt_x = 0; /* X and Y coordinates of the SP->curptr */ ! 59: SP->virt_y = 0; /* between updates. */ ! 60: _init_costs(); ! 61: return SP; ! 62: } ! 63: ! 64: static int ! 65: chk_trm() ! 66: { ! 67: #ifdef DEBUG ! 68: if(outf) fprintf(outf, "chk_trm().\n"); ! 69: #endif ! 70: ! 71: if (generic_type) { ! 72: _c_why_not = _unknown; ! 73: return ERR; ! 74: } ! 75: if (clear_screen == 0 || hard_copy || over_strike) { ! 76: _c_why_not = _stupid; ! 77: return ERR; ! 78: } ! 79: if (cursor_address) { ! 80: /* we can handle it */ ! 81: } else ! 82: if ( (cursor_up || cursor_home) /* some way to move up */ ! 83: && cursor_down /* some way to move down */ ! 84: && (cursor_left || carriage_return) /* ... move left */ ! 85: /* printing chars moves right */ ! 86: ) { ! 87: /* we can handle it */ ! 88: } else { ! 89: _c_why_not = _stupid; ! 90: return ERR; ! 91: } ! 92: return OK; ! 93: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.