diff options
Diffstat (limited to 'byterun/terminfo.c')
-rw-r--r-- | byterun/terminfo.c | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/byterun/terminfo.c b/byterun/terminfo.c new file mode 100644 index 0000000000..214984892f --- /dev/null +++ b/byterun/terminfo.c @@ -0,0 +1,126 @@ +/* Read and output terminal commands */ + +#include "config.h" +#include "alloc.h" +#include "fail.h" +#include "io.h" +#include "mlvalues.h" + +#ifdef HAS_TERMINFO + +#undef getch +#include <curses.h> +#include <term.h> + +value terminfo_setup(unit) /* ML */ + value unit; +{ + if (setupterm(NULL, 1, 1) != 1) failwith("Terminfo.setupterm"); + return Val_unit; +} + +value terminfo_getstr(capa) /* ML */ + value capa; +{ + char * res = (char *) tigetstr(String_val(capa)); + if (res == (char *)(-1)) raise_not_found(); + return copy_string(res); +} + +value terminfo_getnum(capa) /* ML */ + value capa; +{ + int res = tigetnum(String_val(capa)); + if (res == -2) raise_not_found(); + return Val_int(res); +} + +#else + +#ifdef HAS_TERMCAP + +#define _BSD /* For DEC OSF1 */ +#undef getch +#include <curses.h> + +value terminfo_setup(unit) + value unit; +{ + static buffer[1024]; + if (tgetent(buffer, getenv("TERM")) != 1) failwith("Terminfo.setupterm"); + return Val_unit; +} + +value terminfo_getstr(capa) + value capa; +{ + char buff[1024]; + char * p = buff; + if (tgetstr(String_val(capa), &p) == 0) raise_not_found(); + return copy_string(buff); +} + +value terminfo_getnum(capa) + value capa; +{ + int res = tgetnum(String_val(capa)); + if (res == -1) raise_not_found(); + return Val_int(res); +} + +#else + +value terminfo_setup(unit) + value unit; +{ + failwith("Terminfo.setupterm"); + return Val_unit; +} + +value terminfo_getstr(capa) + value capa; +{ + raise_not_found(); + return Val_unit; +} + +value terminfo_getnum(capa) + value capa; +{ + raise_not_found(); + return Val_unit; +} + +#endif +#endif + +#if defined HAS_TERMINFO || defined HAS_TERMCAP + +static struct channel * terminfo_putc_channel; + +static int terminfo_putc(c) + int c; +{ + putch(terminfo_putc_channel, c); + return c; +} + +value terminfo_puts(chan, str, count) /* ML */ + struct channel * chan; + value str, count; +{ + terminfo_putc_channel = chan; + tputs(String_val(str), Int_val(count), terminfo_putc); + return Val_unit; +} + +#else + +value terminfo_puts(chan, str, count) + struct channel * chan; + value str, count; +{ + invalid_argument("Terminfo.puts"); +} + +#endif |