X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/20ce29e738d1a15764197559d256a85ef89d85d7..8de8055bc6930f58cb6afdb144d73138dc3ec930:/sbr/terminal.c?ds=inline diff --git a/sbr/terminal.c b/sbr/terminal.c index 7226a88f..cf71de03 100644 --- a/sbr/terminal.c +++ b/sbr/terminal.c @@ -10,18 +10,11 @@ #include #include -#include #include -/* It might be better to tie this to the termcap_curses_order in - configure.ac. It would be fine to check for ncurses/termcap.h - first on Linux, it's a symlink to termcap.h. */ -#ifdef HAVE_TERMCAP_H -# include -#elif defined (HAVE_NCURSES_TERMCAP_H) -# include -#endif +#include #include +#include #ifdef WINSIZE_IN_PTEM # include @@ -31,18 +24,18 @@ static int initLI = 0; static int initCO = 0; -static int LI = 40; /* number of lines */ -static int CO = 80; /* number of colums */ -static char *clear = NULL; /* terminfo string to clear screen */ -static char *standend = NULL; /* terminfo string to end standout mode */ -static char *standbegin = NULL; /* terminfo string to begin standout mode */ -static int termstatus = 0; /* terminfo initialization status */ -static char *termcbuf = NULL; /* tputs() output buffer */ -static char *termcbufp = NULL; /* tputs() output buffer pointer */ -static size_t termcbufsz = 0; /* Size of termcbuf */ +static int LI = 40; /* number of lines */ +static int CO = 80; /* number of colums */ +static char *ti_clear = NULL; /* terminfo string to clear screen */ +static char *ti_standend = NULL; /* terminfo string to end standout mode */ +static char *ti_standbegin = NULL; /* terminfo string to begin standout mode */ +static int termstatus = 0; /* terminfo initialization status */ +static char *termcbuf = NULL; /* tputs() output buffer */ +static char *termcbufp = NULL; /* tputs() output buffer pointer */ +static size_t termcbufsz = 0; /* Size of termcbuf */ static void initialize_terminfo(void); -static int termbytes(int); +static int termbytes(TPUTS_PUTC_ARG); /* * Initialize the terminfo library. @@ -61,18 +54,17 @@ initialize_terminfo(void) if (rc != 0 || errret != 1) { termstatus = -1; return; - } else { - termstatus = 1; } + termstatus = 1; if (!initCO && (CO = tigetnum ("cols")) <= 0) CO = 80; if (!initLI && (LI = tigetnum ("lines")) <= 0) LI = 24; - clear = tigetstr ("clear"); - standbegin = tigetstr ("smso"); - standend = tigetstr ("rmso"); + ti_clear = tigetstr ("clear"); + ti_standbegin = tigetstr ("smso"); + ti_standend = tigetstr ("rmso"); } @@ -113,7 +105,7 @@ sc_length (void) static int -outc (int c) +outc (TPUTS_PUTC_ARG c) { return putchar(c); } @@ -124,10 +116,10 @@ nmh_clear_screen (void) { initialize_terminfo (); - if (clear) - tputs (clear, LI, outc); + if (ti_clear) + tputs (ti_clear, LI, outc); else { - printf ("\f"); + putchar('\f'); } fflush (stdout); @@ -143,16 +135,16 @@ SOprintf (char *fmt, ...) va_list ap; initialize_terminfo (); - if (!(standbegin && standend)) + if (!(ti_standbegin && ti_standend)) return NOTOK; - tputs (standbegin, 1, outc); + tputs (ti_standbegin, 1, outc); va_start(ap, fmt); vprintf (fmt, ap); va_end(ap); - tputs (standend, 1, outc); + tputs (ti_standend, 1, outc); return OK; } @@ -182,17 +174,63 @@ get_term_stringcap(char *capability) tputs(parm, 1, termbytes); - termcbufp = '\0'; + *termcbufp = '\0'; return termcbuf; } +/* + * Return a parameterized terminfo capability + */ + +char * +get_term_stringparm(char *capability, long arg1, long arg2) +{ + char *parm; + + initialize_terminfo(); + + if (termstatus == -1) + return NULL; + + termcbufp = termcbuf; + + parm = tigetstr(capability); + + if (parm == (char *) -1 || parm == NULL) { + return NULL; + } + + parm = tparm(parm, arg1, arg2, 0, 0, 0, 0, 0, 0, 0); + + tputs(parm, 1, termbytes); + + *termcbufp = '\0'; + + return termcbuf; +} + +/* + * Return the value of the specified numeric capability + */ + +int +get_term_numcap(char *capability) +{ + initialize_terminfo(); + + if (termstatus == -1) + return -1; + + return tigetnum(capability); +} + /* * Store a sequence of characters in our local buffer */ static int -termbytes(int c) +termbytes(TPUTS_PUTC_ARG c) { size_t offset;