2 * Copyright (c) 1995, 1996
3 * Keith Bostic. All rights reserved.
5 * See the LICENSE file for redistribution information.
11 static const char sccsid
[] = "$Id: cl_bsd.c,v 8.29 1996/07/01 10:03:17 bostic Exp $ (Berkeley) $Date: 1996/07/01 10:03:17 $";
14 #include <sys/types.h>
15 #include <sys/queue.h>
18 #include <bitstring.h>
28 #include "../common/common.h"
32 static char *ke
; /* Keypad on. */
33 static char *ks
; /* Keypad off. */
34 static char *vb
; /* Visible bell string. */
37 * HP's support the entire System V curses package except for the tigetstr
38 * and tigetnum functions. Ultrix supports the BSD curses package except
39 * for the idlok function. Cthulu only knows why. Break things up into a
40 * minimal set of functions.
43 #ifndef HAVE_CURSES_ADDNSTR
47 * PUBLIC: #ifndef HAVE_CURSES_ADDNSTR
48 * PUBLIC: int addnstr __P((char *, int));
58 while (n
-- && (ch
= *s
++))
64 #ifndef HAVE_CURSES_BEEP
68 * PUBLIC: #ifndef HAVE_CURSES_BEEP
69 * PUBLIC: void beep __P((void));
75 (void)write(1, "\007", 1); /* '\a' */
77 #endif /* !HAVE_CURSES_BEEP */
79 #ifndef HAVE_CURSES_FLASH
84 * PUBLIC: #ifndef HAVE_CURSES_FLASH
85 * PUBLIC: void flash __P((void));
92 (void)tputs(vb
, 1, cl_putchar
);
97 #endif /* !HAVE_CURSES_FLASH */
99 #ifndef HAVE_CURSES_IDLOK
102 * Turn on/off hardware line insert/delete.
104 * PUBLIC: #ifndef HAVE_CURSES_IDLOK
105 * PUBLIC: void idlok __P((WINDOW *, int));
115 #endif /* !HAVE_CURSES_IDLOK */
117 #ifndef HAVE_CURSES_KEYPAD
120 * Put the keypad/cursor arrows into or out of application mode.
122 * PUBLIC: #ifndef HAVE_CURSES_KEYPAD
123 * PUBLIC: int keypad __P((void *, int));
133 if ((p
= tigetstr(on
? "smkx" : "rmkx")) != (char *)-1) {
134 (void)tputs(p
, 0, cl_putchar
);
135 (void)fflush(stdout
);
139 #endif /* !HAVE_CURSES_KEYPAD */
141 #ifndef HAVE_CURSES_NEWTERM
144 * Create a new curses screen.
146 * PUBLIC: #ifndef HAVE_CURSES_NEWTERM
147 * PUBLIC: void *newterm __P((const char *, FILE *, FILE *));
157 #endif /* !HAVE_CURSES_NEWTERM */
159 #ifndef HAVE_CURSES_SETUPTERM
164 * PUBLIC: #ifndef HAVE_CURSES_SETUPTERM
165 * PUBLIC: void setupterm __P((char *, int, int *));
169 setupterm(ttype
, fno
, errp
)
173 static char buf
[2048];
176 if ((*errp
= tgetent(buf
, ttype
)) > 0) {
179 ke
= ((p
= tigetstr("rmkx")) == (char *)-1) ?
183 ks
= ((p
= tigetstr("smkx")) == (char *)-1) ?
187 vb
= ((p
= tigetstr("flash")) == (char *)-1) ?
191 #endif /* !HAVE_CURSES_SETUPTERM */
193 #ifndef HAVE_CURSES_TIGETSTR
194 /* Terminfo-to-termcap translation table. */
196 char *terminfo
; /* Terminfo name. */
197 char *termcap
; /* Termcap name. */
199 static const TL list
[] = {
200 "cols", "co", /* Terminal columns. */
201 "cup", "cm", /* Cursor up. */
202 "cuu1", "up", /* Cursor up. */
203 "el", "ce", /* Clear to end-of-line. */
204 "flash", "vb", /* Visible bell. */
205 "kcub1", "kl", /* Cursor left. */
206 "kcud1", "kd", /* Cursor down. */
207 "kcuf1", "kr", /* Cursor right. */
208 "kcuu1", "ku", /* Cursor up. */
209 "kdch1", "kD", /* Delete character. */
210 "kdl1", "kL", /* Delete line. */
211 "ked", "kS", /* Delete to end of screen. */
212 "kel", "kE", /* Delete to eol. */
213 "khome", "kh", /* Go to sol. */
214 "kich1", "kI", /* Insert at cursor. */
215 "kil1", "kA", /* Insert line. */
216 "kind", "kF", /* Scroll down. */
217 "kll", "kH", /* Go to eol. */
218 "knp", "kN", /* Page down. */
219 "kpp", "kP", /* Page up. */
220 "kri", "kR", /* Scroll up. */
221 "lines", "li", /* Terminal lines. */
222 "rmcup", "te", /* Terminal end string. */
223 "rmkx", "ke", /* Exit "keypad-transmit" mode. */
224 "rmso", "se", /* Standout end. */
225 "smcup", "ti", /* Terminal initialization string. */
226 "smkx", "ks", /* Enter "keypad-transmit" mode. */
227 "smso", "so", /* Standout begin. */
232 * AIX's implementation for function keys greater than 10 is different and
233 * only goes as far as 36.
235 static const char codes
[] = {
236 /* 0-10 */ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ';',
237 /* 11-20 */ '<', '>', '!', '@', '#', '$', '%', '^', '&', '*',
238 /* 21-30 */ '(', ')', '-', '_', '+', ',', ':', '?', '[', ']',
239 /* 31-36 */ '{', '}', '|', '~', '/', '='
246 * Historically, the 4BSD termcap code didn't support functions keys greater
247 * than 9. This was silently enforced -- asking for key k12 would return the
248 * value for k1. We try and get around this by using the tables specified in
249 * the terminfo(TI_ENV) man page from the 3rd Edition SVID. This assumes the
250 * implementors of any System V compatibility code or an extended termcap used
253 static const char codes
[] = {
254 /* 0-10 */ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ';',
255 /* 11-19 */ '1', '2', '3', '4', '5', '6', '7', '8', '9',
256 /* 20-63 */ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
257 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
258 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
259 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
265 * list comparison routine for bsearch.
271 return (strcmp(a
, ((TL
*)b
)->terminfo
));
277 * Vendors put the prototype for tigetstr into random include files, including
278 * <term.h>, which we can't include because it makes other systems unhappy.
279 * Try and work around the problem, since we only care about the return value.
281 * PUBLIC: #ifdef HAVE_CURSES_TIGETSTR
282 * PUBLIC: char *tigetstr();
284 * PUBLIC: char *tigetstr __P((char *));
291 static char sbuf
[256];
296 if ((tlp
= bsearch(name
,
297 list
, sizeof(list
) / sizeof(TL
), sizeof(TL
), lcmp
)) == NULL
) {
299 if (name
[0] == 'k' &&
300 name
[1] == 'f' && (n
= atoi(name
+ 2)) <= 36) {
302 keyname
[1] = codes
[n
];
305 if (name
[0] == 'k' &&
306 name
[1] == 'f' && (n
= atoi(name
+ 2)) <= 63) {
307 keyname
[0] = n
<= 10 ? 'k' : 'F';
308 keyname
[1] = codes
[n
];
318 return ((p
= tgetstr(name
, &p
)) == NULL
? (char *)-1 : strcpy(sbuf
, p
));
320 return (tgetstr(name
, &p
) == NULL
? (char *)-1 : sbuf
);
327 * PUBLIC: #ifndef HAVE_CURSES_TIGETSTR
328 * PUBLIC: int tigetnum __P((char *));
338 if ((tlp
= bsearch(name
,
339 list
, sizeof(list
) / sizeof(TL
), sizeof(TL
), lcmp
)) != NULL
) {
343 return ((val
= tgetnum(name
)) == -1 ? -2 : val
);
345 #endif /* !HAVE_CURSES_TIGETSTR */