/****************************************************************************
- * Copyright 2018-2020,2021 Thomas E. Dickey *
+ * Copyright 2018-2021,2022 Thomas E. Dickey *
* Copyright 1998-2016,2017 Free Software Foundation, Inc. *
* *
* Permission is hereby granted, free of charge, to any person obtaining a *
#include <transform.h>
#include <tty_settings.h>
-MODULE_ID("$Id: tput.c,v 1.94 2021/09/19 00:06:44 tom Exp $")
+MODULE_ID("$Id: tput.c,v 1.99 2022/02/26 23:19:31 tom Exp $")
#define PUTS(s) fputs(s, stdout)
const char *_nc_progname = "tput";
-static char *prg_name;
static bool is_init = FALSE;
static bool is_reset = FALSE;
static bool is_clear = FALSE;
va_list argp;
va_start(argp, fmt);
- fprintf(stderr, "%s: ", prg_name);
+ fprintf(stderr, "%s: ", _nc_progname);
vfprintf(stderr, fmt, argp);
fprintf(stderr, "\n");
va_end(argp);
}
static GCC_NORETURN void
-usage(void)
+usage(const char *optstring)
{
#define KEEP(s) s "\n"
static const char msg[] =
KEEP(" capname unlike clear/init/reset, print value for capability \"capname\"")
};
#undef KEEP
- (void) fprintf(stderr, "Usage: %s [options] [command]\n", prg_name);
- fputs(msg, stderr);
+ (void) fprintf(stderr, "Usage: %s [options] [command]\n", _nc_progname);
+ if (optstring != NULL) {
+ const char *s = msg;
+ while (*s != '\0') {
+ fputc(UChar(*s), stderr);
+ if (!strncmp(s, " -", 3)) {
+ if (strchr(optstring, s[3]) == NULL)
+ s = strchr(s, '\n') + 1;
+ } else if (!strncmp(s, "\n\nC", 3))
+ break;
+ ++s;
+ }
+ } else {
+ fputs(msg, stderr);
+ }
ExitProgram(ErrUsage);
}
name = check_aliases(argv[0], FALSE);
*used = 1;
if (is_reset || is_init) {
- TTY oldmode;
+ TTY oldmode = *settings;
int terasechar = -1; /* new erase character */
int intrchar = -1; /* new interrupt character */
if (is_reset) {
reset_start(stdout, TRUE, FALSE);
- reset_tty_settings(fd, settings);
+ reset_tty_settings(fd, settings, FALSE);
} else {
reset_start(stdout, FALSE, TRUE);
}
#endif
set_control_chars(settings, terasechar, intrchar, tkillchar);
set_conversions(settings);
+
if (send_init_strings(fd, &oldmode)) {
reset_flush();
}
int result = 0;
int fd;
int used;
+ TTY old_settings;
TTY tty_settings;
bool opt_x = FALSE; /* clear scrollback if possible */
bool is_alias;
bool need_tty;
- prg_name = check_aliases(_nc_rootname(argv[0]), TRUE);
+ _nc_progname = check_aliases(_nc_rootname(argv[0]), TRUE);
+ is_alias = (is_clear || is_reset || is_init);
term = getenv("TERM");
- while ((c = getopt(argc, argv, "ST:Vx")) != -1) {
+ while ((c = getopt(argc, argv, is_alias ? "T:Vx" : "ST:Vx")) != -1) {
switch (c) {
case 'S':
cmdline = FALSE;
opt_x = TRUE;
break;
default:
- usage();
+ usage(is_alias ? "TVx" : NULL);
/* NOTREACHED */
}
}
- is_alias = (is_clear || is_reset || is_init);
need_tty = ((is_reset || is_init) ||
(optind < argc &&
(!strcmp(argv[optind], "reset") ||
argc -= optind;
argv += optind;
}
- argv[0] = prg_name;
+ argv[0] = strdup(_nc_progname);
} else {
argc -= optind;
argv += optind;
quit(ErrUsage, "No value for $TERM and no -T specified");
fd = save_tty_settings(&tty_settings, need_tty);
+ old_settings = tty_settings;
if (setupterm(term, fd, &errret) != OK && errret <= 0)
quit(ErrTermType, "unknown terminal \"%s\"", term);
if (cmdline) {
int code = 0;
if ((argc <= 0) && !is_alias)
- usage();
+ usage(NULL);
while (argc > 0) {
+ tty_settings = old_settings;
code = tput_cmd(fd, &tty_settings, opt_x, argc, argv, &used);
if (code != 0)
break;
argnow = argvec;
while (argnum > 0) {
- int code = tput_cmd(fd, &tty_settings, opt_x, argnum, argnow, &used);
+ int code;
+ tty_settings = old_settings;
+ code = tput_cmd(fd, &tty_settings, opt_x, argnum, argnow, &used);
if (code != 0) {
if (result == 0)
result = ErrSystem(0); /* will return value >4 */