]> diplodocus.org Git - nmh/blobdiff - sbr/terminal.c
Fix invalid pointer arithmetic.
[nmh] / sbr / terminal.c
index 7db83f0d430e5c2440b79627269022248a565aa4..761ed245eb9c0e01aadcac23d1efde6e0a3b42b5 100644 (file)
@@ -1,6 +1,4 @@
-
-/*
- * termsbr.c -- termcap support
+/* terminal.c -- termcap support
  *
  * This code is Copyright (c) 2002, by the authors of nmh.  See the
  * COPYRIGHT file in the root directory of the nmh distribution for
 #include <h/mh.h>
 #include <h/utils.h>
 
-#include <termios.h>
 #include <sys/ioctl.h>
 
-/* 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 <termcap.h>
-#elif defined (HAVE_NCURSES_TERMCAP_H)
-# include <ncurses/termcap.h>
-#endif
-
 #include <curses.h>
 #include <term.h>
+#include <termios.h>
 
 #ifdef WINSIZE_IN_PTEM
 # include <sys/stream.h>
 # include <sys/ptem.h>
 #endif
 
+#include "terminal.h"
+
 static int initLI = 0;
 static int initCO = 0;
 
 static int LI = 40;                /* number of lines                        */
-static int CO = 80;                /* number of colum                      */
+static int CO = 80;                /* number of columns                      */
 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 */
@@ -44,7 +35,7 @@ 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.
@@ -63,9 +54,8 @@ initialize_terminfo(void)
     if (rc != 0 || errret != 1) {
        termstatus = -1;
        return;
-    } else {
-       termstatus = 1;
     }
+    termstatus = 1;
 
     if (!initCO && (CO = tigetnum ("cols")) <= 0)
        CO = 80;
@@ -115,7 +105,7 @@ sc_length (void)
 
 
 static int
-outc (int c)
+outc (TPUTS_PUTC_ARG c)
 {
     return putchar(c);
 }
@@ -126,10 +116,10 @@ nmh_clear_screen (void)
 {
     initialize_terminfo ();
 
-    if (clear)
+    if (ti_clear)
        tputs (ti_clear, LI, outc);
     else {
-       printf ("\f");
+       putchar('\f');
     }
 
     fflush (stdout);
@@ -160,8 +150,19 @@ SOprintf (char *fmt, ...)
 }
 
 /*
- * Return the specified capability as a string that has already been
- * processed with tputs().
+ * Get a string from the terminfo database for the current terminal.
+ *
+ * Retrieve the specified terminfo capability and return a string that
+ * can be output to the terminal.  The string returned has already been
+ * processed by tputs(), so it is safe to output directly.  The return
+ * value of this function is valid until the next call.
+ *
+ * Arguments:
+ *
+ * capability  - The name of the terminfo capability (see terminfo(5)).
+ *
+ * Returns a tputs-processed string, or NULL if terminal initialization failed
+ * or the capability wasn't found.
  */
 
 char *
@@ -184,17 +185,85 @@ get_term_stringcap(char *capability)
 
     tputs(parm, 1, termbytes);
 
-    termcbufp = '\0';
+    *termcbufp = '\0';
 
     return termcbuf;
 }
 
+/*
+ * Get a parameterized string from the terminfo database for the current
+ * terminal.
+ *
+ * We don't yet have a standardized tparm() that will take a stdarg
+ * argument.  Right now we don't want many parameters, so we only
+ * take two.  Everything gets passed to tparm() as-is.  If we need
+ * a capability with more arguments, we'll just add more later.
+ *
+ * Arguments:
+ *
+ * capability  - The name of the terminfo capability (see terminfo(5)).
+ * arg1..argN  - Arguments 1-N.
+ *
+ * Returns a tparm and tputs-processed string, or NULL if there was a problem
+ * initialising the terminal or retrieving the 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;
+}
+
+/*
+ * Get a number from the terminfo database for the current terminal.
+ *
+ * Retrieve the specified terminfo capability and return the numeric
+ * value of that capability from the terminfo database.
+ *
+ * Arguments:
+ *
+ * capability  - The name of the terminfo capability (see terminfo(5)).
+ *
+ * Returns the output of tigetnum() for that capability, or -1 if it was
+ * unable to initialize the terminfo database.
+ */
+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;