|
|
1.1 ! root 1: /*************************************************************************** ! 2: * This program is Copyright (C) 1986, 1987, 1988 by Jonathan Payne. JOVE * ! 3: * is provided to you without charge, and with no warranty. You may give * ! 4: * away copies of JOVE, including sources, provided that this notice is * ! 5: * included in all the files. * ! 6: ***************************************************************************/ ! 7: ! 8: #include "jove.h" ! 9: #include "fp.h" ! 10: #include "disp.h" ! 11: #include <ctype.h> ! 12: #include <errno.h> ! 13: ! 14: #ifndef MAC /* most of the file... */ ! 15: ! 16: # ifdef STDARGS ! 17: # include <stdarg.h> ! 18: # else ! 19: # include <varargs.h> ! 20: # endif ! 21: ! 22: #ifndef MSDOS ! 23: # ifdef SYSV ! 24: # include <termio.h> ! 25: # else ! 26: # include <sgtty.h> ! 27: # endif /* SYSV */ ! 28: #endif /* MSDOS */ ! 29: ! 30: #ifdef IPROCS ! 31: # include <signal.h> ! 32: #endif ! 33: ! 34: #include "termcap.h" ! 35: ! 36: /* Termcap definitions */ ! 37: ! 38: #ifndef IBMPC ! 39: char *CS, ! 40: *SO, ! 41: *SE, ! 42: *CM, ! 43: *CL, ! 44: *CE, ! 45: *HO, ! 46: *AL, ! 47: *DL, ! 48: *VS, ! 49: *VE, ! 50: *KS, ! 51: *KE, ! 52: *TI, ! 53: *TE, ! 54: *IC, ! 55: *DC, ! 56: *IM, ! 57: *EI, ! 58: *LL, ! 59: *M_IC, /* Insert char with arg */ ! 60: *M_DC, /* Delete char with arg */ ! 61: *M_AL, /* Insert line with arg */ ! 62: *M_DL, /* Delete line with arg */ ! 63: *SF, /* Scroll forward */ ! 64: *SR, ! 65: *SP, /* Send Cursor Position */ ! 66: *VB, ! 67: *BL, ! 68: *IP, /* insert pad after character inserted */ ! 69: *lPC, ! 70: *NL, ! 71: *DO; ! 72: #endif ! 73: ! 74: int LI, ! 75: ILI, /* Internal lines, i.e., 23 of LI is 24. */ ! 76: CO, ! 77: ! 78: UL, ! 79: MI, ! 80: SG, /* number of magic cookies left by SO and SE */ ! 81: XS, /* whether standout is braindamaged */ ! 82: HZ, /* Hazeltine tilde kludge */ ! 83: ! 84: TABS, ! 85: UPlen, ! 86: HOlen, ! 87: LLlen; ! 88: ! 89: #ifdef notdef ! 90: /* ! 91: * Are you sure about this one Jon? On the SYSV system I tried this ! 92: * on I got a multiple definition of PC because it was already ! 93: * defined in -ltermcap. Similarly for BC and UP ... ! 94: */ ! 95: # ifdef SYSVR2 /* release 2, at least */ ! 96: char PC; ! 97: # endif /* SYSVR2 */ ! 98: #endif ! 99: ! 100: #ifndef IBMPC ! 101: private char tspace[256]; ! 102: ! 103: /* The ordering of ts and meas must agree !! */ ! 104: private const char ts[] = ! 105: "vsvealdlspcssosecmclcehoupbcicimdceillsfsrvbksketiteALDLICDCpcipblnldo"; ! 106: private char **const meas[] = { ! 107: &VS, &VE, &AL, &DL, &SP, &CS, &SO, &SE, ! 108: &CM, &CL, &CE, &HO, &UP, &BC, &IC, &IM, ! 109: &DC, &EI, &LL, &SF, &SR, &VB, &KS, &KE, ! 110: &TI, &TE, &M_AL, &M_DL, &M_IC, &M_DC, ! 111: &lPC, &IP, &BL, &NL, &DO, 0 ! 112: }; ! 113: ! 114: private void ! 115: TermError() ! 116: { ! 117: flusho(); ! 118: _exit(1); ! 119: } ! 120: ! 121: void ! 122: getTERM() ! 123: { ! 124: extern char *getenv(), *tgetstr() ; ! 125: char termbuf[13], ! 126: *termname = NULL, ! 127: *termp = tspace, ! 128: tbuff[2048]; /* Good grief! */ ! 129: const char *tsp = ts; ! 130: int i; ! 131: ! 132: termname = getenv("TERM"); ! 133: if ((termname == NULL) || (*termname == '\0') || ! 134: (strcmp(termname, "dumb") == 0) || ! 135: (strcmp(termname, "unknown") == 0) || ! 136: (strcmp(termname, "network") == 0)) { ! 137: putstr("Enter terminal type (e.g, vt100): "); ! 138: flusho(); ! 139: termbuf[read(0, termbuf, sizeof(termbuf)) - 1] = '\0'; ! 140: if (termbuf[0] == 0) ! 141: TermError(); ! 142: ! 143: termname = termbuf; ! 144: } ! 145: ! 146: if (tgetent(tbuff, termname) < 1) { ! 147: writef("[\"%s\" unknown terminal type?]", termname); ! 148: TermError(); ! 149: } ! 150: if ((CO = tgetnum("co")) == -1) { ! 151: wimperr: ! 152: writef("You can't run JOVE on a %s terminal.\n", termname); ! 153: TermError(); ! 154: /*NOTREACHED*/ ! 155: } ! 156: ! 157: else if (CO > MAXCOLS) ! 158: CO = MAXCOLS; ! 159: ! 160: if ((LI = tgetnum("li")) == -1) ! 161: goto wimperr; ! 162: ! 163: if ((SG = tgetnum("sg")) == -1) ! 164: SG = 0; /* Used for mode line only */ ! 165: ! 166: if ((XS = tgetflag("xs")) == -1) ! 167: XS = 0; /* Used for mode line only */ ! 168: ! 169: if ((HZ = tgetflag("hz")) == -1) ! 170: HZ = 0; /* Hazeltine tilde kludge */ ! 171: ! 172: for (i = 0; meas[i]; i++) { ! 173: static char nm[3] = "xx"; ! 174: ! 175: nm[0] = *tsp++; ! 176: nm[1] = *tsp++; ! 177: *(meas[i]) = (char *) tgetstr(nm, &termp); ! 178: if (termp > tspace + sizeof(tspace)) ! 179: goto wimperr; ! 180: } ! 181: if (lPC) ! 182: PC = *lPC; ! 183: if (XS) ! 184: SO = SE = 0; ! 185: ! 186: if (CS && !SR) ! 187: CS = SR = SF = 0; ! 188: ! 189: if (CS && !SF) ! 190: SF = "\n"; ! 191: ! 192: if (IM && (*IM == 0)) ! 193: IM = 0; ! 194: else ! 195: MI = tgetflag("mi"); ! 196: ! 197: UL = tgetflag("ul"); ! 198: ! 199: if (NL == 0) ! 200: NL = "\n"; ! 201: else { /* strip stupid padding information */ ! 202: while (isdigit(*NL)) ! 203: NL += 1; ! 204: if (*NL == '*') ! 205: NL += 1; ! 206: } ! 207: if (!DO) ! 208: DO = NL; ! 209: ! 210: if (BL == 0) ! 211: BL = "\007"; ! 212: ! 213: if (tgetflag("km") > 0) /* has meta-key */ ! 214: MetaKey = YES; ! 215: ! 216: #ifdef ID_CHAR ! 217: disp_opt_init(); ! 218: #endif ! 219: if ((CanScroll = ((AL && DL) || CS)) != 0) ! 220: IDline_setup(termname); ! 221: } ! 222: ! 223: #else ! 224: ! 225: void ! 226: InitCM() ! 227: { ! 228: } ! 229: ! 230: int EGA; ! 231: ! 232: void ! 233: getTERM() ! 234: { ! 235: char *getenv(), *tgetstr() ; ! 236: char *termname; ! 237: void init_43(), init_term(); ! 238: unsigned char lpp(), chpl(); ! 239: ! 240: if (getenv("EGA") || (!stricmp(getenv("TERM"), "EGA"))) { ! 241: termname = "ega"; ! 242: init_43(); ! 243: EGA = 1; ! 244: } ! 245: else { ! 246: termname = "ibmpc"; ! 247: init_term(); ! 248: EGA = 0; ! 249: } ! 250: ! 251: CO = chpl(); ! 252: LI = lpp(); ! 253: ! 254: SG = 0; /* Used for mode line only */ ! 255: XS = 0; /* Used for mode line only */ ! 256: ! 257: CanScroll = 1; ! 258: } ! 259: ! 260: #endif /* IBMPC */ ! 261: ! 262: #else /* MAC */ ! 263: int LI, ! 264: ILI, /* Internal lines, i.e., 23 of LI is 24. */ ! 265: CO, ! 266: TABS, ! 267: SG; ! 268: ! 269: void getTERM() ! 270: { ! 271: SG = 0; ! 272: CanScroll = 1; ! 273: } ! 274: ! 275: #endif /* MAC */ ! 276: ! 277: /* put a string with padding */ ! 278: ! 279: #ifndef IBMPC ! 280: private void ! 281: tputc(c) ! 282: int c; ! 283: { ! 284: jputchar(c); ! 285: } ! 286: #endif /* IBMPC */ ! 287: ! 288: #ifndef MAC ! 289: void ! 290: putpad(str, lines) ! 291: char *str; ! 292: int lines; ! 293: { ! 294: #ifndef IBMPC ! 295: if (str) ! 296: tputs(str, lines, tputc); ! 297: #else /* IBMPC */ ! 298: write_emif(str); ! 299: #endif /* IBMPC */ ! 300: } ! 301: ! 302: void ! 303: putargpad(str, arg, lines) ! 304: char *str; ! 305: int arg, ! 306: lines; ! 307: { ! 308: #ifndef IBMPC ! 309: if (str) { ! 310: tputs( ! 311: #ifdef TERMINFO ! 312: tparm(str, arg), ! 313: #else /* TERMINFO */ ! 314: tgoto(str, 0, arg), /* fudge */ ! 315: #endif /* TERMINFO */ ! 316: lines, tputc); ! 317: } ! 318: #else /* IBMPC */ ! 319: /* This code is only a guess: I don't know if any M_* termcap ! 320: * attributes are defined for the PC. If they are not used, ! 321: * this routine is not called. Perhaps this routine should ! 322: * simply abort. ! 323: */ ! 324: if (str) { ! 325: char buf[16]; /* hope that this is long enough */ ! 326: ! 327: swritef(buf, str, arg); /* hope only %d appears in str */ ! 328: write_em(buf); ! 329: } ! 330: #endif /* IBMPC */ ! 331: } ! 332: ! 333: #endif /* MAC */ ! 334: ! 335: /* Determine the number of characters to buffer at each baud rate. The ! 336: lower the number, the quicker the response when new input arrives. Of ! 337: course the lower the number, the more prone the program is to stop in ! 338: output. Decide what matters most to you. This sets BufSize to the right ! 339: number or chars, and initializes `stdout'. */ ! 340: ! 341: void ! 342: settout(ttbuf) ! 343: char *ttbuf; ! 344: { ! 345: int speed_chars; ! 346: static const int speeds[] = { ! 347: 1, /* 0 */ ! 348: 1, /* 50 */ ! 349: 1, /* 75 */ ! 350: 1, /* 110 */ ! 351: 1, /* 134 */ ! 352: 1, /* 150 */ ! 353: 1, /* 200 */ ! 354: 2, /* 300 */ ! 355: 4, /* 600 */ ! 356: 8, /* 1200 */ ! 357: 16, /* 1800 */ ! 358: 32, /* 2400 */ ! 359: 128, /* 4800 */ ! 360: 256, /* 9600 */ ! 361: 512, /* EXTA */ ! 362: 1024 /* EXT */ ! 363: }; ! 364: ! 365: #if (defined(MSDOS) || defined(MAC)) ! 366: speed_chars = 256; ! 367: #else ! 368: speed_chars = speeds[ospeed]; ! 369: #endif ! 370: flusho(); /* flush the one character buffer */ ! 371: BufSize = min(MAXTTYBUF, speed_chars * max(LI / 24, 1)); ! 372: stdout = fd_open("/dev/tty", F_WRITE|F_LOCKED, 1, ttbuf, BufSize); ! 373: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.