X-Git-Url: http://ncurses.scripts.mit.edu/?a=blobdiff_plain;f=progs%2Ftset.c;h=03c8ffde33afa611a7391dbc012ef29f8dda23c4;hb=46722468f47c2b77b3987729b4bcf2321cccfd01;hp=d8dbda4974f5d49fa966590fdabfa672a30aecb3;hpb=c633e5103a29a38532cf1925257b91cea33fd090;p=ncurses.git diff --git a/progs/tset.c b/progs/tset.c index d8dbda49..03c8ffde 100644 --- a/progs/tset.c +++ b/progs/tset.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 1998,1999,2000 Free Software Foundation, Inc. * + * Copyright (c) 1998-2001,2002 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 -#include +#include +#include #endif #include /* for bool typedef */ #include #include -MODULE_ID("$Id: tset.c,v 0.47 2000/10/08 01:01:08 tom Exp $") +MODULE_ID("$Id: tset.c,v 0.53 2002/08/24 23:18:16 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); + exit(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); } @@ -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); @@ -757,11 +769,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 +899,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 +1042,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 +1067,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 +1164,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); } }