home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume8 / jove / part08 / term.c < prev    next >
Encoding:
C/C++ Source or Header  |  1987-02-03  |  3.6 KB  |  194 lines

  1. /************************************************************************
  2.  * This program is Copyright (C) 1986 by Jonathan Payne.  JOVE is       *
  3.  * 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 <errno.h>
  10. #ifdef SYSV
  11. #   include <termio.h>
  12. #else
  13. #   include <sgtty.h>
  14. #endif SYSV
  15.  
  16. #ifdef IPROCS
  17. #   include <signal.h>
  18. #endif
  19.  
  20. /* Termcap definitions */
  21.  
  22. char    *UP,
  23.     *CS,
  24.     *SO,
  25.     *SE,
  26.     *CM,
  27.     *CL,
  28.     *CE,
  29.     *HO,
  30.     *AL,
  31.     *DL,
  32.     *VS,
  33.     *VE,
  34.     *KS,
  35.     *KE,
  36.     *TI,
  37.     *TE,
  38.     *IC,
  39.     *DC,
  40.     *IM,
  41.     *EI,
  42.     *LL,
  43.     *BC,
  44.     *M_IC,    /* Insert char with arg */
  45.     *M_DC,    /* Delete char with arg */
  46.     *M_AL,    /* Insert line with arg */
  47.     *M_DL,    /* Delete line with arg */
  48.     *SF,    /* Scroll forward */
  49.     *SR,
  50.     *SP,    /* Send Cursor Position */
  51. #ifdef LSRHS
  52.     *RS,    /* Reverse video start */
  53.     *RE,    /* Reverse end */
  54. #endif
  55.     *VB,
  56.     *IP,    /* insert pad after character inserted */
  57.     *lPC;
  58.  
  59. int    LI,
  60.     ILI,    /* Internal lines, i.e., 23 of LI is 24. */
  61.     CO,
  62.  
  63.     UL,
  64.     MI,
  65.     SG,    /* number of magic cookies left by SO and SE */
  66.     XS,    /* whether standout is braindamaged */
  67.  
  68.     TABS,
  69.     UPlen,
  70.     HOlen,
  71.     LLlen;
  72.  
  73. #ifdef SYSV /* release 2, at least */
  74. char PC ;
  75. #else
  76. extern char    PC;
  77. #endif SYSV
  78.  
  79. static char    tspace[256];
  80.  
  81. /* The ordering of ts and meas must agree !! */
  82. #ifdef LSRHS
  83. static char    *ts="vsvealdlspcssosecmclcehoupbcicimdceillsfsrvbksketiteALDLICDCrsrepcip";
  84. static char    **meas[] = {
  85.     &VS, &VE, &AL, &DL, &SP, &CS, &SO, &SE,
  86.     &CM, &CL, &CE, &HO, &UP, &BC, &IC, &IM,
  87.     &DC, &EI, &LL, &SF, &SR, &VB, &KS, &KE,
  88.     &TI, &TE, &M_AL, &M_DL, &M_IC, &M_DC,
  89.     &RS, &RE, &lPC, &IP, 0
  90. };
  91. #else
  92. static char    *ts="vsvealdlspcssosecmclcehoupbcicimdceillsfsrvbksketiteALDLICDCpcip";
  93. static char    **meas[] = {
  94.     &VS, &VE, &AL, &DL, &SP, &CS, &SO, &SE,
  95.     &CM, &CL, &CE, &HO, &UP, &BC, &IC, &IM,
  96.     &DC, &EI, &LL, &SF, &SR, &VB, &KS, &KE,
  97.     &TI, &TE, &M_AL, &M_DL, &M_IC, &M_DC,
  98.     &lPC, &IP, 0
  99. };
  100. #endif
  101.  
  102. static
  103. gets(buf)
  104. char    *buf;
  105. {
  106.     buf[read(0, buf, 12) - 1] = 0;
  107. }    
  108.  
  109. /* VARARGS1 */
  110.  
  111. static
  112. TermError(fmt, a)
  113. char    *fmt;
  114. {
  115.     printf(fmt, a);
  116.     _exit(1);
  117. }
  118.  
  119. getTERM()
  120. {
  121.     char    *getenv(), *tgetstr() ;
  122.     char    termbuf[13],
  123.         *termname = 0,
  124.         *termp = tspace,
  125.         tbuff[2048];    /* Good grief! */
  126.     int    i;
  127.  
  128.     termname = getenv("TERM");
  129.     if (termname == 0) {
  130.         putstr("Enter terminal name: ");
  131.         gets(termbuf);
  132.         if (termbuf[0] == 0)
  133.             TermError(NullStr);
  134.  
  135.         termname = termbuf;
  136.     }
  137.  
  138.     if (tgetent(tbuff, termname) < 1)
  139.         TermError("[\"%s\" unknown terminal type?]", termname);
  140.  
  141.     if ((CO = tgetnum("co")) == -1)
  142.         TermError("columns?");
  143.  
  144.     if ((LI = tgetnum("li")) == -1)
  145.         TermError("lines?");
  146.  
  147.     if ((SG = tgetnum("sg")) == -1)
  148.         SG = 0;            /* Used for mode line only */
  149.  
  150.     if ((XS = tgetflag("xs")) == -1)
  151.         XS = 0;            /* Used for mode line only */
  152.  
  153.     for (i = 0; meas[i]; i++) {
  154.         *(meas[i]) = (char *) tgetstr(ts, &termp);
  155.         ts += 2;
  156.     }
  157.     if (lPC)
  158.         PC = *lPC;
  159.     if (XS)
  160.         SO = SE = 0;
  161.  
  162.     if (CS && !SR)
  163.         CS = SR = SF = 0;
  164.  
  165.     if (CS && !SF)
  166.         SF = "\n";
  167.  
  168.     if (IM && (*IM == 0))
  169.         IM = 0;
  170.     else
  171.         MI = tgetflag("mi");
  172.  
  173.     UL = tgetflag("ul");
  174.  
  175. #ifdef LSRHS        /* We, at the high school, are the only ones who
  176.                do SO right in termcap, but unfortunately the
  177.                right SO doesn't look as good with modelines. */
  178.     if (RS)
  179.         SO = RS;
  180.     if (RE)
  181.         SE = RE;
  182.             /* I only ever use SO for the modeline anyway. */
  183.  
  184. /* SO is really BOLDFACE!  Why is LS always right and the rest of the
  185.    world wrong? */
  186. #endif
  187. #ifdef ID_CHAR
  188.     disp_opt_init();
  189. #endif
  190.     if (CanScroll = ((AL && DL) || CS))
  191.         IDline_setup(termname);
  192. }
  193.  
  194.