1: #ifndef lint 2: static char sccsid[] = "@(#)ttgeneric.c 3.29 5/2/86"; 3: #endif 4: 5: /* 6: * Copyright (c) 1983 Regents of the University of California, 7: * All rights reserved. Redistribution permitted subject to 8: * the terms of the Berkeley Software License Agreement. 9: */ 10: 11: #include "ww.h" 12: #include "tt.h" 13: 14: char PC, *BC, *UP; 15: short ospeed; 16: 17: /* normal frame */ 18: short gen_frame[16] = { 19: ' ', '|', '-', '+', 20: '|', '|', '+', '+', 21: '-', '+', '-', '+', 22: '+', '+', '+', '+' 23: }; 24: 25: /* ANSI graphics frame */ 26: #define G (WWM_GRP << WWC_MSHIFT) 27: short ansi_frame[16] = { 28: ' ', 'x'|G, 'Q'|G, 'm'|G, 29: 'x'|G, 'x'|G, 'l'|G, 't'|G, 30: 'q'|G, 'j'|G, 'q'|G, 'v'|G, 31: 'k'|G, 'u'|G, 'w'|G, 'n'|G 32: }; 33: #define ANSI_AS "\033(0" /* ) */ 34: 35: struct tt_str *gen_CM; 36: struct tt_str *gen_IM; 37: struct tt_str *gen_IC; 38: struct tt_str *gen_IP; 39: struct tt_str *gen_EI; 40: struct tt_str *gen_DC; 41: struct tt_str *gen_AL; 42: struct tt_str *gen_DL; 43: struct tt_str *gen_CE; 44: struct tt_str *gen_CD; 45: struct tt_str *gen_CL; 46: struct tt_str *gen_VS; 47: struct tt_str *gen_VE; 48: struct tt_str *gen_TI; 49: struct tt_str *gen_TE; 50: struct tt_str *gen_SO; 51: struct tt_str *gen_SE; 52: struct tt_str *gen_US; 53: struct tt_str *gen_UE; 54: struct tt_str *gen_UP; 55: struct tt_str *gen_PC; 56: struct tt_str *gen_BC; 57: struct tt_str *gen_ND; 58: struct tt_str *gen_HO; 59: struct tt_str *gen_NL; 60: struct tt_str *gen_AS; 61: struct tt_str *gen_AE; 62: struct tt_str *gen_XS; 63: struct tt_str *gen_XE; 64: char gen_MI; 65: char gen_MS; 66: char gen_AM; 67: char gen_OS; 68: char gen_BS; 69: char gen_DB; 70: int gen_CO; 71: int gen_LI; 72: int gen_UG; 73: int gen_SG; 74: 75: gen_setinsert(new) 76: char new; 77: { 78: if (new) { 79: if (gen_IM) 80: ttxputs(gen_IM); 81: } else 82: if (gen_EI) 83: ttxputs(gen_EI); 84: tt.tt_insert = new; 85: } 86: 87: gen_setmodes(new) 88: register new; 89: { 90: register diff; 91: 92: diff = new ^ tt.tt_modes; 93: if (diff & WWM_REV) { 94: if (new & WWM_REV) { 95: if (gen_SO) 96: ttxputs(gen_SO); 97: } else 98: if (gen_SE) 99: ttxputs(gen_SE); 100: } 101: if (diff & WWM_UL) { 102: if (new & WWM_UL) { 103: if (gen_US) 104: ttxputs(gen_US); 105: } else 106: if (gen_UE) 107: ttxputs(gen_UE); 108: } 109: if (diff & WWM_GRP) { 110: if (new & WWM_GRP) { 111: if (gen_AS) 112: ttxputs(gen_AS); 113: } else 114: if (gen_AE) 115: ttxputs(gen_AE); 116: } 117: if (diff & WWM_USR) { 118: if (new & WWM_USR) { 119: if (gen_XS) 120: ttxputs(gen_XS); 121: } else 122: if (gen_XE) 123: ttxputs(gen_XE); 124: } 125: tt.tt_modes = new; 126: } 127: 128: gen_insline() 129: { 130: if (tt.tt_modes) /* for concept 100 */ 131: gen_setmodes(0); 132: if (gen_AL) 133: tttputs(gen_AL, gen_LI - tt.tt_row); 134: } 135: 136: gen_delline() 137: { 138: if (tt.tt_modes) /* for concept 100 */ 139: gen_setmodes(0); 140: if (gen_DL) 141: tttputs(gen_DL, gen_LI - tt.tt_row); 142: } 143: 144: gen_putc(c) 145: register char c; 146: { 147: if (tt.tt_ninsert != tt.tt_insert) 148: gen_setinsert(tt.tt_ninsert); 149: if (tt.tt_nmodes != tt.tt_modes) 150: gen_setmodes(tt.tt_nmodes); 151: if (tt.tt_insert) { 152: if (gen_IC) 153: tttputs(gen_IC, gen_CO - tt.tt_col); 154: ttputc(c); 155: if (gen_IP) 156: tttputs(gen_IP, gen_CO - tt.tt_col); 157: } else 158: ttputc(c); 159: if (++tt.tt_col == gen_CO) 160: if (gen_AM) 161: tt.tt_col = 0, tt.tt_row++; 162: else 163: tt.tt_col--; 164: } 165: 166: gen_write(p, n) 167: register char *p; 168: register n; 169: { 170: if (tt.tt_ninsert != tt.tt_insert) 171: gen_setinsert(tt.tt_ninsert); 172: if (tt.tt_nmodes != tt.tt_modes) 173: gen_setmodes(tt.tt_nmodes); 174: if (tt.tt_insert && (gen_IC || gen_IP)) { 175: while (--n >= 0) { 176: if (gen_IC) 177: tttputs(gen_IC, gen_CO - tt.tt_col); 178: ttputc(*p++); 179: if (gen_IP) 180: tttputs(gen_IP, gen_CO - tt.tt_col); 181: tt.tt_col++; 182: } 183: } else { 184: tt.tt_col += n; 185: ttwrite(p, n); 186: } 187: if (tt.tt_col == gen_CO) 188: if (gen_AM) 189: tt.tt_col = 0, tt.tt_row++; 190: else 191: tt.tt_col--; 192: } 193: 194: gen_move(row, col) 195: register char row, col; 196: { 197: if (tt.tt_row == row && tt.tt_col == col) 198: return; 199: if (!gen_MI && tt.tt_insert) 200: gen_setinsert(0); 201: if (!gen_MS && tt.tt_modes) 202: gen_setmodes(0); 203: if (tt.tt_row == row) { 204: if (tt.tt_col == col) 205: return; 206: if (tt.tt_col == col - 1) { 207: if (gen_ND) { 208: ttxputs(gen_ND); 209: goto out; 210: } 211: } else if (tt.tt_col == col + 1) { 212: if (gen_BC) { 213: ttxputs(gen_BC); 214: goto out; 215: } 216: } 217: } 218: if (tt.tt_col == col) { 219: if (tt.tt_row == row + 1) { 220: if (gen_UP) { 221: ttxputs(gen_UP); 222: goto out; 223: } 224: } else if (tt.tt_row == row + 1) { 225: ttxputs(gen_NL); 226: goto out; 227: } 228: } 229: if (gen_HO && col == 0 && row == 0) { 230: ttxputs(gen_HO); 231: goto out; 232: } 233: tttgoto(gen_CM, col, row); 234: out: 235: tt.tt_col = col; 236: tt.tt_row = row; 237: } 238: 239: gen_init() 240: { 241: if (gen_VS) 242: ttxputs(gen_VS); 243: if (gen_TI) 244: ttxputs(gen_TI); 245: ttxputs(gen_CL); 246: tt.tt_col = tt.tt_row = 0; 247: tt.tt_ninsert = tt.tt_insert = 0; 248: tt.tt_nmodes = tt.tt_modes = 0; 249: } 250: 251: gen_end() 252: { 253: if (gen_TE) 254: ttxputs(gen_TE); 255: if (gen_VE) 256: ttxputs(gen_VE); 257: } 258: 259: gen_clreol() 260: { 261: if (tt.tt_modes) /* for concept 100 */ 262: gen_setmodes(0); 263: tttputs(gen_CE, gen_CO - tt.tt_col); 264: } 265: 266: gen_clreos() 267: { 268: if (tt.tt_modes) /* for concept 100 */ 269: gen_setmodes(0); 270: tttputs(gen_CD, gen_LI - tt.tt_row); 271: } 272: 273: gen_clear() 274: { 275: if (tt.tt_modes) /* for concept 100 */ 276: gen_setmodes(0); 277: ttxputs(gen_CL); 278: } 279: 280: gen_delchar() 281: { 282: tttputs(gen_DC, gen_CO - tt.tt_col); 283: } 284: 285: tt_generic() 286: { 287: gen_PC = tttgetstr("pc"); 288: PC = gen_PC ? *gen_PC->ts_str : 0; 289: ospeed = wwoldtty.ww_sgttyb.sg_ospeed; 290: 291: gen_CM = ttxgetstr("cm"); /* may not work */ 292: gen_IM = ttxgetstr("im"); 293: gen_IC = tttgetstr("ic"); 294: gen_IP = tttgetstr("ip"); 295: gen_EI = ttxgetstr("ei"); 296: gen_DC = tttgetstr("dc"); 297: gen_AL = tttgetstr("al"); 298: gen_DL = tttgetstr("dl"); 299: gen_CE = tttgetstr("ce"); 300: gen_CD = tttgetstr("cd"); 301: gen_CL = ttxgetstr("cl"); 302: gen_VS = ttxgetstr("vs"); 303: gen_VE = ttxgetstr("ve"); 304: gen_TI = ttxgetstr("ti"); 305: gen_TE = ttxgetstr("te"); 306: gen_SO = ttxgetstr("so"); 307: gen_SE = ttxgetstr("se"); 308: gen_US = ttxgetstr("us"); 309: gen_UE = ttxgetstr("ue"); 310: gen_UP = ttxgetstr("up"); 311: gen_BC = ttxgetstr("bc"); 312: gen_ND = ttxgetstr("nd"); 313: gen_HO = ttxgetstr("ho"); 314: gen_NL = ttxgetstr("nl"); 315: gen_AS = ttxgetstr("as"); 316: gen_AE = ttxgetstr("ae"); 317: gen_XS = ttxgetstr("XS"); 318: gen_XE = ttxgetstr("XE"); 319: gen_MI = tgetflag("mi"); 320: gen_MS = tgetflag("ms"); 321: gen_AM = tgetflag("am"); 322: gen_OS = tgetflag("os"); 323: gen_BS = tgetflag("bs"); 324: gen_DB = tgetflag("db"); 325: gen_CO = tgetnum("co"); 326: gen_LI = tgetnum("li"); 327: gen_UG = tgetnum("ug"); 328: gen_SG = tgetnum("sg"); 329: 330: if (gen_NL == 0) { 331: static struct tt_str nl = { "\n", 1 }; 332: gen_NL = &nl; 333: } 334: if (gen_BC == 0 && gen_BS) { 335: static struct tt_str bc = { "\b", 1 }; 336: gen_BC = &bc; 337: } 338: BC = gen_BC ? gen_BC->ts_str : 0; 339: UP = gen_UP ? gen_UP->ts_str : 0; 340: if (gen_CL == 0 || gen_OS || gen_CM == 0) 341: return -1; 342: 343: if (gen_DC) 344: tt.tt_delchar = gen_delchar; 345: if (gen_AL) 346: tt.tt_insline = gen_insline; 347: if (gen_DL) 348: tt.tt_delline = gen_delline; 349: if (gen_CE) 350: tt.tt_clreol = gen_clreol; 351: if (gen_CD) 352: tt.tt_clreos = gen_clreos; 353: if (gen_SG > 0) 354: gen_SO = 0; 355: if (gen_UG > 0) 356: gen_US = 0; 357: if (gen_SO) 358: tt.tt_availmodes |= WWM_REV; 359: if (gen_US) 360: tt.tt_availmodes |= WWM_UL; 361: if (gen_AS) 362: tt.tt_availmodes |= WWM_GRP; 363: if (gen_XS) 364: tt.tt_availmodes |= WWM_USR; 365: tt.tt_hasinsert = gen_IM != 0; 366: tt.tt_wrap = gen_AM; 367: tt.tt_retain = gen_DB; 368: tt.tt_ncol = gen_CO; 369: tt.tt_nrow = gen_LI; 370: tt.tt_init = gen_init; 371: tt.tt_end = gen_end; 372: tt.tt_write = gen_write; 373: tt.tt_putc = gen_putc; 374: tt.tt_move = gen_move; 375: tt.tt_clear = gen_clear; 376: tt.tt_setinsert = gen_setinsert; 377: tt.tt_setmodes = gen_setmodes; 378: tt.tt_frame = gen_AS && !strncmp(gen_AS->ts_str, ANSI_AS, gen_AS->ts_n) 379: ? ansi_frame : gen_frame; 380: return 0; 381: }