|
|
1.1 root 1: /* trmsbr.c - minor termcap support (load with -ltermlib) */
2:
3: #include "../h/mh.h"
4: #include <stdio.h>
5: #ifndef SYS5
6: #include <sgtty.h>
7: #else SYS5
8: #include <sys/types.h>
9: #include <termio.h>
10: #include <sys/ioctl.h>
11: #endif SYS5
12: #include <ctype.h>
13:
14:
15: #if BUFSIZ<2048
16: #define TXTSIZ 2048
17: #else
18: #define TXTSIZ BUFSIZ
19: #endif
20:
21: char PC;
22: short ospeed;
23:
24: int tgetent (), tgetnum ();
25: char *tgetstr ();
26:
27: /* */
28:
29: static int TCinited = 0;
30: static int initLI = 0;
31: static int LI = 40;
32: static int initCO = 0;
33: static int CO = 80;
34: static char *CL = NULL;
35: static char *SE = NULL;
36: static char *SO = NULL;
37:
38: static char termcap[TXTSIZ];
39:
40: /* */
41:
42: static void
43: read_termcap()
44: {
45: register char *bp,
46: *term;
47: char *cp,
48: myterm[TXTSIZ];
49: #ifndef SYS5
50: struct sgttyb sg;
51: #else SYS5
52: struct termio sg;
53: #endif SYS5
54:
55: if (TCinited)
56: return;
57:
58: ++TCinited;
59: if ((term = getenv ("TERM")) == NULL || tgetent (myterm, term) <= OK)
60: return;
61:
62: #ifndef SYS5
63: ospeed = ioctl (fileno (stdout), TIOCGETP, (char *) &sg) != NOTOK
64: ? sg.sg_ospeed : 0;
65: #else SYS5
66: ospeed = ioctl (fileno (stdout), TCGETA, &sg) != NOTOK
67: ? sg.c_cflag & CBAUD : 0;
68: #endif SYS5
69:
70: if (!initCO && (CO = tgetnum ("co")) <= 0)
71: CO = 80;
72: if (!initLI && (LI = tgetnum ("li")) <= 0)
73: LI = 24;
74:
75: cp = termcap;
76: CL = tgetstr ("cl", &cp);
77: if (bp = tgetstr ("pc", &cp))
78: PC = *bp;
79: if (tgetnum ("sg") <= 0) {
80: SE = tgetstr ("se", &cp);
81: SO = tgetstr ("so", &cp);
82: }
83: }
84:
85: /* */
86:
87: int
88: sc_width()
89: {
90: #ifdef TIOCGWINSZ
91: struct winsize win;
92:
93: if (ioctl (fileno (stderr), TIOCGWINSZ, &win) != NOTOK
94: && (CO = win.ws_col) > 0)
95: initCO++;
96: else
97: #endif TIOCGWINSZ
98: read_termcap();
99:
100: return CO;
101: }
102:
103:
104: int
105: sc_length()
106: {
107: #ifdef TIOCGWINSZ
108: struct winsize win;
109:
110: if (ioctl (fileno (stderr), TIOCGWINSZ, &win) != NOTOK
111: && (LI = win.ws_row) > 0)
112: initLI++;
113: else
114: #endif TIOCGWINSZ
115: read_termcap();
116:
117: return LI;
118: }
119:
120: /* */
121:
122: static int
123: outc(c)
124: register char c;
125: {
126: (void) putchar (c);
127: }
128:
129:
130: void
131: clear_screen()
132: {
133: read_termcap();
134:
135: if (CL && ospeed)
136: tputs (CL, LI, outc);
137: else {
138: printf ("\f");
139: if (ospeed)
140: printf ("\200");
141: }
142:
143: (void) fflush (stdout);
144: }
145:
146: /* */
147:
148: /* VARARGS1 */
149:
150: SOprintf(fmt, a, b, c, d, e, f)
151: char *fmt,
152: *a,
153: *b,
154: *c,
155: *d,
156: *e,
157: *f;
158: {
159: read_termcap();
160: if (SO == NULL || SE == NULL)
161: return NOTOK;
162:
163: tputs (SO, 1, outc);
164: printf (fmt, a, b, c, d, e, f);
165: tputs (SE, 1, outc);
166:
167: return OK;
168: }
169:
170: #define MAXTCENT 32
171: static int nTCent;
172: static char *TCid[MAXTCENT];
173: static char *TCent[MAXTCENT];
174:
175: char *
176: get_termcap(id)
177: char *id;
178: {
179: register int i;
180: char *cp;
181: static char tcbuf[1024];
182: static char *tcptr = tcbuf;
183:
184: for (i = 0; i < nTCent; ++i)
185: if (strcmp(TCid[i], id) == 0)
186: return (TCent[i]);
187:
188: if (nTCent >= MAXTCENT)
189: return ("");
190:
191: TCid[nTCent] = getcpy(id);
192:
193: if (TCinited == 0)
194: read_termcap();
195:
196: cp = tgetstr(id, &tcptr);
197: if (cp == 0) {
198: /* check for some alternates for the entry */
199: if (strcmp(id, "mb") == 0 ||
200: strcmp(id, "md") == 0 ||
201: strcmp(id, "mh") == 0 ||
202: strcmp(id, "mr") == 0 ||
203: strcmp(id, "us") == 0)
204: id = "so";
205: else if (strcmp(id, "me") == 0 ||
206: strcmp(id, "ue") == 0)
207: id = "se";
208: cp = tgetstr(id, &tcptr);
209: if (cp == 0)
210: cp = "";
211: }
212:
213: /* skip leading delay spec */
214: while (isdigit(*cp))
215: ++cp;
216: if (*cp == '.')
217: if (isdigit(*++cp))
218: ++cp;
219: if (*cp == '*')
220: ++cp;
221:
222: TCent[nTCent] = cp;
223: ++nTCent;
224: return (cp);
225: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.