source: trunk/third/nmh/uip/termsbr.c @ 12455

Revision 12455, 3.5 KB checked in by danw, 26 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r12454, which included commits to RCS files with non-trunk default branches.
Line 
1
2/*
3 * termsbr.c -- termcap support
4 *
5 * $Id: termsbr.c,v 1.1.1.1 1999-02-07 18:14:17 danw Exp $
6 */
7
8#include <h/mh.h>
9
10#ifdef HAVE_TERMIOS_H
11# include <termios.h>
12#else
13# ifdef HAVE_TERMIO_H
14#  include <termio.h>
15# else
16#  include <sgtty.h>
17# endif
18#endif
19
20#ifdef HAVE_TERMCAP_H
21# include <termcap.h>
22#endif
23
24#ifdef GWINSZ_IN_SYS_IOCTL
25# include <sys/ioctl.h>
26#endif
27#ifdef WINSIZE_IN_PTEM
28# include <sys/stream.h>
29# include <sys/ptem.h>
30#endif
31
32#if BUFSIZ<2048
33# define TXTSIZ 2048
34#else
35# define TXTSIZ BUFSIZ
36#endif
37
38/*
39 * These variables are sometimes defined in,
40 * and needed by the termcap library.
41 */
42#ifdef HAVE_OSPEED
43# ifdef MUST_DEFINE_OSPEED
44extern short ospeed;
45extern char PC;
46# endif
47#else
48short ospeed;
49char PC;
50#endif
51
52static long speedcode;
53
54static int initLI = 0;
55static int initCO = 0;
56
57static int HC = 0;       /* are we on a hardcopy terminal?        */
58static int LI = 40;      /* number of lines                       */
59static int CO = 80;      /* number of colums                      */
60static char *CL = NULL;  /* termcap string to clear screen        */
61static char *SE = NULL;  /* termcap string to end standout mode   */
62static char *SO = NULL;  /* termcap string to begin standout mode */
63
64static char termcap[TXTSIZ];
65
66
67static void
68read_termcap(void)
69{
70    char *bp, *cp;
71    char *term;
72
73#ifndef TGETENT_ACCEPTS_NULL
74    char termbuf[TXTSIZ];
75#endif
76
77#ifdef HAVE_TERMIOS_H
78    struct termios tio;
79#else
80# ifdef HAVE_TERMIO_H
81    struct termio tio;
82# else
83    struct sgttyb tio;
84# endif
85#endif
86
87    static int inited = 0;
88
89    if (inited++)
90        return;
91
92    if (!(term = getenv ("TERM")))
93        return;
94
95/*
96 * If possible, we let tgetent allocate its own termcap buffer
97 */
98#ifdef TGETENT_ACCEPTS_NULL
99    if (tgetent (NULL, term) <= 0)
100        return
101#else
102    if (tgetent (termbuf, term) <= 0)
103        return;
104#endif
105
106#ifdef HAVE_TERMIOS_H
107    speedcode = cfgetospeed(&tio);
108#else
109# ifdef HAVE_TERMIO_H
110    speedcode = ioctl(fileno(stdout), TCGETA, &tio) != NOTOK ? tio.c_cflag & CBAUD : 0;
111# else
112    speedcode = ioctl(fileno(stdout), TIOCGETP, (char *) &tio) != NOTOK ? tio.sg_ospeed : 0;
113# endif
114#endif
115
116    HC = tgetflag ("hc");
117
118    if (!initCO && (CO = tgetnum ("co")) <= 0)
119        CO = 80;
120    if (!initLI && (LI = tgetnum ("li")) <= 0)
121        LI = 24;
122
123    cp = termcap;
124    CL = tgetstr ("cl", &cp);
125    if ((bp = tgetstr ("pc", &cp)))
126        PC = *bp;
127    if (tgetnum ("sg") <= 0) {
128        SE = tgetstr ("se", &cp);
129        SO = tgetstr ("so", &cp);
130    }
131}
132
133
134int
135sc_width (void)
136{
137#ifdef TIOCGWINSZ
138    struct winsize win;
139    int width;
140
141    if (ioctl (fileno (stderr), TIOCGWINSZ, &win) != NOTOK
142            && (width = win.ws_col) > 0) {
143        CO = width;
144        initCO++;
145    } else
146#endif /* TIOCGWINSZ */
147        read_termcap();
148
149    return CO;
150}
151
152
153int
154sc_length (void)
155{
156#ifdef TIOCGWINSZ
157    struct winsize win;
158
159    if (ioctl (fileno (stderr), TIOCGWINSZ, &win) != NOTOK
160            && (LI = win.ws_row) > 0)
161        initLI++;
162    else
163#endif /* TIOCGWINSZ */
164        read_termcap();
165
166    return LI;
167}
168
169
170static int
171outc (int c)
172{
173    putchar(c);
174}
175
176
177void
178clear_screen (void)
179{
180    read_termcap ();
181
182    if (CL && speedcode)
183        tputs (CL, LI, outc);
184    else {
185        printf ("\f");
186        if (speedcode)
187            printf ("\200");
188    }
189
190    fflush (stdout);
191}
192
193
194/*
195 * print in standout mode
196 */
197int
198SOprintf (char *fmt, ...)
199{
200    va_list ap;
201
202    read_termcap ();
203    if (!(SO && SE))
204        return NOTOK;
205
206    tputs (SO, 1, outc);
207
208    va_start(ap, fmt);
209    vprintf (fmt, ap);
210    va_end(ap);
211
212    tputs (SE, 1, outc);
213
214    return OK;
215}
216
217/*
218 * Is this a hardcopy terminal?
219 */
220
221int
222sc_hardcopy(void)
223{
224    read_termcap();
225    return HC;
226}
227
Note: See TracBrowser for help on using the repository browser.