]> ncurses.scripts.mit.edu Git - ncurses.git/blobdiff - progs/tset.c
ncurses 5.4
[ncurses.git] / progs / tset.c
index d8dbda4974f5d49fa966590fdabfa672a30aecb3..f67931f0506e31766ea6ec3e707e67282eaa5746 100644 (file)
@@ -1,5 +1,5 @@
 /****************************************************************************
- * Copyright (c) 1998,1999,2000 Free Software Foundation, Inc.              *
+ * Copyright (c) 1998-2002,2003 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            *
@@ -95,15 +95,15 @@ char *ttyname(int fd);
 #if NEED_PTEM_H
 /* they neglected to define struct winsize in termios.h -- it's only
    in termio.h */
-#include       <sys/stream.h>
-#include       <sys/ptem.h>
+#include <sys/stream.h>
+#include <sys/ptem.h>
 #endif
 
 #include <curses.h>            /* for bool typedef */
 #include <dump_entry.h>
 #include <transform.h>
 
-MODULE_ID("$Id: tset.c,v 0.47 2000/10/08 01:01:08 tom Exp $")
+MODULE_ID("$Id: tset.c,v 0.56 2003/12/06 17:21:01 tom Exp $")
 
 extern char **environ;
 
@@ -112,15 +112,16 @@ extern char **environ;
 
 const char *_nc_progname = "tset";
 
-static TTY mode, oldmode;
+static TTY mode, oldmode, original;
 
+static bool can_restore = FALSE;
 static bool isreset = FALSE;   /* invoked as reset */
 static int terasechar = -1;    /* new erase character */
 static int intrchar = -1;      /* new interrupt character */
 static int tkillchar = -1;     /* new kill character */
 static int tlines, tcolumns;   /* window size */
 
-#define LOWERCASE(c) ((isalpha(c) && isupper(c)) ? tolower(c) : (c))
+#define LOWERCASE(c) ((isalpha(UChar(c)) && isupper(UChar(c))) ? tolower(UChar(c)) : (c))
 
 static int
 CaselessCmp(const char *a, const char *b)
@@ -134,6 +135,17 @@ CaselessCmp(const char *a, const char *b)
     return LOWERCASE(*a) - LOWERCASE(*b);
 }
 
+static void
+exit_error(void)
+{
+    if (can_restore)
+       SET_TTY(STDERR_FILENO, &original);
+    (void) fprintf(stderr, "\n");
+    fflush(stderr);
+    ExitProgram(EXIT_FAILURE);
+    /* NOTREACHED */
+}
+
 static void
 err(const char *fmt,...)
 {
@@ -142,8 +154,7 @@ err(const char *fmt,...)
     (void) fprintf(stderr, "tset: ");
     (void) vfprintf(stderr, fmt, ap);
     va_end(ap);
-    (void) fprintf(stderr, "\n");
-    exit(EXIT_FAILURE);
+    exit_error();
     /* NOTREACHED */
 }
 
@@ -152,25 +163,24 @@ failed(const char *msg)
 {
     char temp[BUFSIZ];
     perror(strncat(strcpy(temp, "tset: "), msg, sizeof(temp) - 10));
-    exit(EXIT_FAILURE);
+    exit_error();
     /* NOTREACHED */
 }
 
 static void
 cat(char *file)
 {
-    register int fd, nr, nw;
+    FILE *fp;
+    size_t nr;
     char buf[BUFSIZ];
 
-    if ((fd = open(file, O_RDONLY, 0)) < 0)
+    if ((fp = fopen(file, "r")) == 0)
        failed(file);
 
-    while ((nr = read(fd, buf, sizeof(buf))) > 0)
-       if ((nw = write(STDERR_FILENO, buf, (size_t) nr)) == -1)
-           failed("write to stderr");
-    if (nr != 0)
-       failed(file);
-    (void) close(fd);
+    while ((nr = fread(buf, sizeof(char), sizeof(buf), fp)) != 0)
+       if (fwrite(buf, sizeof(char), nr, stderr) != nr)
+             failed("write to stderr");
+    fclose(fp);
 }
 
 static int
@@ -187,9 +197,11 @@ askuser(const char *dflt)
     char *p;
 
     /* We can get recalled; if so, don't continue uselessly. */
+    clearerr(stdin);
     if (feof(stdin) || ferror(stdin)) {
        (void) fprintf(stderr, "\n");
-       exit(EXIT_FAILURE);
+       exit_error();
+       /* NOTREACHED */
     }
     for (;;) {
        if (dflt)
@@ -200,8 +212,8 @@ askuser(const char *dflt)
 
        if (fgets(answer, sizeof(answer), stdin) == 0) {
            if (dflt == 0) {
-               (void) fprintf(stderr, "\n");
-               exit(EXIT_FAILURE);
+               exit_error();
+               /* NOTREACHED */
            }
            return (dflt);
        }
@@ -338,7 +350,7 @@ add_mapping(const char *port, char *arg)
     char *base = 0;
 
     copy = strdup(arg);
-    mapp = malloc(sizeof(MAP));
+    mapp = (MAP *) malloc(sizeof(MAP));
     if (copy == 0 || mapp == 0)
        failed("malloc");
     mapp->next = 0;
@@ -495,7 +507,7 @@ mapped(const char *type)
 static const char *
 get_termcap_entry(char *userarg)
 {
-    int rval, errret;
+    int errret;
     char *p;
     const char *ttype;
 #if HAVE_GETTTYNAM
@@ -534,7 +546,7 @@ get_termcap_entry(char *userarg)
 
            while (fgets(buffer, sizeof(buffer) - 1, fp) != 0) {
                for (s = buffer, t = d = 0; *s; s++) {
-                   if (isspace(*s))
+                   if (isspace(UChar(*s)))
                        *s = '\0';
                    else if (t == 0)
                        t = s;
@@ -588,8 +600,8 @@ get_termcap_entry(char *userarg)
            ttype = askuser(0);
     }
     /* Find the terminfo entry.  If it doesn't exist, ask the user. */
-    while ((rval = setupterm((NCURSES_CONST char *) ttype, STDOUT_FILENO,
-                            &errret)) != OK) {
+    while (setupterm((NCURSES_CONST char *) ttype, STDOUT_FILENO, &errret)
+          != OK) {
        if (errret == 0) {
            (void) fprintf(stderr, "tset: unknown terminal type %s\n",
                           ttype);
@@ -615,8 +627,10 @@ get_termcap_entry(char *userarg)
  **************************************************************************/
 
 /* some BSD systems have these built in, some systems are missing
- * one or more definitions. The safest solution is to override.
+ * one or more definitions. The safest solution is to override unless the
+ * commonly-altered ones are defined.
  */
+#if !(defined(CERASE) && defined(CINTR) && defined(CKILL) && defined(CQUIT))
 #undef CEOF
 #undef CERASE
 #undef CINTR
@@ -627,18 +641,39 @@ get_termcap_entry(char *userarg)
 #undef CSTART
 #undef CSTOP
 #undef CSUSP
+#endif
 
 /* control-character defaults */
+#ifndef CEOF
 #define CEOF   CTRL('D')
+#endif
+#ifndef CERASE
 #define CERASE CTRL('H')
+#endif
+#ifndef CINTR
 #define CINTR  127             /* ^? */
+#endif
+#ifndef CKILL
 #define CKILL  CTRL('U')
+#endif
+#ifndef CLNEXT
 #define CLNEXT  CTRL('v')
+#endif
+#ifndef CRPRNT
 #define CRPRNT  CTRL('r')
+#endif
+#ifndef CQUIT
 #define CQUIT  CTRL('\\')
+#endif
+#ifndef CSTART
 #define CSTART CTRL('Q')
+#endif
+#ifndef CSTOP
 #define CSTOP  CTRL('S')
+#endif
+#ifndef CSUSP
 #define CSUSP  CTRL('Z')
+#endif
 
 #define        CHK(val, dft)   ((int)val <= 0 ? dft : val)
 
@@ -757,11 +792,7 @@ reset_mode(void)
        );
 #endif
 
-#ifdef TERMIOS
-    tcsetattr(STDERR_FILENO, TCSADRAIN, &mode);
-#else
-    stty(STDERR_FILENO, &mode);
-#endif
+    SET_TTY(STDERR_FILENO, &mode);
 }
 
 /*
@@ -891,7 +922,7 @@ set_init(void)
 #ifdef TAB3
     if (oldmode.c_oflag & (TAB3 | ONLCR | OCRNL | ONLRET)) {
        oldmode.c_oflag &= (TAB3 | ONLCR | OCRNL | ONLRET);
-       tcsetattr(STDERR_FILENO, TCSADRAIN, &oldmode);
+       SET_TTY(STDERR_FILENO, &oldmode);
     }
 #endif
     settle = set_tabs();
@@ -1034,8 +1065,9 @@ static void
 usage(const char *pname)
 {
     (void) fprintf(stderr,
-                  "usage: %s [-IQVrs] [-] [-e ch] [-i ch] [-k ch] [-m mapping] [terminal]\n", pname);
-    exit(EXIT_FAILURE);
+                  "usage: %s [-IQVrs] [-] [-e ch] [-i ch] [-k ch] [-m mapping] [terminal]", pname);
+    exit_error();
+    /* NOTREACHED */
 }
 
 static char
@@ -1058,14 +1090,15 @@ main(int argc, char **argv)
 
     if (GET_TTY(STDERR_FILENO, &mode) < 0)
        failed("standard error");
-    oldmode = mode;
+    can_restore = TRUE;
+    original = oldmode = mode;
 #ifdef TERMIOS
     ospeed = cfgetospeed(&mode);
 #else
     ospeed = mode.sg_ospeed;
 #endif
 
-    p = _nc_basename(*argv);
+    p = _nc_rootname(*argv);
     if (!strcmp(p, PROG_RESET)) {
        isreset = TRUE;
        reset_mode();
@@ -1154,11 +1187,7 @@ main(int argc, char **argv)
 
        /* Set the modes if they've changed. */
        if (memcmp(&mode, &oldmode, sizeof(mode))) {
-#ifdef TERMIOS
-           tcsetattr(STDERR_FILENO, TCSADRAIN, &mode);
-#else
-           stty(STDERR_FILENO, &mode);
-#endif
+           SET_TTY(STDERR_FILENO, &mode);
        }
     }
 
@@ -1177,8 +1206,8 @@ main(int argc, char **argv)
 #ifdef TERMIOS
        if (!quiet) {
            report("Erase", VERASE, CERASE);
-           report("Kill", VKILL, CINTR);
-           report("Interrupt", VINTR, CKILL);
+           report("Kill", VKILL, CKILL);
+           report("Interrupt", VINTR, CINTR);
        }
 #endif
     }
@@ -1187,12 +1216,14 @@ main(int argc, char **argv)
        err("The -S option is not supported under terminfo.");
 
     if (sflag) {
+       int len;
        /*
         * Figure out what shell we're using.  A hack, we look for an
         * environmental variable SHELL ending in "csh".
         */
        if ((p = getenv("SHELL")) != 0
-           && !strcmp(p + strlen(p) - 3, "csh"))
+           && (len = strlen(p)) >= 3
+           && !strcmp(p + len - 3, "csh"))
            p = "set noglob;\nsetenv TERM %s;\nunset noglob;\n";
        else
            p = "TERM=%s;\n";
@@ -1201,5 +1232,3 @@ main(int argc, char **argv)
 
     return EXIT_SUCCESS;
 }
-
-/* tset.c ends here */