ncurses 5.9 - patch 20110604
[ncurses.git] / progs / tset.c
index 1c1480a2d50136292345ec2b5cca99dca7ab74a1..71a1845ff7d0b2512d5b4847bd1b54d2ed246c97 100644 (file)
@@ -1,5 +1,5 @@
 /****************************************************************************
- * Copyright (c) 1998-2007,2008 Free Software Foundation, Inc.              *
+ * Copyright (c) 1998-2010,2011 Free Software Foundation, Inc.              *
  *                                                                          *
  * Permission is hereby granted, free of charge, to any person obtaining a  *
  * copy of this software and associated documentation files (the            *
  *     and: Thomas E. Dickey                        1996-on                 *
  ****************************************************************************/
 
+/*
+ * Notes:
+ * The initial adaptation from 4.4BSD Lite sources in September 1995 used 686
+ * lines from that version, and made changes/additions for 150 lines.  There
+ * was no reformatting, so with/without ignoring whitespace, the amount of
+ * change is the same.
+ *
+ * Comparing with current (2009) source, excluding this comment:
+ * a) 209 lines match identically to the 4.4BSD Lite sources, with 771 lines
+ *    changed/added.
+ * a) Ignoring whitespace, the current version still uses 516 lines from the
+ *    4.4BSD Lite sources, with 402 lines changed/added.
+ *
+ * Raymond's original comment on this follows...
+ */
+
 /*
  * tset.c - terminal initialization utility
  *
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *     This product includes software developed by the University of
- *     California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
+ * 3. Neither the name of the University nor the names of its contributors
  *    may be used to endorse or promote products derived from this software
  *    without specific prior written permission.
  *
 char *ttyname(int fd);
 #endif
 
-/* this is just to stifle a missing-prototype warning */
-#ifdef linux
-# include <sys/ioctl.h>
+#if HAVE_SIZECHANGE
+# if !defined(sun) || !TERMIOS
+#  if HAVE_SYS_IOCTL_H
+#   include <sys/ioctl.h>
+#  endif
+# endif
 #endif
 
 #if NEED_PTEM_H
@@ -104,13 +119,39 @@ char *ttyname(int fd);
 #include <dump_entry.h>
 #include <transform.h>
 
-MODULE_ID("$Id: tset.c,v 1.73 2008/08/04 12:47:05 tom Exp $")
+MODULE_ID("$Id: tset.c,v 1.84 2011/05/21 18:55:32 tom Exp $")
 
+/*
+ * SCO defines TIOCGSIZE and the corresponding struct.  Other systems (SunOS,
+ * Solaris, IRIX) define TIOCGWINSZ and struct winsize.
+ */
+#ifdef TIOCGSIZE
+# define IOCTL_GET_WINSIZE TIOCGSIZE
+# define IOCTL_SET_WINSIZE TIOCSSIZE
+# define STRUCT_WINSIZE struct ttysize
+# define WINSIZE_ROWS(n) n.ts_lines
+# define WINSIZE_COLS(n) n.ts_cols
+#else
+# ifdef TIOCGWINSZ
+#  define IOCTL_GET_WINSIZE TIOCGWINSZ
+#  define IOCTL_SET_WINSIZE TIOCSWINSZ
+#  define STRUCT_WINSIZE struct winsize
+#  define WINSIZE_ROWS(n) n.ws_row
+#  define WINSIZE_COLS(n) n.ws_col
+# endif
+#endif
+
+#ifndef environ
 extern char **environ;
+#endif
 
 #undef CTRL
 #define CTRL(x)        ((x) & 0x1f)
 
+static void failed(const char *) GCC_NORETURN;
+static void exit_error(void) GCC_NORETURN;
+static void err(const char *,...) GCC_NORETURN;
+
 const char *_nc_progname = "tset";
 
 static TTY mode, oldmode, original;
@@ -166,7 +207,7 @@ static void
 failed(const char *msg)
 {
     char temp[BUFSIZ];
-    unsigned len = strlen(_nc_progname) + 2;
+    size_t len = strlen(_nc_progname) + 2;
 
     if ((int) len < (int) sizeof(temp) - 12) {
        strcpy(temp, _nc_progname);
@@ -362,9 +403,13 @@ add_mapping(const char *port, char *arg)
     char *base = 0;
 
     copy = strdup(arg);
-    mapp = (MAP *) malloc(sizeof(MAP));
+    mapp = typeMalloc(MAP, 1);
     if (copy == 0 || mapp == 0)
        failed("malloc");
+
+    assert(copy != 0);
+    assert(mapp != 0);
+
     mapp->next = 0;
     if (maplist == 0)
        cur = maplist = mapp;
@@ -867,13 +912,13 @@ set_control_chars(void)
 {
 #ifdef TERMIOS
     if (DISABLED(mode.c_cc[VERASE]) || terasechar >= 0)
-       mode.c_cc[VERASE] = terasechar >= 0 ? terasechar : default_erase();
+       mode.c_cc[VERASE] = (terasechar >= 0) ? terasechar : default_erase();
 
     if (DISABLED(mode.c_cc[VINTR]) || intrchar >= 0)
-       mode.c_cc[VINTR] = intrchar >= 0 ? intrchar : CINTR;
+       mode.c_cc[VINTR] = (intrchar >= 0) ? intrchar : CINTR;
 
     if (DISABLED(mode.c_cc[VKILL]) || tkillchar >= 0)
-       mode.c_cc[VKILL] = tkillchar >= 0 ? tkillchar : CKILL;
+       mode.c_cc[VKILL] = (tkillchar >= 0) ? tkillchar : CKILL;
 #endif
 }
 
@@ -1140,9 +1185,6 @@ arg_to_char(void)
 int
 main(int argc, char **argv)
 {
-#if defined(TIOCGWINSZ) && defined(TIOCSWINSZ)
-    struct winsize win;
-#endif
     int ch, noinit, noset, quiet, Sflag, sflag, showterm;
     const char *p;
     const char *ttype;
@@ -1227,26 +1269,28 @@ main(int argc, char **argv)
     ospeed = (NCURSES_OSPEED) mode.sg_ospeed;
 #endif
 
-    if (!strcmp(_nc_progname, PROG_RESET)) {
+    if (same_program(_nc_progname, PROG_RESET)) {
        isreset = TRUE;
        reset_mode();
     }
 
-    ttype = get_termcap_entry(*argv);
+    (void) get_termcap_entry(*argv);
 
     if (!noset) {
        tcolumns = columns;
        tlines = lines;
 
-#if defined(TIOCGWINSZ) && defined(TIOCSWINSZ)
+#if HAVE_SIZECHANGE
        if (opt_w) {
-           /* Set window size */
-           (void) ioctl(STDERR_FILENO, TIOCGWINSZ, &win);
-           if (win.ws_row == 0 && win.ws_col == 0 &&
+           STRUCT_WINSIZE win;
+           /* Set window size if not set already */
+           (void) ioctl(STDERR_FILENO, IOCTL_GET_WINSIZE, &win);
+           if (WINSIZE_ROWS(win) == 0 &&
+               WINSIZE_COLS(win) == 0 &&
                tlines > 0 && tcolumns > 0) {
-               win.ws_row = tlines;
-               win.ws_col = tcolumns;
-               (void) ioctl(STDERR_FILENO, TIOCSWINSZ, &win);
+               WINSIZE_ROWS(win) = tlines;
+               WINSIZE_COLS(win) = tcolumns;
+               (void) ioctl(STDERR_FILENO, IOCTL_SET_WINSIZE, &win);
            }
        }
 #endif