|
|
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: ** lib_options.c ! 27: ** ! 28: ** The routines to handle option setting. ! 29: ** ! 30: ** $Log: RCS/lib_options.v $ ! 31: * Revision 2.4 92/11/08 15:41:44 munk ! 32: * Correct definition of malloc() and ! 33: * usage of the cast operator ! 34: * ! 35: * Revision 2.3 91/12/03 21:51:11 munk ! 36: * Added KEY_LL in function init_keytry() ! 37: * ! 38: * Revision 2.2 91/04/20 21:29:33 munk ! 39: * Usage of register variables ! 40: * ! 41: * Revision 2.1 82/10/25 14:48:24 pavel ! 42: * Added Copyright Notice ! 43: * ! 44: * Revision 2.0 82/10/25 13:47:45 pavel ! 45: * Beta-one Test Release ! 46: * ! 47: ** ! 48: */ ! 49: ! 50: #ifdef RCSHDR ! 51: static char RCSid[] = ! 52: "$Header: RCS/lib_options.v Revision 2.2 91/04/20 21:29:33 munk Exp$"; ! 53: #endif ! 54: ! 55: #include "term.h" ! 56: #include "curses.h" ! 57: #include "curses.priv.h" ! 58: ! 59: char *malloc(); ! 60: ! 61: ! 62: static ! 63: outc(ch) ! 64: char ch; ! 65: { ! 66: putc(ch, SP->_ofp); ! 67: } ! 68: ! 69: ! 70: idlok(win, flag) ! 71: WINDOW *win; ! 72: int flag; ! 73: { ! 74: #ifdef TRACE ! 75: if (_tracing) ! 76: _tracef("idlok(%o,%d) called", win, flag); ! 77: #endif ! 78: ! 79: if ((insert_line && delete_line) ! 80: #ifdef UNIMPLEMENTED ! 81: || (change_scroll_region) ! 82: #endif ! 83: ) ! 84: curscr->_idlok = flag; ! 85: } ! 86: ! 87: ! 88: clearok(win, flag) ! 89: WINDOW *win; ! 90: int flag; ! 91: { ! 92: #ifdef TRACE ! 93: if (_tracing) ! 94: _tracef("clearok(%o,%d) called", win, flag); ! 95: #endif ! 96: ! 97: if (win == curscr) ! 98: newscr->_clear = flag; ! 99: else ! 100: win->_clear = flag; ! 101: } ! 102: ! 103: ! 104: leaveok(win, flag) ! 105: WINDOW *win; ! 106: int flag; ! 107: { ! 108: #ifdef TRACE ! 109: if (_tracing) ! 110: _tracef("leaveok(%o,%d) called", win, flag); ! 111: #endif ! 112: ! 113: win->_leave = flag; ! 114: } ! 115: ! 116: ! 117: scrollok(win, flag) ! 118: WINDOW *win; ! 119: int flag; ! 120: { ! 121: #ifdef TRACE ! 122: if (_tracing) ! 123: _tracef("scrollok(%o,%d) called", win, flag); ! 124: #endif ! 125: ! 126: win->_scroll = flag; ! 127: } ! 128: ! 129: ! 130: nodelay(win, flag) ! 131: WINDOW *win; ! 132: int flag; ! 133: { ! 134: #ifdef TRACE ! 135: if (_tracing) ! 136: _tracef("nodelay(%o,%d) called", win, flag); ! 137: #endif ! 138: ! 139: win->_nodelay = flag; ! 140: } ! 141: ! 142: ! 143: keypad(win, flag) ! 144: WINDOW *win; ! 145: int flag; ! 146: { ! 147: #ifdef TRACE ! 148: if (_tracing) ! 149: _tracef("keypad(%o,%d) called", win, flag); ! 150: #endif ! 151: ! 152: win->_use_keypad = flag; ! 153: ! 154: if (flag && keypad_xmit) ! 155: tputs(keypad_xmit, 1, outc); ! 156: else if (! flag && keypad_local) ! 157: tputs(keypad_local, 1, outc); ! 158: ! 159: if (SP->_keytry == UNINITIALISED) ! 160: init_keytry(); ! 161: } ! 162: ! 163: ! 164: meta(win, flag) ! 165: WINDOW *win; ! 166: int flag; ! 167: { ! 168: #ifdef TRACE ! 169: if (_tracing) ! 170: _tracef("meta(%o,%d) called", win, flag); ! 171: #endif ! 172: ! 173: win->_use_meta = flag; ! 174: ! 175: if (flag && meta_on) ! 176: tputs(meta_on, 1, outc); ! 177: else if (! flag && meta_off) ! 178: tputs(meta_off, 1, outc); ! 179: } ! 180: ! 181: ! 182: /* ! 183: ** init_keytry() ! 184: ** ! 185: ** Construct the try for the current terminal's keypad keys. ! 186: ** ! 187: */ ! 188: ! 189: static struct try *newtry; ! 190: ! 191: static ! 192: init_keytry() ! 193: { ! 194: newtry = NULL; ! 195: ! 196: add_to_try(key_backspace, KEY_BACKSPACE); ! 197: add_to_try(key_catab, KEY_CATAB); ! 198: add_to_try(key_clear, KEY_CLEAR); ! 199: add_to_try(key_ctab, KEY_CTAB); ! 200: add_to_try(key_dc, KEY_DC); ! 201: add_to_try(key_dl, KEY_DL); ! 202: add_to_try(key_down, KEY_DOWN); ! 203: add_to_try(key_eic, KEY_EIC); ! 204: add_to_try(key_eol, KEY_EOL); ! 205: add_to_try(key_eos, KEY_EOS); ! 206: add_to_try(key_f0, KEY_F(0)); ! 207: add_to_try(key_f1, KEY_F(1)); ! 208: add_to_try(key_f2, KEY_F(2)); ! 209: add_to_try(key_f3, KEY_F(3)); ! 210: add_to_try(key_f4, KEY_F(4)); ! 211: add_to_try(key_f5, KEY_F(5)); ! 212: add_to_try(key_f6, KEY_F(6)); ! 213: add_to_try(key_f7, KEY_F(7)); ! 214: add_to_try(key_f8, KEY_F(8)); ! 215: add_to_try(key_f9, KEY_F(9)); ! 216: add_to_try(key_f10, KEY_F(10)); ! 217: add_to_try(key_home, KEY_HOME); ! 218: add_to_try(key_ll, KEY_LL); ! 219: add_to_try(key_ic, KEY_IC); ! 220: add_to_try(key_il, KEY_IL); ! 221: add_to_try(key_left, KEY_LEFT); ! 222: add_to_try(key_npage, KEY_NPAGE); ! 223: add_to_try(key_ppage, KEY_PPAGE); ! 224: add_to_try(key_right, KEY_RIGHT); ! 225: add_to_try(key_sf, KEY_SF); ! 226: add_to_try(key_sr, KEY_SR); ! 227: add_to_try(key_stab, KEY_STAB); ! 228: add_to_try(key_up, KEY_UP); ! 229: ! 230: SP->_keytry = newtry; ! 231: } ! 232: ! 233: ! 234: add_to_try(str, code) ! 235: register char *str; ! 236: short code; ! 237: { ! 238: void free(); ! 239: static bool out_of_memory = FALSE; ! 240: register struct try *ptr, *savedptr; ! 241: ! 242: if (! str || out_of_memory) ! 243: return; ! 244: ! 245: if (newtry != NULL) ! 246: { ! 247: ptr = newtry; ! 248: ! 249: for (;;) ! 250: { ! 251: while (ptr->ch != *str && ptr->sibling != NULL) ! 252: ptr = ptr->sibling; ! 253: ! 254: if (ptr->ch == *str) ! 255: { ! 256: if (*(++str)) ! 257: { ! 258: if (ptr->child != NULL) ! 259: ptr = ptr->child; ! 260: else ! 261: break; ! 262: } ! 263: else ! 264: { ! 265: ptr->value = code; ! 266: return; ! 267: } ! 268: } ! 269: else ! 270: { ! 271: if ((ptr->sibling = (struct try *) malloc(sizeof *ptr)) == NULL) ! 272: { ! 273: out_of_memory = TRUE; ! 274: return; ! 275: } ! 276: ! 277: savedptr = ptr = ptr->sibling; ! 278: ptr->child = ptr->sibling = NULL; ! 279: ptr->ch = *str++; ! 280: ptr->value = 0; ! 281: ! 282: break; ! 283: } ! 284: } /* end for (;;) */ ! 285: } ! 286: else /* newtry == NULL :: First sequence to be added */ ! 287: { ! 288: savedptr = ptr = newtry = (struct try *) malloc(sizeof *ptr); ! 289: ! 290: if (ptr == NULL) ! 291: { ! 292: out_of_memory = TRUE; ! 293: return; ! 294: } ! 295: ! 296: ptr->child = ptr->sibling = NULL; ! 297: ptr->ch = *(str++); ! 298: ptr->value = 0; ! 299: } ! 300: ! 301: /* at this point, we are adding to the try. ptr->child == NULL */ ! 302: ! 303: while (*str) ! 304: { ! 305: ptr->child = (struct try *) malloc(sizeof *ptr); ! 306: ! 307: ptr = ptr->child; ! 308: ! 309: if (ptr == NULL) ! 310: { ! 311: out_of_memory = TRUE; ! 312: ! 313: ptr = savedptr; ! 314: while (ptr != NULL) ! 315: { ! 316: savedptr = ptr->child; ! 317: free(ptr); ! 318: ptr = savedptr; ! 319: } ! 320: ! 321: return; ! 322: } ! 323: ! 324: ptr->child = ptr->sibling = NULL; ! 325: ptr->ch = *(str++); ! 326: ptr->value = 0; ! 327: } ! 328: ! 329: ptr->value = code; ! 330: return; ! 331: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.