|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1983 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[] = "@(#)ttgeneric.c 3.35 (Berkeley) 6/29/88"; ! 20: #endif /* not lint */ ! 21: ! 22: #include "ww.h" ! 23: #include "tt.h" ! 24: ! 25: char PC, *BC, *UP; ! 26: short ospeed; ! 27: ! 28: /* normal frame */ ! 29: short gen_frame[16] = { ! 30: ' ', '|', '-', '+', ! 31: '|', '|', '+', '+', ! 32: '-', '+', '-', '+', ! 33: '+', '+', '+', '+' ! 34: }; ! 35: ! 36: /* ANSI graphics frame */ ! 37: #define G (WWM_GRP << WWC_MSHIFT) ! 38: short ansi_frame[16] = { ! 39: ' ', 'x'|G, 'Q'|G, 'm'|G, ! 40: 'x'|G, 'x'|G, 'l'|G, 't'|G, ! 41: 'q'|G, 'j'|G, 'q'|G, 'v'|G, ! 42: 'k'|G, 'u'|G, 'w'|G, 'n'|G ! 43: }; ! 44: struct tt_str ansi_AS = { ! 45: "\033(0", 3 ! 46: }; ! 47: ! 48: struct tt_str *gen_CM; ! 49: struct tt_str *gen_IM; ! 50: struct tt_str *gen_IC; ! 51: struct tt_str *gen_IP; ! 52: struct tt_str *gen_EI; ! 53: struct tt_str *gen_DC; ! 54: struct tt_str *gen_AL; ! 55: struct tt_str *gen_DL; ! 56: struct tt_str *gen_CE; ! 57: struct tt_str *gen_CD; ! 58: struct tt_str *gen_CL; ! 59: struct tt_str *gen_VS; ! 60: struct tt_str *gen_VE; ! 61: struct tt_str *gen_TI; ! 62: struct tt_str *gen_TE; ! 63: struct tt_str *gen_SO; ! 64: struct tt_str *gen_SE; ! 65: struct tt_str *gen_US; ! 66: struct tt_str *gen_UE; ! 67: struct tt_str *gen_UP; ! 68: struct tt_str *gen_PC; ! 69: struct tt_str *gen_BC; ! 70: struct tt_str *gen_ND; ! 71: struct tt_str *gen_HO; ! 72: struct tt_str *gen_NL; ! 73: struct tt_str *gen_CR; ! 74: struct tt_str *gen_AS; ! 75: struct tt_str *gen_AE; ! 76: struct tt_str *gen_XS; ! 77: struct tt_str *gen_XE; ! 78: struct tt_str *gen_SF; ! 79: struct tt_str *gen_SR; ! 80: struct tt_str *gen_CS; ! 81: char gen_MI; ! 82: char gen_MS; ! 83: char gen_AM; ! 84: char gen_OS; ! 85: char gen_BS; ! 86: char gen_DA; ! 87: char gen_DB; ! 88: char gen_NS; ! 89: char gen_XN; ! 90: int gen_CO; ! 91: int gen_LI; ! 92: int gen_UG; ! 93: int gen_SG; ! 94: ! 95: gen_setinsert(new) ! 96: char new; ! 97: { ! 98: if (new) { ! 99: if (gen_IM) ! 100: ttxputs(gen_IM); ! 101: } else ! 102: if (gen_EI) ! 103: ttxputs(gen_EI); ! 104: tt.tt_insert = new; ! 105: } ! 106: ! 107: gen_setmodes(new) ! 108: register new; ! 109: { ! 110: register diff; ! 111: ! 112: diff = new ^ tt.tt_modes; ! 113: if (diff & WWM_REV) { ! 114: if (new & WWM_REV) { ! 115: if (gen_SO) ! 116: ttxputs(gen_SO); ! 117: } else ! 118: if (gen_SE) ! 119: ttxputs(gen_SE); ! 120: } ! 121: if (diff & WWM_UL) { ! 122: if (new & WWM_UL) { ! 123: if (gen_US) ! 124: ttxputs(gen_US); ! 125: } else ! 126: if (gen_UE) ! 127: ttxputs(gen_UE); ! 128: } ! 129: if (diff & WWM_GRP) { ! 130: if (new & WWM_GRP) { ! 131: if (gen_AS) ! 132: ttxputs(gen_AS); ! 133: } else ! 134: if (gen_AE) ! 135: ttxputs(gen_AE); ! 136: } ! 137: if (diff & WWM_USR) { ! 138: if (new & WWM_USR) { ! 139: if (gen_XS) ! 140: ttxputs(gen_XS); ! 141: } else ! 142: if (gen_XE) ! 143: ttxputs(gen_XE); ! 144: } ! 145: tt.tt_modes = new; ! 146: } ! 147: ! 148: gen_insline() ! 149: { ! 150: if (tt.tt_modes) /* for concept 100 */ ! 151: gen_setmodes(0); ! 152: if (gen_AL) ! 153: tttputs(gen_AL, gen_LI - tt.tt_row); ! 154: } ! 155: ! 156: gen_delline() ! 157: { ! 158: if (tt.tt_modes) /* for concept 100 */ ! 159: gen_setmodes(0); ! 160: if (gen_DL) ! 161: tttputs(gen_DL, gen_LI - tt.tt_row); ! 162: } ! 163: ! 164: gen_putc(c) ! 165: register char c; ! 166: { ! 167: if (tt.tt_ninsert != tt.tt_insert) ! 168: gen_setinsert(tt.tt_ninsert); ! 169: if (tt.tt_nmodes != tt.tt_modes) ! 170: gen_setmodes(tt.tt_nmodes); ! 171: if (tt.tt_insert) { ! 172: if (gen_IC) ! 173: tttputs(gen_IC, gen_CO - tt.tt_col); ! 174: ttputc(c); ! 175: if (gen_IP) ! 176: tttputs(gen_IP, gen_CO - tt.tt_col); ! 177: } else ! 178: ttputc(c); ! 179: if (++tt.tt_col == gen_CO) ! 180: if (gen_XN) ! 181: tt.tt_col = tt.tt_row = -10; ! 182: else if (gen_AM) ! 183: tt.tt_col = 0, tt.tt_row++; ! 184: else ! 185: tt.tt_col--; ! 186: } ! 187: ! 188: gen_write(p, n) ! 189: register char *p; ! 190: register n; ! 191: { ! 192: if (tt.tt_ninsert != tt.tt_insert) ! 193: gen_setinsert(tt.tt_ninsert); ! 194: if (tt.tt_nmodes != tt.tt_modes) ! 195: gen_setmodes(tt.tt_nmodes); ! 196: if (tt.tt_insert && (gen_IC || gen_IP)) { ! 197: while (--n >= 0) { ! 198: if (gen_IC) ! 199: tttputs(gen_IC, gen_CO - tt.tt_col); ! 200: ttputc(*p++); ! 201: if (gen_IP) ! 202: tttputs(gen_IP, gen_CO - tt.tt_col); ! 203: tt.tt_col++; ! 204: } ! 205: } else { ! 206: tt.tt_col += n; ! 207: ttwrite(p, n); ! 208: } ! 209: if (tt.tt_col == gen_CO) ! 210: if (gen_XN) ! 211: tt.tt_col = tt.tt_row = -10; ! 212: else if (gen_AM) ! 213: tt.tt_col = 0, tt.tt_row++; ! 214: else ! 215: tt.tt_col--; ! 216: } ! 217: ! 218: gen_move(row, col) ! 219: register int row, col; ! 220: { ! 221: if (tt.tt_row == row && tt.tt_col == col) ! 222: return; ! 223: if (!gen_MI && tt.tt_insert) ! 224: gen_setinsert(0); ! 225: if (!gen_MS && tt.tt_modes) ! 226: gen_setmodes(0); ! 227: if (row < tt.tt_scroll_top || row > tt.tt_scroll_bot) ! 228: gen_setscroll(tt.tt_nrow - 1, 0); ! 229: if (tt.tt_row == row) { ! 230: if (col == 0) { ! 231: ttxputs(gen_CR); ! 232: goto out; ! 233: } ! 234: if (tt.tt_col == col - 1) { ! 235: if (gen_ND) { ! 236: ttxputs(gen_ND); ! 237: goto out; ! 238: } ! 239: } else if (tt.tt_col == col + 1) { ! 240: if (gen_BC) { ! 241: ttxputs(gen_BC); ! 242: goto out; ! 243: } ! 244: } ! 245: } ! 246: if (tt.tt_col == col) { ! 247: if (tt.tt_row == row + 1) { ! 248: if (gen_UP) { ! 249: ttxputs(gen_UP); ! 250: goto out; ! 251: } ! 252: } else if (tt.tt_row == row + 1) { ! 253: ttxputs(gen_NL); ! 254: goto out; ! 255: } ! 256: } ! 257: if (gen_HO && col == 0 && row == 0) { ! 258: ttxputs(gen_HO); ! 259: goto out; ! 260: } ! 261: tttgoto(gen_CM, col, row); ! 262: out: ! 263: tt.tt_col = col; ! 264: tt.tt_row = row; ! 265: } ! 266: ! 267: gen_init() ! 268: { ! 269: if (gen_VS) ! 270: ttxputs(gen_VS); ! 271: if (gen_TI) ! 272: ttxputs(gen_TI); ! 273: ttxputs(gen_CL); ! 274: tt.tt_col = tt.tt_row = 0; ! 275: tt.tt_ninsert = tt.tt_insert = 0; ! 276: tt.tt_nmodes = tt.tt_modes = 0; ! 277: } ! 278: ! 279: gen_end() ! 280: { ! 281: if (gen_TE) ! 282: ttxputs(gen_TE); ! 283: if (gen_VE) ! 284: ttxputs(gen_VE); ! 285: } ! 286: ! 287: gen_clreol() ! 288: { ! 289: if (tt.tt_modes) /* for concept 100 */ ! 290: gen_setmodes(0); ! 291: tttputs(gen_CE, gen_CO - tt.tt_col); ! 292: } ! 293: ! 294: gen_clreos() ! 295: { ! 296: if (tt.tt_modes) /* for concept 100 */ ! 297: gen_setmodes(0); ! 298: tttputs(gen_CD, gen_LI - tt.tt_row); ! 299: } ! 300: ! 301: gen_clear() ! 302: { ! 303: if (tt.tt_modes) /* for concept 100 */ ! 304: gen_setmodes(0); ! 305: ttxputs(gen_CL); ! 306: } ! 307: ! 308: gen_delchar() ! 309: { ! 310: tttputs(gen_DC, gen_CO - tt.tt_col); ! 311: } ! 312: ! 313: gen_scroll_down() ! 314: { ! 315: gen_move(tt.tt_scroll_bot, 0); ! 316: ttxputs(gen_SF); ! 317: } ! 318: ! 319: gen_scroll_up() ! 320: { ! 321: gen_move(tt.tt_scroll_top, 0); ! 322: ttxputs(gen_SR); ! 323: } ! 324: ! 325: gen_setscroll(top, bot) ! 326: { ! 327: tttgoto(gen_CS, bot, top); ! 328: tt.tt_scroll_top = top; ! 329: tt.tt_scroll_bot = bot; ! 330: tt.tt_row = tt.tt_col = -10; ! 331: } ! 332: ! 333: tt_generic() ! 334: { ! 335: gen_PC = tttgetstr("pc"); ! 336: PC = gen_PC ? *gen_PC->ts_str : 0; ! 337: ospeed = wwoldtty.ww_sgttyb.sg_ospeed; ! 338: ! 339: gen_CM = ttxgetstr("cm"); /* may not work */ ! 340: gen_IM = ttxgetstr("im"); ! 341: gen_IC = tttgetstr("ic"); ! 342: gen_IP = tttgetstr("ip"); ! 343: gen_EI = ttxgetstr("ei"); ! 344: gen_DC = tttgetstr("dc"); ! 345: gen_AL = tttgetstr("al"); ! 346: gen_DL = tttgetstr("dl"); ! 347: gen_CE = tttgetstr("ce"); ! 348: gen_CD = tttgetstr("cd"); ! 349: gen_CL = ttxgetstr("cl"); ! 350: gen_VS = ttxgetstr("vs"); ! 351: gen_VE = ttxgetstr("ve"); ! 352: gen_TI = ttxgetstr("ti"); ! 353: gen_TE = ttxgetstr("te"); ! 354: gen_SO = ttxgetstr("so"); ! 355: gen_SE = ttxgetstr("se"); ! 356: gen_US = ttxgetstr("us"); ! 357: gen_UE = ttxgetstr("ue"); ! 358: gen_UP = ttxgetstr("up"); ! 359: gen_BC = ttxgetstr("bc"); ! 360: gen_ND = ttxgetstr("nd"); ! 361: gen_HO = ttxgetstr("ho"); ! 362: gen_NL = ttxgetstr("nl"); ! 363: gen_CR = ttxgetstr("cr"); ! 364: gen_AS = ttxgetstr("as"); ! 365: gen_AE = ttxgetstr("ae"); ! 366: gen_XS = ttxgetstr("XS"); ! 367: gen_XE = ttxgetstr("XE"); ! 368: gen_SF = ttxgetstr("sf"); ! 369: gen_SR = ttxgetstr("sr"); ! 370: gen_CS = ttxgetstr("cs"); ! 371: gen_MI = tgetflag("mi"); ! 372: gen_MS = tgetflag("ms"); ! 373: gen_AM = tgetflag("am"); ! 374: gen_OS = tgetflag("os"); ! 375: gen_BS = tgetflag("bs"); ! 376: gen_DA = tgetflag("da"); ! 377: gen_DB = tgetflag("db"); ! 378: gen_NS = tgetflag("ns"); ! 379: gen_XN = tgetflag("xn"); ! 380: gen_CO = tgetnum("co"); ! 381: gen_LI = tgetnum("li"); ! 382: gen_UG = tgetnum("ug"); ! 383: gen_SG = tgetnum("sg"); ! 384: if (gen_CL == 0 || gen_OS || gen_CM == 0) ! 385: return -1; ! 386: ! 387: if (gen_NL == 0) { ! 388: static struct tt_str nl = { "\n", 1 }; ! 389: gen_NL = &nl; ! 390: } ! 391: if (gen_CR == 0) { ! 392: static struct tt_str cr = { "\r", 1 }; ! 393: gen_CR = &cr; ! 394: } ! 395: if (gen_BC == 0 && gen_BS) { ! 396: static struct tt_str bc = { "\b", 1 }; ! 397: gen_BC = &bc; ! 398: } ! 399: if (gen_SF == 0 && !gen_NS) ! 400: gen_SF = gen_NL; ! 401: BC = gen_BC ? gen_BC->ts_str : 0; ! 402: UP = gen_UP ? gen_UP->ts_str : 0; ! 403: ! 404: if (gen_DC) ! 405: tt.tt_delchar = gen_delchar; ! 406: if (gen_AL) ! 407: tt.tt_insline = gen_insline; ! 408: if (gen_DL) ! 409: tt.tt_delline = gen_delline; ! 410: if (gen_CE) ! 411: tt.tt_clreol = gen_clreol; ! 412: if (gen_CD) ! 413: tt.tt_clreos = gen_clreos; ! 414: if (gen_SF) ! 415: tt.tt_scroll_down = gen_scroll_down; ! 416: /* ! 417: * Don't allow scroll_up if da or db but not cs. ! 418: * See comment in wwscroll.c. ! 419: */ ! 420: if (gen_SR && (gen_CS || !gen_DA && !gen_DB)) ! 421: tt.tt_scroll_up = gen_scroll_up; ! 422: if (gen_CS) ! 423: tt.tt_setscroll = gen_setscroll; ! 424: if (gen_SG > 0) ! 425: gen_SO = 0; ! 426: if (gen_UG > 0 || gen_US && gen_SO && ttstrcmp(gen_US, gen_SO) == 0) ! 427: gen_US = 0; ! 428: if (gen_SO) ! 429: tt.tt_availmodes |= WWM_REV; ! 430: if (gen_US) ! 431: tt.tt_availmodes |= WWM_UL; ! 432: if (gen_AS) ! 433: tt.tt_availmodes |= WWM_GRP; ! 434: if (gen_XS) ! 435: tt.tt_availmodes |= WWM_USR; ! 436: tt.tt_hasinsert = gen_IM != 0; ! 437: tt.tt_wrap = gen_AM; ! 438: tt.tt_retain = gen_DB; ! 439: tt.tt_ncol = gen_CO; ! 440: tt.tt_nrow = gen_LI; ! 441: tt.tt_init = gen_init; ! 442: tt.tt_end = gen_end; ! 443: tt.tt_write = gen_write; ! 444: tt.tt_putc = gen_putc; ! 445: tt.tt_move = gen_move; ! 446: tt.tt_clear = gen_clear; ! 447: tt.tt_setinsert = gen_setinsert; ! 448: tt.tt_setmodes = gen_setmodes; ! 449: tt.tt_frame = gen_AS && ttstrcmp(gen_AS, &ansi_AS) == 0 ? ! 450: ansi_frame : gen_frame; ! 451: return 0; ! 452: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.